mirror of
https://github.com/YunoHost/SSOwat.git
synced 2024-09-03 20:06:27 +02:00
[enh] i18n
This commit is contained in:
parent
bf14b2f17f
commit
82457d6437
6 changed files with 74 additions and 41 deletions
51
access.lua
51
access.lua
|
@ -9,6 +9,10 @@ if not srvkey then
|
|||
cache:add("srvkey", srvkey)
|
||||
end
|
||||
cookies = {}
|
||||
lang = ngx.req.get_headers()["Accept-Language"]
|
||||
if lang then
|
||||
lang = string.sub(lang, 1, 2)
|
||||
end
|
||||
|
||||
-- Load conf file
|
||||
local conf_file = assert(io.open(conf_path, "r"), "Configuration file is missing")
|
||||
|
@ -45,7 +49,8 @@ default_conf = {
|
|||
ldap_group = "ou=users,dc=yunohost,dc=org",
|
||||
ldap_identifier = "uid",
|
||||
ldap_attributes = {"uid", "givenname", "sn", "cn", "homedirectory", "mail", "maildrop"},
|
||||
allow_mail_authentication = true
|
||||
allow_mail_authentication = true,
|
||||
default_language = "en"
|
||||
}
|
||||
|
||||
for param, default_value in pairs(default_conf) do
|
||||
|
@ -86,6 +91,14 @@ function string.ends (String, End)
|
|||
return End=='' or string.sub(String, -string.len(End)) == End
|
||||
end
|
||||
|
||||
function t (key)
|
||||
if lang and i18n[lang] then
|
||||
return i18n[lang][key] or ""
|
||||
else
|
||||
return i18n[conf["default_language"]][key] or ""
|
||||
end
|
||||
end
|
||||
|
||||
function cook (cookie_str)
|
||||
table.insert(cookies, cookie_str)
|
||||
end
|
||||
|
@ -233,7 +246,7 @@ function set_headers (user)
|
|||
end
|
||||
user = user or ngx.var.cookie_SSOwAuthUser
|
||||
if not cache:get(user.."-password") then
|
||||
flash("info", "Please log in to access to this content")
|
||||
flash("info", t("please_login"))
|
||||
local back_url = ngx.var.scheme .. "://" .. ngx.var.host .. ngx.var.uri .. uri_args_string()
|
||||
return redirect(portal_url.."?r="..ngx.encode_base64(back_url))
|
||||
end
|
||||
|
@ -371,7 +384,7 @@ function get_data_for(view)
|
|||
local data = {}
|
||||
|
||||
if view == "login.html" then
|
||||
data["title"] = "YunoHost Login"
|
||||
data["title"] = t("login")
|
||||
|
||||
elseif view == "info.html" then
|
||||
set_headers(user)
|
||||
|
@ -395,7 +408,7 @@ function get_data_for(view)
|
|||
elseif view == "password.html" then
|
||||
|
||||
data = {
|
||||
title = "Change password",
|
||||
title = t("change_password"),
|
||||
connected = true
|
||||
}
|
||||
|
||||
|
@ -404,7 +417,7 @@ function get_data_for(view)
|
|||
|
||||
local mails = get_mails(user)
|
||||
data = {
|
||||
title = "Edit "..user,
|
||||
title = t("edit").." "..user,
|
||||
connected = true,
|
||||
uid = user,
|
||||
sn = cache:get(user.."-sn"),
|
||||
|
@ -437,6 +450,16 @@ function get_data_for(view)
|
|||
end
|
||||
end
|
||||
|
||||
-- View translation (use "t_key")
|
||||
if lang and i18n[lang] then
|
||||
translate_table = i18n[lang]
|
||||
else
|
||||
translate_table = i18n[conf["default_language"]]
|
||||
end
|
||||
for k, v in pairs(translate_table) do
|
||||
data["t_"..k] = v
|
||||
end
|
||||
|
||||
data['flash_fail'] = {flashs["fail"]}
|
||||
data['flash_win'] = {flashs["win"] }
|
||||
data['flash_info'] = {flashs["info"]}
|
||||
|
@ -462,17 +485,17 @@ function do_edit ()
|
|||
local ldap = lualdap.open_simple(conf["ldap_host"], 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")
|
||||
flash("win", t("password_changed"))
|
||||
cache:set(user.."-password", args.newpassword, conf["session_timeout"])
|
||||
return redirect(portal_url.."info.html")
|
||||
else
|
||||
flash("fail", "An error occured on password changing")
|
||||
flash("fail", t("password_changed_error"))
|
||||
end
|
||||
else
|
||||
flash("fail", "New passwords don't match")
|
||||
flash("fail", t("password_not_match"))
|
||||
end
|
||||
else
|
||||
flash("fail", "Actual password is wrong")
|
||||
flash("fail", t("wrong_current_password"))
|
||||
end
|
||||
return redirect(portal_url.."password.html")
|
||||
|
||||
|
@ -573,7 +596,7 @@ function do_login ()
|
|||
end
|
||||
else
|
||||
ngx.status = ngx.HTTP_UNAUTHORIZED
|
||||
flash("fail", "Wrong username/password combination")
|
||||
flash("fail", t("wrong_username_password"))
|
||||
return redirect(portal_url)
|
||||
end
|
||||
end
|
||||
|
@ -583,7 +606,7 @@ function do_logout()
|
|||
if is_logged_in() then
|
||||
cache:delete("session_"..ngx.var.cookie_SSOwAuthUser)
|
||||
cache:delete(ngx.var.cookie_SSOwAuthUser.."-"..conf["ldap_identifier"]) -- Ugly trick to reload cache
|
||||
flash("info", "Logged out")
|
||||
flash("info", t("logged_out"))
|
||||
return redirect(portal_url)
|
||||
end
|
||||
end
|
||||
|
@ -673,7 +696,7 @@ then
|
|||
|
||||
else
|
||||
-- Redirect to portal
|
||||
flash("info", "Please log in to access to this content")
|
||||
flash("info", t("please_login"))
|
||||
return redirect(portal_url)
|
||||
end
|
||||
|
||||
|
@ -690,7 +713,7 @@ then
|
|||
end
|
||||
else
|
||||
-- Redirect to portal
|
||||
flash("fail", "Please log in from the portal")
|
||||
flash("fail", t("please_login_from_portal"))
|
||||
return redirect(portal_url)
|
||||
end
|
||||
end
|
||||
|
@ -846,6 +869,6 @@ end
|
|||
-- Else redirect to portal
|
||||
--
|
||||
|
||||
flash("info", "Please log in to access to this content")
|
||||
flash("info", t("please_login"))
|
||||
local back_url = ngx.var.scheme .. "://" .. ngx.var.host .. ngx.var.uri .. uri_args_string()
|
||||
return redirect(portal_url.."?r="..ngx.encode_base64(back_url))
|
||||
|
|
11
init.lua
11
init.lua
|
@ -9,11 +9,22 @@ json = require "json"
|
|||
lualdap = require "lualdap"
|
||||
math = require "math"
|
||||
hige = require "hige"
|
||||
lfs = require "lfs"
|
||||
|
||||
-- Shared table
|
||||
flashs = {}
|
||||
login = {}
|
||||
logout = {}
|
||||
i18n = {}
|
||||
|
||||
local locale_dir = script_path.."portal/locales/"
|
||||
for file in lfs.dir(locale_dir) do
|
||||
if string.sub(file, -4) == "json" then
|
||||
local lang = string.sub(file, 1, 2)
|
||||
local locale_file = io.open(locale_dir..file, "r")
|
||||
i18n[lang] = json.decode(locale_file:read("*all"))
|
||||
end
|
||||
end
|
||||
|
||||
-- Path of the configuration
|
||||
conf_path = "/etc/ssowat/conf.json"
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
<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>
|
||||
<label for="uid" class="col-sm-3 control-label">{{t_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>
|
||||
<label for="givenName" class="col-sm-3 control-label">{{t_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>
|
||||
|
@ -17,22 +17,22 @@
|
|||
</div>
|
||||
<hr>
|
||||
<div class="form-group">
|
||||
<label for="mail" class="col-sm-3 control-label">Mail</label>
|
||||
<label for="mail" class="col-sm-3 control-label">{{t_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-3 text-right hidden-xs"><strong>{{t_aliases}}</strong></div>
|
||||
<div class="col-sm-3 text-left visible-xs"><h4>{{t_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">
|
||||
<input type="email" name="mailalias[]" class="form-control mailalias-input" placeholder="{{t_newalias}}">
|
||||
<div class="text-center" style="display: none;" id="add-mailalias"><a class="btn btn-success"><strong>+</strong></a></div>
|
||||
<div class="clearfix"></div>
|
||||
</blockquote>
|
||||
|
@ -40,15 +40,15 @@
|
|||
</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-3 text-right hidden-xs"><strong>{{t_forward}}</strong></div>
|
||||
<div class="col-sm-3 text-left visible-xs"><h4>{{t_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">
|
||||
<input type="email" name="maildrop[]" class="form-control maildrop-input" placeholder="{{t_newforward}}">
|
||||
<div class="text-center" style="display: none;" id="add-maildrop"><a class="btn btn-success"><strong>+</strong></a></div>
|
||||
<div class="clearfix"></div>
|
||||
</blockquote>
|
||||
|
@ -57,11 +57,11 @@
|
|||
<hr>
|
||||
<div class="row">
|
||||
<div class="col-sm-6 text-center">
|
||||
<input type="submit" class="btn btn-lg btn-primary" value="OK">
|
||||
<input type="submit" class="btn btn-lg btn-primary" value="{{t_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>
|
||||
<a href="info.html" class="btn btn-lg btn-default">{{t_cancel}}</a>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
|
|
@ -1,11 +1,10 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" >
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="format-detection" content="telephone=no" />
|
||||
<meta name="viewport" content="user-scalable=no, width=device-width, height=device-height" />
|
||||
<title>YunoHost Portal</title>
|
||||
<link rel="stylesheet" href="assets/css/bootstrap.min.css" type="text/css" />
|
||||
<title>{{t_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>
|
||||
|
@ -19,7 +18,7 @@
|
|||
<h2>{{{title}}}</h2>
|
||||
{{#connected}}
|
||||
<div class="pull-right" style="margin-top: -31px">
|
||||
<a href="?action=logout">Logout</a>
|
||||
<a href="?action=logout">{{t_logout}}</a>
|
||||
</div>
|
||||
{{/connected}}
|
||||
<hr>
|
||||
|
|
|
@ -26,12 +26,12 @@
|
|||
<div class="visible-sm" style="height: 20px"></div>
|
||||
<div class="col-md-8">
|
||||
<div class="row">
|
||||
<div class="col-sm-4 text-right hidden-xs"><strong>Mail</strong></div>
|
||||
<div class="col-sm-4 visible-xs "><h4>Mail</h4></div>
|
||||
<div class="col-sm-4 text-right hidden-xs"><strong>{{t_mail}}</strong></div>
|
||||
<div class="col-sm-4 visible-xs "><h4>{{t_mail}}</h4></div>
|
||||
<div class="col-sm-8"><blockquote>{{mail}}</blockquote></div>
|
||||
<div class="clearfix"></div><br>
|
||||
<div class="col-sm-4 text-right hidden-xs"><strong>Aliases</strong></div>
|
||||
<div class="col-sm-4 visible-xs "><h4>Aliases</h4></div>
|
||||
<div class="col-sm-4 text-right hidden-xs"><strong>{{t_aliases}}</strong></div>
|
||||
<div class="col-sm-4 visible-xs "><h4>{{t_aliases}}</h4></div>
|
||||
<div class="col-sm-8">
|
||||
<blockquote>
|
||||
{{#mailalias}}
|
||||
|
@ -40,8 +40,8 @@
|
|||
</blockquote>
|
||||
</div>
|
||||
<div class="clearfix"></div><br>
|
||||
<div class="col-sm-4 text-right hidden-xs"><strong>Forward</strong></div>
|
||||
<div class="col-sm-4 visible-xs "><h4>Forward</h4></div>
|
||||
<div class="col-sm-4 text-right hidden-xs"><strong>{{t_forward}}</strong></div>
|
||||
<div class="col-sm-4 visible-xs "><h4>{{t_forward}}</h4></div>
|
||||
<div class="col-sm-8">
|
||||
<blockquote>
|
||||
{{#maildrop}}
|
||||
|
@ -55,10 +55,10 @@
|
|||
<hr>
|
||||
<div class="row">
|
||||
<div class="col-sm-6 text-center">
|
||||
<a href="password.html" class="btn btn-lg btn-danger">Change password</a>
|
||||
<a href="password.html" class="btn btn-lg btn-danger">{{t_change_password}}</a>
|
||||
</div>
|
||||
<div class="visible-xs" style="height: 20px"></div>
|
||||
<div class="col-sm-6 text-center">
|
||||
<a href="edit.html" class="btn btn-lg btn-warning">Edit</a>
|
||||
<a href="edit.html" class="btn btn-lg btn-warning">{{t_edit}}</a>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
<form name="input" action="" method="post">
|
||||
<div class="form-group">
|
||||
<label for="user">Username</label>
|
||||
<label for="user">{{t_username}}</label>
|
||||
<input type="text" name="user" placeholder="john" class="form-control">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="user">Password</label>
|
||||
<label for="user">{{t_password}}</label>
|
||||
<input type="password" name="password" placeholder="•••••" class="form-control">
|
||||
</div>
|
||||
<input type="submit" value="Login" class="btn btn-success">
|
||||
<input type="submit" value="{{t_login}}" class="btn btn-success">
|
||||
</form>
|
||||
|
|
Loading…
Reference in a new issue