comparison src/lib/User.luan @ 3:2c63b10781e1

add login
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 24 Oct 2024 21:43:44 -0600
parents ee1f91e67509
children 2da10ece826f
comparison
equal deleted inserted replaced
2:ee1f91e67509 3:2c63b10781e1
1 local Luan = require "luan:Luan.luan" 1 local Luan = require "luan:Luan.luan"
2 local error = Luan.error 2 local error = Luan.error
3 local ipairs = Luan.ipairs or error() 3 local ipairs = Luan.ipairs or error()
4 local range = Luan.range or error()
4 local to_string = Luan.to_string or error() 5 local to_string = Luan.to_string or error()
5 local get_local_only = Luan.get_local_only or error() 6 local get_local_only = Luan.get_local_only or error()
6 local set_local_only = Luan.set_local_only or error() 7 local set_local_only = Luan.set_local_only or error()
8 local String = require "luan:String.luan"
9 local sub_string = String.sub or error()
10 local Math = require "luan:Math.luan"
11 local random = Math.random or error()
12 local Table = require "luan:Table.luan"
13 local concat = Table.concat or error()
7 local Lucene = require "luan:lucene/Lucene.luan" 14 local Lucene = require "luan:lucene/Lucene.luan"
8 local lucene_quote = Lucene.quote or error() 15 local lucene_quote = Lucene.quote or error()
9 local Http = require "luan:http/Http.luan" 16 local Http = require "luan:http/Http.luan"
10 local Db = require "site:/lib/Db.luan" 17 local Db = require "site:/lib/Db.luan"
18 local run_in_transaction = Db.run_in_transaction or error()
11 local Logging = require "luan:logging/Logging.luan" 19 local Logging = require "luan:logging/Logging.luan"
12 local logger = Logging.logger "User" 20 local logger = Logging.logger "User"
13 21
14 22
15 local User = {} 23 local User = {}
59 local doc = Db.get_document("id:"..id) 67 local doc = Db.get_document("id:"..id)
60 return doc and doc.type=="user" and from_doc(doc) or nil 68 return doc and doc.type=="user" and from_doc(doc) or nil
61 end 69 end
62 User.get_by_id = get_by_id 70 User.get_by_id = get_by_id
63 71
64 function User.get_by_email(email) 72 local password_chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
65 local doc = Db.get_document("user_email:"..lucene_quote(email)) 73 do
66 return doc and from_doc(doc) 74 local t = {}
75 for i in range(1,#password_chars) do
76 t[#t+1] = sub_string(password_chars,i,i)
77 end
78 password_chars = t
79 end
80
81 local function new_password()
82 local n = #password_chars
83 local t = {}
84 for _ in range(1,10) do
85 t[#t+1] = password_chars[random(n)]
86 end
87 return concat(t)
88 end
89
90 function User.get_or_create_by_email(email)
91 return run_in_transaction( function()
92 local doc = Db.get_document("user_email:"..lucene_quote(email))
93 if doc ~= nil then
94 return from_doc(doc)
95 else
96 local user = User.new{
97 email = email
98 password = new_password()
99 }
100 user.save()
101 return user
102 end
103 end )
67 end 104 end
68 105
69 function User.search(query,sort,rows) 106 function User.search(query,sort,rows)
70 rows = rows or 1000000 107 rows = rows or 1000000
71 local users = {} 108 local users = {}
74 users[#users+1] = from_doc(doc) 111 users[#users+1] = from_doc(doc)
75 end 112 end
76 return users 113 return users
77 end 114 end
78 115
79 function User.current() 116 local function current()
80 local user = get_local_only(User,"current") 117 local user = get_local_only(User,"current")
81 if user == nil then 118 if user == nil then
82 local id = Http.request.cookies.user 119 local id = Http.request.cookies.user
83 local password = Http.request.cookies.password 120 local password = Http.request.cookies.password
84 if id == nil or password == nil then 121 if id == nil or password == nil then
85 user = "nil" 122 user = "nil"
86 else 123 else
87 user = get_by_id(id) 124 user = get_by_id(id)
88 if user == nil or user.registered == nil or user.password ~= password then 125 if user == nil or user.password ~= password then
89 user = "nil" 126 user = "nil"
90 end 127 end
91 end 128 end
92 set_local_only(User,"current",user) 129 set_local_only(User,"current",user)
93 end 130 end
94 return user ~= "nil" and user or nil 131 return user ~= "nil" and user or nil
95 end 132 end
133 User.current = current
96 134
97 function User.current_required() 135 function User.current_required()
98 local user = User.current() 136 local user = current()
99 user or Http.response.send_redirect "/login.html" 137 user or Http.response.send_redirect "/login.html"
100 return user 138 return user
101 end 139 end
102 140
103 return User 141 return User