gitforge/modules
Mathieu Fenniak c52ecd2258 fix: don't clobber authorized_keys file during installation (#10948)
This PR makes two changes.

**First**, it removes the ability for Forgejo to rewrite ssh authorized_keys during startup.  Forgejo previously checked if the application path or config file path had changed from that which is recorded in its database.  If either has changed, it would rewrite the SSH `authorized_keys` file, as those paths are embedded into that file.  The problem is that if a new installation runs the app and goes through a standard init procedure, it will clobber ~/.ssh/authorized_keys which is a disruptive mistake.

Instead, Forgejo will proceed to ssh initialization, and due to the change in #10010 the incorrect application path or config file path will result in a fatal server error that the administrator must resolve.  Disabling SSH is added as a plausible option for how to resolve that fatal error.

**Second**, the interactive install UI has been modified to detect this error before the installation proceeds.  If a user is attempting to install Forgejo with SSH, and they have an existing `~/.ssh/authorized_keys` file with keys present in it, the installation will fail with an error advising them to use a separate Forgejo user or to disable SSH.  (More options are possible to fix this problem, but these are the obvious solutions.)

![image](/attachments/69ef979e-e949-4306-a7e5-2adfb7214199)

Fixes #10942.

Manually tested.  Without the install process change, Forgejo behaves like this:
- Configure a typical end-user `~/.ssh/authorized_keys` file with normal keys
- Run through a Forgejo initialization process on a new database; run with SQLite, add a new administrator account during the init process.
- After initialization, Forgejo will restart and encounter a fatal error:
```
2026/01/20 10:11:24 routers/init.go:84:syncAppConfForGit() [I] AppPath changed from '' to '/home/mfenniak/Dev/forgejo/forgejo'
2026/01/20 10:11:24 routers/init.go:89:syncAppConfForGit() [I] CustomConf changed from '' to '/home/mfenniak/Dev/forgejo/custom/conf/app.ini'
2026/01/20 10:11:24 routers/init.go:95:syncAppConfForGit() [I] re-sync repository hooks ...
2026/01/20 10:11:24 ...er/issues/indexer.go:155:func2() [I] Issue Indexer Initialization took 9.858336ms
2026/01/20 10:11:24 modules/ssh/init.go:86:Init() [F] An unexpected ssh public key was discovered. Forgejo will shutdown to require this to be fixed. Fix by either:
Option 1: Delete the file /home/mfenniak/.ssh/authorized_keys, and Forgejo will recreate it with only expected ssh public keys.
Option 2: Permit unexpected keys by setting [server].SSH_ALLOW_UNEXPECTED_AUTHORIZED_KEYS=true in Forgejo's config file.
Option 3: If unused, disable SSH support by setting [server].DISABLE_SSH=true in Forgejo's config file.
        Unexpected key on line 1 of /home/mfenniak/.ssh/authorized_keys
        Unexpected key on line 2 of /home/mfenniak/.ssh/authorized_keys
        Unexpected key on line 3 of /home/mfenniak/.ssh/authorized_keys
        Unexpected key on line 4 of /home/mfenniak/.ssh/authorized_keys
```

With the install process change, the above error screenshot occurs instead.

## Checklist

The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org).

### Tests

- I added test coverage for Go changes...
  - [ ] in their respective `*_test.go` for unit tests.
  - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server.
- I added test coverage for JavaScript changes...
  - [ ] in `web_src/js/*.test.js` if it can be unit tested.
  - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)).

### Documentation

