1
0
mirror of https://github.com/xuthus83/pigallery2.git synced 2024-11-03 21:04:03 +08:00

Improve enforced user configuration #575 #569

This commit is contained in:
Patrik J. Braun 2023-01-06 18:22:49 +01:00
parent e8651a5210
commit 82bc7ab280
7 changed files with 57 additions and 33 deletions

28
package-lock.json generated
View File

@ -27,7 +27,7 @@
"sharp": "0.31.2", "sharp": "0.31.2",
"ts-exif-parser": "0.2.2", "ts-exif-parser": "0.2.2",
"ts-node-iptc": "1.0.11", "ts-node-iptc": "1.0.11",
"typeconfig": "2.0.32", "typeconfig": "2.0.37",
"typeorm": "0.3.10", "typeorm": "0.3.10",
"xml2js": "0.4.23" "xml2js": "0.4.23"
}, },
@ -116,7 +116,7 @@
"rxjs": "7.5.5", "rxjs": "7.5.5",
"ts-helpers": "1.1.2", "ts-helpers": "1.1.2",
"ts-node": "10.7.0", "ts-node": "10.7.0",
"webpack-bundle-analyzer": "4.5.0", "webpack-bundle-analyzer": "4.7.0",
"xlf-google-translate": "1.0.0-beta.22", "xlf-google-translate": "1.0.0-beta.22",
"zone.js": "0.11.5" "zone.js": "0.11.5"
}, },
@ -20825,9 +20825,9 @@
} }
}, },
"node_modules/typeconfig": { "node_modules/typeconfig": {
"version": "2.0.32", "version": "2.0.37",
"resolved": "https://registry.npmjs.org/typeconfig/-/typeconfig-2.0.32.tgz", "resolved": "https://registry.npmjs.org/typeconfig/-/typeconfig-2.0.37.tgz",
"integrity": "sha512-hbdt3SG0q9Sv6aqPMdmubY/513YokbiLRpqiAOY1HgaROTTw+3QdqYh4uKBoeKVHFgGgT66zBu1tyUkU8xO1lA==", "integrity": "sha512-IB45azVLIZH1Hzn+6jWTKiGef76MqYsAf2SgaqXd+rqaFLPEOkDS/OSp0fPSlOPO4vcSEYpsmd/AgaugpVDUmA==",
"dependencies": { "dependencies": {
"minimist": "1.2.7" "minimist": "1.2.7"
} }
@ -21634,9 +21634,9 @@
} }
}, },
"node_modules/webpack-bundle-analyzer": { "node_modules/webpack-bundle-analyzer": {
"version": "4.5.0", "version": "4.7.0",
"resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.7.0.tgz",
"integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", "integrity": "sha512-j9b8ynpJS4K+zfO5GGwsAcQX4ZHpWV+yRiHDiL+bE0XHJ8NiPYLTNVQdlFYWxtpg9lfAQNlwJg16J9AJtFSXRg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"acorn": "^8.0.4", "acorn": "^8.0.4",
@ -38126,9 +38126,9 @@
} }
}, },
"typeconfig": { "typeconfig": {
"version": "2.0.32", "version": "2.0.37",
"resolved": "https://registry.npmjs.org/typeconfig/-/typeconfig-2.0.32.tgz", "resolved": "https://registry.npmjs.org/typeconfig/-/typeconfig-2.0.37.tgz",
"integrity": "sha512-hbdt3SG0q9Sv6aqPMdmubY/513YokbiLRpqiAOY1HgaROTTw+3QdqYh4uKBoeKVHFgGgT66zBu1tyUkU8xO1lA==", "integrity": "sha512-IB45azVLIZH1Hzn+6jWTKiGef76MqYsAf2SgaqXd+rqaFLPEOkDS/OSp0fPSlOPO4vcSEYpsmd/AgaugpVDUmA==",
"requires": { "requires": {
"minimist": "1.2.7" "minimist": "1.2.7"
} }
@ -38737,9 +38737,9 @@
} }
}, },
"webpack-bundle-analyzer": { "webpack-bundle-analyzer": {
"version": "4.5.0", "version": "4.7.0",
"resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.7.0.tgz",
"integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", "integrity": "sha512-j9b8ynpJS4K+zfO5GGwsAcQX4ZHpWV+yRiHDiL+bE0XHJ8NiPYLTNVQdlFYWxtpg9lfAQNlwJg16J9AJtFSXRg==",
"dev": true, "dev": true,
"requires": { "requires": {
"acorn": "^8.0.4", "acorn": "^8.0.4",

View File

@ -49,7 +49,7 @@
"sharp": "0.31.2", "sharp": "0.31.2",
"ts-exif-parser": "0.2.2", "ts-exif-parser": "0.2.2",
"ts-node-iptc": "1.0.11", "ts-node-iptc": "1.0.11",
"typeconfig": "2.0.32", "typeconfig": "2.0.37",
"xml2js": "0.4.23", "xml2js": "0.4.23",
"typeorm": "0.3.10" "typeorm": "0.3.10"
}, },
@ -135,7 +135,7 @@
"rxjs": "7.5.5", "rxjs": "7.5.5",
"ts-helpers": "1.1.2", "ts-helpers": "1.1.2",
"ts-node": "10.7.0", "ts-node": "10.7.0",
"webpack-bundle-analyzer": "4.5.0", "webpack-bundle-analyzer": "4.7.0",
"xlf-google-translate": "1.0.0-beta.22", "xlf-google-translate": "1.0.0-beta.22",
"zone.js": "0.11.5" "zone.js": "0.11.5"
}, },

