Mercurial Hosting > luan
annotate src/luan/host/main.luan @ 1360:ee0f0e6c89a0
fix reset_luan
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sun, 21 Apr 2019 02:32:41 -0600 |
parents | 8d95711f6615 |
children | 8fe777ba5045 |
rev | line source |
---|---|
1353
8d95711f6615
replace java() with require "java"
Franklin Schmidt <fschmidt@gmail.com>
parents:
1277
diff
changeset
|
1 require "java" |
1135 | 2 local Luan = require "luan:Luan.luan" |
3 local error = Luan.error | |
1164 | 4 local type = Luan.type or error() |
1135 | 5 local ipairs = Luan.ipairs or error() |
6 local try = Luan.try or error() | |
7 local Io = require "luan:Io.luan" | |
8 local Rpc = require "luan:Rpc.luan" | |
9 local Thread = require "luan:Thread.luan" | |
10 local String = require "luan:String.luan" | |
11 local literal = String.literal or error() | |
12 local lower = String.lower or error() | |
13 local matches = String.matches or error() | |
14 local Hosting = require "luan:host/Hosting.luan" | |
15 local Logging = require "luan:logging/Logging.luan" | |
16 local logger = Logging.logger "main" | |
1182 | 17 local WebHandler = Hosting.WebHandler or error() |
1181
51d1342e25ad
luanhost password handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1164
diff
changeset
|
18 local Util = require "classpath:luan/host/Util.luan" |
51d1342e25ad
luanhost password handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1164
diff
changeset
|
19 local read_password = Util.read_password or error() |
51d1342e25ad
luanhost password handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1164
diff
changeset
|
20 local write_password = Util.write_password or error() |
1135 | 21 |
22 | |
23 local sites_dir = Io.schemes.file(Hosting.sites_dir) | |
24 | |
25 sites_dir.mkdir() | |
26 | |
27 local function delete_unused(file) | |
28 if file.is_directory() then | |
29 if file.name() == "local" then | |
30 return false | |
31 end | |
32 local all_deleted = true | |
33 for _,child in ipairs(file.children()) do | |
34 all_deleted = delete_unused(child) and all_deleted | |
35 end | |
36 if not all_deleted then | |
37 return false | |
38 end | |
39 end | |
40 file.delete() | |
41 return true | |
42 end | |
43 | |
44 | |
45 local fns = Rpc.functions | |
46 | |
47 local function get_dir(domain,password) | |
1164 | 48 type(domain)=="string" or error() |
49 type(password)=="string" or error() | |
1135 | 50 domain = lower(domain) |
51 local dir = sites_dir.child(domain) | |
52 if dir.exists() then | |
1181
51d1342e25ad
luanhost password handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1164
diff
changeset
|
53 local pwd = read_password(domain) |
1135 | 54 if pwd ~= password then |
55 error "wrong password" | |
56 end | |
57 return dir.child("site") | |
58 else | |
59 return nil | |
60 end | |
61 end | |
62 | |
63 function fns.get(domain,password) | |
64 local site_dir = get_dir(domain,password) | |
65 if site_dir == nil then | |
66 return nil | |
67 end | |
68 | |
69 local children, file_info | |
70 | |
71 function children(dir) | |
72 if dir.name() == "local" then | |
73 return {} | |
74 end | |
75 local rtn = {} | |
76 for _,child in ipairs(dir.children()) do | |
77 local info = file_info(child) | |
78 if info ~= nil then | |
79 rtn[info.name] = info | |
80 end | |
81 end | |
82 return rtn | |
83 end | |
84 | |
85 function file_info(file) | |
86 local info = { name = file.name(), path = file.to_string() } | |
87 if file.is_directory() then | |
88 info.children = children(file) | |
89 elseif file.is_file() then | |
90 info.checksum = file.checksum() | |
91 else | |
92 return nil | |
93 end | |
94 return info | |
95 end | |
96 | |
97 return file_info(site_dir) | |
98 end | |
99 | |
100 function fns.create(domain,password) | |
1164 | 101 type(domain)=="string" or error() |
102 type(password)=="string" or error() | |
1135 | 103 domain = lower(domain) |
104 local dir = sites_dir.child(domain) | |
105 dir.exists() and error "already exists" | |
106 dir.mkdir() | |
1181
51d1342e25ad
luanhost password handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1164
diff
changeset
|
107 write_password(domain,password) |
1135 | 108 dir = dir.child("site") |
109 dir.mkdir() | |
110 return { name = dir.name(), path = dir.to_string(), children = {} } | |
111 end | |
112 | |
113 local function security(site_dir,file) | |
114 matches( file.to_string(), "^"..literal(site_dir.to_string()) ) or error "security violation" | |
115 end | |
116 | |
117 function fns.copy_file(domain,password,dir,name,content) | |
118 local site_dir = get_dir(domain,password) | |
119 site_dir or error "domain not found" | |
120 local file = Io.schemes.file(dir).child(name) | |
121 security(site_dir,file) | |
122 file.delete() | |
123 file.write(content) | |
124 end | |
125 | |
126 function fns.mkdir(domain,password,dir,name) | |
127 local site_dir = get_dir(domain,password) | |
128 site_dir or error "domain not found" | |
129 local file = Io.schemes.file(dir).child(name) | |
130 security(site_dir,file) | |
131 file.mkdir() | |
132 return { name = file.name(), path = file.to_string(), children = {} } | |
133 end | |
134 | |
135 function fns.delete_unused(domain,password,path) | |
136 local site_dir = get_dir(domain,password) | |
137 site_dir or error "domain not found" | |
138 local file = Io.schemes.file(path) | |
139 security(site_dir,file) | |
140 return delete_unused(file) | |
141 end | |
142 | |
143 function fns.update_handler(domain,password) | |
144 local site_dir = get_dir(domain,password) | |
145 site_dir or error "domain not found" | |
146 domain = lower(domain) | |
147 WebHandler.removeHandler(domain) | |
148 WebHandler.loadHandler(domain) | |
149 end | |
150 | |
151 function fns.delete(domain,password) | |
152 local site_dir = get_dir(domain,password) | |
153 site_dir or error "domain not found" | |
154 site_dir.parent().delete() | |
155 domain = lower(domain) | |
156 WebHandler.removeHandler(domain) | |
157 end | |
158 | |
159 function fns.exists(domain) | |
1164 | 160 type(domain)=="string" or error() |
1135 | 161 domain = lower(domain) |
162 return sites_dir.child(domain).exists() | |
163 end | |
164 | |
165 function fns.change_domain(old_domain,new_domain,password) | |
166 local old_dir = get_dir(old_domain,password) | |
167 old_dir or error "domain not found" | |
168 old_dir = old_dir.parent() | |
1164 | 169 type(new_domain)=="string" or error() |
1135 | 170 new_domain = lower(new_domain) |
171 local new_dir = sites_dir.child(new_domain) | |
172 new_dir.exists() and error "new_domain already exists" | |
173 WebHandler.removeHandler(old_domain) | |
174 old_dir.rename_to(new_dir.to_string()) | |
175 WebHandler.removeHandler(old_domain) | |
176 WebHandler.loadHandler(new_domain) | |
177 end | |
178 | |
179 function fns.change_password(domain,old_password,new_password) | |
180 local site_dir = get_dir(domain,old_password) | |
181 site_dir or error "domain not found" | |
1181
51d1342e25ad
luanhost password handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1164
diff
changeset
|
182 write_password(domain,new_password) |
1135 | 183 WebHandler.removeHandler(domain) |
184 WebHandler.loadHandler(domain) | |
185 end | |
186 | |
187 fns.call = WebHandler.callSite | |
188 | |
189 Thread.fork(Rpc.serve) |