1. 23 Feb, 2026 1 commit
    • Steven's avatar
      fix(webhook): remediate SSRF vulnerability in webhook dispatcher · 150371d2
      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
      150371d2
  2. 22 Feb, 2026 7 commits
  3. 14 Feb, 2026 1 commit
  4. 12 Feb, 2026 3 commits
  5. 11 Feb, 2026 3 commits
  6. 10 Feb, 2026 5 commits
  7. 09 Feb, 2026 3 commits
    • Steven's avatar
      fix(tests): update PAT tests to accept both custom and SQL errors · 2b19d8a9
      Steven authored
      The PostgreSQL implementation returns 'PAT not found' when no rows match,
      while SQLite/MySQL return 'sql: no rows in result set' from QueryRowContext.
      
      Both behaviors are correct - the key fix is that PostgreSQL no longer
      throws JSONB errors on missing/malformed data.
      
      Changes:
      - Update test assertions to accept either error type
      - Fix comment punctuation for godot linter
      - Maintain backward compatibility across all database drivers
      2b19d8a9
    • Steven's avatar
      fix(postgres): handle missing PAT data gracefully and add comprehensive tests · d9e8387d
      Steven authored
      Fixes #5612, #5611
      
      Root cause: PostgreSQL's jsonb_array_elements() throws errors when the
      'tokens' key is missing or malformed, while SQLite/MySQL return NULL
      gracefully. This caused:
      - 502 errors when creating admin after v0.25.3 → v0.26.0 upgrade
      - Settings not persisting and users unable to stay logged in
      
      Changes to store/db/postgres/user_setting.go:
      - Remove strict JSONB operations from GetUserByPATHash query
      - Fetch all PERSONAL_ACCESS_TOKENS rows and filter in Go
      - Skip malformed/invalid JSON rows with continue (error recovery)
      - Match SQLite/MySQL's forgiving error handling
      
      New integration tests (store/test/user_setting_test.go):
      - TestUserSettingGetUserByPATHashNoTokensKey
      - TestUserSettingGetUserByPATHashEmptyTokensArray
      - TestUserSettingGetUserByPATHashWithOtherUsers
      
      New PostgreSQL-specific tests (store/db/postgres/user_setting_test.go):
      - TestGetUserByPATHashWithMissingData (comprehensive edge cases)
      - TestGetUserByPATHashPerformance (100+ users)
      - TestUpsertUserSetting (basic upsert)
      
      Test coverage:
       Missing PERSONAL_ACCESS_TOKENS key
       Empty/malformed JSON data
       Multiple users with mixed valid/invalid data
       Performance with 100+ users
       Error recovery without crashes
      
      Benefits:
      - No database migration required (TEXT column works fine)
      - Backward compatible with v0.25.3 upgrades
      - Handles missing/corrupt data gracefully
      - Consistent behavior across all database drivers
      d9e8387d
    • MuLingQwQ's avatar
  8. 08 Feb, 2026 6 commits
  9. 07 Feb, 2026 1 commit
  10. 05 Feb, 2026 2 commits
    • Steven's avatar
      fix: prevent 401 errors on window focus when token expires · 81ef53b3
      Steven authored
      Fixes #5589
      
      When the page returns from background to foreground after the JWT
      token expires (~15 min), React Query's automatic refetch-on-focus
      triggers multiple API calls simultaneously. These all fail with 401
      Unauthorized, leaving the user with empty content.
      
      Solution:
      - Add useTokenRefreshOnFocus hook that listens to visibilitychange
      - Proactively refresh token BEFORE React Query refetches
      - Uses 2-minute buffer to catch expiring tokens early
      - Graceful error handling - logs error but doesn't block
      
      Changes:
      - Created web/src/hooks/useTokenRefreshOnFocus.ts
      - Updated isTokenExpired() to accept optional buffer parameter
      - Exported refreshAccessToken() for use by the hook
      - Integrated hook into AppInitializer (only when user authenticated)
      81ef53b3
    • Steven's avatar
      chore: tweak security report email · 86f780d1
      Steven authored
      86f780d1
  11. 04 Feb, 2026 4 commits
    • Steven's avatar
      refactor: remove hide-scrollbar utility · cf65f086
      Steven authored
      Removed the hide-scrollbar CSS class and all its usages throughout the
      codebase. Hiding scrollbars can hurt UX by making it unclear when
      content is scrollable.
      
      Changes:
      - Removed hide-scrollbar CSS definition from index.css
      - Removed hide-scrollbar class from Navigation component (2 instances)
      - Removed hide-scrollbar class from MemoDetailSidebar (2 instances)
      - Removed hide-scrollbar class from TagsSection
      - Removed hide-scrollbar class from ShortcutsSection
      
      Components now use standard browser scrollbar behavior, which provides
      better visual feedback to users about scrollable content. Modern
      browsers already handle scrollbar appearance elegantly.
      cf65f086
    • Steven's avatar
      perf: disable tooltips in year calendar to fix lag · 74b63b27
      Steven authored
      Fixed issue #5579 where the calendar selection dialog was very laggy.
      
      The root cause was rendering ~365 individual Tooltip components when
      opening the year calendar view (one per day with activity). This created
      a huge number of DOM nodes and event listeners that caused significant
      performance issues.
      
      Changes:
      - Added disableTooltips prop to MonthCalendar and CalendarCell components
      - Disabled tooltips in YearCalendar's small month views
      - Removed unnecessary TooltipProvider wrapper in YearCalendar
      - Tooltips remain enabled in the default month calendar view
      
      Performance improvements:
      - Eliminates ~365 tooltip instances when dialog opens
      - Reduces initial render time significantly
      - Makes dialog interactions smooth and responsive
      
      Users can still click on dates to drill down for details if needed.
      74b63b27
    • Steven's avatar
      fix: shortcut edit button opens create dialog instead of edit dialog · e7605d90
      Steven authored
      Fixed issue #5576 where clicking the edit button on a shortcut would
      incorrectly open a create dialog instead of an edit dialog.
      
      The root cause was an incorrect useEffect that was watching the shortcut
      state itself instead of the initialShortcut prop. When the dialog was
      opened for editing, the state wasn't properly reinitializing with the
      existing shortcut data.
      
      Changed the useEffect to:
      - Watch initialShortcut as the dependency
      - Reinitialize the shortcut state when initialShortcut changes
      - Properly distinguishes between create (initialShortcut undefined) and
        edit (initialShortcut has data) modes
      e7605d90
    • memory_clear's avatar
  12. 03 Feb, 2026 2 commits
    • Steven's avatar
      fix: prevent CTRL+Enter save while editor is loading content (#5581) · 6bb383a4
      Steven authored
      - Add validation check for loading state before allowing save
      - Prevents false "Content, attachment, or file required" error
      - Occurs when user presses CTRL+Enter immediately after opening edit mode
      - Editor state may still be loading when keyboard shortcut fires
      
      Closes #5581
      6bb383a4
    • Steven's avatar
      fix: nested task list display and checkbox interaction (#5575) · b4fea8c6
      Steven authored
      - Fix nested task lists not showing proper indentation
      - Use simple CSS cascade with [&_ul.contains-task-list]:ml-6
      - Fix checkbox clicks toggling wrong tasks in nested lists
      - Search from memo root container for global task indexing
      - Remove complex selectors in favor of standard approach
      - Match behavior of GitHub, Notion, and other platforms
      
      Closes #5575
      b4fea8c6
  13. 02 Feb, 2026 2 commits
    • Steven's avatar
      fix(auth): make PKCE optional for OAuth sign-in (#5570) · cf0a285e
      Steven authored
      Fixes issue where OAuth sign-in fails with 'Cannot read properties of
      undefined (reading 'digest')' when accessing Memos over HTTP.
      
      The crypto.subtle API is only available in secure contexts (HTTPS or
      localhost), but PKCE (RFC 7636) is optional per OAuth 2.0 standards.
      
      Changes:
      - Make PKCE generation optional with graceful fallback
      - Use PKCE when crypto.subtle available (HTTPS/localhost)
      - Fall back to standard OAuth flow when unavailable (HTTP)
      - Log warning to console when PKCE unavailable
      - Only include code_challenge in auth URL when PKCE enabled
      
      The backend already supports optional PKCE (empty codeVerifier), so no
      backend changes needed. This fix aligns frontend behavior with backend.
      
      Benefits:
      - OAuth sign-in works on HTTP deployments (reverse proxy scenarios)
      - Enhanced security (PKCE) still used when HTTPS available
      - Backward compatible with OAuth providers that don't support PKCE
      
      Fixes #5570
      cf0a285e
    • Steven's avatar
      refactor: improve GitHub Actions workflows structure and maintainability · 7465fbb4
      Steven authored
      - Add build-binaries workflow for multi-platform binary releases
      - Rename workflows for conciseness:
        - demo-render-deploy.yml → demo-deploy.yml
        - build-and-push-canary-image.yml → build-canary-image.yml
        - build-and-push-stable-image.yml → build-stable-image.yml
      - Centralize version config with env variables (GO_VERSION, NODE_VERSION, PNPM_VERSION)
      - Standardize step names across all workflows
      - Add concurrency controls to prevent redundant runs
      - Update Node.js (20→22) and pnpm (9→10) versions to match build-binaries
      - Improve job names with descriptive labels
      - Add consistent comments and formatting
      - Set artifact retention to 60 days for binary builds
      7465fbb4