view src/change_email.html.luan @ 58:31c895b73bd0

improve change email
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 29 Nov 2022 16:09:17 -0700
parents 169ac5fdb320
children 02d8876dc41d
line wrap: on
line source

local Luan = require "luan:Luan.luan"
local error = Luan.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.header or error()
local footer = Shared.footer or error()
local base_url = Shared.base_url or error()
local call_mail_api = Shared.call_mail_api or error()
local Forum = require "site:/lib/Forum.luan"
local forum_title = Forum.title or error()
local User = require "site:/lib/User.luan"
local Db = require "site:/lib/Db.luan"
local run_in_transaction = Db.run_in_transaction or error()


local function page(contents)
	Io.stdout = Http.response.text_writer()
%>
<!doctype html>
<html>
	<head>
<%		head() %>
		<title><%=forum_title%> - Change Email</title>
	</head>
	<body>
<%		header() %>
		<div content>
			<h1>Change Email</h1>
<%
			contents()
%>
		</div>
<%		footer() %>
	</body>
</html>
<%
end

local function invalid()
	page(function()
%>
			<p>This link is no longer valid.  Please <a href="/change_email.html">try again</a>.</p>
<%
	end)
end

return function()
	local user = User.current_required()
	if user==nil then return end
	local email = Http.request.parameters.email
	local password1 = Http.request.parameters.password1
	local password2 = Http.request.parameters.password2
	if email == nil then
		page(function()
%>
			<form>
				<p>Your current email is <b><%=user.email%></b>.</p>
				<p>
					<label>Change email to</label>
					<input type="email" name="email" autofocus required>
				</p>
				<p><input type="submit"></p>
			</form>
<%
		end)
	elseif password1 == nil and password2 == nil then
		run_in_transaction( function()
			user = user.reload()
			user.hidden_password_1 = User.new_password()
			user.save()
		end )
		local result = call_mail_api( "change_email_1", {
			base_url = base_url()
			from = forum_title.." <support@freedit.org>"
			to = user.email
			email = email
			password = user.hidden_password_1
		} )
		result.okay or error(result.error)
		page(function()
%>
			<p>We have sent an email to your current email address.  Click on the link in that email to change your email.</p>
<%
		end)
	elseif password1 ~= nil then
		if password1 ~= user.hidden_password_1 then
			invalid()
			return
		end
		run_in_transaction( function()
			user = user.reload()
			user.hidden_password_1 = nil
			user.hidden_password_2 = User.new_password()
			user.save()
		end )
		local result = call_mail_api( "change_email_2", {
			base_url = base_url()
			from = forum_title.." <support@freedit.org>"
			email = email
			password = user.hidden_password_2
		} )
		result.okay or error(result.error)
		page(function()
%>
			<p>We have sent an email to <b><%=email%></b>.  Click on the link in that email to complete the change.</p>
<%
		end)
	elseif password2 ~= nil then
		if password2 ~= user.hidden_password_2 then
			invalid()
			return
		end
		run_in_transaction( function()
			user = user.reload()
			user.email = email
			user.hidden_password_2 = nil
			user.save()
		end )
		page(function()
%>
			<p>Your email has been change to <b><%=user.email%></b>.</p>
<%
		end)
	else
		error()
	end
end