String generateUniqueConsumerKey(Integer length) {
String charset =
'ABCDEFGHIJKLMNOPQRSTUVWXYZ' +
'abcdefghijklmnopqrstuvwxyz0123456789';
String timestamp = String.valueOf(System.currentTimeMillis());
// Calculate the length needed for the random part of the key
Integer remainingLength = length - timestamp.length();
// Ensure remaining length is positive; otherwise, adjust
if (remainingLength <= 0) {
return timestamp.substring(0, length);
}
// Generate the random part of the key inline
String randomPart = '';
for (Integer i = 0; i < remainingLength; i++) {
// Generate a random index and cast the result to Integer
Integer randomIndex =
(Integer)Math.floor(Math.random() * charset.length());
// Append the character at the random index to the result string
randomPart += charset.substring(randomIndex, randomIndex + 1);
}
// Combine timestamp and random part
return timestamp + randomPart;
}
String createCertificate() {
awsac.SCCMetaDataService.MetadataPort service =
new awsac.SCCMetaDataService.MetadataPort();
service.SessionHeader =
new awsac.SCCMetaDataService.SessionHeader_element();
service.SessionHeader.sessionId = UserInfo.getSessionId();
awsac.SCCMetaDataService.SaveResult createMetaDataResult =
new awsac.SCCMetaDataService.SaveResult();
awsac.SCCMetaDataService.Certificate certificate =
new awsac.SCCMetaDataService.Certificate();
certificate.fullName =
awsac.SCCConstants.PLACE_HOLDER_CERTIFICATE_LABEL;
certificate.caSigned = false;
certificate.encryptedWithPlatformEncryption = false;
certificate.keySize = 2048;
certificate.masterLabel =
awsac.SCCConstants.PLACE_HOLDER_CERTIFICATE_LABEL;
certificate.privateKeyExportable = true;
createMetaDataResult = service.createMetadata(
new List<awsac.SCCMetaDataService.Metadata>{certificate})
.get(0);
if (!createMetaDataResult.success) {
String errorMessage = '';
for (awsac.SCCMetaDataService.Error error :
createMetaDataResult.errors) {
errorMessage = errorMessage + error.message;
}
throw new awsac.MetaDataApiException(errorMessage);
}
awsac.SCCMetaDataService.IReadResult readMetaDataResult = null;
readMetaDataResult = service.readMetadata('Certificate',
new String[] {
awsac.SCCConstants.PLACE_HOLDER_CERTIFICATE_LABEL
});
awsac.SCCMetaDataService.Certificate cert =
(awsac.SCCMetaDataService.Certificate) readMetaDataResult
.getRecords()[0];
Blob certificateBlob = EncodingUtil.base64Decode(cert.content);
return certificateBlob.toString();
}
void createConnectedApp(String adminEmail) {
awsac.SCCMetaDataService.MetadataPort service =
new awsac.SCCMetaDataService.MetadataPort();
service.SessionHeader =
new awsac.SCCMetaDataService.SessionHeader_element();
service.SessionHeader.sessionId = UserInfo.getSessionId();
awsac.SCCMetaDataService.SaveResult createMetaDataResult =
new awsac.SCCMetaDataService.SaveResult();
awsac.SCCMetaDataService.ConnectedApp app =
new awsac.SCCMetaDataService.ConnectedApp();
app.fullName = awsac.SCCConstants.GLOBAL_CONNECTED_APP_FULL_NAME;
app.label = awsac.SCCConstants.GLOBAL_CONNECTED_APP_LABEL;
app.description = 'ConnectedApp to access Interaction Service APIs';
app.contactEmail = adminEmail;
awsac.SCCMetaDataService.ConnectedAppOauthConfig connectedAppConfig=
new awsac.SCCMetaDataService.ConnectedAppOauthConfig();
connectedAppConfig.callbackUrl = 'https://salesforce.com';
connectedAppConfig.scopes =
new String[]{ 'Api', 'Basic', 'RefreshToken', 'Interaction'};
app.oauthConfig = connectedAppConfig;
app.oauthConfig.certificate = createCertificate();
app.oauthConfig.consumerKey = generateUniqueConsumerKey(64);
app.oauthConfig.isAdminApproved = true;
app.oauthConfig.isClientCredentialEnabled = true;
app.oauthConfig.isCodeCredentialEnabled = false;
app.oauthConfig.isCodeCredentialPostOnly = false;
app.oauthConfig.isConsumerSecretOptional = false;
app.oauthConfig.isIntrospectAllTokens = false;
app.oauthConfig.isNamedUserJwtEnabled = false;
app.oauthConfig.isPkceRequired = true;
app.oauthConfig.isRefreshTokenRotationEnabled = false;
app.oauthConfig.isSecretRequiredForRefreshToken = true;
app.oauthConfig.isSecretRequiredForTokenExchange = false;
app.oauthConfig.isTokenExchangeEnabled = false;
awsac.SCCMetaDataService.ConnectedAppOauthPolicy connectedAppPolicy=
new awsac.SCCMetaDataService.ConnectedAppOauthPolicy();
connectedAppPolicy.ipRelaxation = 'ENFORCE';
connectedAppPolicy.isTokenExchangeFlowEnabled = false;
connectedAppPolicy.refreshTokenPolicy = 'infinite';
app.oauthPolicy = connectedAppPolicy;
app.profileName = new String[]{'System Administrator'};
app.permissionSetName =
new String[]{'SCC Administrator', 'SCC Agent'};
createMetaDataResult = service.createMetadata(
new List<awsac.SCCMetaDataService.Metadata>{app}).get(0);
if (!createMetaDataResult.success) {
String errorMessage = '';
for (awsac.SCCMetaDataService.Error error :
createMetaDataResult.errors) {
errorMessage = errorMessage + error.message;
}
if (errorMessage.contains('permission set')) {
errorMessage = errorMessage +
' Please verify creation of permission set : \"' +
awsac.SCCConstants.SCC_ADMINISTRATOR_PERMISSION_SET_LABEL +
'\" & \"' +
awsac.SCCConstants.SCC_AGENT_PERMISSION_SET_LABEL +
'\".';
}
throw new awsac.MetaDataApiException(errorMessage);
}
}
createConnectedApp('email@email.com');