Merge 9627789a24
into 53a4b6fd5e
This commit is contained in:
commit
03917c4209
|
@ -460,12 +460,82 @@ class Backend(ldapcherry.backend.Backend):
|
||||||
dn = self._byte_p2(self._get_user(self._byte_p2(username), NO_ATTR))
|
dn = self._byte_p2(self._get_user(self._byte_p2(username), NO_ATTR))
|
||||||
# delete
|
# delete
|
||||||
if dn is not None:
|
if dn is not None:
|
||||||
|
groups = self.get_groups(username)
|
||||||
|
self._logger(
|
||||||
|
severity=logging.DEBUG,
|
||||||
|
msg="%(backend)s: removing user '%(user)s' from '%(group)s'" % {
|
||||||
|
'user': username,
|
||||||
|
'group': groups,
|
||||||
|
'backend': self.backend_name
|
||||||
|
}
|
||||||
|
)
|
||||||
|
self.del_from_groups(username, groups)
|
||||||
ldap_client.delete_s(dn)
|
ldap_client.delete_s(dn)
|
||||||
else:
|
else:
|
||||||
ldap_client.unbind_s()
|
ldap_client.unbind_s()
|
||||||
raise UserDoesntExist(username, self.backend_name)
|
raise UserDoesntExist(username, self.backend_name)
|
||||||
ldap_client.unbind_s()
|
ldap_client.unbind_s()
|
||||||
|
|
||||||
|
def __isModify(self, username, attrs, old_attrs, attr):
|
||||||
|
modify = True
|
||||||
|
# early exit
|
||||||
|
if old_attrs.get(attr) is None:
|
||||||
|
return modify
|
||||||
|
# various modification checks
|
||||||
|
if type(old_attrs[attr]) is list:
|
||||||
|
if type(attrs[attr]) is list:
|
||||||
|
if old_attrs[attr] == attrs[attr]:
|
||||||
|
self._logger(
|
||||||
|
severity=logging.DEBUG,
|
||||||
|
msg="%(backend)s: skipping modification of equal-attribute '%(attr)s'"
|
||||||
|
"/'%(oldAttr)s' for user '%(user)s'" % {
|
||||||
|
'user': username,
|
||||||
|
'attr': attrs[attr],
|
||||||
|
'oldAttr': old_attrs[attr],
|
||||||
|
'backend': self.backend_name
|
||||||
|
}
|
||||||
|
)
|
||||||
|
modify = False
|
||||||
|
if attrs[attr] in old_attrs[attr]:
|
||||||
|
self._logger(
|
||||||
|
severity=logging.DEBUG,
|
||||||
|
msg="%(backend)s: skipping modification of attribute '%(attr)s'"
|
||||||
|
" for user '%(user)s' as it is contained by '%(oldAttr)s'" % {
|
||||||
|
'user': username,
|
||||||
|
'attr': attrs[attr],
|
||||||
|
'oldAttr': old_attrs[attr],
|
||||||
|
'backend': self.backend_name
|
||||||
|
}
|
||||||
|
)
|
||||||
|
modify = False
|
||||||
|
else:
|
||||||
|
if type(attrs[attr]) is list:
|
||||||
|
if old_attrs[attr] in attrs[attr]:
|
||||||
|
self._logger(
|
||||||
|
severity=logging.DEBUG,
|
||||||
|
msg="%(backend)s: skipping modification of contained-attribute '%(attr)s' "
|
||||||
|
"for user '%(user)s'" % {
|
||||||
|
'user': username,
|
||||||
|
'attr': attrs[attr],
|
||||||
|
'backend': self.backend_name
|
||||||
|
}
|
||||||
|
)
|
||||||
|
modify = False
|
||||||
|
else:
|
||||||
|
if attrs[attr] == old_attrs[attr]:
|
||||||
|
self._logger(
|
||||||
|
severity=logging.DEBUG,
|
||||||
|
msg="%(backend)s: skipping modification of equal-attribute '%(attr)s'"
|
||||||
|
"/'%(oldAttr)s' for user '%(user)s'" % {
|
||||||
|
'user': username,
|
||||||
|
'attr': attrs[attr],
|
||||||
|
'oldAttr': old_attrs[attr],
|
||||||
|
'backend': self.backend_name
|
||||||
|
}
|
||||||
|
)
|
||||||
|
modify = False
|
||||||
|
return modify
|
||||||
|
|
||||||
def set_attrs(self, username, attrs):
|
def set_attrs(self, username, attrs):
|
||||||
""" set user attributes"""
|
""" set user attributes"""
|
||||||
ldap_client = self._bind()
|
ldap_client = self._bind()
|
||||||
|
@ -475,6 +545,20 @@ class Backend(ldapcherry.backend.Backend):
|
||||||
dn = self._byte_p2(tmp[0])
|
dn = self._byte_p2(tmp[0])
|
||||||
old_attrs = tmp[1]
|
old_attrs = tmp[1]
|
||||||
for attr in attrs:
|
for attr in attrs:
|
||||||
|
# skip equal attributes
|
||||||
|
if not self.__isModify(username, attrs, old_attrs, attr):
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
self._logger(
|
||||||
|
severity=logging.DEBUG,
|
||||||
|
msg="%(backend)s: modifying user '%(user)s':"
|
||||||
|
" '%(attr)s' vs. '%(oldAttr)s'" % {
|
||||||
|
'user': username,
|
||||||
|
'attr': attrs[attr],
|
||||||
|
'oldAttr': old_attrs.get(attr),
|
||||||
|
'backend': self.backend_name
|
||||||
|
}
|
||||||
|
)
|
||||||
bcontent = self._byte_p2(attrs[attr])
|
bcontent = self._byte_p2(attrs[attr])
|
||||||
battr = self._byte_p2(attr)
|
battr = self._byte_p2(attr)
|
||||||
new = {battr: self._modlist(self._byte_p3(bcontent))}
|
new = {battr: self._modlist(self._byte_p3(bcontent))}
|
||||||
|
|
|
@ -7,16 +7,26 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
function normalizeName(name) {
|
||||||
|
return removeDiacritics(name).toLowerCase().replace(/[^a-z]/g, '');
|
||||||
|
}
|
||||||
|
|
||||||
|
function lcUidExt(firstname, lastname, firstnameEnd, lastnameEnd){
|
||||||
|
return normalizeName(firstname).substring(0, parseInt(firstnameEnd))+normalizeName(lastname).substring(0,parseInt(lastnameEnd));
|
||||||
|
}
|
||||||
|
|
||||||
function lcUid(firstname, lastname){
|
function lcUid(firstname, lastname){
|
||||||
var ascii_firstname = removeDiacritics(firstname).toLowerCase().replace(/[^a-z]/g, '');
|
return lcUidExt(firstname, lastname, 0, 7);
|
||||||
var ascii_lastname = removeDiacritics(lastname).toLowerCase().replace(/[^a-z]/g, '');
|
|
||||||
return ascii_firstname.charAt(0)+ascii_lastname.substring(0,7);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function lcDisplayName(firstname, lastname){
|
function lcDisplayName(firstname, lastname){
|
||||||
return firstname+' '+lastname;
|
return firstname+' '+lastname;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function lcMailExt(firstname, lastname, domain, firstnameEnd, lastnameEnd){
|
||||||
|
return lcUidExt(firstname, lastname, firstnameEnd, lastnameEnd)+domain;
|
||||||
|
}
|
||||||
|
|
||||||
function lcMail(firstname, lastname, domain){
|
function lcMail(firstname, lastname, domain){
|
||||||
return lcUid(firstname, lastname)+domain;
|
return lcUid(firstname, lastname)+domain;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ $('#form').validator({
|
||||||
};
|
};
|
||||||
var $ret = 'PPolicy error';
|
var $ret = 'PPolicy error';
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: '/checkppolicy',
|
url: './checkppolicy',
|
||||||
type: 'POST',
|
type: 'POST',
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
async: false,
|
async: false,
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-12 column">
|
<div class="col-md-12 column">
|
||||||
<div class="well well-sm">
|
<div class="well well-sm">
|
||||||
<form method='POST' autocomplete="off" action='/adduser' role="form" class="form-signin" id="form">
|
<form method='POST' autocomplete="off" action='./adduser' role="form" class="form-signin" id="form">
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<legend>Fill new user's attributes:</legend>
|
<legend>Fill new user's attributes:</legend>
|
||||||
${form | n}
|
${form | n}
|
||||||
|
@ -22,7 +22,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
<script type="text/javascript" src="/static/js/ppolicy.js"></script>
|
<script type="text/javascript" src="./static/js/ppolicy.js"></script>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-2 column">
|
<div class="col-md-2 column">
|
||||||
|
|
|
@ -8,43 +8,43 @@
|
||||||
<meta name="description" content="directory manager">
|
<meta name="description" content="directory manager">
|
||||||
<meta name="author" content="kakwa">
|
<meta name="author" content="kakwa">
|
||||||
|
|
||||||
<!--link rel="stylesheet/less" href="/static/less/bootstrap.less" type="text/css" /-->
|
<!--link rel="stylesheet/less" href="./static/less/bootstrap.less" type="text/css" /-->
|
||||||
<!--link rel="stylesheet/less" href="/static/less/responsive.less" type="text/css" /-->
|
<!--link rel="stylesheet/less" href="./static/less/responsive.less" type="text/css" /-->
|
||||||
<!--script src="/static/js/less-1.3.3.min.js"></script-->
|
<!--script src="./static/js/less-1.3.3.min.js"></script-->
|
||||||
<!--append ‘#!watch’ to the browser URL, then refresh the page. -->
|
<!--append ‘#!watch’ to the browser URL, then refresh the page. -->
|
||||||
|
|
||||||
<link href="/static/css/bootstrap.min.css" rel="stylesheet">
|
<link href="./static/css/bootstrap.min.css" rel="stylesheet">
|
||||||
<link href="/static/css/custom.css" rel="stylesheet">
|
<link href="./static/css/custom.css" rel="stylesheet">
|
||||||
<link href="/static/css/style.css" rel="stylesheet">
|
<link href="./static/css/style.css" rel="stylesheet">
|
||||||
<link href="/static/css/bootstrap-switch.css" rel="stylesheet">
|
<link href="./static/css/bootstrap-switch.css" rel="stylesheet">
|
||||||
<link href="/static/css/tablesorter-bootstrap.css" rel="stylesheet">
|
<link href="./static/css/tablesorter-bootstrap.css" rel="stylesheet">
|
||||||
|
|
||||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||||
<!--[if lt IE 9]>
|
<!--[if lt IE 9]>
|
||||||
<script src="/static/js/html5shiv.js"></script>
|
<script src="./static/js/html5shiv.js"></script>
|
||||||
<![endif]-->
|
<![endif]-->
|
||||||
|
|
||||||
<!-- Fav and touch icons -->
|
<!-- Fav and touch icons -->
|
||||||
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="/static/img/apple-touch-icon-144-precomposed.png">
|
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="./static/img/apple-touch-icon-144-precomposed.png">
|
||||||
<link rel="apple-touch-icon-precomposed" sizes="114x114" href="/static/img/apple-touch-icon-114-precomposed.png">
|
<link rel="apple-touch-icon-precomposed" sizes="114x114" href="./static/img/apple-touch-icon-114-precomposed.png">
|
||||||
<link rel="apple-touch-icon-precomposed" sizes="72x72" href="/static/img/apple-touch-icon-72-precomposed.png">
|
<link rel="apple-touch-icon-precomposed" sizes="72x72" href="./static/img/apple-touch-icon-72-precomposed.png">
|
||||||
<link rel="apple-touch-icon-precomposed" href="/static/img/apple-touch-icon-57-precomposed.png">
|
<link rel="apple-touch-icon-precomposed" href="./static/img/apple-touch-icon-57-precomposed.png">
|
||||||
<link rel="icon" type="image/png" href="/static/img/favicon.png">
|
<link rel="icon" type="image/png" href="./static/img/favicon.png">
|
||||||
|
|
||||||
<script type="text/javascript" src="/static/js/jquery.min.js"></script>
|
<script type="text/javascript" src="./static/js/jquery.min.js"></script>
|
||||||
<script type="text/javascript" src="/static/js/bootstrap.min.js"></script>
|
<script type="text/javascript" src="./static/js/bootstrap.min.js"></script>
|
||||||
<script type="text/javascript" src="/static/js/scripts.js"></script>
|
<script type="text/javascript" src="./static/js/scripts.js"></script>
|
||||||
<script type="text/javascript" src="/static/js/validator.js"></script>
|
<script type="text/javascript" src="./static/js/validator.js"></script>
|
||||||
<script type="text/javascript" src="/static/js/bootstrap-notify.js"></script>
|
<script type="text/javascript" src="./static/js/bootstrap-notify.js"></script>
|
||||||
<script type="text/javascript" src="/static/js/jquery.tablesorter.min.js"></script>
|
<script type="text/javascript" src="./static/js/jquery.tablesorter.min.js"></script>
|
||||||
<script type="text/javascript" src="/static/js/bootstrap-switch.js"></script>
|
<script type="text/javascript" src="./static/js/bootstrap-switch.js"></script>
|
||||||
<script type="text/javascript" src="/static/js/jquery.popconfirm.js"></script>
|
<script type="text/javascript" src="./static/js/jquery.popconfirm.js"></script>
|
||||||
<script type="text/javascript" src="/static/js/removediacritic.js"></script>
|
<script type="text/javascript" src="./static/js/removediacritic.js"></script>
|
||||||
<script type="text/javascript" src="/static/js/lc-filler.js"></script>
|
<script type="text/javascript" src="./static/js/lc-filler.js"></script>
|
||||||
<script type="text/javascript" src="/static/js/sha1.js"></script>
|
<script type="text/javascript" src="./static/js/sha1.js"></script>
|
||||||
% if custom_js:
|
% if custom_js:
|
||||||
% for js in custom_js:
|
% for js in custom_js:
|
||||||
<script type="text/javascript" src="/custom/${js}"></script>
|
<script type="text/javascript" src="./custom/${js}"></script>
|
||||||
% endfor
|
% endfor
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
@ -70,6 +70,6 @@
|
||||||
<p class="muted credit"><a href="http://ldapcherry.readthedocs.org" target="_blank">LdapCherry</a> • © 2016 • Pierre-François Carpentier • Released under the MIT License</p>
|
<p class="muted credit"><a href="http://ldapcherry.readthedocs.org" target="_blank">LdapCherry</a> • © 2016 • Pierre-François Carpentier • Released under the MIT License</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script type="text/javascript" src="/static/js/alignforms.js"></script>
|
<script type="text/javascript" src="./static/js/alignforms.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
${message}
|
${message}
|
||||||
</h4>
|
</h4>
|
||||||
</div>
|
</div>
|
||||||
<a class="btn btn-default blue" href='/'><span class="glyphicon glyphicon-home"></span> Return</a>
|
<a class="btn btn-default blue" href='./'><span class="glyphicon glyphicon-home"></span> Return</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</%block>
|
</%block>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-12 column">
|
<div class="col-md-12 column">
|
||||||
<div class="well well-sm">
|
<div class="well well-sm">
|
||||||
<form method='POST' action='/modify' role="form" class="form-signin" id="form">
|
<form method='POST' action='./modify' role="form" class="form-signin" id="form">
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<legend>Modify user's attributes:</legend>
|
<legend>Modify user's attributes:</legend>
|
||||||
${form | n}
|
${form | n}
|
||||||
|
@ -62,7 +62,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
<script type="text/javascript" src="/static/js/ppolicy.js"></script>
|
<script type="text/javascript" src="./static/js/ppolicy.js"></script>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-2 column">
|
<div class="col-md-2 column">
|
||||||
|
|
|
@ -6,19 +6,19 @@
|
||||||
<nav class="navbar navbar-inverse" role="navigation">
|
<nav class="navbar navbar-inverse" role="navigation">
|
||||||
<div class="navbar-header">
|
<div class="navbar-header">
|
||||||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> <span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button>
|
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> <span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button>
|
||||||
<a class="navbar-brand" href="/"><img src="/static/img/icon.png" alt="LdapCherry" height="22" width="22"></a>
|
<a class="navbar-brand" href="./"><img src="./static/img/icon.png" alt="LdapCherry" height="22" width="22"></a>
|
||||||
<a class="navbar-brand" href="/selfmodify">Self Modify</a>
|
<a class="navbar-brand" href="./selfmodify">Self Modify</a>
|
||||||
% if is_admin:
|
% if is_admin:
|
||||||
<a class="navbar-brand" href="/adduser">Add User</a>
|
<a class="navbar-brand" href="./adduser">Add User</a>
|
||||||
<a class="navbar-brand" href="/searchadmin">Delete/Modify User</a>
|
<a class="navbar-brand" href="./searchadmin">Delete/Modify User</a>
|
||||||
% endif
|
% endif
|
||||||
</div>
|
</div>
|
||||||
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
|
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
|
||||||
<a class="navbar-brand navbar-right" href='/logout'><span class="glyphicon glyphicon-off"></span> Logout</a>
|
<a class="navbar-brand navbar-right" href='./logout'><span class="glyphicon glyphicon-off"></span> Logout</a>
|
||||||
% if is_admin:
|
% if is_admin:
|
||||||
<form method='GET' action='/searchadmin' class="navbar-form navbar-right" role="search" data-toggle="validator">
|
<form method='GET' action='./searchadmin' class="navbar-form navbar-right" role="search" data-toggle="validator">
|
||||||
% else:
|
% else:
|
||||||
<form method='GET' action='/searchuser' class="navbar-form navbar-right" role="search" data-toggle="validator">
|
<form method='GET' action='./searchuser' class="navbar-form navbar-right" role="search" data-toggle="validator">
|
||||||
% endif
|
% endif
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
% if is_admin:
|
% if is_admin:
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<%block name="core">
|
<%block name="core">
|
||||||
<div class="row clearfix">
|
<div class="row clearfix">
|
||||||
<div class="col-md-12 column">
|
<div class="col-md-12 column">
|
||||||
<form method='get' action='/searchadmin' role="form" class="form-inline" data-toggle="validator">
|
<form method='get' action='./searchadmin' role="form" class="form-inline" data-toggle="validator">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="searchstring">Search user to modify/delete</label>
|
<label for="searchstring">Search user to modify/delete</label>
|
||||||
<input type="text" class="form-control" id="searchstring" name="searchstring" placeholder="Search User">
|
<input type="text" class="form-control" id="searchstring" name="searchstring" placeholder="Search User">
|
||||||
|
@ -52,10 +52,10 @@
|
||||||
</td>
|
</td>
|
||||||
% endfor
|
% endfor
|
||||||
<td>
|
<td>
|
||||||
<a href="/modify?user=${user | n,u}" class="btn btn-xs blue pad" ><span class="glyphicon glyphicon-cog"></span> Modify</a>
|
<a href="./modify?user=${user | n,u}" class="btn btn-xs blue pad" ><span class="glyphicon glyphicon-cog"></span> Modify</a>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<a href="/delete?user=${user | n,u}" data-toggle='confirmation-delete' class="btn btn-xs red pad"><span class="glyphicon glyphicon-remove-sign"></span> Delete</a>
|
<a href="./delete?user=${user | n,u}" data-toggle='confirmation-delete' class="btn btn-xs red pad"><span class="glyphicon glyphicon-remove-sign"></span> Delete</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
% endfor
|
% endfor
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<%block name="core">
|
<%block name="core">
|
||||||
<div class="row clearfix">
|
<div class="row clearfix">
|
||||||
<div class="col-md-12 column">
|
<div class="col-md-12 column">
|
||||||
<form method='get' action='/searchuser' role="form" class="form-inline" data-toggle="validator">
|
<form method='get' action='./searchuser' role="form" class="form-inline" data-toggle="validator">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="searchstring">Search user</label>
|
<label for="searchstring">Search user</label>
|
||||||
<input type="text" id="searchstring" data-minlength="3" data-error="Too short" class="form-control" name="searchstring" placeholder="Search User" required>
|
<input type="text" id="searchstring" data-minlength="3" data-error="Too short" class="form-control" name="searchstring" placeholder="Search User" required>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-12 column">
|
<div class="col-md-12 column">
|
||||||
<div class="well well-sm">
|
<div class="well well-sm">
|
||||||
<form method='POST' action='/selfmodify' autocomplete="off" role="form" class="form-signin" id="form">
|
<form method='POST' action='./selfmodify' autocomplete="off" role="form" class="form-signin" id="form">
|
||||||
<legend>Modify your attributes:</legend>
|
<legend>Modify your attributes:</legend>
|
||||||
${form | n}
|
${form | n}
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
@ -17,7 +17,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
<script type="text/javascript" src="/static/js/ppolicy.js"></script>
|
<script type="text/javascript" src="./static/js/ppolicy.js"></script>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-2 column">
|
<div class="col-md-2 column">
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
Service Unavailable
|
Service Unavailable
|
||||||
</h4>
|
</h4>
|
||||||
</div>
|
</div>
|
||||||
<a class="btn btn-default blue" href='/signin'><span class="glyphicon glyphicon-home"></span> Return</a>
|
<a class="btn btn-default blue" href='./signin'><span class="glyphicon glyphicon-home"></span> Return</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-4 column"></div>
|
<div class="col-md-4 column"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in New Issue