${process.env.WELCOME_MESSAGE}` */);
}));
router.post('/useradmin/register/token', bodyParser.urlencoded({ extended: true }), runAsyncWrapper(async (req, res) => {
const { email } = req.body;
if (!email) {
logger.warn('/useradmin/register/token - Malformed Request!');
return res.status(400).send('Malformed Request');
}
if (!process.env.ALLOW_REGISTRATION) {
return res.status(401).send('Unauthorized.');
}
const authAccount = await authenticationController.getAuthenticatedAccount(req);
if (authAccount != null) {
return res.redirect('/useradmin/overview');
}
const account = await userController.getAccountFromEmail(email.trim().toLowerCase());
if (account != null) {
return res.redirect(`/useradmin/register?status=${encodeURIComponent('Email is already registered')}`);
}
const token = (process.env.NODE_ENV === 'development') ? 'verysecrettoken' : crypto.createHmac('sha256', process.env.APP_SALT).update(email.trim()).digest('hex');
let infoText = '';
if (req.body.token === undefined) { // email entered, token request
infoText = 'Please check your inbox (SPAM) for an email with the registration token. If the token was not delivered, please ask the administrator to check the server.log for the token generated for your email.
';
await mailingController.sendEmailVerification(token, email);
} else if (req.body.token !== token) {
infoText = 'The registration token you entered was incorrect, please try again.
';
} else if (req.body.password !== req.body.password2 || req.body.password.length < 3) {
infoText = 'The passwords you entered did not match or were shorter than 3 characters, please try again.
';
} else {
let result = false;
try {
result = await userController._dirtyCreateAccount(
email,
crypto.createHash('sha256').update(req.body.password + process.env.APP_SALT).digest('hex'),
Date.now(),
false,
);
} catch (error) {
console.error('error creating account', error);
}
logger.debug('created account:', result);
if (result.dataValues) {
const account = result.dataValues;
logger.info(`USERADMIN REGISTRATION - created new account #${account.id} with email ${email}`);
return res.redirect(`/useradmin?status=${encodeURIComponent('Successfully registered')}`);
}
logger.error(`USERADMIN REGISTRATION - account creation failed, resulting account data for email ${email} is: ${result}`);
infoText = 'Unable to complete account registration (database error).
* To pair a new device, first have it auto-register on this server. Then scan the QR Code and paste the Device Token below.
${req.query.linkstatus !== undefined ? ` ${htmlspecialchars(req.query.linkstatus)}
` : ''}
Sign Out`;
response += ` ${process.env.WELCOME_MESSAGE}`;
return res.status(200).send(response);
}));
router.get('/api/useradmin/unpair_device/:dongleId', runAsyncWrapper(async (req, res) => {
const account = await authenticationController.getAuthenticatedAccount(req);
if (account == null) {
return res.redirect(`/useradmin?status=${encodeURIComponent('Invalid or expired session')}`);
}
return res.redirect('/useradmin/overview');
}));
router.post('/useradmin/pair_device', [getAccount, bodyParser.urlencoded({ extended: true })], runAsyncWrapper(async (req, res) => {
const { account, body: { qrString } } = req;
if (!account) {
res.redirect(`/useradmin?status=${encodeURIComponent('Invalid or expired session')}`);
return;
}
const pairDevice = await deviceController.pairDevice(account, req.body.qrString);
if (pairDevice.success === true) {
res.redirect('/useradmin/overview');
} else if (pairDevice.registered === true) {
res.redirect(`/useradmin/overview?linkstatus=${encodeURIComponent('Device not registered on Server')}`);
} else if (pairDevice.badToken === true) {
res.redirect(`/useradmin/overview?linkstatus=${encodeURIComponent('Device QR Token is invalid or has expired')}`);
} else if (pairDevice.alreadyPaired) {
res.redirect(`/useradmin/overview?linkstatus=${encodeURIComponent('Device is already paired, unpair in that account first')}`);
} else if (pairDevice.badQr) {
res.redirect(`/useradmin/overview?linkstatus=${encodeURIComponent('Bad QR')}`);
} else {
res.redirect(`/useradmin/overview?linkstatus=${encodeURIComponent(`Unspecified Error ${JSON.stringify(pairDevice)}`)}`);
}
}));
router.get('/useradmin/device/:dongleId', runAsyncWrapper(async (req, res) => {
const { dongleId } = req.params;
const account = await authenticationController.getAuthenticatedAccount(req);
if (account == null) {
return res.redirect(`/useradmin?status=${encodeURIComponent('Invalid or expired session')}`);
}
const device = await deviceController.getDeviceFromDongleId(req.params.dongleId);
if (device == null || device.account_id !== account.id) {
return res.status(400).send('Unauthorized.');
}
const drives = await deviceController.getDrives(device.dongle_id, false, true);
const dongleIdHash = crypto.createHmac('sha256', process.env.APP_SALT).update(device.dongle_id).digest('hex');
const bootlogFiles = await deviceController.getBootlogs(device.dongle_id);
const crashlogFiles = await deviceController.getCrashlogs(device.dongle_id);
let response = `
';
}
var qcamera = '--';
var fcamera = '--';
var dcamera = '--';
var qlog = '--';
var rlog = '--';
var isProcessed = '?';
var isStalled = '?';
for (var i = 0; i <= drive.max_segment; i++) {
if (directorySegments["seg-" + i] == undefined) {
response += '