From 8938a1935832d0021335fda02b53e938e5010ede Mon Sep 17 00:00:00 2001 From: prafullnavkar-nxg Date: Mon, 23 Oct 2023 12:23:15 +0530 Subject: [PATCH] remove unncessary code and confidential data --- apps/OpenSign/README.md | 6 - apps/OpenSign/package-lock.json | 16 + apps/OpenSign/package.json | 2 + .../src/components/AppendFormInForm.js | 8 +- apps/OpenSign/src/components/ErrorBoundary.js | 1 - apps/OpenSign/src/components/Header.js | 8 +- apps/OpenSign/src/routes/Form.js | 8 +- apps/OpenSignServer/Dockerfile | 37 +- .../cloud/customRoute/uploadFile.js | 2 +- .../cloud/parsefunction/CheckInstalledApp.js | 79 ---- .../cloud/parsefunction/InstallApp.js | 418 ------------------ .../cloud/parsefunction/SendMailOTPv1.js | 8 +- .../cloud/parsefunction/pdf/PDF.js | 7 +- apps/OpenSignServer/package.json | 2 +- apps/OpenSignServer/pdfFile/Amit.p12 | Bin 6328 -> 0 bytes apps/OpenSignServer/test.pdf | Bin 174960 -> 173892 bytes 16 files changed, 54 insertions(+), 548 deletions(-) delete mode 100644 apps/OpenSignServer/cloud/parsefunction/CheckInstalledApp.js delete mode 100644 apps/OpenSignServer/cloud/parsefunction/InstallApp.js delete mode 100644 apps/OpenSignServer/pdfFile/Amit.p12 diff --git a/apps/OpenSign/README.md b/apps/OpenSign/README.md index 5481c71e0..29f9aa5e9 100644 --- a/apps/OpenSign/README.md +++ b/apps/OpenSign/README.md @@ -23,9 +23,3 @@ The build is minified and the filenames include the hashes.\ Your app is ready to be deployed! See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. - -# Remote Deployment - -## DigitalOcean - -[![Deploy to DO](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/prafullnavkar-nxg/open_sign/tree/master&refcode=30db1c901ab0) diff --git a/apps/OpenSign/package-lock.json b/apps/OpenSign/package-lock.json index 817014b2e..cb8b60236 100644 --- a/apps/OpenSign/package-lock.json +++ b/apps/OpenSign/package-lock.json @@ -49,6 +49,7 @@ "eslint": "^8.51.0", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-react": "^7.33.2", + "husky": "^8.0.3", "lint-staged": "^15.0.1", "postcss": "^8.4.31", "prettier": "^2.8.0", @@ -10197,6 +10198,21 @@ "node": ">=10.17.0" } }, + "node_modules/husky": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "dev": true, + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", diff --git a/apps/OpenSign/package.json b/apps/OpenSign/package.json index f10cce69f..c472ad8d6 100644 --- a/apps/OpenSign/package.json +++ b/apps/OpenSign/package.json @@ -42,6 +42,7 @@ "build": "CI=false && mf-cra build", "test": "react-scripts test", "eject": "react-scripts eject", + "prepare": "husky install | chmod ug+x .husky/*", "release": "standard-version", "commit": "cz" }, @@ -75,6 +76,7 @@ "eslint": "^8.51.0", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-react": "^7.33.2", + "husky": "^8.0.3", "lint-staged": "^15.0.1", "postcss": "^8.4.31", "prettier": "^2.8.0", diff --git a/apps/OpenSign/src/components/AppendFormInForm.js b/apps/OpenSign/src/components/AppendFormInForm.js index 54b0e0efd..f9cd43d08 100644 --- a/apps/OpenSign/src/components/AppendFormInForm.js +++ b/apps/OpenSign/src/components/AppendFormInForm.js @@ -167,8 +167,8 @@ class AppendFormInForm extends Component { let PageLanding = localStorage.getItem("PageLanding"); let domain = localStorage.getItem("domain"); let _appName = localStorage.getItem("_appName"); - let baseUrr = localStorage.getItem("BaseUrl12"); - let appidd = localStorage.getItem("AppID12"); + let baseUrl = localStorage.getItem("BaseUrl12"); + let appid = localStorage.getItem("AppID12"); localStorage.clear(); @@ -179,8 +179,8 @@ class AppendFormInForm extends Component { localStorage.setItem("PageLanding", PageLanding); localStorage.setItem("domain", domain); localStorage.setItem("userSettings", appdata); - localStorage.setItem("BaseUrl12", baseUrr); - localStorage.setItem("AppID12", appidd); + localStorage.setItem("BaseUrl12", baseUrl); + localStorage.setItem("AppID12", appid); return ; } diff --git a/apps/OpenSign/src/components/ErrorBoundary.js b/apps/OpenSign/src/components/ErrorBoundary.js index d9d6a4bda..9ba83c067 100644 --- a/apps/OpenSign/src/components/ErrorBoundary.js +++ b/apps/OpenSign/src/components/ErrorBoundary.js @@ -29,7 +29,6 @@ export class ErrorBoundary extends Component { flexFlow: "column" }} > - {/* */}

