Source: MASPluginUser.js

/*
 * Copyright (c) 2016 CA, Inc. All rights reserved.
 * This software may be modified and distributed under the terms
 * of the MIT license. See the LICENSE file for details.
 *
 */
/**
* @class MASPluginUser
* @hideconstructor
* @classdesc The main class representing the User Lifecycle Management like login,logout etc.
* <table>
*	<tr bgcolor="#D3D3D3"><th>MASUser Singleton instance</th></tr>
*	<tr><td><i> MASPlugin.MASUser.currentUser(successHandler(theUser),errorHandler(error));</i>//theUser is the singleton here</td></tr>
* </table>
*/
 var MASPluginUser = function(masPluginUser) {
    /**
     * The username of the user
	 * @memberOf MASPluginUser
     * @member {string} userName
	 * @instance
     */
    this.userName = masPluginUser.userName;

    /**
     * The family name of the user
	 * @memberOf MASPluginUser
     * @member {string} familyName
	 * @instance
     */
     this.familyName = masPluginUser.familyName;

    /**
     * The given name of the user
	 * @memberOf MASPluginUser
     * @member {string} givenName
	 * @instance
     */
     this.givenName = masPluginUser.givenName;

    /**
     * The formatted name of the user
	 * @memberOf MASPluginUser
     * @member {string} formattedName
	 * @instance
     */
     this.formattedName = masPluginUser.formattedName;

    /**
     * List of the email addresses of the user
	 * @memberOf MASPluginUser
     * @member {array} emailAddresses
	 * @instance
     */
     this.emailAddresses = masPluginUser.emailAddresses;

    /**
     * List of the phone numbers of the user
	 * @memberOf MASPluginUser
     * @member {array} phoneNumbers
	 * @instance
     */
     this.phoneNumbers = masPluginUser.phoneNumbers;

    /**
     * List of the addresses of the user
	 * @memberOf MASPluginUser
     * @member {array} addresses
	 * @instance
     */
     this.addresses = masPluginUser.addresses;

     /**
     * Returns the base64 string of the user's photo
	 * @memberOf MASPluginUser
     * @member {string} photos
	 * @instance
     */
     this.photos = masPluginUser.photos;

     /**
     * List of the groups the user is a part of
	 * @memberOf MASPluginUser
     * @member {array} groups
	 * @instance
     */
     this.groups = masPluginUser.groups;

     /**
     * Checks if the user is active
	 * @memberOf MASPluginUser
     * @member {boolean} active
	 * @instance
     */
     this.active = masPluginUser.active;

     /**
     * Boolean indicator that specifies whether the MASPluginUser object is the current user.
	 * @memberOf MASPluginUser
	 * @function isCurrentUser
	 * @instance
     * @param {successCallbackFunction} successHandler user defined success callback that is invoked on success scenario.
     * @param {errorCallbackFunction} errorHandler user defined error callback that is invoked on failure scenario.
     */
     this.isCurrentUser = function(successHandler, errorHandler) {
        return Cordova.exec(successHandler, errorHandler, "MASPluginUser", "isCurrentUser", []);
     };

    /**
     * Boolean indicator that specifies whether the MASPluginUser object is authenticated
	 * @memberOf MASPluginUser
	 * @function isAuthenticated
	 * @instance
     * @param {successCallbackFunction} successHandler user defined success callback that is invoked on success scenario.
     * @param {errorCallbackFunction} errorHandler user defined error callback that is invoked on failure scenario.
     */
     this.isAuthenticated = function(successHandler, errorHandler) {
        return Cordova.exec(successHandler, errorHandler, "MASPluginUser", "isAuthenticated", []);
     };

    /**
     * String accessToken value of the current logged in user.
	 * @memberOf MASPluginUser
	 * @function getAccessToken
	 * @instance
     * @param {successCallbackFunction} successHandler user defined success callback that is invoked on success scenario.
     * @param {errorCallbackFunction} errorHandler user defined error callback that is invoked on failure scenario.
     */
     this.getAccessToken = function(successHandler, errorHandler) {
        return Cordova.exec(successHandler, errorHandler, "MASPluginUser", "getAccessToken", []);
     };

	 /**
     * Lists all the attributes of the Current logged in user. The attributes are in the form of a JSON with key:value pairs.
	 * @memberOf MASPluginUser
	 * @function listAttributes
	 * @instance
     * @param {successCallbackFunction} successHandler user defined success callback that is invoked on success scenario.
     * @param {errorCallbackFunction} errorHandler user defined error callback that is invoked on failure scenario.
     */
     this.listAttributes = function(successHandler, errorHandler) {
        return Cordova.exec(successHandler, errorHandler, "MASPluginUser", "listAttributes", []);
     };

    /**
     * Boolean indicator that specifies whether the currently authenticated MASPluginUser object has the session locked.
	 * @memberOf MASPluginUser
	 * @function isSessionLocked
	 * @instance
     * @param {successCallbackFunction} successHandler user defined success callback that is invoked on success scenario.
     * @param {errorCallbackFunction} errorHandler user defined error callback that is invoked on failure scenario.
     */
     this.isSessionLocked = function(successHandler, errorHandler) {
        return Cordova.exec(successHandler, errorHandler, "MASPluginUser", "isSessionLocked", []);
     };

	/**
     * Locks the current session of the user. The user must log in to use this API.
	 * @memberOf MASPluginUser
	 * @function lockSession
	 * @instance
     * @param {successCallbackFunction} successHandler user defined success callback that is invoked on success scenario.
     * @param {errorCallbackFunction} errorHandler user defined error callback that is invoked on failure scenario.
     */
    this.lockSession = function(successHandler, errorHandler) {
        return Cordova.exec(successHandler, errorHandler, "MASPluginUser", "lockSession", []);
    };

    /**
     * Unlocks the current session of the user. The user must log in to use this API.
	 * @memberOf MASPluginUser
	 * @function unlockSession
	 * @instance
     * @param {successCallbackFunction} successHandler user defined success callback that is invoked on success scenario.
     * @param {errorCallbackFunction} errorHandler user defined error callback that is invoked on failure scenario.
     */
    this.unlockSession = function(successHandler, errorHandler) {
        return Cordova.exec(successHandler, errorHandler, "MASPluginUser", "unlockSession", []);
    };

    /**
     * Unlocks the current session of the user with a customizable message while unlocking. The user must log in to use this API.
	 * @memberOf MASPluginUser
	 * @function unlockSessionWithMessage
	 * @instance
     * @param {successCallbackFunction} successHandler user defined success callback that is invoked on success scenario.
     * @param {errorCallbackFunction} errorHandler user defined error callback that is invoked on failure scenario.
     * @param {string} message A user defined message that is displyed on the lock screen before asking for PIN/Fingerprint.
     */
    this.unlockSessionWithMessage = function(successHandler, errorHandler, message) {
        return Cordova.exec(successHandler, errorHandler, "MASPluginUser", "unlockSessionWithMessage", [message]);
    };

    /**
     * Removes the session lock for the user. Remove session causes all the stored tokens in the device to be wiped-out. The user must log in to use this API.
	 * @memberOf MASPluginUser
	 * @function removeSessionLock
	 * @instance
     * @param {successCallbackFunction} successHandler user defined success callback that is invoked on success scenario.
     * @param {errorCallbackFunction} errorHandler user defined error callback that is invoked on failure scenario.
     */
    this.removeSessionLock = function(successHandler, errorHandler) {
        return Cordova.exec(successHandler, errorHandler, "MASPluginUser", "removeSessionLock", []);
    };

    /**
     * Logs off the user from this app (In case of SSO the user is logged off from other apps too).
	 * @memberOf MASPluginUser
	 * @function logout
	 * @instance
     * @param {successCallbackFunction} successHandler user defined success callback that is invoked on success scenario.
     * @param {errorCallbackFunction} errorHandler user defined error callback that is invoked on failure scenario.
     * @param {boolean} force
     * The behavior for different values of force would be<br>
	 * <table>
	 * <tr bgcolor="#D3D3D3"><th>Value</th><th>Description</th>
	 * <tr><td>true</td><td>The  SDK clears local tokens regardless if the logout call to the server is successful or not.</td>
	 * <tr><td>false</td><td>The SDK clears local tokens only if the logout call to the server is successful.</td></tr>
	 * </table>
     *   If no value is provided, then the default value `false` is used. This is for backward compatibility with old logout signature.
     */
    this.logout = function(successHandler, errorHandler, force) {
        return Cordova.exec(function(result) {
            delete MASPluginUser.sharedCurrUser;
            successHandler(result);
        }, errorHandler, "MASPluginUser", "logoutUser", [force]);
    };
 }