- [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change.
- [x] I did not document these changes and I do not expect someone else to do it.

### Release notes

- [x] This change will be noticed by a Forgejo user or admin (feature, bug fix, performance, etc.). I suggest to include a release note for this change.
- [ ] This change is not visible to a Forgejo user or admin (refactor, dependency upgrade, etc.). I think there is no need to add a release note for this change.

*The decision if the pull request will be shown in the release notes is up to the mergers / release team.*

The content of the `release-notes/<pull request number>.md` file will serve as the basis for the release notes. If the file does not exist, the title of the pull request will be used instead.

<!--start release-notes-assistant-->

## Release notes
<!--URL:https://codeberg.org/forgejo/forgejo-->
- Bug fixes
  - [PR](https://codeberg.org/forgejo/forgejo/pulls/10948): <!--number 10948 --><!--line 0 --><!--description ZG9uJ3QgY2xvYmJlciBhdXRob3JpemVkX2tleXMgZmlsZSBkdXJpbmcgaW5zdGFsbGF0aW9u-->don't clobber authorized_keys file during installation<!--description-->
<!--end release-notes-assistant-->

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10948
Reviewed-by: 0ko <0ko@noreply.codeberg.org>
Co-authored-by: Mathieu Fenniak <mathieu@fenniak.net>
Co-committed-by: Mathieu Fenniak <mathieu@fenniak.net>
2026-01-23 18:38:09 +01:00
..
actions feat(actions): make GITHUB_WORKFLOW_REF available (#10276) 2025-12-17 23:15:26 +01:00
activitypub chore: move all test blank imports in a single package (#10662) 2026-01-02 05:32:32 +01:00
analyze
assetfs feat: optimization: use fs.ReadFile (#10987) 2026-01-22 16:26:18 +01:00
auth feat: allow sync quota groups with oauth2 auth source (#8554) 2025-12-01 14:12:00 +01:00
avatar feat: strip EXIF information from uploaded avatars (#9638) 2025-10-13 23:16:17 +02:00
base feat(ui): dedicated icon for CITATION file (#10873) 2026-01-17 10:10:56 +01:00
cache fix: prevent Remove(key)...Get*(key) from returning a value computed before the Remove(key) 2025-11-16 08:53:37 -07:00
card
charset feat: update ambigious characters (#7988) 2025-05-29 10:00:12 +02:00
container chore: add new functions to container.Set 2025-10-14 14:40:49 -06:00
csv
emoji chore(cleanup): replaces unnecessary calls to formatting functions by non-formatting equivalents (#7994) 2025-05-29 17:34:29 +02:00
eventsource
forgefed log instrumentation & test package (#10371) 2025-12-09 15:37:50 +01:00
generate chore: unify the usage of CryptoRandomString (#10110) 2025-11-15 13:24:53 +01:00
git fix: internal server error on a large .gitmodules (#10744) 2026-01-10 10:44:59 +01:00
gitrepo Update module github.com/golangci/golangci-lint/v2/cmd/golangci-lint to v2.6.1 (forgejo) (#10053) 2025-11-11 07:04:35 +01:00
graceful feat: enable H2C for the HTTP server (#8861) 2025-08-16 21:00:20 +02:00
hcaptcha
highlight
hostmatcher
html
httpcache
httplib feat: detect Interlisp sources as text (#8377) 2025-07-02 07:38:46 +02:00
indexer chore: move all test blank imports in a single package (#10662) 2026-01-02 05:32:32 +01:00
issue/template chore: replace gopkg.in/yaml.v3 with go.yaml.in/yaml/v3 (#8956) 2025-08-20 15:31:12 +02:00
json
jwtx fix typo: say good bye to the singing key (#10966) 2026-01-22 05:52:31 +01:00
keying feat: use keying for webhook secrets (#10059) 2025-12-22 15:51:37 +01:00
label chore: replace gopkg.in/yaml.v3 with go.yaml.in/yaml/v3 (#8956) 2025-08-20 15:31:12 +02:00
lfs chore: add unit test for SearchPointerBlobs 2025-10-03 14:37:24 +02:00
log feat(log): better parseable and configurable ssh-logs (#9056) 2025-09-11 18:59:24 +02:00
markup fix(ui): improve rendering of commit links (#10530) 2025-12-28 17:18:51 +01:00
mcaptcha
metrics
migration chore: replace gopkg.in/yaml.v3 with go.yaml.in/yaml/v3 (#8956) 2025-08-20 15:31:12 +02:00
nosql
optional chore: replace gopkg.in/yaml.v3 with go.yaml.in/yaml/v3 (#8956) 2025-08-20 15:31:12 +02:00
options
packages Auto-link container images to repository (#10617) 2026-01-11 23:50:21 +01:00
paginator
pprof
private feat: show link to pull requests targeting a non-default branch when pushing (#10079) 2025-11-19 14:59:13 +01:00
process
proxy
proxyprotocol
public add model viewer for .glb (GLTF) model in file view (#8111) 2025-06-21 14:42:35 +02:00
queue test: fix modules/queue tests to use TEST_REDIS_SERVER when present (#10139) 2025-11-16 21:51:32 +01:00
recaptcha
references fix: pull request cross references (#7979) 2025-05-28 14:50:05 +02:00
regexplru
repository feat(perf): remove unused size url parameter for local avatars (#10932) 2026-01-20 04:59:15 +01:00
secret
session
setting feat: add OIDC workload identity federation support (#10481) 2026-01-15 03:39:00 +01:00
sitemap
ssh fix: don't clobber authorized_keys file during installation (#10948) 2026-01-23 18:38:09 +01:00
storage fix: minio initialization can freeze indefinitely if misconfigured (#8897) 2025-08-15 21:03:51 +02:00
structs feat: Add header annotations for accurate API documentation (#9380) 2026-01-06 10:29:15 +01:00
svg
sync
system
templates chore: move all test blank imports in a single package (#10662) 2026-01-02 05:32:32 +01:00
test fix(ui): document token validity in key verification view (#9002) 2025-11-14 23:40:03 +01:00
testimport chore: move all test blank imports in a single package (#10662) 2026-01-02 05:32:32 +01:00
testlogger
timeutil
translation chore(test): separate and move around i18n testing (#10539) 2025-12-23 04:39:26 +01:00
turnstile
typesniffer feat: detect Interlisp sources as text (#8377) 2025-07-02 07:38:46 +02:00
updatechecker
uri
user
util feat(issue-search): support query syntax (#9109) 2025-11-19 16:05:42 +01:00
validation feat: allow sync quota groups with oauth2 auth source (#8554) 2025-12-01 14:12:00 +01:00
web fix: issues and pulls route permitted extra characters (#10185) 2025-12-10 01:21:38 +01:00
webhook Actions Failure, Succes, Recover Webhooks (#7508) 2025-06-03 14:29:19 +02:00
zstd