Compare commits

...

4 Commits

Author SHA1 Message Date
Robert Brennan
2ed1a4db21 delint 2024-11-09 17:23:17 -05:00
Robert Brennan
f24982911d mostly working 2024-11-09 17:14:12 -05:00
Robert Brennan
b20e567f45 add link 2024-11-09 17:05:01 -05:00
Robert Brennan
331651a47a fix logout 2024-11-09 16:52:43 -05:00
7 changed files with 50 additions and 30 deletions

View File

@@ -174,6 +174,12 @@ class OpenHands {
true,
);
}
static async logout(): Promise<Response> {
return request(`/api/logout`, {
method: "POST",
});
}
}
export default OpenHands;

View File

@@ -11,6 +11,7 @@ import { clientAction as settingsClientAction } from "#/routes/settings";
import { clientAction as loginClientAction } from "#/routes/login";
import { AvailableLanguages } from "#/i18n";
import { I18nKey } from "#/i18n/declaration";
import { logout } from "#/services/auth";
interface AccountSettingsModalProps {
onClose: () => void;
@@ -87,6 +88,17 @@ function AccountSettingsModal({
type="password"
defaultValue={data?.ghToken ?? ""}
/>
<span className="text-sm">
{t(I18nKey.CONNECT_TO_GITHUB_MODAL$GET_YOUR_TOKEN)}{" "}
<a
href="https://github.com/settings/tokens/new?description=openhands-app&scopes=repo,user,workflow"
target="_blank"
rel="noreferrer noopener"
className="text-[#791B80] underline"
>
{t(I18nKey.CONNECT_TO_GITHUB_MODAL$HERE)}
</a>
</span>
{gitHubError && (
<p className="text-danger text-xs">
{t(I18nKey.ACCOUNT_SETTINGS_MODAL$GITHUB_TOKEN_INVALID)}
@@ -97,10 +109,7 @@ function AccountSettingsModal({
variant="text-like"
text={t(I18nKey.ACCOUNT_SETTINGS_MODAL$DISCONNECT)}
onClick={() => {
settingsFetcher.submit(
{},
{ method: "POST", action: "/logout" },
);
logout();
onClose();
}}
className="text-danger self-start"

View File

@@ -27,6 +27,7 @@ import { getSettings, settingsAreUpToDate } from "#/services/settings";
import AllHandsLogo from "#/assets/branding/all-hands-logo.svg?react";
import NewProjectIcon from "#/assets/new-project.svg?react";
import DocsIcon from "#/assets/docs.svg?react";
import { logout } from "#/services/auth";
import { userIsAuthenticated } from "#/utils/user-is-authenticated";
import { generateGitHubAuthUrl } from "#/utils/generate-github-auth-url";
import { WaitlistModal } from "#/components/waitlist-modal";
@@ -148,7 +149,6 @@ export default function MainApp() {
settings,
analyticsConsent,
} = useLoaderData<typeof clientLoader>();
const logoutFetcher = useFetcher({ key: "logout" });
const endSessionFetcher = useFetcher({ key: "end-session" });
const dispatch = useDispatch();
@@ -210,21 +210,11 @@ export default function MainApp() {
}
}, [location.pathname]);
const handleUserLogout = () => {
logoutFetcher.submit(
{},
{
method: "POST",
action: "/logout",
},
);
};
const handleAccountSettingsModalClose = () => {
// If the user closes the modal without connecting to GitHub,
// we need to log them out to clear the invalid token from the
// local storage
if (isGitHubErrorReponse(user)) handleUserLogout();
if (isGitHubErrorReponse(user)) logout();
setAccountSettingsModalOpen(false);
};
@@ -266,7 +256,7 @@ export default function MainApp() {
? { avatar_url: user.avatar_url }
: undefined
}
onLogout={handleUserLogout}
onLogout={logout}
onClickAccountSettings={() => setAccountSettingsModalOpen(true)}
/>
<button

View File

@@ -1,13 +0,0 @@
import { json } from "@remix-run/react";
import posthog from "posthog-js";
import { cache } from "#/utils/cache";
export const clientAction = () => {
const ghToken = localStorage.getItem("ghToken");
if (ghToken) localStorage.removeItem("ghToken");
cache.clearAll();
posthog.reset();
return json({ success: true });
};

View File

@@ -4,6 +4,7 @@ import toast from "#/utils/toast";
const WAIT_FOR_AUTH_DELAY_MS = 500;
const UNAUTHED_ROUTE_PREFIXES = [
"/api/logout",
"/api/authenticate",
"/api/options/",
"/config.json",

View File

@@ -1,5 +1,11 @@
import posthog from "posthog-js";
import { cache } from "#/utils/cache";
import OpenHands from "#/api/open-hands";
const TOKEN_KEY = "token";
const GITHUB_TOKEN_KEY = "ghToken";
const REPO_KEY = "repo";
const getToken = (): string => localStorage.getItem(TOKEN_KEY) ?? "";
@@ -22,6 +28,15 @@ const clearGitHubToken = (): void => {
localStorage.removeItem(GITHUB_TOKEN_KEY);
};
const logout = (): void => {
clearToken();
clearGitHubToken();
localStorage.removeItem(REPO_KEY);
cache.clearAll();
posthog.reset();
OpenHands.logout();
};
export {
getToken,
setToken,
@@ -29,4 +44,5 @@ export {
getGitHubToken,
setGitHubToken,
clearGitHubToken,
logout,
};

View File

@@ -195,6 +195,7 @@ async def attach_session(request: Request, call_next):
'/api/options/',
'/api/github/callback',
'/api/authenticate',
'/api/logout',
]
if any(
request.url.path.startswith(path) for path in non_authed_paths
@@ -900,6 +901,16 @@ async def authenticate(request: Request):
return response
@app.post('/api/logout')
async def logout(request: Request):
response = JSONResponse(
status_code=status.HTTP_200_OK, content={'message': 'User logged out'}
)
response.delete_cookie(key='github_auth')
return response
class SPAStaticFiles(StaticFiles):
async def get_response(self, path: str, scope):
try: