Skip to content

Commit ef6671d

Browse files
committed
feat: add --overwrite-config and configurable uuid masking
This is in preparation for the chat completions driver. OpenAI asks that a user ID be provided in requests when service is being provided to other users, so we deterministically generate different UUIDs for this purpose to prevent user information from being exposed.
1 parent f924d48 commit ef6671d

File tree

3 files changed

+42
-13
lines changed

3 files changed

+42
-13
lines changed

src/backend/src/Kernel.js

+1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ class Kernel extends AdvancedBase {
6161
const runtimeEnv = new RuntimeEnvironment({
6262
entry_path: this.entry_path,
6363
logger: bootLogger,
64+
boot_parameters,
6465
});
6566
const environment = runtimeEnv.init();
6667
this.environment = environment;

src/backend/src/boot/RuntimeEnvironment.js

+36-6
Original file line numberDiff line numberDiff line change
@@ -195,10 +195,11 @@ class RuntimeEnvironment extends AdvancedBase {
195195
format: require('string-template'),
196196
}
197197

198-
constructor ({ logger, entry_path }) {
198+
constructor ({ logger, entry_path, boot_parameters }) {
199199
super();
200200
this.logger = logger;
201201
this.entry_path = entry_path;
202+
this.boot_parameters = boot_parameters;
202203
this.path_checks = path_checks(this)(this.modules);
203204
this.config_paths = config_paths(this)(this.modules);
204205
this.runtime_paths = runtime_paths(this)(this.modules);
@@ -258,15 +259,44 @@ class RuntimeEnvironment extends AdvancedBase {
258259
}
259260
}
260261

262+
const owrite_config = this.boot_parameters.args.overwriteConfig;
263+
261264
const { fs, path_, crypto } = this.modules;
262-
let config_values = {};
263-
if ( !using_config ) {
265+
if ( !using_config || owrite_config ) {
266+
const generated_values = {};
267+
generated_values.cookie_name = crypto.randomUUID();
268+
generated_values.jwt_secret = crypto.randomUUID();
269+
generated_values.url_signature_secret = crypto.randomUUID();
270+
generated_values.private_uid_secret = crypto.randomBytes(24).toString('hex');
271+
generated_values.private_uid_namespace = crypto.randomUUID();
272+
if ( using_config ) {
273+
this.logger.info(
274+
`Overwriting ${quot(using_config)} because ` +
275+
`${hl('--overwrite-config')} is set`
276+
);
277+
// make backup
278+
fs.copyFileSync(
279+
path_.join(config_path_entry.path, using_config),
280+
path_.join(config_path_entry.path, using_config + '.bak'),
281+
);
282+
// preserve generated values
283+
{
284+
const config_raw = fs.readFileSync(
285+
path_.join(config_path_entry.path, using_config),
286+
'utf8',
287+
);
288+
const config_values = JSON.parse(config_raw);
289+
for ( const k in generated_values ) {
290+
if ( config_values[k] ) {
291+
generated_values[k] = config_values[k];
292+
}
293+
}
294+
}
295+
}
264296
const generated_config = {
265297
...default_config,
298+
...generated_values,
266299
};
267-
generated_config.cookie_name = crypto.randomUUID();
268-
generated_config.jwt_secret = crypto.randomUUID();
269-
generated_config.url_signature_secret = crypto.randomUUID();
270300
generated_config[""] = null; // for trailing comma
271301
fs.writeFileSync(
272302
path_.join(config_path_entry.path, 'config.json'),

src/backend/src/services/auth/Actor.js

+5-7
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,14 @@
1919
const { AdvancedBase } = require("@heyputer/puter-js-common");
2020
const { Context } = require("../../util/context");
2121
const { get_user, get_app } = require("../../helpers");
22+
const config = require("../../config");
2223

2324
// TODO: add these to configuration; production deployments should change these!
2425

25-
// THIS IS NOT A LEAK
26-
// We use this to obscure user UUIDs, as some APIs require a user identifier
27-
// for abuse prevention. However, there are no services in selfhosted Puter
28-
// that currently make use of this, and we use different values on `puter.com`.
29-
const PRIVATE_UID_NAMESPACE = '1757dc3f-8f04-4d77-b939-ff899045696d';
30-
const PRIVATE_UID_SECRET = 'bf03f0e52f5d93c83822ad8558c625277ce3dddff8dc4a5cb0d3c8493571f770';
31-
// THIS IS NOT A LEAK (see above)
26+
const PRIVATE_UID_NAMESPACE = config.private_uid_namespace
27+
?? require('crypto').randomUUID();
28+
const PRIVATE_UID_SECRET = config.private_uid_secret
29+
?? require('crypto').randomBytes(24).toString('hex');
3230

3331
class Actor extends AdvancedBase {
3432
static MODULES = {

0 commit comments

Comments
 (0)