View File

@ -109,19 +109,9 @@ export class SQLConnection {
Array.isArray(Config.Users.enforcedUsers) && Array.isArray(Config.Users.enforcedUsers) &&
Config.Users.enforcedUsers.length > 0 Config.Users.enforcedUsers.length > 0
) { ) {
for (const uc of Config.Users.enforcedUsers) { for (let i = 0; i < Config.Users.enforcedUsers.length; ++i) {
const uc = Config.Users.enforcedUsers[i];
const user = await userRepository.findOneBy({name: uc.name}); const user = await userRepository.findOneBy({name: uc.name});
// encrypt password and save back to the config
if (uc.password) {
console.log(uc.password);
if (!uc.encryptedPassword) {
uc.encryptedPassword = PasswordHelper.cryptPassword(uc.password);
}
uc.encrypted = !!uc.encryptedPassword;
uc.password = '';
await Config.save();
}
if (!user) { if (!user) {
Logger.info(LOG_TAG, 'Saving enforced user: ' + uc.name); Logger.info(LOG_TAG, 'Saving enforced user: ' + uc.name);
const a = new UserEntity(); const a = new UserEntity();

View File

@ -4,12 +4,14 @@ import * as crypto from 'crypto';
import * as path from 'path'; import * as path from 'path';
import {ConfigClass, ConfigClassBuilder} from 'typeconfig/node'; import {ConfigClass, ConfigClassBuilder} from 'typeconfig/node';
import {IConfigClass} from 'typeconfig/common'; import {IConfigClass} from 'typeconfig/common';
import {PasswordHelper} from '../../../backend/model/PasswordHelper';
import {TAGS} from '../public/ClientConfig';
declare const process: any; declare const process: any;
const upTime = new Date().toISOString(); const upTime = new Date().toISOString();
@ConfigClass({ @ConfigClass<IConfigClass<TAGS> & ServerConfig>({
configPath: path.join(__dirname, './../../../../config.json'), configPath: path.join(__dirname, './../../../../config.json'),
saveIfNotExist: true, saveIfNotExist: true,
attachDescription: true, attachDescription: true,
@ -30,6 +32,28 @@ const upTime = new Date().toISOString();
enabled: true, enabled: true,
}, },
}, },
onLoadedSync: async (config) => {
let changed = false;
for (let i = 0; i < config.Users.enforcedUsers.length; ++i) {
const uc = config.Users.enforcedUsers[i];
// encrypt password and save back to the config
if (uc.password) {
if (!uc.encryptedPassword) {
uc.encryptedPassword = PasswordHelper.cryptPassword(uc.password);
}
uc.password = '';
changed = true;
}
if (!uc.encrypted) {
uc.encrypted = !!uc.encryptedPassword;
changed = true;
}
}
if (changed) {
config.saveSync();
}
}
}) })
export class PrivateConfigClass extends ServerConfig { export class PrivateConfigClass extends ServerConfig {
@ -54,10 +78,11 @@ export class PrivateConfigClass extends ServerConfig {
} }
async original(): Promise<PrivateConfigClass & IConfigClass> { async original(): Promise<PrivateConfigClass & IConfigClass> {
const pc = ConfigClassBuilder.attachInterface(new PrivateConfigClass()); const pc = ConfigClassBuilder.attachPrivateInterface(new PrivateConfigClass());
await pc.load(); await pc.load();
return pc; return pc;
} }
} }
export const Config = ConfigClassBuilder.attachInterface( export const Config = ConfigClassBuilder.attachInterface(

View File

@ -174,7 +174,7 @@ export class UserConfig {
}) })
role: UserRoles = UserRoles.User; role: UserRoles = UserRoles.User;
@ConfigProperty({ @ConfigProperty<string, ServerConfig, TAGS>({
tags: tags:
{ {
name: $localize`Password`, name: $localize`Password`,
@ -270,7 +270,8 @@ export class ServerUserConfig extends ClientUserConfig {
{ {
name: $localize`Enforced users`, name: $localize`Enforced users`,
priority: ConfigPriority.underTheHood, priority: ConfigPriority.underTheHood,
uiOptional: true uiOptional: true,
githubIssue: 575
} as TAGS, } as TAGS,
description: $localize`Creates these users in the DB if they do not exist. If a user with this name exist, it won't be overwritten, even if the role is different.`, description: $localize`Creates these users in the DB if they do not exist. If a user with this name exist, it won't be overwritten, even if the role is different.`,
}) })

View File

@ -28,7 +28,7 @@ export type TAGS = {
client?: true, client?: true,
priority?: ConfigPriority, priority?: ConfigPriority,
name?: string, name?: string,
relevant?: (c: ClientConfig) => boolean, relevant?: (c: any) => boolean,
dockerSensitive?: boolean, dockerSensitive?: boolean,
hint?: string,// UI hint hint?: string,// UI hint
githubIssue?: number, githubIssue?: number,

View File

@ -189,6 +189,7 @@
<ng-container *ngSwitchCase="'UserConfig'"> <ng-container *ngSwitchCase="'UserConfig'">
<div class="container ps-0 pe-0"> <div class="container ps-0 pe-0">
<div class="row ms-0 me-0 mt-1 mb-1 bg-light" *ngFor="let item of state.value; let i = index"> <div class="row ms-0 me-0 mt-1 mb-1 bg-light" *ngFor="let item of state.value; let i = index">
<div class="col ps-0"> <div class="col ps-0">
<input type="text" class="form-control" <input type="text" class="form-control"
placeholder="Name" placeholder="Name"
@ -217,6 +218,13 @@
[name]="'item_p_'+idName+i" [name]="'item_p_'+idName+i"
[id]="'item_p_'+idName+i" [id]="'item_p_'+idName+i"
required> required>
<input *ngIf="item.encrypted"
type="password"
class="form-control"
value="*****"
disabled
[name]="'item_p_'+idName+i"
[id]="'item_p_'+idName+i">
</div> </div>
<div class="col-1 pe-0"> <div class="col-1 pe-0">
<button [disabled]="(state.value.length == 1 && !state.tags.uiOptional)" <button [disabled]="(state.value.length == 1 && !state.tags.uiOptional)"