// 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 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 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 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> getAllAdminTokens() { Map> allAdminTokenMap = new Map>(); 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 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 allExternalStorageType = new List(); allExternalStorageType.add('GoogleDrive'); allExternalStorageType.add('SharePoint'); allExternalStorageType.add('OneDrive'); allExternalStorageType.add('Dropbox'); allExternalStorageType.add('Box'); for (String externalStorageType : allExternalStorageType){ Map tokenMap = new Map(); 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 tokenMap = new Map(); // 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 fetchExternalAuthCredRecord(Id userId){ List configs = new List(); 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 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; } }