Built motion from commit 6f14c8ba.|2.6.29
[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 _0x00a1=['type','Dynamics365','push','/.default','Outlook365','data7','replace','{TENANT_ID}','data2','code','id_token','from','stringify','toString','hex','client_id','data1','response_type','join','redirect_uri','data4','form_post','prompt','map','oauth2Claims','oauth2/','set','iss','issuer','aud','audience','nonce','isAfter','unix','resolve','then','data3','CloudProvider','findOne','decryptString','data5','access_token','data6','catch','error','authorization_code','intervals','findAll','lodash','moment','request-promise','util','../../components/encryptor','../../config/logger','api','../../config/schedule/cloud-provider','../../mysqldb','redis','defaults','localhost','https://login.microsoftonline.com/{TENANT_ID}/oauth2/v2.0','openid','profile','email','https://outlook.office365.com/IMAP.AccessAsUser.All','https://outlook.office.com/POP.AccessAsUser.All','https://outlook.office.com/SMTP.Send','offline_access'];(function(_0x16539a,_0x31409a){var _0x200796=function(_0xfe7803){while(--_0xfe7803){_0x16539a['push'](_0x16539a['shift']());}};_0x200796(++_0x31409a);}(_0x00a1,0x184));var _0x100a=function(_0x38d3ad,_0x331801){_0x38d3ad=_0x38d3ad-0x0;var _0x4f3d1e=_0x00a1[_0x38d3ad];return _0x4f3d1e;};'use strict';var _=require(_0x100a('0x0'));var crypto=require('crypto');var jwt=require('jsonwebtoken');var moment=require(_0x100a('0x1'));var Redis=require('ioredis');var rp=require(_0x100a('0x2'));var util=require(_0x100a('0x3'));var encryptor=require(_0x100a('0x4'));var config=require('../../config/environment');var logger=require(_0x100a('0x5'))(_0x100a('0x6'));var schedule=require(_0x100a('0x7'));var db=require(_0x100a('0x8'))['db'];config[_0x100a('0x9')]=_[_0x100a('0xa')](config[_0x100a('0x9')],{'host':_0x100a('0xb'),'port':0x18eb});var redis=new Redis(config[_0x100a('0x9')]);var MICROSOFT_AUTH_URL=_0x100a('0xc');var AZURE_AUTH_SCOPES={'Outlook365':[_0x100a('0xd'),_0x100a('0xe'),_0x100a('0xf'),'offline_access',_0x100a('0x10'),_0x100a('0x11'),_0x100a('0x12')],'Dynamics365':[_0x100a('0xd'),_0x100a('0x13')]};var MICROSOFT_AUTH_ENDPOINT='/authorize';var MICROSOFT_TOKEN_ENDPOINT='/token';var OAUTH_REFRESH_INTERVAL=0xfa;function getAuthorizationScopes(_0x575405){var _0x37bb4f=_['map'](AZURE_AUTH_SCOPES[_0x575405['type']]);if(_0x575405[_0x100a('0x14')]===_0x100a('0x15'))_0x37bb4f[_0x100a('0x16')](_0x575405['data7']+_0x100a('0x17'));return _0x37bb4f['join']('\x20');}function getAccessTokenScope(_0x4df2ed){if(_0x4df2ed[_0x100a('0x14')]===_0x100a('0x18'))return'https://outlook.office365.com/IMAP.AccessAsUser.All';if(_0x4df2ed[_0x100a('0x14')]===_0x100a('0x15'))return _0x4df2ed[_0x100a('0x19')]+'/.default';}function generateMicrosoftAuthorizationUrl(_0x2f49bb,_0x2429bf){var _0x4f5afd=MICROSOFT_AUTH_URL[_0x100a('0x1a')](_0x100a('0x1b'),_0x2f49bb[_0x100a('0x1c')]);var _0x1d5a3f=[_0x100a('0x1d'),_0x100a('0x1e')];var _0x83eab4=Buffer[_0x100a('0x1f')](JSON[_0x100a('0x20')]({'id':_0x2429bf}))[_0x100a('0x21')]('base64');var _0x3a35cf=crypto['randomBytes'](0x10)['toString'](_0x100a('0x22'));var _0x2342be=getAuthorizationScopes(_0x2f49bb);var _0x1211a8=[{'key':_0x100a('0x23'),'value':_0x2f49bb[_0x100a('0x24')]},{'key':_0x100a('0x25'),'value':encodeURIComponent(_0x1d5a3f[_0x100a('0x26')]('\x20'))},{'key':_0x100a('0x27'),'value':_0x2f49bb[_0x100a('0x28')]},{'key':'response_mode','value':_0x100a('0x29')},{'key':'scope','value':encodeURIComponent(_0x2342be)},{'key':'state','value':_0x83eab4},{'key':'nonce','value':_0x3a35cf},{'key':_0x100a('0x2a'),'value':'login'}];var _0xf300cc=_0x4f5afd+MICROSOFT_AUTH_ENDPOINT+'?'+_[_0x100a('0x2b')](_0x1211a8,function(_0x317c8a){return _0x317c8a['key']+'='+_0x317c8a['value'];})[_0x100a('0x26')]('&');_0x2f49bb[_0x100a('0x2c')]={'issuer':_0x4f5afd[_0x100a('0x1a')](_0x100a('0x2d'),''),'audience':_0x2f49bb[_0x100a('0x24')],'state':_0x83eab4,'nonce':_0x3a35cf};redis[_0x100a('0x2e')](_0x83eab4,JSON[_0x100a('0x20')](_0x2f49bb));return _0xf300cc;}function isValidIdToken(_0x4785a0,_0x50bd09){try{var _0x1d1ee1=jwt['decode'](_0x4785a0,{'complete':!![]});var _0x2f607b=_0x1d1ee1['payload'];if(_0x2f607b[_0x100a('0x2f')]!==_0x50bd09[_0x100a('0x30')])return![];if(_0x2f607b[_0x100a('0x31')]!==_0x50bd09[_0x100a('0x32')])return![];if(_0x2f607b[_0x100a('0x33')]!==_0x50bd09['nonce'])return![];if(moment()[_0x100a('0x34')](moment[_0x100a('0x35')](_0x2f607b['exp'])))return![];return!![];}catch(_0xd50f6){throw _0xd50f6;}}function refreshOauth2MicrosoftAccessToken(_0xfcc4d6){return Promise[_0x100a('0x36')]()[_0x100a('0x37')](function(){if(_0xfcc4d6[_0x100a('0x38')])return _0xfcc4d6;return db[_0x100a('0x39')][_0x100a('0x3a')]({'where':{'id':_0xfcc4d6['id']},'raw':!![]});})[_0x100a('0x37')](function(_0x215248){var _0x187ca0={'grant_type':'refresh_token','refresh_token':_0x215248['data6'],'scope':getAccessTokenScope(_0x215248),'redirect_uri':_0x215248[_0x100a('0x28')],'client_id':_0x215248[_0x100a('0x24')],'client_secret':encryptor[_0x100a('0x3b')](_0x215248['data3'])};var _0x5e66f0={'method':'POST','uri':MICROSOFT_AUTH_URL['replace'](_0x100a('0x1b'),_0x215248[_0x100a('0x1c')])+MICROSOFT_TOKEN_ENDPOINT,'form':_0x187ca0,'json':!![]};return rp(_0x5e66f0);})[_0x100a('0x37')](function(_0x39e563){_0xfcc4d6[_0x100a('0x3c')]=_0x39e563[_0x100a('0x3d')];_0xfcc4d6[_0x100a('0x3e')]=_0x39e563['refresh_token'];return db[_0x100a('0x39')]['update']({'data5':_0xfcc4d6[_0x100a('0x3c')],'data6':_0xfcc4d6[_0x100a('0x3e')]},{'where':{'id':_0xfcc4d6['id']}});})['then'](function(){return _0xfcc4d6;})[_0x100a('0x3f')](function(_0x4e4439){logger[_0x100a('0x40')]('Failed\x20to\x20refresh\x20access\x20token\x20for\x20cloud\x20provider\x20#%s,\x20-\x20err:%s',_0xfcc4d6['id'],_0x4e4439);});}function getOauth2MicrosoftAccessToken(_0x574bdd,_0x4b9782){var _0x27e0c4={'grant_type':_0x100a('0x41'),'code':_0x574bdd,'scope':getAccessTokenScope(_0x4b9782),'redirect_uri':_0x4b9782['data4'],'client_id':_0x4b9782['data1'],'client_secret':encryptor[_0x100a('0x3b')](_0x4b9782['data3'])};var _0xef293e={'method':'POST','uri':MICROSOFT_AUTH_URL[_0x100a('0x1a')](_0x100a('0x1b'),_0x4b9782[_0x100a('0x1c')])+MICROSOFT_TOKEN_ENDPOINT,'form':_0x27e0c4,'json':!![]};return rp(_0xef293e);}function startRefreshInterval(_0x4bfd3d){var _0x422f16=schedule[_0x100a('0x42')];if(_0x422f16[_0x4bfd3d['id']])clearInterval(_0x422f16[_0x4bfd3d['id']]);_0x422f16[_0x4bfd3d['id']]=setInterval(refreshOauth2MicrosoftAccessToken['bind'](this,{'id':_0x4bfd3d['id']}),OAUTH_REFRESH_INTERVAL*0x3e8);schedule['intervals']=_0x422f16;}function startAllRefreshIntervals(){return db[_0x100a('0x39')][_0x100a('0x43')]({'where':{'data6':{'$ne':null}},'raw':!![]})[_0x100a('0x37')](function(_0x2e1036){var _0x3c74f8=_0x2e1036[_0x100a('0x2b')](function(_0x8027d0){return refreshOauth2MicrosoftAccessToken(_0x8027d0)[_0x100a('0x37')](function(_0x29b6f2){startRefreshInterval(_0x29b6f2);});});return Promise['all'](_0x3c74f8);})[_0x100a('0x3f')](function(_0x1cd042){var _0x23cc68=_0x1cd042?util['inspect'](_0x1cd042,{'showHidden':![],'depth':null}):'';logger[_0x100a('0x40')]('[CLOUD_PROVIDER]\x20Error\x20while\x20refreshing\x20the\x20tokens\x20after\x20service\x20restart\x20error:%s',_0x23cc68);});}module['exports']={'generateMicrosoftAuthorizationUrl':generateMicrosoftAuthorizationUrl,'getOauth2MicrosoftAccessToken':getOauth2MicrosoftAccessToken,'isValidIdToken':isValidIdToken,'startAllRefreshIntervals':startAllRefreshIntervals,'refreshOauth2MicrosoftAccessToken':refreshOauth2MicrosoftAccessToken,'startRefreshInterval':startRefreshInterval};