@iobroker/js-controller-cli 6.0.7-alpha.0-20240702-5c723a4ac → 6.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/lib/cli/cliLogs.js +4 -1
- package/build/cjs/lib/cli/cliLogs.js.map +2 -2
- package/build/cjs/lib/setup/setupUsers.js +3 -3
- package/build/cjs/lib/setup/setupUsers.js.map +2 -2
- package/build/cjs/lib/setup.js +5 -5
- package/build/cjs/lib/setup.js.map +2 -2
- package/build/esm/lib/cli/cliLogs.d.ts.map +1 -1
- package/build/esm/lib/cli/cliLogs.js +4 -1
- package/build/esm/lib/cli/cliLogs.js.map +1 -1
- package/build/esm/lib/setup/setupUsers.d.ts.map +1 -1
- package/build/esm/lib/setup/setupUsers.js +3 -4
- package/build/esm/lib/setup/setupUsers.js.map +1 -1
- package/build/esm/lib/setup.js +9 -9
- package/build/esm/lib/setup.js.map +1 -1
- package/build/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +4 -4
|
@@ -74,7 +74,10 @@ class CLILogs extends import_cliCommand.CLICommand {
|
|
|
74
74
|
fileName = fileName.replace(/\\/g, "/");
|
|
75
75
|
const parts = fileName.split("/");
|
|
76
76
|
parts.pop();
|
|
77
|
-
import_chokidar.default.watch(`${parts.join("/")}/iobroker*`, {
|
|
77
|
+
import_chokidar.default.watch(`${parts.join("/")}/iobroker*`, {
|
|
78
|
+
awaitWriteFinish: { stabilityThreshold: 500 },
|
|
79
|
+
followSymlinks: false
|
|
80
|
+
}).on("all", this.watchHandler.bind(this, options)).on("ready", () => this.isReady = true);
|
|
78
81
|
}
|
|
79
82
|
} else {
|
|
80
83
|
console.log("No log file found");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/cli/cliLogs.ts"],
|
|
4
|
-
"sourcesContent": ["import { CLICommand, type CLICommandOptions } from './cliCommand.js';\nimport { tools, logger as toolsLogger } from '@iobroker/js-controller-common';\nimport chokidar from 'chokidar';\nimport fs from 'fs-extra';\nimport os from 'node:os';\nimport es from 'event-stream';\nimport { createRequire } from 'node:module';\n// eslint-disable-next-line unicorn/prefer-module\nconst require = createRequire(import.meta.url || 'file://' + __filename);\n\nconst { getConfigFileName } = tools;\n\ninterface CLILogsOptions {\n /** Whether to show today's full log */\n complete?: boolean;\n /** An optional RegExp to filter by */\n regex?: RegExp;\n}\n\n/** Command ioBroker state ... */\nexport class CLILogs extends CLICommand {\n private readonly fileSizes = new Map<string, number>();\n private isReady = false;\n\n constructor(options: CLICommandOptions) {\n super(options);\n }\n\n /**\n * Executes a command\n *\n * @param args\n * @param params additional parsed CLI parameters\n */\n execute(args: any[], params: Record<string, any>): void {\n const adapterName = args[0];\n const watch = params.watch || params.w;\n const count = params.lines || 1_000;\n\n const options: CLILogsOptions = {\n complete: this.options.all\n };\n\n const config = fs.readJSONSync(require.resolve(getConfigFileName()));\n const logger = toolsLogger(config.log);\n /** @ts-expect-error todo adjust logger type */\n let fileName = logger.getFileName();\n if (fileName) {\n let lines = fs.readFileSync(fileName).toString('utf-8').split('\\n');\n lines = lines.filter(line => line);\n if (lines.length > count) {\n lines.splice(0, lines.length - count);\n }\n let regex: RegExp;\n if (adapterName) {\n //2019-03-02 13:26:54.698 - debug: iot.0 [ALEXA] Created ALEXA device: Bad.Hauptlicht.Aktor.STATE [\"turnOn\",\"turnOff\"]\n regex = new RegExp(`: ${adapterName}\\\\.`);\n options.regex = regex;\n }\n lines.forEach(line => {\n if (regex && !regex.test(line)) {\n return;\n }\n console.log(line);\n });\n\n if (watch) {\n fileName = fileName.replace(/\\\\/g, '/');\n const parts = fileName.split('/');\n parts.pop();\n chokidar\n .watch(`${parts.join('/')}/iobroker*`, {
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;wBAAmD;AACnD,kCAA6C;AAC7C,sBAAqB;AACrB,sBAAe;AACf,qBAAe;AACf,0BAAe;AACf,yBAA8B;AAN9B;AAQA,MAAMA,eAAU,kCAAc,YAAY,OAAO,YAAY,UAAU;AAEvE,MAAM,EAAE,kBAAiB,IAAK;AAUxB,MAAO,gBAAgB,6BAAU;EAClB,YAAY,oBAAI,IAAG;EAC5B,UAAU;EAElB,YAAY,SAA0B;AAClC,UAAM,OAAO;EACjB;EAQA,QAAQ,MAAa,QAA2B;AAC5C,UAAM,cAAc,KAAK;AACzB,UAAM,QAAQ,OAAO,SAAS,OAAO;AACrC,UAAM,QAAQ,OAAO,SAAS;AAE9B,UAAM,UAA0B;MAC5B,UAAU,KAAK,QAAQ;;AAG3B,UAAM,SAAS,gBAAAC,QAAG,aAAaD,SAAQ,QAAQ,kBAAiB,CAAE,CAAC;AACnE,UAAM,aAAS,4BAAAE,QAAY,OAAO,GAAG;AAErC,QAAI,WAAW,OAAO,YAAW;AACjC,QAAI,UAAU;AACV,UAAI,QAAQ,gBAAAD,QAAG,aAAa,QAAQ,EAAE,SAAS,OAAO,EAAE,MAAM,IAAI;AAClE,cAAQ,MAAM,OAAO,UAAQ,IAAI;AACjC,UAAI,MAAM,SAAS,OAAO;AACtB,cAAM,OAAO,GAAG,MAAM,SAAS,KAAK;MACxC;AACA,UAAI;AACJ,UAAI,aAAa;AAEb,gBAAQ,IAAI,OAAO,KAAK,gBAAgB;AACxC,gBAAQ,QAAQ;MACpB;AACA,YAAM,QAAQ,UAAO;AACjB,YAAI,SAAS,CAAC,MAAM,KAAK,IAAI,GAAG;AAC5B;QACJ;AACA,gBAAQ,IAAI,IAAI;MACpB,CAAC;AAED,UAAI,OAAO;AACP,mBAAW,SAAS,QAAQ,OAAO,GAAG;AACtC,cAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,cAAM,IAAG;AACT,wBAAAE,QACK,MAAM,GAAG,MAAM,KAAK,GAAG,eAAe,
|
|
4
|
+
"sourcesContent": ["import { CLICommand, type CLICommandOptions } from './cliCommand.js';\nimport { tools, logger as toolsLogger } from '@iobroker/js-controller-common';\nimport chokidar from 'chokidar';\nimport fs from 'fs-extra';\nimport os from 'node:os';\nimport es from 'event-stream';\nimport { createRequire } from 'node:module';\n// eslint-disable-next-line unicorn/prefer-module\nconst require = createRequire(import.meta.url || 'file://' + __filename);\n\nconst { getConfigFileName } = tools;\n\ninterface CLILogsOptions {\n /** Whether to show today's full log */\n complete?: boolean;\n /** An optional RegExp to filter by */\n regex?: RegExp;\n}\n\n/** Command ioBroker state ... */\nexport class CLILogs extends CLICommand {\n private readonly fileSizes = new Map<string, number>();\n private isReady = false;\n\n constructor(options: CLICommandOptions) {\n super(options);\n }\n\n /**\n * Executes a command\n *\n * @param args\n * @param params additional parsed CLI parameters\n */\n execute(args: any[], params: Record<string, any>): void {\n const adapterName = args[0];\n const watch = params.watch || params.w;\n const count = params.lines || 1_000;\n\n const options: CLILogsOptions = {\n complete: this.options.all\n };\n\n const config = fs.readJSONSync(require.resolve(getConfigFileName()));\n const logger = toolsLogger(config.log);\n /** @ts-expect-error todo adjust logger type */\n let fileName = logger.getFileName();\n if (fileName) {\n let lines = fs.readFileSync(fileName).toString('utf-8').split('\\n');\n lines = lines.filter(line => line);\n if (lines.length > count) {\n lines.splice(0, lines.length - count);\n }\n let regex: RegExp;\n if (adapterName) {\n //2019-03-02 13:26:54.698 - debug: iot.0 [ALEXA] Created ALEXA device: Bad.Hauptlicht.Aktor.STATE [\"turnOn\",\"turnOff\"]\n regex = new RegExp(`: ${adapterName}\\\\.`);\n options.regex = regex;\n }\n lines.forEach(line => {\n if (regex && !regex.test(line)) {\n return;\n }\n console.log(line);\n });\n\n if (watch) {\n fileName = fileName.replace(/\\\\/g, '/');\n const parts = fileName.split('/');\n parts.pop();\n chokidar\n .watch(`${parts.join('/')}/iobroker*`, {\n awaitWriteFinish: { stabilityThreshold: 500 },\n followSymlinks: false\n })\n .on('all', this.watchHandler.bind(this, options))\n .on('ready', () => (this.isReady = true));\n }\n } else {\n console.log('No log file found');\n }\n }\n\n /**\n * Called by chokidar when watched files change\n *\n * @param options some options\n * @param event The type of change\n * @param path Which path has changed\n * @param stats Information about the file\n */\n watchHandler(options: CLILogsOptions, event: string, path: string, stats: Record<string, any>): void {\n if (event === 'add' || !this.fileSizes.has(path)) {\n this.fileSizes.set(path, stats.size);\n if (stats.size > 0 && (this.isReady || (options.complete && this.isTodaysLogfile(path)))) {\n this.streamChange(path, 0, options);\n }\n } else if (event === 'change') {\n const oldFileSize = this.fileSizes.get(path)!;\n this.fileSizes.set(path, stats.size);\n if (this.isReady && stats.size > oldFileSize) {\n this.streamChange(path, oldFileSize, options);\n }\n } else if (event === 'unlink') {\n this.fileSizes.delete(path);\n }\n }\n\n /**\n * If the log file belongs to today\n *\n * @param path The log file path\n */\n isTodaysLogfile(path: string): boolean {\n const YYYYMMDDDate = new Date().toJSON().slice(0, 10);\n return path.includes(YYYYMMDDDate);\n }\n\n /**\n * Streams a portion of a file to the console\n *\n * @param path The file to stream\n * @param start The offset in bytes where to start\n * @param options some options\n */\n streamChange(path: string, start: number, options: CLILogsOptions): void {\n const input = fs.createReadStream(path, {\n encoding: 'utf8',\n start,\n autoClose: true\n });\n if (options.regex) {\n // Read the input line by line and only include the lines matching the filter\n input\n .pipe(es.split())\n .pipe(es.filterSync(line => options.regex!.test(line)))\n .pipe(es.mapSync((line: string) => line + os.EOL))\n .pipe(process.stdout);\n } else {\n // just pipe the input through\n tools.pipeLinewise(input, process.stdout);\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["require", "fs", "toolsLogger", "chokidar", "es", "os"]
|
|
7
7
|
}
|
|
@@ -363,7 +363,7 @@ class Users {
|
|
|
363
363
|
import_prompt.default.get(schema, (err, result) => {
|
|
364
364
|
this.checkPassword(result.username, result.password, (err2, res) => {
|
|
365
365
|
if (err2 || !res) {
|
|
366
|
-
return import_js_controller_common.tools.maybeCallbackWithError(callback, `Password for user "${result.username}" does not match${err2 ?
|
|
366
|
+
return import_js_controller_common.tools.maybeCallbackWithError(callback, `Password for user "${result.username}" does not match${err2 ? `: ${err2.message}` : ""}`);
|
|
367
367
|
} else {
|
|
368
368
|
return import_js_controller_common.tools.maybeCallbackWithError(callback, null);
|
|
369
369
|
}
|
|
@@ -386,7 +386,7 @@ class Users {
|
|
|
386
386
|
import_prompt.default.get(schema, (err, result) => {
|
|
387
387
|
this.checkPassword(username, result.password, (err2, res) => {
|
|
388
388
|
if (err2 || !res) {
|
|
389
|
-
return import_js_controller_common.tools.maybeCallbackWithError(callback, `Password for user "${username}" does not
|
|
389
|
+
return import_js_controller_common.tools.maybeCallbackWithError(callback, `Password for user "${username}" does not match${err2 ? `: ${err2.message}` : ""}`);
|
|
390
390
|
} else {
|
|
391
391
|
return import_js_controller_common.tools.maybeCallbackWithError(callback, null);
|
|
392
392
|
}
|
|
@@ -395,7 +395,7 @@ class Users {
|
|
|
395
395
|
} else {
|
|
396
396
|
this.checkPassword(username, password2, (err, res) => {
|
|
397
397
|
if (err || !res) {
|
|
398
|
-
return import_js_controller_common.tools.maybeCallbackWithError(callback,
|
|
398
|
+
return import_js_controller_common.tools.maybeCallbackWithError(callback, `Password for user "${username}" does not match${err ? `: ${err.message}` : ""}`);
|
|
399
399
|
} else {
|
|
400
400
|
return import_js_controller_common.tools.maybeCallbackWithError(callback, null);
|
|
401
401
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/setup/setupUsers.ts"],
|
|
4
|
-
"sourcesContent": ["import { password, tools, EXIT_CODES } from '@iobroker/js-controller-common';\nimport type { ProcessExitCallback } from '../_Types.js';\nimport type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';\nimport prompt from 'prompt';\n\nexport interface CLIUsersOptions {\n processExit: ProcessExitCallback;\n objects: ObjectsRedisClient;\n}\n\nexport class Users {\n private readonly objects: ObjectsRedisClient;\n private readonly processExit: ProcessExitCallback;\n\n constructor(options: CLIUsersOptions) {\n if (!options.objects) {\n throw new Error('Invalid arguments: objects is missing');\n }\n if (!options.processExit) {\n throw new Error('Invalid arguments: processExit is missing');\n }\n\n this.objects = options.objects;\n this.processExit = options.processExit;\n }\n\n /**\n * Adds new user to system\n *\n * @param username name of the user which will be added\n * @param pw password\n * @param callback\n */\n addUser(username: string, pw: string, callback: ioBroker.ErrorCallback): void {\n // user id's should be case insensitive\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n this.objects.getObject(`system.user.${_user}`, (err, obj) => {\n if (obj) {\n return tools.maybeCallbackWithError(callback, 'User yet exists');\n } else {\n this.objects.setObject(\n `system.user.${_user}`,\n {\n type: 'user',\n common: {\n name: username,\n enabled: true,\n password: ''\n },\n from: `system.host.${tools.getHostName()}.cli`,\n ts: Date.now(),\n native: {}\n },\n err => {\n if (!err) {\n this.setPassword(username, pw, callback);\n } else {\n return tools.maybeCallbackWithError(callback, err);\n }\n }\n );\n }\n });\n }\n\n /**\n * Checks if user exists\n *\n * @param username name of the user to check existence of\n */\n async isUser(username: string): Promise<boolean> {\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n let isExisting = false;\n try {\n isExisting = await this.objects.objectExists(`system.user.${_user}`);\n } catch {\n // ignore\n }\n\n return isExisting;\n }\n\n /**\n * Set password for specific user\n *\n * @param username name of the user to set password for\n * @param pw password\n * @param callback\n */\n setPassword(username: string, pw: string, callback: ioBroker.ErrorCallback): void {\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n\n this.objects.getObject(`system.user.${_user}`, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'User does not exist');\n }\n\n password(pw).hash(null, null, (err, res) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n }\n obj.common.password = res ?? '';\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n this.objects.setObject(`system.user.${_user}`, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n });\n });\n }\n\n /**\n * Checks if password is correct for given user\n *\n * @param username name of the user to check password\n * @param pw password\n * @param callback\n */\n checkPassword(username: string, pw: string, callback: (err?: Error | null, isOk?: boolean) => void): void {\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n\n this.objects.getObject(`system.user.${_user}`, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'User does not exist');\n }\n\n password(pw).check(obj.common.password, (err, res) => {\n return tools.maybeCallbackWithError(callback, err, res);\n });\n });\n }\n\n /**\n * Deletes user from system\n *\n * @param username name of the user to delete\n * @param callback\n */\n delUser(username: string, callback: ioBroker.ErrorCallback): void {\n if (!username) {\n return tools.maybeCallbackWithError(callback, 'Please define user name, like: \"userdel user\"');\n }\n\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n\n this.objects.getObject(`system.user.${_user}`, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'User does not exist');\n } else {\n if (obj.common.dontDelete) {\n return tools.maybeCallbackWithError(callback, 'Cannot delete user, while is system user');\n } else {\n this.objects.delObject('system.user.' + _user, err => {\n // Remove this user from all groups\n if (!err) {\n this.objects.getObjectList(\n { startkey: 'system.group.', endkey: 'system.group.\\u9999' },\n (err, groups) => {\n if (!groups) {\n return tools.maybeCallback(callback);\n }\n\n let count = 0;\n for (let i = 0; i < groups.rows.length; i++) {\n if (groups.rows[i].value.type !== 'group') {\n continue;\n }\n // find all groups\n if (\n groups.rows[i].value.common.members &&\n groups.rows[i].value.common.members.indexOf('system.user.' + _user) !== -1\n ) {\n const pos = groups.rows[i].value.common.members.indexOf(\n 'system.user.' + _user\n );\n groups.rows[i].value.common.members.splice(pos, 1);\n count++;\n groups.rows[i].value.from = 'system.host.' + tools.getHostName() + '.cli';\n groups.rows[i].value.ts = Date.now();\n this.objects.setObject(\n groups.rows[i].value._id,\n groups.rows[i].value,\n err => {\n if (!--count) {\n return tools.maybeCallbackWithError(callback, err);\n }\n }\n );\n }\n }\n if (!count) {\n return tools.maybeCallback(callback);\n }\n }\n );\n } else {\n return tools.maybeCallbackWithError(callback, err);\n }\n });\n }\n }\n });\n }\n\n /**\n * Adds user to given group\n *\n * @param username user which will be added to the group\n * @param groupName name of the group where the user will be added to\n * @param callback\n */\n addUserToGroup(username: string, groupName: string, callback: ioBroker.ErrorCallback): void {\n let _user = username.replace(/\\s/g, '_').toLowerCase();\n if (!groupName.startsWith('system.group.')) {\n groupName = `system.group.${groupName}`;\n }\n if (!_user.startsWith('system.user.')) {\n _user = `system.user.${_user}`;\n }\n\n this.objects.getObject(_user, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'User does not exist');\n }\n this.objects.getObject(groupName, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'Group does not exist');\n }\n obj.common = obj.common || {};\n obj.common.members = obj.common.members || [];\n\n if (obj.common.members.indexOf(_user) === -1) {\n obj.common.members.push(_user);\n obj.from = 'system.host.' + tools.getHostName() + '.cli';\n obj.ts = Date.now();\n this.objects.setObject(groupName, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n } else {\n return tools.maybeCallback(callback);\n }\n });\n });\n }\n\n /**\n * Add user via CLI prompt\n *\n * @param username user which sohuld be created\n * @param groupName default group for the new user\n * @param password user password\n * @param callback\n */\n addUserPrompt(username: string, groupName: string, password: string, callback: ioBroker.ErrorCallback): void {\n if (!username) {\n return tools.maybeCallbackWithError(callback, 'Please define user name, like: \"adduser newUser\"');\n }\n\n // Check group\n if (groupName.substring(0, 13) !== 'system.group.') {\n groupName = `system.group.${groupName}`;\n }\n\n this.objects.getObject(groupName, (err, obj) => {\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `Unknown group: ${groupName}`);\n }\n if (!password) {\n prompt.message = '';\n prompt.delimiter = '';\n const schema = {\n properties: {\n password: {\n description: 'Enter your password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: true\n },\n repeatPassword: {\n description: 'Repeat your password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: true\n }\n }\n };\n prompt.start();\n\n prompt.get(schema, (err, result) => {\n if (result) {\n if (result.password !== result.repeatPassword) {\n console.log('Passwords are not identical!');\n return void this.processExit(EXIT_CODES.INVALID_PASSWORD);\n }\n // @ts-expect-error external types problem?\n this.addUser(username, result.password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n this.addUserToGroup(username, groupName, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n return tools.maybeCallback(callback);\n }\n });\n }\n });\n } else {\n return tools.maybeCallbackWithError(callback, err);\n }\n });\n } else {\n this.addUser(username, password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n this.addUserToGroup(username, groupName, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n return tools.maybeCallback(callback);\n }\n });\n }\n });\n }\n });\n }\n\n /**\n * Set password of user\n *\n * @param username name of the user to set password for\n * @param password password of user\n * @param callback\n */\n async setUserPassword(username: string, password: string, callback: ioBroker.ErrorCallback): Promise<void> {\n if (!username) {\n return tools.maybeCallbackWithError(callback, 'Please define user name, like: \"passwd username\"');\n }\n\n const isExisting = await this.isUser(username);\n if (!isExisting) {\n return tools.maybeCallbackWithError(callback, `User \"${username}\" does not exist.`);\n } else {\n // Check group\n if (!password) {\n prompt.message = '';\n prompt.delimiter = '';\n const schema = {\n properties: {\n password: {\n description: 'Enter your password:',\n pattern: /^[^'\"]*$/,\n message: 'No \" are allowed',\n hidden: true\n },\n repeatPassword: {\n description: 'Repeat your password:',\n pattern: /^[^'\"]*$/,\n message: 'No \" are allowed',\n hidden: true\n }\n }\n };\n prompt.start();\n\n prompt.get(schema, (err, result) => {\n if (result) {\n if (result.password !== result.repeatPassword) {\n return tools.maybeCallbackWithError(callback, 'Passwords are not identical!');\n }\n // @ts-expect-error external types problem?\n this.setPassword(username, result.password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n return tools.maybeCallback(callback);\n }\n });\n } else {\n return tools.maybeCallbackWithError(callback, 'No password entered!');\n }\n });\n } else {\n this.setPassword(username, password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n return tools.maybeCallback(callback);\n }\n });\n }\n }\n }\n\n /**\n * Enable user\n *\n * @param username name of the user which will be activated\n * @param enable true if it should be enabled else false\n * @param callback\n */\n enableUser(username: string, enable: boolean, callback: ioBroker.ErrorCallback): void {\n if (!username) {\n return tools.maybeCallbackWithError(callback, 'Please define user name, like: \"enable username\"');\n }\n if (username.startsWith('system.user.')) {\n username = username.substring('system.user.'.length);\n }\n\n if (username === 'admin' && !enable) {\n return tools.maybeCallbackWithError(callback, 'User admin cannot be disabled');\n }\n\n this.objects.getObject(`system.user.${username}`, (err, obj) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, `Cannot read user: ${err.message}`);\n }\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `User \"${username}\" not found`);\n } else {\n obj.common.enabled = enable;\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n this.objects.setObject(obj._id, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n }\n });\n }\n\n /**\n * Check if user password is valid\n *\n * @param username name of the user to check password for\n * @param password password to check\n * @param callback\n */\n checkUserPassword(username: string, password: string, callback: ioBroker.ErrorCallback): void {\n let schema;\n if (!username && !password) {\n prompt.message = '';\n prompt.delimiter = '';\n schema = {\n properties: {\n username: {\n description: 'Enter username to check password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: false\n },\n password: {\n description: 'Enter current password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: true\n }\n }\n };\n prompt.start();\n\n prompt.get(schema, (err, result) => {\n this.checkPassword(result.username as string, result.password as string, (err, res) => {\n if (err || !res) {\n return tools.maybeCallbackWithError(\n callback,\n `Password for user \"${result.username as string}\" does not match${err ? ': ' + err : ''}`\n );\n } else {\n return tools.maybeCallbackWithError(callback, null);\n }\n });\n });\n } else if (!password) {\n prompt.message = '';\n prompt.delimiter = '';\n schema = {\n properties: {\n password: {\n description: 'Enter current password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: true\n }\n }\n };\n prompt.start();\n\n prompt.get(schema, (err, result) => {\n // @ts-expect-error external types problem?\n this.checkPassword(username, result.password, (err, res) => {\n if (err || !res) {\n return tools.maybeCallbackWithError(\n callback,\n `Password for user \"${username}\" does not matched${err ? ': ' + err : ''}`\n );\n } else {\n return tools.maybeCallbackWithError(callback, null);\n }\n });\n });\n } else {\n this.checkPassword(username, password, (err, res) => {\n if (err || !res) {\n return tools.maybeCallbackWithError(\n callback,\n 'Password for user \"' + username + '\" does not matched' + (err ? ': ' + err : '')\n );\n } else {\n return tools.maybeCallbackWithError(callback, null);\n }\n });\n }\n }\n\n /**\n * Get user object\n *\n * @param username name of the user to get object of\n * @param callback\n */\n getUser(username: string, callback: (err?: Error | null, enabled?: boolean) => void): void {\n this.objects.getObject(`system.user.${username}`, (err, obj) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, `Cannot read user: ${err.message}`);\n }\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `User \"${username}\" not found`);\n } else {\n return tools.maybeCallbackWithError(callback, null, obj.common.enabled);\n }\n });\n }\n\n /**\n * Get group object\n *\n * @param group groupname\n * @param callback\n */\n getGroup(group: string, callback: (err?: Error | null, enabled?: boolean, members?: string[]) => void): void {\n this.objects.getObject(`system.group.${group}`, (err, obj) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, `Cannot read group: ${err.message}`);\n }\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `Group \"${group}\" not found`);\n } else {\n return tools.maybeCallbackWithError(callback, null, obj.common.enabled, obj.common.members);\n }\n });\n }\n\n /**\n * Enable or disable group by name\n *\n * @param group groupname\n * @param enable if enable or disable\n * @param callback\n */\n enableGroup(group: string, enable: boolean, callback: ioBroker.ErrorCallback): void {\n if (!group) {\n return tools.maybeCallbackWithError(callback, 'Please define group name, like: \"enable groupname\"');\n }\n if (group.startsWith('system.group.')) {\n group = group.substring('system.group.'.length);\n }\n\n if (group === 'administrator' && !enable) {\n return tools.maybeCallbackWithError(callback, 'Group \"administrator\" cannot be disabled');\n }\n\n this.objects.getObject(`system.group.${group}`, (err, obj) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, `Cannot read group: ${err.message}`);\n }\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `Group \"${group}\" not found`);\n } else {\n obj.common.enabled = enable;\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n this.objects.setObject(obj._id, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n }\n });\n }\n\n /**\n * Add new group\n *\n * @param group groupname\n */\n async addGroup(group: string): Promise<void> {\n const _group = group.replace(/\\s/g, '_');\n const obj = await this.objects.getObject(`system.group.${_group}`);\n if (obj) {\n throw new Error('Group yet exists');\n } else {\n // TODO: shoudln't it have some default acl? TS is worrying\n await this.objects.setObject(`system.group.${_group}`, {\n type: 'group',\n common: {\n name: group,\n enabled: true,\n members: []\n },\n from: `system.host.${tools.getHostName()}.cli`,\n ts: Date.now(),\n native: {}\n } as any);\n }\n }\n\n /**\n * Remove group\n *\n * @param group groupname\n * @param callback\n */\n delGroup(group: string, callback: ioBroker.ErrorCallback): void {\n const _group = group.replace(/\\s/g, '_');\n\n if (group === 'administrator') {\n return tools.maybeCallbackWithError(callback, 'Group \"administrator\" cannot be deleted');\n } else {\n this.objects.getObject(`system.group.${_group}`, (err, obj) => {\n if (!obj) {\n return tools.maybeCallbackWithError(callback, 'Group does not exists');\n } else {\n this.objects.delObject(`system.group.${_group}`, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n }\n });\n }\n }\n\n /**\n * Remove user from given group\n *\n * @param username name of the user which will be removed from group\n * @param groupName name of the group user will be removed from\n * @param callback\n */\n removeUserFromGroup(username: string, groupName: string, callback: ioBroker.ErrorCallback): void {\n const _group = groupName.replace(/\\s/g, '_');\n this.objects.getObject(`system.group.${_group}`, (err, obj) => {\n if (!obj) {\n return tools.maybeCallbackWithError(callback, 'Group does not exists');\n } else {\n const pos = obj.common.members.indexOf(`system.user.${username}`);\n if (pos === -1) {\n return tools.maybeCallbackWithError(callback, 'User not in group');\n } else {\n obj.common.members.splice(pos, 1);\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n this.objects.setObject(obj._id, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n }\n }\n });\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { password, tools, EXIT_CODES } from '@iobroker/js-controller-common';\nimport type { ProcessExitCallback } from '../_Types.js';\nimport type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';\nimport prompt from 'prompt';\n\nexport interface CLIUsersOptions {\n processExit: ProcessExitCallback;\n objects: ObjectsRedisClient;\n}\n\n/** Return type of prompt.get() for user */\ntype UsernamePromptProps = { password: string; username: string };\n\nexport class Users {\n private readonly objects: ObjectsRedisClient;\n private readonly processExit: ProcessExitCallback;\n\n constructor(options: CLIUsersOptions) {\n if (!options.objects) {\n throw new Error('Invalid arguments: objects is missing');\n }\n if (!options.processExit) {\n throw new Error('Invalid arguments: processExit is missing');\n }\n\n this.objects = options.objects;\n this.processExit = options.processExit;\n }\n\n /**\n * Adds new user to system\n *\n * @param username name of the user which will be added\n * @param pw password\n * @param callback\n */\n addUser(username: string, pw: string, callback: ioBroker.ErrorCallback): void {\n // user id's should be case insensitive\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n this.objects.getObject(`system.user.${_user}`, (err, obj) => {\n if (obj) {\n return tools.maybeCallbackWithError(callback, 'User yet exists');\n } else {\n this.objects.setObject(\n `system.user.${_user}`,\n {\n type: 'user',\n common: {\n name: username,\n enabled: true,\n password: ''\n },\n from: `system.host.${tools.getHostName()}.cli`,\n ts: Date.now(),\n native: {}\n },\n err => {\n if (!err) {\n this.setPassword(username, pw, callback);\n } else {\n return tools.maybeCallbackWithError(callback, err);\n }\n }\n );\n }\n });\n }\n\n /**\n * Checks if user exists\n *\n * @param username name of the user to check existence of\n */\n async isUser(username: string): Promise<boolean> {\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n let isExisting = false;\n try {\n isExisting = await this.objects.objectExists(`system.user.${_user}`);\n } catch {\n // ignore\n }\n\n return isExisting;\n }\n\n /**\n * Set password for specific user\n *\n * @param username name of the user to set password for\n * @param pw password\n * @param callback\n */\n setPassword(username: string, pw: string, callback: ioBroker.ErrorCallback): void {\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n\n this.objects.getObject(`system.user.${_user}`, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'User does not exist');\n }\n\n password(pw).hash(null, null, (err, res) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n }\n obj.common.password = res ?? '';\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n this.objects.setObject(`system.user.${_user}`, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n });\n });\n }\n\n /**\n * Checks if password is correct for given user\n *\n * @param username name of the user to check password\n * @param pw password\n * @param callback\n */\n checkPassword(username: string, pw: string, callback: (err?: Error | null, isOk?: boolean) => void): void {\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n\n this.objects.getObject(`system.user.${_user}`, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'User does not exist');\n }\n\n password(pw).check(obj.common.password, (err, res) => {\n return tools.maybeCallbackWithError(callback, err, res);\n });\n });\n }\n\n /**\n * Deletes user from system\n *\n * @param username name of the user to delete\n * @param callback\n */\n delUser(username: string, callback: ioBroker.ErrorCallback): void {\n if (!username) {\n return tools.maybeCallbackWithError(callback, 'Please define user name, like: \"userdel user\"');\n }\n\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n\n this.objects.getObject(`system.user.${_user}`, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'User does not exist');\n } else {\n if (obj.common.dontDelete) {\n return tools.maybeCallbackWithError(callback, 'Cannot delete user, while is system user');\n } else {\n this.objects.delObject('system.user.' + _user, err => {\n // Remove this user from all groups\n if (!err) {\n this.objects.getObjectList(\n { startkey: 'system.group.', endkey: 'system.group.\\u9999' },\n (err, groups) => {\n if (!groups) {\n return tools.maybeCallback(callback);\n }\n\n let count = 0;\n for (let i = 0; i < groups.rows.length; i++) {\n if (groups.rows[i].value.type !== 'group') {\n continue;\n }\n // find all groups\n if (\n groups.rows[i].value.common.members &&\n groups.rows[i].value.common.members.indexOf('system.user.' + _user) !== -1\n ) {\n const pos = groups.rows[i].value.common.members.indexOf(\n 'system.user.' + _user\n );\n groups.rows[i].value.common.members.splice(pos, 1);\n count++;\n groups.rows[i].value.from = 'system.host.' + tools.getHostName() + '.cli';\n groups.rows[i].value.ts = Date.now();\n this.objects.setObject(\n groups.rows[i].value._id,\n groups.rows[i].value,\n err => {\n if (!--count) {\n return tools.maybeCallbackWithError(callback, err);\n }\n }\n );\n }\n }\n if (!count) {\n return tools.maybeCallback(callback);\n }\n }\n );\n } else {\n return tools.maybeCallbackWithError(callback, err);\n }\n });\n }\n }\n });\n }\n\n /**\n * Adds user to given group\n *\n * @param username user which will be added to the group\n * @param groupName name of the group where the user will be added to\n * @param callback\n */\n addUserToGroup(username: string, groupName: string, callback: ioBroker.ErrorCallback): void {\n let _user = username.replace(/\\s/g, '_').toLowerCase();\n if (!groupName.startsWith('system.group.')) {\n groupName = `system.group.${groupName}`;\n }\n if (!_user.startsWith('system.user.')) {\n _user = `system.user.${_user}`;\n }\n\n this.objects.getObject(_user, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'User does not exist');\n }\n this.objects.getObject(groupName, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'Group does not exist');\n }\n obj.common = obj.common || {};\n obj.common.members = obj.common.members || [];\n\n if (obj.common.members.indexOf(_user) === -1) {\n obj.common.members.push(_user);\n obj.from = 'system.host.' + tools.getHostName() + '.cli';\n obj.ts = Date.now();\n this.objects.setObject(groupName, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n } else {\n return tools.maybeCallback(callback);\n }\n });\n });\n }\n\n /**\n * Add user via CLI prompt\n *\n * @param username user which sohuld be created\n * @param groupName default group for the new user\n * @param password user password\n * @param callback\n */\n addUserPrompt(username: string, groupName: string, password: string, callback: ioBroker.ErrorCallback): void {\n if (!username) {\n return tools.maybeCallbackWithError(callback, 'Please define user name, like: \"adduser newUser\"');\n }\n\n // Check group\n if (groupName.substring(0, 13) !== 'system.group.') {\n groupName = `system.group.${groupName}`;\n }\n\n this.objects.getObject(groupName, (err, obj) => {\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `Unknown group: ${groupName}`);\n }\n if (!password) {\n prompt.message = '';\n prompt.delimiter = '';\n const schema = {\n properties: {\n password: {\n description: 'Enter your password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: true\n },\n repeatPassword: {\n description: 'Repeat your password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: true\n }\n }\n };\n prompt.start();\n\n prompt.get(schema, (err, result) => {\n if (result) {\n if (result.password !== result.repeatPassword) {\n console.log('Passwords are not identical!');\n return void this.processExit(EXIT_CODES.INVALID_PASSWORD);\n }\n // @ts-expect-error external types problem?\n this.addUser(username, result.password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n this.addUserToGroup(username, groupName, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n return tools.maybeCallback(callback);\n }\n });\n }\n });\n } else {\n return tools.maybeCallbackWithError(callback, err);\n }\n });\n } else {\n this.addUser(username, password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n this.addUserToGroup(username, groupName, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n return tools.maybeCallback(callback);\n }\n });\n }\n });\n }\n });\n }\n\n /**\n * Set password of user\n *\n * @param username name of the user to set password for\n * @param password password of user\n * @param callback\n */\n async setUserPassword(username: string, password: string, callback: ioBroker.ErrorCallback): Promise<void> {\n if (!username) {\n return tools.maybeCallbackWithError(callback, 'Please define user name, like: \"passwd username\"');\n }\n\n const isExisting = await this.isUser(username);\n if (!isExisting) {\n return tools.maybeCallbackWithError(callback, `User \"${username}\" does not exist.`);\n } else {\n // Check group\n if (!password) {\n prompt.message = '';\n prompt.delimiter = '';\n const schema = {\n properties: {\n password: {\n description: 'Enter your password:',\n pattern: /^[^'\"]*$/,\n message: 'No \" are allowed',\n hidden: true\n },\n repeatPassword: {\n description: 'Repeat your password:',\n pattern: /^[^'\"]*$/,\n message: 'No \" are allowed',\n hidden: true\n }\n }\n };\n prompt.start();\n\n prompt.get(schema, (err, result) => {\n if (result) {\n if (result.password !== result.repeatPassword) {\n return tools.maybeCallbackWithError(callback, 'Passwords are not identical!');\n }\n // @ts-expect-error external types problem?\n this.setPassword(username, result.password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n return tools.maybeCallback(callback);\n }\n });\n } else {\n return tools.maybeCallbackWithError(callback, 'No password entered!');\n }\n });\n } else {\n this.setPassword(username, password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n return tools.maybeCallback(callback);\n }\n });\n }\n }\n }\n\n /**\n * Enable user\n *\n * @param username name of the user which will be activated\n * @param enable true if it should be enabled else false\n * @param callback\n */\n enableUser(username: string, enable: boolean, callback: ioBroker.ErrorCallback): void {\n if (!username) {\n return tools.maybeCallbackWithError(callback, 'Please define user name, like: \"enable username\"');\n }\n if (username.startsWith('system.user.')) {\n username = username.substring('system.user.'.length);\n }\n\n if (username === 'admin' && !enable) {\n return tools.maybeCallbackWithError(callback, 'User admin cannot be disabled');\n }\n\n this.objects.getObject(`system.user.${username}`, (err, obj) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, `Cannot read user: ${err.message}`);\n }\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `User \"${username}\" not found`);\n } else {\n obj.common.enabled = enable;\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n this.objects.setObject(obj._id, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n }\n });\n }\n\n /**\n * Check if user password is valid\n *\n * @param username name of the user to check password for\n * @param password password to check\n * @param callback\n */\n checkUserPassword(username: string, password: string, callback: ioBroker.ErrorCallback): void {\n let schema;\n if (!username && !password) {\n prompt.message = '';\n prompt.delimiter = '';\n schema = {\n properties: {\n username: {\n description: 'Enter username to check password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: false\n },\n password: {\n description: 'Enter current password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: true\n }\n }\n };\n prompt.start();\n\n prompt.get<UsernamePromptProps>(schema, (err, result) => {\n this.checkPassword(result.username, result.password, (err, res) => {\n if (err || !res) {\n return tools.maybeCallbackWithError(\n callback,\n `Password for user \"${result.username as string}\" does not match${err ? `: ${err.message}` : ''}`\n );\n } else {\n return tools.maybeCallbackWithError(callback, null);\n }\n });\n });\n } else if (!password) {\n prompt.message = '';\n prompt.delimiter = '';\n schema = {\n properties: {\n password: {\n description: 'Enter current password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: true\n }\n }\n };\n prompt.start();\n\n prompt.get<UsernamePromptProps>(schema, (err, result) => {\n this.checkPassword(username, result.password, (err, res) => {\n if (err || !res) {\n return tools.maybeCallbackWithError(\n callback,\n `Password for user \"${username}\" does not match${err ? `: ${err.message}` : ''}`\n );\n } else {\n return tools.maybeCallbackWithError(callback, null);\n }\n });\n });\n } else {\n this.checkPassword(username, password, (err, res) => {\n if (err || !res) {\n return tools.maybeCallbackWithError(\n callback,\n `Password for user \"${username}\" does not match${err ? `: ${err.message}` : ''}`\n );\n } else {\n return tools.maybeCallbackWithError(callback, null);\n }\n });\n }\n }\n\n /**\n * Get user object\n *\n * @param username name of the user to get object of\n * @param callback\n */\n getUser(username: string, callback: (err?: Error | null, enabled?: boolean) => void): void {\n this.objects.getObject(`system.user.${username}`, (err, obj) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, `Cannot read user: ${err.message}`);\n }\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `User \"${username}\" not found`);\n } else {\n return tools.maybeCallbackWithError(callback, null, obj.common.enabled);\n }\n });\n }\n\n /**\n * Get group object\n *\n * @param group groupname\n * @param callback\n */\n getGroup(group: string, callback: (err?: Error | null, enabled?: boolean, members?: string[]) => void): void {\n this.objects.getObject(`system.group.${group}`, (err, obj) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, `Cannot read group: ${err.message}`);\n }\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `Group \"${group}\" not found`);\n } else {\n return tools.maybeCallbackWithError(callback, null, obj.common.enabled, obj.common.members);\n }\n });\n }\n\n /**\n * Enable or disable group by name\n *\n * @param group groupname\n * @param enable if enable or disable\n * @param callback\n */\n enableGroup(group: string, enable: boolean, callback: ioBroker.ErrorCallback): void {\n if (!group) {\n return tools.maybeCallbackWithError(callback, 'Please define group name, like: \"enable groupname\"');\n }\n if (group.startsWith('system.group.')) {\n group = group.substring('system.group.'.length);\n }\n\n if (group === 'administrator' && !enable) {\n return tools.maybeCallbackWithError(callback, 'Group \"administrator\" cannot be disabled');\n }\n\n this.objects.getObject(`system.group.${group}`, (err, obj) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, `Cannot read group: ${err.message}`);\n }\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `Group \"${group}\" not found`);\n } else {\n obj.common.enabled = enable;\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n this.objects.setObject(obj._id, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n }\n });\n }\n\n /**\n * Add new group\n *\n * @param group groupname\n */\n async addGroup(group: string): Promise<void> {\n const _group = group.replace(/\\s/g, '_');\n const obj = await this.objects.getObject(`system.group.${_group}`);\n if (obj) {\n throw new Error('Group yet exists');\n } else {\n // TODO: shoudln't it have some default acl? TS is worrying\n await this.objects.setObject(`system.group.${_group}`, {\n type: 'group',\n common: {\n name: group,\n enabled: true,\n members: []\n },\n from: `system.host.${tools.getHostName()}.cli`,\n ts: Date.now(),\n native: {}\n } as any);\n }\n }\n\n /**\n * Remove group\n *\n * @param group groupname\n * @param callback\n */\n delGroup(group: string, callback: ioBroker.ErrorCallback): void {\n const _group = group.replace(/\\s/g, '_');\n\n if (group === 'administrator') {\n return tools.maybeCallbackWithError(callback, 'Group \"administrator\" cannot be deleted');\n } else {\n this.objects.getObject(`system.group.${_group}`, (err, obj) => {\n if (!obj) {\n return tools.maybeCallbackWithError(callback, 'Group does not exists');\n } else {\n this.objects.delObject(`system.group.${_group}`, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n }\n });\n }\n }\n\n /**\n * Remove user from given group\n *\n * @param username name of the user which will be removed from group\n * @param groupName name of the group user will be removed from\n * @param callback\n */\n removeUserFromGroup(username: string, groupName: string, callback: ioBroker.ErrorCallback): void {\n const _group = groupName.replace(/\\s/g, '_');\n this.objects.getObject(`system.group.${_group}`, (err, obj) => {\n if (!obj) {\n return tools.maybeCallbackWithError(callback, 'Group does not exists');\n } else {\n const pos = obj.common.members.indexOf(`system.user.${username}`);\n if (pos === -1) {\n return tools.maybeCallbackWithError(callback, 'User not in group');\n } else {\n obj.common.members.splice(pos, 1);\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n this.objects.setObject(obj._id, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n }\n }\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["err", "obj", "password", "prompt"]
|
|
7
7
|
}
|
package/build/cjs/lib/setup.js
CHANGED
|
@@ -1382,7 +1382,7 @@ ${import_js_controller_common.tools.appName} upload /file/picture.png /vis-2.0/m
|
|
|
1382
1382
|
} else if (command2 === "check") {
|
|
1383
1383
|
users.checkUserPassword(user, password, (err) => {
|
|
1384
1384
|
if (err) {
|
|
1385
|
-
console.error(err);
|
|
1385
|
+
console.error(err.message);
|
|
1386
1386
|
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1387
1387
|
} else {
|
|
1388
1388
|
console.log(`Password for user "${user}" matches.`);
|
|
@@ -1392,7 +1392,7 @@ ${import_js_controller_common.tools.appName} upload /file/picture.png /vis-2.0/m
|
|
|
1392
1392
|
} else if (command2 === "set" || command2 === "passwd") {
|
|
1393
1393
|
users.setUserPassword(user, password, (err) => {
|
|
1394
1394
|
if (err) {
|
|
1395
|
-
console.error(err);
|
|
1395
|
+
console.error(err.message);
|
|
1396
1396
|
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1397
1397
|
} else {
|
|
1398
1398
|
console.log(`Password for "${user}" was successfully set.`);
|
|
@@ -1402,7 +1402,7 @@ ${import_js_controller_common.tools.appName} upload /file/picture.png /vis-2.0/m
|
|
|
1402
1402
|
} else if (command2 === "enable" || command2 === "e") {
|
|
1403
1403
|
users.enableUser(user, true, (err) => {
|
|
1404
1404
|
if (err) {
|
|
1405
|
-
console.error(err);
|
|
1405
|
+
console.error(err.message);
|
|
1406
1406
|
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1407
1407
|
} else {
|
|
1408
1408
|
console.log(`User "${user}" was successfully enabled.`);
|
|
@@ -1412,7 +1412,7 @@ ${import_js_controller_common.tools.appName} upload /file/picture.png /vis-2.0/m
|
|
|
1412
1412
|
} else if (command2 === "disable" || command2 === "d") {
|
|
1413
1413
|
users.enableUser(user, false, (err) => {
|
|
1414
1414
|
if (err) {
|
|
1415
|
-
console.error(err);
|
|
1415
|
+
console.error(err.message);
|
|
1416
1416
|
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1417
1417
|
} else {
|
|
1418
1418
|
console.log(`User "${user}" was successfully disabled.`);
|
|
@@ -1422,7 +1422,7 @@ ${import_js_controller_common.tools.appName} upload /file/picture.png /vis-2.0/m
|
|
|
1422
1422
|
} else if (command2 === "get") {
|
|
1423
1423
|
users.getUser(user, (err, isEnabled) => {
|
|
1424
1424
|
if (err) {
|
|
1425
|
-
console.error(err);
|
|
1425
|
+
console.error(err.message);
|
|
1426
1426
|
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1427
1427
|
} else {
|
|
1428
1428
|
console.log(`User "${user}" is ${isEnabled ? "enabled" : "disabled"}`);
|