36bbe291bf526163479386d3e3d4e52977705fc2
[motion2.git] / server / api / cloudProvider / cloudProvider.oauth.js
1 // *************************************************************************
2 // *                                                                       *
3 // * xCALLY Motion -  The Omnichannel Contact Center                       *
4 // * Copyright (c) Xenialab s.r.l. All Rights Reserved                     *
5 // *                                                                       *
6 // *************************************************************************
7 // *                                                                       *
8 // * Email: info@xcally.com                                                *
9 // * Website: https://www.xcally.com                                       *
10 // *                                                                       *
11 // *************************************************************************
12 // *                                                                       *
13 // * The SOFTWARE PRODUCT is protected by copyright laws and international *
14 // * copyright treaties, as well as other intellectual property laws and   *
15 // * treaties. The SOFTWARE PRODUCT is licensed, not sold.                         *
16 // *                                                                       *
17 // *************************************************************************
18 var _0x29db=['email','offline_access','https://outlook.office365.com/IMAP.AccessAsUser.All','https://outlook.office.com/POP.AccessAsUser.All','https://outlook.office.com/SMTP.Send','/authorize','/token','map','type','Dynamics365','data7','/.default','Outlook365','replace','{TENANT_ID}','data2','from','toString','base64','hex','client_id','data1','response_type','join','redirect_uri','data4','form_post','state','nonce','prompt','login','key','value','oauth2Claims','oauth2/','set','payload','iss','issuer','aud','audience','isAfter','unix','exp','then','data3','findOne','refresh_token','data6','decryptString','POST','access_token','CloudProvider','data5','catch','error','Failed\x20to\x20refresh\x20access\x20token\x20for\x20cloud\x20provider\x20#%s,\x20-\x20err:%s','authorization_code','intervals','findAll','all','inspect','[CLOUD_PROVIDER]\x20Error\x20while\x20refreshing\x20the\x20tokens\x20after\x20service\x20restart\x20error:%s','exports','lodash','jsonwebtoken','moment','request-promise','../../components/encryptor','../../config/environment','../../config/logger','api','../../config/schedule/cloud-provider','defaults','redis','localhost','profile'];(function(_0x46cad4,_0x2002aa){var _0x2468c6=function(_0x57f73a){while(--_0x57f73a){_0x46cad4['push'](_0x46cad4['shift']());}};_0x2468c6(++_0x2002aa);}(_0x29db,0x8d));var _0xb29d=function(_0x843b07,_0x155d72){_0x843b07=_0x843b07-0x0;var _0x3ed748=_0x29db[_0x843b07];return _0x3ed748;};'use strict';var _=require(_0xb29d('0x0'));var crypto=require('crypto');var jwt=require(_0xb29d('0x1'));var moment=require(_0xb29d('0x2'));var Redis=require('ioredis');var rp=require(_0xb29d('0x3'));var util=require('util');var encryptor=require(_0xb29d('0x4'));var config=require(_0xb29d('0x5'));var logger=require(_0xb29d('0x6'))(_0xb29d('0x7'));var schedule=require(_0xb29d('0x8'));var db=require('../../mysqldb')['db'];config['redis']=_[_0xb29d('0x9')](config[_0xb29d('0xa')],{'host':_0xb29d('0xb'),'port':0x18eb});var redis=new Redis(config[_0xb29d('0xa')]);var MICROSOFT_AUTH_URL='https://login.microsoftonline.com/{TENANT_ID}/oauth2/v2.0';var AZURE_AUTH_SCOPES={'Outlook365':['openid',_0xb29d('0xc'),_0xb29d('0xd'),_0xb29d('0xe'),_0xb29d('0xf'),_0xb29d('0x10'),_0xb29d('0x11')],'Dynamics365':['openid',_0xb29d('0xe')]};var MICROSOFT_AUTH_ENDPOINT=_0xb29d('0x12');var MICROSOFT_TOKEN_ENDPOINT=_0xb29d('0x13');var OAUTH_REFRESH_INTERVAL=0xfa;function getAuthorizationScopes(_0x5c3e8f){var _0x2b9349=_[_0xb29d('0x14')](AZURE_AUTH_SCOPES[_0x5c3e8f[_0xb29d('0x15')]]);if(_0x5c3e8f[_0xb29d('0x15')]===_0xb29d('0x16'))_0x2b9349['push'](_0x5c3e8f[_0xb29d('0x17')]+_0xb29d('0x18'));return _0x2b9349['join']('\x20');}function getAccessTokenScope(_0x2b4f49){if(_0x2b4f49[_0xb29d('0x15')]===_0xb29d('0x19'))return _0xb29d('0xf');if(_0x2b4f49[_0xb29d('0x15')]==='Dynamics365')return _0x2b4f49['data7']+_0xb29d('0x18');}function generateMicrosoftAuthorizationUrl(_0x202318,_0x374394){var _0x29de33=MICROSOFT_AUTH_URL[_0xb29d('0x1a')](_0xb29d('0x1b'),_0x202318[_0xb29d('0x1c')]);var _0x5217e7=['code','id_token'];var _0x36673e=Buffer[_0xb29d('0x1d')](JSON['stringify']({'id':_0x374394}))[_0xb29d('0x1e')](_0xb29d('0x1f'));var _0xee9d5a=crypto['randomBytes'](0x10)[_0xb29d('0x1e')](_0xb29d('0x20'));var _0x5817cc=getAuthorizationScopes(_0x202318);var _0x343ccd=[{'key':_0xb29d('0x21'),'value':_0x202318[_0xb29d('0x22')]},{'key':_0xb29d('0x23'),'value':encodeURIComponent(_0x5217e7[_0xb29d('0x24')]('\x20'))},{'key':_0xb29d('0x25'),'value':_0x202318[_0xb29d('0x26')]},{'key':'response_mode','value':_0xb29d('0x27')},{'key':'scope','value':encodeURIComponent(_0x5817cc)},{'key':_0xb29d('0x28'),'value':_0x36673e},{'key':_0xb29d('0x29'),'value':_0xee9d5a},{'key':_0xb29d('0x2a'),'value':_0xb29d('0x2b')}];var _0x4fbde8=_0x29de33+MICROSOFT_AUTH_ENDPOINT+'?'+_[_0xb29d('0x14')](_0x343ccd,function(_0x2dc158){return _0x2dc158[_0xb29d('0x2c')]+'='+_0x2dc158[_0xb29d('0x2d')];})[_0xb29d('0x24')]('&');_0x202318[_0xb29d('0x2e')]={'issuer':_0x29de33['replace'](_0xb29d('0x2f'),''),'audience':_0x202318['data1'],'state':_0x36673e,'nonce':_0xee9d5a};redis[_0xb29d('0x30')](_0x36673e,JSON['stringify'](_0x202318));return _0x4fbde8;}function isValidIdToken(_0x497441,_0x2be86a){try{var _0x52b105=jwt['decode'](_0x497441,{'complete':!![]});var _0x4ef3f4=_0x52b105[_0xb29d('0x31')];if(_0x4ef3f4[_0xb29d('0x32')]!==_0x2be86a[_0xb29d('0x33')])return![];if(_0x4ef3f4[_0xb29d('0x34')]!==_0x2be86a[_0xb29d('0x35')])return![];if(_0x4ef3f4['nonce']!==_0x2be86a[_0xb29d('0x29')])return![];if(moment()[_0xb29d('0x36')](moment[_0xb29d('0x37')](_0x4ef3f4[_0xb29d('0x38')])))return![];return!![];}catch(_0x9d2b6d){throw _0x9d2b6d;}}function refreshOauth2MicrosoftAccessToken(_0x383a16){return Promise['resolve']()[_0xb29d('0x39')](function(){if(_0x383a16[_0xb29d('0x3a')])return _0x383a16;return db['CloudProvider'][_0xb29d('0x3b')]({'where':{'id':_0x383a16['id']},'raw':!![]});})[_0xb29d('0x39')](function(_0xed6083){var _0x2fb545={'grant_type':_0xb29d('0x3c'),'refresh_token':_0xed6083[_0xb29d('0x3d')],'scope':getAccessTokenScope(_0xed6083),'redirect_uri':_0xed6083[_0xb29d('0x26')],'client_id':_0xed6083[_0xb29d('0x22')],'client_secret':encryptor[_0xb29d('0x3e')](_0xed6083[_0xb29d('0x3a')])};var _0x4444da={'method':_0xb29d('0x3f'),'uri':MICROSOFT_AUTH_URL[_0xb29d('0x1a')](_0xb29d('0x1b'),_0xed6083[_0xb29d('0x1c')])+MICROSOFT_TOKEN_ENDPOINT,'form':_0x2fb545,'json':!![]};return rp(_0x4444da);})['then'](function(_0x4ab342){_0x383a16['data5']=_0x4ab342[_0xb29d('0x40')];_0x383a16[_0xb29d('0x3d')]=_0x4ab342[_0xb29d('0x3c')];return db[_0xb29d('0x41')]['update']({'data5':_0x383a16[_0xb29d('0x42')],'data6':_0x383a16[_0xb29d('0x3d')]},{'where':{'id':_0x383a16['id']}});})[_0xb29d('0x39')](function(){return _0x383a16;})[_0xb29d('0x43')](function(_0x49d478){logger[_0xb29d('0x44')](_0xb29d('0x45'),_0x383a16['id'],_0x49d478);});}function getOauth2MicrosoftAccessToken(_0x46194c,_0x41872d){var _0x5ee4c8={'grant_type':_0xb29d('0x46'),'code':_0x46194c,'scope':getAccessTokenScope(_0x41872d),'redirect_uri':_0x41872d[_0xb29d('0x26')],'client_id':_0x41872d[_0xb29d('0x22')],'client_secret':encryptor['decryptString'](_0x41872d[_0xb29d('0x3a')])};var _0x2a6bc2={'method':_0xb29d('0x3f'),'uri':MICROSOFT_AUTH_URL['replace'](_0xb29d('0x1b'),_0x41872d['data2'])+MICROSOFT_TOKEN_ENDPOINT,'form':_0x5ee4c8,'json':!![]};return rp(_0x2a6bc2);}function startRefreshInterval(_0x1fe968){var _0x3c0e04=schedule[_0xb29d('0x47')];if(_0x3c0e04[_0x1fe968['id']])clearInterval(_0x3c0e04[_0x1fe968['id']]);_0x3c0e04[_0x1fe968['id']]=setInterval(refreshOauth2MicrosoftAccessToken['bind'](this,{'id':_0x1fe968['id']}),OAUTH_REFRESH_INTERVAL*0x3e8);schedule[_0xb29d('0x47')]=_0x3c0e04;}function startAllRefreshIntervals(){return db[_0xb29d('0x41')][_0xb29d('0x48')]({'where':{'data6':{'$ne':null}},'raw':!![]})[_0xb29d('0x39')](function(_0x40ac5d){var _0x59affc=_0x40ac5d['map'](function(_0x3b7384){return refreshOauth2MicrosoftAccessToken(_0x3b7384)[_0xb29d('0x39')](function(_0x18cae6){startRefreshInterval(_0x18cae6);});});return Promise[_0xb29d('0x49')](_0x59affc);})[_0xb29d('0x43')](function(_0x10afdf){var _0x21b422=_0x10afdf?util[_0xb29d('0x4a')](_0x10afdf,{'showHidden':![],'depth':null}):'';logger[_0xb29d('0x44')](_0xb29d('0x4b'),_0x21b422);});}module[_0xb29d('0x4c')]={'generateMicrosoftAuthorizationUrl':generateMicrosoftAuthorizationUrl,'getOauth2MicrosoftAccessToken':getOauth2MicrosoftAccessToken,'isValidIdToken':isValidIdToken,'startAllRefreshIntervals':startAllRefreshIntervals,'refreshOauth2MicrosoftAccessToken':refreshOauth2MicrosoftAccessToken,'startRefreshInterval':startRefreshInterval};