blob: bd53f91a82120c3df05f05689e1e5de877a6bbe3 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import AppDispatcher from '../dispatcher/AppDispatcher';
import AppConstants from '../constants/AppConstants';
import AdhocQueryConstants from '../constants/AdhocQueryConstants';
import assign from 'object-assign';
import { EventEmitter } from 'events';
var CHANGE_EVENT = 'change';
var userDetails = {
isUserLoggedIn: false,
email: '',
secretToken: ''
};
// keeping these methods out of the UserStore class as
// components shouldn't lay their hands on them ;)
function authenticateUser (details) {
userDetails = {
isUserLoggedIn: true,
email: details.email,
database: details.database || "default",
// creating the session string which is passed with every request
secretToken: `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<lensSessionHandle>
<publicId>${details.secretToken.lensSessionHandle.publicId}</publicId>
<secretId>${details.secretToken.lensSessionHandle.secretId}</secretId>
</lensSessionHandle>`
};
// store the details in localStorage if available
if (window.localStorage) {
let adhocCred = assign({}, userDetails, { timestamp: Date.now() });
window.localStorage.setItem('adhocCred', JSON.stringify(adhocCred));
}
}
function unauthenticateUser (details) {
// details contains error code and message
// which are not stored but passsed along
// during emitChange()
userDetails = {
isUserLoggedIn: false,
email: '',
secretToken: ''
};
// remove from localStorage as well
if (window.localStorage) localStorage.setItem('adhocCred', '');
}
// exposing only necessary methods for the components.
var UserStore = assign({}, EventEmitter.prototype, {
isUserLoggedIn () {
if (userDetails && userDetails.isUserLoggedIn) {
return userDetails.isUserLoggedIn;
} else if (window.localStorage && localStorage.getItem('adhocCred')) {
// check in localstorage
let credentials = JSON.parse(localStorage.getItem('adhocCred'));
// check if it's valid or not
if (Date.now() - credentials.timestamp > 1800000) return false;
delete credentials.timestamp;
userDetails = assign({}, credentials);
return userDetails.isUserLoggedIn;
}
return false;
},
getUserDetails () {
return userDetails;
},
currentDatabase() {
return userDetails.database || "default";
},
logout () {
unauthenticateUser();
this.emitChange();
},
emitChange (errorHash) {
this.emit(CHANGE_EVENT, errorHash);
},
addChangeListener (callback) {
this.on(CHANGE_EVENT, callback);
},
removeChangeListener (callback) {
this.removeListener(CHANGE_EVENT, callback);
}
});
// registering callbacks with the dispatcher. So verbose?? I know right!
AppDispatcher.register((action) => {
switch (action.actionType) {
case AppConstants.AUTHENTICATION_SUCCESS:
authenticateUser(action.payload);
UserStore.emitChange();
break;
case AdhocQueryConstants.SELECT_DATABASE:
userDetails.database = action.payload.database;
UserStore.emitChange();
break;
case AppConstants.AUTHENTICATION_FAILED:
unauthenticateUser(action.payload);
// action.payload => { responseCode, responseMessage }
UserStore.emitChange(action.payload);
break;
}
});
export default UserStore;