Built motion from commit efa66e19.|2.6.22
[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 _0xcfd4=['decode','iss','issuer','aud','audience','isAfter','unix','exp','resolve','data3','CloudProvider','refresh_token','data6','decryptString','POST','then','data5','update','catch','error','Failed\x20to\x20refresh\x20access\x20token\x20for\x20cloud\x20provider\x20#%s,\x20-\x20err:%s','authorization_code','intervals','bind','findAll','map','all','exports','crypto','jsonwebtoken','moment','ioredis','request-promise','../../components/encryptor','api','../../config/schedule/cloud-provider','defaults','redis','localhost','https://login.microsoftonline.com/{TENANT_ID}/oauth2/v2.0','openid','offline_access','/token','type','data7','/.default','join','Outlook365','https://outlook.office365.com/IMAP.AccessAsUser.All','Dynamics365','replace','{TENANT_ID}','data2','code','from','stringify','toString','randomBytes','hex','client_id','data1','response_type','redirect_uri','form_post','scope','state','nonce','prompt','key','value','set'];(function(_0xe4a312,_0x30ab51){var _0x8ef3e8=function(_0x46d92d){while(--_0x46d92d){_0xe4a312['push'](_0xe4a312['shift']());}};_0x8ef3e8(++_0x30ab51);}(_0xcfd4,0x138));var _0x4cfd=function(_0x479bc2,_0xc70b03){_0x479bc2=_0x479bc2-0x0;var _0x3aa11e=_0xcfd4[_0x479bc2];return _0x3aa11e;};'use strict';var _=require('lodash');var crypto=require(_0x4cfd('0x0'));var jwt=require(_0x4cfd('0x1'));var moment=require(_0x4cfd('0x2'));var Redis=require(_0x4cfd('0x3'));var rp=require(_0x4cfd('0x4'));var util=require('util');var encryptor=require(_0x4cfd('0x5'));var config=require('../../config/environment');var logger=require('../../config/logger')(_0x4cfd('0x6'));var schedule=require(_0x4cfd('0x7'));var db=require('../../mysqldb')['db'];config['redis']=_[_0x4cfd('0x8')](config[_0x4cfd('0x9')],{'host':_0x4cfd('0xa'),'port':0x18eb});var redis=new Redis(config[_0x4cfd('0x9')]);var MICROSOFT_AUTH_URL=_0x4cfd('0xb');var AZURE_AUTH_SCOPES={'Outlook365':[_0x4cfd('0xc'),'profile','email',_0x4cfd('0xd'),'https://outlook.office365.com/IMAP.AccessAsUser.All','https://outlook.office.com/POP.AccessAsUser.All','https://outlook.office.com/SMTP.Send'],'Dynamics365':[_0x4cfd('0xc'),_0x4cfd('0xd')]};var MICROSOFT_AUTH_ENDPOINT='/authorize';var MICROSOFT_TOKEN_ENDPOINT=_0x4cfd('0xe');var OAUTH_REFRESH_INTERVAL=0xfa;function getAuthorizationScopes(_0x1d052f){var _0xdfdbcc=_['map'](AZURE_AUTH_SCOPES[_0x1d052f['type']]);if(_0x1d052f[_0x4cfd('0xf')]==='Dynamics365')_0xdfdbcc['push'](_0x1d052f[_0x4cfd('0x10')]+_0x4cfd('0x11'));return _0xdfdbcc[_0x4cfd('0x12')]('\x20');}function getAccessTokenScope(_0x338a7b){if(_0x338a7b[_0x4cfd('0xf')]===_0x4cfd('0x13'))return _0x4cfd('0x14');if(_0x338a7b[_0x4cfd('0xf')]===_0x4cfd('0x15'))return _0x338a7b[_0x4cfd('0x10')]+_0x4cfd('0x11');}function generateMicrosoftAuthorizationUrl(_0x4822df,_0x3d3a68){var _0x454bd7=MICROSOFT_AUTH_URL[_0x4cfd('0x16')](_0x4cfd('0x17'),_0x4822df[_0x4cfd('0x18')]);var _0x11e163=[_0x4cfd('0x19'),'id_token'];var _0x3d053e=Buffer[_0x4cfd('0x1a')](JSON[_0x4cfd('0x1b')]({'id':_0x3d3a68}))[_0x4cfd('0x1c')]('base64');var _0xd3ed36=crypto[_0x4cfd('0x1d')](0x10)[_0x4cfd('0x1c')](_0x4cfd('0x1e'));var _0x478562=getAuthorizationScopes(_0x4822df);var _0x1f8188=[{'key':_0x4cfd('0x1f'),'value':_0x4822df[_0x4cfd('0x20')]},{'key':_0x4cfd('0x21'),'value':encodeURIComponent(_0x11e163[_0x4cfd('0x12')]('\x20'))},{'key':_0x4cfd('0x22'),'value':_0x4822df['data4']},{'key':'response_mode','value':_0x4cfd('0x23')},{'key':_0x4cfd('0x24'),'value':encodeURIComponent(_0x478562)},{'key':_0x4cfd('0x25'),'value':_0x3d053e},{'key':_0x4cfd('0x26'),'value':_0xd3ed36},{'key':_0x4cfd('0x27'),'value':'login'}];var _0x15271a=_0x454bd7+MICROSOFT_AUTH_ENDPOINT+'?'+_['map'](_0x1f8188,function(_0x471573){return _0x471573[_0x4cfd('0x28')]+'='+_0x471573[_0x4cfd('0x29')];})[_0x4cfd('0x12')]('&');_0x4822df['oauth2Claims']={'issuer':_0x454bd7[_0x4cfd('0x16')]('oauth2/',''),'audience':_0x4822df['data1'],'state':_0x3d053e,'nonce':_0xd3ed36};redis[_0x4cfd('0x2a')](_0x3d053e,JSON[_0x4cfd('0x1b')](_0x4822df));return _0x15271a;}function isValidIdToken(_0x588f82,_0x193ca3){try{var _0xa40c08=jwt[_0x4cfd('0x2b')](_0x588f82,{'complete':!![]});var _0x2deb35=_0xa40c08['payload'];if(_0x2deb35[_0x4cfd('0x2c')]!==_0x193ca3[_0x4cfd('0x2d')])return![];if(_0x2deb35[_0x4cfd('0x2e')]!==_0x193ca3[_0x4cfd('0x2f')])return![];if(_0x2deb35['nonce']!==_0x193ca3[_0x4cfd('0x26')])return![];if(moment()[_0x4cfd('0x30')](moment[_0x4cfd('0x31')](_0x2deb35[_0x4cfd('0x32')])))return![];return!![];}catch(_0x861b89){throw _0x861b89;}}function refreshOauth2MicrosoftAccessToken(_0x1ec119){return Promise[_0x4cfd('0x33')]()['then'](function(){if(_0x1ec119[_0x4cfd('0x34')])return _0x1ec119;return db[_0x4cfd('0x35')]['findOne']({'where':{'id':_0x1ec119['id']},'raw':!![]});})['then'](function(_0x1898a9){var _0x2c15ed={'grant_type':_0x4cfd('0x36'),'refresh_token':_0x1898a9[_0x4cfd('0x37')],'scope':getAccessTokenScope(_0x1898a9),'redirect_uri':_0x1898a9['data4'],'client_id':_0x1898a9[_0x4cfd('0x20')],'client_secret':encryptor[_0x4cfd('0x38')](_0x1898a9[_0x4cfd('0x34')])};var _0x4a16ec={'method':_0x4cfd('0x39'),'uri':MICROSOFT_AUTH_URL[_0x4cfd('0x16')]('{TENANT_ID}',_0x1898a9[_0x4cfd('0x18')])+MICROSOFT_TOKEN_ENDPOINT,'form':_0x2c15ed,'json':!![]};return rp(_0x4a16ec);})[_0x4cfd('0x3a')](function(_0x1bb89f){_0x1ec119[_0x4cfd('0x3b')]=_0x1bb89f['access_token'];_0x1ec119[_0x4cfd('0x37')]=_0x1bb89f['refresh_token'];return db['CloudProvider'][_0x4cfd('0x3c')]({'data5':_0x1ec119[_0x4cfd('0x3b')],'data6':_0x1ec119['data6']},{'where':{'id':_0x1ec119['id']}});})[_0x4cfd('0x3a')](function(){return _0x1ec119;})[_0x4cfd('0x3d')](function(_0x28f95f){logger[_0x4cfd('0x3e')](_0x4cfd('0x3f'),_0x1ec119['id'],_0x28f95f);});}function getOauth2MicrosoftAccessToken(_0x2aa030,_0xb6ed7a){var _0x1f1c9e={'grant_type':_0x4cfd('0x40'),'code':_0x2aa030,'scope':getAccessTokenScope(_0xb6ed7a),'redirect_uri':_0xb6ed7a['data4'],'client_id':_0xb6ed7a[_0x4cfd('0x20')],'client_secret':encryptor['decryptString'](_0xb6ed7a[_0x4cfd('0x34')])};var _0x22d72d={'method':_0x4cfd('0x39'),'uri':MICROSOFT_AUTH_URL[_0x4cfd('0x16')](_0x4cfd('0x17'),_0xb6ed7a[_0x4cfd('0x18')])+MICROSOFT_TOKEN_ENDPOINT,'form':_0x1f1c9e,'json':!![]};return rp(_0x22d72d);}function startRefreshInterval(_0xdb5313){var _0x28e57d=schedule[_0x4cfd('0x41')];if(_0x28e57d[_0xdb5313['id']])clearInterval(_0x28e57d[_0xdb5313['id']]);_0x28e57d[_0xdb5313['id']]=setInterval(refreshOauth2MicrosoftAccessToken[_0x4cfd('0x42')](this,{'id':_0xdb5313['id']}),OAUTH_REFRESH_INTERVAL*0x3e8);schedule[_0x4cfd('0x41')]=_0x28e57d;}function startAllRefreshIntervals(){return db[_0x4cfd('0x35')][_0x4cfd('0x43')]({'where':{'data6':{'$ne':null}},'raw':!![]})[_0x4cfd('0x3a')](function(_0x345b12){var _0x3f7882=_0x345b12[_0x4cfd('0x44')](function(_0x3daf39){return refreshOauth2MicrosoftAccessToken(_0x3daf39)['then'](function(_0x47ba83){startRefreshInterval(_0x47ba83);});});return Promise[_0x4cfd('0x45')](_0x3f7882);})['catch'](function(_0x3bd862){var _0x4ed3af=_0x3bd862?util['inspect'](_0x3bd862,{'showHidden':![],'depth':null}):'';logger['error']('[CLOUD_PROVIDER]\x20Error\x20while\x20refreshing\x20the\x20tokens\x20after\x20service\x20restart\x20error:%s',_0x4ed3af);});}module[_0x4cfd('0x46')]={'generateMicrosoftAuthorizationUrl':generateMicrosoftAuthorizationUrl,'getOauth2MicrosoftAccessToken':getOauth2MicrosoftAccessToken,'isValidIdToken':isValidIdToken,'startAllRefreshIntervals':startAllRefreshIntervals,'refreshOauth2MicrosoftAccessToken':refreshOauth2MicrosoftAccessToken,'startRefreshInterval':startRefreshInterval};