Skip to content

Commit ab54f75

Browse files
Merge pull request #2542 from microsoft/develop
Merge develop to master for release 5.0.5
2 parents 1120c26 + ee8596c commit ab54f75

31 files changed

Lines changed: 416 additions & 441 deletions

File tree

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
trigger:
2+
- master
3+
- develop
4+
pr:
5+
- master
6+
- develop
7+
- feature/*
8+
variables:
9+
Configuration: Release
10+
SDK: ''
11+
EOCompliance-Mac: true
12+
XCODE_PATH: '/Applications/Xcode_13.2.1.app/Contents/Developer'
13+
resources:
14+
repositories:
15+
- repository: 1ESPipelineTemplates
16+
type: git
17+
name: 1ESPipelineTemplates/1ESPipelineTemplates
18+
ref: refs/tags/release
19+
extends:
20+
${{ if eq(variables['Build.SourceBranch'], 'refs/heads/master') }}:
21+
template: v1/1ES.Official.PipelineTemplate.yml@1ESPipelineTemplates
22+
${{ else }}:
23+
template: v1/1ES.Unofficial.PipelineTemplate.yml@1ESPipelineTemplates
24+
parameters:
25+
pool:
26+
name: Azure Pipelines
27+
image: macos-latest
28+
os: macOS
29+
customBuildTags:
30+
- ES365AIMigrationTooling-BulkMigrated
31+
sdl:
32+
sourceAnalysisPool: 1ES-PT-Windows-2022
33+
stages:
34+
- stage: stage
35+
jobs:
36+
- job: sdkBuildJob
37+
displayName: Build SDK for All Platforms
38+
templateContext:
39+
outputs:
40+
- output: pipelineArtifact
41+
displayName: 'Publish Artifacts'
42+
path: '$(Build.ArtifactStagingDirectory)'
43+
artifactName: Release
44+
steps:
45+
- checkout: self
46+
submodules: recursive
47+
- bash: |
48+
version="$(Scripts/framework-version.sh)+$(git rev-parse --short $BUILD_SOURCEVERSION)"
49+
echo "Change version to $version"
50+
Scripts/framework-version.sh "$version"
51+
displayName: 'Update Version'
52+
condition: ne(variables['Build.SourceBranch'], 'refs/heads/master')
53+
- bash: 'sudo gem install jazzy --no-document'
54+
displayName: 'Install Jazzy'
55+
- task: Xcode@5
56+
displayName: Build App Center Frameworks
57+
inputs:
58+
xcWorkspacePath: AppCenter.xcworkspace
59+
scheme: 'All App Center Frameworks'
60+
xcodeVersion: specifyPath
61+
xcodeDeveloperDir: '$(XCODE_PATH)'
62+
args: 'SYMROOT="$(Build.BinariesDirectory)" GCC_TREAT_WARNINGS_AS_ERRORS=YES SWIFT_TREAT_WARNINGS_AS_ERRORS=YES'
63+
timeoutInMinutes: 50
64+
- task: Xcode@5
65+
displayName: Generate App Center Documentation
66+
inputs:
67+
xcWorkspacePath: AppCenter.xcworkspace
68+
scheme: 'All App Center Documentation'
69+
- task: Bash@3
70+
displayName: Archive
71+
inputs:
72+
targetType: filePath
73+
filePath: './Scripts/create-archive.sh'
74+
- task: CopyFiles@2
75+
displayName: 'Copy Archives to Staging Directory'
76+
inputs:
77+
SourceFolder: './AppCenter-SDK-Apple'
78+
Contents: '**/AppCenter-SDK-Apple*.zip'
79+
TargetFolder: '$(Build.ArtifactStagingDirectory)'
80+
- job: collectVersionInfo
81+
displayName: Version Information
82+
templateContext:
83+
outputs:
84+
- output: pipelineArtifact
85+
displayName: 'Publish Version Information'
86+
targetPath: '$(Build.ArtifactStagingDirectory)/Info'
87+
artifactName: Info
88+
sbomEnabled: false
89+
steps:
90+
- bash: |
91+
swift --version
92+
swift package describe
93+
displayName: 'Print Swift Package Information'
94+
- bash: |
95+
VERSION=$(Scripts/framework-version.sh)
96+
mkdir -p $(Build.ArtifactStagingDirectory)/Info
97+
echo $VERSION > $(Build.ArtifactStagingDirectory)/Info/VERSION
98+
echo $BUILD_SOURCEVERSION > $(Build.ArtifactStagingDirectory)/Info/COMMIT
99+
Scripts/get-release-notes.sh $VERSION > $(Build.ArtifactStagingDirectory)/Info/RELEASE.md
100+
displayName: 'Collect Version Information'
101+
102+
- stage: APIScan
103+
dependsOn: Stage
104+
pool:
105+
name: 1ES-PT-Windows-2022
106+
os: windows
107+
variables:
108+
"agent.source.skip": true
109+
jobs:
110+
- job: APIScan
111+
steps:
112+
- task: DownloadPipelineArtifact@2
113+
displayName: Download Build Artifacts for APIScan
114+
inputs:
115+
artifactName: Release
116+
targetPath: '$(Agent.BuildDirectory)/Release'
117+
- task: AzureKeyVault@2
118+
inputs:
119+
azureSubscription: 'AC - Dev Infra & Build Pool'
120+
KeyVaultName: 'mobile-center-sdk'
121+
SecretsFilter: 'appcenter-sdk-managed-identity-clientid'
122+
RunAsPreJob: false
123+
- task: APIScan@2
124+
displayName: 'Run APIScan'
125+
inputs:
126+
softwareFolder: '$(Agent.BuildDirectory)\Release'
127+
softwareName: 'appcenter-sdk-apple'
128+
softwareVersionNum: '$(Build.BuildId)'
129+
isLargeApp: false
130+
toolVersion: 'Latest'
131+
verbosityLevel: verbose
132+
condition: and(succeeded(), ne(variables['DisableAPIScan'], 'true'))
133+
env:
134+
AzureServicesAuthConnectionString: 'runAs=App;AppId=$(appcenter-sdk-managed-identity-clientid)'

