mirror of
https://github.com/YunoHost/SSOwat.git
synced 2024-09-03 20:06:27 +02:00
User edition
This commit is contained in:
parent
85f105c2ce
commit
d611d15ce2
6 changed files with 250 additions and 38 deletions
187
access.lua
187
access.lua
|
@ -156,6 +156,37 @@ function set_headers (user)
|
|||
|
||||
end
|
||||
|
||||
function get_mails(user)
|
||||
local mails = { mail = "", mailalias = {}, maildrop = {} }
|
||||
if type(cache[user]["mail"]) == "table" then
|
||||
mails["mail"] = cache[user]["mail"][1]
|
||||
for k, mail in ipairs(cache[user]["mail"]) do
|
||||
if k ~= 1 then table.insert(mails["mailalias"], mail) end
|
||||
end
|
||||
else
|
||||
mails["mail"] = cache[user]["mail"]
|
||||
end
|
||||
if type(cache[user]["maildrop"]) == "table" then
|
||||
for k, mail in ipairs(cache[user]["maildrop"]) do
|
||||
if k ~= 1 then table.insert(mails["maildrop"], mail) end
|
||||
end
|
||||
end
|
||||
return mails
|
||||
end
|
||||
|
||||
function get_domains()
|
||||
local domains = {}
|
||||
ldap = lualdap.open_simple("localhost")
|
||||
for dn, attribs in ldap:search {
|
||||
base = "ou=domains,dc=yunohost,dc=org",
|
||||
scope = "onelevel",
|
||||
attrs = {"virtualdomain"}
|
||||
} do
|
||||
table.insert(domains, attribs["virtualdomain"])
|
||||
end
|
||||
return domains
|
||||
end
|
||||
|
||||
-- Yo dawg
|
||||
function serve(uri)
|
||||
rel_path = string.gsub(uri, conf["portal_path"], "/")
|
||||
|
@ -187,6 +218,7 @@ function serve(uri)
|
|||
mime_types = {
|
||||
html = "text/html",
|
||||
js = "text/javascript",
|
||||
map = "text/javascript",
|
||||
css = "text/css",
|
||||
gif = "image/gif",
|
||||
jpg = "image/jpeg",
|
||||
|
@ -224,37 +256,50 @@ end
|
|||
function get_data_for(view)
|
||||
local user = ngx.var.cookie_SSOwAuthUser
|
||||
local data = {}
|
||||
data['flash_fail'] = {flashs["fail"]}
|
||||
data['flash_win'] = {flashs["win"] }
|
||||
data['flash_info'] = {flashs["info"]}
|
||||
|
||||
if view == "login.html" then
|
||||
data["title"] = "YunoHost Login"
|
||||
|
||||
elseif view == "info.html" then
|
||||
set_headers()
|
||||
data["title"] = cache[user]["uid"].." <small>"..cache[user]["cn"].."</small>"
|
||||
data["connected"] = true
|
||||
data["uid"] = cache[user]["uid"]
|
||||
data["cn"] = cache[user]["cn"]
|
||||
data["mailalias"] = {}
|
||||
data["maildrop"] = {}
|
||||
if type(cache[user]["mail"]) == "table" then
|
||||
data["mail"] = cache[user]["mail"][1]
|
||||
for k, mail in ipairs(cache[user]["mail"]) do
|
||||
if k ~= 1 then table.insert(data["mailalias"], mail) end
|
||||
end
|
||||
else
|
||||
data["mail"] = cache[user]["mail"]
|
||||
end
|
||||
if type(cache[user]["maildrop"]) == "table" then
|
||||
for k, mail in ipairs(cache[user]["maildrop"]) do
|
||||
if k ~= 1 then table.insert(data["maildrop"], mail) end
|
||||
end
|
||||
end
|
||||
set_headers(user)
|
||||
|
||||
local mails = get_mails(user)
|
||||
data = {
|
||||
title = cache[user]["uid"].." <small>"..cache[user]["cn"].."</small>",
|
||||
connected = true,
|
||||
uid = cache[user]["uid"],
|
||||
cn = cache[user]["cn"],
|
||||
mail = mails["mail"],
|
||||
mailalias = mails["mailalias"],
|
||||
maildrop = mails["maildrop"]
|
||||
}
|
||||
|
||||
elseif view == "password.html" then
|
||||
data["title"] = "Change password"
|
||||
data["connected"] = true
|
||||
|
||||
data = {
|
||||
title = "Change password",
|
||||
connected = true
|
||||
}
|
||||
|
||||
elseif view == "edit.html" then
|
||||
set_headers(user)
|
||||
|
||||
local mails = get_mails(user)
|
||||
data = {
|
||||
title = "Edit "..user,
|
||||
connected = true,
|
||||
uid = cache[user]["uid"],
|
||||
sn = cache[user]["sn"],
|
||||
givenName = cache[user]["givenName"],
|
||||
mail = mails["mail"],
|
||||
mailalias = mails["mailalias"],
|
||||
maildrop = mails["maildrop"]
|
||||
}
|
||||
end
|
||||
|
||||
data['flash_fail'] = {flashs["fail"]}
|
||||
data['flash_win'] = {flashs["win"] }
|
||||
data['flash_info'] = {flashs["info"]}
|
||||
return data
|
||||
end
|
||||
|
||||
|
@ -265,21 +310,24 @@ function do_edit ()
|
|||
if is_logged_in() and args
|
||||
then
|
||||
ngx.status = ngx.HTTP_CREATED
|
||||
local user = ngx.var.cookie_SSOwAuthUser
|
||||
|
||||
-- Change password
|
||||
if string.ends(ngx.var.uri, "password.html") then
|
||||
if args.actualpassword
|
||||
and args.actualpassword == cache[ngx.var.cookie_SSOwAuthUser]["password"]
|
||||
if args.currentpassword
|
||||
and args.currentpassword == cache[user]["password"]
|
||||
then
|
||||
if args.newpassword == args.confirm then
|
||||
local dn = "uid="..ngx.var.cookie_SSOwAuthUser..",ou=users,dc=yunohost,dc=org"
|
||||
local ldap = lualdap.open_simple("localhost", dn, args.actualpassword)
|
||||
local dn = "uid="..user..",ou=users,dc=yunohost,dc=org"
|
||||
local ldap = lualdap.open_simple("localhost", dn, args.currentpassword)
|
||||
local password = "{SHA}"..ngx.encode_base64(ngx.sha1_bin(args.newpassword))
|
||||
if ldap:modify(dn, {'=', userPassword = password }) then
|
||||
flash("win", "Password successfully changed")
|
||||
cache[ngx.var.cookie_SSOwAuthUser]["password"] = args.newpassword
|
||||
cache[user]["password"] = args.newpassword
|
||||
return redirect(portal_url.."info.html")
|
||||
else
|
||||
flash("fail", "An error occured on password changing")
|
||||
end
|
||||
end
|
||||
else
|
||||
flash("fail", "New passwords don't match")
|
||||
end
|
||||
|
@ -287,7 +335,76 @@ function do_edit ()
|
|||
flash("fail", "Actual password is wrong")
|
||||
end
|
||||
return redirect(portal_url.."password.html")
|
||||
|
||||
-- Edit user informations
|
||||
elseif string.ends(ngx.var.uri, "edit.html") then
|
||||
if args.givenName and args.sn and args.mail then
|
||||
|
||||
local mailalias = {}
|
||||
if args["mailalias[]"] and type(args["mailalias[]"]) == "table" then
|
||||
mailalias = args["mailalias[]"]
|
||||
end
|
||||
|
||||
local maildrop = {}
|
||||
if args["maildrop[]"] and type(args["maildrop[]"]) == "table" then
|
||||
maildrop = args["maildrop[]"]
|
||||
end
|
||||
|
||||
local mail_pattern = "[A-Za-z0-9%.%%%+%-]+@[A-Za-z0-9%.%%%+%-]+%.%w%w%w?%w?"
|
||||
|
||||
table.insert(mailalias, 1, args.mail)
|
||||
for k, mail in ipairs(mailalias) do
|
||||
if mail == "" then
|
||||
table.remove(mailalias, k)
|
||||
elseif not mail:match(mail_pattern) then
|
||||
flash("fail", "Invalid mail address: "..mail)
|
||||
return redirect(portal_url.."edit.html")
|
||||
else
|
||||
local domains = get_domains()
|
||||
local domain_valid = false
|
||||
for _, domain in ipairs(domains) do
|
||||
if string.ends(mail, "@"..domain) then
|
||||
domain_valid = true
|
||||
break
|
||||
end
|
||||
end
|
||||
if not domain_valid then
|
||||
flash("fail", "Invalid domain for mail "..mail)
|
||||
return redirect(portal_url.."edit.html")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for k, mail in ipairs(maildrop) do
|
||||
if mail == "" then
|
||||
table.remove(maildrop, k)
|
||||
elseif not mail:match(mail_pattern) then
|
||||
flash("fail", "Invalid mail forward address: "..mail)
|
||||
return redirect(portal_url.."edit.html")
|
||||
end
|
||||
end
|
||||
table.insert(maildrop, 1, user)
|
||||
|
||||
local dn = "uid="..user..",ou=users,dc=yunohost,dc=org"
|
||||
local ldap = lualdap.open_simple("localhost", dn, cache[user]["password"])
|
||||
local cn = args.givenName.." "..args.sn
|
||||
if ldap:modify(dn, {'=', cn = cn,
|
||||
gecos = cn,
|
||||
givenName = args.givenName,
|
||||
sn = args.sn,
|
||||
mail = mailalias,
|
||||
maildrop = maildrop })
|
||||
then
|
||||
cache[user]["mail"] = nil
|
||||
set_headers(user) -- Ugly trick to reload cache
|
||||
flash("win", "Informations updated")
|
||||
return redirect(portal_url.."info.html")
|
||||
else
|
||||
flash("fail", "An error occured on user saving")
|
||||
end
|
||||
else
|
||||
flash("fail", "Missing required fields")
|
||||
end
|
||||
return redirect(portal_url.."edit.html")
|
||||
end
|
||||
end
|
||||
|
@ -428,11 +545,15 @@ end
|
|||
-- i.e. http://mydomain.org/ssowat/*
|
||||
|
||||
if ngx.var.host == conf["portal_domain"]
|
||||
and string.starts(ngx.var.uri, conf["portal_path"])
|
||||
and string.starts(ngx.var.uri, string.sub(conf["portal_path"], 1, -2))
|
||||
then
|
||||
|
||||
if ngx.var.request_method == "GET" then
|
||||
|
||||
-- http://mydomain.org/ssowat
|
||||
if ngx.var.uri.."/" == conf["portal_path"] then
|
||||
return redirect(portal_url)
|
||||
end
|
||||
|
||||
uri_args = ngx.req.get_uri_args()
|
||||
if uri_args.action and uri_args.action == 'logout' then
|
||||
-- Logout
|
||||
|
|
6
portal/assets/js/jquery-1.10.2.min.js
vendored
Normal file
6
portal/assets/js/jquery-1.10.2.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
portal/assets/js/jquery-1.10.2.min.map
Normal file
1
portal/assets/js/jquery-1.10.2.min.map
Normal file
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,83 @@
|
|||
<form class="form-horizontal" role="form" method="POST" action="edit.html">
|
||||
<div class="form-group">
|
||||
<label for="uid" class="col-sm-3 control-label">Username</label>
|
||||
<div class="col-sm-9">
|
||||
<input type="text" name="uid" class="form-control" value="{{uid}}" disabled>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="givenName" class="col-sm-3 control-label">Fullname</label>
|
||||
<div class="clearfix visible-xs"></div>
|
||||
<div class="col-sm-4 col-xs-6">
|
||||
<input type="text" name="givenName" class="form-control" value="{{givenName}}" required>
|
||||
</div>
|
||||
<div class="col-sm-5 col-xs-6">
|
||||
<input type="text" name="sn" class="form-control" value="{{sn}}" required>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="form-group">
|
||||
<label for="mail" class="col-sm-3 control-label">Mail</label>
|
||||
<div class="col-sm-9">
|
||||
<input type="email" name="mail" class="form-control" value="{{mail}}" required>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="row">
|
||||
<div class="col-sm-3 text-right hidden-xs"><strong>Aliases</strong></div>
|
||||
<div class="col-sm-3 text-left visible-xs"><h4>Aliases</h4></div>
|
||||
<div class="col-sm-9">
|
||||
<blockquote>
|
||||
{{#mailalias}}
|
||||
<input type="email" name="mailalias[]" class="form-control" value="{{.}}">
|
||||
<br>
|
||||
{{/mailalias}}
|
||||
<input type="email" name="mailalias[]" class="form-control mailalias-input" placeholder="newalias@mydomain.org">
|
||||
<div class="text-center" style="display: none;" id="add-mailalias"><a class="btn btn-success"><strong>+</strong></a></div>
|
||||
<div class="clearfix"></div>
|
||||
</blockquote>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="row">
|
||||
<div class="col-sm-3 text-right hidden-xs"><strong>Forward</strong></div>
|
||||
<div class="col-sm-3 text-left visible-xs"><h4>Forward</h4></div>
|
||||
<div class="col-sm-9">
|
||||
<blockquote>
|
||||
{{#maildrop}}
|
||||
<input type="email" name="maildrop[]" class="form-control" value="{{.}}">
|
||||
<br>
|
||||
{{/maildrop}}
|
||||
<input type="email" name="maildrop[]" class="form-control maildrop-input" placeholder="newforward@myforeigndomain.org">
|
||||
<div class="text-center" style="display: none;" id="add-maildrop"><a class="btn btn-success"><strong>+</strong></a></div>
|
||||
<div class="clearfix"></div>
|
||||
</blockquote>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="row">
|
||||
<div class="col-sm-6 text-center">
|
||||
<input type="submit" class="btn btn-lg btn-primary" value="OK">
|
||||
</div>
|
||||
<div class="visible-xs" style="height: 20px"></div>
|
||||
<div class="col-sm-6 text-center">
|
||||
<a href="info.html" class="btn btn-lg btn-default">Cancel</a>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<script type="text/javascript">
|
||||
$( document ).ready(function() {
|
||||
$("#add-mailalias").show();
|
||||
$("#add-maildrop").show();
|
||||
$(".mailalias-input").hide();
|
||||
$(".maildrop-input").hide();
|
||||
$("#add-mailalias a").on("click", function() {
|
||||
$("#add-mailalias").before($(".mailalias-input:first").clone().show());
|
||||
$("#add-mailalias").before("<br><br>");
|
||||
});
|
||||
$("#add-maildrop a").on("click", function() {
|
||||
$("#add-maildrop").before($(".maildrop-input:first").clone().show());
|
||||
$("#add-maildrop").before("<br><br>");
|
||||
});
|
||||
});
|
||||
</script>
|
|
@ -1,8 +1,9 @@
|
|||
<html>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" >
|
||||
<head>
|
||||
<title>YunoHost</title>
|
||||
<link rel="stylesheet" href="assets/css/bootstrap.min.css" type="text/css"/>
|
||||
<title>YunoHost Portal</title>
|
||||
<link rel="stylesheet" href="assets/css/bootstrap.min.css" type="text/css"/>
|
||||
<script src="assets/js/jquery-1.10.2.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<!-- Padding bootstrap style -->
|
||||
|
@ -10,7 +11,7 @@
|
|||
<div class="col-xs-1 visible-xs"></div>
|
||||
<div class="col-sm-10 col-sm-offset-1 col-xs-10 col-xs-offest-1">
|
||||
<div class="row">
|
||||
<div class="col-sm-6 col-sm-offset-3 col-xs-12">
|
||||
<div class="col-sm-8 col-sm-offset-2 col-xs-12" style="max-width: 750px;">
|
||||
|
||||
<h2>{{{title}}}</h2>
|
||||
{{#connected}}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<form class="form-horizontal" role="form" method="POST" action="password.html">
|
||||
<div class="form-group">
|
||||
<label for="actualpassword" class="col-md-5 control-label">Actual password</label>
|
||||
<label for="currentpassword" class="col-md-5 control-label">Current password</label>
|
||||
<div class="col-md-7">
|
||||
<input type="password" class="form-control" id="actualpassword" name="actualpassword">
|
||||
<input type="password" class="form-control" id="currentpassword" name="currentpassword">
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
|
|
Loading…
Reference in a new issue