Backup_FME_personal/force-app/main/default/classes/OAuthTokenManager.cls

409 lines
21 KiB
OpenEdge ABL

// 5pm- 23oct..
public with sharing class OAuthTokenManager {
private static String adminTokenId;
// new: store OAuth tokens in HIC_FilesME__External_Token__c using Key__c as upsert key
public static void storeToken(Map<String, Object> tokenMap) {
System.debug('tokenMap '+ JSON.serializePretty(tokenMap));
HIC_FilesME__External_Token__c rec = new HIC_FilesME__External_Token__c();
try {
Boolean isAdminLevelCreds = Boolean.valueOf(tokenMap.get('HIC_FilesME__Is_Admin_level_Credentials__c'));
String userId = String.valueOf(tokenMap.get('HIC_FilesME__User__c'));
String provider = String.valueOf(tokenMap.get('HIC_FilesME__Provider__c'));
if(provider.equalsIgnoreCase('awss3')) {
String accessKey = String.valueOf(tokenMap.get('HIC_FilesME__Access_Key__c'));
String secretAccessKey = String.valueOf(tokenMap.get('HIC_FilesME__Secret_Access_Key__c'));
String region = String.valueOf(tokenMap.get('HIC_FilesME__Region__c'));
String bucketName = String.valueOf(tokenMap.get('HIC_FilesME__Bucket__c'));
rec.HIC_FilesME__Access_Key__c = accessKey;
rec.HIC_FilesME__Secret_Access_Key__c = secretAccessKey;
rec.HIC_FilesME__Region__c = region;
rec.HIC_FilesME__Bucket__c = bucketName;
}
else if(provider.equalsIgnoreCase('SFTP')){
String sftpUser = (String) String.valueOf(tokenMap.get('HIC_FilesME__username__c'));
String hostname = (String) String.valueOf(tokenMap.get('HIC_FilesME__Hostname__c'));
String password = (String) String.valueOf(tokenMap.get('HIC_FilesME__Password__c'));
rec.HIC_FilesME__username__c = sftpUser;
rec.HIC_FilesME__Hostname__c = hostname;
rec.HIC_FilesME__Password__c = password;
}
// Extract inputs (expecting raw values in tokenMap)
String accessToken = String.valueOf(tokenMap.get('HIC_FilesME__Access_Token__c'));
String refreshToken = String.valueOf(tokenMap.get('HIC_FilesME__Refresh_Token__c'));
String tokenType = String.valueOf(tokenMap.get('HIC_FilesME__Token_Type__c'));
String scope = String.valueOf(tokenMap.get('HIC_FilesME__Scope__c'));
String instanceUrl = String.valueOf(tokenMap.get('HIC_FilesME__API_Endpoint_URL__c'));
String connectedUsername = String.valueOf(tokenMap.get('HIC_FilesME__Connected_Username__c'));
String tenantId = String.valueOf(tokenMap.get('HIC_FilesME__TenantId__c'));
String accountId = String.valueOf(tokenMap.get('HIC_FilesME__AccountId__c'));
Datetime expiresAt = null;
if (tokenMap != null && tokenMap.containsKey('HIC_FilesME__Expires_At__c')) {
Object exp = tokenMap.get('HIC_FilesME__Expires_At__c');
if (exp instanceof Datetime) {
expiresAt = (Datetime)exp;
} else if (exp != null) {
// supports seconds epoch or ISO string if caller passes string
String expStr = String.valueOf(exp);
try {
expiresAt = Datetime.valueOf(expStr);
} catch (Exception ignore) {
// If epoch seconds provided
try {
Long epoch = Long.valueOf(expStr);
expiresAt = Datetime.newInstance(1970,1,1,0,0,0).addSeconds((Integer)epoch);
} catch (Exception e2) { /* ignore */ }
}
}
}
// Basic validation
if (String.isBlank(provider)) {
FME_Logger.error('Missing provider in storeToken', 'OauthTokenManager', 'storeToken');
return;
}
String principalType = isAdminLevelCreds == true ? 'SERVICE' : 'USER';
// Compose unique Key__c: Provider|PrincipalType|UserId (UserId blank for SERVICE)
String compositeKey = provider + '|' + principalType + '|' + (principalType == 'USER' ? userId : '');
// FLS/CRUD checks on External_Token__c
// if (!Schema.sObjectType.HIC_FilesME__External_Token__c.isCreateable()
// || !Schema.sObjectType.HIC_FilesME__External_Token__c.isUpdateable()
// || !Schema.sObjectType.HIC_FilesME__External_Token__c.fields.Key__c.isCreateable()
// || !Schema.sObjectType.HIC_FilesME__External_Token__c.fields.Provider__c.isCreateable()
// || !Schema.sObjectType.HIC_FilesME__External_Token__c.fields.PrincipalType__c.isCreateable()) {
// FME_Logger.info('Insufficient FLS/CRUD to upsert External_Token__c','OauthTokenManager','storeToken');
// return;
// }
// Build record for upsert by Key__c
rec.HIC_FilesME__Key__c = compositeKey;
rec.HIC_FilesME__Provider__c = provider;
rec.HIC_FilesME__Principal_Type__c = principalType;
// rec.HIC_FilesME__User__c = principalType.containsIgnoreCase('USER') ? userId : null;
rec.HIC_FilesME__User__c = userId;
rec.HIC_FilesME__Is_Admin_level_Credentials__c = isAdminLevelCreds;
// Optional metadata
rec.HIC_FilesME__Instance_URL__c = instanceUrl;
rec.HIC_FilesME__Tenant_Id__c = tenantId;
//rec.AccountId__c = accountId;
// Token payload (store carefully; consider encryption upstream)
rec.HIC_FilesME__Access_Token__c = accessToken;
rec.HIC_FilesME__Refresh_Token__c = refreshToken;
rec.HIC_FilesME__Token_Type__c = tokenType;
rec.HIC_FilesME__Scope__c = scope;
rec.HIC_FilesME__Expires_At__c = expiresAt;
rec.HIC_FilesME__Connected_Username__c = connectedUsername != null ? connectedUsername : null;
// Friendly notes (mask or omit secrets)
rec.HIC_FilesME__Notes__c = connectedUsername != null ? 'Connected as: ' + connectedUsername : null;
// Upsert by external id Key__c
System.debug('data before upsert:-> '+ JSON.serialize(rec));
upsert rec HIC_FilesME__Key__c;
FME_Logger.info('Stored token for ' + compositeKey, 'OauthTokenManager','storeToken');
} catch (Exception e) {
FME_Logger.error(e.getMessage(), 'OauthTokenManager ' + e.getLineNumber(), 'storeToken');
} finally {
FME_Logger.saveLog();
}
}
//old
// public static void storeToken(Map<String, Object> tokenMap) {
// try {
// Boolean isAdminLevelCreds = Boolean.valueOf(tokenMap.get('HIC_FilesME__Is_Admin_level_Credentials__c'));
// String externalStorageType = String.valueOf(tokenMap.get('HIC_FilesME__Provider__c'));
// if( !Schema.sObjectType.HIC_FilesME__External_Token__c.isCreateable()
// || !Schema.sObjectType.HIC_FilesME__External_Token__c.fields.HIC_FilesME__Auth_Provider_Name__c.isCreateable()
// || !Schema.sObjectType.HIC_FilesME__External_Token__c.fields.HIC_FilesME__Provider__c.isCreateable()
// || !Schema.sObjectType.HIC_FilesME__External_Token__c.fields.HIC_FilesME__Refresh_Token__c.isCreateable()
// || !Schema.sObjectType.HIC_FilesME__External_Token__c.fields.HIC_FilesME__Access_Token__c.isCreateable()
// || !Schema.sObjectType.HIC_FilesME__External_Token__c.fields.HIC_FilesME__User__c.isCreateable()
// || !Schema.sObjectType.HIC_FilesME__External_Token__c.fields.HIC_FilesME__Is_Admin_level_Credentials__c.isCreateable()
// || !Schema.sObjectType.HIC_FilesME__External_Token__c.fields.HIC_FilesME__API_Endpoint_URL__c.isCreateable()
// ) {
// // throw new AuraHandledException('Cannot upsert. No create permission.');
// return;
// }
// if( !Schema.sObjectType.HIC_FilesME__External_Token__c.isUpdateable()
// || !Schema.sObjectType.HIC_FilesME__External_Token__c.fields.HIC_FilesME__Auth_Provider_Name__c.isUpdateable()
// || !Schema.sObjectType.HIC_FilesME__External_Token__c.fields.HIC_FilesME__Provider__c.isUpdateable()
// || !Schema.sObjectType.HIC_FilesME__External_Token__c.fields.HIC_FilesME__Refresh_Token__c.isUpdateable()
// || !Schema.sObjectType.HIC_FilesME__External_Token__c.fields.HIC_FilesME__Access_Token__c.isUpdateable()
// || !Schema.sObjectType.HIC_FilesME__External_Token__c.fields.HIC_FilesME__User__c.isUpdateable()
// || !Schema.sObjectType.HIC_FilesME__External_Token__c.fields.HIC_FilesME__Is_Admin_level_Credentials__c.isUpdateable()
// || !Schema.sObjectType.HIC_FilesME__External_Token__c.fields.HIC_FilesME__API_Endpoint_URL__c.isCreateable()
// ) {
// // throw new AuraHandledException('Cannot upsert. No update permission.');
// return;
// }
// HIC_FilesME__External_Token__c tokenRecord = new HIC_FilesME__External_Token__c();
// tokenRecord.Name = externalStorageType +'-'+ generateRandomString(10);
// if (isAdminLevelCreds && doesAdminTokenExists(externalStorageType)) {
// tokenRecord.Id = adminTokenId;
// }
// // tokenRecord.HIC_FilesME__Access_Token__c = String.valueOf(tokenMap.get('HIC_FilesME__Access_Token__c'));
// String accessToken= String.valueOf(tokenMap.get('HIC_FilesME__Access_Token__c'));
// tokenRecord.HIC_FilesME__Connected_Username__c = String.valueOf(tokenMap.get('HIC_FilesME__Connected_Username__c'));
// tokenRecord.HIC_FilesME__Auth_Provider_Name__c = String.valueOf(tokenMap.get('HIC_FilesME__Auth_Provider_Name__c'));
// tokenRecord.HIC_FilesME__Provider__c = externalStorageType;
// tokenRecord.HIC_FilesME__Refresh_Token__c = String.valueOf(tokenMap.get('HIC_FilesME__Refresh_Token__c'));
// tokenRecord.HIC_FilesME__User__c = String.valueOf(tokenMap.get('HIC_FilesME__User__c'));
// tokenRecord.HIC_FilesME__Is_Admin_level_Credentials__c = isAdminLevelCreds;
// tokenRecord.HIC_FilesME__API_Endpoint_URL__c = String.valueOf(tokenMap.get('HIC_FilesME__API_Endpoint_URL__c'));
// tokenRecord.HIC_FilesME__Access_Token__c = accessToken;
// System.debug('>>> externalStorageType: ' + externalStorageType);
// System.debug('>>> isAdminCred: ' + isAdminLevelCreds);
// System.debug('>>> userId: ' + String.valueOf(tokenMap.get('HIC_FilesME__User__c')));
// System.debug('>>> tokenRecord before upsert: ' + JSON.serialize(tokenRecord));
// // System.debug('###tokenRecord: ' + tokenRecord);
// upsert tokenRecord;
// System.debug('###tokenRecord: ' + tokenRecord);
// }
// catch (Exception e) {
// // throw new AuraHandledException(e.getMessage());
// // return;
// system.debug('exception231>>>'+e.getMessage());
// FME_Logger.error(e.getMessage(), 'OauthTokenManager' + e.getLineNumber(), 'storeToken');
// } finally{
// FME_Logger.saveLog();
// }
// }
//this used for custom object
public static Boolean doesAdminTokenExists(String externalStorage) {
Boolean exists = false;
try {
List<HIC_FilesME__External_Token__c> settingsList = [
SELECT Id, HIC_FilesME__Provider__c,HIC_FilesME__Connected_Username__c, HIC_FilesME__Is_Admin_level_Credentials__c
FROM HIC_FilesME__External_Token__c
WHERE HIC_FilesME__Provider__c = :externalStorage
AND HIC_FilesME__Is_Admin_level_Credentials__c = true
LIMIT 1
];
if (!settingsList.isEmpty()) {
adminTokenId = settingsList[0].Id;
exists = true;
}
} catch(Exception e) {
FME_Logger.error(e.getMessage(), 'OauthTokenManager' + e.getLineNumber(), 'doesAdminTokenExists');
exists = false;
}
return exists;
}
@AuraEnabled
public static Map<String, Map<String, Object>> getAllAdminTokens() {
Map<String, Map<String, Object>> allAdminTokenMap = new Map<String, Map<String, Object>>();
try {
// if( !Schema.sObjectType.HIC_FilesME__External_Token__c.isAccessible()
// || !Schema.sObjectType.HIC_FilesME__External_Token__c.fields.HIC_FilesME__User__c.isAccessible()
// || !Schema.sObjectType.HIC_FilesME__External_Token__c.fields.HIC_FilesME__Provider__c.isAccessible()
// || !Schema.sObjectType.HIC_FilesME__External_Token__c.fields.CreatedDate.isAccessible()
// || !Schema.sObjectType.HIC_FilesME__External_Token__c.fields.HIC_FilesME__Access_Token__c.isAccessible()
// || !Schema.sObjectType.HIC_FilesME__External_Token__c.fields.HIC_FilesME__Is_Admin_level_Credentials__c.isAccessible() ){
// // throw new auraHandledException('Insufficient permission');
// System.debug('Insufficient permission');
// return null;
// }
List<HIC_FilesME__External_Token__c> adminTokenList = [
SELECT Id,HIC_FilesME__Connected_Username__c, HIC_FilesME__Provider__c, CreatedDate, HIC_FilesME__Access_Token__c
FROM HIC_FilesME__External_Token__c
WHERE HIC_FilesME__Is_Admin_level_Credentials__c = true
WITH USER_MODE
LIMIT 999
];
System.debug('>>> adminTokenList: ' + JSON.serialize(adminTokenList));
List<String> allExternalStorageType = new List<String>();
allExternalStorageType.add('GoogleDrive');
allExternalStorageType.add('SharePoint');
allExternalStorageType.add('OneDrive');
allExternalStorageType.add('Dropbox');
allExternalStorageType.add('Box');
for (String externalStorageType : allExternalStorageType){
Map<String, Object> tokenMap = new Map<String, Object>();
tokenMap.put('adminTokenExists', false);
allAdminTokenMap.put(externalStorageType, tokenMap);
}
for (HIC_FilesME__External_Token__c token : adminTokenList){
DateTime myDateTime = token.CreatedDate;
String formattedDate = myDateTime.format('MMM dd, yyyy');
Map<String, Object> tokenMap = new Map<String, Object>();
// changes take user name from the connected googledrive
// // tokenMap.put('HIC_FilesME__Username__c', '');
tokenMap.put('HIC_FilesME__Connected_Username__c', token.HIC_FilesME__Connected_Username__c);
tokenMap.put('Expiry date', '');
tokenMap.put('ConnectedDate', formattedDate);
tokenMap.put('accessToken', token.HIC_FilesME__Access_Token__c);
tokenMap.put('HIC_FilesME__Provider__c', token.HIC_FilesME__Provider__c);
tokenMap.put('adminTokenExists', true);
if (token.HIC_FilesME__Provider__c == 'Google Drive' || token.HIC_FilesME__Provider__c == 'GoogleDrive') {
allAdminTokenMap.put('GoogleDrive', tokenMap);
} else {
allAdminTokenMap.put(token.HIC_FilesME__Provider__c, tokenMap);
}
}
System.debug('allAdminTokenMap' + allAdminTokenMap);
} catch (Exception e) {
// throw new AuraHandledException('Exception: '+ ex.getMessage());
FME_Logger.error(e.getMessage(), 'OauthTokenManager' + e.getLineNumber(), 'getAllAdminTokens');
// return null;
}
finally {
FME_Logger.saveLog();
}
System.debug('allAdminTokenMap:-> '+ allAdminTokenMap);
return allAdminTokenMap;
}
@AuraEnabled
public static List<HIC_FilesME__External_Token__c> fetchExternalAuthCredRecord(Id userId){
List<HIC_FilesME__External_Token__c> configs = new List<HIC_FilesME__External_Token__c>();
try {
if (!Schema.sObjectType.HIC_FilesME__External_Token__c.isAccessible()
|| !Schema.sObjectType.HIC_FilesME__External_Token__c.fields.HIC_FilesME__User__c.isAccessible()
|| !Schema.sObjectType.HIC_FilesME__External_Token__c.fields.HIC_FilesME__Provider__c.isAccessible()
|| !Schema.sObjectType.HIC_FilesME__External_Token__c.fields.HIC_FilesME__Is_Admin_level_Credentials__c.isAccessible()) {
FME_Logger.info('Insufficient permissions for ExternalServiceConfig','OauthTokenManager','fetchExternalAuthCredRecord');
configs = null;
} else {
configs = [
SELECT Id,
HIC_FilesME__Provider__c,
HIC_FilesME__Is_Admin_level_Credentials__c
FROM HIC_FilesME__External_Token__c
WHERE HIC_FilesME__Is_Admin_level_Credentials__c = false
AND HIC_FilesME__User__c = :userId
WITH USER_MODE
LIMIT 999
];
FME_Logger.info('Fetched ' + configs.size() + ' ExternalServiceConfig record(s) for user ' + userId,'OauthTokenManager','fetchExternalAuthCredRecord');
}
} catch (Exception e) {
FME_Logger.error(e.getMessage(), 'OauthTokenManager' + e.getLineNumber(), 'fetchExternalAuthCredRecord');
// configs = null;
} finally {
FME_Logger.saveLog();
}
return configs;
}
@AuraEnabled
public static String fetchServiceAccountRecord() {
String result;
try {
List<HIC_FilesME__FileMadeEasySetting__c> settingRecordList = [
SELECT Id
FROM HIC_FilesME__FileMadeEasySetting__c
];
result = settingRecordList.size() >= 1 ? 'record found' : 'null';
FME_Logger.info( 'Service-account check: ' + result, 'OauthTokenManager','fetchServiceAccountRecord');
} catch (Exception e) {
FME_Logger.error(e.getMessage(), 'OauthTokenManager' + e.getLineNumber(), 'fetchServiceAccountRecord');
throw new AuraHandledException(e.getMessage());
} finally {
FME_Logger.saveLog();
}
return result;
}
public static String generateRandomString(Integer len){
String result = '';
try {
String chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
while (result.length() < len) {
Integer idx = Math.mod(Math.abs(Crypto.getRandomInteger()), chars.length());
result += chars.substring(idx, idx + 1);
}
} catch (Exception e){
FME_Logger.error(e.getMessage(), 'OauthTokenManager' + e.getLineNumber(), 'generateRandomString');
result = '';
}
return result;
}
@AuraEnabled
public static Boolean orgSandBoxOrProduction() {
Boolean result = null;
try {
if (!Schema.sObjectType.Organization.isAccessible()
|| !Schema.sObjectType.Organization.fields.TrialExpirationDate.isAccessible()
|| !Schema.sObjectType.Organization.fields.IsSandbox.isAccessible()
|| !Schema.sObjectType.Organization.fields.Name.isAccessible()) {
result = null;
} else {
Organization orgRecord = [
SELECT Id, TrialExpirationDate, IsSandbox, Name
FROM Organization
WITH USER_MODE
LIMIT 1
];
System.debug('orgRecord: ' + orgRecord);
result = !orgRecord.IsSandbox;
}
} catch (Exception e) {
FME_Logger.error(e.getMessage(), 'OauthTokenManager' + e.getLineNumber(), 'orgSandBoxOrProduction');
throw new AuraHandledException(e.getMessage());
} finally {
FME_Logger.saveLog();
}
return result;
}
@AuraEnabled
public static Boolean hasUserPermission(String permissionName) {
Boolean result = false;
try {
result = FeatureManagement.checkPermission(permissionName);
FME_Logger.info('Permission "' + permissionName + '" = ' + result,'OauthTokenManager','hasUserPermission');
} catch (Exception e) {
FME_Logger.error(e.getMessage(), 'OauthTokenManager' + e.getLineNumber(), 'hasUserPermission');
} finally {
FME_Logger.saveLog();
}
return result;
}
}