From 007ad5bd5a5f49761e23156f65bf5f75b31cd980 Mon Sep 17 00:00:00 2001 From: ansibleguy76 Date: Tue, 29 Oct 2024 10:42:04 +0100 Subject: [PATCH 01/42] version bump --- client/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/package.json b/client/package.json index b85e4bd..f2631c3 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "ansible_forms_vue", - "version": "5.0.7", + "version": "5.0.8", "private": true, "scripts": { "serve": "vue-cli-service serve", From b30d702d70a0fa0813e15ba768af69d7f26640aa Mon Sep 17 00:00:00 2001 From: ansibleguy76 Date: Mon, 4 Nov 2024 16:23:56 +0100 Subject: [PATCH 02/42] moving docker files to root, now includes the client build as well --- .dockerignore | 8 +++ server/Dockerfile => Dockerfile | 48 +++++++++++++---- server/Dockerfile-debian => Dockerfile-debian | 51 +++++++++++++++---- server/.dockerignore | 5 -- 4 files changed, 88 insertions(+), 24 deletions(-) create mode 100644 .dockerignore rename server/Dockerfile => Dockerfile (75%) rename server/Dockerfile-debian => Dockerfile-debian (79%) delete mode 100644 server/.dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..3728569 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +**/node_modules/ +node_modules +**/vue.config.js +vue.config.js +Dockerfile +.env.* +.env +README.md diff --git a/server/Dockerfile b/Dockerfile similarity index 75% rename from server/Dockerfile rename to Dockerfile index 5b84eb7..4960645 100644 --- a/server/Dockerfile +++ b/Dockerfile @@ -45,20 +45,41 @@ RUN npm install -g npm@9.8.1 FROM node AS tmp_builder -# Use /app -WORKDIR /app - -# Copy package.json and package-lock.json to /app -COPY package*.json ./ - # Update npm RUN npm install -g npm@9.8.1 +# Install vue cli service +RUN npm install -g @vue/cli-service + +# Use /app/client +WORKDIR /app/client + +# Copy client package.json and package-lock.json to /app/client +COPY ./client/package*.json ./ + +# install node modules for client +RUN npm install + +# Copy the rest of the code +COPY ./client . + +# build client +RUN npm run build + +# Use /app/server +WORKDIR /app/server + +# Copy package.json and package-lock.json to /app/server +COPY ./server/package*.json ./ + # install node modules RUN npm install # Copy the rest of the code -COPY . . +COPY ./server . + +# Copy the docs help file to /app/server +COPY ./docs/_data/help.yaml . # Invoke the build script to transpile code to js RUN npm run build @@ -66,6 +87,15 @@ RUN npm run build # Remove persistent subfolder RUN rm -rf ./dist/persistent +# Remove client subfolder +RUN rm -rf ./dist/views + +# Create the views folder +RUN mkdir -p ./dist/views + +# move client build to server +RUN mv /app/client/dist/* ./dist/views + ################################################## # final build # take base and install production app dependencies @@ -80,10 +110,10 @@ COPY package*.json ./ RUN npm i --only=production # Copy transpiled js from builder stage into the final image -COPY --from=tmp_builder /app/dist ./dist +COPY --from=tmp_builder /app/server/dist ./dist # Copy the ansible.cfg file to /etc/ansible/ directory -COPY ansible.cfg /etc/ansible/ansible.cfg +COPY ./server/ansible.cfg /etc/ansible/ansible.cfg # Use js files to run the application ENTRYPOINT ["node", "./dist/index.js"] diff --git a/server/Dockerfile-debian b/Dockerfile-debian similarity index 79% rename from server/Dockerfile-debian rename to Dockerfile-debian index dc85074..5481fc3 100644 --- a/server/Dockerfile-debian +++ b/Dockerfile-debian @@ -64,21 +64,43 @@ RUN ansible-galaxy collection install community.mysql -p /usr/share/ansible/coll # why from diff image? for faster build, this image has node preinstalled and can start building immediately # if only the node app changes, the intermediate image can be cached and the final image will be faster to build -FROM node:16-alpine AS tmp_builder +FROM node AS tmp_builder -# Use /app -WORKDIR /app +# Update npm +RUN npm install -g npm@9.8.1 -# Copy package.json and package-lock.json to /app -COPY package*.json ./ +# Install vue cli service +RUN npm install -g @vue/cli-service -# Install all dependencies -RUN npm install -g +# Use /app/client +WORKDIR /app/client +# Copy client package.json and package-lock.json to /app/client +COPY ./client/package*.json ./ + +# install node modules for client RUN npm install # Copy the rest of the code -COPY . . +COPY ./client . + +# build client +RUN npm run build + +# Use /app/server +WORKDIR /app/server + +# Copy package.json and package-lock.json to /app/server +COPY ./server/package*.json ./ + +# install node modules +RUN npm install + +# Copy the rest of the code +COPY ./server . + +# Copy the docs help file to /app/server +COPY ./docs/_data/help.yaml . # Invoke the build script to transpile code to js RUN npm run build @@ -86,6 +108,15 @@ RUN npm run build # Remove persistent subfolder RUN rm -rf ./dist/persistent +# Remove client subfolder +RUN rm -rf ./dist/views + +# Create the views folder +RUN mkdir -p ./dist/views + +# move client build to server +RUN mv /app/client/dist/* ./dist/views + ################################################## # final build # take base and install production app dependencies @@ -97,7 +128,7 @@ FROM debianbase as final COPY package*.json ./ # Copy transpiled js from builder stage into the final image -COPY --from=tmp_builder /app/dist ./dist +COPY --from=tmp_builder /app/server/dist ./dist # Install only production dependencies # the build was done in alpine, so we need to remove any previous node_modules @@ -105,7 +136,7 @@ RUN rm -rf ./dist/node_modules RUN npm install --only=production # Copy the ansible.cfg file to /etc/ansible/ directory -COPY ansible.cfg /etc/ansible/ansible.cfg +COPY ./server/ansible.cfg /etc/ansible/ansible.cfg # Use js files to run the application ENTRYPOINT ["node", "./dist/index.js"] diff --git a/server/.dockerignore b/server/.dockerignore deleted file mode 100644 index b07b275..0000000 --- a/server/.dockerignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules/ -Dockerfile -.env.* -.env -README.md From 05c519292153481479038c3e6cafb0d19588aace Mon Sep 17 00:00:00 2001 From: ansibleguy76 Date: Mon, 4 Nov 2024 16:27:35 +0100 Subject: [PATCH 03/42] fix some typos --- Dockerfile-debian | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile-debian b/Dockerfile-debian index 5481fc3..84f3fc1 100644 --- a/Dockerfile-debian +++ b/Dockerfile-debian @@ -64,7 +64,7 @@ RUN ansible-galaxy collection install community.mysql -p /usr/share/ansible/coll # why from diff image? for faster build, this image has node preinstalled and can start building immediately # if only the node app changes, the intermediate image can be cached and the final image will be faster to build -FROM node AS tmp_builder +FROM node:16-alpine AS tmp_builder # Update npm RUN npm install -g npm@9.8.1 @@ -128,7 +128,7 @@ FROM debianbase as final COPY package*.json ./ # Copy transpiled js from builder stage into the final image -COPY --from=tmp_builder /app/server/dist ./dist +COPY --from=tmp_builder /app/dist ./dist # Install only production dependencies # the build was done in alpine, so we need to remove any previous node_modules From 426c301fd4cbeb847d1bfca8a98fcb4ec4c88d16 Mon Sep 17 00:00:00 2001 From: ansibleguy76 Date: Mon, 4 Nov 2024 16:43:48 +0100 Subject: [PATCH 04/42] typos --- Dockerfile | 2 +- Dockerfile-debian | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 4960645..717c426 100644 --- a/Dockerfile +++ b/Dockerfile @@ -104,7 +104,7 @@ RUN mv /app/client/dist/* ./dist/views FROM nodebase as final # Copy package.json and package-lock.json -COPY package*.json ./ +COPY ./server/package*.json ./ # Install only production dependencies RUN npm i --only=production diff --git a/Dockerfile-debian b/Dockerfile-debian index 84f3fc1..343e81a 100644 --- a/Dockerfile-debian +++ b/Dockerfile-debian @@ -125,10 +125,10 @@ RUN mv /app/client/dist/* ./dist/views FROM debianbase as final # Copy package.json and package-lock.json -COPY package*.json ./ +COPY ./server/package*.json ./ # Copy transpiled js from builder stage into the final image -COPY --from=tmp_builder /app/dist ./dist +COPY --from=tmp_builder /app/server/dist ./dist # Install only production dependencies # the build was done in alpine, so we need to remove any previous node_modules From 02dd9ce3e9913e90c760e504b991908ceb10c633 Mon Sep 17 00:00:00 2001 From: ansibleguy76 Date: Tue, 5 Nov 2024 17:51:17 +0100 Subject: [PATCH 05/42] regex typos --- client/src/views/Repos.vue | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/client/src/views/Repos.vue b/client/src/views/Repos.vue index ddaaa5a..4a86c75 100644 --- a/client/src/views/Repos.vue +++ b/client/src/views/Repos.vue @@ -44,8 +44,8 @@
- - + + @@ -263,7 +263,7 @@ required, regex : helpers.withParams( {description: "User must be a valid repository name",type:"regex"}, - (value) => !helpers.req(value) || (new RegExp("^[a-z0-9_-]{1,50}$").test(value)) // eslint-disable-line + (value) => !helpers.req(value) || (new RegExp("^[a-zA-Z0-9_-]{1,50}$").test(value)) // eslint-disable-line ) }, uri: { @@ -278,7 +278,7 @@ }, cron: { regex : helpers.withParams( - {description: "User must be a valid github user (alphanumeric / hyphens)",type:"regex"}, + {description: "Cron must be valid format",type:"regex"}, (value) => !helpers.req(value) || (new RegExp("^[0-9-,*/]+ [0-9-,*/]+ [0-9-,*/L]+ [0-9-,*/]+ [0-9-,*/L]+$").test(value)) // eslint-disable-line ) }, @@ -286,7 +286,7 @@ maxLength:39, regex : helpers.withParams( {description: "User must be a valid github user (alphanumeric / hyphens)",type:"regex"}, - (value) => !helpers.req(value) || (new RegExp("^[a-z\d](?:[a-z\d]|-(?=[a-z\d])){0,38}$").test(value)) // eslint-disable-line + (value) => !helpers.req(value) || (new RegExp("^[a-zA-Z0-9-](?:[a-zA-Z0-9-]|-(?=[a-zA-Z0-9-])){0,38}$").test(value)) // eslint-disable-line ) } } From 9ff6c968ff4b28688eb4f3a0319fbd9bc7564734 Mon Sep 17 00:00:00 2001 From: ansibleguy76 Date: Fri, 3 Jan 2025 18:26:52 +0100 Subject: [PATCH 06/42] remove baseurl --- server/src/templates/approval.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/templates/approval.html b/server/src/templates/approval.html index 197b5fd..9c845a9 100644 --- a/server/src/templates/approval.html +++ b/server/src/templates/approval.html @@ -144,7 +144,7 @@

There is an approval request awaiting your action

- Review Approval Request + Review Approval Request

Request details :

${message}

Regards,
AnsibleForms

From b762218632f64c60ad7d418e132b187b4fcfa25c Mon Sep 17 00:00:00 2001 From: ansibleguy76 Date: Fri, 3 Jan 2025 18:27:27 +0100 Subject: [PATCH 07/42] allow admin delete --- server/src/models/user.model.js | 49 ++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/server/src/models/user.model.js b/server/src/models/user.model.js index 8e2cb69..62d7a0c 100644 --- a/server/src/models/user.model.js +++ b/server/src/models/user.model.js @@ -37,9 +37,6 @@ User.create = function (record) { }) }; User.update = function (record,id) { - if(id==1 && record.group_id!=undefined && record.group_id!=1){ - return Promise.reject("You cannot change the 'admin' user out of the 'admins' group.") - } if(record.password){ logger.info(`Updating user with password ${(record.username)?record.username:id}`) return crypto.hashPassword(record.password) @@ -54,12 +51,8 @@ User.update = function (record,id) { }; User.delete = function(id){ - if(id==1){ - return Promise.reject("You cannot delete user 'admin'") - }else{ - logger.info(`Deleting user ${id}`) - return mysql.do("DELETE FROM AnsibleForms.`users` WHERE id = ? AND username<>'admin'", [id]) - } + logger.info(`Deleting user ${id}`) + return mysql.do("DELETE FROM AnsibleForms.`users` WHERE id = ?", [id]) }; User.findAll = function () { logger.info("Finding all users") @@ -115,10 +108,14 @@ User.checkToken = function (username,username_type,refresh_token) { } }) }; -User.getRoles = function(groups,user){ - var roles = ["public"] - var forms=undefined +User.getRolesAndOptions = function(groups,user){ + var result = {} + var roles = [] + var options = {} var full_username = `${user.type}/${user.username}` + + logger.debug(`Getting roles and options for ${full_username}`) + return Form.load() .then((forms)=>{ // derive roles from forms @@ -127,18 +124,38 @@ User.getRoles = function(groups,user){ forms.roles.forEach(function(role){ if(role.groups && role.groups.includes(group)){ roles.push(role.name) + if(role.options){ + for (const [key, value] of Object.entries(role.options)) { + logger.debug(`Adding option ${key} = ${value}`) + if(options[key]===undefined){ + options[key] = value + }else{ + options[key] = options[key] && value + } + } + } } }) }) - // add all the roles that match the user + logger.debug(`Adding public role to ${full_username}`) + roles.push("public") + // if the public role has any option set, we add it to the options, we don't overwrite forms.roles.forEach(function(role){ - if(role.users && role.users.includes(full_username)){ - roles.push(role.name) + if(role.name=="public" && role.options){ + for (const [key, value] of Object.entries(role.options)) { + if(options[key]===undefined){ + logger.debug(`Adding public option ${key} = ${value}`) + options[key] = value + } + } } }) - return roles + result.roles = roles + result.options = options + + return result }) .catch((e)=>{ // return temp role if needed From 3e0908f8a187b193f4ecc771f60c345d6621fa4b Mon Sep 17 00:00:00 2001 From: ansibleguy76 Date: Fri, 3 Jan 2025 18:28:00 +0100 Subject: [PATCH 08/42] auto creat admins group and admin user --- server/src/init/index.js | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/server/src/init/index.js b/server/src/init/index.js index d8991f4..5ad69d1 100644 --- a/server/src/init/index.js +++ b/server/src/init/index.js @@ -5,11 +5,14 @@ async function init(){ var Form = require('../models/form.model'); var Job = require('../models/job.model'); var Schema = require('../models/schema.model'); + var adminGroupId = undefined const mysql=require("../models/db.model"); const Repository = require('../models/repository.model'); const parser = require("cron-parser") const dayjs = require("dayjs") - const util = require('util') + const appConfig = require("../../config/app.config") + const User = require("../models/user.model") + const Group = require("../models/group.model") // this is at startup, don't start the app until mysql is ready // rewrite with await @@ -67,6 +70,40 @@ async function init(){ } + // check admins groups + try{ + var adminGroupName = "admins" + var adminGroup = await Group.findByName(adminGroupName) + if(adminGroup.length==0){ + logger.warning(`Group ${adminGroupName} not found, creating it`) + adminGroup = {} + adminGroup.id = await Group.create(new Group({name:adminGroup})) + }else{ + adminGroup = adminGroup[0] + } + adminGroupId = adminGroup.id + }catch(err){ + logger.error("Failed to check/create admins group : " + err) + throw err + } + + // check admin user + logger.info("Checking admin user exists") + try{ + var adminUsername = appConfig.adminUsername + var adminUser = await User.findByUsername(adminUsername) + if(adminUser.length==0){ + logger.warning(`Admin user ${adminUsername} not found, creating it`) + var adminPassword = appConfig.adminPassword + await User.create(new User({username:adminUsername,email:'',password:adminPassword,group_id:adminGroupId})) + }else{ + adminUser = adminUser[0] + } + }catch(err){ + logger.error("Failed to check/create admin user : " + err) + throw err + } + Ssh.generate(false) .catch((err)=>{ From 174097e4a069ff82953dd569b938693db4f213ce Mon Sep 17 00:00:00 2001 From: ansibleguy76 Date: Fri, 3 Jan 2025 18:28:29 +0100 Subject: [PATCH 09/42] add ytt vars and admin/pass var --- server/config/app.config.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/server/config/app.config.js b/server/config/app.config.js index 15c16ba..2b049c2 100644 --- a/server/config/app.config.js +++ b/server/config/app.config.js @@ -8,6 +8,10 @@ var app_config = { allowSchemaCreation: (process.env.ALLOW_SCHEMA_CREATION ?? 1)==1, formsPath: process.env.FORMS_PATH || path.resolve(__dirname + "/../persistent/forms.yaml"), useYtt: (process.env.USE_YTT ?? 0)==1, + yttDangerousAllowAllSymlinkDestinations: (process.env.YTT_DANGEROUS_ALLOW_ALL_SYMLINK_DESTINATIONS ?? 0)==1, + yttAllowSymlinkDestinations: process.env.YTT_ALLOW_SYMLINK_DESTINATIONS || "", + yttLibData: {}, + yttVarsPrefix: process.env.YTT_VARS_PREFIX || "", lockPath: process.env.LOCK_PATH || path.resolve(__dirname + "/../persistent/ansibleForms.lock"), helpPath: path.resolve(__dirname + "/../help.yaml"), encryptionSecret: ((process.env.ENCRYPTION_SECRET + "vOVH6sdmpNWjRRIqCc7rdxs01lwHzfr3").substring(0,32)) || "vOVH6sdmpNWjRRIqCc7rdxs01lwHzfr3", @@ -20,5 +24,14 @@ var app_config = { enableBypass: (process.env.ENABLE_BYPASS ?? 0)==1, enableDbQueryLogging: (process.env.ENABLE_DB_QUERY_LOGGING ?? 0)==1, enableFormsYamlInDatabase: (process.env.ENABLE_FORMS_YAML_IN_DATABASE ?? 0)==1, + adminUsername: process.env.ADMIN_USERNAME || "admin", + adminPassword: process.env.ADMIN_PASSWORD || "AnsibleForms!123" }; + +// process dynamic YTT_LIB_DATA_ environment variables +Object.entries(process.env).filter( ([key, value]) => key.startsWith('YTT_LIB_DATA_')).forEach( ([key, value]) => { + const libName = key.replace('YTT_LIB_DATA_', '').toLowerCase(); + app_config.yttLibData[libName] = value; +}); + module.exports = app_config; From e0d9cb8c1a688d5f769d77d33b4a25e25e98a772 Mon Sep 17 00:00:00 2001 From: ansibleguy76 Date: Fri, 3 Jan 2025 18:28:49 +0100 Subject: [PATCH 10/42] version bump and typo fix --- server/src/swagger.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/server/src/swagger.json b/server/src/swagger.json index b283f6e..00e85ac 100644 --- a/server/src/swagger.json +++ b/server/src/swagger.json @@ -2,7 +2,7 @@ "swagger": "2.0", "info": { "description": "This is the swagger interface for AnsibleForms.\r\nUse the `/auth/login` api with basic authentication to obtain a JWT token.\r\nThen use the access token, prefixed with the word '**Bearer**' to use all other api's.\r\nNote that the access token is limited in time. You can then either login again and get a new set of tokens or use the `/token` api and the refresh token to obtain a new set (preferred).", - "version": "5.0.7", + "version": "5.0.8", "title": "AnsibleForms", "contact": { "email": "info@ansibleforms.com" @@ -96,7 +96,7 @@ "name": "expiryDays", "type": "integer", "required": false, - "description": "Expiry days, only for admins" + "description": "Expiry days, requires extendedTokenExpiration option to be set to true in role-options" } ], "summary": "Get authorization bearer token", @@ -1720,7 +1720,7 @@ "bearerAuth": [] } ], - "summary": "Get Azure AD configuration", + "summary": "Get MS Entra Id configuration", "produces": [ "application/json" ], @@ -1754,7 +1754,7 @@ }, "put": { "tags": [ - "Azure AD config" + "MS Entra Id config" ], "security": [ { @@ -1764,7 +1764,7 @@ "parameters": [ { "in": "body", - "name": "Azure AD config", + "name": "MS Entra Id config", "schema": { "type": "object", "properties": { @@ -1860,7 +1860,7 @@ }, "put": { "tags": [ - "OIDC config" + "Open ID Connect config" ], "security": [ { From 3d9b9906c08d63a30e62dac4d2cb1a652889487a Mon Sep 17 00:00:00 2001 From: ansibleguy76 Date: Fri, 3 Jan 2025 18:29:36 +0100 Subject: [PATCH 11/42] add roleoptions --- client/src/App.vue | 5 ++++ client/src/router.js | 51 ++++++++++++++++++++++----------- server/src/models/lock.model.js | 10 +++---- 3 files changed, 44 insertions(+), 22 deletions(-) diff --git a/client/src/App.vue b/client/src/App.vue index d830cc0..902f6fd 100644 --- a/client/src/App.vue +++ b/client/src/App.vue @@ -56,6 +56,10 @@
  • {{ r }}
+ Options : +
    +
  • {{ o }} : {{ profile.options[o] }}
  • +
@@ -107,6 +111,7 @@ // console.log("checking if is admin") var payload = TokenStorage.getPayload() if(payload.user && payload.user.roles){ + this.profile = payload.user this.isAdmin=payload.user.roles.includes("admin") } }, diff --git a/client/src/router.js b/client/src/router.js index 48b8359..301cddb 100644 --- a/client/src/router.js +++ b/client/src/router.js @@ -26,12 +26,29 @@ import ReferenceGuide from './views/ReferenceGuide.vue' import Install from './views/Install.vue' import TokenStorage from './lib/TokenStorage.js' Vue.use(Router); -const checkAdmin=(to, from, next) => { + +const checkDesigner=(to, from, next) => { + var payload = TokenStorage.getPayload() + if(payload?.user?.options?.showDesigner ?? payload?.user?.roles?.includes("admin")){ + next() + }else{ + console.log("You are not allowed to access designer") + } +} +const checkLogs=(to, from, next) => { + var payload = TokenStorage.getPayload() + if(payload?.user?.options?.showLogs ?? payload?.user?.roles?.includes("admin")){ + next() + }else{ + console.log("You are not allowed to access logs") + } +} +const checkSettings=(to, from, next) => { var payload = TokenStorage.getPayload() - if(payload?.user?.roles?.includes("admin")){ + if(payload?.user?.options?.showSettings ?? payload?.user?.roles?.includes("admin")){ next() }else{ - console.log("You are not an admin user") + console.log("You are not allowed to access settings") } } @@ -120,85 +137,85 @@ export default new Router({ path:"/groups", name:"Groups", component:Groups, - beforeEnter: checkAdmin + beforeEnter: checkSettings }, { path:"/repos", name:"Repos", component:Repos, - beforeEnter: checkAdmin + beforeEnter: checkSettings }, { path:"/users", name:"Users", component:Users, - beforeEnter: checkAdmin + beforeEnter: checkSettings }, { path:"/ldap", name:"Ldap", component:Ldap, - beforeEnter: checkAdmin + beforeEnter: checkSettings }, { path:"/azuread", name:"AzureAd", component:AzureAd, - beforeEnter: checkAdmin + beforeEnter: checkSettings }, { path:"/oidc", name:"OIDC", component:OIDC, - beforeEnter: checkAdmin + beforeEnter: checkSettings }, { path:"/settings", name:"Settings", component:Settings, - beforeEnter: checkAdmin + beforeEnter: checkSettings }, { path:"/mail_settings", name:"Settings Mail", component:MailSettings, - beforeEnter: checkAdmin + beforeEnter: checkSettings }, { path:"/awx", name:"Awx", component:Awx, - beforeEnter: checkAdmin + beforeEnter: checkSettings }, { path:"/credentials", name:"Credentials", component:Credentials, - beforeEnter: checkAdmin + beforeEnter: checkSettings }, { path:"/sshkey", name:"Sshkey", component:Sshkey, - beforeEnter: checkAdmin + beforeEnter: checkSettings }, { path:"/knownhosts", name:"KnownHost", component:KnownHosts, - beforeEnter: checkAdmin + beforeEnter: checkSettings }, { path:"/logs", name:"Logs", component:Logs, - beforeEnter: checkAdmin + beforeEnter: checkLogs }, { path:"/designer", name:"Designer", component:Designer, - beforeEnter: checkAdmin + beforeEnter: checkDesigner }, { path:"/jobs", diff --git a/server/src/models/lock.model.js b/server/src/models/lock.model.js index dcbd202..0f6f946 100644 --- a/server/src/models/lock.model.js +++ b/server/src/models/lock.model.js @@ -40,7 +40,7 @@ Lock.status = async function(user){ } } Lock.set = function (user) { - if(config.showDesigner){ + if(config.showDesigner && (user.options?.showDesigner ?? true)){ logger.notice(`Creating lock for user ${user.username}`) user.created = moment(Date.now()).format('YYYY-MM-DD HH:mm:ss') return fsPromises.writeFile(config.lockPath,YAML.stringify(user),{encoding:"utf8",flag:"w"}) @@ -49,8 +49,8 @@ Lock.set = function (user) { return Promise.reject('Designer is disabled') } }; -Lock.delete = function(){ - if(config.showDesigner){ +Lock.delete = function(user={}){ + if(config.showDesigner && (user.options?.showDesigner ?? true)){ logger.notice(`Deleting lock`) return fsPromises.unlink(config.lockPath) }else{ @@ -59,9 +59,9 @@ Lock.delete = function(){ } }; -Lock.get = function () { +Lock.get = function (user={}) { // logger.notice("Getting lock") - if(config.showDesigner){ + if(config.showDesigner && (user.options?.showDesigner ?? true)){ return fsPromises.readFile(config.lockPath,{encoding:"utf8"}) }else{ logger.error("Designer is disabled, can't get lock") From 243f06cafd4e196fc06504197ae083645f61895a Mon Sep 17 00:00:00 2001 From: ansibleguy76 Date: Fri, 3 Jan 2025 18:29:57 +0100 Subject: [PATCH 12/42] remove log --- client/src/lib/TokenStorage.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/src/lib/TokenStorage.js b/client/src/lib/TokenStorage.js index b9a5758..dffa08c 100644 --- a/client/src/lib/TokenStorage.js +++ b/client/src/lib/TokenStorage.js @@ -28,8 +28,10 @@ var TokenStorage = { jsonPayload = decodeURIComponent(atob(base64).split('').map(function(c) { return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); }).join('')); + // console.log(JSON.parse(jsonPayload)) return JSON.parse(jsonPayload) }catch(err){ + console.log("Error in getPayload: " + err) return {} } }, From 7b469180e46987beaba2717e5574bae94defc82b Mon Sep 17 00:00:00 2001 From: ansibleguy76 Date: Fri, 3 Jan 2025 18:30:09 +0100 Subject: [PATCH 13/42] add roleoptions --- client/src/components/BulmaNav.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/src/components/BulmaNav.vue b/client/src/components/BulmaNav.vue index f8477d1..5a90a2b 100644 --- a/client/src/components/BulmaNav.vue +++ b/client/src/components/BulmaNav.vue @@ -18,16 +18,16 @@ Job log {{approvals}} {{(approvals==1)?"approval":"approvals"}} waiting - + Designer - + Settings