This commit is contained in:
2020-05-03 18:22:51 -04:00
commit 8dc0e946b1
98 changed files with 19301 additions and 0 deletions

3
nodejs/views/bottom.ejs Executable file
View File

@ -0,0 +1,3 @@
</div>
</body>
</html>

106
nodejs/views/home.ejs Normal file
View File

@ -0,0 +1,106 @@
<%- include('top') %>
<script id="profileTemplate" type="text/html">
<h2><i>User Name:</i> <b>{{uid}}</b></h2>
<i>Name:</i> <b>{{givenName}} {{sn}}</b><br />
<i>Email:</i> <b>{{mail}} </b><br />
<i>Phone:</i> <b>{{mobile}} </b><br />
<i>Home Directory:</i> <b>{{homeDirectory}} </b><br />
<i>Login Shell:</i> <b>{{loginShell}} </b><br />
<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>Joined</i> <b>{{createTimestamp}} </b><br />
<i>Joined</i> <b>{{modifyTimestamp}} </b><br />
<img id="profile_photo" >
</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'});
});
}
function getInvite(){
app.user.createInvite(function(error, data){
console.log(data)
$('#invite_token').html(location.origin+"/login/invite/"+data.token);
});
}
$(document).ready(function(){
tableAJAX(); //populate the table
});
</script>
<div class="row" style="display:none">
<div class="col-md-4">
<div class="card mb-3 card-default">
<div class="card-header">
<span class="card-title">
<div class="float-right">
<i class="far fa-arrows-v"></i>
</div>
Invite User
</span>
</div>
<div class="card-body">
<button onclick="getInvite(this)">New Invite Token</button>
<div>
<b id="invite_token"></b>
</div>
</div>
</div>
<div class="card mb-3 card-default">
<div class="card-header">
<div class="float-right">
<i class="far fa-arrows-v"></i>
</div>
<i class="fas fa-user-plus"></i> Add new user
</div>
<div class="card-body">
<%- include('user_form') %>
</div>
</div>
</div>
<div class="col-md-8">
<div class="card card-default">
<div class="card-header">
User List
<div class="float-right">
<i class="far fa-arrows-v"></i>
</div>
</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 id="tableAJAX" style="display:none">
</div>
</div>
</div>
</div>
</div>
<%- include('bottom') %>

2
nodejs/views/index.ejs Executable file
View File

@ -0,0 +1,2 @@
<% include top %>
<% include bottom %>

36
nodejs/views/invite.ejs Normal file
View File

@ -0,0 +1,36 @@
<%- include('top') %>
<script type="text/javascript">
function tableAJAX(message){
app.util.actionMessage(message);
}
$(document).ready(function(){
$('form').attr('action', 'auth/invite/<%= invite.token %>').attr('evalAJAX', 'location.replace("/login");')
});
</script>
<div class="row" style="display:none">
<div class="col-md-12">
<div class="panel panel-default">
<div class="panel-heading">
<div class="panel-title">
Add new user
<div class="pull-right">
<label class="glyphicon glyphicon-circle-arrow-down panel-toggle"></label>
</div>
</div>
</div>
<div class="panel-body">
<h3>
Invited By: <b><%= invite.created_by %></b>, On <b><%= invite.created_on %></b>
</h3>
<div class="alert alert-warning actionMessage" style="display:none">
<!-- Message after AJAX action is preformed -->
</div>
<%- include('user_form') %>
</div>
</div>
</div>
</div>
<%- include('bottom') %>

59
nodejs/views/login.ejs Executable file
View File

