allow customizing entitlements (#4533)
* allow customizing entitlements * fix printing issues
This commit is contained in:
1 parent
68645e7f0c
commit
9a98abe5ad
3 files changed
+115
-51
No files matched your search
@@ -977,7 +977,10 @@ impl AppBuilder {
|
|||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
if !output.status.success() {
|
if !output.status.success() {
|
||||||
bail!("Failed to install app: {output:?}");
|
bail!(
|
||||||
|
"Failed to install app: {}",
|
||||||
|
String::from_utf8_lossy(&output.stderr)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
let json: Value = serde_json::from_str(&std::fs::read_to_string(tmpfile.path())?)
|
let json: Value = serde_json::from_str(&std::fs::read_to_string(tmpfile.path())?)
|
||||||
@@ -1047,6 +1050,92 @@ impl AppBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async fn codesign_ios(&self) -> Result<()> {
|
async fn codesign_ios(&self) -> Result<()> {
|
||||||
|
// We don't want to drop the entitlements file, until the end of the block, so we hoist it to this temporary.
|
||||||
|
let mut _saved_entitlements = None;
|
||||||
|
|
||||||
|
let mut app_dev_name = self.build.apple_team_id.clone();
|
||||||
|
if app_dev_name.is_none() {
|
||||||
|
app_dev_name =
|
||||||
|
Some(self.auto_provision_signing_name().await.context(
|
||||||
|
"Failed to automatically provision signing name for iOS codesigning.",
|
||||||
|
)?);
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut entitlements_file = self.build.apple_entitlements.clone();
|
||||||
|
if entitlements_file.is_none() {
|
||||||
|
let entitlements_xml = self
|
||||||
|
.auto_provision_entitlements()
|
||||||
|
.await
|
||||||
|
.context("Failed to auto-provision entitlements for iOS codesigning.")?;
|
||||||
|
let entitlements_temp_file = tempfile::NamedTempFile::new()?;
|
||||||
|
std::fs::write(entitlements_temp_file.path(), entitlements_xml)?;
|
||||||
|
entitlements_file = Some(entitlements_temp_file.path().to_path_buf());
|
||||||
|
_saved_entitlements = Some(entitlements_temp_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
let entitlements_file = entitlements_file.as_ref().context(
|
||||||
|
"No entitlements file provided and could not provision entitlements to sign app.",
|
||||||
|
)?;
|
||||||
|
let app_dev_name = app_dev_name.as_ref().context(
|
||||||
|
"No Apple Development signing name provided and could not auto-provision one.",
|
||||||
|
)?;
|
||||||
|
|
||||||
|
tracing::debug!(
|
||||||
|
"Codesigning iOS app with entitlements: {} and dev name: {}",
|
||||||
|
entitlements_file.display(),
|
||||||
|
app_dev_name
|
||||||
|
);
|
||||||
|
|
||||||
|
// codesign the app
|
||||||
|
let output = Command::new("codesign")
|
||||||
|
.args([
|
||||||
|
"--force",
|
||||||
|
"--entitlements",
|
||||||
|
entitlements_file.to_str().unwrap(),
|
||||||
|
"--sign",
|
||||||
|
app_dev_name,
|
||||||
|
])
|
||||||
|
.arg(self.build.root_dir())
|
||||||
|
.output()
|
||||||
|
.await
|
||||||
|
.context("Failed to codesign the app - is `codesign` in your path?")?;
|
||||||
|
|
||||||
|
if !output.status.success() {
|
||||||
|
bail!(
|
||||||
|
"Failed to codesign the app: {}",
|
||||||
|
String::from_utf8(output.stderr).unwrap_or_default()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn auto_provision_signing_name(&self) -> Result<String> {
|
||||||
|
let identities = Command::new("security")
|
||||||
|
.args(["find-identity", "-v", "-p", "codesigning"])
|
||||||
|
.output()
|
||||||
|
.await
|
||||||
|
.context("Failed to run `security find-identity -v -p codesigning` - is `security` in your path?")
|
||||||
|
.map(|e| {
|
||||||
|
String::from_utf8(e.stdout)
|
||||||
|
.context("Failed to parse `security find-identity -v -p codesigning`")
|
||||||
|
})??;
|
||||||
|
|
||||||
|
// Parsing this:
|
||||||
|
// 1231231231231asdasdads123123 "Apple Development: foo@gmail.com (XYZYZY)"
|
||||||
|
let app_dev_name = regex::Regex::new(r#""Apple Development: (.+)""#)
|
||||||
|
.unwrap()
|
||||||
|
.captures(&identities)
|
||||||
|
.and_then(|caps| caps.get(1))
|
||||||
|
.map(|m| m.as_str())
|
||||||
|
.context(
|
||||||
|
"Failed to find Apple Development in `security find-identity -v -p codesigning`",
|
||||||
|
)?;
|
||||||
|
|
||||||
|
Ok(app_dev_name.to_string())
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn auto_provision_entitlements(&self) -> Result<String> {
|
||||||
const CODESIGN_ERROR: &str = r#"This is likely because you haven't
|
const CODESIGN_ERROR: &str = r#"This is likely because you haven't
|
||||||
- Created a provisioning profile before
|
- Created a provisioning profile before
|
||||||
- Accepted the Apple Developer Program License Agreement
|
- Accepted the Apple Developer Program License Agreement
|
||||||
@@ -1081,27 +1170,6 @@ We checked the folders:
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
let identities = Command::new("security")
|
|
||||||
.args(["find-identity", "-v", "-p", "codesigning"])
|
|
||||||
.output()
|
|
||||||
.await
|
|
||||||
.context("Failed to run `security find-identity -v -p codesigning` - is `security` in your path?")
|
|
||||||
.map(|e| {
|
|
||||||
String::from_utf8(e.stdout)
|
|
||||||
.context("Failed to parse `security find-identity -v -p codesigning`")
|
|
||||||
})??;
|
|
||||||
|
|
||||||
// Parsing this:
|
|
||||||
// 1231231231231asdasdads123123 "Apple Development: foo@gmail.com (XYZYZY)"
|
|
||||||
let app_dev_name = regex::Regex::new(r#""Apple Development: (.+)""#)
|
|
||||||
.unwrap()
|
|
||||||
.captures(&identities)
|
|
||||||
.and_then(|caps| caps.get(1))
|
|
||||||
.map(|m| m.as_str())
|
|
||||||
.context(
|
|
||||||
"Failed to find Apple Development in `security find-identity -v -p codesigning`",
|
|
||||||
)?;
|
|
||||||
|
|
||||||
// Acquire the provision file
|
// Acquire the provision file
|
||||||
let provision_file = profiles_folder
|
let provision_file = profiles_folder
|
||||||
.read_dir()?
|
.read_dir()?
|
||||||
@@ -1152,7 +1220,7 @@ We checked the folders:
|
|||||||
keychain_access_groups: Vec<String>,
|
keychain_access_groups: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
let entielements_xml = format!(
|
Ok(format!(
|
||||||
r#"
|
r#"
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
@@ -1172,34 +1240,7 @@ We checked the folders:
|
|||||||
APPLICATION_IDENTIFIER = mbfile.entitlements.application_identifier,
|
APPLICATION_IDENTIFIER = mbfile.entitlements.application_identifier,
|
||||||
APP_ID_ACCESS_GROUP = mbfile.entitlements.keychain_access_groups[0],
|
APP_ID_ACCESS_GROUP = mbfile.entitlements.keychain_access_groups[0],
|
||||||
TEAM_IDENTIFIER = mbfile.team_identifier[0],
|
TEAM_IDENTIFIER = mbfile.team_identifier[0],
|
||||||
);
|
))
|
||||||
|
|
||||||
// write to a temp file
|
|
||||||
let temp_file = tempfile::NamedTempFile::new()?;
|
|
||||||
std::fs::write(temp_file.path(), entielements_xml)?;
|
|
||||||
|
|
||||||
// codesign the app
|
|
||||||
let output = Command::new("codesign")
|
|
||||||
.args([
|
|
||||||
"--force",
|
|
||||||
"--entitlements",
|
|
||||||
temp_file.path().to_str().unwrap(),
|
|
||||||
"--sign",
|
|
||||||
app_dev_name,
|
|
||||||
])
|
|
||||||
.arg(self.build.root_dir())
|
|
||||||
.output()
|
|
||||||
.await
|
|
||||||
.context("Failed to codesign the app - is `codesign` in your path?")?;
|
|
||||||
|
|
||||||
if !output.status.success() {
|
|
||||||
bail!(
|
|
||||||
"Failed to codesign the app: {}",
|
|
||||||
String::from_utf8(output.stderr).unwrap_or_default()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Launch the Android simulator and deploy the application.
|
/// Launch the Android simulator and deploy the application.
|
||||||
|
|||||||
@@ -395,6 +395,8 @@ pub(crate) struct BuildRequest {
|
|||||||
pub(crate) command_file: Arc<NamedTempFile>,
|
pub(crate) command_file: Arc<NamedTempFile>,
|
||||||
pub(crate) base_path: Option<String>,
|
pub(crate) base_path: Option<String>,
|
||||||
pub(crate) using_dioxus_explicitly: bool,
|
pub(crate) using_dioxus_explicitly: bool,
|
||||||
|
pub(crate) apple_entitlements: Option<PathBuf>,
|
||||||
|
pub(crate) apple_team_id: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// dx can produce different "modes" of a build. A "regular" build is a "base" build. The Fat and Thin
|
/// dx can produce different "modes" of a build. A "regular" build is a "base" build. The Fat and Thin
|
||||||
@@ -826,6 +828,8 @@ impl BuildRequest {
|
|||||||
wasm_split: args.wasm_split,
|
wasm_split: args.wasm_split,
|
||||||
debug_symbols: args.debug_symbols,
|
debug_symbols: args.debug_symbols,
|
||||||
inject_loading_scripts: args.inject_loading_scripts,
|
inject_loading_scripts: args.inject_loading_scripts,
|
||||||
|
apple_entitlements: args.apple_entitlements.clone(),
|
||||||
|
apple_team_id: args.apple_team_id.clone(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -117,6 +117,25 @@ pub(crate) struct TargetArgs {
|
|||||||
/// base path set in the `dioxus` config.
|
/// base path set in the `dioxus` config.
|
||||||
#[clap(long, help_heading = HELP_HEADING)]
|
#[clap(long, help_heading = HELP_HEADING)]
|
||||||
pub(crate) base_path: Option<String>,
|
pub(crate) base_path: Option<String>,
|
||||||
|
|
||||||
|
/// The path to the Apple entitlements file to used to sign the resulting app bundle.
|
||||||
|
///
|
||||||
|
/// On iOS, this is required for deploy to a device and some configurations in the simulator.
|
||||||
|
#[clap(long, help_heading = HELP_HEADING)]
|
||||||
|
pub(crate) apple_entitlements: Option<PathBuf>,
|
||||||
|
|
||||||
|
/// The Apple team ID to use when signing the app bundle.
|
||||||
|
///
|
||||||
|
/// Usually this is an email or name associated with your Apple Developer account, usually in the
|
||||||
|
/// format `Signing Name (GXTEAMID123)`.
|
||||||
|
///
|
||||||
|
/// This is passed directly to the `codesign` tool.
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// codesign --force --entitlements <entitlements_file> --sign <apple_team_id> <app_bundle>
|
||||||
|
/// ```
|
||||||
|
#[clap(long, help_heading = HELP_HEADING)]
|
||||||
|
pub(crate) apple_team_id: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Anonymized for TargetArgs {
|
impl Anonymized for TargetArgs {
|
||||||
|
|||||||
Reference in new issue
Block a user