@@ -11,7 +11,7 @@ var Mail = {};
|
|||||||
Mail.send = async function(to, subject, message, from){
|
Mail.send = async function(to, subject, message, from){
|
||||||
await sgMail.send({
|
await sgMail.send({
|
||||||
to: to,
|
to: to,
|
||||||
from: from || 'Theta 42 Accounts <accounts@no-reply.theta42.com>',
|
from: from || `${conf.name} Accounts <accounts@no-reply.theta42.com>`,
|
||||||
subject: subject,
|
subject: subject,
|
||||||
text: message,
|
text: message,
|
||||||
html: message,
|
html: message,
|
||||||
@@ -20,6 +20,7 @@ Mail.send = async function(to, subject, message, from){
|
|||||||
|
|
||||||
|
|
||||||
Mail.sendTemplate = async function(to, template, context, from){
|
Mail.sendTemplate = async function(to, template, context, from){
|
||||||
|
context.name = conf.name;
|
||||||
template = require(`../views/email_templates/${template}`);
|
template = require(`../views/email_templates/${template}`);
|
||||||
await Mail.send(
|
await Mail.send(
|
||||||
to,
|
to,
|
||||||
|
|||||||
Generated
+3145
-149
File diff suppressed because it is too large
Load Diff
+3
-2
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "t42-ldap-manager",
|
"name": "t42-sso-manager",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"author": [
|
"author": [
|
||||||
@@ -13,6 +13,7 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@sendgrid/mail": "^7.4.0",
|
"@sendgrid/mail": "^7.4.0",
|
||||||
|
"bcrypt": "^5.0.0",
|
||||||
"ejs": "^3.1.5",
|
"ejs": "^3.1.5",
|
||||||
"express": "~4.16.1",
|
"express": "~4.16.1",
|
||||||
"extend": "^3.0.2",
|
"extend": "^3.0.2",
|
||||||
@@ -25,7 +26,7 @@
|
|||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://git.theta42.com/wmantly/proxy.git"
|
"url": "https://github.com/theta42/sso-manager-node.git"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"nodemon": "^2.0.6"
|
"nodemon": "^2.0.6"
|
||||||
|
|||||||
@@ -243,6 +243,20 @@ app.group = (function(app){
|
|||||||
return {list, remove}
|
return {list, remove}
|
||||||
})(app)
|
})(app)
|
||||||
|
|
||||||
|
app.token = (function(app){
|
||||||
|
function list(name, callack){
|
||||||
|
if($.isFunction(name)){
|
||||||
|
callack = name;
|
||||||
|
name = ''
|
||||||
|
}
|
||||||
|
app.api.get('token/'+name+'?detail=true', function(error, data){
|
||||||
|
callack(error, data);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return {list}
|
||||||
|
})(app)
|
||||||
|
|
||||||
app.util = (function(app){
|
app.util = (function(app){
|
||||||
|
|
||||||
function getUrlParameter(name) {
|
function getUrlParameter(name) {
|
||||||
|
|||||||
@@ -0,0 +1,245 @@
|
|||||||
|
(function($, Mustache){
|
||||||
|
'use strict';
|
||||||
|
if (!$.scope) {
|
||||||
|
$.scope = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
var make = function( element ){
|
||||||
|
|
||||||
|
//construct array
|
||||||
|
function makeArray( input ){
|
||||||
|
|
||||||
|
var result = [];
|
||||||
|
|
||||||
|
Object.defineProperty( result, "__repeatId", {
|
||||||
|
value: repeatId,
|
||||||
|
writable: true,
|
||||||
|
enumerable: false,
|
||||||
|
configurable: true
|
||||||
|
} );
|
||||||
|
|
||||||
|
result.splice = function(){
|
||||||
|
//splice does all the heavy lifting by interacting with the DOM elements.
|
||||||
|
|
||||||
|
var index;
|
||||||
|
//if a string is submitted as the index, try to match it to index number
|
||||||
|
if( typeof arguments[0] === 'string' ){
|
||||||
|
index = this.indexOf( arguments[0] );//set where to start
|
||||||
|
if ( index === -1 ) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
index = arguments[0]; //set where to start
|
||||||
|
}
|
||||||
|
var howMany = arguments[1]; //sets the amount of fields to remove
|
||||||
|
var args = Array.prototype.slice.call( arguments ); // coverts arguments into array
|
||||||
|
var toAdd = args.slice(2); // only keeps fields to add to array
|
||||||
|
|
||||||
|
// if the starting point is higher then the total index count, start at the end
|
||||||
|
if( index > this.length ) {
|
||||||
|
index = this.length;
|
||||||
|
}
|
||||||
|
// if the starting point is negative, start form the end of the array, minus the start point
|
||||||
|
if( index < 0 ) {
|
||||||
|
index = this.length - Math.abs( index );
|
||||||
|
}
|
||||||
|
|
||||||
|
// if there are things to add, figure out the how many new indexes we need
|
||||||
|
if( !howMany && howMany !== 0 ) {
|
||||||
|
howMany = this.length - index;
|
||||||
|
}
|
||||||
|
//not sure why i put this here... but it does matter!
|
||||||
|
if( howMany > this.length - index ) {
|
||||||
|
howMany = this.length - index;
|
||||||
|
}
|
||||||
|
|
||||||
|
//figure out how many positions we need to shift the current elements
|
||||||
|
var shift = toAdd.length - howMany;
|
||||||
|
|
||||||
|
// figure out how big the new array will be
|
||||||
|
// var newLength = this.length + shift;
|
||||||
|
|
||||||
|
//removes fields from array based on howMany needs to be removed
|
||||||
|
for( var i = 0; i < howMany; i++ ) {
|
||||||
|
this.__take.apply( $( '.jq-repeat-'+ this.__repeatId +'[jq-repeat-index="'+ ( i + index ) +'"]' ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
//re-factor element index's
|
||||||
|
$( '.jq-repeat-'+ this.__repeatId+'[jq-repeat-index!="holder"]' ).each(function(){
|
||||||
|
var thisIndex = Number( $( this ).attr( 'jq-repeat-index' ) );
|
||||||
|
if( thisIndex >= index){
|
||||||
|
$( this ).attr( 'jq-repeat-index', thisIndex+shift );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//if there are fields to add to the array, add them
|
||||||
|
if( toAdd.length > 0 ){
|
||||||
|
|
||||||
|
//$.each( toAdd, function( key, value ){
|
||||||
|
for(var I = 0; I < toAdd.length; I++){
|
||||||
|
|
||||||
|
//figure out new elements index
|
||||||
|
var key = I + index;
|
||||||
|
//get the proper template
|
||||||
|
var template = $( document.getElementById( this.__repeatId + 'Template' ).outerHTML );
|
||||||
|
// apply values to template
|
||||||
|
var render = Mustache.render( template.html(), toAdd[I] );
|
||||||
|
|
||||||
|
//set call name and index keys to DOM element
|
||||||
|
render = $( render ).addClass( 'jq-repeat-'+ this.__repeatId ).attr( 'jq-repeat-index', key );
|
||||||
|
|
||||||
|
//if add new elements in proper stop, or after the place holder.
|
||||||
|
if( key === 0 ){
|
||||||
|
$( '.jq-repeat-'+ this.__repeatId +'[jq-repeat-index="holder"]' ).after( render );
|
||||||
|
}else{
|
||||||
|
$( '.jq-repeat-'+ this.__repeatId +'[jq-repeat-index="' + ( key -1 ) + '"]' ).after( render );
|
||||||
|
}
|
||||||
|
|
||||||
|
//animate element
|
||||||
|
this.__put.apply(render, [toAdd[I]]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//set and return new array
|
||||||
|
return Array.prototype.splice.apply( this, arguments );
|
||||||
|
};
|
||||||
|
result.push = function(){
|
||||||
|
//add one or more objects to the array
|
||||||
|
|
||||||
|
//set the index value, if none is set make it zero
|
||||||
|
var index = this.length || 0;
|
||||||
|
|
||||||
|
//loop each passed object and pass it to slice
|
||||||
|
for (var i = 0 ; i < arguments.length; ++i) {
|
||||||
|
this.splice( ( index + i ), 0, arguments[i] );
|
||||||
|
}
|
||||||
|
|
||||||
|
//return new array length
|
||||||
|
return this.length;
|
||||||
|
};
|
||||||
|
result.pop = function(){
|
||||||
|
//remove and return array element
|
||||||
|
|
||||||
|
return this.splice( -1, 1 )[0];
|
||||||
|
};
|
||||||
|
result.reverse = function() {
|
||||||
|
var temp = this.splice( 0 );
|
||||||
|
Array.prototype.reverse.apply( temp );
|
||||||
|
|
||||||
|
for( var i = 0; i < temp.length; i++ ){
|
||||||
|
this.push( temp[i] );
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
result.shift = function() {
|
||||||
|
return this.splice( 0, 1 )[0];
|
||||||
|
};
|
||||||
|
result.loop = function(){
|
||||||
|
var temp = this[0];
|
||||||
|
this.splice( 0,1 );
|
||||||
|
this.push( temp );
|
||||||
|
|
||||||
|
return temp;
|
||||||
|
};
|
||||||
|
result.loopUp = function(){
|
||||||
|
var temp = this[this.length-1];
|
||||||
|
this.splice( -1, 1 );
|
||||||
|
this.splice( 0, 0, temp );
|
||||||
|
return temp;
|
||||||
|
};
|
||||||
|
result.indexOf = function( key, value ){
|
||||||
|
if( typeof value !== 'string' ){
|
||||||
|
value = arguments[0];
|
||||||
|
key = this.__index;
|
||||||
|
}
|
||||||
|
for ( var index = 0; index < this.length; ++index ) {
|
||||||
|
if( this[index][key] === value ){
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
};
|
||||||
|
result.update = function( key, value, update ){
|
||||||
|
//set variables using sting for index
|
||||||
|
if( typeof value !== 'string' ){
|
||||||
|
update = arguments[1];
|
||||||
|
value = arguments[0];
|
||||||
|
key = this.__index;
|
||||||
|
}
|
||||||
|
var index = this.indexOf( key, value );
|
||||||
|
if(index === -1) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
var object = $.extend( true, {}, this[index], update );
|
||||||
|
return this.splice( index, 1, object )[0];
|
||||||
|
};
|
||||||
|
result.__put = function(){
|
||||||
|
this.show();
|
||||||
|
};
|
||||||
|
result.__take = function(){
|
||||||
|
this.remove();
|
||||||
|
};
|
||||||
|
|
||||||
|
if(!input) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
$.each( input, function( key, value ){
|
||||||
|
var type = typeof value;
|
||||||
|
if( type === 'object' ){
|
||||||
|
result.push( value );
|
||||||
|
}else if( type === 'string' ){
|
||||||
|
Object.defineProperty( result, "__index", {
|
||||||
|
value: value,
|
||||||
|
writable: true,
|
||||||
|
enumerable: false,
|
||||||
|
configurable: true
|
||||||
|
} );
|
||||||
|
} else if ( type === 'function'){
|
||||||
|
Object.defineProperty( result, value.name, {
|
||||||
|
value: value,
|
||||||
|
writable: true,
|
||||||
|
enumerable: false,
|
||||||
|
configurable: true
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var $this = $( element );
|
||||||
|
var repeatId = $this.attr( 'jq-repeat' );
|
||||||
|
var tempId = repeatId + 'Template';
|
||||||
|
var templateId = $( '#' + tempId ).html();
|
||||||
|
|
||||||
|
$this.removeAttr( 'jq-repeat' );
|
||||||
|
$this.wrap( '<script type="x-tmpl-mustache" id="' + tempId + '" class="jq-repeat-' + repeatId + ' " jq-repeat-index="holder"><\/script>' );
|
||||||
|
|
||||||
|
Mustache.parse(templateId); // optional, speeds up future uses
|
||||||
|
|
||||||
|
|
||||||
|
$.scope[repeatId] = makeArray($.scope[repeatId]);
|
||||||
|
//return {};
|
||||||
|
};
|
||||||
|
|
||||||
|
$( document ).ready( function(){
|
||||||
|
$( '[jq-repeat]' ).each(function(key, value){
|
||||||
|
make(value);
|
||||||
|
});
|
||||||
|
|
||||||
|
$(document).on('DOMNodeInserted', function(e) {
|
||||||
|
//console.log(e.target.is('[jq-repeat]'));
|
||||||
|
if ( $(e.target).is('[jq-repeat]') ){
|
||||||
|
make( e.target );
|
||||||
|
}else{
|
||||||
|
var t = $(e.target).find('[jq-repeat]');
|
||||||
|
t.each(function(key, value){
|
||||||
|
make(value);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} );
|
||||||
|
|
||||||
|
})(jQuery, Mustache);
|
||||||
+13
-12
@@ -4,24 +4,31 @@ var express = require('express');
|
|||||||
var router = express.Router();
|
var router = express.Router();
|
||||||
const moment = require('moment');
|
const moment = require('moment');
|
||||||
const {InviteToken, PasswordResetToken} = require('./../models/token');
|
const {InviteToken, PasswordResetToken} = require('./../models/token');
|
||||||
|
const conf = require('../conf/conf.js');
|
||||||
|
|
||||||
|
|
||||||
/* GET home page. */
|
|
||||||
router.get('/', async function(req, res, next) {
|
router.get('/', async function(req, res, next) {
|
||||||
res.render('home', { title: 'Express' });
|
res.render('home', { title: 'Express', name: conf.name });
|
||||||
|
});
|
||||||
|
|
||||||
|
router.get('/login', function(req, res, next) {
|
||||||
|
res.render('login', {redirect: req.query.redirect, name: conf.name });
|
||||||
});
|
});
|
||||||
|
|
||||||
/* GET home page. */
|
|
||||||
router.get('/users', function(req, res, next) {
|
router.get('/users', function(req, res, next) {
|
||||||
res.render('users', { title: 'Express' });
|
res.render('users', { title: 'Express', name: conf.name });
|
||||||
});
|
});
|
||||||
|
|
||||||
router.get('/users/:uid', function(req, res, next) {
|
router.get('/users/:uid', function(req, res, next) {
|
||||||
res.render('home', { title: 'Express' });
|
res.render('home', { title: 'Express', name: conf.name });
|
||||||
});
|
});
|
||||||
|
|
||||||
router.get('/groups', function(req, res, next) {
|
router.get('/groups', function(req, res, next) {
|
||||||
res.render('groups', { title: 'Express' });
|
res.render('groups', { title: 'Express', name: conf.name });
|
||||||
|
});
|
||||||
|
|
||||||
|
router.get('/token', function(req, res, next) {
|
||||||
|
res.render('token', { title: 'Express', name: conf.name });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
@@ -66,10 +73,4 @@ router.get('/login/invite/:token', async function(req, res, next){
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
/* GET home page. */
|
|
||||||
router.get('/login', function(req, res, next) {
|
|
||||||
res.render('login', {redirect: req.query.redirect});
|
|
||||||
});
|
|
||||||
|
|
||||||
module.exports = router;
|
module.exports = router;
|
||||||
|
|||||||
+17
-5
@@ -2,12 +2,24 @@
|
|||||||
|
|
||||||
const router = require('express').Router();
|
const router = require('express').Router();
|
||||||
const {AuthToken} = require('../models/auth');
|
const {AuthToken} = require('../models/auth');
|
||||||
const {Token, InviteToken} = require('../models/token');
|
var tokens = require('../models/token');
|
||||||
|
// const {Token, InviteToken, PasswordResetToken} = require('../models/token');
|
||||||
|
|
||||||
const tokens = {
|
delete tokens.Token;
|
||||||
auth: AuthToken,
|
|
||||||
invite: InviteToken
|
// const tokens = {
|
||||||
}
|
// auth: AuthToken,
|
||||||
|
// invite: InviteToken,
|
||||||
|
// password: PasswordResetToken,
|
||||||
|
// }
|
||||||
|
|
||||||
|
router.get('/', async function(req, res, next){
|
||||||
|
try{
|
||||||
|
return res.json({results: Object.keys(tokens)})
|
||||||
|
}catch(error){
|
||||||
|
throw(error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
router.get('/:name', async function(req, res, next){
|
router.get('/:name', async function(req, res, next){
|
||||||
try{
|
try{
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
subject: 'Password reset for Theta 42 account',
|
subject: 'Password reset for {{ name }} account',
|
||||||
message: `
|
message: `
|
||||||
<h2> Theta 42 account</h2>
|
<h2> {{ name }} account</h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Hello {{ user.givenName }},
|
Hello {{ user.givenName }},
|
||||||
@@ -19,7 +19,7 @@ module.exports = {
|
|||||||
|
|
||||||
</p>
|
</p>
|
||||||
Thank you,<br />
|
Thank you,<br />
|
||||||
Theta 42
|
{{ name }}
|
||||||
</p>
|
</p>
|
||||||
`
|
`
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
subject: 'Validate email for Theta 42 account',
|
subject: 'Validate email for {{ name }} account',
|
||||||
message: `
|
message: `
|
||||||
<h2> Theta 42 account</h2>
|
<h2> {{ name }} account</h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Welcome,
|
Welcome,
|
||||||
@@ -18,7 +18,7 @@ module.exports = {
|
|||||||
|
|
||||||
</p>
|
</p>
|
||||||
Thank you,<br />
|
Thank you,<br />
|
||||||
Theta 42
|
{{ name }}
|
||||||
</p>
|
</p>
|
||||||
`
|
`
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
subject: 'Welcome to Theta 42!',
|
subject: 'Welcome to {{ name }}!',
|
||||||
message: `
|
message: `
|
||||||
<p>
|
<p>
|
||||||
Welcome {{user.givenName}},
|
Welcome {{user.givenName}},
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Your new Theta 42 Single sign-on account is ready to use. Here is some
|
Your new {{ name }} Single sign-on account is ready to use. Here is some
|
||||||
information to get you started.
|
information to get you started.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
@@ -19,7 +19,7 @@ module.exports = {
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
You account is ready to be used now, test it by SSHing into the Theta 42
|
You account is ready to be used now, test it by SSHing into the {{ name }}
|
||||||
jump host \`ssh {{user.uid}}@718it.biz\`
|
jump host \`ssh {{user.uid}}@718it.biz\`
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ module.exports = {
|
|||||||
You will be notified of new features and services as they become available.
|
You will be notified of new features and services as they become available.
|
||||||
</p>
|
</p>
|
||||||
Thank you,<br />
|
Thank you,<br />
|
||||||
Theta 42
|
{{ name }}
|
||||||
</p>
|
</p>
|
||||||
`
|
`
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,217 @@
|
|||||||
|
<%- include('top') %>
|
||||||
|
<script id="rowTemplate" type="text/html">
|
||||||
|
<div id="group-card-{{cn}}" class="card shadow">
|
||||||
|
<div class="card-header">
|
||||||
|
<h5>
|
||||||
|
<i class="fad fa-users-class"></i>
|
||||||
|
Group: {{ cn }}
|
||||||
|
</h5>
|
||||||
|
<ul class="nav nav-tabs card-header-tabs" id="myTab" role="tablist">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link active" id="group-members-tab-{{cn}}" data-toggle="tab" href="#group-memmbers-{{cn}}" role="tab" aria-controls="member" aria-selected="true">
|
||||||
|
<i class="fad fa-users"></i>
|
||||||
|
Members
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" id="group-admins-tab-{{cn}}" data-toggle="tab" href="#group-admins-{{cn}}" role="tab" aria-controls="admin" aria-selected="false">
|
||||||
|
<i class="fad fa-users-crown"></i>
|
||||||
|
Owners
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item float-right">
|
||||||
|
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="card-header actionMessage" style="display:none"></div>
|
||||||
|
<div class="card-body">
|
||||||
|
<p>
|
||||||
|
{{ description }}
|
||||||
|
</p>
|
||||||
|
<div class="tab-content" id="myTabContent">
|
||||||
|
<div class="tab-pane fade show active" id="group-memmbers-{{cn}}" role="tabpanel" aria-labelledby="member-tab">
|
||||||
|
<p>
|
||||||
|
<ul class="list-group">
|
||||||
|
{{ #member }}
|
||||||
|
<li id="group-card-{{cn}}-{{uid}}" class="list-group-item shadow">
|
||||||
|
<i class="fad fa-user"></i> {{ uid }}
|
||||||
|
<button type="button" action="group/{{groupCN}}/{{uid}}" method="delete" onclick="formAJAX(this)" evalAJAX="addedUser(data.message, '{{groupCN}}', '{{uid}}', $form)" class="btn btn-sm btn-danger float-right">
|
||||||
|
<i class="fad fa-user-slash"></i>
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
{{ /member }}
|
||||||
|
</ul>
|
||||||
|
</p>
|
||||||
|
<div class="dropdown">
|
||||||
|
<button class="btn btn-secondary dropdown-toggle" type="button" id="group_add_member" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||||
|
<i class="fad fa-user-plus"></i>
|
||||||
|
</button>
|
||||||
|
<div class="dropdown-menu shadow-lg" aria-labelledby="group_add_member">
|
||||||
|
{{ #toAdd }}{{#.}}
|
||||||
|
<a class="dropdown-item" action="group/{{groupCN}}/{{uid}}" method="put" onclick="formAJAX(this)" evalAJAX="addedUser(data.message, '{{groupCN}}', '{{uid}}', $form);">
|
||||||
|
<i class="fad fa-user"></i> {{uid}}
|
||||||
|
</a>
|
||||||
|
{{/.}}{{ /toAdd }}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tab-pane fade" id="group-admins-{{cn}}" role="tabpanel" aria-labelledby="admin-tab">
|
||||||
|
<p>
|
||||||
|
<ul class="list-group">
|
||||||
|
{{ #owner }}
|
||||||
|
<li class="list-group-item shadow">
|
||||||
|
<i class="fad fa-user"></i> {{ uid }}
|
||||||
|
<button type="button" action="group/owner/{{groupCN}}/{{uid}}" method="delete" onclick="formAJAX(this)" evalAJAX="addedUser(data.message, '{{groupCN}}', '{{uid}}', $form)" class="btn btn-sm btn-danger float-right">
|
||||||
|
<i class="fad fa-user-slash"></i>
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
{{ /owner }}
|
||||||
|
</ul>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="dropdown float-left">
|
||||||
|
<button class="btn btn-secondary dropdown-toggle" type="button" id="group_add_admin" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||||
|
<i class="fad fa-user-crown"></i>
|
||||||
|
</button>
|
||||||
|
<div class="dropdown-menu shadow-lg" aria-labelledby="group_add_admin">
|
||||||
|
{{ #toAddOwner }}{{#.}}
|
||||||
|
<a class="dropdown-item" action="group/owner/{{groupCN}}/{{uid}}" method="put" onclick="formAJAX(this)" evalAJAX="addedUser(data.message, '{{groupCN}}', '{{uid}}', $form)">
|
||||||
|
<i class="fad fa-user"></i> {{uid}}
|
||||||
|
</a>
|
||||||
|
{{/.}}{{ /toAddOwner }}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card-footer">
|
||||||
|
<div class="float-left">
|
||||||
|
Created: {{createTimestamp}}<br />
|
||||||
|
Last Mortified: {{modifyTimestamp}}
|
||||||
|
</div>
|
||||||
|
<div class="float-right">
|
||||||
|
<button type="button" onclick="" class="btn btn-warning btn-lg shadow">
|
||||||
|
<i class="fad fa-edit"></i>
|
||||||
|
</button>
|
||||||
|
<button type="button" onclick="app.group.remove({cn: '{{cn}}'}, function(){tableAJAX('Group {{cn}} deleted.')})" class="btn btn-danger btn-lg">
|
||||||
|
<i class="fad fa-trash"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<br/>
|
||||||
|
</script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
var userlist;
|
||||||
|
|
||||||
|
function getUserList(callback){
|
||||||
|
app.user.list(function(error, data){
|
||||||
|
userlist = data.results;
|
||||||
|
callback()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function addedUser(message, group, user, $form){
|
||||||
|
tableAJAX(null, function(){
|
||||||
|
app.util.actionMessage(message, $("#group-card-"+group), 'success');
|
||||||
|
|
||||||
|
|
||||||
|
$('a[href="#'+$form.closest('.tab-pane').attr('id')+'"]').tab('show');
|
||||||
|
setTimeout(function(group){
|
||||||
|
$("body,html").animate({
|
||||||
|
scrollTop: $("#group-card-" + group).offset().top
|
||||||
|
}, 0);
|
||||||
|
}, 400, group);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function tableAJAX(actionMessage, callback){
|
||||||
|
var rowTemplate = $('#rowTemplate').html();
|
||||||
|
var $target = $('#tableAJAX');
|
||||||
|
|
||||||
|
$target.html('').hide();
|
||||||
|
app.util.actionMessage('Refreshing user list...', $target);
|
||||||
|
|
||||||
|
app.group.list(function(error, data){
|
||||||
|
var out = ''
|
||||||
|
$.each(data.results, function(key, value) {
|
||||||
|
|
||||||
|
value.toAdd = userlist.map(function(user){
|
||||||
|
if(!value.member.includes(user.dn)) return user;
|
||||||
|
})
|
||||||
|
|
||||||
|
value.toAddOwner = userlist.map(function(user){
|
||||||
|
if(!value.owner.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.owner = value.owner.map(function(user){
|
||||||
|
return {
|
||||||
|
dn: user,
|
||||||
|
uid: user.match(/cn=[a-zA-Z0-9\_\-\@\.]+/)[0].replace('cn=', '')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
value.createTimestamp = moment(value.createTimestamp, "YYYYMMDDHHmmssZ").fromNow();
|
||||||
|
value.modifyTimestamp = moment(value.modifyTimestamp, "YYYYMMDDHHmmssZ").fromNow();
|
||||||
|
|
||||||
|
|
||||||
|
value.groupCN = value.cn;
|
||||||
|
out += Mustache.render(rowTemplate, value);
|
||||||
|
});
|
||||||
|
|
||||||
|
$target.html(out);
|
||||||
|
|
||||||
|
$target.fadeIn('slow', ($.isFunction(callback) ? callback: function(){})());
|
||||||
|
|
||||||
|
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 shadow-lg">
|
||||||
|
<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 shadow" name="name" placeholder="app_gitea_admin" validate=":3" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label">Description</label>
|
||||||
|
<textarea class="form-control shadow" 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" id="tableAJAX">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<%- include('bottom') %>
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
<title>SSO Manager - Theta 42</title>
|
<title>SSO Manager - <%= name %></title>
|
||||||
<!-- CSS are placed here -->
|
<!-- CSS are placed here -->
|
||||||
<link rel="stylesheet" href="/static/css/bootstrap-4.4.1.min.css">
|
<link rel="stylesheet" href="/static/css/bootstrap-4.4.1.min.css">
|
||||||
<link rel='stylesheet' href='/static/css/styles.css' />
|
<link rel='stylesheet' href='/static/css/styles.css' />
|
||||||
@@ -13,9 +13,10 @@
|
|||||||
<script type="text/javascript" src="/static/js/bootstrap-4.4.1.min.js"></script>
|
<script type="text/javascript" src="/static/js/bootstrap-4.4.1.min.js"></script>
|
||||||
<script type="text/javascript" src="/static/js/all.min.js"></script>
|
<script type="text/javascript" src="/static/js/all.min.js"></script>
|
||||||
<script type="text/javascript" src='/static/js/mustache.min.js'></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/val.js"></script>
|
||||||
<script type="text/javascript" src="/static/js/moment.js"></script>
|
<script type="text/javascript" src="/static/js/moment.js"></script>
|
||||||
|
<script type="text/javascript" src="/static/js/jq-repeat.js"></script>
|
||||||
|
<script type="text/javascript" src="/static/js/app.js"></script>
|
||||||
|
|
||||||
|
|
||||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||||
@@ -25,7 +26,7 @@
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<header class="shadow d-flex flex-column flex-md-row align-items-center p-3 px-md-4 mb-3 bg-white border-bottom shadow-sm">
|
<header class="shadow 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="hover-effect my-0 mr-md-auto font-weight-normal">SSO Manager - Theta 42</h5>
|
<h5 class="hover-effect my-0 mr-md-auto font-weight-normal">SSO Manager - <%= name %></h5>
|
||||||
<nav class="my-2 my-md-0 mr-md-3">
|
<nav class="my-2 my-md-0 mr-md-3">
|
||||||
<a class="text-dark hover-effect" href="/"><i class="fad fa-tachometer-alt-fastest"></i>Home</a>
|
<a class="text-dark hover-effect" href="/"><i class="fad fa-tachometer-alt-fastest"></i>Home</a>
|
||||||
<a class="text-dark hover-effect" href="/users"><i class="fad fa-users"></i>Users</a>
|
<a class="text-dark hover-effect" href="/users"><i class="fad fa-users"></i>Users</a>
|
||||||
|
|||||||
Generated
-491
@@ -1,491 +0,0 @@
|
|||||||
{
|
|
||||||
"requires": true,
|
|
||||||
"lockfileVersion": 1,
|
|
||||||
"dependencies": {
|
|
||||||
"abbrev": {
|
|
||||||
"version": "1.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
|
|
||||||
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
|
|
||||||
},
|
|
||||||
"ansi-regex": {
|
|
||||||
"version": "2.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
|
|
||||||
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
|
|
||||||
},
|
|
||||||
"aproba": {
|
|
||||||
"version": "1.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
|
|
||||||
"integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
|
|
||||||
},
|
|
||||||
"are-we-there-yet": {
|
|
||||||
"version": "1.1.5",
|
|
||||||
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
|
|
||||||
"integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
|
|
||||||
"requires": {
|
|
||||||
"delegates": "^1.0.0",
|
|
||||||
"readable-stream": "^2.0.6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"balanced-match": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
|
||||||
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
|
|
||||||
},
|
|
||||||
"bcrypt": {
|
|
||||||
"version": "4.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-4.0.1.tgz",
|
|
||||||
"integrity": "sha512-hSIZHkUxIDS5zA2o00Kf2O5RfVbQ888n54xQoF/eIaquU4uaLxK8vhhBdktd0B3n2MjkcAWzv4mnhogykBKOUQ==",
|
|
||||||
"requires": {
|
|
||||||
"node-addon-api": "^2.0.0",
|
|
||||||
"node-pre-gyp": "0.14.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"brace-expansion": {
|
|
||||||
"version": "1.1.11",
|
|
||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
|
||||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
|
||||||
"requires": {
|
|
||||||
"balanced-match": "^1.0.0",
|
|
||||||
"concat-map": "0.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"chownr": {
|
|
||||||
"version": "1.1.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
|
|
||||||
"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
|
|
||||||
},
|
|
||||||
"code-point-at": {
|
|
||||||
"version": "1.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
|
|
||||||
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
|
|
||||||
},
|
|
||||||
"concat-map": {
|
|
||||||
"version": "0.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
|
|
||||||
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
|
|
||||||
},
|
|
||||||
"console-control-strings": {
|
|
||||||
"version": "1.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
|
|
||||||
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
|
|
||||||
},
|
|
||||||
"core-util-is": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
|
||||||
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
|
|
||||||
},
|
|
||||||
"debug": {
|
|
||||||
"version": "3.2.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
|
|
||||||
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
|
|
||||||
"requires": {
|
|
||||||
"ms": "^2.1.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"deep-extend": {
|
|
||||||
"version": "0.6.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
|
|
||||||
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
|
|
||||||
},
|
|
||||||
"delegates": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
|
|
||||||
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
|
|
||||||
},
|
|
||||||
"detect-libc": {
|
|
||||||
"version": "1.0.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
|
|
||||||
"integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
|
|
||||||
},
|
|
||||||
"fs-minipass": {
|
|
||||||
"version": "1.2.7",
|
|
||||||
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
|
|
||||||
"integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
|
|
||||||
"requires": {
|
|
||||||
"minipass": "^2.6.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"fs.realpath": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
|
||||||
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
|
|
||||||
},
|
|
||||||
"gauge": {
|
|
||||||
"version": "2.7.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
|
|
||||||
"integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
|
|
||||||
"requires": {
|
|
||||||
"aproba": "^1.0.3",
|
|
||||||
"console-control-strings": "^1.0.0",
|
|
||||||
"has-unicode": "^2.0.0",
|
|
||||||
"object-assign": "^4.1.0",
|
|
||||||
"signal-exit": "^3.0.0",
|
|
||||||
"string-width": "^1.0.1",
|
|
||||||
"strip-ansi": "^3.0.1",
|
|
||||||
"wide-align": "^1.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"glob": {
|
|
||||||
"version": "7.1.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
|
|
||||||
"integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
|
|
||||||
"requires": {
|
|
||||||
"fs.realpath": "^1.0.0",
|
|
||||||
"inflight": "^1.0.4",
|
|
||||||
"inherits": "2",
|
|
||||||
"minimatch": "^3.0.4",
|
|
||||||
"once": "^1.3.0",
|
|
||||||
"path-is-absolute": "^1.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"has-unicode": {
|
|
||||||
"version": "2.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
|
|
||||||
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
|
|
||||||
},
|
|
||||||
"iconv-lite": {
|
|
||||||
"version": "0.4.24",
|
|
||||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
|
|
||||||
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
|
|
||||||
"requires": {
|
|
||||||
"safer-buffer": ">= 2.1.2 < 3"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ignore-walk": {
|
|
||||||
"version": "3.0.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz",
|
|
||||||
"integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==",
|
|
||||||
"requires": {
|
|
||||||
"minimatch": "^3.0.4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"inflight": {
|
|
||||||
"version": "1.0.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
|
|
||||||
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
|
|
||||||
"requires": {
|
|
||||||
"once": "^1.3.0",
|
|
||||||
"wrappy": "1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"inherits": {
|
|
||||||
"version": "2.0.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
|
|
||||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
|
|
||||||
},
|
|
||||||
"ini": {
|
|
||||||
"version": "1.3.5",
|
|
||||||
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
|
|
||||||
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
|
|
||||||
},
|
|
||||||
"is-fullwidth-code-point": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
|
|
||||||
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
|
|
||||||
"requires": {
|
|
||||||
"number-is-nan": "^1.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"isarray": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
|
||||||
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
|
|
||||||
},
|
|
||||||
"minimatch": {
|
|
||||||
"version": "3.0.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
|
|
||||||
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
|
|
||||||
"requires": {
|
|
||||||
"brace-expansion": "^1.1.7"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"minimist": {
|
|
||||||
"version": "1.2.5",
|
|
||||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
|
|
||||||
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
|
|
||||||
},
|
|
||||||
"minipass": {
|
|
||||||
"version": "2.9.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
|
|
||||||
"integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
|
|
||||||
"requires": {
|
|
||||||
"safe-buffer": "^5.1.2",
|
|
||||||
"yallist": "^3.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"minizlib": {
|
|
||||||
"version": "1.3.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
|
|
||||||
"integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
|
|
||||||
"requires": {
|
|
||||||
"minipass": "^2.9.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mkdirp": {
|
|
||||||
"version": "0.5.5",
|
|
||||||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
|
|
||||||
"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
|
|
||||||
"requires": {
|
|
||||||
"minimist": "^1.2.5"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ms": {
|
|
||||||
"version": "2.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
|
||||||
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
|
||||||
},
|
|
||||||
"needle": {
|
|
||||||
"version": "2.4.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/needle/-/needle-2.4.1.tgz",
|
|
||||||
"integrity": "sha512-x/gi6ijr4B7fwl6WYL9FwlCvRQKGlUNvnceho8wxkwXqN8jvVmmmATTmZPRRG7b/yC1eode26C2HO9jl78Du9g==",
|
|
||||||
"requires": {
|
|
||||||
"debug": "^3.2.6",
|
|
||||||
"iconv-lite": "^0.4.4",
|
|
||||||
"sax": "^1.2.4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node-addon-api": {
|
|
||||||
"version": "2.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.0.tgz",
|
|
||||||
"integrity": "sha512-ASCL5U13as7HhOExbT6OlWJJUV/lLzL2voOSP1UVehpRD8FbSrSDjfScK/KwAvVTI5AS6r4VwbOMlIqtvRidnA=="
|
|
||||||
},
|
|
||||||
"node-pre-gyp": {
|
|
||||||
"version": "0.14.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz",
|
|
||||||
"integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==",
|
|
||||||
"requires": {
|
|
||||||
"detect-libc": "^1.0.2",
|
|
||||||
"mkdirp": "^0.5.1",
|
|
||||||
"needle": "^2.2.1",
|
|
||||||
"nopt": "^4.0.1",
|
|
||||||
"npm-packlist": "^1.1.6",
|
|
||||||
"npmlog": "^4.0.2",
|
|
||||||
"rc": "^1.2.7",
|
|
||||||
"rimraf": "^2.6.1",
|
|
||||||
"semver": "^5.3.0",
|
|
||||||
"tar": "^4.4.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"nopt": {
|
|
||||||
"version": "4.0.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
|
|
||||||
"integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
|
|
||||||
"requires": {
|
|
||||||
"abbrev": "1",
|
|
||||||
"osenv": "^0.1.4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"npm-bundled": {
|
|
||||||
"version": "1.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz",
|
|
||||||
"integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==",
|
|
||||||
"requires": {
|
|
||||||
"npm-normalize-package-bin": "^1.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"npm-normalize-package-bin": {
|
|
||||||
"version": "1.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
|
|
||||||
"integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA=="
|
|
||||||
},
|
|
||||||
"npm-packlist": {
|
|
||||||
"version": "1.4.8",
|
|
||||||
"resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz",
|
|
||||||
"integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==",
|
|
||||||
"requires": {
|
|
||||||
"ignore-walk": "^3.0.1",
|
|
||||||
"npm-bundled": "^1.0.1",
|
|
||||||
"npm-normalize-package-bin": "^1.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"npmlog": {
|
|
||||||
"version": "4.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
|
|
||||||
"integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
|
|
||||||
"requires": {
|
|
||||||
"are-we-there-yet": "~1.1.2",
|
|
||||||
"console-control-strings": "~1.1.0",
|
|
||||||
"gauge": "~2.7.3",
|
|
||||||
"set-blocking": "~2.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"number-is-nan": {
|
|
||||||
"version": "1.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
|
|
||||||
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
|
|
||||||
},
|
|
||||||
"object-assign": {
|
|
||||||
"version": "4.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
|
|
||||||
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
|
|
||||||
},
|
|
||||||
"once": {
|
|
||||||
"version": "1.4.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
|
||||||
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
|
|
||||||
"requires": {
|
|
||||||
"wrappy": "1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"os-homedir": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
|
|
||||||
"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
|
|
||||||
},
|
|
||||||
"os-tmpdir": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
|
|
||||||
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
|
|
||||||
},
|
|
||||||
"osenv": {
|
|
||||||
"version": "0.1.5",
|
|
||||||
"resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
|
|
||||||
"integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
|
|
||||||
"requires": {
|
|
||||||
"os-homedir": "^1.0.0",
|
|
||||||
"os-tmpdir": "^1.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"path-is-absolute": {
|
|
||||||
"version": "1.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
|
|
||||||
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
|
|
||||||
},
|
|
||||||
"process-nextick-args": {
|
|
||||||
"version": "2.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
|
|
||||||
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
|
|
||||||
},
|
|
||||||
"rc": {
|
|
||||||
"version": "1.2.8",
|
|
||||||
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
|
|
||||||
"integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
|
|
||||||
"requires": {
|
|
||||||
"deep-extend": "^0.6.0",
|
|
||||||
"ini": "~1.3.0",
|
|
||||||
"minimist": "^1.2.0",
|
|
||||||
"strip-json-comments": "~2.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"readable-stream": {
|
|
||||||
"version": "2.3.7",
|
|
||||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
|
|
||||||
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
|
|
||||||
"requires": {
|
|
||||||
"core-util-is": "~1.0.0",
|
|
||||||
"inherits": "~2.0.3",
|
|
||||||
"isarray": "~1.0.0",
|
|
||||||
"process-nextick-args": "~2.0.0",
|
|
||||||
"safe-buffer": "~5.1.1",
|
|
||||||
"string_decoder": "~1.1.1",
|
|
||||||
"util-deprecate": "~1.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"rimraf": {
|
|
||||||
"version": "2.7.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
|
|
||||||
"integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
|
|
||||||
"requires": {
|
|
||||||
"glob": "^7.1.3"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"safe-buffer": {
|
|
||||||
"version": "5.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
|
||||||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
|
|
||||||
},
|
|
||||||
"safer-buffer": {
|
|
||||||
"version": "2.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
|
||||||
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
|
|
||||||
},
|
|
||||||
"sax": {
|
|
||||||
"version": "1.2.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
|
|
||||||
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
|
|
||||||
},
|
|
||||||
"semver": {
|
|
||||||
"version": "5.7.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
|
|
||||||
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
|
|
||||||
},
|
|
||||||
"set-blocking": {
|
|
||||||
"version": "2.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
|
|
||||||
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
|
|
||||||
},
|
|
||||||
"signal-exit": {
|
|
||||||
"version": "3.0.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
|
|
||||||
"integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
|
|
||||||
},
|
|
||||||
"string-width": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
|
|
||||||
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
|
|
||||||
"requires": {
|
|
||||||
"code-point-at": "^1.0.0",
|
|
||||||
"is-fullwidth-code-point": "^1.0.0",
|
|
||||||
"strip-ansi": "^3.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"string_decoder": {
|
|
||||||
"version": "1.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
|
||||||
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
|
||||||
"requires": {
|
|
||||||
"safe-buffer": "~5.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"strip-ansi": {
|
|
||||||
"version": "3.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
|
|
||||||
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
|
|
||||||
"requires": {
|
|
||||||
"ansi-regex": "^2.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"strip-json-comments": {
|
|
||||||
"version": "2.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
|
|
||||||
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
|
|
||||||
},
|
|
||||||
"tar": {
|
|
||||||
"version": "4.4.13",
|
|
||||||
"resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
|
|
||||||
"integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
|
|
||||||
"requires": {
|
|
||||||
"chownr": "^1.1.1",
|
|
||||||
"fs-minipass": "^1.2.5",
|
|
||||||
"minipass": "^2.8.6",
|
|
||||||
"minizlib": "^1.2.1",
|
|
||||||
"mkdirp": "^0.5.0",
|
|
||||||
"safe-buffer": "^5.1.2",
|
|
||||||
"yallist": "^3.0.3"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"util-deprecate": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
|
||||||
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
|
|
||||||
},
|
|
||||||
"wide-align": {
|
|
||||||
"version": "1.1.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
|
|
||||||
"integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
|
|
||||||
"requires": {
|
|
||||||
"string-width": "^1.0.2 || 2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"wrappy": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
|
||||||
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
|
|
||||||
},
|
|
||||||
"yallist": {
|
|
||||||
"version": "3.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
|
|
||||||
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user