Gitea

gitea.io
Gitea

Lightweight self-hosted git platform, written in Go.

Open Source

Gitea Source Code

Author

go-gitea

Description

Git with a cup of tea! Painless self-hosted all-in-one software development service, including Git hosting, code review, team collaboration, package registry and CI/CD

#bitbucket#cicd#devops#docker-registry-v2#git#git-gui#git-lfs#git-server#gitea#github#github-actions#gitlab#go#golang#hacktoberfest#maven-server#npm-registry#self-hosted#typescript#vue

Homepage

https://gitea.com

License

MIT

Created

01 Nov 16

Last Updated

29 Jul 26

Latest version

v1.28.0-dev

Primary Language

Go

Size

346,634 KB

Stars

57,093

Forks

6,952

Watchers

57,093

Language Usage

Language Usage

Star History

Star History

Top Contributors

Recent Commits

  • GiteaBot (29 Jul 26)

    [skip ci] Updated translations via Crowdin

  • wxiaoguang (28 Jul 26)

    chore: still keep ctx in git.Repository struct for cat-file batch command (#38684) Unfortunately, we can't completely remove the ctx from git.Repository, because the CatFileBatch still heavily depends on a parent context. If we remove the Repository ctx, the CatFileBatch will become a mess and create a lot of unnecessary git processes. http://localhost:3000/-/admin/monitor/perftrace * Before: open a repo home, dozens of git processes (duplicate cat-file) * After: only a few (no duplicate cat-file)

  • Pascal Zimmermann (28 Jul 26)

    feat: Add support for dynamic matrix evaluation in Gitea Actions workflows (#36564) Adds dynamic matrix evaluation to Gitea Actions: a job's `strategy.matrix` can be built from the outputs of the jobs it needs. ```yaml jobs: generate: runs-on: ubuntu-latest outputs: matrix: ${{ steps.set.outputs.result }} steps: - id: set run: echo "result=[1,2,3]" >> $GITHUB_OUTPUT build: needs: [generate] runs-on: ubuntu-latest strategy: matrix: version: ${{ fromJson(needs.generate.outputs.matrix) }} steps: - run: echo "building ${{ matrix.version }}" ``` Such a matrix cannot be expanded at planning time, so the job is planned as a single placeholder and expanded by the job emitter once its needs finish. Each combination is then gated by `if:` and concurrency as usual. - A matrix that resolves to no combination fails the job, as on GitHub. - Expansion is capped at `MaxJobNumPerRun`. - Workflows without a needs-dependent matrix are unaffected. Fixes https://github.com/go-gitea/gitea/issues/25179 --------- Signed-off-by: Pascal Zimmermann <[email protected]> Signed-off-by: ZPascal <[email protected]> Co-authored-by: Claude <[email protected]> Co-authored-by: silverwind <[email protected]> Co-authored-by: Claude (Opus 4.8) <[email protected]> Co-authored-by: bircni <[email protected]> Co-authored-by: Zettat123 <[email protected]>

  • water (28 Jul 26)

    fix: Alpine registry APKINDEX.tar.gz returns 405 for HEAD requests [fj4WqyCCw3C5ShR1RfB7MoBPTpkRrBFYP1uT35g3MvT] (#38686) ### Description Fixes #38676 The Alpine package registry registers for only, so a request returns . Clients that probe the index with before fetching it (like and other -based tools) fail outright. **Fix:** Change to for the APKINDEX.tar.gz route, matching the pattern already used by the i386 registry a few lines below. ### Related issue Closes #38676 Co-authored-by: waterWang <[email protected]>

  • wxiaoguang (28 Jul 26)

    fix: repo home page 500 due to the timeout of "get last commit info" (#38678) Regression of the ctx removal from "git.Repository" struct (the old code was already wrong and can still cause 500, the "ctx removal" just makes the problem easier to reproduce). Merge duplicate code. Reviewd by codex: no actionable findings.

  • GiteaBot (28 Jul 26)

    [skip ci] Updated translations via Crowdin

  • bircni (27 Jul 26)

    docs: Update Changelog for release v1.27.1 (#38670) Add changelog for version 1.27.1 with security, API, enhancements, bug fixes, build updates, and miscellaneous changes. --------- Signed-off-by: bircni <[email protected]> Co-authored-by: silverwind <[email protected]>

  • Shudhanshu Singh (27 Jul 26)

    refactor(git): clarify GetBranch behavior to make it only gets an existing branch (#38662) `GetBranch` silently returned soft-deleted branches, contradicting `IsBranchExist` and forcing callers to manually check `branch.IsDeleted` everywhere. Refactored it to `GetBranchExisting` to have a clear behavior: it only returns the existing branch. --------- Signed-off-by: Sudhanshu Singh <[email protected]> Co-authored-by: wxiaoguang <[email protected]>

  • Giteabot (27 Jul 26)

    chore(deps): update dependencies (#38660) Signed-off-by: silverwind <[email protected]> Co-authored-by: silverwind <[email protected]>

  • Pascal Zimmermann (27 Jul 26)

    feat: Add max-parallel Support for Gitea Actions (#36357) Add support for `strategy.max-parallel` on Gitea Actions matrix jobs. **How it works** Jobs over the limit are inserted as `Blocked` instead of `Waiting`, so runners never see them. When a job finishes, the job-status resolver promotes one `Blocked` job per freed slot, in job order. Slots are counted per `JobID` and scoped by reusable-workflow caller. A `Cancelling` job still owns its runner, so it keeps its slot. The cap is applied wherever a job can become `Waiting`: initial insert, rerun, approval, and resolver promotion. Best effort, not a hard invariant: two concurrent emitter passes can each promote into the last slot, overshooting by one. It does not compound, since every later pass recounts. **Parsing** Any YAML number, cast to an int as GitHub does (`1.5` → 1). `0` or negative means unlimited. Expressions (`${{ ... }}`) are not evaluated yet and fall back to unlimited. **Migration** Adds the `max_parallel` column on `action_run_job`. No index or constraint changes. **Compatibility** Existing rows default to `0`, so behaviour is unchanged. No runner changes needed: the runner protocol is untouched, and since the server splits the matrix each runner still receives a single job. Closes https://github.com/go-gitea/gitea/issues/35561 Signed-off-by: Pascal Zimmermann <[email protected]> Signed-off-by: ZPascal <[email protected]> Signed-off-by: wxiaoguang <[email protected]> Co-authored-by: silverwind <[email protected]> Co-authored-by: wxiaoguang <[email protected]> Co-authored-by: Zettat123 <[email protected]>

  • Harsh Satyajit Thakur (27 Jul 26)

    fix: skip OIDC end-session after password login for OAuth2 users (#38439) Fixes #38209 OAuth2-linked accounts that sign in via the password form were still redirected to the provider end_session_endpoint on logout because the redirect was keyed off account LoginType. Store the session sign-in method (password vs oauth2) and only use RP-initiated OIDC logout when this session was authenticated via OAuth2. Sessions without the new key keep the previous LoginType behavior. --------- Co-authored-by: wxiaoguang <[email protected]>

  • Lunny Xiao (27 Jul 26)

    ci: set AWS_REGION for Cloudflare R2 upload steps (#38658) The `configure-aws-credentials` step earlier in the same job exports **both** `AWS_DEFAULT_REGION` and `AWS_REGION` into `$GITHUB_ENV` (verified in `exportRegion()` at the pinned SHA `517a711`), so `secrets.AWS_REGION` (the real AWS region) stays set for every later step in that job. The AWS CLI v2 region resolution order is `--region` > `AWS_REGION` > `AWS_DEFAULT_REGION`. The R2 step only set `AWS_DEFAULT_REGION: auto`, so the leaked `AWS_REGION` won and R2 rejected it, since R2 only accepts `wnam`, `enam`, `weur`, `eeur`, `apac`, `oc` or `auto`. The failure log shows both `AWS_DEFAULT_REGION: auto` and `AWS_REGION: ***` in the step env, which confirms the leak. ### Fix Set `AWS_REGION: auto` explicitly in the R2 upload step env of all three release workflows. Step-level `env:` is applied after `GITHUB_ENV`-derived variables, so this reliably overrides the leaked value. No other variable leaks from `configure-aws-credentials` matter here: `AWS_SESSION_TOKEN` is only exported when a session token exists, and these workflows use static access keys without `role-to-assume`; `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` are already overridden in the R2 step. Consolidating the three duplicated upload steps into a composite action remains a follow-up, as noted in #38635.

  • wxiaoguang (27 Jul 26)

    fix: make Actions log parser support multiple line message encoding (#38659) fix #38652 UI part (`.log-msg`) uses "white-space: break-spaces;" so the new line can be correctly rendered. --------- Signed-off-by: silverwind <[email protected]> Co-authored-by: silverwind <[email protected]>

  • silverwind (27 Jul 26)

    test(pubsub): stop racing the Redis SUBSCRIBE ack (#38661) `RedisBroker.Subscribe` returns before the server acks `SUBSCRIBE`, so a publish right after it can be dropped, making `TestRedisBroker/CrossBroker` fail intermittently on loaded CI runners ([example](https://github.com/go-gitea/gitea/actions/runs/30257188479/job/89948425118)). Each scenario now uses its own topic and waits for `PUBSUB NUMSUB` before publishing. `MemoryBroker` registers synchronously and skips the wait.

  • silverwind (27 Jul 26)

    chore(ci): fix renovate custom manager regex (#38656) Make this regex compatible with https://github.com/uhop/node-re2 used by renovate and which does not support lookahead. `renovate-config-validator` which I had used earlier fails to run `re2` on node 26 because of missing prebuilt binary and falls back to JS regex which does support lookahead, giving incorrect validation results. Upstream bug report: https://github.com/renovatebot/renovate/discussions/44873 Fixes: https://github.com/go-gitea/gitea/issues/38648

  • mohammad rahimi (27 Jul 26)

    feat: Replace SSE with WebSocket for UI notifications (#36965) * Closes #36942 * Fixes #19265 Replaces the SSE-based push channel (`/user/events`) with a WebSocket endpoint (`/-/ws`). ### What changes - **New `/-/ws` endpoint** (authenticated). One WebSocket per origin, shared across tabs via a single `SharedWorker`. - **Pubsub broker** (`services/pubsub`) for fan-out by topic, behind a `Broker` interface. `MemoryBroker` is the default (single process); a Redis backend is available for multi-process setups, configured via `[websocket].PUBSUB_TYPE` / `PUBSUB_CONN_STR`. The internal Gitea queue was not usable here because it has FIFO/single-consumer semantics. - **Push-only event production.** Events are emitted by write-triggered notifiers — `NotificationCountChange`, `PublishStopwatchesForUser`, and the logout publisher — wired into the existing `notify.Notifier` interface. No server-side pollers. - **Typed pub/sub on the client.** `web_src/js/modules/worker.ts` is a singleton transport; features subscribe per event type via `onUserEvent('notification-count', cb)` instead of branching on `event.data.type`. - **Wire contract** (`UserEventType` union) is shared between the worker and consumers via `web_src/js/types.ts`, kept in sync with `services/websocket/events.go`. - **Client-side periodic polling fallback** kicks in only when the WebSocket cannot be established (e.g. proxy blocks WS, browser lacks module-SharedWorker support). ### What's removed - `modules/eventsource` (SSE manager, run loop, messenger). - `/user/events` route and `tests/integration/eventsource_test.go`. - All server-side polling for stopwatches and notification counts. ### Stopwatch multi-tab fix The navbar stopwatch icon was previously rendered conditionally on `{{if $activeStopwatch}}`, so tabs loaded before the timer started had no DOM element to update. The icon and popup are now always rendered (toggled with `tw-hidden`), and the start/stop/cancel handlers POST silently so all open tabs reflect the change in real time. ### Deployment note WebSocket needs the upgrade headers to pass through a reverse proxy, e.g. for nginx: ```nginx proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; ``` Without them the WebSocket cannot be established, and after 3 consecutive failed opens the shared worker signals `push-unavailable`: the notification count and stopwatch fall back to periodic polling on the existing `[ui.notification]` timeouts. Real-time push is lost, the features keep working. The reverse-proxy docs need the same note (see the `docs-update-needed` label). --------- Co-authored-by: silverwind <[email protected]> Co-authored-by: wxiaoguang <[email protected]> Co-authored-by: Epid <[email protected]>

  • Shudhanshu Singh (27 Jul 26)

    fix(actions): use base branch ref for pull_request_target context (#38636) Fixes a bug in Actions context generation for `pull_request_target` workflows where `github.ref` / `gitea.ref` was incorrectly populated with `refs/heads/owner:branch` instead of `refs/heads/branch`. ### Problem Statement In `services/actions/context.go`, when constructing the `ref` string for `pull_request_target` events: ```go ref = git.BranchPrefix + pullPayload.PullRequest.Base.Name Signed-off-by: Sudhanshu Singh <[email protected]> Signed-off-by: wxiaoguang <[email protected]> Co-authored-by: wxiaoguang <[email protected]>

  • Zettat123 (27 Jul 26)

    fix(actions): skip already-approved runs in `ApproveRuns` (#38653) The handler of `/actions/runs/{run}/approve` doesn't check if the run is already approved. If a run is re-approved, its jobs' status will be reset to `StatusWaiting`, causing incorrect job status.

  • roman.s (27 Jul 26)

    fix(api): accept fully-qualified refs in contents API (#38650) `GET/POST` repository contents endpoints resolve the `ref` query parameter through `ResolveRefCommit`, which previously only accepted short branch/tag names or commit IDs. Clients that pass fully-qualified Git refs (GitHub-compatible), e.g. `ref=refs%2Fheads%2Fmain` or `ref=refs%2Ftags%2Fv1.0`, received 404 "object does not exist". This change accepts fully-qualified **`refs/heads/*`** and **`refs/tags/*`** only, then falls back to the existing short-name and SHA logic. Other `refs/*` prefixes (e.g. `refs/pull/`, `refs/for/`) are rejected. Fixes #38197 --------- Co-authored-by: roman s <[email protected]> Co-authored-by: wxiaoguang <[email protected]>

  • GiteaBot (27 Jul 26)

    [skip ci] Updated translations via Crowdin

  • Lunny Xiao (27 Jul 26)

    chore(build): upload release to Cloudflare R2 (#38635) The download site’s bandwidth costs are growing rapidly, while Cloudflare R2 does not charge egress fees. Therefore, we would like to migrate the download site from S3 to R2. To ensure a smooth transition, we will keep the existing S3 upload process temporarily and remove it after the migration is complete. The upload steps are currently duplicated in three places. They could be consolidated into a composite action in a separate PR.

  • silverwind (26 Jul 26)

    ci: match `# renovate:` markers that trail the value (#38640) The preset we extended only matches a `# renovate:` comment on the line above the `_VERSION` assignment. Ours trails the value, like the ones in the `Makefile`, so it never matched and the pin has sat at `43.141.5` since https://github.com/go-gitea/gitea/pull/37050. Co-authored-by: Claude (Opus 5) <[email protected]>

  • wxiaoguang (26 Jul 26)

    feat: admin impersonates a user (#38614) * fix #3631 * fix #21599 by the way, refactored the "profile avatar card" to simplify the code.

  • wxiaoguang (26 Jul 26)

    refactor: git patch apply (#38637) Merge duplicate code and add a unit test There are already integration test cases in `TestEditor` -> `WebGitCommitEmail` for these two endpoints.

  • wxiaoguang (26 Jul 26)

    fix: orgmode render include path (#38642) Co-authored-by: TheFox0x7 <[email protected]>

  • bircni (26 Jul 26)

    fix(actions): cancel tasks immediately when the runner stopped reporting (#38616) Fixes jobs that get stuck in `cancelling` after Gitea is restarted while a job is running. Reproduction: 1. Run a job with `sleep 100` 2. Stop Gitea and wait 120s (> 100s) 3. Start Gitea — the job is still `running`; cancel it, and it stays in `cancelling` ## Cause A cancellation is only ever delivered to a runner as the *response* to its `UpdateTask` RPC. A runner that has already given up on the task — it crashed, or it failed to report the final state while Gitea was unreachable — never calls `UpdateTask` again, so it never learns about the cancellation. The task then sits in `cancelling` until `stop_zombie_tasks` reaps it, which needs `ZOMBIE_TASK_TIMEOUT` (10m) of silence and only runs every 5 minutes. Cancelling actually made this worse. xorm rewrites the `updated` column on every `UPDATE`, even when `Cols()` restricts the update to `status`, so persisting the `cancelling` status reset the zombie clock. Pressing cancel pushed the cleanup a full `ZOMBIE_TASK_TIMEOUT` into the future instead of bringing it forward. ## Change `StopTask` now skips the `cancelling` handshake when the task has had no state report from its runner for longer than `TaskReportTimeout` (1 minute) and cancels it directly. This joins the two existing fallbacks — runner deleted, and runner without cancelling support — so every cancel path (web UI, API, concurrency, rerun) is covered. Runners report the state of a running task every few seconds, so a minute of silence means the runner is gone. The value is a constant rather than a setting because it only decides whether the runner is still reachable, not whether a task should be killed — `ZOMBIE_TASK_TIMEOUT` still owns that. ### Tradeoff If a runner is alive but has been silent for over a minute and is cancelled in that window, it skips the graceful post-step cleanup added in #37275. No work is lost: the runner still learns the outcome on its next report, because `UpdateTask` returns the task status as the result and the runner stops there. That is the behaviour that existed before #37275. --------- Co-authored-by: Zettat123 <[email protected]> Co-authored-by: silverwind <[email protected]>

  • Elisei Roca (26 Jul 26)

    fix(issues): fix label bulk-load key and reduce log noise in LoadLabel (#38632) CommentList.loadLabels keyed the result map by label.ID but looked up by comment.ID, so every label event fell back to individual DB queries. This caused log spam for any comment where the label was deleted, since ToTimelineComment calls LoadLabel unconditionally for all comment types including those with LabelID=0. Fix the map key, skip the query when LabelID=0, demote the now rarely triggered orphaned-label log to Debug, and fix a typo ("Commit" -> "Comment") in that message. --------- Signed-off-by: wxiaoguang <[email protected]> Co-authored-by: wxiaoguang <[email protected]>

  • silverwind (26 Jul 26)

    fix(ui): avoid layout shifts in `overflow-menu` and repo filter (#37818) Eliminate two layout shifts in the menu, one related to non-existant label on page load and one to `0` value rendering. Signed-off-by: silverwind <[email protected]> Co-authored-by: Claude (Opus 4.7) <[email protected]> Co-authored-by: bircni <[email protected]>

  • silverwind (26 Jul 26)

    chore: generate codemirror languages from `linguist-languages` package (#38624) Replace the previous main-branch fetch with data from npm package [`linguist-languages`](https://github.com/ikatyang-collab/linguist-languages) and only run generate targets when actually needed. The removed `fileFilters` were leftovers from the nolyfill removal.

  • GiteaBot (26 Jul 26)

    [skip ci] Updated translations via Crowdin

Gitea Security

6.8/10

Repo Security Summary

Updated 13 Jul 26 Fuzz tested

  • Code-Review 9/10
  • Maintained 10/10
  • Security-Policy 10/10
  • Dangerous-Workflow 0/10
  • Token-Permissions 6/10
  • License 10/10
  • CII-Best-Practices 5/10
  • Binary-Artifacts 10/10
  • Fuzzing 10/10
  • Pinned-Dependencies 8/10
  • Packaging 10/10
  • Branch-Protection 3/10
  • Signed-Releases 8/10
  • SAST 1/10

Security Advisories (74)

  • medium Patched

    CVE-2026-58438 Cross-repository IDOR in issue-dependency removal lets an attacker tamper with and comment on private repos they cannot access

  • high Patched

    CVE-2026-58433 Team-repository linking endpoint bypasses the RepoAdminChangeTeamAccess organization setting

  • medium Patched CVSS 6.8

    CVE-2026-58440 Webhooks created by a collaborator keep firing after their repo access is revoked → ongoing real-time exfiltration of private repo content (incomplete revocation cleanup in `DeleteCollaboration`)

  • medium Patched CVSS 4.3

    CVE-2026-59766 CVE-2026-20800 sibling endpoints not covered: revoked user still reads private repo objects via `/api/v1/user/starred` and private issue titles via `/api/v1/user/times`

  • medium Patched CVSS 6.3

    CVE-2026-58441 SSRF in restore-repo via unsanitized pull_request.yml Head.CloneURL

  • medium Patched CVSS 6.5

    CVE-2026-58442 Repository migration SSRF via multi-answer DNS allow-list bypass

  • critical Patched CVSS 9.6

    CVE-2026-58443 Public-only repository tokens can update private PR head branches

  • medium Patched CVSS 4.3

    CVE-2026-58444 Personal access token scope enforcement bypass on the repository home page (`GET /{owner}/{repo}`) discloses private repository contents

  • medium Patched

    CVE-2026-58427 Private org member list leaked via /members API endpoint — incomplete fix for PR #38145

  • low Patched CVSS 2.7

    CVE-2026-58445 Cross-repository label-ID enumeration oracle via unscoped DeleteIssueLabel API

  • medium Patched CVSS 6.5

    CVE-2026-42931 Denial of Service via Unbounded io.ReadAll in NPM Package Tag Endpoint

  • medium Patched CVSS 6.3

    CVE-2026-58416 Fork-PR Actions task can read a third private repository via the collaborative-owner branch (missing fork-PR guard)

  • medium Patched CVSS 4.3

    CVE-2026-50105 RSS/Atom feed handlers bypass API-token scope & public-only confinement (incomplete fix of #37698)

  • low Patched

    CVE-2026-58417 REST API exposes organization membership of private organizations to public

  • high Patched CVSS 7.5

    CVE-2026-54481 Internal API HTTP client hardcodes InsecureSkipVerify:true with no config override (CWE-295)

  • medium Patched CVSS 4.3

    CVE-2026-27761 API access token scope enforcement bypass on repository RSS/Atom feed endpoints leaks private repository commit data

  • medium Patched CVSS 6.5

    CVE-2026-58418 SSRF via HTTP Redirect in Repository Migration

  • low Patched

    CVE-2026-58434 Private Repository Metadata Remains Accessible After Access Revocation

  • high Patched

    CVE-2026-24451 Fork Synchronization Continues After Parent Repository Changes from Public to Private

  • medium Patched

    CVE-2026-55982 OIDC userinfo Endpoint Returns Identity Claims Without Enforcing API Token Scopes

  • medium Patched

    CVE-2026-25038 Unauthorized Access to Labels of Private Organizations

  • low Patched

    CVE-2026-58419 Notification API leaks private issue metadata after access revocation

  • high Patched CVSS 7.1

    CVE-2026-20779 TOTP TOCTOU race on web 2FA paths + missing replay check on Basic-Auth `X-Gitea-OTP` surface

  • low Patched CVSS 2.7

    CVE-2026-55984 Null Pointer Dereference in AddTime API Causes Authenticated Denial of Service

  • medium Patched CVSS 5.4

    CVE-2026-55986 Email Management API Bypasses ManageCredentials Feature Restrictions

  • high Patched

    GHSA-rjvx-x5h2-6px5 API Fork Endpoint Authorization Bypass Allows Organization Members to Bypass Repository Creation Restrictions

  • medium Patched

    CVE-2026-58420 Local File Inclusion via file:// URI in Migration Restore

  • high Patched

    CVE-2026-27775 Cached Per-Branch Permission Check in Pre-Receive Hook Allows Full Repository Write

  • high Patched

    CVE-2026-58435 Gitea LFS Deploy-Key Privilege Escalation

  • high Patched CVSS 8.1

    CVE-2026-55987 OAuth2 sign-in reactivates an administrator-deactivated account on auth sources without refresh tokens (incomplete fix of #38009)

  • medium Patched CVSS 4.3

    CVE-2026-56443 Token public-only scope bypassed on Limited-visibility owners (Repository + Package categories) — residual after CVE-2026-25714 / PR #37118

  • high Patched CVSS 7.1

    CVE-2026-28740 Git LFS object reuse allows non-Code access to authorize private source objects

  • medium Patched

    CVE-2026-56654 Privilege Escalation via Access Token Scope Escalation in API

  • medium Patched CVSS 4.3

    CVE-2026-58431 Public-only API token restriction is not enforced on team API routes

  • medium Patched

    CVE-2026-56657 Gitea SSH Key Parser Denial of Service

  • medium Patched

    CVE-2026-58421 Unauthenticated ReDoS via CODEOWNERS pattern matching allows denial of service

  • low Patched

    CVE-2026-56750 Gitea Remember-Me Token Theft Not Invalidating Attacker Session

  • medium Patched

    CVE-2026-56755 Denial of Service (CPU & Memory Exhaustion) via O(N^2) String Concatenation in Debian Package Upload

  • medium Patched CVSS 5.9

    CVE-2026-57886 Cross-repository issue/comment attachment re-linking can expose private attachment content

  • high Patched

    CVE-2026-58422 Improper authorization on OAuth sign-in callback silently re-enables administrator-disabled accounts

  • critical Patched CVSS 9.8

    CVE-2026-20896 Gitea Docker image: `REVERSE_PROXY_TRUSTED_PROXIES = *` default lets any source IP impersonate any user via `X-WEBAUTH-USER`

  • high Patched CVSS 8.5

    CVE-2026-57894 Repository Migration Follows Git HTTP Redirects After URL Allow/Block Validation, Enabling Internal Git Repository Exfiltration

  • high Patched CVSS 7.7

    CVE-2026-58423 LFS authentication bypass via malformed SSH sub-verb allows unauthorized read access to private repositories

  • high Patched

    CVE-2026-58436 ParseAcceptLanguage quadratic-time DoS via Locale middleware on unauthenticated requests

  • medium Patched CVSS 6.5

    CVE-2026-57897 Cross-Repo Information Disclosure via Org-Level Actions Run/Job APIs

  • high Patched

    CVE-2026-58314 Two SSRF findings in Gitea 1.26.2

  • high Patched CVSS 8.9

    CVE-2026-58424 Permanent Fork PR Workflow Approval Gate Bypass

  • medium Patched CVSS 4.3

    CVE-2026-58425 OAuth token introspection returns metadata of tokens issued to other clients (RFC 7662 section 4 violation)

  • critical Patched CVSS 9.6

    CVE-2026-22874 Incomplete SSRF Protection in Webhook and Migration Allow-list Default Filter

  • medium Patched CVSS 5.3

    CVE-2026-58507 Private Repository Existence Disclosure via go-get Meta Endpoint

  • high Patched CVSS 7.1

    CVE-2026-58437 Repository Visibility Manipulation via Git Push Options

  • medium Patched CVSS 4.3

    CVE-2026-27783 Missing repository-unit authorization on issue-template API endpoints

  • medium Patched

    CVE-2026-58508 Two SSRF vulnerabilities in Gitea migration/mirror (DNS rebinding + missing re-validation)

  • medium Patched

    CVE-2026-20706 Token scope bypass on web archive download endpoint (variant of PR #37698)

  • medium Patched

    CVE-2026-58510 GHSA-8fwc-qjw5-rvgp ClearRepoWatches fix not applied to API EditRepo path — sister code path retains stale watches on public->private

  • medium Patched CVSS 6.5

    CVE-2026-58428 Release attachment extension allowlist bypass via web release edit form (variant of CVE-2025-68939)

  • high Patched CVSS 8.1

    CVE-2026-24791 Public-only tokens bypass private-resource restrictions on `/api/v1/user` self routes

  • medium Patched CVSS 5.9

    CVE-2026-58432 Missing Authorization and Authorization Bypass Through User-Controlled Key and Incorrect Permission Assignment for Critical Resource and Exposure of Sensitive Information to an Unauthorized Actor in code.gitea.io/gitea

  • critical Patched CVSS 9.6

    CVE-2026-58426 Gitea Actions Artifacts V4 signed URL HMAC ambiguity allows cross-repository artifact read and cross-task upload-state write

  • low Patched CVSS 2.7

    CVE-2026-58511 Webhook Authorization Header Returned in Plaintext via API

  • high Patched CVSS 8.1

    CVE-2026-28744 Git Smart HTTP Skips Repository Token Scopes for Bearer Tokens

  • medium Patched

    CVE-2026-59763 Unbounded Arch package file metadata can cause resource amplification in Gitea package uploads

  • high Patched CVSS 8.2

    CVE-2026-27771 Critical Vulnerability - Already emailed

  • low Patched CVSS 3.1

    CVE-2026-23603 Blind SSRF in OAuth2 avatar synchronization via unvalidated OIDC picture claim

  • high Patched CVSS 8.1

    CVE-2026-28699 OAuth2 access token scope enforcement bypass via HTTP Basic authentication

  • medium Patched CVSS 4.9

    CVE-2026-58429 Public-Only Personal access tokens scope bypass in Organization and Permission Endpoints

  • high Patched CVSS 8.5

    CVE-2026-26231 Authorization Bypass via "Allow edits from maintainers" allows unauthorized commits to any readable repo

  • high Patched CVSS 8.1

    CVE-2026-58439 Branch Protection Bypass via PR Retargeting Preserves Stale `official` Approval Flag

  • high Patched CVSS 8.7

    CVE-2026-28737 Stored XSS via glTF `extensionsRequired` in Gitea 3D File Viewer

  • medium Patched CVSS 4.3

    CVE-2026-25714 Incomplete CVE-2025-68941 fix: /user/orgs missing checkTokenPublicOnly + switch-case logic flaw

  • high Patched

    CVE-2026-59765 SSRF via Migration Asset Downloads Bypasses hostmatcher — Reads Internal Files and Cloud Metadata

  • high Patched CVSS 8.1

    CVE-2026-22555 API Fork Missing CanCreateOrgRepo Check Allows Org Secret Exfiltration

  • medium Patched

    CVE-2026-25779 Open Redirect via redirect_to in Gitea

  • high Patched

    GHSA-3m6q-h5gj-7mrw Unsecure default ssh settings

Gitea Website

Website

Redirects

Redirects to https://about.gitea.com/

Security Checks

2 security checks failed (63 passed)

  • Empty Page Content
  • External Redirect Detected

Server Details

  • IP Address 99.84.132.115
  • Hostname server-99-84-132-115.atl59.r.cloudfront.net
  • Location Atlanta, Georgia, United States of America, NA
  • ISP Amazon.com Inc.
  • ASN AS16509

Associated Countries

  • US US

Safety Score

Website marked as safe

100%

Blacklist Check

gitea.io was found on 0 blacklists

  • AntiSocial Blacklist
  • Artists Against 419
  • Badbitcoin
  • Bambenek Consulting
  • CERT Polska
  • CoinBlockerLists
  • CRDF
  • CryptoScamDB
  • EtherAddressLookup
  • EtherScamDB
  • Fake Website Buster
  • MetaMask EthPhishing
  • NABP Not Recommended Sites
  • OpenPhish
  • PetScams
  • PhishFeed
  • PhishFort
  • Phishing.Database
  • PhishStats
  • PhishTank
  • Phishunt
  • RPiList Not Serious
  • Scam.Directory
  • SecureReload Phishing List
  • Spam404
  • StopGunScams
  • Suspicious Hosting IP
  • ThreatFox
  • ThreatLog
  • TweetFeed
  • URLhaus
  • ViriBack C2 Tracker

Website Preview

Website preview

Gitea Docker

Container Info

gitea

Git with a cup of tea! Painless self-hosted all-in-one software development service, including Git hosting, code review, team collaboration, package registry and CI/CD.

#Web#Tools gitea/gitea:latest

Run Command

docker run -d \
  -p 3000:3000/tcp \
  -p 222:22/tcp \
  -e PUID=${PUID} \
  -e PGID=${PGID} \
  -v /portainer/Files/AppData/Config/Gitea:/data \
  -v  /etc/timezone:/etc/timezone:ro \
  -v /etc/localtime:/etc/localtime:ro \
  --restart=unless-stopped \
  gitea/gitea:latest

Compose File

version: 3.8
services:
  gitea:
    image: "gitea/gitea:latest"
    ports:
      - "3000:3000/tcp"
      - "222:22/tcp"
    environment:
      PUID: 1000
      PGID: 100
    volumes:
      - "/portainer/Files/AppData/Config/Gitea:/data"
      - " /etc/timezone:/etc/timezone:ro"
      - "/etc/localtime:/etc/localtime:ro"
    restart: unless-stopped

Environment Variables

  • Var Name Default
  • PUID 1000
  • PGID 100

Port List

  • 3000:3000/tcp
  • 222:22/tcp

Volume Mounting

  • /portainer/Files/AppData/Config/Gitea /data
  • /etc/timezone /etc/timezone:ro
  • /etc/localtime /etc/localtime:ro

Gitea Reviews

More Code Hosting

About the Data: Gitea

Change History

API

You can access Gitea's data programmatically via our API. Simply make a GET request to:

https://api.awesome-privacy.xyz/v1/services/gitea

The REST API is free, no-auth and CORS-enabled. To learn more, view the API Docs or read the API Usage Guide.

Share Gitea

Help your friends compare Code Hosting, and pick privacy-respecting software and services.
Share Gitea and Awesome Privacy with your network!

View Code Hosting (5)