Real-time collaboration within space (#411)
This commit is contained in:
+34
-2
@@ -11,8 +11,10 @@ import { AssetBundlePlugSpacePrimitives } from "../common/spaces/asset_bundle_sp
|
||||
import { DiskSpacePrimitives } from "../common/spaces/disk_space_primitives.ts";
|
||||
import { SpacePrimitives } from "../common/spaces/space_primitives.ts";
|
||||
import { S3SpacePrimitives } from "../server/spaces/s3_space_primitives.ts";
|
||||
import { Authenticator } from "../server/auth.ts";
|
||||
import { JSONKVStore } from "../plugos/lib/kv_store.json_file.ts";
|
||||
|
||||
export function serveCommand(
|
||||
export async function serveCommand(
|
||||
options: any,
|
||||
folder?: string,
|
||||
) {
|
||||
@@ -61,12 +63,42 @@ To allow outside connections, pass -L 0.0.0.0 as a flag, and put a TLS terminato
|
||||
new AssetBundle(plugAssetBundle as AssetJson),
|
||||
);
|
||||
|
||||
const authStore = new JSONKVStore();
|
||||
const authenticator = new Authenticator(authStore);
|
||||
|
||||
const flagUser = options.user ?? Deno.env.get("SB_USER");
|
||||
if (flagUser) {
|
||||
// If explicitly added via env/parameter, add on the fly
|
||||
const [username, password] = flagUser.split(":");
|
||||
await authenticator.register(username, password, ["admin"], "");
|
||||
}
|
||||
|
||||
if (options.auth) {
|
||||
// Load auth file
|
||||
const authFile: string = options.auth;
|
||||
console.log("Loading authentication credentials from", authFile);
|
||||
await authStore.load(authFile);
|
||||
(async () => {
|
||||
// Asynchronously kick off file watcher
|
||||
for await (const _event of Deno.watchFs(options.auth)) {
|
||||
console.log("Authentication file changed, reloading...");
|
||||
await authStore.load(authFile);
|
||||
}
|
||||
})().catch(console.error);
|
||||
}
|
||||
|
||||
const envAuth = Deno.env.get("SB_AUTH");
|
||||
if (envAuth) {
|
||||
console.log("Loading authentication from SB_AUTH");
|
||||
authStore.loadString(envAuth);
|
||||
}
|
||||
|
||||
const httpServer = new HttpServer(spacePrimitives!, {
|
||||
hostname,
|
||||
port: port,
|
||||
pagesPath: folder!,
|
||||
clientAssetBundle: new AssetBundle(clientAssetBundle as AssetJson),
|
||||
user: options.user ?? Deno.env.get("SB_USER"),
|
||||
authenticator,
|
||||
keyFile: options.key,
|
||||
certFile: options.cert,
|
||||
maxFileSizeMB: +maxFileSizeMB,
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
import getpass from "https://deno.land/x/getpass@0.3.1/mod.ts";
|
||||
import { JSONKVStore } from "../plugos/lib/kv_store.json_file.ts";
|
||||
import { Authenticator } from "../server/auth.ts";
|
||||
|
||||
export async function userAdd(
|
||||
options: any,
|
||||
username?: string,
|
||||
) {
|
||||
const authFile = options.auth || ".auth.json";
|
||||
console.log("Using auth file", authFile);
|
||||
if (!username) {
|
||||
username = prompt("Username:")!;
|
||||
}
|
||||
if (!username) {
|
||||
return;
|
||||
}
|
||||
const pw = getpass("Password: ");
|
||||
if (!pw) {
|
||||
return;
|
||||
}
|
||||
|
||||
console.log("Adding user to groups", options.group);
|
||||
|
||||
const store = new JSONKVStore();
|
||||
try {
|
||||
await store.load(authFile);
|
||||
} catch (e: any) {
|
||||
if (e instanceof Deno.errors.NotFound) {
|
||||
console.log("Creating new auth database because it didn't exist.");
|
||||
}
|
||||
}
|
||||
const auth = new Authenticator(store);
|
||||
await auth.register(username!, pw!, options.group);
|
||||
await store.save(authFile);
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
import { JSONKVStore } from "../plugos/lib/kv_store.json_file.ts";
|
||||
import { Authenticator } from "../server/auth.ts";
|
||||
|
||||
export async function userChgrp(
|
||||
options: any,
|
||||
username?: string,
|
||||
) {
|
||||
const authFile = options.auth || ".auth.json";
|
||||
console.log("Using auth file", authFile);
|
||||
if (!username) {
|
||||
username = prompt("Username:")!;
|
||||
}
|
||||
if (!username) {
|
||||
return;
|
||||
}
|
||||
|
||||
console.log("Setting groups for user:", options.group);
|
||||
|
||||
const store = new JSONKVStore();
|
||||
try {
|
||||
await store.load(authFile);
|
||||
} catch (e: any) {
|
||||
if (e instanceof Deno.errors.NotFound) {
|
||||
console.log("Creating new auth database because it didn't exist.");
|
||||
}
|
||||
}
|
||||
const auth = new Authenticator(store);
|
||||
await auth.setGroups(username!, options.group);
|
||||
await store.save(authFile);
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
import getpass from "https://deno.land/x/getpass@0.3.1/mod.ts";
|
||||
import { JSONKVStore } from "../plugos/lib/kv_store.json_file.ts";
|
||||
import { Authenticator } from "../server/auth.ts";
|
||||
|
||||
export async function userDelete(
|
||||
options: any,
|
||||
username?: string,
|
||||
) {
|
||||
const authFile = options.auth || ".auth.json";
|
||||
console.log("Using auth file", authFile);
|
||||
if (!username) {
|
||||
username = prompt("Username:")!;
|
||||
}
|
||||
if (!username) {
|
||||
return;
|
||||
}
|
||||
|
||||
const store = new JSONKVStore();
|
||||
try {
|
||||
await store.load(authFile);
|
||||
} catch (e: any) {
|
||||
if (e instanceof Deno.errors.NotFound) {
|
||||
console.log("Creating new auth database because it didn't exist.");
|
||||
}
|
||||
}
|
||||
const auth = new Authenticator(store);
|
||||
|
||||
const user = await auth.getUser(username);
|
||||
|
||||
if (!user) {
|
||||
console.error("User", username, "not found.");
|
||||
Deno.exit(1);
|
||||
}
|
||||
|
||||
await auth.deleteUser(username!);
|
||||
await store.save(authFile);
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
import getpass from "https://deno.land/x/getpass@0.3.1/mod.ts";
|
||||
import { JSONKVStore } from "../plugos/lib/kv_store.json_file.ts";
|
||||
import { Authenticator } from "../server/auth.ts";
|
||||
|
||||
export async function userPasswd(
|
||||
options: any,
|
||||
username?: string,
|
||||
) {
|
||||
const authFile = options.auth || ".auth.json";
|
||||
console.log("Using auth file", authFile);
|
||||
if (!username) {
|
||||
username = prompt("Username:")!;
|
||||
}
|
||||
if (!username) {
|
||||
return;
|
||||
}
|
||||
|
||||
const store = new JSONKVStore();
|
||||
try {
|
||||
await store.load(authFile);
|
||||
} catch (e: any) {
|
||||
if (e instanceof Deno.errors.NotFound) {
|
||||
console.log("Creating new auth database because it didn't exist.");
|
||||
}
|
||||
}
|
||||
const auth = new Authenticator(store);
|
||||
|
||||
const user = await auth.getUser(username);
|
||||
|
||||
if (!user) {
|
||||
console.error("User", username, "not found.");
|
||||
Deno.exit(1);
|
||||
}
|
||||
|
||||
const pw = getpass("New password: ");
|
||||
if (!pw) {
|
||||
return;
|
||||
}
|
||||
|
||||
await auth.setPassword(username!, pw!);
|
||||
await store.save(authFile);
|
||||
}
|
||||
Reference in New Issue
Block a user