‎AppCenter.podspec‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
Pod::Spec.new do |s|
22
s.cocoapods_version = '>= 1.10'
33
s.name = 'AppCenter'
4-
s.version = '5.0.4'
4+
s.version = '5.0.5'
55

66
s.summary = 'Visual Studio App Center is your continuous integration, delivery and learning solution for iOS and macOS apps.'
77
s.description = <<-DESC
@@ -44,6 +44,7 @@ Pod::Spec.new do |s|
4444
ss.tvos.frameworks = 'UIKit'
4545
ss.vendored_frameworks = "AppCenter-SDK-Apple/AppCenter.xcframework"
4646
ss.libraries = 'z', 'sqlite3'
47+
ss.resource_bundle = { 'AppCenter' => 'AppCenter-SDK-Apple/AppCenter.xcframework/PrivacyInfo.xcprivacy' }
4748
end
4849

4950
s.subspec 'Analytics' do |ss|
@@ -53,13 +54,15 @@ Pod::Spec.new do |s|
5354
ss.osx.frameworks = 'AppKit'
5455
ss.tvos.frameworks = 'UIKit'
5556
ss.vendored_frameworks = "AppCenter-SDK-Apple/AppCenterAnalytics.xcframework"
57+
ss.resource_bundle = { 'AppCenterAnalytics' => 'AppCenter-SDK-Apple/AppCenterAnalytics.xcframework/PrivacyInfo.xcprivacy' }
5658
end
5759

5860
s.subspec 'Crashes' do |ss|
5961
ss.dependency 'AppCenter/Core'
6062
ss.frameworks = 'Foundation'
6163
ss.libraries = 'z', 'c++'
6264
ss.vendored_frameworks = "AppCenter-SDK-Apple/AppCenterCrashes.xcframework"
65+
ss.resource_bundle = { 'AppCenterCrashes' => 'AppCenter-SDK-Apple/AppCenterCrashes.xcframework/PrivacyInfo.xcprivacy' }
6366
end
6467

6568
s.subspec 'Distribute' do |ss|
@@ -69,6 +72,7 @@ Pod::Spec.new do |s|
6972
ss.ios.weak_frameworks = 'SafariServices', 'AuthenticationServices'
7073
ss.ios.resource_bundle = { 'AppCenterDistributeResources' => ['AppCenter-SDK-Apple/AppCenterDistributeResources.bundle/*.lproj'] }
7174
ss.ios.vendored_frameworks = "AppCenter-SDK-Apple/AppCenterDistribute.xcframework"
75+
ss.resource_bundle = { 'AppCenterDistribute' => 'AppCenter-SDK-Apple/AppCenterDistribute.xcframework/PrivacyInfo.xcprivacy' }
7276
end
7377

7478
end

‎AppCenter/AppCenter.xcodeproj/project.pbxproj‎

