3 * Copyright 2016 RIFT.IO Inc
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
20 * sessions api module. Provides API functions for sessions
21 * @module framework/core/modules/api/sessions
22 * @author Kiran Kashalkar <kiran.kashalkar@riftio.com>
25 var Promise
= require('promise');
26 var constants
= require('../../api_utils/constants');
27 var utils
= require('../../api_utils/utils');
28 var request
= utils
.request
;
29 var rp
= require('request-promise');
31 var _
= require('lodash');
32 var base64
= require('base-64');
33 var APIVersion
= '/v2';
34 var configurationAPI
= require('./configuration');
35 var UserManagement
= require('./userManagementAPI.js');
36 var URL
= require('url');
38 // Used for determining what page a user should first go to.
41 "rw-rbac-platform:super-admin",
42 "rw-rbac-platform:platform-admin",
43 "rw-rbac-platform:platform-oper",
44 "rw-project:project-admin",
45 "rw-project:project-oper",
46 "rw-project-mano:lcm-admin",
47 "rw-project-mano:lcm-oper",
48 "rw-project-mano:catalog-admin",
49 "rw-project-mano:catalog-oper",
50 "rw-project-mano:account-admin",
51 "rw-project-mano:account-oper"
54 "rw-rbac-platform:super-admin": "user_management",
55 "rw-rbac-platform:platform-admin": "user_management",
56 "rw-rbac-platform:platform-oper": "user_management",
57 "rw-project:project-admin": "project_management",
58 "rw-project:project-oper": "project_management",
59 "rw-project-mano:catalog-admin": "composer",
60 "rw-project-mano:catalog-oper": "composer",
61 "rw-project-mano:lcm-admin": "launchpad",
62 "rw-project-mano:lcm-oper": "launchpad",
63 "rw-project-mano:account-admin": "accounts",
64 "rw-project-mano:account-oper": "accounts"
68 function logAndReject(mesg
, reject
, errCode
) {
73 res
.statusCode
= errCode
|| constants
.HTTP_RESPONSE_CODES
.ERROR
.BAD_REQUEST
;
78 function logAndRedirectToLogin(mesg
, res
, req
, invalid
) {
81 res
.redirect(utils
.buildRedirectURL(req
, configurationAPI
.globalConfiguration
, 'login', '&referer=' + encodeURIComponent(req
.headers
.referer
)));
86 function logAndRedirectToEndSession(mesg
, res
, authorization
, url
) {
89 'Authorization': authorization
94 var sessionPromiseResolve
= null;
95 sessionsAPI
.sessionPromise
= new Promise(function(resolve
, reject
) {
96 sessionPromiseResolve
= resolve
;
99 sessionsAPI
.create = function (req
, res
) {
100 if (!req
.session
.passport
){
101 logAndRedirectToLogin("lost session", res
, req
);
102 return new Promise(function (resolve
, reject
){reject("lost session")});
104 var api_server
= req
.query
['api_server'] || (req
.protocol
+ '://' + configurationAPI
.globalConfiguration
.get().api_server
);
105 var uri
= utils
.confdPort(api_server
);
106 var username
= req
.session
.passport
.user
['username'];
107 var authorization_header_string
= 'Bearer ' + req
.session
.passport
.user
.user
.access_token
;
108 return new Promise(function (resolve
, reject
) {
109 req
.session
.authorization
= authorization_header_string
;
110 req
.session
.api_server
= api_server
;
111 req
.session
.api_protocal
= req
.protocol
;
112 req
.session
.loggedIn
= true;
113 req
.session
.userdata
= {
116 UserManagement
.getUserInfo(req
, req
.session
.passport
.user
.username
).then(function (results
) {
117 var project_list_for_user
= null;
118 if (!req
.session
.projectId
&& results
.data
.project
) {
119 project_list_for_user
= Object
.keys(results
.data
.project
);
120 if (project_list_for_user
.length
> 0) {
121 req
.session
.projectId
= project_list_for_user
.sort() && project_list_for_user
[0];
124 sessionsAPI
.setTopApplication(req
);
125 req
.session
.isLCM
= results
.data
.isLCM
;
127 req
.session
['ui-state'] = results
.data
['ui-state'];
128 var lastActiveProject
= req
.session
['ui-state'] && req
.session
['ui-state']['last-active-project'];
129 if (lastActiveProject
) {
130 if (results
.data
.project
.hasOwnProperty(lastActiveProject
)) {
131 req
.session
.projectId
= lastActiveProject
;
136 var successMsg
= 'User => ' + username
+ ' successfully logged in.';
137 successMsg
+= req
.session
.projectId
? 'Project => ' + req
.session
.projectId
+ ' set as default.' : '';
139 console
.log(successMsg
);
141 req
.session
.save(function (err
) {
143 console
.log('Error saving session to store', err
);
145 // no response data, just redirect now that session data is set
146 if (req
.session
['ui-state'] && req
.session
['ui-state']['last-active-uri']) {
147 var url
= URL
.parse(req
.session
['ui-state']['last-active-uri']);
148 var host
= req
.headers
.host
;
151 var protocol
= url
.protocol
;
152 var newUrl
= protocol
+ '//' + host
+ path
+ (hash
?hash
:'');
153 console
.log('Redirecting to: ' + newUrl
)
156 if(req
.session
.topApplication
) {
157 res
.redirect(utils
.buildRedirectURL(req
, configurationAPI
.globalConfiguration
, req
.session
.topApplication
));
159 res
.redirect(utils
.buildRedirectURL(req
, configurationAPI
.globalConfiguration
, 'user_management', '#/user-profile'));
164 sessionPromiseResolve(req
.session
);
166 }).catch(function (error
) {
167 // Something went wrong - Redirect to /login
168 var errorMsg
= 'Error logging in or getting list of projects. Error: ' + error
;
169 console
.log(errorMsg
);
170 logAndRedirectToLogin(errorMsg
, res
, req
);
175 sessionsAPI
.addProjectToSession = function (req
, res
) {
176 return new Promise(function (resolve
, reject
) {
177 if (req
.session
&& req
.session
.loggedIn
== true) {
178 Promise
.all([UserManagement
.getProfile(req
), UserManagement
.updateActiveProject(req
)]).then(function () {
179 req
.session
.projectId
= req
.params
.projectId
;
180 req
.session
.topApplication
= null;
181 sessionsAPI
.setTopApplication(req
, req
.query
.app
);
182 req
.session
.save(function (err
) {
184 console
.log('Error saving session to store', err
);
185 var errorMsg
= 'Session does not exist or not logged in';
186 logAndReject(errorMsg
, reject
, constants
.HTTP_RESPONSE_CODES
.ERROR
.NOT_FOUND
);
188 var successMsg
= 'Added project ' + req
.session
.projectId
+ ' to session ' + req
.sessionID
;
189 console
.log(successMsg
);
191 statusCode
: constants
.HTTP_RESPONSE_CODES
.SUCCESS
.OK
,
192 data
: JSON
.stringify({
196 return resolve(response
);
198 // res.redirect('/');
207 sessionsAPI
.delete = function (req
, res
) {
208 var idpServerAddress
= configurationAPI
.globalConfiguration
.get().idp_server_address
;
209 var idpServerProtocol
= configurationAPI
.globalConfiguration
.get().idp_server_protocol
;
210 var idpServerPortNumber
= configurationAPI
.globalConfiguration
.get().idp_server_port_number
;
211 var idpEndSessionPath
= constants
.END_SESSION_PATH
;
212 var url
= idpServerProtocol
+ '://' +
213 idpServerAddress
+ ':' +
214 idpServerPortNumber
+ '/' +
216 var authorization
= req
.session
.authorization
;
217 return new Promise(function (resolve
, reject
) {
219 UserManagement
.updateActiveUri(req
),
220 new Promise(function (success
, failure
) {
221 req
.session
.destroy(function (err
) {
223 var errorMsg
= 'Error deleting session. Error: ' + err
;
224 console
.log(errorMsg
);
231 var successMsg
= 'Success deleting session';
232 console
.log(successMsg
);
240 ]).then(function (result
) {
241 // assume the session was deleted!
242 var message
= 'Session was deleted. Redirecting to end_session';
244 statusCode
: constants
.HTTP_RESPONSE_CODES
.SUCCESS
.OK
,
251 }).catch(function (error
) {
252 var message
= "An error occured while deleting session";
254 statusCode
: constants
.HTTP_RESPONSE_CODES
.SUCCESS
.OK
,
264 sessionsAPI
.setTopApplication = function (req
, suggestedPlugin
) {
265 var selectedProject
= req
.session
.projectId
;
266 var userProject
= selectedProject
? req
.session
.projectMap
[selectedProject
] : null;
268 if (suggestedPlugin
) {
269 if (req
.session
.platformMap
['rw-rbac-platform:super-admin']) {
270 topApplication
= suggestedPlugin
;
272 var roles
= _
.reduce(Object
.keys(Application
.key
), function (accumulator
, role
) {
273 if (Application
.key
[role
] === suggestedPlugin
) {
274 accumulator
.push(role
);
278 if (_
.some(roles
, function (role
){return userProject
.role
[role
]})) {
279 req
.session
.topApplication
= suggestedPlugin
;
284 _
.some(Application
.order
, function (role
) {
285 if (userProject
.role
[role
] || req
.session
.platformMap
.role
[role
]) {
286 req
.session
.topApplication
= Application
.key
[role
];
294 module
.exports
= sessionsAPI
;