jeudi 15 octobre 2015

Introduction à Salesforce Shield

Salesforce Shield permet aux clients de voir qui fait quoi avec les données sensibles, de connaître l'état et la valeur de leurs données remontant jusqu'à dix ans, et de crypter les données sensibles, tout en préservant la fonctionnalité de l'entreprise.
Il est déclaratif et peut être configuré dans un après-midi avec le point & click.
Salesforce Shield comprend trois services de base:

Event Monitoring
Donner aux clients une visibilité sans précédent dans leurs applications Salesforce, leur permettant de voir facilement qu'elles données les utilisateurs y ont accès, à partir de quelle adresse IP, et quelles mesures sont prises en ce qui concerne ces données.
Ensuite, ils peuvent suivre quand quelqu'un imprime une page ou une liste, édite un document ou crée un, change de propriétaire, actualise une liste, ou même quand un utilisateur exporte les données.


Field Audit Trail
Donner aux clients une machine de temps pour qu'ils puissent remonter dans le temps et voir l'état et la valeur de leurs données sur une date, à tout moment. Il élargit ce qui est actuellement disponible avec "Field History", donnant aux clients un maximum de 10 années de données de vérification pour un maximum de 60 champs par objet.

Platform Encryption
Permet aux clients de crypter les données sensibles tout en conservant les fonctionnalités des applications importantes. Parce que les données sont cryptées à la couche de métadonnées dans la base de données, la clé fonctionnalité de l'application Salesforce peut être faite 'cryptage conscience' et le travail malgré les données cryptées.
Encore plus étonnant, les applications des partenaires sur AppExchange, comme Conga, peuvent également inclure des données et respecter le choix des données que d'un client choisit de crypter dans leur organigramme. Platform Encryption est construit nativement dans la plateforme et peut être mis en place en quelques minutes.

Pour plus d'information, cliquez ici

Téléchargement d'un fichier sur AMAZON S3 (frankfurt) - Salesforce.com

Durant mes années d’expériences j'ai rencontre plusieurs problèmes bloquant, mais celui là était parmi les pires.

Un de mes clients nous a demandé d'utiliser AMAZON S3 comme espace de stockage des fichiers, bien sûre SalesForce vous propose une API déjà prête pour ce genre de manipulation, MAIS PAS POUR FRANKFURT.

Pour ceux qui n'ont pas encore rencontre ce problème, FRANKFURT utilise un nouveau algorithme de sécurité beaucoup plus compliqué et qui se base sur plusieurs cryptage.

Et Comme je suis quelqu'un qui pense que partager une information, entre dans le cadre de l'amélioration des compétences, VOICI LA SOLUTION :)



public class amazon{

    public amazon(){}
       
