Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions hooks/sapling/user/forgot.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

/* Dependencies */
import { console } from '@sapling/sapling/lib/Cluster.js';
import Redirect from '@sapling/sapling/lib/Redirect.js';
import Response from '@sapling/sapling/lib/Response.js';
import SaplingError from '@sapling/sapling/lib/SaplingError.js';
import Validation from '@sapling/sapling/lib/Validation.js';
Expand Down Expand Up @@ -56,9 +57,7 @@ export default async function forgot(app, request, response) {

/* Respond the same way whether or not we did anything */
/* If we need to redirect, let's redirect */
if (request.query.redirect) {
response.redirect(request.query.redirect);
} else {
if (!(new Redirect(app, request, response)).do()) {
/* Respond positively */
return new Response(app, request, response);
}
Expand Down
5 changes: 2 additions & 3 deletions hooks/sapling/user/login.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import _ from 'underscore';

import Hash from '@sapling/sapling/lib/Hash.js';
import Redirect from '@sapling/sapling/lib/Redirect.js';
import Response from '@sapling/sapling/lib/Response.js';
import SaplingError from '@sapling/sapling/lib/SaplingError.js';

Expand Down Expand Up @@ -121,9 +122,7 @@ export default async function login(app, request, response) {
}

/* If we need to redirect, let's redirect */
if (request.query.redirect) {
response.redirect(request.query.redirect);
} else {
if (!(new Redirect(app, request, response, request.session.user)).do()) {
/* Otherwise, reply with the user object */
return new Response(app, request, response, null, request.session.user);
}
Expand Down
5 changes: 2 additions & 3 deletions hooks/sapling/user/logout.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
*/

/* Dependencies */
import Redirect from '@sapling/sapling/lib/Redirect.js';
import Response from '@sapling/sapling/lib/Response.js';


Expand All @@ -15,9 +16,7 @@ export default async function logout(app, request, response) {
request.session = null;

/* Redirect if needed, respond otherwise */
if (request.query.redirect) {
response.redirect(request.query.redirect);
} else {
if (!(new Redirect(app, request, response)).do()) {
return new Response(app, request, response);
}
}
25 changes: 12 additions & 13 deletions hooks/sapling/user/recover.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
/* Dependencies */
import Hash from '@sapling/sapling/lib/Hash.js';

import Redirect from '@sapling/sapling/lib/Redirect.js';
import Response from '@sapling/sapling/lib/Response.js';
import SaplingError from '@sapling/sapling/lib/SaplingError.js';

Expand Down Expand Up @@ -103,21 +104,19 @@ export default async function recover(app, request, response) {
session: app.adminSession,
});

/* If we need to redirect, let's redirect */
if (request.query.redirect) {
response.redirect(request.query.redirect);
} else {
/* Clean the output */
if (userData.length > 0) {
if ('password' in userData[0]) {
delete userData[0].password;
}

if ('_salt' in userData[0]) {
delete userData[0]._salt;
}
/* Clean the output */
if (userData.length > 0) {
if ('password' in userData[0]) {
delete userData[0].password;
}

if ('_salt' in userData[0]) {
delete userData[0]._salt;
}
}

/* If we need to redirect, let's redirect */
if (!(new Redirect(app, request, response, userData)).do()) {
/* Respond with the user object */
return new Response(app, request, response, null, userData);
}
Expand Down
5 changes: 2 additions & 3 deletions hooks/sapling/user/register.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import _ from 'underscore';

import { console } from '@sapling/sapling/lib/Cluster.js';
import Hash from '@sapling/sapling/lib/Hash.js';
import Redirect from '@sapling/sapling/lib/Redirect.js';
import Response from '@sapling/sapling/lib/Response.js';
import SaplingError from '@sapling/sapling/lib/SaplingError.js';

Expand Down Expand Up @@ -97,9 +98,7 @@ export default async function register(app, request, response) {
console.log('REGISTER', errors, userData);

/* If we need to redirect, let's redirect */
if (request.query.redirect) {
response.redirect(request.query.redirect);
} else {
if (!(new Redirect(app, request, response, userData)).do()) {
/* Respond with the user object */
return new Response(app, request, response, null, userData);
}
Expand Down
17 changes: 8 additions & 9 deletions hooks/sapling/user/update.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
/* Dependencies */
import Hash from '@sapling/sapling/lib/Hash.js';

import Redirect from '@sapling/sapling/lib/Redirect.js';
import Response from '@sapling/sapling/lib/Response.js';
import SaplingError from '@sapling/sapling/lib/SaplingError.js';

Expand Down Expand Up @@ -102,16 +103,14 @@ export default async function update(app, request, response) {
session: request.session,
});

/* If we need to redirect, let's redirect */
if (request.query.redirect) {
response.redirect(request.query.redirect);
} else {
/* Clean the output */
for (const record of userData) {
delete record.password;
delete record._salt;
}
/* Clean the output */
for (const record of userData) {
delete record.password;
delete record._salt;
}

/* If we need to redirect, let's redirect */
if (!(new Redirect(app, request, response, userData)).do()) {
/* Respond with the user object */
return new Response(app, request, response, null, userData);
}
Expand Down
47 changes: 47 additions & 0 deletions lib/Redirect.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
/**
* Redirect
*
* Figures out if the current request needs to be redirected,
* and does so if needed. Otherwise returns false.
*/

/* Dependencies */
import { inject } from 'regexparam';


/**
* The Redirect class
*/
export default class Redirect {
/**
* Initialise the Redirect class
*
* @param {object} App The App instance
* @param {object} request Request object from Express
* @param {object} response Response object from Express
* @param {object} data Data to apply to redirect destination
*/
constructor(App, request, response, data) {
this.app = App;
this.request = request;
this.response = response;

this.data = Array.isArray(data) ? data[0] : data;
}


/**
* Execute the redirection
*
* @returns {boolean} Whether redirection happened or not
*/
do() {
if ('redirect' in this.request.query || 'goto' in this.request.query) {
const destination = String(this.request.query.redirect || this.request.query.goto);
this.response.redirect(inject(destination, this.data));
return true;
}

return false;
}
}
16 changes: 4 additions & 12 deletions lib/Request.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

/* Dependencies */
import _ from 'underscore';
import { getQueryParams } from '@tinyhttp/url';

import { console } from './Cluster.js';
import Validation from './Validation.js';
Expand Down Expand Up @@ -74,7 +75,8 @@ export default class Request {
*/
parse(request) {
/* Get the URL segments from the requested URL */
const query = new URL(request.url, `${request.protocol}://${request.hostname}`);
const url = request.originalUrl || request.url;
const query = new URL(url, 'https://localhost');
const parts = query.pathname.split('/');

/* Request method */
Expand Down Expand Up @@ -110,16 +112,6 @@ export default class Request {
console.warn(`You should add a permission for \`${request.url}\`.`);
}

/* Convert URLSearchParams to a regular object */
const queryObject = {};
for (const queryKey of query.searchParams.keys()) {
if (query.searchParams.getAll(queryKey).length > 1) {
queryObject[queryKey] = query.searchParams.getAll(queryKey);
} else {
queryObject[queryKey] = query.searchParams.get(queryKey);
}
}

/* Format incoming data */
if (request.body) {
/* Go through every key in incoming data */
Expand Down Expand Up @@ -190,7 +182,7 @@ export default class Request {
collection,
fields,
values,
query: queryObject, // Query params
query: url.includes('?') ? getQueryParams(url) : {}, // Query params
type: parts.length >= 3 ? 'filter' : 'all',
isLogged: Boolean(request.session && request.session.user),
});
Expand Down
9 changes: 5 additions & 4 deletions lib/Response.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import path from 'node:path';
import isobject from 'isobject';

import { console } from './Cluster.js';
import Redirect from './Redirect.js';
import Templating from './Templating.js';


Expand Down Expand Up @@ -175,10 +176,10 @@ export default class Response {
* Respond with results from storage
*/
async dataResponse() {
/* If the URI includes a goto param, use it */
if (this.request.query.redirect) {
this.response.redirect(this.request.query.redirect);
return true;
/* Check if redirect is needed */
const redirect = (new Redirect(this, this.request, this.response, this.content)).do();
if (redirect) {
return false;
}

/* Otherwise just return the data */
Expand Down
2 changes: 2 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
"bin": "./index.js",
"dependencies": {
"@tinyhttp/app": "^2.0.11",
"@tinyhttp/url": "^2.0.3",
"async": "^3.2.0",
"body-parser": "1.19.0",
"chalk": "^4.1.0",
Expand All @@ -44,6 +45,7 @@
"morgan": "^1.9.1",
"nodemailer": "6.7.0",
"path-match": "^1.2.4",
"regexparam": "^2.0.0",
"sirv": "^1.0.11",
"underscore": "1.13.1",
"unused-filename": "^3.0.0",
Expand Down
4 changes: 1 addition & 3 deletions test/_utils/request.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@ export default () => {
method: 'GET',
url: '',
originalUrl: '',
query: {
redirect: false
},
query: {},
body: {},
params: {},
headers: {},
Expand Down
Loading