From d8fb956c1420e1214b3be422f5ff59185425f7a6 Mon Sep 17 00:00:00 2001
From: Cory McWilliams <cory@unprompted.com>
Date: Thu, 1 Dec 2022 00:26:51 +0000
Subject: [PATCH] A slightly dynamic administration page.  As always, uncertain
 if this is a good direction.

git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4062 ed5197a5-7fde-0310-b194-c3ffbd925b24
---
 core/core.js | 22 ++++++++++++++++++++++
 core/ssb.js  |  7 ++++++-
 src/main.c   | 26 +++++++++++++++-----------
 3 files changed, 43 insertions(+), 12 deletions(-)

diff --git a/core/core.js b/core/core.js
index c5a5e27d2..1fc3173d2 100644
--- a/core/core.js
+++ b/core/core.js
@@ -6,6 +6,19 @@ var gProcessIndex = 0;
 var gProcesses = {};
 var gStatsTimer = false;
 
+const k_global_settings = {
+	index: {
+		type: 'string',
+		default_value: '/~core/apps/',
+		description: 'Default path.',
+	},
+	room: {
+		type: 'boolean',
+		default_value: true,
+		description: 'Whether this instance should behave as a room.',
+	},
+};
+
 var gGlobalSettings = {
 	index: "/~core/apps/",
 };
@@ -240,6 +253,15 @@ async function getProcessBlob(blobId, key, options) {
 				}
 			};
 			if (process.credentials?.permissions?.administration) {
+				imports.core.globalSettingsDescriptions = function() {
+					let settings = Object.assign({}, k_global_settings);
+					for (let [key, value] of Object.entries(gGlobalSettings)) {
+						if (settings[key]) {
+							settings[key].value = value;
+						}
+					}
+					return settings;
+				};
 				imports.core.globalSettingsGet = function(key) {
 					return gGlobalSettings[key];
 				};
diff --git a/core/ssb.js b/core/ssb.js
index e84b6fb79..118d49e2f 100644
--- a/core/ssb.js
+++ b/core/ssb.js
@@ -4,6 +4,7 @@ var g_database = new Database('core');
 let g_attendants = {};
 const k_use_create_history_stream = false;
 const k_blobs_concurrent_target = 8;
+const k_settings = JSON.parse(g_database.get('settings') ?? '{}');
 
 function following(db, id) {
 	var o = db.get(id + ":following");
@@ -195,7 +196,11 @@ ssb.addRpc(['blobs', 'createWants'], function(request) {
 });
 
 ssb.addRpc(['tunnel', 'isRoom'], function(request) {
-	request.send_json({"name": "tilde friends tunnel", "membership": false, "features": ["tunnel", "room1"]});
+	if (k_settings.room) {
+		request.send_json({"name": "tilde friends tunnel", "membership": false, "features": ["tunnel", "room1"]});
+	} else {
+		request.send_json(false);
+	}
 });
 
 function notify_attendant_changed(id, type) {
diff --git a/src/main.c b/src/main.c
index f3e4fc22d..8da6e5265 100644
--- a/src/main.c
+++ b/src/main.c
@@ -250,17 +250,19 @@ xopt_help:
 static int _tf_command_export(const char* file, int argc, char* argv[])
 {
 	typedef struct args_t {
+		const char* user;
 		const char* db_path;
 		bool help;
 	} args_t;
 
 	xoptOption options[] = {
 		{ "db-path", 'd', offsetof(args_t, db_path), NULL, XOPT_TYPE_STRING, NULL, "Sqlite database path (default: db.sqlite)." },
+		{ "user", 'u', offsetof(args_t, user), NULL, XOPT_TYPE_STRING, NULL, "User into whose apps will be exported (default: \"cory\")." },
 		{ "help", 'h', offsetof(args_t, help), NULL, XOPT_TYPE_BOOL, NULL, "Shows this help message." },
 		XOPT_NULLOPTION,
 	};
 
-	args_t args = { 0 };
+	args_t args = { .user = "cory" };
 	const char** extras = NULL;
 	int extra_count = 0;
 	const char *err = NULL;
@@ -292,19 +294,21 @@ static int _tf_command_export(const char* file, int argc, char* argv[])
 	else
 	{
 		const char* k_export[] = {
-			"/~cory/admin",
-			"/~cory/api",
-			"/~cory/apps",
-			"/~cory/db",
-			"/~cory/docs",
-			"/~cory/follow",
-			"/~cory/ssblit",
-			"/~cory/todo",
+			"admin",
+			"api",
+			"apps",
+			"db",
+			"docs",
+			"follow",
+			"ssblit",
+			"todo",
 		};
 		for (int i = 0; i < (int)_countof(k_export); i++)
 		{
-			printf("Exporting %s...\n", k_export[i]);
-			tf_ssb_export(ssb, k_export[i]);
+			char buffer[256];
+			snprintf(buffer, sizeof(buffer), "/~%s/%s", args.user, k_export[i]);
+			printf("Exporting %s...\n", buffer);
+			tf_ssb_export(ssb, buffer);
 		}
 	}
 	tf_ssb_destroy(ssb);