@iobroker/js-controller-cli 7.2.3 → 8.0.0-alpha.2-20260923-99da17fcc

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.
Files changed (225) hide show
  1. package/build/cjs/index.js +3 -3
  2. package/build/cjs/lib/_Types.d.ts +8 -1
  3. package/build/cjs/lib/cli/cliCert.d.ts +7 -4
  4. package/build/cjs/lib/cli/cliCert.js +10 -6
  5. package/build/cjs/lib/cli/cliCert.js.map +2 -2
  6. package/build/cjs/lib/cli/cliCommand.d.ts +63 -15
  7. package/build/cjs/lib/cli/cliCommand.js +8 -1
  8. package/build/cjs/lib/cli/cliCommand.js.map +2 -2
  9. package/build/cjs/lib/cli/cliCompact.d.ts +5 -2
  10. package/build/cjs/lib/cli/cliCompact.js +9 -2
  11. package/build/cjs/lib/cli/cliCompact.js.map +2 -2
  12. package/build/cjs/lib/cli/cliDebug.d.ts +5 -2
  13. package/build/cjs/lib/cli/cliDebug.js +8 -1
  14. package/build/cjs/lib/cli/cliDebug.js.map +2 -2
  15. package/build/cjs/lib/cli/cliHost.d.ts +13 -10
  16. package/build/cjs/lib/cli/cliHost.js +13 -5
  17. package/build/cjs/lib/cli/cliHost.js.map +2 -2
  18. package/build/cjs/lib/cli/cliLogs.d.ts +9 -3
  19. package/build/cjs/lib/cli/cliLogs.js +12 -1
  20. package/build/cjs/lib/cli/cliLogs.js.map +2 -2
  21. package/build/cjs/lib/cli/cliMessage.d.ts +2 -1
  22. package/build/cjs/lib/cli/cliMessage.js +5 -0
  23. package/build/cjs/lib/cli/cliMessage.js.map +2 -2
  24. package/build/cjs/lib/cli/cliObjects.d.ts +21 -18
  25. package/build/cjs/lib/cli/cliObjects.js +51 -33
  26. package/build/cjs/lib/cli/cliObjects.js.map +2 -2
  27. package/build/cjs/lib/cli/cliPlugin.d.ts +3 -3
  28. package/build/cjs/lib/cli/cliPlugin.js +6 -0
  29. package/build/cjs/lib/cli/cliPlugin.js.map +2 -2
  30. package/build/cjs/lib/cli/cliProcess.d.ts +17 -7
  31. package/build/cjs/lib/cli/cliProcess.js +77 -24
  32. package/build/cjs/lib/cli/cliProcess.js.map +3 -3
  33. package/build/cjs/lib/cli/cliStates.d.ts +7 -4
  34. package/build/cjs/lib/cli/cliStates.js +14 -6
  35. package/build/cjs/lib/cli/cliStates.js.map +2 -2
  36. package/build/cjs/lib/cli/cliTools.js +11 -0
  37. package/build/cjs/lib/cli/cliTools.js.map +1 -1
  38. package/build/cjs/lib/cli/messages.js +47 -46
  39. package/build/cjs/lib/cli/messages.js.map +1 -1
  40. package/build/cjs/lib/progressBar.d.ts +59 -0
  41. package/build/cjs/lib/progressBar.js +115 -0
  42. package/build/cjs/lib/progressBar.js.map +7 -0
  43. package/build/cjs/lib/setup/customError.d.ts +4 -0
  44. package/build/cjs/lib/setup/customError.js +7 -0
  45. package/build/cjs/lib/setup/customError.js.map +2 -2
  46. package/build/cjs/lib/setup/dbConnection.js +69 -64
  47. package/build/cjs/lib/setup/dbConnection.js.map +3 -3
  48. package/build/cjs/lib/setup/formatters.d.ts +4 -4
  49. package/build/cjs/lib/setup/formatters.js +5 -0
  50. package/build/cjs/lib/setup/formatters.js.map +2 -2
  51. package/build/cjs/lib/setup/multihostClient.js +6 -2
  52. package/build/cjs/lib/setup/multihostClient.js.map +1 -1
  53. package/build/cjs/lib/setup/pluginInfos.d.ts +5 -0
  54. package/build/cjs/lib/setup/pluginInfos.js +2 -0
  55. package/build/cjs/lib/setup/pluginInfos.js.map +2 -2
  56. package/build/cjs/lib/setup/setupBackup.d.ts +53 -0
  57. package/build/cjs/lib/setup/setupBackup.js +125 -14
  58. package/build/cjs/lib/setup/setupBackup.js.map +3 -3
  59. package/build/cjs/lib/setup/setupInstall.d.ts +66 -15
  60. package/build/cjs/lib/setup/setupInstall.js +282 -28
  61. package/build/cjs/lib/setup/setupInstall.js.map +2 -2
  62. package/build/cjs/lib/setup/setupLicense.d.ts +13 -0
  63. package/build/cjs/lib/setup/setupLicense.js +33 -2
  64. package/build/cjs/lib/setup/setupLicense.js.map +2 -2
  65. package/build/cjs/lib/setup/setupList.d.ts +55 -1
  66. package/build/cjs/lib/setup/setupList.js +78 -24
  67. package/build/cjs/lib/setup/setupList.js.map +3 -3
  68. package/build/cjs/lib/setup/setupMultihost.d.ts +7 -0
  69. package/build/cjs/lib/setup/setupMultihost.js +78 -11
  70. package/build/cjs/lib/setup/setupMultihost.js.map +3 -3
  71. package/build/cjs/lib/setup/setupPacketManager.d.ts +10 -0
  72. package/build/cjs/lib/setup/setupPacketManager.js +16 -6
  73. package/build/cjs/lib/setup/setupPacketManager.js.map +2 -2
  74. package/build/cjs/lib/setup/setupRepo.d.ts +19 -0
  75. package/build/cjs/lib/setup/setupRepo.js +141 -13
  76. package/build/cjs/lib/setup/setupRepo.js.map +2 -2
  77. package/build/cjs/lib/setup/setupSetup.d.ts +34 -0
  78. package/build/cjs/lib/setup/setupSetup.js +209 -35
  79. package/build/cjs/lib/setup/setupSetup.js.map +3 -3
  80. package/build/cjs/lib/setup/setupUpgrade.d.ts +13 -2
  81. package/build/cjs/lib/setup/setupUpgrade.js +72 -12
  82. package/build/cjs/lib/setup/setupUpgrade.js.map +2 -2
  83. package/build/cjs/lib/setup/setupUpload.d.ts +77 -1
  84. package/build/cjs/lib/setup/setupUpload.js +152 -9
  85. package/build/cjs/lib/setup/setupUpload.js.map +2 -2
  86. package/build/cjs/lib/setup/setupUsers.d.ts +44 -14
  87. package/build/cjs/lib/setup/setupUsers.js +330 -17
  88. package/build/cjs/lib/setup/setupUsers.js.map +2 -2
  89. package/build/cjs/lib/setup/setupVendor.d.ts +14 -1
  90. package/build/cjs/lib/setup/setupVendor.js +40 -8
  91. package/build/cjs/lib/setup/setupVendor.js.map +2 -2
  92. package/build/cjs/lib/setup/setupVisDebug.d.ts +16 -2
  93. package/build/cjs/lib/setup/setupVisDebug.js +41 -17
  94. package/build/cjs/lib/setup/setupVisDebug.js.map +3 -3
  95. package/build/cjs/lib/setup/utils.d.ts +1 -1
  96. package/build/cjs/lib/setup/utils.js +13 -9
  97. package/build/cjs/lib/setup/utils.js.map +3 -3
  98. package/build/cjs/lib/setup.d.ts +1 -1
  99. package/build/cjs/lib/setup.js +858 -1758
  100. package/build/cjs/lib/setup.js.map +3 -3
  101. package/build/esm/lib/_Types.d.ts +8 -1
  102. package/build/esm/lib/_Types.d.ts.map +1 -1
  103. package/build/esm/lib/cli/cliCert.d.ts +7 -4
  104. package/build/esm/lib/cli/cliCert.d.ts.map +1 -1
  105. package/build/esm/lib/cli/cliCert.js +6 -6
  106. package/build/esm/lib/cli/cliCert.js.map +1 -1
  107. package/build/esm/lib/cli/cliCommand.d.ts +63 -15
  108. package/build/esm/lib/cli/cliCommand.d.ts.map +1 -1
  109. package/build/esm/lib/cli/cliCommand.js +4 -1
  110. package/build/esm/lib/cli/cliCommand.js.map +1 -1
  111. package/build/esm/lib/cli/cliCompact.d.ts +5 -2
  112. package/build/esm/lib/cli/cliCompact.d.ts.map +1 -1
  113. package/build/esm/lib/cli/cliCompact.js +5 -2
  114. package/build/esm/lib/cli/cliCompact.js.map +1 -1
  115. package/build/esm/lib/cli/cliDebug.d.ts +5 -2
  116. package/build/esm/lib/cli/cliDebug.d.ts.map +1 -1
  117. package/build/esm/lib/cli/cliDebug.js +4 -1
  118. package/build/esm/lib/cli/cliDebug.js.map +1 -1
  119. package/build/esm/lib/cli/cliHost.d.ts +13 -10
  120. package/build/esm/lib/cli/cliHost.d.ts.map +1 -1
  121. package/build/esm/lib/cli/cliHost.js +8 -5
  122. package/build/esm/lib/cli/cliHost.js.map +1 -1
  123. package/build/esm/lib/cli/cliLogs.d.ts +9 -3
  124. package/build/esm/lib/cli/cliLogs.d.ts.map +1 -1
  125. package/build/esm/lib/cli/cliLogs.js +8 -1
  126. package/build/esm/lib/cli/cliLogs.js.map +1 -1
  127. package/build/esm/lib/cli/cliMessage.d.ts +2 -1
  128. package/build/esm/lib/cli/cliMessage.d.ts.map +1 -1
  129. package/build/esm/lib/cli/cliMessage.js +1 -0
  130. package/build/esm/lib/cli/cliMessage.js.map +1 -1
  131. package/build/esm/lib/cli/cliObjects.d.ts +21 -18
  132. package/build/esm/lib/cli/cliObjects.d.ts.map +1 -1
  133. package/build/esm/lib/cli/cliObjects.js +44 -38
  134. package/build/esm/lib/cli/cliObjects.js.map +1 -1
  135. package/build/esm/lib/cli/cliPlugin.d.ts +3 -3
  136. package/build/esm/lib/cli/cliPlugin.d.ts.map +1 -1
  137. package/build/esm/lib/cli/cliPlugin.js +1 -1
  138. package/build/esm/lib/cli/cliPlugin.js.map +1 -1
  139. package/build/esm/lib/cli/cliProcess.d.ts +17 -7
  140. package/build/esm/lib/cli/cliProcess.d.ts.map +1 -1
  141. package/build/esm/lib/cli/cliProcess.js +73 -12
  142. package/build/esm/lib/cli/cliProcess.js.map +1 -1
  143. package/build/esm/lib/cli/cliStates.d.ts +7 -4
  144. package/build/esm/lib/cli/cliStates.d.ts.map +1 -1
  145. package/build/esm/lib/cli/cliStates.js +6 -2
  146. package/build/esm/lib/cli/cliStates.js.map +1 -1
  147. package/build/esm/lib/progressBar.d.ts +59 -0
  148. package/build/esm/lib/progressBar.d.ts.map +1 -0
  149. package/build/esm/lib/progressBar.js +104 -0
  150. package/build/esm/lib/progressBar.js.map +1 -0
  151. package/build/esm/lib/setup/customError.d.ts +4 -0
  152. package/build/esm/lib/setup/customError.d.ts.map +1 -1
  153. package/build/esm/lib/setup/customError.js +3 -0
  154. package/build/esm/lib/setup/customError.js.map +1 -1
  155. package/build/esm/lib/setup/dbConnection.d.ts.map +1 -1
  156. package/build/esm/lib/setup/dbConnection.js +10 -13
  157. package/build/esm/lib/setup/dbConnection.js.map +1 -1
  158. package/build/esm/lib/setup/formatters.d.ts +4 -4
  159. package/build/esm/lib/setup/formatters.js +4 -4
  160. package/build/esm/lib/setup/pluginInfos.d.ts +5 -0
  161. package/build/esm/lib/setup/pluginInfos.d.ts.map +1 -1
  162. package/build/esm/lib/setup/pluginInfos.js +5 -0
  163. package/build/esm/lib/setup/pluginInfos.js.map +1 -1
  164. package/build/esm/lib/setup/setupBackup.d.ts +53 -0
  165. package/build/esm/lib/setup/setupBackup.d.ts.map +1 -1
  166. package/build/esm/lib/setup/setupBackup.js +132 -13
  167. package/build/esm/lib/setup/setupBackup.js.map +1 -1
  168. package/build/esm/lib/setup/setupInstall.d.ts +66 -15
  169. package/build/esm/lib/setup/setupInstall.d.ts.map +1 -1
  170. package/build/esm/lib/setup/setupInstall.js +309 -23
  171. package/build/esm/lib/setup/setupInstall.js.map +1 -1
  172. package/build/esm/lib/setup/setupLicense.d.ts +13 -0
  173. package/build/esm/lib/setup/setupLicense.d.ts.map +1 -1
  174. package/build/esm/lib/setup/setupLicense.js +31 -1
  175. package/build/esm/lib/setup/setupLicense.js.map +1 -1
  176. package/build/esm/lib/setup/setupList.d.ts +55 -1
  177. package/build/esm/lib/setup/setupList.d.ts.map +1 -1
  178. package/build/esm/lib/setup/setupList.js +61 -8
  179. package/build/esm/lib/setup/setupList.js.map +1 -1
  180. package/build/esm/lib/setup/setupMultihost.d.ts +7 -0
  181. package/build/esm/lib/setup/setupMultihost.d.ts.map +1 -1
  182. package/build/esm/lib/setup/setupMultihost.js +85 -6
  183. package/build/esm/lib/setup/setupMultihost.js.map +1 -1
  184. package/build/esm/lib/setup/setupPacketManager.d.ts +10 -0
  185. package/build/esm/lib/setup/setupPacketManager.d.ts.map +1 -1
  186. package/build/esm/lib/setup/setupPacketManager.js +9 -0
  187. package/build/esm/lib/setup/setupPacketManager.js.map +1 -1
  188. package/build/esm/lib/setup/setupRepo.d.ts +19 -0
  189. package/build/esm/lib/setup/setupRepo.d.ts.map +1 -1
  190. package/build/esm/lib/setup/setupRepo.js +164 -14
  191. package/build/esm/lib/setup/setupRepo.js.map +1 -1
  192. package/build/esm/lib/setup/setupSetup.d.ts +34 -0
  193. package/build/esm/lib/setup/setupSetup.d.ts.map +1 -1
  194. package/build/esm/lib/setup/setupSetup.js +218 -21
  195. package/build/esm/lib/setup/setupSetup.js.map +1 -1
  196. package/build/esm/lib/setup/setupUpgrade.d.ts +13 -2
  197. package/build/esm/lib/setup/setupUpgrade.d.ts.map +1 -1
  198. package/build/esm/lib/setup/setupUpgrade.js +70 -6
  199. package/build/esm/lib/setup/setupUpgrade.js.map +1 -1
  200. package/build/esm/lib/setup/setupUpload.d.ts +77 -1
  201. package/build/esm/lib/setup/setupUpload.d.ts.map +1 -1
  202. package/build/esm/lib/setup/setupUpload.js +164 -7
  203. package/build/esm/lib/setup/setupUpload.js.map +1 -1
  204. package/build/esm/lib/setup/setupUsers.d.ts +44 -14
  205. package/build/esm/lib/setup/setupUsers.d.ts.map +1 -1
  206. package/build/esm/lib/setup/setupUsers.js +346 -14
  207. package/build/esm/lib/setup/setupUsers.js.map +1 -1
  208. package/build/esm/lib/setup/setupVendor.d.ts +14 -1
  209. package/build/esm/lib/setup/setupVendor.d.ts.map +1 -1
  210. package/build/esm/lib/setup/setupVendor.js +33 -2
  211. package/build/esm/lib/setup/setupVendor.js.map +1 -1
  212. package/build/esm/lib/setup/setupVisDebug.d.ts +16 -2
  213. package/build/esm/lib/setup/setupVisDebug.d.ts.map +1 -1
  214. package/build/esm/lib/setup/setupVisDebug.js +39 -14
  215. package/build/esm/lib/setup/setupVisDebug.js.map +1 -1
  216. package/build/esm/lib/setup/utils.d.ts +1 -1
  217. package/build/esm/lib/setup/utils.d.ts.map +1 -1
  218. package/build/esm/lib/setup/utils.js +2 -4
  219. package/build/esm/lib/setup/utils.js.map +1 -1
  220. package/build/esm/lib/setup.d.ts +1 -1
  221. package/build/esm/lib/setup.d.ts.map +1 -1
  222. package/build/esm/lib/setup.js +959 -1910
  223. package/build/esm/lib/setup.js.map +1 -1
  224. package/build/tsconfig.build.tsbuildinfo +1 -1
  225. package/package.json +14 -14
