Mercurial Hosting > lang
comparison src/lib/User.luan @ 2:78708fa556a0
add login
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 08 Jul 2025 15:55:34 -0600 |
parents | |
children | 87fe70201aa8 |
comparison
equal
deleted
inserted
replaced
1:1c87f785eb42 | 2:78708fa556a0 |
---|---|
1 local Luan = require "luan:Luan.luan" | |
2 local error = Luan.error | |
3 local range = Luan.range or error() | |
4 local to_string = Luan.to_string or error() | |
5 local get_local_only = Luan.get_local_only or error() | |
6 local set_local_only = Luan.set_local_only or error() | |
7 local String = require "luan:String.luan" | |
8 local sub_string = String.sub or error() | |
9 local Math = require "luan:Math.luan" | |
10 local random = Math.random or error() | |
11 local Table = require "luan:Table.luan" | |
12 local concat = Table.concat or error() | |
13 local Http = require "luan:http/Http.luan" | |
14 local Lucene = require "luan:lucene/Lucene.luan" | |
15 local lucene_quote = Lucene.quote or error() | |
16 local Db = require "site:/lib/Db.luan" | |
17 local run_in_transaction = Db.run_in_transaction or error() | |
18 local Utils = require "site:/lib/Utils.luan" | |
19 local base_url = Utils.base_url or error() | |
20 | |
21 | |
22 local User = {} | |
23 | |
24 local function from_doc(doc) | |
25 doc.type == "user" or error "wrong type" | |
26 return User.new { | |
27 id = doc.id | |
28 email = doc.user_email | |
29 password = doc.password | |
30 } | |
31 end | |
32 | |
33 local function to_doc(user) | |
34 return { | |
35 type = "user" | |
36 id = user.id | |
37 user_email = user.email or error() | |
38 password = user.password or error() | |
39 } | |
40 end | |
41 | |
42 function User.new(user) | |
43 | |
44 function user.save() | |
45 local doc = to_doc(user) | |
46 Db.save(doc) | |
47 user.id = doc.id | |
48 end | |
49 | |
50 function user.login() | |
51 local id = to_string(user.id) | |
52 Http.response.set_persistent_cookie("user",id) | |
53 Http.response.set_persistent_cookie("password",user.password) | |
54 Http.request.cookies.user = id | |
55 Http.request.cookies.password = user.password or error() | |
56 end | |
57 | |
58 function user.login_url() | |
59 return base_url().."/do_login.html?user="..user.id.."&password="..user.password | |
60 end | |
61 | |
62 return user | |
63 end | |
64 | |
65 local function get_by_id(id) | |
66 local doc = Db.get_document("id:"..id) | |
67 return doc and doc.type=="user" and from_doc(doc) or nil | |
68 end | |
69 User.get_by_id = get_by_id | |
70 | |
71 local password_chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" | |
72 do | |
73 local t = {} | |
74 for i in range(1,#password_chars) do | |
75 t[#t+1] = sub_string(password_chars,i,i) | |
76 end | |
77 password_chars = t | |
78 end | |
79 | |
80 local function new_password() | |
81 local n = #password_chars | |
82 local t = {} | |
83 for _ in range(1,10) do | |
84 t[#t+1] = password_chars[random(n)] | |
85 end | |
86 return concat(t) | |
87 end | |
88 | |
89 local function get_by_email(email) | |
90 local doc = Db.get_document("user_email:"..lucene_quote(email)) | |
91 return doc and from_doc(doc) | |
92 end | |
93 -- User.get_by_email = get_by_email | |
94 | |
95 function User.get_or_create_by_email(email) | |
96 return run_in_transaction( function() | |
97 local user = get_by_email(email) | |
98 if user == nil then | |
99 user = User.new{ | |
100 email = email | |
101 password = new_password() | |
102 notify_email = email | |
103 } | |
104 user.save() | |
105 end | |
106 return user | |
107 end ) | |
108 end | |
109 | |
110 local function current() | |
111 local user = get_local_only(User,"current") | |
112 if user == nil then | |
113 local id = Http.request.cookies.user | |
114 local password = Http.request.cookies.password | |
115 if id == nil or password == nil then | |
116 user = "nil" | |
117 else | |
118 user = get_by_id(id) | |
119 if user == nil or user.password ~= password then | |
120 user = "nil" | |
121 end | |
122 end | |
123 set_local_only(User,"current",user) | |
124 end | |
125 return user ~= "nil" and user or nil | |
126 end | |
127 User.current = current | |
128 | |
129 return User |