mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
6af811f7ab
Summary: With this change, if a comment is added to an ACL formula, then that comment will be offered to the user if access is denied and that rule could potentially have granted access. The code is factored so that when access is permitted, or when partially visible tables are being filtered, there is little overhead. Comments are gathered only when an explicit denial of access. Test Plan: added tests, updated tests Reviewers: dsagal Reviewed By: dsagal Differential Revision: https://phab.getgrist.com/D2730
44 lines
1.6 KiB
TypeScript
44 lines
1.6 KiB
TypeScript
import {RequestWithLogin} from 'app/server/lib/Authorizer';
|
|
import * as log from 'app/server/lib/log';
|
|
import * as express from 'express';
|
|
|
|
/**
|
|
* Wrapper for async express endpoints to catch errors and forward them to the error handler.
|
|
*/
|
|
export function expressWrap(callback: express.RequestHandler): express.RequestHandler {
|
|
return async (req, res, next) => {
|
|
try {
|
|
await callback(req, res, next);
|
|
} catch (err) {
|
|
next(err);
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Error-handling middleware that responds to errors in json. The status code is taken from
|
|
* error.status property (for which ApiError is convenient), and defaults to 500.
|
|
*/
|
|
export const jsonErrorHandler: express.ErrorRequestHandler = (err, req, res, next) => {
|
|
const mreq = req as RequestWithLogin;
|
|
log.warn("Error during api call to %s: (%s) user %d params %s body %s", req.path, err.message,
|
|
mreq.userId,
|
|
JSON.stringify(req.params), JSON.stringify(req.body));
|
|
let details = err.details && {...err.details};
|
|
const status = details?.status || err.status || 500;
|
|
if (details) {
|
|
// Remove some details exposed for websocket API only.
|
|
delete details.accessMode;
|
|
delete details.status; // TODO: reconcile err.status and details.status, no need for both.
|
|
if (Object.keys(details).length === 0) { details = undefined; }
|
|
}
|
|
res.status(status).json({error: err.message || 'internal error', details});
|
|
};
|
|
|
|
/**
|
|
* Middleware that responds with a 404 status and a json error object.
|
|
*/
|
|
export const jsonNotFoundHandler: express.RequestHandler = (req, res, next) => {
|
|
res.status(404).json({error: `not found: ${req.url}`});
|
|
};
|