@ -0,0 +1,59 @@
<%- include('top') %>
<script type="text/javascript">
app.auth.isLoggedIn(function(error, isLoggedIn){
if(isLoggedIn){
window.location.href = app.util.getUrlParameter('redirect') || '/';
}
})
$(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>
<div class="row">
<div class="col-md-4">
<div class="panel panel-default">
<div class="panel-heading">
<div class="panel-title">Log in</div>
</div>
<div class="panel-body">
<div class="alert alert-warning actionMessage" style="display:none">
</div>
<form action="login" onsubmit="$(this).validate()">
<input type="hidden" name="redirect" value="<%= redirect %>">
<div class="form-group">
<label class="control-label">User name</label>
<input type="text" name="uid" class="form-control" placeholder="User" validate="user:3" />
</div>
<div class="form-group">
<label class="control-label">Password</label>
<input type="password" name="password" class="form-control" placeholder="Password" validate="password:5" />
</div>
<button type="submit" class="btn btn-default" >Log in</button>
</form>
</div>
</div>
</div>
</div>
<%- include('bottom') %>

40
nodejs/views/top.ejs Executable file
View File

@ -0,0 +1,40 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>SSO Manager - Theta 42</title>
<!-- CSS are placed here -->
<!-- <link rel='stylesheet' href='/static/css/bootstrap.min.css' /> -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<link rel='stylesheet' href='/static/css/styles.css' />
<!-- 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 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>
<script type="text/javascript" src='/static/js/mustache.min.js'></script>
<script type="text/javascript" src="/static/js/app.js"></script>
<script type="text/javascript" src="/static/js/val.js"></script>
<script type="text/javascript" src="/static/js/moment.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
</head>
<body>
<div class="d-flex flex-column flex-md-row align-items-center p-3 px-md-4 mb-3 bg-white border-bottom shadow-sm">
<h5 class="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="p-2 text-dark" href="/">Home</a>
<a class="p-2 text-dark" href="/users"><i class="fad fa-users"></i> User Admin</a>
</nav>
<a class="btn btn-outline-primary" onclick="app.auth.logOut()"><i class="fas fa-sign-out"></i> Log Out</a>
</div>
<!-- Container -->
<div class="container">

View File

@ -0,0 +1,32 @@
<form action="user/" method="post">
<input type="hidden" class="form-control" name="delete" value="false" />
<div class="form-group">
<label class="control-label">First name</label>
<input type="text" class="form-control" name="givenName" placeholder="John" validate=":3" />
</div>
<div class="form-group">
<label class="control-label">Last name</label>
<input type="text" class="form-control" name="sn" placeholder="smith" validate=":3" />
</div>
<div class="form-group">
<label class="control-label">Email</label>
<input type="text" class="form-control" name="mail" placeholder="jsmith@gmail.com" validate="email" />
</div>
<div class="form-group">
<label class="control-label">Mobile Phone</label>
<input type="text" class="form-control" name="mobile" placeholder="jsmith@gmail.com" validate="email" />
</div>
<div class="form-group">
<label class="control-label">Password</label>
<input type="password" class="form-control" name="userPassword" placeholder="Atleast 5 char. long" validate="password:5"/>
</div>
<div class="form-group">
<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>
</form>

111
nodejs/views/users.ejs Executable file
View File

@ -0,0 +1,111 @@
<%- include('top') %>
<script id="rowTemplate" type="text/html">
<tr action="user/password/{{ username }}" method="put" evalAJAX="$form.trigger('reset')">
<td>
{{ uid }}:{{ username }}
</td>
<td>
<input type="hidden" name="username" value="{{ username }}" />
<div class="col-xs-10 form-group">
<label class="control-label"></label>
<input type="password" size="15" class="form-control" name="password" placeholder="New password" validate="password:5"/>
</div>
<button type="button btn-warn" onclick="formAJAX(this)" class="btn btn-sm btn-warn">
Change
</button>
</td>
<td>
<button type="button" onclick="app.user.remove({username: '{{username}}'}, function(){tableAJAX('username {{username}} delete.')})" class="btn btn-sm btn-danger">
Delete
</button>
</td>
</tr>
</script>
<script type="text/javascript">
function tableAJAX(actionMessage){
var rowTemplate = $('#rowTemplate').html();
$('#tableAJAX').html('').hide();
app.util.actionMessage('Refreshing user list...')
app.user.list(function(error, data){
$.each( data.results, function(key, value) {
user_row = Mustache.render(rowTemplate, value);
$('#tableAJAX').append(user_row);
});
$('#tableAJAX').fadeIn('slow');
app.util.actionMessage(actionMessage || '', {type: 'info'});
});
}
$(document).ready(function(){
tableAJAX(); //populate the table
});
</script>
<div class="row" style="display:none">
<div class="col-md-4">
<div class="panel panel-default">
<div class="panel-heading">
<div class="panel-title">
Add new user
<div class="pull-right">
<label class="glyphicon glyphicon-circle-arrow-down panel-toggle"></label>
</div>
</div>
</div>
<div class="panel-body">
<form action="user/" evalAJAX="$form.trigger('reset')">
<input type="hidden" class="form-control" name="delete" value="false" />
<div class="form-group">
<label class="control-label">User-name</label>
<input type="text" class="form-control" name="username" placeholder="Letter, numbers, -, _, . and @ only" validate="user:3" />
</div>
<div class="form-group">
<label class="control-label">Password</label>
<input type="password" class="form-control" name="password" placeholder="Atleast 5 char. long" validate="password:5"/>
</div>
<div class="form-group">
<label class="control-label">Again</label>
<input type="password" class="form-control" name="passwordMatch" placeholder="Retype password" validate="eq:password"/>
</div>
<button type="button" onclick="formAJAX(this)" class="btn btn-default">Add</button>
</form>
</div>
</div>
</div>
<div class="col-md-8">
<div class="panel panel-default">
<div class="panel-heading">
<div class="panel-title">
User List
<div class="pull-right">
<label class="glyphicon glyphicon-circle-arrow-down panel-toggle"></label>
</div>
</div>
</div>
<div class="panel-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>
<th>Name</th>
<th>Password</th>
<th>Delete</th>
</thead>
<tbody id="tableAJAX">
<!-- ajax loaded table -->
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<%- include('bottom') %>