Lines changed: 81 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@
7272
buildPhases = (
7373
D5E3B3E9247C04D900D93E90 /* Build Mac Catalyst Framework */,
7474
8414DF7924599AF800B316C5 /* Combine XCFramework */,
75+
BB88D1F32BADB885002FEAED /* CopyFiles */,
76+
BB88D1FE2BADD4FA002FEAED /* CopyFiles */,
77+
BB88D2002BADD52B002FEAED /* CopyFiles */,
78+
BB88D2022BADD549002FEAED /* CopyFiles */,
7579
);
7680
dependencies = (
7781
C26F4E5A2546F38B006E0EB7 /* PBXTargetDependency */,
@@ -263,6 +267,10 @@
263267
B29D884921E9286100EAF084 /* MSACOrderedDictionaryTest.m in Sources */ = {isa = PBXBuildFile; fileRef = B29D884621E9286100EAF084 /* MSACOrderedDictionaryTest.m */; };
264268
B2CD74CE1F22BFD00070E7DF /* MSACMockService.m in Sources */ = {isa = PBXBuildFile; fileRef = 805F3F6A1F209C9D00B489E4 /* MSACMockService.m */; };
265269
B2FD53651E567BCF0050F909 /* MSACDeviceHistoryInfoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = B2FD53641E567BCF0050F909 /* MSACDeviceHistoryInfoTests.m */; };
270+
BB88D1FD2BADCB84002FEAED /* PrivacyInfo.xcprivacy in CopyFiles */ = {isa = PBXBuildFile; fileRef = D80EC5002AB0713B000C82D7 /* PrivacyInfo.xcprivacy */; };
271+
BB88D1FF2BADD506002FEAED /* PrivacyInfo.xcprivacy in CopyFiles */ = {isa = PBXBuildFile; fileRef = D80EC5002AB0713B000C82D7 /* PrivacyInfo.xcprivacy */; };
272+
BB88D2012BADD543002FEAED /* PrivacyInfo.xcprivacy in CopyFiles */ = {isa = PBXBuildFile; fileRef = D80EC5002AB0713B000C82D7 /* PrivacyInfo.xcprivacy */; };
273+
BB88D2032BADD567002FEAED /* PrivacyInfo.xcprivacy in CopyFiles */ = {isa = PBXBuildFile; fileRef = D80EC5002AB0713B000C82D7 /* PrivacyInfo.xcprivacy */; };
266274
C2392EF6246429B300425640 /* OCMock.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C2392EED2464279400425640 /* OCMock.framework */; };
267275
C2392EF7246429CE00425640 /* OCMock.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C2392EE52464279400425640 /* OCMock.framework */; };
268276
C2392EF8246429E200425640 /* OCMock.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C2392EEF2464279400425640 /* OCMock.framework */; };
@@ -409,6 +417,9 @@
409417
D5812F352423C5DD00C5F5C5 /* MSACUserDefaultsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D5812F312423C2FA00C5F5C5 /* MSACUserDefaultsTests.m */; };
410418
D5812F362423C5DF00C5F5C5 /* MSACUserDefaultsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D5812F312423C2FA00C5F5C5 /* MSACUserDefaultsTests.m */; };
411419
D5812F372423C5E100C5F5C5 /* MSACUserDefaultsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D5812F312423C2FA00C5F5C5 /* MSACUserDefaultsTests.m */; };
420+
D8C05A402B7CCED700458569 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = D80EC5002AB0713B000C82D7 /* PrivacyInfo.xcprivacy */; };
421+
D8C05A422B7CCEE200458569 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = D80EC5002AB0713B000C82D7 /* PrivacyInfo.xcprivacy */; };
422+
D8C05A442B7CCEF300458569 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = D80EC5002AB0713B000C82D7 /* PrivacyInfo.xcprivacy */; };
412423
DF5DA1F923A0E55500DE695C /* MSACDispatcherUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = DF5DA1F823A0E55500DE695C /* MSACDispatcherUtil.h */; };
413424
DF5DA1FA23A0E55500DE695C /* MSACDispatcherUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = DF5DA1F823A0E55500DE695C /* MSACDispatcherUtil.h */; };
414425
DF5DA1FB23A0E55500DE695C /* MSACDispatcherUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = DF5DA1F823A0E55500DE695C /* MSACDispatcherUtil.h */; };
@@ -1094,6 +1105,49 @@
10941105
};
10951106
/* End PBXContainerItemProxy section */
10961107