@@ -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\n/** Map a prompt.Schema to properties of type string */\ntype SchemaPropsToString<TSchema extends prompt.Schema> = { [Property in keyof TSchema['properties']]: 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 }\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 * 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 }\n if (obj.common.dontDelete) {\n return tools.maybeCallbackWithError(callback, 'Cannot delete user, while is system user');\n }\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(`system.user.${_user}`);\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(groups.rows[i].value._id, groups.rows[i].value, err => {\n if (!--count) {\n return tools.maybeCallbackWithError(callback, err);\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 * 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 } as const satisfies prompt.Schema;\n prompt.start();\n\n prompt.get<SchemaPropsToString<typeof schema>>(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\n this.addUser(username, result.password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n }\n this.addUserToGroup(username, groupName, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n }\n return tools.maybeCallback(callback);\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 }\n this.addUserToGroup(username, groupName, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n }\n return tools.maybeCallback(callback);\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 }\n // Check a 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 } as const satisfies prompt.Schema;\n prompt.start();\n\n prompt.get<SchemaPropsToString<typeof schema>>(schema, (_err: Error | null, result): void => {\n if (result) {\n if (result.password !== result.repeatPassword) {\n return tools.maybeCallbackWithError(callback, 'Passwords are not identical!');\n }\n\n this.setPassword(username, result.password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n }\n return tools.maybeCallback(callback);\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 }\n return tools.maybeCallback(callback);\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 }\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 * 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 if (!username && !password) {\n prompt.message = '';\n prompt.delimiter = '';\n const 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 } as const satisfies prompt.Schema;\n prompt.start();\n\n prompt.get<SchemaPropsToString<typeof schema>>(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}\" does not match${err ? `: ${err.message}` : ''}`,\n );\n }\n return tools.maybeCallbackWithError(callback, null);\n });\n });\n } else if (!password) {\n prompt.message = '';\n prompt.delimiter = '';\n const schema = {\n properties: {\n password: {\n description: 'Enter current password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: true,\n },\n },\n } as const satisfies prompt.Schema;\n prompt.start();\n\n prompt.get<SchemaPropsToString<typeof schema>>(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 }\n return tools.maybeCallbackWithError(callback, null);\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 }\n return tools.maybeCallbackWithError(callback, null);\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 }\n return tools.maybeCallbackWithError(callback, null, obj.common.enabled);\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 }\n return tools.maybeCallbackWithError(callback, null, obj.common.enabled, obj.common.members);\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 }\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 * 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 }\n this.objects.getObject(`system.group.${_group}`, (err, obj) => {\n if (!obj) {\n return tools.maybeCallbackWithError(callback, 'Group does not exists');\n }\n this.objects.delObject(`system.group.${_group}`, err => {\n return tools.maybeCallbackWithError(callback, err);\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 }\n const pos = obj.common.members.indexOf(`system.user.${username}`);\n if (pos === -1) {\n return tools.maybeCallbackWithError(callback, 'User not in group');\n }\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"],
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';\nimport type { ProcessCommandOptions } from '@/lib/cli/cliCommand.js';\nimport { dbConnect } from '@/lib/setup/dbConnection.js';\n\n/** Options for the users command */\nexport interface CLIUsersOptions {\n /** Callback to exit the process with an exit code */\n processExit: ProcessExitCallback;\n /** The objects database client */\n objects: ObjectsRedisClient;\n}\n\n/** Map a prompt.Schema to properties of type string */\ntype SchemaPropsToString<TSchema extends prompt.Schema> = { [Property in keyof TSchema['properties']]: string };\n\n/**\n * CLI command to manage ioBroker users and groups\n */\nexport class Users {\n private readonly objects: ObjectsRedisClient;\n private readonly processExit: ProcessExitCallback;\n\n /**\n * @param options The objects database client and the process-exit callback\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 Called once the user has been added\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 }\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 * 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 Called once the password has been set\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 Called with whether the password is correct\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 Called once the user has been deleted\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 }\n if (obj.common.dontDelete) {\n return tools.maybeCallbackWithError(callback, 'Cannot delete user, while is system user');\n }\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(`system.user.${_user}`);\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(groups.rows[i].value._id, groups.rows[i].value, err => {\n if (!--count) {\n return tools.maybeCallbackWithError(callback, err);\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 * 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 Called once the user has been added to the group\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 Called once the user has been created\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 } as const satisfies prompt.Schema;\n prompt.start();\n\n prompt.get<SchemaPropsToString<typeof schema>>(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\n this.addUser(username, result.password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n }\n this.addUserToGroup(username, groupName, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n }\n return tools.maybeCallback(callback);\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 }\n this.addUserToGroup(username, groupName, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n }\n return tools.maybeCallback(callback);\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 Called once the password has been set\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 }\n // Check a 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 } as const satisfies prompt.Schema;\n prompt.start();\n\n prompt.get<SchemaPropsToString<typeof schema>>(schema, (_err: Error | null, result): void => {\n if (result) {\n if (result.password !== result.repeatPassword) {\n return tools.maybeCallbackWithError(callback, 'Passwords are not identical!');\n }\n\n this.setPassword(username, result.password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n }\n return tools.maybeCallback(callback);\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 }\n return tools.maybeCallback(callback);\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 Called once the user has been enabled or disabled\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 }\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 * 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 Called with whether the password is valid\n */\n checkUserPassword(username: string, password: string, callback: ioBroker.ErrorCallback): void {\n if (!username && !password) {\n prompt.message = '';\n prompt.delimiter = '';\n const 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 } as const satisfies prompt.Schema;\n prompt.start();\n\n prompt.get<SchemaPropsToString<typeof schema>>(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}\" does not match${err ? `: ${err.message}` : ''}`,\n );\n }\n return tools.maybeCallbackWithError(callback, null);\n });\n });\n } else if (!password) {\n prompt.message = '';\n prompt.delimiter = '';\n const schema = {\n properties: {\n password: {\n description: 'Enter current password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: true,\n },\n },\n } as const satisfies prompt.Schema;\n prompt.start();\n\n prompt.get<SchemaPropsToString<typeof schema>>(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 }\n return tools.maybeCallbackWithError(callback, null);\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 }\n return tools.maybeCallbackWithError(callback, null);\n });\n }\n }\n\n /**\n * Get user object\n *\n * @param username name of the user to get object of\n * @param callback Called with the user object\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 }\n return tools.maybeCallbackWithError(callback, null, obj.common.enabled);\n });\n }\n\n /**\n * Get group object\n *\n * @param group groupname\n * @param callback Called with the group object\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 }\n return tools.maybeCallbackWithError(callback, null, obj.common.enabled, obj.common.members);\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 Called once the group has been enabled or disabled\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 }\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 * 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 _id: `system.group.${_group}`,\n type: 'group',\n common: {\n name: group,\n enabled: true,\n members: [],\n acl: {\n file: {\n read: false,\n list: false,\n write: false,\n create: false,\n delete: false,\n },\n object: {\n read: false,\n list: false,\n write: false,\n create: false,\n delete: false,\n },\n users: {\n read: false,\n list: false,\n write: false,\n create: false,\n delete: false,\n },\n state: {\n read: false,\n list: false,\n write: false,\n create: false,\n delete: false,\n },\n other: {\n execute: false,\n sendto: false,\n http: false,\n },\n },\n },\n from: `system.host.${tools.getHostName()}.cli`,\n ts: Date.now(),\n native: {},\n } as ioBroker.GroupObject);\n }\n }\n\n /**\n * Remove group\n *\n * @param group groupname\n * @param callback Called once the group has been removed\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 }\n this.objects.getObject(`system.group.${_group}`, (err, obj) => {\n if (!obj) {\n return tools.maybeCallbackWithError(callback, 'Group does not exists');\n }\n this.objects.delObject(`system.group.${_group}`, err => {\n return tools.maybeCallbackWithError(callback, err);\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 Called once the user has been removed from the group\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 }\n const pos = obj.common.members.indexOf(`system.user.${username}`);\n if (pos === -1) {\n return tools.maybeCallbackWithError(callback, 'User not in group');\n }\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 * @param options Command execution options\n */\nexport function processCommandUser(options: ProcessCommandOptions): void {\n const { args, params, callback } = options;\n const command = args[0] || '';\n let user = args[1] || '';\n\n if (user?.startsWith('system.user.')) {\n user = user.substring('system.user.'.length);\n }\n\n dbConnect(params, ({ objects }) => {\n const users = new Users({\n objects,\n processExit: callback,\n });\n const password = params.password as string;\n const group: ioBroker.ObjectIDs.Group =\n (params.ingroup as ioBroker.ObjectIDs.Group) || 'system.group.administrator';\n\n if (command === 'add') {\n users.addUserPrompt(user, group, password, (err: Error | null | undefined) => {\n if (err) {\n console.error(err);\n return void callback(EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);\n }\n console.log(`User \"${user}\" created (Group: ${group.replace('system.group.', '')})`);\n return void callback();\n });\n } else if (command === 'del' || command === 'delete') {\n users.delUser(user, (err: Error | null | undefined) => {\n if (err) {\n console.error(err);\n return void callback(EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);\n }\n console.log(`User \"${user}\" deleted`);\n return void callback();\n });\n } else if (command === 'check') {\n users.checkUserPassword(user, password, err => {\n if (err) {\n console.error(err.message);\n return void callback(EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);\n }\n console.log(`Password for user \"${user}\" matches.`);\n return void callback();\n });\n } else if (command === 'set' || command === 'passwd') {\n users\n .setUserPassword(user, password, err => {\n if (err) {\n console.error(err.message);\n return void callback(EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);\n }\n console.log(`Password for \"${user}\" was successfully set.`);\n return void callback();\n })\n .catch(e => console.error(`Cannot set password: ${e.message}`));\n } else if (command === 'enable' || command === 'e') {\n users.enableUser(user, true, err => {\n if (err) {\n console.error(err.message);\n return void callback(EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);\n }\n console.log(`User \"${user}\" was successfully enabled.`);\n return void callback();\n });\n } else if (command === 'disable' || command === 'd') {\n users.enableUser(user, false, err => {\n if (err) {\n console.error(err.message);\n return void callback(EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);\n }\n console.log(`User \"${user}\" was successfully disabled.`);\n return void callback();\n });\n } else if (command === 'get') {\n users.getUser(user, (err, isEnabled) => {\n if (err) {\n console.error(err.message);\n return void callback(EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);\n }\n console.log(`User \"${user}\" is ${isEnabled ? 'enabled' : 'disabled'}`);\n return void callback();\n });\n } else {\n console.warn(\n `Unknown command \"${command}\". Available commands are: add, del, passwd, enable, disable, check, get`,\n );\n return void callback(EXIT_CODES.INVALID_ARGUMENTS);\n }\n });\n}\n\n/**\n * @param options Command execution options\n */\nexport function processCommandGroup(options: ProcessCommandOptions): void {\n const { args, params, callback } = options;\n const command = args[0] || '';\n let group = args[1] || '';\n let user = args[2] || '';\n\n if (group?.startsWith('system.group.')) {\n group = group.substring('system.group.'.length);\n }\n if (user?.startsWith('system.user.')) {\n user = user.substring('system.user.'.length);\n }\n if (!command) {\n console.warn(\n `Unknown command \"${command}\". Available commands are: add, del, passwd, enable, disable, list, get`,\n );\n return void callback(EXIT_CODES.INVALID_ARGUMENTS);\n }\n if (!group) {\n console.warn(`Please define group name: group ${command} groupName`);\n return callback(EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);\n }\n\n dbConnect(params, async ({ objects }) => {\n const users = new Users({\n objects,\n processExit: callback,\n });\n\n if (command === 'useradd' || command === 'adduser') {\n if (!user) {\n console.warn('Please define user name: \"group useradd groupName userName\"');\n return void callback(EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);\n }\n users.addUserToGroup(user, group, (err: Error | null | undefined) => {\n if (err) {\n console.error(err);\n return void callback(EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);\n }\n console.log(`User \"${user}\" was added to group \"${group}\"`);\n return void callback();\n });\n } else if (command === 'userdel' || command === 'deluser') {\n if (!user) {\n console.warn('Please define user name: \"group userdel groupName userName\"');\n return void callback(EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);\n }\n users.removeUserFromGroup(user, group, (err: Error | null | undefined) => {\n if (err) {\n console.error(err);\n return void callback(EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);\n }\n console.log(`User \"${user}\" was deleted from group \"${group}\"`);\n return void callback();\n });\n } else if (command === 'add') {\n try {\n await users.addGroup(group);\n console.log(`Group \"${group}\" was created`);\n return void callback();\n } catch {\n return void callback(EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);\n }\n } else if (command === 'del' || command === 'delete') {\n users.delGroup(group, (err: Error | null | undefined) => {\n if (err) {\n console.error(err);\n return void callback(EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);\n }\n console.log(`Group \"${group}\" was deleted`);\n return void callback();\n });\n } else if (command === 'list' || command === 'l') {\n users.getGroup(group, (err, isEnabled, members) => {\n if (err) {\n console.error(err);\n return void callback(EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);\n }\n console.log(`Group \"${group}\" is ${isEnabled ? 'enabled' : 'disabled'} and has following members:`);\n if (members) {\n for (const member of members) {\n console.log(member.substring('system.user.'.length));\n }\n }\n return void callback();\n });\n } else if (command === 'enable' || command === 'e') {\n users.enableGroup(group, true, (err: Error | null | undefined) => {\n if (err) {\n console.error(err);\n return void callback(EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);\n }\n console.log(`Group \"${group}\" was successfully enabled.`);\n return void callback();\n });\n } else if (command === 'disable' || command === 'd') {\n users.enableGroup(group, false, (err: Error | null | undefined) => {\n if (err) {\n console.error(err);\n return void callback(EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);\n }\n console.log(`Group \"${group}\" was successfully disabled.`);\n return void callback();\n });\n } else if (command === 'get') {\n users.getGroup(group, (err, isEnabled) => {\n if (err) {\n console.error(err);\n return void callback(EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);\n }\n console.log(`Group \"${group}\" is ${isEnabled ? 'enabled' : 'disabled'}`);\n return void callback();\n });\n } else {\n console.warn(\n `Unknown command \"${command}\". Available commands are: add, del, passwd, enable, disable, list, get`,\n );\n return void callback(EXIT_CODES.INVALID_ARGUMENTS);\n }\n });\n}\n\n/**\n * @param options Command execution options\n */\nexport function processCommandAddUser(options: ProcessCommandOptions): void {\n const { args, params, callback } = options;\n const user = args[0];\n const group = (params.ingroup as ioBroker.ObjectIDs.Group) || 'system.group.administrator';\n const password = params.password as string;\n\n dbConnect(params, ({ objects }) => {\n const users = new Users({\n objects,\n processExit: callback,\n });\n users.addUserPrompt(user, group, password, (err: Error | null | undefined) => {\n if (err) {\n console.error(err);\n return void callback(EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);\n }\n console.log(`User \"${user}\" created (Group: ${group.replace('system.group.', '')})`);\n return void callback();\n });\n });\n}\n\n/**\n * @param options Command execution options\n */\nexport function processCommandPassword(options: ProcessCommandOptions): void {\n const { args, params, callback } = options;\n const user = args[0];\n const password = params.password as string;\n dbConnect(params, ({ objects }) => {\n const users = new Users({\n objects,\n processExit: callback,\n });\n users\n .setUserPassword(user, password, (err: Error | null | undefined) => {\n if (err) {\n console.error(err);\n return void callback(EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);\n }\n console.log(`Password for \"${user}\" was successfully set.`);\n return void callback();\n })\n .catch(e => console.error(`Cannot set password: ${e.message}`));\n });\n}\n\n/**\n * @param options Command execution options\n */\nexport function processCommandUserDel(options: ProcessCommandOptions): void {\n const { args, params, callback } = options;\n const user = args[0];\n\n dbConnect(params, ({ objects }) => {\n const users = new Users({\n objects,\n processExit: callback,\n });\n users.delUser(user, (err: Error | null | undefined) => {\n if (err) {\n console.error(err);\n return void callback(EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);\n }\n console.log(`User \"${user}\" deleted`);\n return void callback();\n });\n });\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;AAAA,kCAA4C;AAG5C,oBAAmB;AAEnB,0BAA0B;AAgBpB,MAAO,MAAK;EArBlB,OAqBkB;;;EACG;EACA;;;;EAKjB,YAAY,SAAwB;AAChC,QAAI,CAAC,QAAQ,SAAS;AAClB,YAAM,IAAI,MAAM,uCAAuC;IAC3D;AACA,QAAI,CAAC,QAAQ,aAAa;AACtB,YAAM,IAAI,MAAM,2CAA2C;IAC/D;AAEA,SAAK,UAAU,QAAQ;AACvB,SAAK,cAAc,QAAQ;EAC/B;;;;;;;;EASA,QAAQ,UAAkB,IAAY,UAAgC;AAElE,UAAM,QAAQ,SAAS,QAAQ,OAAO,GAAG,EAAE,YAAW;AACtD,SAAK,QAAQ,UAAU,eAAe,KAAK,IAAI,CAAC,KAAK,QAAO;AACxD,UAAI,KAAK;AACL,eAAO,kCAAM,uBAAuB,UAAU,iBAAiB;MACnE;AACA,WAAK,QAAQ,UACT,eAAe,KAAK,IACpB;QACI,MAAM;QACN,QAAQ;UACJ,MAAM;UACN,SAAS;UACT,UAAU;;QAEd,MAAM,eAAe,kCAAM,YAAW,CAAE;QACxC,IAAI,KAAK,IAAG;QACZ,QAAQ,CAAA;SAEZ,CAAAA,SAAM;AACF,YAAI,CAACA,MAAK;AACN,eAAK,YAAY,UAAU,IAAI,QAAQ;QAC3C,OAAO;AACH,iBAAO,kCAAM,uBAAuB,UAAUA,IAAG;QACrD;MACJ,CAAC;IAET,CAAC;EACL;;;;;;EAOA,MAAM,OAAO,UAAgB;AACzB,UAAM,QAAQ,SAAS,QAAQ,OAAO,GAAG,EAAE,YAAW;AACtD,QAAI,aAAa;AACjB,QAAI;AACA,mBAAa,MAAM,KAAK,QAAQ,aAAa,eAAe,KAAK,EAAE;IACvE,QAAQ;IAER;AAEA,WAAO;EACX;;;;;;;;EASA,YAAY,UAAkB,IAAY,UAAgC;AACtE,UAAM,QAAQ,SAAS,QAAQ,OAAO,GAAG,EAAE,YAAW;AAEtD,SAAK,QAAQ,UAAU,eAAe,KAAK,IAAI,CAAC,KAAK,QAAO;AACxD,UAAI,OAAO,CAAC,KAAK;AACb,eAAO,kCAAM,uBAAuB,UAAU,qBAAqB;MACvE;AAEA,gDAAS,EAAE,EAAE,KAAK,MAAM,MAAM,CAACA,MAAK,QAAO;AACvC,YAAIA,MAAK;AACL,iBAAO,kCAAM,uBAAuB,UAAUA,IAAG;QACrD;AACA,YAAI,OAAO,WAAW,OAAO;AAC7B,YAAI,OAAO,eAAe,kCAAM,YAAW,CAAE;AAC7C,YAAI,KAAK,KAAK,IAAG;AACjB,aAAK,QAAQ,UAAU,eAAe,KAAK,IAAI,KAAK,CAAAA,SAAM;AACtD,iBAAO,kCAAM,uBAAuB,UAAUA,IAAG;QACrD,CAAC;MACL,CAAC;IACL,CAAC;EACL;;;;;;;;EASA,cAAc,UAAkB,IAAY,UAAsD;AAC9F,UAAM,QAAQ,SAAS,QAAQ,OAAO,GAAG,EAAE,YAAW;AAEtD,SAAK,QAAQ,UAAU,eAAe,KAAK,IAAI,CAAC,KAAK,QAAO;AACxD,UAAI,OAAO,CAAC,KAAK;AACb,eAAO,kCAAM,uBAAuB,UAAU,qBAAqB;MACvE;AAEA,gDAAS,EAAE,EAAE,MAAM,IAAI,OAAO,UAAU,CAACA,MAAK,QAAO;AACjD,eAAO,kCAAM,uBAAuB,UAAUA,MAAK,GAAG;MAC1D,CAAC;IACL,CAAC;EACL;;;;;;;EAQA,QAAQ,UAAkB,UAAgC;AACtD,QAAI,CAAC,UAAU;AACX,aAAO,kCAAM,uBAAuB,UAAU,+CAA+C;IACjG;AAEA,UAAM,QAAQ,SAAS,QAAQ,OAAO,GAAG,EAAE,YAAW;AAEtD,SAAK,QAAQ,UAAU,eAAe,KAAK,IAAI,CAAC,KAAK,QAAO;AACxD,UAAI,OAAO,CAAC,KAAK;AACb,eAAO,kCAAM,uBAAuB,UAAU,qBAAqB;MACvE;AACA,UAAI,IAAI,OAAO,YAAY;AACvB,eAAO,kCAAM,uBAAuB,UAAU,0CAA0C;MAC5F;AACA,WAAK,QAAQ,UAAU,eAAe,KAAK,IAAI,CAAAA,SAAM;AAEjD,YAAI,CAACA,MAAK;AACN,eAAK,QAAQ,cACT,EAAE,UAAU,iBAAiB,QAAQ,sBAAqB,GAC1D,CAACA,MAAK,WAAU;AACZ,gBAAI,CAAC,QAAQ;AACT,qBAAO,kCAAM,cAAc,QAAQ;YACvC;AAEA,gBAAI,QAAQ;AACZ,qBAAS,IAAI,GAAG,IAAI,OAAO,KAAK,QAAQ,KAAK;AACzC,kBAAI,OAAO,KAAK,CAAC,EAAE,MAAM,SAAS,SAAS;AACvC;cACJ;AAEA,kBACI,OAAO,KAAK,CAAC,EAAE,MAAM,OAAO,WAC5B,OAAO,KAAK,CAAC,EAAE,MAAM,OAAO,QAAQ,QAAQ,eAAe,KAAK,EAAE,MAAM,IAC1E;AACE,sBAAM,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,OAAO,QAAQ,QAAQ,eAAe,KAAK,EAAE;AAC9E,uBAAO,KAAK,CAAC,EAAE,MAAM,OAAO,QAAQ,OAAO,KAAK,CAAC;AACjD;AACA,uBAAO,KAAK,CAAC,EAAE,MAAM,OAAO,eAAe,kCAAM,YAAW,CAAE;AAC9D,uBAAO,KAAK,CAAC,EAAE,MAAM,KAAK,KAAK,IAAG;AAClC,qBAAK,QAAQ,UAAU,OAAO,KAAK,CAAC,EAAE,MAAM,KAAK,OAAO,KAAK,CAAC,EAAE,OAAO,CAAAA,SAAM;AACzE,sBAAI,CAAC,EAAE,OAAO;AACV,2BAAO,kCAAM,uBAAuB,UAAUA,IAAG;kBACrD;gBACJ,CAAC;cACL;YACJ;AACA,gBAAI,CAAC,OAAO;AACR,qBAAO,kCAAM,cAAc,QAAQ;YACvC;UACJ,CAAC;QAET,OAAO;AACH,iBAAO,kCAAM,uBAAuB,UAAUA,IAAG;QACrD;MACJ,CAAC;IACL,CAAC;EACL;;;;;;;;EASA,eAAe,UAAkB,WAAmB,UAAgC;AAChF,QAAI,QAAQ,SAAS,QAAQ,OAAO,GAAG,EAAE,YAAW;AACpD,QAAI,CAAC,UAAU,WAAW,eAAe,GAAG;AACxC,kBAAY,gBAAgB,SAAS;IACzC;AACA,QAAI,CAAC,MAAM,WAAW,cAAc,GAAG;AACnC,cAAQ,eAAe,KAAK;IAChC;AAEA,SAAK,QAAQ,UAAU,OAAO,CAAC,KAAK,QAAO;AACvC,UAAI,OAAO,CAAC,KAAK;AACb,eAAO,kCAAM,uBAAuB,UAAU,qBAAqB;MACvE;AACA,WAAK,QAAQ,UAAU,WAAW,CAACA,MAAKC,SAAO;AAC3C,YAAID,QAAO,CAACC,MAAK;AACb,iBAAO,kCAAM,uBAAuB,UAAU,sBAAsB;QACxE;AACA,QAAAA,KAAI,SAASA,KAAI,UAAU,CAAA;AAC3B,QAAAA,KAAI,OAAO,UAAUA,KAAI,OAAO,WAAW,CAAA;AAE3C,YAAIA,KAAI,OAAO,QAAQ,QAAQ,KAAK,MAAM,IAAI;AAC1C,UAAAA,KAAI,OAAO,QAAQ,KAAK,KAAK;AAC7B,UAAAA,KAAI,OAAO,eAAe,kCAAM,YAAW,CAAE;AAC7C,UAAAA,KAAI,KAAK,KAAK,IAAG;AACjB,eAAK,QAAQ,UAAU,WAAWA,MAAK,CAAAD,SAAM;AACzC,mBAAO,kCAAM,uBAAuB,UAAUA,IAAG;UACrD,CAAC;QACL,OAAO;AACH,iBAAO,kCAAM,cAAc,QAAQ;QACvC;MACJ,CAAC;IACL,CAAC;EACL;;;;;;;;;EAUA,cAAc,UAAkB,WAAmBE,WAAkB,UAAgC;AACjG,QAAI,CAAC,UAAU;AACX,aAAO,kCAAM,uBAAuB,UAAU,kDAAkD;IACpG;AAGA,QAAI,UAAU,UAAU,GAAG,EAAE,MAAM,iBAAiB;AAChD,kBAAY,gBAAgB,SAAS;IACzC;AAEA,SAAK,QAAQ,UAAU,WAAW,CAAC,KAAK,QAAO;AAC3C,UAAI,CAAC,KAAK;AACN,eAAO,kCAAM,uBAAuB,UAAU,kBAAkB,SAAS,EAAE;MAC/E;AACA,UAAI,CAACA,WAAU;AACX,sBAAAC,QAAO,UAAU;AACjB,sBAAAA,QAAO,YAAY;AACnB,cAAM,SAAS;UACX,YAAY;YACR,UAAU;cACN,aAAa;cACb,SAAS;cACT,SAAS;cACT,QAAQ;;YAEZ,gBAAgB;cACZ,aAAa;cACb,SAAS;cACT,SAAS;cACT,QAAQ;;;;AAIpB,sBAAAA,QAAO,MAAK;AAEZ,sBAAAA,QAAO,IAAwC,QAAQ,CAACH,MAAK,WAAU;AACnE,cAAI,QAAQ;AACR,gBAAI,OAAO,aAAa,OAAO,gBAAgB;AAC3C,sBAAQ,IAAI,8BAA8B;AAC1C,qBAAO,KAAK,KAAK,YAAY,uCAAW,gBAAgB;YAC5D;AAEA,iBAAK,QAAQ,UAAU,OAAO,UAAU,CAAAA,SAAM;AAC1C,kBAAIA,MAAK;AACL,uBAAO,kCAAM,uBAAuB,UAAUA,IAAG;cACrD;AACA,mBAAK,eAAe,UAAU,WAAW,CAAAA,SAAM;AAC3C,oBAAIA,MAAK;AACL,yBAAO,kCAAM,uBAAuB,UAAUA,IAAG;gBACrD;AACA,uBAAO,kCAAM,cAAc,QAAQ;cACvC,CAAC;YACL,CAAC;UACL,OAAO;AACH,mBAAO,kCAAM,uBAAuB,UAAUA,IAAG;UACrD;QACJ,CAAC;MACL,OAAO;AACH,aAAK,QAAQ,UAAUE,WAAU,CAAAF,SAAM;AACnC,cAAIA,MAAK;AACL,mBAAO,kCAAM,uBAAuB,UAAUA,IAAG;UACrD;AACA,eAAK,eAAe,UAAU,WAAW,CAAAA,SAAM;AAC3C,gBAAIA,MAAK;AACL,qBAAO,kCAAM,uBAAuB,UAAUA,IAAG;YACrD;AACA,mBAAO,kCAAM,cAAc,QAAQ;UACvC,CAAC;QACL,CAAC;MACL;IACJ,CAAC;EACL;;;;;;;;EASA,MAAM,gBAAgB,UAAkBE,WAAkB,UAAgC;AACtF,QAAI,CAAC,UAAU;AACX,aAAO,kCAAM,uBAAuB,UAAU,kDAAkD;IACpG;AAEA,UAAM,aAAa,MAAM,KAAK,OAAO,QAAQ;AAC7C,QAAI,CAAC,YAAY;AACb,aAAO,kCAAM,uBAAuB,UAAU,SAAS,QAAQ,mBAAmB;IACtF;AAEA,QAAI,CAACA,WAAU;AACX,oBAAAC,QAAO,UAAU;AACjB,oBAAAA,QAAO,YAAY;AACnB,YAAM,SAAS;QACX,YAAY;UACR,UAAU;YACN,aAAa;YACb,SAAS;YACT,SAAS;YACT,QAAQ;;UAEZ,gBAAgB;YACZ,aAAa;YACb,SAAS;YACT,SAAS;YACT,QAAQ;;;;AAIpB,oBAAAA,QAAO,MAAK;AAEZ,oBAAAA,QAAO,IAAwC,QAAQ,CAAC,MAAoB,WAAgB;AACxF,YAAI,QAAQ;AACR,cAAI,OAAO,aAAa,OAAO,gBAAgB;AAC3C,mBAAO,kCAAM,uBAAuB,UAAU,8BAA8B;UAChF;AAEA,eAAK,YAAY,UAAU,OAAO,UAAU,SAAM;AAC9C,gBAAI,KAAK;AACL,qBAAO,kCAAM,uBAAuB,UAAU,GAAG;YACrD;AACA,mBAAO,kCAAM,cAAc,QAAQ;UACvC,CAAC;QACL,OAAO;AACH,iBAAO,kCAAM,uBAAuB,UAAU,sBAAsB;QACxE;MACJ,CAAC;IACL,OAAO;AACH,WAAK,YAAY,UAAUD,WAAU,SAAM;AACvC,YAAI,KAAK;AACL,iBAAO,kCAAM,uBAAuB,UAAU,GAAG;QACrD;AACA,eAAO,kCAAM,cAAc,QAAQ;MACvC,CAAC;IACL;EACJ;;;;;;;;EASA,WAAW,UAAkB,QAAiB,UAAgC;AAC1E,QAAI,CAAC,UAAU;AACX,aAAO,kCAAM,uBAAuB,UAAU,kDAAkD;IACpG;AACA,QAAI,SAAS,WAAW,cAAc,GAAG;AACrC,iBAAW,SAAS,UAAU,eAAe,MAAM;IACvD;AAEA,QAAI,aAAa,WAAW,CAAC,QAAQ;AACjC,aAAO,kCAAM,uBAAuB,UAAU,+BAA+B;IACjF;AAEA,SAAK,QAAQ,UAAU,eAAe,QAAQ,IAAI,CAAC,KAAK,QAAO;AAC3D,UAAI,KAAK;AACL,eAAO,kCAAM,uBAAuB,UAAU,qBAAqB,IAAI,OAAO,EAAE;MACpF;AACA,UAAI,CAAC,KAAK;AACN,eAAO,kCAAM,uBAAuB,UAAU,SAAS,QAAQ,aAAa;MAChF;AACA,UAAI,OAAO,UAAU;AACrB,UAAI,OAAO,eAAe,kCAAM,YAAW,CAAE;AAC7C,UAAI,KAAK,KAAK,IAAG;AACjB,WAAK,QAAQ,UAAU,IAAI,KAAK,KAAK,CAAAF,SAAM;AACvC,eAAO,kCAAM,uBAAuB,UAAUA,IAAG;MACrD,CAAC;IACL,CAAC;EACL;;;;;;;;EASA,kBAAkB,UAAkBE,WAAkB,UAAgC;AAClF,QAAI,CAAC,YAAY,CAACA,WAAU;AACxB,oBAAAC,QAAO,UAAU;AACjB,oBAAAA,QAAO,YAAY;AACnB,YAAM,SAAS;QACX,YAAY;UACR,UAAU;YACN,aAAa;YACb,SAAS;YACT,SAAS;YACT,QAAQ;;UAEZ,UAAU;YACN,aAAa;YACb,SAAS;YACT,SAAS;YACT,QAAQ;;;;AAIpB,oBAAAA,QAAO,MAAK;AAEZ,oBAAAA,QAAO,IAAwC,QAAQ,CAAC,KAAK,WAAU;AACnE,aAAK,cAAc,OAAO,UAAU,OAAO,UAAU,CAACH,MAAK,QAAO;AAC9D,cAAIA,QAAO,CAAC,KAAK;AACb,mBAAO,kCAAM,uBACT,UACA,sBAAsB,OAAO,QAAQ,mBAAmBA,OAAM,KAAKA,KAAI,OAAO,KAAK,EAAE,EAAE;UAE/F;AACA,iBAAO,kCAAM,uBAAuB,UAAU,IAAI;QACtD,CAAC;MACL,CAAC;IACL,WAAW,CAACE,WAAU;AAClB,oBAAAC,QAAO,UAAU;AACjB,oBAAAA,QAAO,YAAY;AACnB,YAAM,SAAS;QACX,YAAY;UACR,UAAU;YACN,aAAa;YACb,SAAS;YACT,SAAS;YACT,QAAQ;;;;AAIpB,oBAAAA,QAAO,MAAK;AAEZ,oBAAAA,QAAO,IAAwC,QAAQ,CAAC,KAAK,WAAU;AACnE,aAAK,cAAc,UAAU,OAAO,UAAU,CAACH,MAAK,QAAO;AACvD,cAAIA,QAAO,CAAC,KAAK;AACb,mBAAO,kCAAM,uBACT,UACA,sBAAsB,QAAQ,mBAAmBA,OAAM,KAAKA,KAAI,OAAO,KAAK,EAAE,EAAE;UAExF;AACA,iBAAO,kCAAM,uBAAuB,UAAU,IAAI;QACtD,CAAC;MACL,CAAC;IACL,OAAO;AACH,WAAK,cAAc,UAAUE,WAAU,CAAC,KAAK,QAAO;AAChD,YAAI,OAAO,CAAC,KAAK;AACb,iBAAO,kCAAM,uBACT,UACA,sBAAsB,QAAQ,mBAAmB,MAAM,KAAK,IAAI,OAAO,KAAK,EAAE,EAAE;QAExF;AACA,eAAO,kCAAM,uBAAuB,UAAU,IAAI;MACtD,CAAC;IACL;EACJ;;;;;;;EAQA,QAAQ,UAAkB,UAAyD;AAC/E,SAAK,QAAQ,UAAU,eAAe,QAAQ,IAAI,CAAC,KAAK,QAAO;AAC3D,UAAI,KAAK;AACL,eAAO,kCAAM,uBAAuB,UAAU,qBAAqB,IAAI,OAAO,EAAE;MACpF;AACA,UAAI,CAAC,KAAK;AACN,eAAO,kCAAM,uBAAuB,UAAU,SAAS,QAAQ,aAAa;MAChF;AACA,aAAO,kCAAM,uBAAuB,UAAU,MAAM,IAAI,OAAO,OAAO;IAC1E,CAAC;EACL;;;;;;;EAQA,SAAS,OAAe,UAA6E;AACjG,SAAK,QAAQ,UAAU,gBAAgB,KAAK,IAAI,CAAC,KAAK,QAAO;AACzD,UAAI,KAAK;AACL,eAAO,kCAAM,uBAAuB,UAAU,sBAAsB,IAAI,OAAO,EAAE;MACrF;AACA,UAAI,CAAC,KAAK;AACN,eAAO,kCAAM,uBAAuB,UAAU,UAAU,KAAK,aAAa;MAC9E;AACA,aAAO,kCAAM,uBAAuB,UAAU,MAAM,IAAI,OAAO,SAAS,IAAI,OAAO,OAAO;IAC9F,CAAC;EACL;;;;;;;;EASA,YAAY,OAAe,QAAiB,UAAgC;AACxE,QAAI,CAAC,OAAO;AACR,aAAO,kCAAM,uBAAuB,UAAU,oDAAoD;IACtG;AACA,QAAI,MAAM,WAAW,eAAe,GAAG;AACnC,cAAQ,MAAM,UAAU,gBAAgB,MAAM;IAClD;AAEA,QAAI,UAAU,mBAAmB,CAAC,QAAQ;AACtC,aAAO,kCAAM,uBAAuB,UAAU,0CAA0C;IAC5F;AAEA,SAAK,QAAQ,UAAU,gBAAgB,KAAK,IAAI,CAAC,KAAK,QAAO;AACzD,UAAI,KAAK;AACL,eAAO,kCAAM,uBAAuB,UAAU,sBAAsB,IAAI,OAAO,EAAE;MACrF;AACA,UAAI,CAAC,KAAK;AACN,eAAO,kCAAM,uBAAuB,UAAU,UAAU,KAAK,aAAa;MAC9E;AACA,UAAI,OAAO,UAAU;AACrB,UAAI,OAAO,eAAe,kCAAM,YAAW,CAAE;AAC7C,UAAI,KAAK,KAAK,IAAG;AACjB,WAAK,QAAQ,UAAU,IAAI,KAAK,KAAK,CAAAF,SAAM;AACvC,eAAO,kCAAM,uBAAuB,UAAUA,IAAG;MACrD,CAAC;IACL,CAAC;EACL;;;;;;EAOA,MAAM,SAAS,OAAa;AACxB,UAAM,SAAS,MAAM,QAAQ,OAAO,GAAG;AACvC,UAAM,MAAM,MAAM,KAAK,QAAQ,UAAU,gBAAgB,MAAM,EAAE;AACjE,QAAI,KAAK;AACL,YAAM,IAAI,MAAM,kBAAkB;IACtC,OAAO;AAEH,YAAM,KAAK,QAAQ,UAAU,gBAAgB,MAAM,IAAI;QACnD,KAAK,gBAAgB,MAAM;QAC3B,MAAM;QACN,QAAQ;UACJ,MAAM;UACN,SAAS;UACT,SAAS,CAAA;UACT,KAAK;YACD,MAAM;cACF,MAAM;cACN,MAAM;cACN,OAAO;cACP,QAAQ;cACR,QAAQ;;YAEZ,QAAQ;cACJ,MAAM;cACN,MAAM;cACN,OAAO;cACP,QAAQ;cACR,QAAQ;;YAEZ,OAAO;cACH,MAAM;cACN,MAAM;cACN,OAAO;cACP,QAAQ;cACR,QAAQ;;YAEZ,OAAO;cACH,MAAM;cACN,MAAM;cACN,OAAO;cACP,QAAQ;cACR,QAAQ;;YAEZ,OAAO;cACH,SAAS;cACT,QAAQ;cACR,MAAM;;;;QAIlB,MAAM,eAAe,kCAAM,YAAW,CAAE;QACxC,IAAI,KAAK,IAAG;QACZ,QAAQ,CAAA;OACa;IAC7B;EACJ;;;;;;;EAQA,SAAS,OAAe,UAAgC;AACpD,UAAM,SAAS,MAAM,QAAQ,OAAO,GAAG;AAEvC,QAAI,UAAU,iBAAiB;AAC3B,aAAO,kCAAM,uBAAuB,UAAU,yCAAyC;IAC3F;AACA,SAAK,QAAQ,UAAU,gBAAgB,MAAM,IAAI,CAAC,KAAK,QAAO;AAC1D,UAAI,CAAC,KAAK;AACN,eAAO,kCAAM,uBAAuB,UAAU,uBAAuB;MACzE;AACA,WAAK,QAAQ,UAAU,gBAAgB,MAAM,IAAI,CAAAA,SAAM;AACnD,eAAO,kCAAM,uBAAuB,UAAUA,IAAG;MACrD,CAAC;IACL,CAAC;EACL;;;;;;;;EASA,oBAAoB,UAAkB,WAAmB,UAAgC;AACrF,UAAM,SAAS,UAAU,QAAQ,OAAO,GAAG;AAC3C,SAAK,QAAQ,UAAU,gBAAgB,MAAM,IAAI,CAAC,KAAK,QAAO;AAC1D,UAAI,CAAC,KAAK;AACN,eAAO,kCAAM,uBAAuB,UAAU,uBAAuB;MACzE;AACA,YAAM,MAAM,IAAI,OAAO,QAAQ,QAAQ,eAAe,QAAQ,EAAE;AAChE,UAAI,QAAQ,IAAI;AACZ,eAAO,kCAAM,uBAAuB,UAAU,mBAAmB;MACrE;AACA,UAAI,OAAO,QAAQ,OAAO,KAAK,CAAC;AAChC,UAAI,OAAO,eAAe,kCAAM,YAAW,CAAE;AAC7C,UAAI,KAAK,KAAK,IAAG;AACjB,WAAK,QAAQ,UAAU,IAAI,KAAK,KAAK,CAAAA,SAAM;AACvC,eAAO,kCAAM,uBAAuB,UAAUA,IAAG;MACrD,CAAC;IACL,CAAC;EACL;;AAME,SAAU,mBAAmB,SAA8B;AAC7D,QAAM,EAAE,MAAM,QAAQ,SAAQ,IAAK;AACnC,QAAM,UAAU,KAAK,CAAC,KAAK;AAC3B,MAAI,OAAO,KAAK,CAAC,KAAK;AAEtB,MAAI,MAAM,WAAW,cAAc,GAAG;AAClC,WAAO,KAAK,UAAU,eAAe,MAAM;EAC/C;AAEA,qCAAU,QAAQ,CAAC,EAAE,QAAO,MAAM;AAC9B,UAAM,QAAQ,IAAI,MAAM;MACpB;MACA,aAAa;KAChB;AACD,UAAME,YAAW,OAAO;AACxB,UAAM,QACD,OAAO,WAAwC;AAEpD,QAAI,YAAY,OAAO;AACnB,YAAM,cAAc,MAAM,OAAOA,WAAU,CAAC,QAAiC;AACzE,YAAI,KAAK;AACL,kBAAQ,MAAM,GAAG;AACjB,iBAAO,KAAK,SAAS,uCAAW,2BAA2B;QAC/D;AACA,gBAAQ,IAAI,SAAS,IAAI,qBAAqB,MAAM,QAAQ,iBAAiB,EAAE,CAAC,GAAG;AACnF,eAAO,KAAK,SAAQ;MACxB,CAAC;IACL,WAAW,YAAY,SAAS,YAAY,UAAU;AAClD,YAAM,QAAQ,MAAM,CAAC,QAAiC;AAClD,YAAI,KAAK;AACL,kBAAQ,MAAM,GAAG;AACjB,iBAAO,KAAK,SAAS,uCAAW,2BAA2B;QAC/D;AACA,gBAAQ,IAAI,SAAS,IAAI,WAAW;AACpC,eAAO,KAAK,SAAQ;MACxB,CAAC;IACL,WAAW,YAAY,SAAS;AAC5B,YAAM,kBAAkB,MAAMA,WAAU,SAAM;AAC1C,YAAI,KAAK;AACL,kBAAQ,MAAM,IAAI,OAAO;AACzB,iBAAO,KAAK,SAAS,uCAAW,2BAA2B;QAC/D;AACA,gBAAQ,IAAI,sBAAsB,IAAI,YAAY;AAClD,eAAO,KAAK,SAAQ;MACxB,CAAC;IACL,WAAW,YAAY,SAAS,YAAY,UAAU;AAClD,YACK,gBAAgB,MAAMA,WAAU,SAAM;AACnC,YAAI,KAAK;AACL,kBAAQ,MAAM,IAAI,OAAO;AACzB,iBAAO,KAAK,SAAS,uCAAW,2BAA2B;QAC/D;AACA,gBAAQ,IAAI,iBAAiB,IAAI,yBAAyB;AAC1D,eAAO,KAAK,SAAQ;MACxB,CAAC,EACA,MAAM,OAAK,QAAQ,MAAM,wBAAwB,EAAE,OAAO,EAAE,CAAC;IACtE,WAAW,YAAY,YAAY,YAAY,KAAK;AAChD,YAAM,WAAW,MAAM,MAAM,SAAM;AAC/B,YAAI,KAAK;AACL,kBAAQ,MAAM,IAAI,OAAO;AACzB,iBAAO,KAAK,SAAS,uCAAW,2BAA2B;QAC/D;AACA,gBAAQ,IAAI,SAAS,IAAI,6BAA6B;AACtD,eAAO,KAAK,SAAQ;MACxB,CAAC;IACL,WAAW,YAAY,aAAa,YAAY,KAAK;AACjD,YAAM,WAAW,MAAM,OAAO,SAAM;AAChC,YAAI,KAAK;AACL,kBAAQ,MAAM,IAAI,OAAO;AACzB,iBAAO,KAAK,SAAS,uCAAW,2BAA2B;QAC/D;AACA,gBAAQ,IAAI,SAAS,IAAI,8BAA8B;AACvD,eAAO,KAAK,SAAQ;MACxB,CAAC;IACL,WAAW,YAAY,OAAO;AAC1B,YAAM,QAAQ,MAAM,CAAC,KAAK,cAAa;AACnC,YAAI,KAAK;AACL,kBAAQ,MAAM,IAAI,OAAO;AACzB,iBAAO,KAAK,SAAS,uCAAW,2BAA2B;QAC/D;AACA,gBAAQ,IAAI,SAAS,IAAI,QAAQ,YAAY,YAAY,UAAU,EAAE;AACrE,eAAO,KAAK,SAAQ;MACxB,CAAC;IACL,OAAO;AACH,cAAQ,KACJ,oBAAoB,OAAO,0EAA0E;AAEzG,aAAO,KAAK,SAAS,uCAAW,iBAAiB;IACrD;EACJ,CAAC;AACL;AA1FgB;AA+FV,SAAU,oBAAoB,SAA8B;AAC9D,QAAM,EAAE,MAAM,QAAQ,SAAQ,IAAK;AACnC,QAAM,UAAU,KAAK,CAAC,KAAK;AAC3B,MAAI,QAAQ,KAAK,CAAC,KAAK;AACvB,MAAI,OAAO,KAAK,CAAC,KAAK;AAEtB,MAAI,OAAO,WAAW,eAAe,GAAG;AACpC,YAAQ,MAAM,UAAU,gBAAgB,MAAM;EAClD;AACA,MAAI,MAAM,WAAW,cAAc,GAAG;AAClC,WAAO,KAAK,UAAU,eAAe,MAAM;EAC/C;AACA,MAAI,CAAC,SAAS;AACV,YAAQ,KACJ,oBAAoB,OAAO,yEAAyE;AAExG,WAAO,KAAK,SAAS,uCAAW,iBAAiB;EACrD;AACA,MAAI,CAAC,OAAO;AACR,YAAQ,KAAK,mCAAmC,OAAO,YAAY;AACnE,WAAO,SAAS,uCAAW,2BAA2B;EAC1D;AAEA,qCAAU,QAAQ,OAAO,EAAE,QAAO,MAAM;AACpC,UAAM,QAAQ,IAAI,MAAM;MACpB;MACA,aAAa;KAChB;AAED,QAAI,YAAY,aAAa,YAAY,WAAW;AAChD,UAAI,CAAC,MAAM;AACP,gBAAQ,KAAK,6DAA6D;AAC1E,eAAO,KAAK,SAAS,uCAAW,2BAA2B;MAC/D;AACA,YAAM,eAAe,MAAM,OAAO,CAAC,QAAiC;AAChE,YAAI,KAAK;AACL,kBAAQ,MAAM,GAAG;AACjB,iBAAO,KAAK,SAAS,uCAAW,2BAA2B;QAC/D;AACA,gBAAQ,IAAI,SAAS,IAAI,yBAAyB,KAAK,GAAG;AAC1D,eAAO,KAAK,SAAQ;MACxB,CAAC;IACL,WAAW,YAAY,aAAa,YAAY,WAAW;AACvD,UAAI,CAAC,MAAM;AACP,gBAAQ,KAAK,6DAA6D;AAC1E,eAAO,KAAK,SAAS,uCAAW,2BAA2B;MAC/D;AACA,YAAM,oBAAoB,MAAM,OAAO,CAAC,QAAiC;AACrE,YAAI,KAAK;AACL,kBAAQ,MAAM,GAAG;AACjB,iBAAO,KAAK,SAAS,uCAAW,2BAA2B;QAC/D;AACA,gBAAQ,IAAI,SAAS,IAAI,6BAA6B,KAAK,GAAG;AAC9D,eAAO,KAAK,SAAQ;MACxB,CAAC;IACL,WAAW,YAAY,OAAO;AAC1B,UAAI;AACA,cAAM,MAAM,SAAS,KAAK;AAC1B,gBAAQ,IAAI,UAAU,KAAK,eAAe;AAC1C,eAAO,KAAK,SAAQ;MACxB,QAAQ;AACJ,eAAO,KAAK,SAAS,uCAAW,2BAA2B;MAC/D;IACJ,WAAW,YAAY,SAAS,YAAY,UAAU;AAClD,YAAM,SAAS,OAAO,CAAC,QAAiC;AACpD,YAAI,KAAK;AACL,kBAAQ,MAAM,GAAG;AACjB,iBAAO,KAAK,SAAS,uCAAW,2BAA2B;QAC/D;AACA,gBAAQ,IAAI,UAAU,KAAK,eAAe;AAC1C,eAAO,KAAK,SAAQ;MACxB,CAAC;IACL,WAAW,YAAY,UAAU,YAAY,KAAK;AAC9C,YAAM,SAAS,OAAO,CAAC,KAAK,WAAW,YAAW;AAC9C,YAAI,KAAK;AACL,kBAAQ,MAAM,GAAG;AACjB,iBAAO,KAAK,SAAS,uCAAW,2BAA2B;QAC/D;AACA,gBAAQ,IAAI,UAAU,KAAK,QAAQ,YAAY,YAAY,UAAU,6BAA6B;AAClG,YAAI,SAAS;AACT,qBAAW,UAAU,SAAS;AAC1B,oBAAQ,IAAI,OAAO,UAAU,eAAe,MAAM,CAAC;UACvD;QACJ;AACA,eAAO,KAAK,SAAQ;MACxB,CAAC;IACL,WAAW,YAAY,YAAY,YAAY,KAAK;AAChD,YAAM,YAAY,OAAO,MAAM,CAAC,QAAiC;AAC7D,YAAI,KAAK;AACL,kBAAQ,MAAM,GAAG;AACjB,iBAAO,KAAK,SAAS,uCAAW,2BAA2B;QAC/D;AACA,gBAAQ,IAAI,UAAU,KAAK,6BAA6B;AACxD,eAAO,KAAK,SAAQ;MACxB,CAAC;IACL,WAAW,YAAY,aAAa,YAAY,KAAK;AACjD,YAAM,YAAY,OAAO,OAAO,CAAC,QAAiC;AAC9D,YAAI,KAAK;AACL,kBAAQ,MAAM,GAAG;AACjB,iBAAO,KAAK,SAAS,uCAAW,2BAA2B;QAC/D;AACA,gBAAQ,IAAI,UAAU,KAAK,8BAA8B;AACzD,eAAO,KAAK,SAAQ;MACxB,CAAC;IACL,WAAW,YAAY,OAAO;AAC1B,YAAM,SAAS,OAAO,CAAC,KAAK,cAAa;AACrC,YAAI,KAAK;AACL,kBAAQ,MAAM,GAAG;AACjB,iBAAO,KAAK,SAAS,uCAAW,2BAA2B;QAC/D;AACA,gBAAQ,IAAI,UAAU,KAAK,QAAQ,YAAY,YAAY,UAAU,EAAE;AACvE,eAAO,KAAK,SAAQ;MACxB,CAAC;IACL,OAAO;AACH,cAAQ,KACJ,oBAAoB,OAAO,yEAAyE;AAExG,aAAO,KAAK,SAAS,uCAAW,iBAAiB;IACrD;EACJ,CAAC;AACL;AAxHgB;AA6HV,SAAU,sBAAsB,SAA8B;AAChE,QAAM,EAAE,MAAM,QAAQ,SAAQ,IAAK;AACnC,QAAM,OAAO,KAAK,CAAC;AACnB,QAAM,QAAS,OAAO,WAAwC;AAC9D,QAAMA,YAAW,OAAO;AAExB,qCAAU,QAAQ,CAAC,EAAE,QAAO,MAAM;AAC9B,UAAM,QAAQ,IAAI,MAAM;MACpB;MACA,aAAa;KAChB;AACD,UAAM,cAAc,MAAM,OAAOA,WAAU,CAAC,QAAiC;AACzE,UAAI,KAAK;AACL,gBAAQ,MAAM,GAAG;AACjB,eAAO,KAAK,SAAS,uCAAW,2BAA2B;MAC/D;AACA,cAAQ,IAAI,SAAS,IAAI,qBAAqB,MAAM,QAAQ,iBAAiB,EAAE,CAAC,GAAG;AACnF,aAAO,KAAK,SAAQ;IACxB,CAAC;EACL,CAAC;AACL;AApBgB;AAyBV,SAAU,uBAAuB,SAA8B;AACjE,QAAM,EAAE,MAAM,QAAQ,SAAQ,IAAK;AACnC,QAAM,OAAO,KAAK,CAAC;AACnB,QAAMA,YAAW,OAAO;AACxB,qCAAU,QAAQ,CAAC,EAAE,QAAO,MAAM;AAC9B,UAAM,QAAQ,IAAI,MAAM;MACpB;MACA,aAAa;KAChB;AACD,UACK,gBAAgB,MAAMA,WAAU,CAAC,QAAiC;AAC/D,UAAI,KAAK;AACL,gBAAQ,MAAM,GAAG;AACjB,eAAO,KAAK,SAAS,uCAAW,2BAA2B;MAC/D;AACA,cAAQ,IAAI,iBAAiB,IAAI,yBAAyB;AAC1D,aAAO,KAAK,SAAQ;IACxB,CAAC,EACA,MAAM,OAAK,QAAQ,MAAM,wBAAwB,EAAE,OAAO,EAAE,CAAC;EACtE,CAAC;AACL;AApBgB;AAyBV,SAAU,sBAAsB,SAA8B;AAChE,QAAM,EAAE,MAAM,QAAQ,SAAQ,IAAK;AACnC,QAAM,OAAO,KAAK,CAAC;AAEnB,qCAAU,QAAQ,CAAC,EAAE,QAAO,MAAM;AAC9B,UAAM,QAAQ,IAAI,MAAM;MACpB;MACA,aAAa;KAChB;AACD,UAAM,QAAQ,MAAM,CAAC,QAAiC;AAClD,UAAI,KAAK;AACL,gBAAQ,MAAM,GAAG;AACjB,eAAO,KAAK,SAAS,uCAAW,2BAA2B;MAC/D;AACA,cAAQ,IAAI,SAAS,IAAI,WAAW;AACpC,aAAO,KAAK,SAAQ;IACxB,CAAC;EACL,CAAC;AACL;AAlBgB;",
6
6
  "names": ["err", "obj", "password", "prompt"]
7
7
  }