    public void sendTXTToAmazon(Blob b,String docname,String bucket){
        Datetime currentDate = DateTimeHelper.getGMTDate(Datetime.now());      
        
        /* Send to Amazon S3 */
        HttpRequest req = new HttpRequest();         
        AWSAccess__c CS = AWSAccess__c.getOrgDefaults();         
        string amz_content_sha256 = EncodingUtil.convertToHex(Crypto.generateDigest('SHA-256', b));        
        /*Set HTTPRequest Method*/
        req.setMethod('PUT');               
        /*Set HTTPRequest header properties*/
        req.setHeader('content-type', 'text/plain;charset=utf-8');
        req.setHeader('Content-Length',String.valueOf(b.size()));
        req.setHeader('Host','s3-eu-central-1.amazonaws.com');
        req.setHeader('Connection','keep-alive');
        req.setEndpoint('https://s3-eu-central-1.amazonaws.com/'+bucket+'/'+docname);
        req.setHeader('x-amz-content-sha256',amz_content_sha256); 
        req.setHeader('x-amz-storage-class','REDUCED_REDUNDANCY');         
        String todayformat =  currentDate.format('yyyyMMdd');
        req.setHeader('Date',currentDate.format('EEE, d MMM yyyy HH:mm:ss Z')); 
        req.setHeader('x-amz-date',currentDate.format('yyyyMMdd')+'T'+currentDate.format('HHmmss')+'Z'); 
        String key = 'AWS4' +CS.secret__c;
        
        Blob DateKey                 = Crypto.generateMac('hmacSHA256',Blob.valueOf(todayformat),Blob.valueOf(key));
        Blob DateRegionKey           = Crypto.generateMac('hmacSHA256',Blob.valueOf('eu-central-1'),DateKey);
        Blob DateRegionServiceKey    = Crypto.generateMac('hmacSHA256',Blob.valueOf('s3'),DateRegionKey);
        Blob SigningKey              = Crypto.generateMac('hmacSHA256',Blob.valueOf('aws4_request'),DateRegionServiceKey);
        
        String canonical =  'PUT\n'+
                            '/'+bucket+'/'+docname+'\n\n'+                
                            'date:' + currentDate.format('EEE, d MMM yyyy HH:mm:ss Z')+'\n'+
                            'host:s3-eu-central-1.amazonaws.com\n'+
                            'x-amz-content-sha256:'+amz_content_sha256+'\n'+
                            'x-amz-date:'+currentDate.format('yyyyMMdd')+'T'+currentDate.format('HHmmss')+'Z'+'\n'+
                            'x-amz-storage-class:REDUCED_REDUNDANCY\n\n'+                
                            'date;host;x-amz-content-sha256;x-amz-date;x-amz-storage-class\n'
                            +amz_content_sha256;   
        
              
        Blob canonicalsign = Crypto.generateDigest('SHA-256', Blob.valueOf(canonical));  
        Blob StringToSign = Blob.valueOf('AWS4-HMAC-SHA256\n'+
        currentDate.format('yyyyMMdd')+'T'+currentDate.format('HHmmss')+'Z'+'\n'+
        currentDate.format('yyyyMMdd')+'/eu-central-1/s3/aws4_request\n'+
        EncodingUtil.convertToHex(canonicalsign));        
        Blob bsig =  Crypto.generateMac('hmacSHA256',StringToSign,SigningKey);        
        req.setHeader('Authorization', 'AWS4-HMAC-SHA256 Credential='+CS.Key__c+'/'+todayformat+'/eu-central-1/s3/aws4_request,SignedHeaders=date;host;x-amz-content-sha256;x-amz-date;x-amz-storage-class,Signature='+EncodingUtil.convertToHex(bsig));        
        String docBody = EncodingUtil.convertToHex(b);
        
        /*Set the HTTPRequest body */   
        req.setBodyAsBlob(b);   
        Http http = new Http();        
        try {   
            HTTPResponse res = http.send(req);                      
            System.debug(res.getBody());                   
            //System.debug(res.toString());
            System.debug('STATUS:'+res.getStatus());
            
            System.debug('STATUS_CODE:'+res.getStatusCode());                        
        } catch(System.CalloutException e) {           
            System.debug('erreur : '+e);
        }             
        
    }
    public void sendPDFToAmazon(Blob b,String docname,String bucket){
        Datetime currentDate = DateTimeHelper.getGMTDate(Datetime.now());      
        
        /* Send to Amazon S3 */
        HttpRequest req = new HttpRequest();         
        AWSAccess__c CS = AWSAccess__c.getOrgDefaults();         
        string amz_content_sha256 = EncodingUtil.convertToHex(Crypto.generateDigest('SHA-256', b));        
        /*Set HTTPRequest Method*/
        req.setMethod('PUT');               
        /*Set HTTPRequest header properties*/
        req.setHeader('content-type', 'application/pdf');
        req.setHeader('Content-Length',String.valueOf(b.size()));
        req.setHeader('Host','s3-eu-central-1.amazonaws.com');
        req.setHeader('Connection','keep-alive');
        req.setEndpoint('https://s3-eu-central-1.amazonaws.com/'+bucket+'/'+docname);
        req.setHeader('x-amz-content-sha256',amz_content_sha256); 
        req.setHeader('x-amz-storage-class','REDUCED_REDUNDANCY');         
        String todayformat =  currentDate.format('yyyyMMdd');
        req.setHeader('Date',currentDate.format('EEE, d MMM yyyy HH:mm:ss Z')); 
        req.setHeader('x-amz-date',currentDate.format('yyyyMMdd')+'T'+currentDate.format('HHmmss')+'Z'); 
        String key = 'AWS4' +CS.secret__c;
        
        Blob DateKey                 = Crypto.generateMac('hmacSHA256',Blob.valueOf(todayformat),Blob.valueOf(key));
        Blob DateRegionKey           = Crypto.generateMac('hmacSHA256',Blob.valueOf('eu-central-1'),DateKey);
        Blob DateRegionServiceKey    = Crypto.generateMac('hmacSHA256',Blob.valueOf('s3'),DateRegionKey);
        Blob SigningKey              = Crypto.generateMac('hmacSHA256',Blob.valueOf('aws4_request'),DateRegionServiceKey);
        
        String canonical =  'PUT\n'+
                            '/'+bucket+'/'+docname+'\n\n'+                
                            'date:' + currentDate.format('EEE, d MMM yyyy HH:mm:ss Z')+'\n'+
                            'host:s3-eu-central-1.amazonaws.com\n'+
                            'x-amz-content-sha256:'+amz_content_sha256+'\n'+
                            'x-amz-date:'+currentDate.format('yyyyMMdd')+'T'+currentDate.format('HHmmss')+'Z'+'\n'+
                            'x-amz-storage-class:REDUCED_REDUNDANCY\n\n'+                
                            'date;host;x-amz-content-sha256;x-amz-date;x-amz-storage-class\n'
                            +amz_content_sha256;              
        Blob canonicalsign = Crypto.generateDigest('SHA-256', Blob.valueOf(canonical));  
        Blob StringToSign = Blob.valueOf('AWS4-HMAC-SHA256\n'+
        currentDate.format('yyyyMMdd')+'T'+currentDate.format('HHmmss')+'Z'+'\n'+
        currentDate.format('yyyyMMdd')+'/eu-central-1/s3/aws4_request\n'+
        EncodingUtil.convertToHex(canonicalsign));        
        Blob bsig =  Crypto.generateMac('hmacSHA256',StringToSign,SigningKey);        
        req.setHeader('Authorization', 'AWS4-HMAC-SHA256 Credential='+CS.Key__c+'/'+todayformat+'/eu-central-1/s3/aws4_request,SignedHeaders=date;host;x-amz-content-sha256;x-amz-date;x-amz-storage-class,Signature='+EncodingUtil.convertToHex(bsig));        
        String docBody = EncodingUtil.convertToHex(b);
        
        /*Set the HTTPRequest body */   
        req.setBodyAsBlob(b);   
        Http http = new Http();        
        try {   
            HTTPResponse res = http.send(req);                      
            System.debug(res.getBody());                   
            //System.debug(res.toString());
            System.debug('STATUS:'+res.getStatus());
            
            System.debug('STATUS_CODE:'+res.getStatusCode());                    
        } catch(System.CalloutException e) {           
            System.debug('erreur : '+e);
            MailingHelper.sendToAdminMail('Erreur SEND PDF Amazon : '+docname, e.getMessage());            
        }             
        
    }    
    public string GetObjectUrl(String docname,String bucket){
        String url;
        Datetime currentDate = DateTimeHelper.getGMTDate(Datetime.now());
        string exipredFormat = '1600';
        
        String todayformat =  currentDate.format('yyyyMMdd');       
        AWSAccess__c CS = AWSAccess__c.getOrgDefaults();  
        
        String key = 'AWS4' +CS.secret__c;        
        Blob DateKey                 = Crypto.generateMac('hmacSHA256',Blob.valueOf(todayformat),Blob.valueOf(key));
        Blob DateRegionKey           = Crypto.generateMac('hmacSHA256',Blob.valueOf('eu-central-1'),DateKey);
        Blob DateRegionServiceKey    = Crypto.generateMac('hmacSHA256',Blob.valueOf('s3'),DateRegionKey);
        Blob SigningKey              = Crypto.generateMac('hmacSHA256',Blob.valueOf('aws4_request'),DateRegionServiceKey);
        
        String canonical =  'GET\n'+
                            '/'+docname+'\n'+  
                            'X-Amz-Algorithm=AWS4-HMAC-SHA256&'+
                            'X-Amz-Credential='+CS.Key__c+'%2F'+todayformat+'%2Feu-central-1%2Fs3%2Faws4_request&'+
                            'X-Amz-Date='+todayformat+'T'+currentDate.format('HHmmss')+'Z&'+
                            'X-Amz-Expires='+exipredFormat+'&X-Amz-SignedHeaders=host\n'+
                            'host:'+bucket+'.s3.amazonaws.com\n\n'+ 
                            'host\n'+
                            'UNSIGNED-PAYLOAD';  
        system.debug(canonical);
        Blob canonicalsign = Crypto.generateDigest('SHA-256', Blob.valueOf(canonical)); 
       
        Blob StringToSign = Blob.valueOf('AWS4-HMAC-SHA256\n'+
                            todayformat+'T'+currentDate.format('HHmmss')+'Z'+'\n'+
                            todayformat+'/eu-central-1/s3/aws4_request\n'+
                            EncodingUtil.convertToHex(canonicalsign)); 
        
        system.debug(StringToSign);
   
        
        Blob bsig =  Crypto.generateMac('hmacSHA256',StringToSign,SigningKey);         
        
        url = 'https://'+bucket+'.s3.amazonaws.com/'+docname+'?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential='+CS.Key__c+'/'+todayformat+'/eu-central-1/s3/aws4_request&X-Amz-Date='+todayformat+'T'+currentDate.format('HHmmss')+'Z&X-Amz-Expires='+exipredFormat+'&X-Amz-SignedHeaders=host&X-Amz-Signature='+EncodingUtil.convertToHex(bsig);
              
        return url;
    }
} 


