UNPKG

@fdm-monster/server

Version:

FDM Monster is a bulk OctoPrint manager to set up, configure and monitor 3D printers. Our aim is to provide extremely optimized websocket performance and reliability.

366 lines (365 loc) 16.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "UserController", { enumerable: true, get: function() { return UserController; } }); const _express = require("express"); const _serverconstants = require("../server.constants"); const _authenticate = require("../middleware/authenticate"); const _authorizationconstants = require("../constants/authorization.constants"); const _validators = require("../handlers/validators"); const _runtimeexceptions = require("../exceptions/runtime.exceptions"); const _configservice = require("../services/core/config.service"); const _userserviceinterface = require("../services/interfaces/user-service.interface"); const _demomiddleware = require("../middleware/demo.middleware"); const _roleserviceinterface = require("../services/interfaces/role-service.interface"); const _authserviceinterface = require("../services/interfaces/auth.service.interface"); const _loggerfactory = require("../handlers/logger-factory"); const _errorutils = require("../utils/error.utils"); const _settingsstore = require("../state/settings.store"); const _awilixexpress = require("awilix-express"); const _usercontrollervalidation = require("./validation/user-controller.validation"); const _paramconvertermiddleware = require("../middleware/param-converter.middleware"); function _ts_decorate(decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; } function _ts_metadata(k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); } class UserController { userService; configService; roleService; authService; settingsStore; isTypeormMode; logger; constructor(loggerFactory, userService, configService, roleService, authService, settingsStore, isTypeormMode){ this.userService = userService; this.configService = configService; this.roleService = roleService; this.authService = authService; this.settingsStore = settingsStore; this.isTypeormMode = isTypeormMode; this.logger = loggerFactory(UserController.name); } async list(req, res) { const users = await this.userService.listUsers(); res.send(users.map((u)=>this.userService.toDto(u))); } async create(req, res) { const { username, password, roleIds } = await (0, _validators.validateMiddleware)(req, (0, _usercontrollervalidation.registerUserWithRolesSchema)(this.isTypeormMode)); if (username.toLowerCase().includes("admin") || username.toLowerCase().includes("root") || username.toLowerCase() === "demo") { throw new _runtimeexceptions.BadRequestException("Username is not allowed"); } await this.userService.register({ username, password, roles: roleIds, needsPasswordChange: false, isDemoUser: false, isRootUser: false, isVerified: true }); res.send(); } async listRoles(req, res) { const roleDtos = this.roleService.roles.map((r)=>this.roleService.toDto(r)); res.send(roleDtos); } async profile(req, res) { if (!req.user?.id) { res.send({}); return; } const user = await this.userService.getUser(req.user?.id); res.send(this.userService.toDto(user)); } async get(req, res) { const user = await this.userService.getUser(req.local.id); res.send(this.userService.toDto(user)); } async delete(req, res) { const deletedUserId = req.local.id; const ownUserId = req.user?.id; if (ownUserId == deletedUserId) { throw new _runtimeexceptions.ForbiddenError("Not allowed to delete own account"); } const isRootUser = await this.userService.isUserRootUser(deletedUserId); if (isRootUser) { throw new _runtimeexceptions.ForbiddenError("Not allowed to delete root user"); } if (this.configService.isDemoMode()) { const demoUserId = await this.userService.getDemoUserId(); if (deletedUserId === demoUserId) { this.throwIfDemoMode(); } } await this.userService.deleteUser(deletedUserId); try { await this.authService.logoutUserId(deletedUserId); } catch (e) { this.logger.error((0, _errorutils.errorSummary)(e)); } res.send(); } async changeUsername(req, res) { const changedUserId = req.local.id; if (req.user?.id != changedUserId && await this.settingsStore.getLoginRequired()) { throw new _runtimeexceptions.ForbiddenError("Not allowed to change username of other users"); } const { username } = await (0, _validators.validateInput)(req.body, _usercontrollervalidation.usernameSchema); await this.userService.updateUsernameById(changedUserId, username); res.send(); } async changePassword(req, res) { const changedUserId = req.local.id; if (req.user?.id != changedUserId && await this.settingsStore.getLoginRequired()) { throw new _runtimeexceptions.ForbiddenError("Not allowed to change password of other users"); } const { oldPassword, newPassword } = await (0, _validators.validateInput)(req.body, _usercontrollervalidation.changePasswordSchema); await this.userService.updatePasswordById(changedUserId, oldPassword, newPassword); res.send(); } async setUserRoles(req, res) { const changedUserId = req.local.id; const ownUserId = req.user?.id; if (!ownUserId) { throw new _runtimeexceptions.ForbiddenError("Need to be logged in, in order to set user roles"); } const ownUser = await this.userService.getUser(ownUserId); const mappedUser = this.userService.toDto(ownUser); const ownUserRoles = mappedUser.roles; const adminRole = await this.roleService.getSynchronizedRoleByName(_authorizationconstants.ROLES.ADMIN); if (ownUserId == changedUserId && !ownUserRoles.includes(adminRole.id) && !mappedUser.isRootUser) { throw new _runtimeexceptions.ForbiddenError("Only an ADMIN or OWNER user is allowed to change its own roles"); } const { roleIds } = await (0, _validators.validateInput)(req.body, (0, _usercontrollervalidation.setUserRolesSchema)(this.isTypeormMode)); if (ownUserId == changedUserId && !roleIds.includes(adminRole.id)) { if (mappedUser.isRootUser) { throw new _runtimeexceptions.BadRequestException("It does not make sense to remove ADMIN role from an OWNER user."); } else { throw new _runtimeexceptions.BadRequestException("An ADMIN user cannot remove its ADMIN role."); } } await this.userService.setUserRoleIds(changedUserId, roleIds); res.send(); } async setVerified(req, res) { const changedUserId = req.local.id; const ownUserId = req.user?.id; if (ownUserId == changedUserId) { throw new _runtimeexceptions.ForbiddenError("Not allowed to change own verified status"); } const isRootUser = await this.userService.isUserRootUser(changedUserId); if (isRootUser) { throw new _runtimeexceptions.ForbiddenError("Not allowed to change root user to unverified"); } const { isVerified } = await (0, _validators.validateInput)(req.body, _usercontrollervalidation.isVerifiedSchema); await this.userService.setVerifiedById(changedUserId, isVerified); res.send(); } async setRootUser(req, res) { const changedUserId = req.local.id; const userId = req.user?.id; if (userId) { const isRootUser = await this.userService.isUserRootUser(userId); if (!isRootUser) { throw new _runtimeexceptions.ForbiddenError("Not allowed to change owner without being owner yourself"); } } const { isRootUser } = await (0, _validators.validateInput)(req.body, _usercontrollervalidation.isRootUserSchema); await this.userService.setIsRootUserById(changedUserId, isRootUser); res.send(); } throwIfDemoMode() { const isDemoMode = this.configService.isDemoMode(); if (isDemoMode) { throw new _runtimeexceptions.ForbiddenError("Not allowed in demo mode"); } } } _ts_decorate([ (0, _awilixexpress.GET)(), (0, _awilixexpress.route)("/"), (0, _awilixexpress.before)([ (0, _authenticate.authorizeRoles)([ _authorizationconstants.ROLES.ADMIN ]) ]), _ts_metadata("design:type", Function), _ts_metadata("design:paramtypes", [ typeof _express.Request === "undefined" ? Object : _express.Request, typeof _express.Response === "undefined" ? Object : _express.Response ]), _ts_metadata("design:returntype", Promise) ], UserController.prototype, "list", null); _ts_decorate([ (0, _awilixexpress.POST)(), (0, _awilixexpress.route)("/"), (0, _awilixexpress.before)([ (0, _authenticate.authorizeRoles)([ _authorizationconstants.ROLES.ADMIN ]) ]), _ts_metadata("design:type", Function), _ts_metadata("design:paramtypes", [ typeof _express.Request === "undefined" ? Object : _express.Request, typeof _express.Response === "undefined" ? Object : _express.Response ]), _ts_metadata("design:returntype", Promise) ], UserController.prototype, "create", null); _ts_decorate([ (0, _awilixexpress.GET)(), (0, _awilixexpress.route)("/roles"), _ts_metadata("design:type", Function), _ts_metadata("design:paramtypes", [ typeof _express.Request === "undefined" ? Object : _express.Request, typeof _express.Response === "undefined" ? Object : _express.Response ]), _ts_metadata("design:returntype", Promise) ], UserController.prototype, "listRoles", null); _ts_decorate([ (0, _awilixexpress.GET)(), (0, _awilixexpress.route)("/profile"), _ts_metadata("design:type", Function), _ts_metadata("design:paramtypes", [ typeof _express.Request === "undefined" ? Object : _express.Request, typeof _express.Response === "undefined" ? Object : _express.Response ]), _ts_metadata("design:returntype", Promise) ], UserController.prototype, "profile", null); _ts_decorate([ (0, _awilixexpress.GET)(), (0, _awilixexpress.route)("/:id"), (0, _awilixexpress.before)([ (0, _authenticate.authorizeRoles)([ _authorizationconstants.ROLES.ADMIN ]), (0, _paramconvertermiddleware.ParamId)("id") ]), _ts_metadata("design:type", Function), _ts_metadata("design:paramtypes", [ typeof _express.Request === "undefined" ? Object : _express.Request, typeof _express.Response === "undefined" ? Object : _express.Response ]), _ts_metadata("design:returntype", Promise) ], UserController.prototype, "get", null); _ts_decorate([ (0, _awilixexpress.DELETE)(), (0, _awilixexpress.route)("/:id"), (0, _awilixexpress.before)([ (0, _authenticate.authorizeRoles)([ _authorizationconstants.ROLES.ADMIN ]), _demomiddleware.demoUserNotAllowed, (0, _paramconvertermiddleware.ParamId)("id") ]), _ts_metadata("design:type", Function), _ts_metadata("design:paramtypes", [ typeof _express.Request === "undefined" ? Object : _express.Request, typeof _express.Response === "undefined" ? Object : _express.Response ]), _ts_metadata("design:returntype", Promise) ], UserController.prototype, "delete", null); _ts_decorate([ (0, _awilixexpress.POST)(), (0, _awilixexpress.route)("/:id/change-username"), (0, _awilixexpress.before)([ _demomiddleware.demoUserNotAllowed, (0, _paramconvertermiddleware.ParamId)("id") ]), _ts_metadata("design:type", Function), _ts_metadata("design:paramtypes", [ typeof _express.Request === "undefined" ? Object : _express.Request, typeof _express.Response === "undefined" ? Object : _express.Response ]), _ts_metadata("design:returntype", Promise) ], UserController.prototype, "changeUsername", null); _ts_decorate([ (0, _awilixexpress.POST)(), (0, _awilixexpress.route)("/:id/change-password"), (0, _awilixexpress.before)([ _demomiddleware.demoUserNotAllowed, (0, _paramconvertermiddleware.ParamId)("id") ]), _ts_metadata("design:type", Function), _ts_metadata("design:paramtypes", [ typeof _express.Request === "undefined" ? Object : _express.Request, typeof _express.Response === "undefined" ? Object : _express.Response ]), _ts_metadata("design:returntype", Promise) ], UserController.prototype, "changePassword", null); _ts_decorate([ (0, _awilixexpress.POST)(), (0, _awilixexpress.route)("/:id/set-user-roles"), (0, _awilixexpress.before)([ (0, _authenticate.authorizeRoles)([ _authorizationconstants.ROLES.ADMIN ]), _demomiddleware.demoUserNotAllowed, (0, _paramconvertermiddleware.ParamId)("id") ]), _ts_metadata("design:type", Function), _ts_metadata("design:paramtypes", [ typeof _express.Request === "undefined" ? Object : _express.Request, typeof _express.Response === "undefined" ? Object : _express.Response ]), _ts_metadata("design:returntype", Promise) ], UserController.prototype, "setUserRoles", null); _ts_decorate([ (0, _awilixexpress.POST)(), (0, _awilixexpress.route)("/:id/set-verified"), (0, _awilixexpress.before)([ (0, _authenticate.authorizeRoles)([ _authorizationconstants.ROLES.ADMIN ]), _demomiddleware.demoUserNotAllowed, (0, _paramconvertermiddleware.ParamId)("id") ]), _ts_metadata("design:type", Function), _ts_metadata("design:paramtypes", [ typeof _express.Request === "undefined" ? Object : _express.Request, typeof _express.Response === "undefined" ? Object : _express.Response ]), _ts_metadata("design:returntype", Promise) ], UserController.prototype, "setVerified", null); _ts_decorate([ (0, _awilixexpress.POST)(), (0, _awilixexpress.route)("/:id/set-root-user"), (0, _awilixexpress.before)([ _demomiddleware.demoUserNotAllowed, (0, _paramconvertermiddleware.ParamId)("id") ]), _ts_metadata("design:type", Function), _ts_metadata("design:paramtypes", [ typeof _express.Request === "undefined" ? Object : _express.Request, typeof _express.Response === "undefined" ? Object : _express.Response ]), _ts_metadata("design:returntype", Promise) ], UserController.prototype, "setRootUser", null); UserController = _ts_decorate([ (0, _awilixexpress.route)(_serverconstants.AppConstants.apiRoute + "/user"), (0, _awilixexpress.before)([ (0, _authenticate.authenticate)() ]), _ts_metadata("design:type", Function), _ts_metadata("design:paramtypes", [ typeof _loggerfactory.ILoggerFactory === "undefined" ? Object : _loggerfactory.ILoggerFactory, typeof _userserviceinterface.IUserService === "undefined" ? Object : _userserviceinterface.IUserService, typeof _configservice.IConfigService === "undefined" ? Object : _configservice.IConfigService, typeof _roleserviceinterface.IRoleService === "undefined" ? Object : _roleserviceinterface.IRoleService, typeof _authserviceinterface.IAuthService === "undefined" ? Object : _authserviceinterface.IAuthService, typeof _settingsstore.SettingsStore === "undefined" ? Object : _settingsstore.SettingsStore, Boolean ]) ], UserController); //# sourceMappingURL=user.controller.js.map