1108+
/* Begin PBXCopyFilesBuildPhase section */
1109+
BB88D1F32BADB885002FEAED /* CopyFiles */ = {
1110+
isa = PBXCopyFilesBuildPhase;
1111+
buildActionMask = 2147483647;
1112+
dstPath = AppCenter.xcframework;
1113+
dstSubfolderSpec = 10;
1114+
files = (
1115+
BB88D1FD2BADCB84002FEAED /* PrivacyInfo.xcprivacy in CopyFiles */,
1116+
);
1117+
runOnlyForDeploymentPostprocessing = 0;
1118+
};
1119+
BB88D1FE2BADD4FA002FEAED /* CopyFiles */ = {
1120+
isa = PBXCopyFilesBuildPhase;
1121+
buildActionMask = 2147483647;
1122+
dstPath = AppCenterAnalytics.xcframework;
1123+
dstSubfolderSpec = 10;
1124+
files = (
1125+
BB88D1FF2BADD506002FEAED /* PrivacyInfo.xcprivacy in CopyFiles */,
1126+
);
1127+
runOnlyForDeploymentPostprocessing = 0;
1128+
};
1129+
BB88D2002BADD52B002FEAED /* CopyFiles */ = {
1130+
isa = PBXCopyFilesBuildPhase;
1131+
buildActionMask = 2147483647;
1132+
dstPath = AppCenterCrashes.xcframework;
1133+
dstSubfolderSpec = 10;
1134+
files = (
1135+
BB88D2012BADD543002FEAED /* PrivacyInfo.xcprivacy in CopyFiles */,
1136+
);
1137+
runOnlyForDeploymentPostprocessing = 0;
1138+
};
1139+
BB88D2022BADD549002FEAED /* CopyFiles */ = {
1140+
isa = PBXCopyFilesBuildPhase;
1141+
buildActionMask = 2147483647;
1142+
dstPath = AppCenterDistribute.xcframework;
1143+
dstSubfolderSpec = 10;
1144+
files = (
1145+
BB88D2032BADD567002FEAED /* PrivacyInfo.xcprivacy in CopyFiles */,
1146+
);
1147+
runOnlyForDeploymentPostprocessing = 0;
1148+
};
1149+
/* End PBXCopyFilesBuildPhase section */
1150+
10971151
/* Begin PBXFileReference section */
10981152
041CFF8D1ECCFFD200B4654B /* Tests macOS.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = "Tests macOS.xcconfig"; path = "../../Config/Tests macOS.xcconfig"; sourceTree = ""; };
10991153
04237DC023A31617009BB406 /* MSACHttpClientDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MSACHttpClientDelegate.h; sourceTree = ""; };
@@ -1334,7 +1388,6 @@
13341388
D55E7083252F5A1000AB994D /* MSACTestSessionInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MSACTestSessionInfo.h; sourceTree = ""; };
13351389
D5812F312423C2FA00C5F5C5 /* MSACUserDefaultsTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MSACUserDefaultsTests.m; sourceTree = ""; };
13361390
D80EC5002AB0713B000C82D7 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; };
1337-
D881A6B62AAF4176009644A0 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = ../PrivacyInfo.xcprivacy; sourceTree = ""; };
13381391
DF5DA1F823A0E55500DE695C /* MSACDispatcherUtil.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MSACDispatcherUtil.h; sourceTree = ""; };
13391392
DF5DA1FC23A0E57B00DE695C /* MSACDispatcherUtil.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSACDispatcherUtil.m; sourceTree = ""; };
13401393
DFCB7FFD2472C1BD0058D292 /* OCHamcrest.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = OCHamcrest.xcodeproj; path = ../../Vendor/OCHamcrest/Source/OCHamcrest.xcodeproj; sourceTree = ""; };
@@ -1591,7 +1644,6 @@
15911644
isa = PBXGroup;
15921645
children = (
15931646
D80EC5002AB0713B000C82D7 /* PrivacyInfo.xcprivacy */,
1594-
D881A6B62AAF4176009644A0 /* PrivacyInfo.xcprivacy */,
15951647
6E0401051D1C98220051BCFA /* AppCenter */,
15961648
6E2395791D22EF4F00E543C8 /* AppCenterTests */,
15971649
6E0401041D1C98220051BCFA /* Products */,
@@ -2529,6 +2581,7 @@
25292581
C9A91FB1230C01140068070D /* Headers */,
25302582
C9A91FB2230C01140068070D /* Sources */,
25312583
C9A91FB3230C01140068070D /* Frameworks */,
2584+
D8C05A3F2B7CCED300458569 /* Resources */,
25322585
);
25332586
buildRules = (
25342587
);
@@ -2547,6 +2600,7 @@
25472600
C9A91FFF230C05D70068070D /* Headers */,
25482601
C9A92000230C05D70068070D /* Sources */,
25492602
C9A92001230C05D70068070D /* Frameworks */,
2603+
D8C05A412B7CCEDE00458569 /* Resources */,
25502604
);
25512605
buildRules = (
25522606
);
@@ -2565,6 +2619,7 @@
25652619
C9A9201C230C07A50068070D /* Headers */,
25662620
C9A9201D230C07A50068070D /* Sources */,
25672621
C9A9201E230C07A50068070D /* Frameworks */,
2622+
D8C05A432B7CCEF000458569 /* Resources */,
25682623
);
25692624
buildRules = (
25702625
);
@@ -2764,6 +2819,30 @@
27642819
);
27652820
runOnlyForDeploymentPostprocessing = 0;
27662821
};
2822+
D8C05A3F2B7CCED300458569 /* Resources */ = {
2823+
isa = PBXResourcesBuildPhase;
2824+
buildActionMask = 2147483647;
2825+
files = (
2826+
D8C05A402B7CCED700458569 /* PrivacyInfo.xcprivacy in Resources */,
2827+
);
2828+
runOnlyForDeploymentPostprocessing = 0;
2829+
};
2830+
D8C05A412B7CCEDE00458569 /* Resources */ = {
2831+
isa = PBXResourcesBuildPhase;
2832+
buildActionMask = 2147483647;
2833+
files = (
2834+
D8C05A422B7CCEE200458569 /* PrivacyInfo.xcprivacy in Resources */,
2835+
);
2836+
runOnlyForDeploymentPostprocessing = 0;
2837+
};
2838+
D8C05A432B7CCEF000458569 /* Resources */ = {
2839+
isa = PBXResourcesBuildPhase;
2840+
buildActionMask = 2147483647;
2841+
files = (
2842+
D8C05A442B7CCEF300458569 /* PrivacyInfo.xcprivacy in Resources */,
2843+
);
2844+
runOnlyForDeploymentPostprocessing = 0;
2845+
};
27672846
/* End PBXResourcesBuildPhase section */
27682847