@@ -1,10 +1,19 @@
1
1
  import type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';
2
2
  import type { InternalLogger } from '@iobroker/js-controller-common-db/tools';
3
+ import type { ProcessCommandOptions } from '../../lib/cli/cliCommand.js';
4
+ /** Options for the vendor command */
3
5
  export interface CLIVendorOptions {
6
+ /** The objects database client */
4
7
  objects: ObjectsRedisClient;
5
8
  }
9
+ /**
10
+ * CLI command to apply vendor-specific customizations from the vendor file
11
+ */
6
12
  export declare class Vendor {
7
13
  private readonly objects;
14
+ /**
15
+ * @param options The objects database client
16
+ */
8
17
  constructor(options: CLIVendorOptions);
9
18
  /**
10
19
  * Deep merge of source into target object
@@ -19,8 +28,12 @@ export declare class Vendor {
19
28
  * @param file file path if not given, default path is used
20
29
  * @param password vendor password
21
30
  * @param javascriptPassword vendor JavaScript password
22
- * @param logger
31
+ * @param logger Logger used to report progress and errors
23
32
  */
24
33
  checkVendor(file: string | undefined, password: string, javascriptPassword: string | undefined, logger?: InternalLogger): Promise<boolean>;
25
34
  }
35
+ /**
36
+ * @param options The process command options
37
+ */
38
+ export declare function processCommandVendor(options: ProcessCommandOptions): Promise<void>;
26
39
  //# sourceMappingURL=setupVendor.d.ts.map
