mirror of
https://github.com/gristlabs/grist-core.git
synced 2026-03-02 04:09:24 +00:00
(core) Move user profile to new page and begin MFA work
Summary: The user profile dialog is now a separate page, in preparation for upcoming work to enable MFA. This commit also contains some MFA changes, but the UI is currently disabled and the implementation is limited to software tokens (TOTP) only. Test Plan: Updated browser tests for new profile page. Tests for MFAConfig and CognitoClient will be added in a later diff, once the UI is enabled. Reviewers: paulfitz Reviewed By: paulfitz Subscribers: dsagal Differential Revision: https://phab.getgrist.com/D3199
This commit is contained in:
@@ -15,25 +15,52 @@ export function expressWrap(callback: express.RequestHandler): express.RequestHa
|
||||
};
|
||||
}
|
||||
|
||||
interface JsonErrorHandlerOptions {
|
||||
shouldLogBody?: boolean;
|
||||
shouldLogParams?: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a custom error-handling middleware that responds to errors in json.
|
||||
*
|
||||
* Currently allows for toggling of logging request bodies and params.
|
||||
*/
|
||||
const buildJsonErrorHandler = (options: JsonErrorHandlerOptions = {}): express.ErrorRequestHandler => {
|
||||
return (err, req, res, _next) => {
|
||||
const mreq = req as RequestWithLogin;
|
||||
log.warn(
|
||||
"Error during api call to %s: (%s) user %d%s%s",
|
||||
req.path, err.message, mreq.userId,
|
||||
options.shouldLogParams !== false ? ` params ${JSON.stringify(req.params)}` : '',
|
||||
options.shouldLogBody !== false ? ` body ${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});
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* 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});
|
||||
};
|
||||
export const jsonErrorHandler: express.ErrorRequestHandler = buildJsonErrorHandler();
|
||||
|
||||
/**
|
||||
* Variant of `jsonErrorHandler` that skips logging request bodies and params.
|
||||
*
|
||||
* Should be used for sensitive routes, such as those under '/api/auth/'.
|
||||
*/
|
||||
export const secureJsonErrorHandler: express.ErrorRequestHandler = buildJsonErrorHandler({
|
||||
shouldLogBody: false,
|
||||
shouldLogParams: false,
|
||||
});
|
||||
|
||||
/**
|
||||
* Middleware that responds with a 404 status and a json error object.
|
||||
|
||||
Reference in New Issue
Block a user