Heureux de répondre à toute question .
Espérons que cela aidera quelqu'un.

Obtenez la Géolocalisation actuel dans Salesforce en utilisant l'API de géolocalisation

Dernièrement j'ai essayé de chercher mon emplacement dans SalesForce, La plupart du temps les développeurs utilisent Google API pour ça, mais en creusant un peu, j'ai découvert un moyen plus facile et qui me permettra atteindre mon objectif, la bonne partie c'est que vous pouvez utiliser le code JAVASCRIPT sans se référer à d'autres bibliothèques.

Ici, je eu l'exemple de l'utilisation de l'API de géolocalisation, cet article définit une API qui permet d'accéder à l'information par script de localisation géographique associée au dispositif d'hébergement.

voici l'exemple de code qu'ils partageaient.


Donc, pour mettre en œuvre cette méthode, je vais vérifier si la météo fonctionner normalement sur ​​Salesforce ou non , donc je créé un bouton de détails sur le compte pour exécuter le code. J'ai créé un champ de type de géolocalisation sur l'objet de compte, un bouton et je les ai ajouté à la page de presentation .

Voici le résultat, il suffit de cliquer sur le bouton "check-in", pour savoir plus sur le domaine de la géolocalisation , cliquez ici



Voici le code du bouton "check-in", s'il vous plaît mettre Comportement comme Exécuter JavaScript du bouton de détail.


1:  {  
2:    !requireScript("/soap/ajax/26.0/connection.js") 
3:  } 
4:  navigator.geolocation.getCurrentPosition(function(position) { 
5:    var longitude = position.coords.longitude; 
6:    var latitude = position.coords.latitude; 
7:    var account = new sforce.SObject("Account"); 
8:    account.id = '{!Account.Id}'; 
9:    account.Geolocation__Latitude__s = latitude; 
11:   account.Geolocation__Longitude__s = longitude; 
12:   var result = sforce.connection.update([account]); 
13:   if (result[0].getBoolean("success")) { 
14:        alert('Account updated successfully'); 
15:        window.location.reload(); 
16:   } else { 
17:       alert('Error : ' + result); 
18:   } 
19: }); 


Heureux de répondre à toute question .
Espérons que cela aidera quelqu'un.