diff --git a/index.js b/index.js index a366ecb..00913ac 100644 --- a/index.js +++ b/index.js @@ -11,6 +11,7 @@ const updateUser = require("./users/update-user"); const loginUser = require("./users/login-user"); const logoutUser = require("./users/logout-user"); const userAuth = require("./users/user-auth"); +const reAuthUser = require("./users/reauth-user"); /** ****************************************************************************** */ /** ****************************************************************************** */ @@ -29,6 +30,7 @@ const user = { loginUser: loginUser, logoutUser: logoutUser, userAuth: userAuth, + reAuthUser: reAuthUser, updateUser: updateUser, }; diff --git a/package.json b/package.json index 019bb8c..0ac3bcf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "datasquirel", - "version": "1.1.25", + "version": "1.1.26", "description": "Cloud-based SQL data management tool", "main": "index.js", "scripts": { diff --git a/users/reauth-user.js b/users/reauth-user.js new file mode 100644 index 0000000..54b8bfc --- /dev/null +++ b/users/reauth-user.js @@ -0,0 +1,157 @@ +/** + * ============================================================================== + * Imports + * ============================================================================== + */ +const https = require("https"); +const encrypt = require("../functions/encrypt"); + +const userAuth = require("./user-auth"); + +/** ****************************************************************************** */ +/** ****************************************************************************** */ +/** ****************************************************************************** */ +/** ****************************************************************************** */ +/** ****************************************************************************** */ +/** ****************************************************************************** */ + +/** + * @typedef {object} FunctionReturn + * @property {boolean} success - Did the function run successfully? + * @property {{ + * id: number, + * first_name: string, + * last_name: string, + * username: string, + * email: string, + * phone: string, + * social_id: [string], + * image: string, + * image_thumbnail: string, + * verification_status: [number=0], + * social_login: [number], + * social_platform: [string], + * csrf_k: string, + * more_data: [string], + * logged_in_status: boolean, + * date: string, + * }} payload - Payload + * @property {string} [msg] - Response Message + * @property {number} [userId] - user ID + */ + +/** + * ============================================================================== + * Main Function + * ============================================================================== + * @async + * + * @param {object} params - Single Param object containing params + * @param {String} params.key - API Key + * @param {String} params.database - Target Database + * @param {Object} params.response - Http response object + * @param {Object} params.request - Http request object + * @param {string} params.level - Authentication level + * @param {String} params.encryptionKey - Encryption Key + * @param {String} params.encryptionSalt - Encryption Salt + * + * @returns { Promise} + */ +module.exports = async function ({ key, database, response, request, level, encryptionKey, encryptionSalt }) { + /** + * Check Encryption Keys + * + * @description Check Encryption Keys + */ + const existingUser = userAuth({ + database, + encryptionKey, + encryptionSalt, + level, + request, + }); + + /** + * Make https request + * + * @description make a request to datasquirel.com + */ + const httpResponse = await new Promise((resolve, reject) => { + const reqPayload = JSON.stringify({ + existingUser, + database, + }); + + const httpsRequest = https.request( + { + method: "POST", + headers: { + "Content-Type": "application/json", + "Content-Length": Buffer.from(reqPayload).length, + Authorization: key, + }, + port: 443, + hostname: "datasquirel.com", + path: `/api/user/reauth-user`, + }, + + /** + * Callback Function + * + * @description https request callback + */ + (response) => { + var str = ""; + + response.on("data", function (chunk) { + str += chunk; + }); + + response.on("end", function () { + resolve(JSON.parse(str)); + }); + + response.on("error", (err) => { + reject(err); + }); + } + ); + + httpsRequest.write(reqPayload); + httpsRequest.end(); + }); + + /** ********************************************** */ + /** ********************************************** */ + /** ********************************************** */ + + /** + * Make https request + * + * @description make a request to datasquirel.com + */ + if (httpResponse?.success) { + let encryptedPayload = encrypt({ + data: JSON.stringify(httpResponse.payload), + encryptionKey, + encryptionSalt, + }); + + const { userId } = httpResponse; + + const authKeyName = `datasquirel_${userId}_${database}_auth_key`; + const csrfName = `datasquirel_${userId}_${database}_csrf`; + + response.setHeader("Set-Cookie", [`${authKeyName}=${encryptedPayload};samesite=strict;path=/;HttpOnly=true;Secure=true`, `${csrfName}=${httpResponse.payload.csrf_k};samesite=strict;path=/;HttpOnly=true`, `dsqluid=${userId};samesite=strict;path=/;HttpOnly=true`]); + } + + /** ********************************************** */ + /** ********************************************** */ + /** ********************************************** */ + + return httpResponse; +}; + +/** ********************************************** */ +/** ********************************************** */ +/** ********************************************** */ diff --git a/users/update-user.js b/users/update-user.js index eceb8a6..6830900 100644 --- a/users/update-user.js +++ b/users/update-user.js @@ -27,8 +27,7 @@ const https = require("https"); * @param {object} params - API Key * @param {String} params.key - API Key * @param {String} params.database - Target Database - * @param {String | Object} [params.payload={ id: 4, first_name: "Benjamin" }] - User Object. - * @param {number} params.payload.id - User id => Required + * @param {{ id: number }} params.payload - User Object * * @returns { Promise} */