- 01 Mar, 2026 9 commits
-
-
Johnny authored
-
Johnny authored
-
Johnny authored
-
Johnny authored
-
Johnny authored
Add migration scripts for existing instances without a storage setting to explicitly preserve DATABASE as their storage type, ensuring backward compatibility. Change the default for new installations to LOCAL to improve out-of-the-box performance.
-
Johnny authored
-
Johnny authored
-
Mudkip authored
-
mostapko authored
-
- 26 Feb, 2026 4 commits
-
-
Steven authored
Align header padding, text color, background tokens, and item row styles across CodeBlock, AttachmentList, RelationList, and LocationDisplay so all metadata panels follow the same visual pattern.
-
Steven authored
- Add PR stale/close handling alongside issues - Reduce close grace period from 7 to 3 days - Add inline comments explaining the two-phase stale behavior - Rename workflow and job names for clarity
-
Kevin Zhang authored
Signed-off-by:Kevin Zhang <ztm0929@icloud.com>
-
milvasic authored
-
- 25 Feb, 2026 2 commits
- 24 Feb, 2026 3 commits
-
-
Steven authored
When multiple tabs are open and a token expires, each tab independently attempts a refresh. With server-side token rotation this causes all but the first tab to fail, logging the user out. Add a BroadcastChannel (memos_token_sync) so that when any tab successfully refreshes, it broadcasts the new token to all other tabs. Receiving tabs adopt the token in-memory immediately, skipping their own refresh request and avoiding conflicts with token rotation. Falls back gracefully when BroadcastChannel is unavailable (e.g. some privacy modes).
-
Steven authored
Add ApplyToContext and AuthenticateToUser helpers to the auth package, then remove the duplicated auth code spread across the MCP middleware, file server, Connect interceptor, and gRPC-Gateway middleware. - auth.ApplyToContext: single place to set claims/user into context after Authenticate() - auth.AuthenticateToUser: resolves any credential (bearer token or refresh cookie) to a *store.User - MCP middleware: replaced manual PAT DB lookup + expiry check with Authenticator.AuthenticateByPAT - File server: replaced authenticateByBearerToken/authenticateByRefreshToken with AuthenticateToUser - Connect interceptor + Gateway middleware: replaced duplicated context-setting block with ApplyToContext - MCPService now accepts secret to construct its own Authenticator
-
Steven authored
Embeds a Model Context Protocol (MCP) server into the Memos HTTP process, exposing memo operations as MCP tools at POST/GET /mcp using Streamable HTTP transport. Authentication is PAT-only — requests without a valid personal access token receive HTTP 401. Six tools are exposed: list_memos, get_memo, create_memo, update_memo, delete_memo, and search_memos, all scoped to the authenticated user.
-
- 23 Feb, 2026 8 commits
-
-
Steven authored
-
Mudkip authored
-
Steven authored
Two bugs caused users to be redirected to /auth too frequently: 1. Race condition in Promise.all([initInstance(), initAuth()]): initInstance() makes a gRPC request whose auth interceptor calls getAccessToken() synchronously. When the access token was expired, getAccessToken() eagerly deleted it from localStorage as a "cleanup" side-effect. By the time initAuth() ran and checked hasStoredToken(), localStorage was already empty, so it skipped the getCurrentUser() call and the token refresh cycle entirely — logging the user out even when the refresh-token cookie was still valid. Fix: remove the localStorage deletion from getAccessToken(); clearAccessToken() (called on confirmed auth failure and logout) handles proper cleanup. 2. React Query retry: 1 caused a second refresh+redirect attempt after auth failures. The auth interceptor already handles token refresh and request retry internally. If it still throws Unauthenticated, the redirect is already in flight — a React Query retry only fires another failed refresh and a redundant redirectOnAuthFailure() call. Fix: use a shouldRetry function that skips retries for Unauthenticated errors while keeping the existing once-retry behaviour for other errors.
-
Steven authored
The explore page sidebar was showing tags from the current user's private memos because the default ListMemos query applies a server-side OR filter (creator_id == X || visibility in [...]), mixing private content in. Fix by using a visibility-scoped ListMemos request in the explore context so private memos are always excluded via the AND'd server auth filter. Also consolidate two always-firing useMemos calls into one context-aware query, unify activity stats computation with countBy across all branches, and extract a toDateString helper to remove duplicated formatting logic.
-
Steven authored
Use useTranslation() hook instead of the static i18n import so that the month label re-computes when the language changes.
-
Steven authored
Fixes two bugs reported in #5603: 1. store/attachment.go: ignore os.ErrNotExist when removing a local attachment file so that a missing file on disk (broken state from failed uploads) no longer blocks deletion of the DB record, allowing memos referencing corrupt attachments to be deleted normally. 2. memo_attachment_service.go: add nil guard on GetAttachment result before dereferencing it in SetMemoAttachments, preventing a nil pointer panic when an attachment UID no longer exists in the DB.
-
Steven authored
-
Steven authored
- Add plugin/webhook/validate.go as single source of truth for SSRF protection: reserved CIDR list parsed once at init(), isReservedIP(), and exported ValidateURL() used at registration/update time - Replace unguarded http.Client in webhook.go with safeClient whose Transport uses a custom DialContext that re-resolves hostnames at dial time, defeating DNS rebinding attacks - Call webhook.ValidateURL() in CreateUserWebhook and both UpdateUserWebhook paths to reject non-http/https schemes and reserved/private IP targets before persisting - Strip internal service response body from non-2xx error log messages to prevent data leakage via application logs
-
- 22 Feb, 2026 7 commits
-
-
Steven authored
-
Steven authored
Switch from sessionStorage to localStorage so the auth token survives across tabs and browser restarts, matching standard platform behavior. Also guard the signup redirect in App.tsx behind profileLoaded to avoid a false redirect when the instance profile fetch fails.
-
Steven authored
When no token exists in sessionStorage, AuthContext.initialize() was still calling GetCurrentUser, triggering the auth interceptor to attempt RefreshToken and retry — producing a burst of 5+ auth API calls in under a second that reverse proxies with rate limiting (e.g. CrowdSec) flag as brute force. Add hasStoredToken() to auth-state and bail out of initialize() early when there is definitively no session to restore. The refresh flow for expired tokens is preserved since hasStoredToken() checks for presence regardless of expiry. Fixes #5647
-
Steven authored
The closest() selector was targeting a CSS class that never existed on the container, causing fallback to document.body and collecting task items across all visible memos. This caused index collisions when multiple memos with todo lists were on the page. Adds data-memo-content attribute to the container and updates the selector accordingly. Fixes #5635
-
Steven authored
Wrapping the returned function in useCallback prevents a new reference on every render, which was causing an infinite startViewTransition loop on the initial signup page (fresh install with no admin). Fixes #5626
-
Steven authored
-
milvasic authored
-
- 14 Feb, 2026 1 commit
-
-
Kaki021 authored
-
- 12 Feb, 2026 3 commits
- 11 Feb, 2026 3 commits