27692848
/* Begin PBXShellScriptBuildPhase section */

‎AppCenter/AppCenter/Internals/Context/Device/MSACDeviceTracker.m‎

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -400,15 +400,21 @@ - (NSString *)screenSize {
400400

401401
#if TARGET_OS_IOS && !TARGET_OS_MACCATALYST
402402
- (NSString *)carrierName:(CTCarrier *)carrier {
403-
return [self isValidCarrierName:carrier.carrierName] ? carrier.carrierName : nil;
403+
return [self isCarrierNameValid:carrier.carrierName] ? carrier.carrierName : nil;
404404
}
405405

406406
- (NSString *)carrierCountry:(CTCarrier *)carrier {
407-
return ([carrier.isoCountryCode length] > 0) ? carrier.isoCountryCode : nil;
407+
return [self isCarrierCountyValid:carrier.isoCountryCode] ? carrier.isoCountryCode : nil;
408408
}
409409

410-
- (BOOL)isValidCarrierName:(NSString *)carrier {
411-
return [carrier length] > 0 && [@"carrier" caseInsensitiveCompare:carrier] != NSOrderedSame;
410+
- (BOOL)isCarrierNameValid:(NSString *)carrier {
411+
return [carrier length] > 0 && [@"carrier" caseInsensitiveCompare:carrier] != NSOrderedSame && ![@"--" isEqualToString:carrier];
412+
}
413+
414+
// The CTCarrier is deprecated without replacement since iOS 16 (https://developer.apple.com/documentation/coretelephony/ctcarrier)
415+
// and will always return "--" for isoCountryCode.
416+
- (BOOL)isCarrierCountyValid:(NSString *)country {
417+
return [country length] > 0 && ![@"--" isEqualToString:country];
412418
}
413419

414420
- (CTCarrier *)firstCarrier:(NSDictionary *)carriers {

‎AppCenter/AppCenterTests/MSACEncrypterTests.m‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,10 +263,12 @@ - (void)testDecryptLegacyItem {
263263
NSString *clearText = @"Test string";
264264

265265
// Save the key to disk. This must not change as it was used to encrypt the text.
266+
// [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="this is not a secret")]
266267
NSString *currentKey = @"zlIS50zXq7fm2GqassShXrjkMBsdjlTsmIT+d1D3CTI=";
267268
[MSACMockKeychainUtil storeString:currentKey forKey:kMSACEncryptionKeyTagOriginal];
268269

269270
// This cipher text contains no metadata, and no IV was used.
271+
// [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="this is not a secret")]
270272
NSString *cipherText = @"S6uNmq7u0eKGaU2GQPUGMQ==";
271273
MSACEncrypter *encrypter = [MSACEncrypter new];
272274

0 commit comments

Comments
 (0)