changeset 22:ab533dc97759

private auth
author Franklin Schmidt <fschmidt@gmail.com>
date Sat, 30 Apr 2022 21:50:46 -0600
parents 509cf89048cc
children 49b14f4fe311
files src/admin/edit.html.luan src/lib/Shared.luan src/private/edit.html.luan update_repositories.luan
diffstat 4 files changed, 126 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/src/admin/edit.html.luan	Sat Apr 30 20:33:16 2022 -0600
+++ b/src/admin/edit.html.luan	Sat Apr 30 21:50:46 2022 -0600
@@ -3,20 +3,19 @@
 local pairs = Luan.pairs or error()
 local ipairs = Luan.ipairs or error()
 local stringify = Luan.stringify or error()
-local String = require "luan:String.luan"
-local trim = String.trim or error()
 local Io = require "luan:Io.luan"
 local Http = require "luan:http/Http.luan"
 local Shared = require "site:/lib/Shared.luan"
 local head = Shared.head or error()
 local header = Shared.admin_header or error()
 local get_user = Shared.get_user or error()
+local text_to_list = Shared.text_to_list or error()
 local config = Shared.config or error()
 local list_to_set = Shared.list_to_set or error()
 local get_raw_config = Shared.get_raw_config or error()
 local save_raw_config = Shared.save_raw_config or error()
 local Logging = require "luan:logging/Logging.luan"
-local logger = Logging.logger "edit.html"
+local logger = Logging.logger "admin/edit.html"
 
 
 local function response(name,content)
@@ -38,17 +37,6 @@
 <%
 end
 
-local function text_to_list(text)
-	local list = {}
-	for line in Io.schemes.string(text).read_lines() do
-		line = trim(line)
-		if line ~= "" then
-			list[#list+1] = line
-		end
-	end
-	return list
-end
-
 local function posted(name)
 	local mode = Http.request.parameters.mode or error()
 	local users = Http.request.parameters.users or error()
--- a/src/lib/Shared.luan	Sat Apr 30 20:33:16 2022 -0600
+++ b/src/lib/Shared.luan	Sat Apr 30 21:50:46 2022 -0600
@@ -8,6 +8,7 @@
 local parse = Luan.parse or error()
 local String = require "luan:String.luan"
 local split = String.split or error()
+local trim = String.trim or error()
 local Binary = require "luan:Binary.luan"
 local binary_base64_decode = Binary.base64_decode or error()
 local binary_to_string = Binary.to_string or error()
@@ -84,6 +85,17 @@
 end
 Shared.list_to_set = list_to_set
 
+function Shared.text_to_list(text)
+	local list = {}
+	for line in Io.schemes.string(text).read_lines() do
+		line = trim(line)
+		if line ~= "" then
+			list[#list+1] = line
+		end
+	end
+	return list
+end
+
 local raw_config = parse( uri("file:config/config.luano").read_text() )
 local config = deep_copy(raw_config)
 for name, repo in pairs(config.repos) do
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/private/edit.html.luan	Sat Apr 30 21:50:46 2022 -0600
@@ -0,0 +1,98 @@
+local Luan = require "luan:Luan.luan"
+local error = Luan.error
+local pairs = Luan.pairs or error()
+local ipairs = Luan.ipairs or error()
+local stringify = Luan.stringify or error()
+local Io = require "luan:Io.luan"
+local Http = require "luan:http/Http.luan"
+local Shared = require "site:/lib/Shared.luan"
+local head = Shared.head or error()
+local header = Shared.admin_header or error()
+local text_to_list = Shared.text_to_list or error()
+local config = Shared.config or error()
+local list_to_set = Shared.list_to_set or error()
+local get_raw_config = Shared.get_raw_config or error()
+local save_raw_config = Shared.save_raw_config or error()
+local Logging = require "luan:logging/Logging.luan"
+local logger = Logging.logger "private/edit.html"
+
+
+local function response(content)
+%>
+<!doctype html>
+<html>
+	<head>
+<%		head() %>
+		<title>Edit Mercurial Private</title>
+	<head>
+	<body>
+<%		header() %>
+		<div content>
+			<h1>Edit Private</h1>
+			<%=content%>
+		</div>
+	</body>
+</html>
+<%
+end
+
+local function posted()
+	local users = Http.request.parameters.users or error()
+	users = text_to_list(users)
+	if #users == 0 then
+		return "Users cannot be empty"
+	end
+	for _, user in ipairs(users) do
+		if config.users[user] == nil then
+			return "user "..user.." is not a registered user"
+		end
+	end
+	local raw_config = get_raw_config()
+	raw_config.private = users
+	save_raw_config(raw_config)
+	return nil
+end
+
+return function()
+	Io.stdout = Http.response.text_writer()
+	local error_msg = ""
+	if Http.request.method == "POST" then
+		local error_msg = posted()
+		if error_msg == nil then
+			response([[<p>Private updated</p>]])
+		else
+			response([[<p error>]]..error_msg..[[</p>]])
+		end
+		return
+	end
+%>
+<!doctype html>
+<html>
+	<head>
+<%		head() %>
+		<title>Edit Mercurial Private</title>
+	<head>
+	<body>
+<%		header() %>
+		<div content>
+			<h1>Edit Private</h1>
+			<form method=post>
+				<p>
+				<p>
+					<label>Users (one per line)</label>
+					<textarea name=users>
+<%	for _, user in ipairs(config.private or {}) do %>
+<%=user%>
+<%	end %>
+</textarea>
+					<label>Users who can access /private/</label>
+				</p>
+				<p>
+					<input type=submit value="Update Private">
+				</p>
+			</form>
+		</div>
+	</body>
+</html>
+<%
+end
--- a/update_repositories.luan	Sat Apr 30 20:33:16 2022 -0600
+++ b/update_repositories.luan	Sat Apr 30 21:50:46 2022 -0600
@@ -118,12 +118,23 @@
 for _, repo in pairs(repos) do
 	local writer = nginx_dir.child(repo.name..".pass").text_writer()
 	for _, user_name in ipairs(repo.users) do
-		print_to( writer, htpasswds[user_name] )
+		local htpasswd = htpasswds[user_name] or error(user_name)
+		print_to( writer, htpasswd )
 	end
 	writer.close()
 end
-local all = nginx_dir.child("_all.pass").read_text()
-nginx_dir.child("_private.pass").write_text(all)
+local private = config.private
+if private == nil then
+	local all = nginx_dir.child("_all.pass").read_text()
+	nginx_dir.child("_private.pass").write_text(all)
+else
+	local writer = nginx_dir.child("_private.pass").text_writer()
+	for _, user_name in ipairs(private) do
+		local htpasswd = htpasswds[user_name] or error(user_name)
+		print_to( writer, htpasswd )
+	end
+	writer.close()
+end
 
 -- private
 uri("file:src/private").mkdir()