groups and reset

This commit is contained in:
2020-05-15 00:40:15 -04:00
parent e71fccd27c
commit 0889832efc
22 changed files with 1463 additions and 128 deletions

View File

@ -0,0 +1,25 @@
module.exports = {
subject: 'Password reset for Theta 42 account',
message: `
<h2> Theta 42 account</h2>
<p>
Hello {{ user.givenName }},
</p>
<p>
You have asked to reset the password for user name <b>{{ user.uid }}</b> . Please
click the link below to complete this request. If this was done in errror,
please ignore this email.
</p>
<p>
{{ link }}
</p>
</p>
Thank you,<br />
Theta 42
</p>
`
};

135
nodejs/views/groups.ejs Normal file
View File

@ -0,0 +1,135 @@
<%- include('top') %>
<script id="rowTemplate" type="text/html">
<p>
<div class="card">
<div class="card-header">
<i class="fad fa-users-class"></i>
Group: {{ cn }}
</div>
<div class="card-body">
<p>
{{ description }}
</p>
<p>
<ul class="list-group">
{{ #member }}
<li class="list-group-item">
<i class="fad fa-user"></i> {{ uid }}
<button type="button" action="group/{{groupCN}}/{{uid}}" method="delete" onclick="formAJAX(this)" evalAJAX="tableAJAX(data.message)" class="btn btn-sm btn-danger float-right">
<i class="fad fa-user-slash"></i>
</button>
</li>
{{ /member }}
</ul>
</p>
<button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fad fa-user-plus"></i>
</button>
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
{{ #toAdd }}{{#.}}
<a class="dropdown-item" action="group/{{groupCN}}/{{uid}}" method="put" onclick="formAJAX(this)" evalAJAX="tableAJAX(data.message)">
<i class="fad fa-user"></i> {{uid}}
</a>
{{/.}}{{ /toAdd }}
</div>
<button type="button" onclick="app.group.remove({cn: '{{cn}}'}, function(){tableAJAX('Group {{cn}} deleted.')})" class="btn btn-danger float-right">
<i class="fad fa-trash"></i>
</button>
</div>
</div>
</p>
</script>
<script type="text/javascript">
var userlist;
function getUserList(callback){
app.user.list(function(error, data){
userlist = data.results;
callback()
})
}
function tableAJAX(actionMessage){
var rowTemplate = $('#rowTemplate').html();
var $target = $('#tableAJAX');
$target.html('').hide();
app.util.actionMessage('Refreshing user list...', $target);
app.group.list(function(error, data){
$.each( data.results, function(key, value) {
// console.log(value.member)
value.toAdd = userlist.map(function(user){
if(!value.member.includes(user.dn)) return user;
})
value.member = value.member.map(function(user){
return {
dn: user,
uid: user.match(/cn=[a-zA-Z0-9\_\-\@\.]+/)[0].replace('cn=', '')
}
})
value.groupCN = value.cn;
user_row = Mustache.render(rowTemplate, value);
$target.append(user_row);
});
$target.fadeIn('slow');
app.util.actionMessage(actionMessage || '', $target, 'info');
});
}
$(document).ready(function(){
getUserList(tableAJAX);
});
</script>
<div class="row" style="display:none">
<div class="col-md-4">
<div class="card">
<div class="card-header">
<i class="fas fa-layer-plus"></i>
Add new group
</div>
<div class="card-header actionMessage" style="display:none"></div>
<div class="card-body">
<form action="group/" method="post" onsubmit="formAJAX(this)" evalAJAX="tableAJAX('')">
<div class="form-group">
<label class="control-label">Name</label>
<input type="text" class="form-control" name="name" placeholder="app_gitea_admin" validate=":3" />
</div>
<div class="form-group">
<label class="control-label">Description</label>
<textarea class="form-control" name="description" placeholder="Admin group for gitea app" validate=":3"></textarea>
</div>
<button type="submit" class="btn btn-outline-dark">Add</button>
</form>
</div>
</div>
</div>
<div class="col-md-8">
<div class="card">
<div class="card-header">
<i class="fad fa-users-class"></i>
Group list
</div>
<div class="alert alert-warning actionMessage" style="display:none">
<!-- Message after AJAX action is preformed -->
</div>
<div class="card-body">
<div class="" id="tableAJAX">
</div>
</div>
</div>
</div>
</div>
<%- include('bottom') %>

View File

@ -9,34 +9,43 @@
<i>Unix User ID:</i> <b>{{uidNumber}} </b><br />
<i>Unix Group ID:</i> <b>{{gidNumber}} </b><br />
<i>LDAP DN:</i> <b>{{dn}} </b><br />
<i>SSH Public Key</i> <b>{{sshPublicKey}}</b><br />
<i>Joined</i> <b>{{createTimestamp}} </b><br />
<i>Joined</i> <b>{{modifyTimestamp}} </b><br />
<i>Edited</i> <b>{{modifyTimestamp}} </b><br />
<img id="profile_photo" >
</script>
<script id="paswordResetTemplate" type="text/html">
<h3>
Reset Password for {{uid}}
</h3>
<form action="user/{{uid}}/password" method="put" onsubmit="formAJAX(this)">
<div class="form-group">
<label class="control-label">Password</label>
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text" ><i class="fad fa-key"></i></span>
</div>
<input type="password" name="userPassword" class="form-control" placeholder="hunter123!" validate=":3" />
</div>
</div>
<div class="form-group">
<label class="control-label">Agian</label>
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text" ><i class="fad fa-key"></i></span>
</div>
<input type="password" name="password" class="form-control" placeholder="hunter123!" validate="eq:userPassword" />
</div>
</div>
<button type="submit" class="btn btn-outline-dark">Change</button>
</form>
</script>
<script type="text/javascript">
function hexToBase64(str) {
return btoa(String.fromCharCode.apply(null, str.replace(/\r|\n/g, "").replace(/([\da-fA-F]{2}) ?/g, "0x$1 ").replace(/ +$/, "").split(" ")));
}
function tableAJAX(actionMessage){
var profileTemplate = $('#profileTemplate').html();
$('#tableAJAX').html('').hide();
app.util.actionMessage('Refreshing user list...')
var user;
app.auth.isLoggedIn(function(error, data){
// data.photo = unescape(encodeURIComponent(data.jpegPhoto));
data.createTimestamp = moment(data.createTimestamp, "YYYYMMDDHHmmssZ").fromNow();
data.modifyTimestamp = moment(data.modifyTimestamp, "YYYYMMDDHHmmssZ").fromNow();
user_row = Mustache.render(profileTemplate, data);
$('#tableAJAX').append(user_row);
user = data
$('#tableAJAX').fadeIn('slow');
app.util.actionMessage(actionMessage || '', {type: 'info'});
});
return btoa(String.fromCharCode.apply(null, str.replace(/\r|\n/g, "").replace(/([\da-fA-F]{2}) ?/g, "0x$1 ").replace(/ +$/, "").split(" ")));
}
function getInvite(){
@ -46,7 +55,26 @@
}
$(document).ready(function(){
tableAJAX(); //populate the table
var profileTemplate = $('#profileTemplate').html();
var paswordResetTemplate = $('#paswordResetTemplate').html();
var $target = $('#tableAJAX');
$target.html('').hide();
app.auth.isLoggedIn(function(error, data){
if(error){
app.util.actionMessage(data.message || '', $target, error ? 'danger': null);
}else{
// data.photo = unescape(encodeURIComponent(data.jpegPhoto));
data.createTimestamp = moment(data.createTimestamp, "YYYYMMDDHHmmssZ").fromNow();
data.modifyTimestamp = moment(data.modifyTimestamp, "YYYYMMDDHHmmssZ").fromNow();
$target.html(Mustache.render(profileTemplate, data));
$('#passwordReset').html(Mustache.render(paswordResetTemplate, data))
$target.fadeIn('slow');
}
});
});
</script>
<div class="row" style="display:none">
@ -56,11 +84,10 @@
<i class="fas fa-user-plus"></i>
Invite User
<div class="float-right">
<i class="far fa-arrows-v"></i>
</div>
</div>
<div class="card-header actionMessage" style="display:none">
</div>
<div class="card-body">
<button onclick="getInvite(this)">New Invite Token</button>
@ -78,6 +105,8 @@
<i class="fad fa-th-list"></i>
Services
</div>
<div class="card-header actionMessage" style="display:none">
</div>
<div class="card-body">
<ul class="list-group text-dark">
<a href="https://emby.718it.biz/" target="_blank" class="text-dark">
@ -107,14 +136,16 @@
</div>
</div>
<div class="col-md-8">
<div class="shadow-lg card card-default">
<div class="shadow-lg card card-default mb-8">
<div class="card-header">
<i class="fad fa-id-card"></i>
Profile
<div class="hover-effect float-right">
<i class="far fa-arrows-v"></i>
</div>
<i class="far fa-arrows-v"></i>
</div>
</div>
<div class="card-header actionMessage" style="display:none">
</div>
<div class="card-body" style="padding-bottom:0">
<div class="alert alert-warning actionMessage" style="display:none">
<!-- Message after AJAX action is preformed -->
@ -124,6 +155,22 @@
</div>
</div>
</div>
<br />
<div class="shadow-lg card">
<div class="card-header">
<i class="fad fa-undo-alt"></i>
Password Reset
<div class="float-right">
<i class="far fa-arrows-v"></i>
</div>
</div>
<div class="card-header actionMessage" style="display:none">
</div>
<div id="passwordReset" class="card-body">
</div>
</div>
</div>
</div>
<%- include('bottom') %>

View File

@ -15,13 +15,12 @@
<div class="card-header">
Add new user
</div>
<div class="card-header actionMessage" style="display:none">
</div>
<div class="card-body">
<p>
Invited By: <b><%= invite.created_by %></b>, <%= invite.created_on %>
</p>
<div class="alert alert-warning actionMessage" style="display:none">
<!-- Message after AJAX action is preformed -->
</div>
<%- include('user_form') %>
</div>

View File

@ -16,6 +16,8 @@
<div class="card-header">
Validate Email
</div>
<div class="card-header actionMessage" style="display:none">
</div>
<div class="card-body">
<p>
Invited By: <b><%= invite.created_by %></b>, <%= invite.created_on %>.

View File

@ -8,26 +8,7 @@
})
$(document).ready(function(){
$( "form[action='login']" ).submit(function( event ) {
event.preventDefault();
$form = $(this);
app.util.actionMessage('')
if($form.attr('isValid') !== 'true'){
console.log('')
return app.util.actionMessage('Please fix the errors bellow!')
}
app.auth.logIn($form.serializeObject(), function(error, data){
if(data){
app.util.actionMessage('Login successful!');
window.location.href = app.util.getUrlParameter('redirect') || '/';
}else{
app.util.actionMessage('Login Failed, please try again');
}
});
});
});
</script>
@ -37,10 +18,10 @@
<div class="card-header">
Password Log in
</div>
<div class="card-header actionMessage" style="display:none">
</div>
<div class="card-body">
<div class="alert alert-warning actionMessage" style="display:none">
</div>
<form action="login" onsubmit="$(this).validate()">
<form action="auth/login" onsubmit="formAJAX(this)" evalAJAX="app.auth.setToken(data.token);window.location.href = app.util.getUrlParameter('redirect') || '/';">
<input type="hidden" name="redirect" value="<%= redirect %>">
<div class="form-group">
@ -71,21 +52,27 @@
<div class="card-header">
Social Login
</div>
<div class="card-header actionMessage" style="display:none">
</div>
<div class="card-body">
<div class="alert alert-warning actionMessage" style="display:none">
</div>
<h3>Coming soon!</h3>
<ul>
<li><i class="fab fa-google"></i> Login with google OATH</li>
<li><i class="fab fa-github"></i> Login with github OATH</li>
<li><i class="fab fa-facebook"></i> Login with facebook OATH</li>
</ul>
<p>
<ul class="list-group">
<li class="list-group-item"><i class="fab fa-google"></i> Login with google OATH</li>
<li class="list-group-item"><i class="fab fa-github"></i> Login with github OATH</li>
<li class="list-group-item"><i class="fab fa-facebook"></i> Login with facebook OATH</li>
</ul>
</p>
</div>
</div>
<div class="shadow-lg card border-danger mb-3">
<div class="shadow-lg card mb-3">
<div class="card-header">
Password Reset
</div>
<div class="card-header actionMessage" style="display:none">
</div>
<div class="card-body">
<p>
Forgot your password? Or your user name? No problem! Just
@ -93,7 +80,7 @@
we will email with the required information to get back up
and running!
</p>
<form action="reset_password" onsubmit="$(this).validate()">
<form action="auth/resetpassword" onsubmit="formAJAX(this)">
<input type="hidden" name="redirect" value="<%= redirect %>">
<div class="form-group">

View File

@ -0,0 +1,41 @@
<%- include('top') %>
<script type="text/javascript">
$(document).ready(function(){
});
</script>
<div class="row" style="display:none">
<div class="col-md-12">
<div class="card">
<div class="card-header">
Password reset
</div>
<div class="card-header actionMessage" style="display:none">
</div>
<div class="card-body">
<form action="auth/resetpassword/<%= token.token%>" method="post" onsubmit="formAJAX(this)">
<div class="form-group">
<label class="control-label">Password</label>
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text" ><i class="fad fa-key"></i></span>
</div>
<input type="password" name="userPassword" class="form-control" placeholder="hunter123!" validate=":3" />
</div>
</div>
<div class="form-group">
<label class="control-label">Agian</label>
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text" ><i class="fad fa-key"></i></span>
</div>
<input type="password" name="password" class="form-control" placeholder="hunter123!" validate="eq:userPassword" />
</div>
</div>
<button type="submit" class="btn btn-outline-dark">Change</button>
</form>
</div>
</div>
</div>
</div>
<%- include('bottom') %>

View File

@ -11,6 +11,7 @@
<!-- Scripts are placed here -->
<script src="https://code.jquery.com/jquery-3.5.0.min.js"></script>
<!-- <script type="text/javascript" src='/static/js/jquery.min.js'></script> -->
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
<!-- <script type="text/javascript" src='/static/js/bootstrap.min.js'></script> -->
<script src="https://kit.fontawesome.com/4625ee80a2.js" crossorigin="anonymous"></script>
@ -30,7 +31,8 @@
<h5 class="hover-effect my-0 mr-md-auto font-weight-normal">SSO Manager - Theta 42</h5>
<nav class="my-2 my-md-0 mr-md-3">
<a class="hover-effect text-dark p-2" href="/"><i class="fad fa-tachometer-alt-fastest"></i> Home</a>
<a class="hover-effect text-dark p-2" href="/users"><i class="fad fa-users"></i> User Admin</a>
<a class="hover-effect text-dark p-2" href="/users"><i class="fad fa-users"></i> Users</a>
<a class="hover-effect text-dark p-2" href="/groups"><i class="fad fa-users-class"></i> Groups</a>
</nav>
<a class="hover-effect btn btn-outline-primary" onclick="app.auth.logOut(e => window.location.href='/')"><i class="fas fa-sign-out"></i> Log Out</a>

View File

@ -28,5 +28,5 @@
<label class="control-label">Again</label>
<input type="password" class="form-control" name="passwordMatch" placeholder="Retype password" validate="eq:userPassword"/>
</div>
<button type="button" onclick="formAJAX(this)" class="btn btn-default">Add</button>
<button type="button" onclick="formAJAX(this)" class="btn btn-outline-dark">Add</button>
</form>

View File

@ -18,19 +18,21 @@
function tableAJAX(actionMessage){
var rowTemplate = $('#rowTemplate').html();
var $target = $('#tableAJAX');
$('#tableAJAX').html('').hide();
app.util.actionMessage('Refreshing user list...')
$target.html('').hide();
app.util.actionMessage('Refreshing user list...', $target);
app.user.list(function(error, data){
$.each( data.results, function(key, value) {
if(value.uidNumber<1500) return;
user_row = Mustache.render(rowTemplate, value);
$('#tableAJAX').append(user_row);
$target.append(user_row);
});
$('#tableAJAX').fadeIn('slow');
$target.fadeIn('slow');
app.util.actionMessage(actionMessage || '', {type: 'info'});
app.util.actionMessage(actionMessage || '', $target, 'info');
});
}
@ -46,6 +48,7 @@
<i class="fas fa-user-plus"></i>
Add new user
</div>
<div class="card-header actionMessage" style="display:none"></div>
<div class="card-body">
<%- include('user_form') %>
</div>
@ -57,10 +60,8 @@
<i class="fad fa-th-list"></i>
User List
</div>
<div class="card-header actionMessage" style="display:none"></div>
<div class="card-body" style="padding-bottom:0">
<div class="alert alert-warning actionMessage" style="display:none">
<!-- Message after AJAX action is preformed -->
</div>
<div class="table-responsive">
<table class="table">
<thead>