mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
2563fb745a
Summary: This makes many small changes so that Grist is less fussy to run as a single instance behind a reverse proxy. Some users had difficulty with the self-connections Grist would make, due to internal network setup, and since these are unnecessary in any case in this scenario, they are now optimized away. Likewise some users had difficulties related to doc worker urls, which are now also optimized away. With these changes, users should be able to get a lot further on first try, at least far enough to open and edit documents. The `GRIST_SINGLE_ORG` setting was proving a bit confusing, since it appeared to only work when set to `docs`. This diff adds a check for whether the specified org exists, and if not, it creates it. This still depends on having a user email to make as the owner of the team, so there could be remaining difficulties there. Test Plan: tested manually with nginx Reviewers: jarek Reviewed By: jarek Differential Revision: https://phab.getgrist.com/D3299
68 lines
2.2 KiB
TypeScript
68 lines
2.2 KiB
TypeScript
import { UserProfile } from 'app/common/UserAPI';
|
|
import { GristLoginSystem, GristServer } from 'app/server/lib/GristServer';
|
|
import { fromCallback } from 'app/server/lib/serverUtils';
|
|
import { Request } from 'express';
|
|
|
|
/**
|
|
* Return a login system that supports a single hard-coded user.
|
|
*/
|
|
export async function getMinimalLoginSystem(): Promise<GristLoginSystem> {
|
|
// Login and logout, redirecting immediately back. Signup is treated as login,
|
|
// no nuance here.
|
|
return {
|
|
async getMiddleware(gristServer: GristServer) {
|
|
return {
|
|
async getLoginRedirectUrl(req: Request, url: URL) {
|
|
await setSingleUser(req, gristServer);
|
|
return url.href;
|
|
},
|
|
async getLogoutRedirectUrl(req: Request, url: URL) {
|
|
return url.href;
|
|
},
|
|
async getSignUpRedirectUrl(req: Request, url: URL) {
|
|
await setSingleUser(req, gristServer);
|
|
return url.href;
|
|
},
|
|
async addEndpoints() {
|
|
// If working without a login system, make sure default user exists.
|
|
const dbManager = gristServer.getHomeDBManager();
|
|
const profile = getDefaultProfile();
|
|
const user = await dbManager.getUserByLoginWithRetry(profile.email, profile);
|
|
if (user) {
|
|
// No need to survey this user!
|
|
user.isFirstTimeUser = false;
|
|
await user.save();
|
|
}
|
|
return "no-logins";
|
|
},
|
|
};
|
|
},
|
|
async deleteUser() {
|
|
// nothing to do
|
|
},
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Set the user in the current session to the single hard-coded user.
|
|
*/
|
|
async function setSingleUser(req: Request, gristServer: GristServer) {
|
|
const scopedSession = gristServer.getSessions().getOrCreateSessionFromRequest(req);
|
|
// Make sure session is up to date before operating on it.
|
|
// Behavior on a completely fresh session is a little awkward currently.
|
|
const reqSession = (req as any).session;
|
|
if (reqSession?.save) {
|
|
await fromCallback(cb => reqSession.save(cb));
|
|
}
|
|
await scopedSession.operateOnScopedSession(req, async (user) => Object.assign(user, {
|
|
profile: getDefaultProfile()
|
|
}));
|
|
}
|
|
|
|
function getDefaultProfile(): UserProfile {
|
|
return {
|
|
email: process.env.GRIST_DEFAULT_EMAIL || 'you@example.com',
|
|
name: 'You',
|
|
};
|
|
}
|