@@ -5,6 +5,7 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
8
9
  var __export = (target, all) => {
9
10
  for (var name in all)
10
11
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -28,7 +29,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
29
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
30
  var setupVendor_exports = {};
30
31
  __export(setupVendor_exports, {
31
- Vendor: () => Vendor
32
+ Vendor: () => Vendor,
33
+ processCommandVendor: () => processCommandVendor
32
34
  });
33
35
  module.exports = __toCommonJS(setupVendor_exports);
34
36
  var import_js_controller_common = require("@iobroker/js-controller-common");
@@ -36,9 +38,16 @@ var import_fs_extra = __toESM(require("fs-extra"), 1);
36
38
  var import_deep_clone = __toESM(require("deep-clone"), 1);
37
39
  var import_node_util = require("node:util");
38
40
  var import_node_crypto = require("node:crypto");
41
+ var import_dbConnection = require("../../lib/setup/dbConnection.js");
39
42
  const VENDOR_FILE = "/etc/iob-vendor.json";
40
43
  class Vendor {
44
+ static {
45
+ __name(this, "Vendor");
46
+ }
41
47
  objects;
48
+ /**
49
+ * @param options The objects database client
50
+ */
42
51
  constructor(options) {
43
52
  this.objects = options.objects;
44
53
  }
@@ -67,15 +76,15 @@ class Vendor {
67
76
  * @param file file path if not given, default path is used
68
77
  * @param password vendor password
69
78
  * @param javascriptPassword vendor JavaScript password
70
- * @param logger
79
+ * @param logger Logger used to report progress and errors
71
80
  */
72
81
  async checkVendor(file, password, javascriptPassword, logger) {
73
82
  logger ||= {
74
- debug: (text) => console.log(text),
75
- info: (text) => console.log(text),
76
- error: (text) => console.error(text),
77
- warn: (text) => console.warn(text),
78
- silly: (text) => console.log(text)
83
+ debug: /* @__PURE__ */ __name((text) => console.log(text), "debug"),
84
+ info: /* @__PURE__ */ __name((text) => console.log(text), "info"),
85
+ error: /* @__PURE__ */ __name((text) => console.error(text), "error"),
86
+ warn: /* @__PURE__ */ __name((text) => console.warn(text), "warn"),
87
+ silly: /* @__PURE__ */ __name((text) => console.log(text), "silly")
79
88
  };
80
89
  file ||= VENDOR_FILE;
81
90
  let data;
@@ -285,8 +294,31 @@ class Vendor {
285
294
  return true;
286
295
  }
287
296
  }
297
+ async function processCommandVendor(options) {
298
+ const { args, params, callback } = options;
299
+ const password = args[0];
300
+ const file = args[1];
301
+ const javascriptPassword = args[2];
302
+ if (!password) {
303
+ console.warn(`Please specify the password to update the vendor information!
304
+ ${import_js_controller_common.tools.appName.toLowerCase()} vendor <PASS_PHRASE> <vendor.json>`);
305
+ return void callback(import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS);
306
+ }
307
+ const { objects } = await (0, import_dbConnection.dbConnectAsync)(false, params);
308
+ const vendor = new Vendor({ objects });
309
+ try {
310
+ await vendor.checkVendor(file, password, javascriptPassword);
311
+ console.log(`Synchronised vendor information.`);
312
+ return void callback();
313
+ } catch (err) {
314
+ console.error(`Cannot update vendor information: ${err.message}`);
315
+ return void callback(import_js_controller_common.EXIT_CODES.CANNOT_UPDATE_VENDOR);
316
+ }
317
+ }
318
+ __name(processCommandVendor, "processCommandVendor");
288
319
  // Annotate the CommonJS export names for ESM import in node:
289
320
  0 && (module.exports = {
290
- Vendor
321
+ Vendor,
322
+ processCommandVendor
291
323
  });
292
324
  //# sourceMappingURL=setupVendor.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/setup/setupVendor.ts"],
4
- "sourcesContent": ["import type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';\nimport { tools } from '@iobroker/js-controller-common';\nimport fs from 'fs-extra';\nimport deepClone from 'deep-clone';\nimport { isDeepStrictEqual } from 'node:util';\nimport type { InternalLogger } from '@iobroker/js-controller-common-db/tools';\nimport { randomBytes } from 'node:crypto';\n\nexport interface CLIVendorOptions {\n objects: ObjectsRedisClient;\n}\n\ninterface iobVendorFile {\n vendor?: {\n id?: string;\n name?: string;\n /** Logo for login in admin */\n icon?: string;\n /** Logo in the top left corner of admin */\n logo?: string;\n admin?: {\n menu?: {\n // Settings for left menu\n editable?: false; // Hide edit button in menu\n 'tab-hosts'?: false; // Hide hosts item (See all https://github.com/ioBroker/ioBroker.admin/blob/master/src-rx/src/components/Drawer.js#L142)\n 'tab-files'?: false; // Hide files item\n 'tab-users'?: false; // Hide users item\n 'tab-intro'?: false; // Hide intro item\n 'tab-info'?: false; // Hide info item\n 'tab-adapters'?: false; // Hide adapters item\n 'tab-instances'?: false; // Hide instances item\n 'tab-objects'?: false; // Hide objects item\n 'tab-enums'?: false; // Hide enums item\n 'tab-devices'?: false; // Hide devices item\n 'tab-logs'?: false; // Hide logs item\n 'tab-scenes'?: false; // Hide scenes item\n 'tab-events'?: false; // Hide events item\n 'tab-javascript'?: false; // Hide javascript item\n 'tab-text2command-0'?: false; // Hide text2command-0 item\n 'tab-echarts'?: false; // Hide echarts item\n [tabName: string]: false | undefined;\n };\n appBar?: {\n discovery?: false;\n systemSettings?: false;\n toggleTheme?: false;\n expertMode?: false;\n hostSelector?: false;\n };\n settings?: {\n tabConfig?: false; // Main config tab\n tabRepositories?: false; // Repositories tab\n tabCertificates?: false; // Certificates tab\n tabLetsEncrypt?: false; // Let's Encrypt tab\n tabDefaultACL?: false; // Default ACL tab\n tabStatistics?: false; // Statistics tab\n\n language?: false;\n tempUnit?: false;\n currency?: false;\n dateFormat?: false;\n isFloatComma?: false;\n defaultHistory?: false;\n activeRepo?: false;\n expertMode?: false;\n defaultLogLevel?: false;\n };\n adapters?: {\n gitHubInstall?: false; // hide button install from GitHub/npm\n statistics?: false; // hide statistics on the right top\n filterUpdates?: false; // hide button filter updates in adapter tab\n allowAdapterRating?: false; // do not show and do not load adapter ratings\n };\n login?: {\n title?: string;\n motto?: string;\n link?: string;\n };\n };\n /** Favicon for admin */\n ico?: string;\n uuidPrefix?: string;\n };\n model?: {\n /** name for host */\n name?: string;\n /** Icon for host */\n icon?: string;\n /** Color for host */\n color?: string;\n };\n uuid?: string;\n iobroker?: Partial<ioBroker.IoBrokerJson>;\n objects?: {\n [id: string]: ioBroker.Object;\n };\n}\n\nconst VENDOR_FILE = '/etc/iob-vendor.json';\n\nexport class Vendor {\n private readonly objects: ObjectsRedisClient;\n\n constructor(options: CLIVendorOptions) {\n this.objects = options.objects;\n }\n\n /**\n * Deep merge of source into target object\n *\n * @param target target obj\n * @param source source obj\n */\n private deepMerge(target: Record<string, any>, source: Record<string, any>): void {\n Object.keys(source).forEach(attr => {\n if (typeof source[attr] === 'object' && !(source[attr] instanceof Array)) {\n if (target[attr] && typeof target[attr] !== 'object') {\n target[attr] = {};\n }\n target[attr] = target[attr] || {};\n this.deepMerge(target[attr], source[attr]);\n } else {\n target[attr] = source[attr];\n }\n });\n }\n\n /**\n * Read info from '/etc/iob_vendor.json' and executes instructions stored there\n *\n * @param file file path if not given, default path is used\n * @param password vendor password\n * @param javascriptPassword vendor JavaScript password\n * @param logger\n */\n async checkVendor(\n file: string | undefined,\n password: string,\n javascriptPassword: string | undefined,\n logger?: InternalLogger,\n ): Promise<boolean> {\n logger ||= {\n debug: (text: string) => console.log(text),\n info: (text: string) => console.log(text),\n error: (text: string) => console.error(text),\n warn: (text: string) => console.warn(text),\n silly: (text: string) => console.log(text),\n };\n\n file ||= VENDOR_FILE;\n\n let data: iobVendorFile;\n if (fs.existsSync(file)) {\n try {\n data = fs.readJSONSync(file);\n } catch (err) {\n logger.error(`cannot read or parse \"${file}\": ${err.message}`);\n throw new Error(`cannot read or parse \"${file}\": ${err.message}`);\n }\n } else {\n logger.error(`\"${file}\" does not exist`);\n throw new Error(`\"${file}\" does not exist`);\n }\n\n if (data?.uuid) {\n const uuid = data.uuid;\n\n // check UUID\n const obj = await this.objects.getObject('system.meta.uuid');\n if (obj?.native) {\n if (obj.native.uuid !== uuid) {\n obj.native.uuid = uuid;\n\n logger.info(`Update \"system.meta.uuid:native.uuid\" = \"${obj.native.uuid}\"`);\n\n obj.nonEdit ||= {};\n obj.nonEdit.password = password;\n try {\n await this.objects.setObjectAsync('system.meta.uuid', obj);\n logger.info(`object system.meta.uuid updated: ${uuid}`);\n } catch (e) {\n logger.error(`Cannot update system.meta.uuid: ${e.message}`);\n }\n }\n } else {\n try {\n // @ts-expect-error type uuid is not allowed TODO: allow it for meta?\n await this.objects.setObjectAsync('system.meta.uuid', {\n type: 'meta',\n common: {\n name: 'uuid',\n type: 'uuid',\n },\n ts: new Date().getTime(),\n from: `system.host.${tools.getHostName()}.tools`,\n native: {\n uuid,\n },\n });\n logger.info(`object system.meta.uuid created: ${uuid}`);\n } catch (e) {\n logger.error(`Cannot create system.meta.uuid: ${e.message}`);\n }\n }\n }\n\n // patch iobroker.json file\n if (data?.iobroker) {\n const settings = fs.readJSONSync(tools.getConfigFileName());\n logger.info('Update iobroker.json file');\n this.deepMerge(settings, data.iobroker);\n fs.writeFileSync(tools.getConfigFileName(), JSON.stringify(settings, null, 2));\n }\n\n if (data?.vendor) {\n const vendor = deepClone(data.vendor);\n\n // store vendor\n try {\n const configObj = await this.objects.getObject('system.config');\n if (configObj?.native) {\n let javascriptPasswordEncrypted: string | undefined;\n if (javascriptPassword) {\n if (!configObj.native?.secret) {\n const buf = randomBytes(24);\n configObj.native.secret = buf.toString('hex');\n }\n javascriptPasswordEncrypted = tools.encrypt(configObj.native.secret, javascriptPassword);\n }\n\n if (\n !isDeepStrictEqual(configObj.native.vendor, vendor) ||\n configObj.native.javascriptPassword !== javascriptPasswordEncrypted\n ) {\n configObj.native.vendor = vendor;\n configObj.nonEdit ||= {};\n if (javascriptPassword) {\n configObj.native.javascriptPassword = javascriptPasswordEncrypted;\n configObj.nonEdit.native ||= {};\n configObj.nonEdit.native.javascriptPassword = javascriptPasswordEncrypted;\n }\n configObj.nonEdit.password = password;\n await this.objects.setObjectAsync(configObj._id, configObj);\n logger.info('object system.config updated');\n }\n }\n } catch (e) {\n logger.error(`Cannot update system.config: ${e.message}`);\n }\n } else if (javascriptPassword) {\n const configObj = await this.objects.getObject('system.config');\n\n if (configObj?.native) {\n if (!configObj.native?.secret) {\n const buf = randomBytes(24);\n configObj.native.secret = buf.toString('hex');\n }\n const javascriptPasswordEncrypted = tools.encrypt(configObj.native.secret, javascriptPassword);\n if (configObj.native.javascriptPassword !== javascriptPasswordEncrypted) {\n configObj.native.javascriptPassword = javascriptPasswordEncrypted;\n configObj.nonEdit ||= {};\n configObj.nonEdit.password = password;\n configObj.nonEdit.native ||= {};\n configObj.nonEdit.native.javascriptPassword = javascriptPasswordEncrypted;\n try {\n await this.objects.setObjectAsync(configObj._id, configObj);\n logger.info('object system.config updated');\n } catch (e) {\n logger.error(`Cannot update system.config: ${e.message}`);\n }\n }\n }\n }\n\n // update all existing objects according to vendor\n if (data?.objects) {\n for (let id of Object.keys(data.objects)) {\n if (!id.includes('*')) {\n const _newObj = data.objects[id];\n const obj = await this.objects.getObject(id);\n if (obj) {\n obj.nonEdit ||= {} as ioBroker.NonEditable;\n const originalObj = deepClone(obj);\n _newObj.nonEdit ||= {} as ioBroker.NonEditable;\n _newObj.nonEdit.passHash = obj.nonEdit.passHash;\n // merge objects\n tools.copyAttributes(_newObj, obj);\n\n if (!isDeepStrictEqual(originalObj, obj)) {\n delete obj.nonEdit.passHash;\n obj.nonEdit.password = password;\n logger.info(`Update \"${obj._id}\"`);\n try {\n await this.objects.setObjectAsync(obj._id, obj);\n logger.info(`object \"${obj._id}\" updated`);\n } catch (e) {\n logger.error(`Cannot update \"${obj._id}\": ${e.message}`);\n }\n }\n } else {\n try {\n await this.objects.setObjectAsync(id, _newObj);\n logger.info(`object \"${_newObj._id}\" updated`);\n } catch (e) {\n logger.error(`Cannot update ${id} \"${JSON.stringify(_newObj)}\": ${e.message}`);\n }\n }\n } else {\n id = id.replace(/\\*/g, '');\n const _obj = data.objects[id];\n const arr = await this.objects.getObjectListAsync(\n {\n startkey: id,\n endkey: `${id}\\u9999`,\n },\n { checked: true },\n );\n\n if (arr?.rows?.length) {\n for (const row of arr.rows) {\n const obj = row.value;\n if (obj) {\n obj.nonEdit ||= {};\n const originalObj = deepClone(obj);\n _obj.nonEdit ||= {};\n _obj.nonEdit.passHash = obj.nonEdit.passHash;\n // merge objects\n tools.copyAttributes(_obj, obj);\n\n if (!isDeepStrictEqual(originalObj, obj)) {\n delete obj.nonEdit.passHash;\n obj.nonEdit.password = password;\n logger.info(`Update \"${obj._id}\"`);\n try {\n await this.objects.setObjectAsync(obj._id, obj);\n logger.info(`object \"${obj._id}\" updated`);\n } catch (e) {\n logger.error(`Cannot update \"${obj._id}\": ${e.message}`);\n }\n }\n }\n }\n }\n }\n }\n }\n\n // update host as last\n if (data?.model) {\n const model = data.model;\n const hostname = tools.getHostName();\n const obj = await this.objects.getObject(`system.host.${hostname}`);\n if (obj?.common) {\n if (\n (model.name && model.name !== 'JS controller' && obj.common.title === 'JS controller') ||\n (model.icon && !obj.common.icon) ||\n (model.color && !obj.common.color)\n ) {\n if (model.name) {\n obj.common.title = model.name;\n }\n if (model.icon) {\n obj.common.icon = model.icon;\n }\n if (model.color) {\n obj.common.color = model.color;\n }\n\n obj.nonEdit ||= {};\n obj.nonEdit.password = password;\n\n if (obj.common.title) {\n logger.info(`Update \"system.host.${hostname}:common.title\" = \"${obj.common.title}\"`);\n }\n if (obj.common.icon) {\n logger.info(`Update \"system.host.${hostname}:common.icon\" = \"${!!obj.common.icon}\"`);\n }\n if (obj.common.color) {\n logger.info(`Update \"system.host.${hostname}:common.color\" = \"${obj.common.color}\"`);\n }\n\n try {\n await this.objects.setObjectAsync(obj._id, obj);\n logger.info(`object \"system.host.${hostname}\" updated`);\n } catch (e) {\n logger.error(`Cannot update \"system.host.${hostname}\": ${e.message}`);\n }\n }\n }\n }\n\n // restart ioBroker\n return true;\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';\nimport { tools, EXIT_CODES } from '@iobroker/js-controller-common';\nimport fs from 'fs-extra';\nimport deepClone from 'deep-clone';\nimport { isDeepStrictEqual } from 'node:util';\nimport type { InternalLogger } from '@iobroker/js-controller-common-db/tools';\nimport { randomBytes } from 'node:crypto';\nimport type { ProcessCommandOptions } from '@/lib/cli/cliCommand.js';\nimport { dbConnectAsync } from '@/lib/setup/dbConnection.js';\n\n/** Options for the vendor command */\nexport interface CLIVendorOptions {\n /** The objects database client */\n objects: ObjectsRedisClient;\n}\n\ninterface iobVendorFile {\n vendor?: {\n id?: string;\n name?: string;\n /** Logo for login in admin */\n icon?: string;\n /** Logo in the top left corner of admin */\n logo?: string;\n admin?: {\n menu?: {\n // Settings for left menu\n editable?: false; // Hide edit button in menu\n 'tab-hosts'?: false; // Hide hosts item (See all https://github.com/ioBroker/ioBroker.admin/blob/master/src-rx/src/components/Drawer.js#L142)\n 'tab-files'?: false; // Hide files item\n 'tab-users'?: false; // Hide users item\n 'tab-intro'?: false; // Hide intro item\n 'tab-info'?: false; // Hide info item\n 'tab-adapters'?: false; // Hide adapters item\n 'tab-instances'?: false; // Hide instances item\n 'tab-objects'?: false; // Hide objects item\n 'tab-enums'?: false; // Hide enums item\n 'tab-devices'?: false; // Hide devices item\n 'tab-logs'?: false; // Hide logs item\n 'tab-scenes'?: false; // Hide scenes item\n 'tab-events'?: false; // Hide events item\n 'tab-javascript'?: false; // Hide javascript item\n 'tab-text2command-0'?: false; // Hide text2command-0 item\n 'tab-echarts'?: false; // Hide echarts item\n [tabName: string]: false | undefined;\n };\n appBar?: {\n discovery?: false;\n systemSettings?: false;\n toggleTheme?: false;\n expertMode?: false;\n hostSelector?: false;\n };\n settings?: {\n tabConfig?: false; // Main config tab\n tabRepositories?: false; // Repositories tab\n tabCertificates?: false; // Certificates tab\n tabLetsEncrypt?: false; // Let's Encrypt tab\n tabDefaultACL?: false; // Default ACL tab\n tabStatistics?: false; // Statistics tab\n\n language?: false;\n tempUnit?: false;\n currency?: false;\n dateFormat?: false;\n isFloatComma?: false;\n defaultHistory?: false;\n activeRepo?: false;\n expertMode?: false;\n defaultLogLevel?: false;\n };\n adapters?: {\n gitHubInstall?: false; // hide button install from GitHub/npm\n statistics?: false; // hide statistics on the right top\n filterUpdates?: false; // hide button filter updates in adapter tab\n allowAdapterRating?: false; // do not show and do not load adapter ratings\n };\n login?: {\n title?: string;\n motto?: string;\n link?: string;\n };\n };\n /** Favicon for admin */\n ico?: string;\n uuidPrefix?: string;\n };\n model?: {\n /** name for host */\n name?: string;\n /** Icon for host */\n icon?: string;\n /** Color for host */\n color?: string;\n };\n uuid?: string;\n iobroker?: Partial<ioBroker.IoBrokerJson>;\n objects?: {\n [id: string]: ioBroker.Object;\n };\n}\n\nconst VENDOR_FILE = '/etc/iob-vendor.json';\n\n/**\n * CLI command to apply vendor-specific customizations from the vendor file\n */\nexport class Vendor {\n private readonly objects: ObjectsRedisClient;\n\n /**\n * @param options The objects database client\n */\n constructor(options: CLIVendorOptions) {\n this.objects = options.objects;\n }\n\n /**\n * Deep merge of source into target object\n *\n * @param target target obj\n * @param source source obj\n */\n private deepMerge(target: Record<string, any>, source: Record<string, any>): void {\n Object.keys(source).forEach(attr => {\n if (typeof source[attr] === 'object' && !(source[attr] instanceof Array)) {\n if (target[attr] && typeof target[attr] !== 'object') {\n target[attr] = {};\n }\n target[attr] = target[attr] || {};\n this.deepMerge(target[attr], source[attr]);\n } else {\n target[attr] = source[attr];\n }\n });\n }\n\n /**\n * Read info from '/etc/iob_vendor.json' and executes instructions stored there\n *\n * @param file file path if not given, default path is used\n * @param password vendor password\n * @param javascriptPassword vendor JavaScript password\n * @param logger Logger used to report progress and errors\n */\n async checkVendor(\n file: string | undefined,\n password: string,\n javascriptPassword: string | undefined,\n logger?: InternalLogger,\n ): Promise<boolean> {\n logger ||= {\n debug: (text: string) => console.log(text),\n info: (text: string) => console.log(text),\n error: (text: string) => console.error(text),\n warn: (text: string) => console.warn(text),\n silly: (text: string) => console.log(text),\n };\n\n file ||= VENDOR_FILE;\n\n let data: iobVendorFile;\n if (fs.existsSync(file)) {\n try {\n data = fs.readJSONSync(file);\n } catch (err) {\n logger.error(`cannot read or parse \"${file}\": ${err.message}`);\n throw new Error(`cannot read or parse \"${file}\": ${err.message}`);\n }\n } else {\n logger.error(`\"${file}\" does not exist`);\n throw new Error(`\"${file}\" does not exist`);\n }\n\n if (data?.uuid) {\n const uuid = data.uuid;\n\n // check UUID\n const obj = await this.objects.getObject('system.meta.uuid');\n if (obj?.native) {\n if (obj.native.uuid !== uuid) {\n obj.native.uuid = uuid;\n\n logger.info(`Update \"system.meta.uuid:native.uuid\" = \"${obj.native.uuid}\"`);\n\n obj.nonEdit ||= {};\n obj.nonEdit.password = password;\n try {\n await this.objects.setObjectAsync('system.meta.uuid', obj);\n logger.info(`object system.meta.uuid updated: ${uuid}`);\n } catch (e) {\n logger.error(`Cannot update system.meta.uuid: ${e.message}`);\n }\n }\n } else {\n try {\n // @ts-expect-error type uuid is not allowed TODO: allow it for meta?\n await this.objects.setObjectAsync('system.meta.uuid', {\n type: 'meta',\n common: {\n name: 'uuid',\n type: 'uuid',\n },\n ts: new Date().getTime(),\n from: `system.host.${tools.getHostName()}.tools`,\n native: {\n uuid,\n },\n });\n logger.info(`object system.meta.uuid created: ${uuid}`);\n } catch (e) {\n logger.error(`Cannot create system.meta.uuid: ${e.message}`);\n }\n }\n }\n\n // patch iobroker.json file\n if (data?.iobroker) {\n const settings = fs.readJSONSync(tools.getConfigFileName());\n logger.info('Update iobroker.json file');\n this.deepMerge(settings, data.iobroker);\n fs.writeFileSync(tools.getConfigFileName(), JSON.stringify(settings, null, 2));\n }\n\n if (data?.vendor) {\n const vendor = deepClone(data.vendor);\n\n // store vendor\n try {\n const configObj = await this.objects.getObject('system.config');\n if (configObj?.native) {\n let javascriptPasswordEncrypted: string | undefined;\n if (javascriptPassword) {\n if (!configObj.native?.secret) {\n const buf = randomBytes(24);\n configObj.native.secret = buf.toString('hex');\n }\n javascriptPasswordEncrypted = tools.encrypt(configObj.native.secret, javascriptPassword);\n }\n\n if (\n !isDeepStrictEqual(configObj.native.vendor, vendor) ||\n configObj.native.javascriptPassword !== javascriptPasswordEncrypted\n ) {\n configObj.native.vendor = vendor;\n configObj.nonEdit ||= {};\n if (javascriptPassword) {\n configObj.native.javascriptPassword = javascriptPasswordEncrypted;\n configObj.nonEdit.native ||= {};\n configObj.nonEdit.native.javascriptPassword = javascriptPasswordEncrypted;\n }\n configObj.nonEdit.password = password;\n await this.objects.setObjectAsync(configObj._id, configObj);\n logger.info('object system.config updated');\n }\n }\n } catch (e) {\n logger.error(`Cannot update system.config: ${e.message}`);\n }\n } else if (javascriptPassword) {\n const configObj = await this.objects.getObject('system.config');\n\n if (configObj?.native) {\n if (!configObj.native?.secret) {\n const buf = randomBytes(24);\n configObj.native.secret = buf.toString('hex');\n }\n const javascriptPasswordEncrypted = tools.encrypt(configObj.native.secret, javascriptPassword);\n if (configObj.native.javascriptPassword !== javascriptPasswordEncrypted) {\n configObj.native.javascriptPassword = javascriptPasswordEncrypted;\n configObj.nonEdit ||= {};\n configObj.nonEdit.password = password;\n configObj.nonEdit.native ||= {};\n configObj.nonEdit.native.javascriptPassword = javascriptPasswordEncrypted;\n try {\n await this.objects.setObjectAsync(configObj._id, configObj);\n logger.info('object system.config updated');\n } catch (e) {\n logger.error(`Cannot update system.config: ${e.message}`);\n }\n }\n }\n }\n\n // update all existing objects according to vendor\n if (data?.objects) {\n for (let id of Object.keys(data.objects)) {\n if (!id.includes('*')) {\n const _newObj = data.objects[id];\n const obj = await this.objects.getObject(id);\n if (obj) {\n obj.nonEdit ||= {} as ioBroker.NonEditable;\n const originalObj = deepClone(obj);\n _newObj.nonEdit ||= {} as ioBroker.NonEditable;\n _newObj.nonEdit.passHash = obj.nonEdit.passHash;\n // merge objects\n tools.copyAttributes(_newObj, obj);\n\n if (!isDeepStrictEqual(originalObj, obj)) {\n delete obj.nonEdit.passHash;\n obj.nonEdit.password = password;\n logger.info(`Update \"${obj._id}\"`);\n try {\n await this.objects.setObjectAsync(obj._id, obj);\n logger.info(`object \"${obj._id}\" updated`);\n } catch (e) {\n logger.error(`Cannot update \"${obj._id}\": ${e.message}`);\n }\n }\n } else {\n try {\n await this.objects.setObjectAsync(id, _newObj);\n logger.info(`object \"${_newObj._id}\" updated`);\n } catch (e) {\n logger.error(`Cannot update ${id} \"${JSON.stringify(_newObj)}\": ${e.message}`);\n }\n }\n } else {\n id = id.replace(/\\*/g, '');\n const _obj = data.objects[id];\n const arr = await this.objects.getObjectListAsync(\n {\n startkey: id,\n endkey: `${id}\\u9999`,\n },\n { checked: true },\n );\n\n if (arr?.rows?.length) {\n for (const row of arr.rows) {\n const obj = row.value;\n if (obj) {\n obj.nonEdit ||= {};\n const originalObj = deepClone(obj);\n _obj.nonEdit ||= {};\n _obj.nonEdit.passHash = obj.nonEdit.passHash;\n // merge objects\n tools.copyAttributes(_obj, obj);\n\n if (!isDeepStrictEqual(originalObj, obj)) {\n delete obj.nonEdit.passHash;\n obj.nonEdit.password = password;\n logger.info(`Update \"${obj._id}\"`);\n try {\n await this.objects.setObjectAsync(obj._id, obj);\n logger.info(`object \"${obj._id}\" updated`);\n } catch (e) {\n logger.error(`Cannot update \"${obj._id}\": ${e.message}`);\n }\n }\n }\n }\n }\n }\n }\n }\n\n // update host as last\n if (data?.model) {\n const model = data.model;\n const hostname = tools.getHostName();\n const obj = await this.objects.getObject(`system.host.${hostname}`);\n if (obj?.common) {\n if (\n (model.name && model.name !== 'JS controller' && obj.common.title === 'JS controller') ||\n (model.icon && !obj.common.icon) ||\n (model.color && !obj.common.color)\n ) {\n if (model.name) {\n obj.common.title = model.name;\n }\n if (model.icon) {\n obj.common.icon = model.icon;\n }\n if (model.color) {\n obj.common.color = model.color;\n }\n\n obj.nonEdit ||= {};\n obj.nonEdit.password = password;\n\n if (obj.common.title) {\n logger.info(`Update \"system.host.${hostname}:common.title\" = \"${obj.common.title}\"`);\n }\n if (obj.common.icon) {\n logger.info(`Update \"system.host.${hostname}:common.icon\" = \"${!!obj.common.icon}\"`);\n }\n if (obj.common.color) {\n logger.info(`Update \"system.host.${hostname}:common.color\" = \"${obj.common.color}\"`);\n }\n\n try {\n await this.objects.setObjectAsync(obj._id, obj);\n logger.info(`object \"system.host.${hostname}\" updated`);\n } catch (e) {\n logger.error(`Cannot update \"system.host.${hostname}\": ${e.message}`);\n }\n }\n }\n }\n\n // restart ioBroker\n return true;\n }\n}\n\n/**\n * @param options The process command options\n */\nexport async function processCommandVendor(options: ProcessCommandOptions): Promise<void> {\n const { args, params, callback } = options;\n\n const password = args[0];\n const file = args[1];\n const javascriptPassword = args[2];\n if (!password) {\n console.warn(\n `Please specify the password to update the vendor information!\\n${tools.appName.toLowerCase()} vendor <PASS_PHRASE> <vendor.json>`,\n );\n return void callback(EXIT_CODES.INVALID_ARGUMENTS);\n }\n\n const { objects } = await dbConnectAsync(false, params);\n const vendor = new Vendor({ objects });\n\n try {\n await vendor.checkVendor(file, password, javascriptPassword);\n console.log(`Synchronised vendor information.`);\n return void callback();\n } catch (err) {\n console.error(`Cannot update vendor information: ${err.message}`);\n return void callback(EXIT_CODES.CANNOT_UPDATE_VENDOR);\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["fs", "deepClone"]
7
7
  }
@@ -1,12 +1,22 @@
1
1
  import type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';
2
2
  import type { ProcessExitCallback } from '../_Types.js';
3
+ import type { ProcessCommandOptions } from '../../lib/cli/cliCommand.js';
4
+ /** Options for the vis debug helper */
3
5
  export interface CLIVisDebugOptions {
6
+ /** The objects database client */
4
7
  objects: ObjectsRedisClient;
8
+ /** Callback to exit the process with an exit code */
5
9
  processExit: ProcessExitCallback;
6
10
  }
11
+ /**
12
+ * Helper to upload a vis widget directory for debugging
13
+ */
7
14
  export declare class VisDebug {
8
15
  private readonly objects;
9
16
  private readonly processExit;
17
+ /**
18
+ * @param options The objects client and the process-exit callback
19
+ */
10
20
  constructor(options: CLIVisDebugOptions);
11
21
  /**
12
22
  * Upload widget directory to vis directory
@@ -19,8 +29,12 @@ export declare class VisDebug {
19
29
  /**
20
30
  * Activates vis debug for given widget
21
31
  *
22
- * @param widgetset widget to activate vis debug for
32
+ * @param widgetSet widget to activate vis debug for
23
33
  */
24
- enableDebug(widgetset: string): Promise<void>;
34
+ enableDebug(widgetSet: string): Promise<void>;
25
35
  }
36
+ /**
37
+ * @param options The command options
38
+ */
39
+ export declare function processCommandVisDebug(options: ProcessCommandOptions): void;
26
40
  //# sourceMappingURL=setupVisDebug.d.ts.map