16 changed files with 425 additions and 51 deletions
@ -0,0 +1,55 @@ |
|||
// admin/otp.js
|
|||
// Copyright (C) 2021 Digital Telepresence, LLC
|
|||
// License: Apache-2.0
|
|||
|
|||
'use strict'; |
|||
|
|||
const express = require('express'); |
|||
// const multer = require('multer');
|
|||
|
|||
const { SiteController, SiteError } = require('../../../lib/site-lib'); |
|||
|
|||
class OtpAdminController extends SiteController { |
|||
|
|||
constructor (dtp) { |
|||
super(dtp, module.exports); |
|||
} |
|||
|
|||
async start ( ) { |
|||
// const upload = multer({ dest: `/tmp/${this.dtp.config.site.domainKey}/uploads/${module.exports.slug}` });
|
|||
|
|||
const router = express.Router(); |
|||
router.use(async (req, res, next) => { |
|||
res.locals.currentView = 'admin'; |
|||
res.locals.adminView = 'otp'; |
|||
return next(); |
|||
}); |
|||
|
|||
// router.param('otp', this.populateOtp.bind(this));
|
|||
|
|||
router.get('/', this.getIndex.bind(this)); |
|||
|
|||
return router; |
|||
} |
|||
|
|||
async getIndex (req, res, next) { |
|||
try { |
|||
const { otpAuth: otpAuthService } = this.dtp.services; |
|||
if (!req.user) { |
|||
throw new SiteError(402, "Error getting user"); |
|||
} |
|||
res.locals.tokens = await otpAuthService.getBackupTokens(req.user, "Admin"); |
|||
res.render('admin/otp/index'); |
|||
} catch (error) { |
|||
this.log.error('failed to get tokens', { error }); |
|||
return next(error); |
|||
} |
|||
} |
|||
|
|||
} |
|||
|
|||
module.exports = { |
|||
name: 'adminOtp', |
|||
slug: 'admin-opt', |
|||
create: async (dtp) => { return new OtpAdminController(dtp); }, |
|||
}; |
@ -0,0 +1,51 @@ |
|||
mixin renderFileUploadImage (actionUrl, containerId, imageId, imageClass, defaultImage, currentImage, cropperOptions) |
|||
div(id= containerId).dtp-file-upload |
|||
form(method="POST", action= actionUrl, enctype="multipart/form-data", onsubmit= "return dtp.app.submitImageForm(event);").uk-form |
|||
.uk-margin |
|||
.uk-card.uk-card-default.uk-card-small |
|||
.uk-card-body |
|||
div(uk-grid).uk-flex-middle.uk-flex-center |
|||
div(class="uk-width-1-1 uk-width-auto@m") |
|||
.upload-image-container.size-512 |
|||
if !!currentImage |
|||
img(id= imageId, src= currentImage.path, class= imageClass).sb-large |
|||
else |
|||
img(id= imageId, src= defaultImage, class= imageClass) |
|||
|
|||
div(class="uk-width-1-1 uk-width-auto@m") |
|||
.uk-text-small.uk-margin |
|||
#file-select |
|||
.uk-margin(class="uk-text-center uk-text-left@m") |
|||
span.uk-text-middle Select an image |
|||
div(uk-form-custom).uk-margin-small-left |
|||
input( |
|||
type="file", |
|||
formenctype="multipart/form-data", |
|||
accept=".jpg,.png,image/jpeg,image/png", |
|||
data-file-select-container= containerId, |
|||
data-file-select="test-image-upload", |
|||
data-file-size-element= "file-size", |
|||
data-file-max-size= 15 * 1024000, |
|||
data-image-id= imageId, |
|||
data-cropper-options= cropperOptions, |
|||
onchange="return dtp.app.selectImageFile(event);", |
|||
) |
|||
button(type="button", tabindex="-1").uk-button.uk-button-default Select |
|||
|
|||
#file-info(class="uk-text-center uk-text-left@m", hidden) |
|||
#file-name.uk-text-bold |
|||
if currentImage |
|||
div resolution: #[span#image-resolution-w= numeral(currentImage.metadata.width).format('0,0')]x#[span#image-resolution-h= numeral(currentImage.metadata.height).format('0,0')] |
|||
div size: #[span#file-size= numeral(currentImage.metadata.size).format('0,0.00b')] |
|||
div last modified: #[span#file-modified= moment(currentImage.created).format('MMM DD, YYYY')] |
|||
else |
|||
div resolution: #[span#image-resolution-w 512]x#[span#image-resolution-h 512] |
|||
div size: #[span#file-size N/A] |
|||
div last modified: #[span#file-modified N/A] |
|||
|
|||
.uk-card-footer |
|||
div(class="uk-flex-center", uk-grid) |
|||
#file-save-btn(hidden).uk-width-auto |
|||
button( |
|||
type="submit", |
|||
).uk-button.uk-button-primary Save |
@ -0,0 +1,28 @@ |
|||
extends ../layouts/main |
|||
block content |
|||
|
|||
|
|||
div(uk-grid).uk-flex-middle |
|||
.uk-width-expand |
|||
h1.margin-remove Tokens |
|||
section.uk-section.uk-section-default.uk-section-xsmall |
|||
.uk-container |
|||
.uk-text-small |
|||
h4 This is where you will regenerate OTP tokens for your admin account and destroy your old OTP account. |
|||
//- .uk-width-auto |
|||
button( |
|||
type="button", |
|||
data-user= user._id, |
|||
onclick="return dtp.adminApp.generateOTPTokens(event);", |
|||
).uk-button.dtp-button-danger |
|||
+renderButtonIcon('fa-repeat', 'Generate OTP Tokens') |
|||
//- regenerate route should set this so tokens can be viewed once. |
|||
if otpRegen |
|||
section.uk-section.uk-section-default.uk-section-xsmall |
|||
.uk-container |
|||
h3 You should save these tokens in a safe place. This is the only time you will see them. |
|||
p These tokens should be saved in a safe place so you can get into your account should you lose your 2FA device |
|||
each token of tokens |
|||
ul.uk-list.uk-list-divider |
|||
li |
|||
.uk-text-small= token.token |
@ -0,0 +1,28 @@ |
|||
extends ../layouts/main |
|||
block vendorcss |
|||
link(rel='stylesheet', href=`/cropperjs/cropper.min.css?v=${pkg.version}`) |
|||
block vendorjs |
|||
script(src=`/cropperjs/cropper.min.js?v=${pkg.version}`) |
|||
block content |
|||
|
|||
include ../components/file-upload-image |
|||
|
|||
//- h2 Add or replace your site images here |
|||
div(uk-grid).uk-flex-middle |
|||
.uk-width-expand |
|||
fieldset |
|||
legend Site Icon |
|||
.uk-margin |
|||
if siteIcon |
|||
p.uk-card-title Replace your site icon below. |
|||
else |
|||
p.uk-card-title You do not currently have a site icon. Add one below. |
|||
+renderFileUploadImage( |
|||
`/admin/settings/images/updateSiteIcon`, |
|||
'site-icon-upload', |
|||
'site-icon-file', |
|||
'site-icon-picture', |
|||
`/img/icon/dtp-base.png`, |
|||
siteIcon, |
|||
{ aspectRatio: 1 }, |
|||
) |
Loading…
Reference in new issue