{ let PageLanding = localStorage.getItem("PageLanding"); let domain = localStorage.getItem("domain"); let _appName = localStorage.getItem("_appName"); - let baseUrr = localStorage.getItem("BaseUrl12"); - let appidd = localStorage.getItem("AppID12"); + let baseUrl = localStorage.getItem("BaseUrl12"); + let appid = localStorage.getItem("AppID12"); localStorage.clear(); @@ -43,8 +43,8 @@ const Header = ({ showSidebar }) => { localStorage.setItem("PageLanding", PageLanding); localStorage.setItem("domain", domain); localStorage.setItem("userSettings", appdata); - localStorage.setItem("BaseUrl12", baseUrr); - localStorage.setItem("AppID12", appidd); + localStorage.setItem("BaseUrl12", baseUrl); + localStorage.setItem("AppID12", appid); navigation("/"); }; diff --git a/apps/OpenSign/src/routes/Form.js b/apps/OpenSign/src/routes/Form.js index 9a56739b6..f0f593dd3 100644 --- a/apps/OpenSign/src/routes/Form.js +++ b/apps/OpenSign/src/routes/Form.js @@ -185,8 +185,8 @@ class FormBuilder extends Component { let PageLanding = localStorage.getItem("PageLanding"); let domain = localStorage.getItem("domain"); let _appName = localStorage.getItem("_appName"); - let baseUrr = localStorage.getItem("BaseUrl12"); - let appidd = localStorage.getItem("AppID12"); + let baseUrl = localStorage.getItem("BaseUrl12"); + let appid = localStorage.getItem("AppID12"); localStorage.clear(); localStorage.setItem("appLogo", applogo); localStorage.setItem("appName", appName); @@ -195,8 +195,8 @@ class FormBuilder extends Component { localStorage.setItem("PageLanding", PageLanding); localStorage.setItem("domain", domain); localStorage.setItem("userSettings", appdata); - localStorage.setItem("BaseUrl12", baseUrr); - localStorage.setItem("AppID12", appidd); + localStorage.setItem("BaseUrl12", baseUrl); + localStorage.setItem("AppID12", appid); this.props.navigate(`/`); } console.log(e.message); diff --git a/apps/OpenSignServer/Dockerfile b/apps/OpenSignServer/Dockerfile index 4f949aa1d..b5b2a885d 100644 --- a/apps/OpenSignServer/Dockerfile +++ b/apps/OpenSignServer/Dockerfile @@ -1,27 +1,26 @@ -# Use an official Node runtime as the base image -FROM node:16 +FROM node:latest -# Set the working directory inside the container -WORKDIR /usr/src/app +RUN mkdir parse -# Copy package.json and package-lock.json first to leverage Docker cache -COPY apps/OpenSignServer/package*.json ./ - -# Install application dependencies +ADD . /parse +WORKDIR /parse RUN npm install -# If you have native dependencies, you'll need extra tools. Uncomment the following line if needed. -# RUN apk add --no-cache make gcc g++ python3 +ENV APP_ID setYourAppId +ENV MASTER_KEY setYourMasterKey +ENV DATABASE_URI setMongoDBURI -# Copy the current directory contents into the container -COPY apps/OpenSignServer/ . +# Optional (default : 'parse/cloud/main.js') +# ENV CLOUD_CODE_MAIN cloudCodePath -# Make port 8080 available to the world outside this container -EXPOSE 8080 +# Optional (default : '/parse') +# ENV PARSE_MOUNT mountPath -# Define environment variables if needed -# ENV NODE_ENV production -# ENV DATABASE_URL mongodb://db:27017 +EXPOSE 1337 -# Run the application -CMD ["npm", "start"] +# Uncomment if you want to access cloud code outside of your container +# A main.js file must be present, if not Parse will not start + +# VOLUME /parse/cloud + +CMD [ "npm", "start" ] diff --git a/apps/OpenSignServer/cloud/customRoute/uploadFile.js b/apps/OpenSignServer/cloud/customRoute/uploadFile.js index 5c0820a8d..34abc14d0 100644 --- a/apps/OpenSignServer/cloud/customRoute/uploadFile.js +++ b/apps/OpenSignServer/cloud/customRoute/uploadFile.js @@ -64,7 +64,7 @@ async function uploadFile(req, res) { s3, bucket: DO_SPACE, metadata: function (req, file, cb) { - cb(null, { fieldName: 'TESTING_METADATA' }); + cb(null, { fieldName: 'OPENSIGN_METADATA' }); }, key: function (req, file, cb) { //console.log(file); diff --git a/apps/OpenSignServer/cloud/parsefunction/CheckInstalledApp.js b/apps/OpenSignServer/cloud/parsefunction/CheckInstalledApp.js deleted file mode 100644 index 87cee9395..000000000 --- a/apps/OpenSignServer/cloud/parsefunction/CheckInstalledApp.js +++ /dev/null @@ -1,79 +0,0 @@ -/* --Description :cloud function called to get installed applist from client db */ - -//-- Export Modules -import mongoose from 'mongoose'; - -import { w_appinfoSchema } from '../models/appInfoclass.js'; -import { orgAppsSchema } from '../models/orgApps.js'; -import axios from 'axios'; - -export default async function CheckInstalledApp(request) { - const organization = request.params.orgName; - const options = { useNewUrlParser: true }; - const baseDb = process.env.MONGODB_URI; - const serverUrl = process.env.SERVER_URL; - const appId = process.env.APP_ID; - // const sess = request.params._SessionToken; - //--function to get the userid from session token - try { - const sess = request.headers['sessiontoken']; - const user = await axios.get(serverUrl + '/users/me', { - headers: { - 'X-Parse-Application-Id': appId, - 'X-Parse-Session-Token': sess, - }, - }); - - if (user.data && user.data.objectId) { - // get client db from baseDb - try { - const getDbUrl = async orgName => { - try { - const db = await mongoose.createConnection(baseDb, options).asPromise(); - const orgAppsModel = db.model('orgApps', orgAppsSchema); - const res = await orgAppsModel.findOne({ appName: orgName }); - console.log('dburl ', res.parseServer.databaseURI); - return res.parseServer.databaseURI; - } catch (err) { - console.log('result not found in orgApps ', err); - return 'result not found!'; - } - }; - const dbUrl = await getDbUrl(organization); - // targetConString = client db - // var targetConString = `mongodb+srv://doadmin:k0Nn4Q8L96vq715s@qik-server-prod-db-5054d37b.mongo.ondigitalocean.com/${dbName}?authSource=admin&replicaSet=qik-server-prod-db&tls=true`; - const targetConString = dbUrl; - - async function getAppInfo() { - console.log('getAppInfo '); - try { - const db = await mongoose.createConnection(targetConString, options).asPromise(); - const w_appinfomodel = db.model('w_appinfo', w_appinfoSchema); - const res = await w_appinfomodel.find({}); - // console.log('getAppInfo ', res); - - if (res.length > 0) { - const ress = JSON.stringify(res); - const result = { count: res.length, appList: ress }; - return result; - } else { - const result = { count: res.length, appList: [] }; - return result; - } - // console.log(appId); - } catch (err) { - console.log('err in getAppData', err); - } - } - const appInfo = await getAppInfo(); - return appInfo; - } catch (err) { - console.log('err ', err); - const res = { error: 'Internal Server err ' }; - return res; - } - } - } catch (err) { - return Promise.reject('Invalid session token!'); - } -} diff --git a/apps/OpenSignServer/cloud/parsefunction/InstallApp.js b/apps/OpenSignServer/cloud/parsefunction/InstallApp.js deleted file mode 100644 index a691e07c1..000000000 --- a/apps/OpenSignServer/cloud/parsefunction/InstallApp.js +++ /dev/null @@ -1,418 +0,0 @@ -/* --Description :cloud function called to copy app from default db */ - -//-- Export Modules -import mongoose from 'mongoose'; -import { _SCHEMASchema } from '../models/schemaClass.js'; -import { _RoleSchema } from '../models/RoleClass.js'; -import { _RolejoinSchema } from '../models/RoleJoin.js'; -import { _UserjoinSchema } from '../models/UserJoin.js'; -import { w_appinfoSchema } from '../models/appInfoclass.js'; -import { w_formV3Schema } from '../models/w_formv3class.js'; -import { w_menuSchema } from '../models/w_menuclass.js'; -import { w_reportSchema } from '../models/w_reportclass.js'; -import { DashboardSchema } from '../models/w_dashboardclass.js'; -import { DBFunctionSchema } from '../models/DBFunctionClass.js'; -import { orgAppsSchema } from '../models/orgApps.js'; -import axios from 'axios'; - -export async function InstallApp(request) { - try { - // console.log("sess ", request) - //--function to get the userid from session token - const sess = request.headers['sessiontoken']; - const serverUrl = process.env.SERVER_URL; - const appId = process.env.APP_ID; - const user = await axios.get(serverUrl + '/users/me', { - headers: { - 'X-Parse-Application-Id': appId, - 'X-Parse-Session-Token': sess, - }, - }); - - if (user.data && user.data.objectId) { - var originalappname = request.params.appname; - var appname = originalappname + '_'; - //externalInstallation should be true for migrate from server2 to server3 data - //externalInstallation should be false for migrate from default db to client db data - const externalInstallation = request.params.externalSrc; - // var chkbaseurl = request.params.baseurl; - // console.log('baseurl ' + chkbaseurl); - var organization = request.params.organization; - // var dbName = request.params.dbName; - var UserId = request.params.UserId; - //--check if value of connection string is blank or variable - if (organization == '') { - return Promise.reject('Error:please provide organization'); - } - if (originalappname == '') { - return Promise.reject('Error:please provide appname'); - } - const options = { useNewUrlParser: true }; - - const baseDb = process.env.MONGODB_URI; - // get client db from baseDb - const getDbUrl = async orgName => { - try { - const db = await mongoose.createConnection(baseDb, options).asPromise(); - const orgAppsModel = db.model('orgApps', orgAppsSchema); - const res = await orgAppsModel.findOne({ appName: orgName }); - console.log('dburl ', res.parseServer.databaseURI); - return res.parseServer.databaseURI; - } catch (err) { - console.log('result not found in getroleanduser ', err); - return 'result not found!'; - } - }; - const dbUrl = await getDbUrl(organization); - // targetConString = client db - // var targetConString = `mongodb+srv://doadmin:k0Nn4Q8L96vq715s@qik-server-prod-db-5054d37b.mongo.ondigitalocean.com/${dbName}?authSource=admin&replicaSet=qik-server-prod-db&tls=true`; - const targetConString = dbUrl; - // sourceConString = default db - var sourceConString; - if (externalInstallation) { - sourceConString = - 'mongodb+srv://doadmin:k0Nn4Q8L96vq715s@qik-server-prod-db-5054d37b.mongo.ondigitalocean.com/heroku_vcjcwn64?authSource=admin&replicaSet=qik-server-prod-db&tls=true'; - } else { - sourceConString = - 'mongodb+srv://doadmin:k0Nn4Q8L96vq715s@qik-server-prod-db-5054d37b.mongo.ondigitalocean.com/defaultDJIC?authSource=admin&replicaSet=qik-server-prod-db&tls=true'; - } - - if (targetConString == sourceConString) { - return Promise.reject("Error:Soure and target database server can't be same"); - } - - const randomId = function (length) { - const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - let result = ''; - const charactersLength = characters.length; - for (let i = 0; i < length; i++) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); - } - - return result; - }; - const appRoleId = randomId(10); - - try { - let Trg_SCHEMASmodel; - let Src_SCHEMASmodel; - let appId; - let defaultRoles; - let Trg__RoleModel; - let msg; - let status; - let trg_w_appinfomodel; - try { - const db = await mongoose.createConnection(targetConString, options).asPromise(); - trg_w_appinfomodel = db.model('w_appinfo', w_appinfoSchema); - const res = await trg_w_appinfomodel.find({ - appname: originalappname, - }); - if (res.length > 0) { - msg = 'App is already exists'; - status = 137; - } else { - await getAppInfo(); - } - } catch (err) { - console.log('err is checking app exists', err); - return Promise.reject('err is checking app exists'); - } - // try { - // const db = await mongoose.createConnection(targetConString, options).asPromise(); - // Trg_SCHEMASmodel = db.model('_SCHEMA', _SCHEMASchema); - // const res = await Trg_SCHEMASmodel.find({ _id: { $regex: '.*' + appname + '.*' } }); - // if (res.length > 0) { - // msg = 'App is already exists'; - // status = 137; - // } else { - // await getAppInfo(); - // } - // } catch (err) { - // console.log('err is checking app exists', err); - // return Promise.reject('err is checking app exists'); - // } - - async function getAppInfo() { - console.log('getAppInfo '); - try { - const db = await mongoose.createConnection(sourceConString, options).asPromise(); - const w_appinfomodel = db.model('w_appinfo', w_appinfoSchema); - const res = await w_appinfomodel.find({ - appname: originalappname, - }); - // console.log('getAppInfo ', res); - appId = res[0]['_id']; - const parseRes = JSON.parse(JSON.stringify(res)); - if (parseRes[0].settings && parseRes[0].settings.length > 0) { - defaultRoles = parseRes[0].settings.map(x => { - return { - _id: randomId(10), - name: x.role, - _wperm: ['*'], - _rperm: ['*'], - _acl: { '*': { r: true, w: true } }, - _created_at: new Date(), - _updated_at: new Date(), - }; - }); - // console.log('defaultRoles ', defaultRoles); - } - - // console.log(appId); - await saveAppInfo(res); - } catch (err) { - console.log('err in getAppData', err); - } - } - - async function saveAppInfo(res) { - console.log('saveAppInfo'); - try { - const db = await mongoose.createConnection(targetConString, options).asPromise(); - // trg_w_appinfomodel = db.model('w_appinfo', w_appinfoSchema); - const appInfoRes = await trg_w_appinfomodel.collection.insertMany(res); - // console.log('saveAppInfo ', appInfoRes); - - console.log('app info inserted'); - await getAppFunctions(); - } catch (err) { - console.log('err in saveAppData', err); - } - } - - async function getAppFunctions() { - console.log('getAppFunctions'); - try { - var appIdpointer = 'w_appinfo$' + appId; - const db = await mongoose.createConnection(sourceConString, options).asPromise(); - const DBFunctionModel = db.model('w_DBFunctions', DBFunctionSchema); - const dbFnRes = await DBFunctionModel.find({ _p_appId: appIdpointer }); - await saveAppFunctions(dbFnRes); - } catch (err) { - console.log('err is get app function', err); - return Promise.reject('err is get app functions'); - } - } - async function saveAppFunctions(res) { - console.log('saveAppFunctions'); - if (res.length > 0) { - try { - const db = await mongoose.createConnection(targetConString, options).asPromise(); - const DBFunctionModel = db.model('w_DBFunctions', DBFunctionSchema); - const src_res = await DBFunctionModel.collection.insertMany(res); - console.log('app functions inserted'); - } catch (err) { - console.log('err in save app functions', err); - } - } - await getAppDashboard(); - } - - async function getAppDashboard() { - try { - var appIdpointer = 'w_appinfo$' + appId; - const db = await mongoose.createConnection(sourceConString, options).asPromise(); - const w_Dashboardmodel = db.model('w_dashboard', DashboardSchema); - const dashboardRes = await w_Dashboardmodel.find({ _p_appId: appIdpointer }); - await saveAppDashboard(dashboardRes); - } catch (err) { - console.log('err is get app dashboards', err); - } - } - async function saveAppDashboard(res) { - if (res.length > 0) { - try { - const db = await mongoose.createConnection(targetConString, options).asPromise(); - const w_Dashboardmodel = db.model('w_dashboard', DashboardSchema); - const src_res = await w_Dashboardmodel.collection.insertMany(res); - console.log('app dashboard inserted'); - } catch (err) { - console.log('err in save app dashboards', err); - } - } - await getAppForms(); - } - - async function getAppForms() { - try { - var appIdpointer = 'w_appinfo$' + appId; - const db = await mongoose.createConnection(sourceConString, options).asPromise(); - const w_formV3model = db.model('w_formV3', w_formV3Schema); - const formsRes = await w_formV3model.find({ _p_appId: appIdpointer }); - await saveAppForms(formsRes); - } catch (err) { - console.log('err is get app forms', err); - } - } - async function saveAppForms(res) { - if (res.length > 0) { - try { - const db = await mongoose.createConnection(targetConString, options).asPromise(); - const w_formV3model = db.model('w_formV3', w_formV3Schema); - const src_res = await w_formV3model.collection.insertMany(res); - console.log('app forms inserted'); - } catch (err) { - console.log('err in save app forms', err); - } - } - await getAppReports(); - } - async function getAppReports() { - try { - var appIdpointer = 'w_appinfo$' + appId; - const db = await mongoose.createConnection(sourceConString, options).asPromise(); - const w_reportmodel = db.model('w_Filter', w_reportSchema); - const reportsRes = await w_reportmodel.find({ _p_appId: appIdpointer }); - await saveAppReports(reportsRes); - } catch (err) { - console.log('err is get app reports', err); - } - } - async function saveAppReports(res) { - if (res.length > 0) { - try { - const db = await mongoose.createConnection(targetConString, options).asPromise(); - const w_reportmodel = db.model('w_Filter', w_reportSchema); - const src_res = await w_reportmodel.collection.insertMany(res); - console.log('app reports inserted'); - } catch (err) { - console.log('err in save app reports', err); - } - } - await getAppMenu(); - } - - async function getAppMenu() { - try { - var appIdpointer = 'w_appinfo$' + appId; - const db = await mongoose.createConnection(sourceConString, options).asPromise(); - const w_menumodel = db.model('w_menu', w_menuSchema); - const menuRes = await w_menumodel.find({ _p_appId: appIdpointer }); - await saveAppMenu(menuRes); - } catch (err) { - console.log('err is get app menus', err); - } - } - async function saveAppMenu(res) { - if (res.length > 0) { - try { - const db = await mongoose.createConnection(targetConString, options).asPromise(); - const w_menumodel = db.model('w_menu', w_menuSchema); - const src_res = await w_menumodel.collection.insertMany(res); - - console.log('app menus inserted'); - } catch (err) { - console.log('err in save app menus', err); - } - } - await saveAppRole(); - } - - async function saveAppRole(res) { - const date = new Date(); - const appRole = appname + 'appeditor'; - const role = [ - { - _id: appRoleId, - name: appRole, - _wperm: [`${UserId}`], - _rperm: ['*', `${UserId}`], - _acl: { UserId: { w: true, r: true }, '*': { r: true } }, - _created_at: date, - _updated_at: date, - }, - ...defaultRoles, - ]; - - try { - const db = await mongoose.createConnection(targetConString, options).asPromise(); - Trg__RoleModel = db.model('_Role', _RoleSchema); - const src_res = await Trg__RoleModel.collection.insertMany(role); - console.log('app editor role inserted'); - await saveJoinAppRole(); - } catch (err) { - console.log('err in save app editor role', err); - } - } - - async function saveJoinAppRole() { - const OrgRole = organization + '_org'; - let OrgRoleId; - - try { - const db = await mongoose.createConnection(targetConString, options).asPromise(); - // const _RoleModel = db.model('_Role', _RoleSchema); - const src_res = await Trg__RoleModel.find({ name: OrgRole }); - // console.log('src_res ', src_res); - OrgRoleId = src_res[0]._id; - } catch (err) { - console.log('err in get org Role Id', err); - } - const userJoinRole = [{ owningId: appRoleId, relatedId: UserId }]; - - try { - const db = await mongoose.createConnection(targetConString, options).asPromise(); - const _UserJoinRolemodel = db.model('_Join:users:_Role', _UserjoinSchema); - const userJoinRes = await _UserJoinRolemodel.collection.insertMany(userJoinRole); - - console.log('User Join role inserted'); - } catch (err) { - console.log('err in User Join role', err); - } - - const roleJoinRole = [{ owningId: OrgRoleId, relatedId: appRoleId }]; - - try { - const db = await mongoose.createConnection(targetConString, options).asPromise(); - const _RoleJoinRolemodel = db.model('_Join:roles:_Role', _RolejoinSchema); - const roleJoinRes = await _RoleJoinRolemodel.collection.insertMany(roleJoinRole); - console.log('Role Join role inserted'); - await getAppSchemas(); - } catch (err) { - console.log('err in Role Join role', err); - } - } - async function getAppSchemas() { - console.log('getAppSchemas'); - try { - const db = await mongoose.createConnection(sourceConString, options).asPromise(); - Src_SCHEMASmodel = db.model('_SCHEMA', _SCHEMASchema); - const schemaRes = await Src_SCHEMASmodel.find({ - _id: { $regex: '.*' + appname + '.*' }, - }); - await saveAppSchemas(schemaRes); - } catch (err) { - console.log('err in get app schema', err); - } - } - - async function saveAppSchemas(res) { - if (res.length > 0) { - console.log('saveAppSchemas'); - try { - const db = await mongoose.createConnection(targetConString, options).asPromise(); - Trg_SCHEMASmodel = db.model('_SCHEMA', _SCHEMASchema); - const src_res = await Trg_SCHEMASmodel.collection.insertMany(res); - console.log('app schema inserted'); - msg = 'app installed successfully'; - status = 200; - } catch (err) { - console.log('err in save app schemas', err); - } - } - msg = 'app installed successfully'; - status = 200; - } - const message = { message: msg, status: status }; - return message; - } catch (err) { - console.log('Exeption in query ', err); - console.log(err); - return 'Error:Exeption in query'; - } - } - } catch (err) { - return Promise.reject('Invalid session token!'); - } -} diff --git a/apps/OpenSignServer/cloud/parsefunction/SendMailOTPv1.js b/apps/OpenSignServer/cloud/parsefunction/SendMailOTPv1.js index f0240d042..c4fcb4462 100644 --- a/apps/OpenSignServer/cloud/parsefunction/SendMailOTPv1.js +++ b/apps/OpenSignServer/cloud/parsefunction/SendMailOTPv1.js @@ -2,17 +2,11 @@ async function sendMailOTPv1(request) { try { //--for elearning app side let code = Math.floor(1000 + Math.random() * 9000); - let getMessage = code + ' This is your verification code'; let email = request.params.email; - var Hashcode; var TenantId = request.params.TenantId ? request.params.TenantId : undefined; // console.log("In tempSendOTPv2"); - console.log(JSON.stringify(request)); - - var encoded = encodeURIComponent(Hashcode); - var otp = '<%23> You OTP is:' + code + ' ' + encoded + ' -QikEln'; - otp = otp.toString(); + // console.log(JSON.stringify(request)); if (email) { axios({ diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js index 0e71d3090..742dd6283 100644 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js +++ b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js @@ -221,7 +221,9 @@ async function PDF(req, res) { // let PdfBuffer = fs.readFileSync("exports/simple.pdf"); // `P12Buffer` used to create buffer from p12 certificate - const P12Buffer = fs.readFileSync(`pdfFile/emudhra-test-class2.pfx`); + const pfxFile = process.env.PFX_BASE64; + // const P12Buffer = fs.readFileSync(); + const P12Buffer = Buffer.from(pfxFile, 'base64'); if (sign) { // `plainAddPlaceholder` is used to add code of digitial sign in pdf file @@ -241,10 +243,7 @@ async function PDF(req, res) { signatureLength: 10000, }); } - // console.log("PdfBuffer ", PdfBuffer); - // const clientIP = req.headers["x-real-ip"]; - // console.log("req.ip", clientIP); //`new signPDF` create new instance of pdfBuffer and p12Buffer const OBJ = new SignPDF(PdfBuffer, P12Buffer); diff --git a/apps/OpenSignServer/package.json b/apps/OpenSignServer/package.json index 8da563bdb..2f79c8e68 100644 --- a/apps/OpenSignServer/package.json +++ b/apps/OpenSignServer/package.json @@ -13,7 +13,7 @@ "lint": "eslint --cache ./cloud && eslint --cache index.js && eslint --cache ./spec", "lint-fix": "eslint --cache --fix ./cloud && eslint --cache --fix index.js && eslint --cache --fix ./spec", "prettier": "prettier --write '{cloud,spec}/{**/*,*}.js' 'index.js'", - "start": "ls && node index.js", + "start": "node index.js", "test": "mongodb-runner start && TESTING=true jasmine", "watch": "nodemon index.js" }, diff --git a/apps/OpenSignServer/pdfFile/Amit.p12 b/apps/OpenSignServer/pdfFile/Amit.p12 deleted file mode 100644 index 8d9fdfdba6200fa0624b5517cb0452466d1cb117..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6328 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