///------------------------------------------------------------------------------------------------------------------
/// @name Current User
///------------------------------------------------------------------------------------------------------------------

ASPluginUser.sharedCurrUser;

 /**
 * The authenticated user for the application, if any. Returns null if no authenticated user found.. This is a singleton object. <b>Developers should call this API first in order to use the instance attributes or functions
 * of the MASUser object.</b>
 * @memberOf MASPluginUser
 * @param {successCallbackFunction} successHandler user defined success callback that is invoked on success scenario.
 * @param {errorCallbackFunction} errorHandler user defined error callback that is invoked on failure scenario.
 * @example
	<caption>For instance, to access the username field of the logged in user (and to see if the session is locked) you must call this API as follows</caption>

ASPluginUser.currentUser(
	function(result) {
		// Get username of the user
		var username = result.userName;
		// Get Session Locked state
		result.isSessionLocked(
			function(success){
				var isSessionLocked = success;
			},function(error){});

	},function(error) {}
);
 */

 MASPluginUser.currentUser = function(successHandler, errorHandler) {
    Cordova.exec(function(masPluginUser) {
        if (typeof(MASPluginUser.sharedCurrUser === 'undefined')){
            MASPluginUser.sharedCurrUser = new MASPluginUser(masPluginUser);
        }else {
            delete MASPluginUser.sharedCurrUser;
            MASPluginUser.sharedCurrUser = new MASPluginUser(masPluginUser);
        }
        successHandler(MASPluginUser.sharedCurrUser);
    }, errorHandler, "MASPluginUser", "currentUser");
};

 /**
 * Authenticates the user asynchronously using the username and password.
 * @memberOf MASPluginUser
 * @param {successCallbackFunction} successHandler user defined success callback that is invoked on success scenario.
 * @param {errorCallbackFunction} errorHandler user defined error callback that is invoked on failure scenario.
 * @param {string} userName username of the user
 * @param {string} password password of the user
 */
 MASPluginUser.loginWithUsernameAndPassword = function(successHandler, errorHandler, username, password) {
    return Cordova.exec(function(result) {
        if (result && typeof(MASPluginUser.sharedCurrUser !== 'undefined')){
            MASPluginUser.currentUser(function(){}, function(){});
         }
        successHandler(result);
    }, errorHandler, "MASPluginUser", "loginWithUsernameAndPassword", [username, password]);
 };

 /**
 * Authenticates a user asynchronously using and id_token
 * @memberOf MASPluginUser
 * @param {successCallbackFunction} successHandler user defined success callback that is invoked on success scenario.
 * @param {errorCallbackFunction} errorHandler user defined error callback that is invoked on failure scenario.
 * @param {string} idToken The id_token for the user. Ensure that the id_token is a valid JWT
 * @param {string} tokenType Token type of id_token. <table><tr bgcolor="#D3D3D3"><th>Example</th></tr><tr><td>{`urn:ietf:params:oauth:grant-type:jwt-bearer`}</td></tr></table>
 */
 MASPluginUser.loginWithIdTokenAndTokenType = function(successHandler, errorHandler, idToken, tokenType) {
    return Cordova.exec(function(result) {
        if (result && typeof(MASPluginUser.sharedCurrUser !== 'undefined')){
            MASPluginUser.currentUser(function(){}, function(){});
         }
        successHandler(result);
    }, errorHandler, "MASPluginUser", "loginWithIdTokenAndTokenType", [idToken, tokenType]);
};

 /**
 * Authenticates a user asynchronously using an authorization code and a state(optional) variable
 * @memberOf MASPluginUser
 * @param {successCallbackFunction} successHandler user defined success callback that is invoked on success scenario.
 * @param {errorCallbackFunction} errorHandler user defined error callback that is invoked on failure scenario.
 * @param {string} authCode The Authorization code as received from an OAuth server.
 * @param {string} state A state variable for supporting the PKCE validation.
 */
 MASPluginUser.loginWithAuthCode = function(successHandler, errorHandler, authCode, state) {
    return Cordova.exec(function(result) {
        if (result && typeof(MASPluginUser.sharedCurrUser !== 'undefined')){
            MASPluginUser.currentUser(function(){}, function(){});
         }
        successHandler(result);
    }, errorHandler, "MASPluginUser", "loginWithAuthCode", [authCode, state]);
 };

 /**
 * Authenticates the user asynchronously using the MAS native AuthCredential construct that contains username and password.
 * @memberOf MASPluginUser
 * @param {successCallbackFunction} successHandler user defined success callback that is invoked on success scenario.
 * @param {errorCallbackFunction} errorHandler user defined error callback that is invoked on failure scenario.
 * @param {string} userName username of the user
 * @param {string} password password of the user
 */
 MASPluginUser.loginWithAuthCredentialsUsernamePassword = function(successHandler, errorHandler, username, password) {
    return Cordova.exec(function(result) {
        if (result && typeof(MASPluginUser.sharedCurrUser !== 'undefined')){
            MASPluginUser.currentUser(function(){}, function(){});
         }
        successHandler(result);
    }, errorHandler, "MASPluginUser", "loginWithAuthCredentialsUsernamePassword", [username, password]);
 };

 /**
 * Authenticates a user asynchronously using the MAS native AuthCredential construct containing a JWT(id_token) and a token type 
 * @memberOf MASPluginUser
 * @param {successCallbackFunction} successHandler user defined success callback that is invoked on success scenario.
 * @param {errorCallbackFunction} errorHandler user defined error callback that is invoked on failure scenario.
 * @param {string} jwt The id_token for the user. Ensure that the id_token is a valid JWT
 * @param {string} tokenType Token type of id_token. <table><tr bgcolor="#D3D3D3"><th>Example</th></tr><tr><td>{`urn:ietf:params:oauth:grant-type:jwt-bearer`}</td></tr></table>
 */
 MASPluginUser.loginWithAuthCredentialsJWT = function(successHandler, errorHandler, jwt, tokenType) {
    return Cordova.exec(function(result) {
        if (result && typeof(MASPluginUser.sharedCurrUser !== 'undefined')){
            MASPluginUser.currentUser(function(){}, function(){});
         }
        successHandler(result);
    }, errorHandler, "MASPluginUser", "loginWithAuthCredentialsJWT", [jwt, tokenType]);
 };
 
 /**
 * Authenticates a user asynchronously using the MAS native AuthCredential construct containing an authorization code and a state(optional) variable
 * @memberOf MASPluginUser
 * @param {successCallbackFunction} successHandler user defined success callback that is invoked on success scenario.
 * @param {errorCallbackFunction} errorHandler user defined error callback that is invoked on failure scenario.
 * @param {string} authorizationCode The Authorization code as received from an OAuth server.
 * @param {string} state A state variable for supporting the PKCE validation.
 */
 MASPluginUser.loginWithAuthCredentialsAuthCode = function(successHandler, errorHandler, authorizationCode,state) {
    return Cordova.exec(function(result) {
        if (result && typeof(MASPluginUser.sharedCurrUser !== 'undefined')){
            MASPluginUser.currentUser(function(){}, function(){});
         }
        successHandler(result);
    }, errorHandler, "MASPluginUser", "loginWithAuthCredentialsAuthCode", [authorizationCode,state]);
 };

 /**
 * Authenticates a user by launching a Browser which in turn loads a URL (templatized). The URL needed is retrieved from the server endpoint mentioned in the configuration file.
 * @memberOf MASPluginUser
 * @param {successCallbackFunction} successHandler user defined success callback that is invoked on success scenario.
 * @param {errorCallbackFunction} errorHandler user defined error callback that is invoked on failure scenario.
 * @static
 */
 MASPluginUser.initializeBrowserBasedAuthentication = function(successHandler, errorHandler) {
    return Cordova.exec(function(result) {
        if (result && typeof(MASPluginUser.sharedCurrUser !== 'undefined')){
            MASPluginUser.currentUser(function(){}, function(){});
         }
        successHandler(result);
    }, errorHandler, "MASPluginUser", "initializeBrowserBasedAuthentication", []);
 }

module.exports = MASPluginUser;