8087 Commits

Author SHA1 Message Date
Jakob Borg
f6c551fe87 chore(fs): remove unused SymlinksSupported() method (#10684)
💀

Signed-off-by: Jakob Borg <jakob@kastelo.net>
v2.1.0-rc.2
2026-05-09 10:48:53 +00:00
Umer-Azaz
f3a9ee8ed6 chore(gui): upgrade jQuery to 3.7.1 to fix CVE-2020-11022, CVE-2020-11023, CVE-2015-9251 (#10673)
## Summary

- Replace vendored `jquery-2.2.2.js` with `jquery-3.7.1.js` in
`gui/default/vendor/jquery/`
- Update script reference in `gui/default/index.html` to point to the
new file
- Update CDN reference in `cmd/infra/strelaypoolsrv/gui/index.html` from
`jquery-2.1.4.min.js` to `jquery-3.7.1.min.js`

## Why

The previously used jQuery versions (2.2.2 and 2.1.4) are vulnerable to
three known CVEs:

| CVE | Description | Fixed in |
|-----|-------------|----------|
| CVE-2015-9251 | XSS via cross-domain Ajax requests with non-text
content types | jQuery 3.0.0 |
| CVE-2020-11022 | XSS when passing HTML containing `<option>` elements
to manipulation methods | jQuery 3.5.0 |
| CVE-2020-11023 | XSS via passing HTML from untrusted sources to
manipulation methods | jQuery 3.5.0 |

jQuery 3.7.1 is the latest stable release and resolves all three.

## Compatibility notes

The GUI code was audited for jQuery 2→3 breaking changes. No removed
APIs are used:
- `.success()` / `.error()` calls throughout the codebase are
**AngularJS `$http`** promise methods, not jQuery — unaffected
- `.bind('beforeunload', ...)` is deprecated in jQuery 3 but not removed
— still works
- No usage of `.size()`, `.load()` event shorthand, `jQuery.isFunction`,
or `$.type()`

---------

Signed-off-by: Umer Azaz <umer_azaz@yahoo.com>
Co-authored-by: Jakob Borg <jakob@kastelo.net>
2026-05-09 10:30:18 +00:00
Jakob Borg
f538b47070 chore(model): slightly improve handling of pulling empty blocks (#10679)
In the common case (sparse files enabled, not reusing old data) we'd
optimise away pulling & writing zero blocks. However in the corner cases
we'd go through the whole processing of pulling the block over the
network which is of course entirely unnecessary.

Now, instead, always take an optimised path for all-zeroes blocks. In
the clean case we do nothing, otherwise we materialise a block of zeroes
and write it directly.

---------

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-05-09 12:15:18 +02:00
Jakob Borg
3709174a86 build(deps): update dependencies (#10683)
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-05-09 06:49:34 +00:00
Jakob Borg
5dd22cfd85 Merge branch 'infrastructure'
* infrastructure:
  fix(stdiscosrv): do graceful shutdown on SIGTERM
2026-05-04 09:54:04 +02:00
Syncthing Release Automation
cf5ea40b1a chore(gui, man, authors): update docs, translations, and contributors 2026-05-04 04:54:00 +00:00
Jakob Borg
6c51a59c52 fix(stdiscosrv): do graceful shutdown on SIGTERM
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-05-02 17:26:37 +02:00
Jakob Borg
1919c89de4 build: only run the periodic build jobs in the syncthing org (#10675) 2026-05-01 05:09:14 +00:00
Jakob Borg
774aa11795 fix(stdiscosrv): only read certificate proxy headers with --http (#10674)
These headers should not be inspected when running with a TLS listener.

Additionally, we should really enable them individually instead of
trusting the proxy to filter out the unused variants, but baby steps.

Reported by multiple AI vuln scanners.

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-30 18:44:28 +00:00
Jakob Borg
44abd15162 chore(api): use ldap package escape functions (#10672)
Instead of our own variants, which were mostly but not 100% identical.

---------

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-29 12:06:12 +02:00
Syncthing Release Automation
0372a79986 chore(gui, man, authors): update docs, translations, and contributors 2026-04-27 04:51:44 +00:00
Jakob Borg
531d7f1a9a build: create GH release as draft, then publish
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-26 12:43:45 +02:00
Jakob Borg
6bff89a618 docs: release notes for 2.1
Signed-off-by: Jakob Borg <jakob@kastelo.net>
v2.1.0-rc.1
2026-04-26 12:23:35 +02:00
Jakob Borg
86ac4e5017 feat: make block indexing configurable (#10608)
This adds a new folder-level configuration `FullBlockIndex`. It controls
whether we maintain the block index for a given folder -- currently
that's always true, now it becomes possible to turn off. The block index
is used for lookup of blocks across files and folders. Effectively, when
syncing a change, for each block, we check:

1. Is the block already present in the old version of the file? If so,
we can reuse (copy) it without network transfer. **This check is always
possible.**
2. Is the block already present in any other file in this folder or
other folders? If so we can copy it. **This check is only possible with
the full block index.**
3. We must transfer the block over the network.

Maintaining the full block index is costly in time, I/O and database
size. With this PR, maintaining the full block index becomes the default
for send-receive and receive-only folders only, with it disabled for
send-only and receive-encrypted folders. The block index is never useful
for encrypted folders, as blocks are encrypted separate for each file.
It is also not useful for send-only folders by themselves, though the
data in the send-only folder could be reused by other receive-type
folders if it were enabled.

For very large folders it may make sense to disable the full block index
regardless of folder type and just accept the resulting decrease in data
reuse.

Disabling or enabling the option in the GUI causes the index to be
destroyed or rebuilt accordingly.

https://github.com/syncthing/docs/pull/1005

---------

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-26 11:58:09 +02:00
Luiz Angelo Daros de Luca
84c6b37913 feat(dialer): add HTTP/HTTPS proxy support via CONNECT (#10572)
Register HTTP and HTTPS proxy dialers and implement CONNECT-based
tunneling for HTTP proxies.

The new dialer supports:
- Plain HTTP proxies using CONNECT
- HTTPS proxies by performing a TLS handshake before CONNECT
- Optional basic authentication via Proxy-Authorization (with a warning
when creds are used over cleartext HTTP)

This allows all_proxy to be set to http:// or https:// URLs, enabling
data transfer through HTTP(S) proxies.

### Purpose

Allow peers to connect using HTTP Proxies (CONNECT)

### Testing

Tested with both HTTP and HTTPS proxy connection, using both no auth and
plain authentication.

### Screenshots

No visual change

### Documentation

https://github.com/syncthing/docs/pull/987

## Authorship

Your name and email will be added automatically to the AUTHORS file
based on the commit metadata.

---------

Signed-off-by: Luiz Angelo Daros de Luca <luizluca@gmail.com>
Signed-off-by: Jakob Borg <jakob@kastelo.net>
Co-authored-by: Jakob Borg <jakob@kastelo.net>
2026-04-26 09:31:40 +00:00
vvaswani
987e631176 feat: make http session cookie path & duration configurable (fixes #10522) (#10632)
Signed-off-by: Vikram Vaswani <2571660+vvaswani@users.noreply.github.com>
Signed-off-by: Jakob Borg <jakob@kastelo.net>
Co-authored-by: Jakob Borg <jakob@kastelo.net>
2026-04-26 07:59:24 +00:00
Jakob Borg
1f57187461 fix(strelaypoolsrv): retry "not found" errors in registration check
We presumably always intended to retry these, but we didn't.

Relates to #10658.

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-24 15:19:48 +02:00
Jakob Borg
a7f47d381e fix(strelaypoolsrv): correct remote address logging
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-24 15:19:48 +02:00
Jakob Borg
1a7825c7ec fix(strelaysrv): properly use bind address for outgoing requests (fixes #10658) (#10659)
This was lost in #7217 a while back.

---------

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-24 15:18:18 +02:00
Jakob Borg
97fb677887 chore(api): deflake TestHTTPLogin on Windows (#10667)
Hopefully deflakes TestHTTPLogin on Windows, where it currently often
times out, presumably in the config saving stage after already having
started a shutdown of the API and being CPU constrained due to password
hashing.

---------

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-24 15:07:16 +02:00
Jakob Borg
124f6979a4 build: parallelise linux builds slightly (#10666)
They currently take like 25 minutes. This reduces that to approximately
a third, wall-clock wise.

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-24 13:16:12 +02:00
JRNitre
39778de04b fix(gui): fix tabs visually disabled but still clickable during ignore patterns setup (fixes #10634) (#10651)
### Purpose

Fixes issue #10634.

### Testing

Manually tested by reproducing the issue:

- Created a new folder with "Add ignore patterns" enabled
- Verified that after saving, only the "Ignore Patterns" tab remains
accessible
- Confirmed that other tabs are visually disabled and no longer
clickable

### Screenshots

No visible UI changes.

### Explanation of the Fix

**Cause**

The issue was caused by only visually disabling tabs in the UI by
setting
their `href` attribute to an empty string (`href=""`). This made the
tabs
appear disabled, but they were still clickable, leading to confusing
behavior
where users could interact with the tabs without any actual navigation.

**Fix**

- Introduced `isFolderTabDisabled` to centralize the logic for
determining
  whether a tab should be disabled
- Added `onFolderTabClick` to prevent interaction with disabled tabs
- Updated the HTML to remove tab behavior (such as `data-toggle="tab"`
and
  `href`) when a tab is disabled

### Documentation

No documentation changes required.

Signed-off-by: JRNitre <nichinichisou67@outlook.com>
Co-authored-by: Jakob Borg <jakob@kastelo.net>
2026-04-24 09:53:35 +02:00
Jakob Borg
bcaabedc8e chore(scanner): deflake TestStopWalk (#10664)
The test expected the stopped scanner to produce at most numHashers
additional results, but there's also the case where a directory is
encountered (which doesn't require hashing) and sent directly.

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-24 09:52:50 +02:00
Jakob Borg
46fb888ea3 chore(model): deflake TestCompletionEmptyGlobal (#10663)
There was a race condition where using IndexUpdate would trigger a pull,
which would sync the delete we are looking for, making the completion
100%. By doing the insert directly into the database we are not
triggering these things and get the expected completion percentage
always.

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-24 09:52:27 +02:00
Jakob Borg
36c3331696 chore(model): deflake cluster config tests (#10662)
These have been flaky for a long time, seemingly because the multiple
connection code slightly changed the timing of cluster config sending by
moving them to the connection promotion loop. This adds some resiliency
to that, instead of assuming that the CC:s will be immediately available
after adding the connection.

---------

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-24 07:41:17 +00:00
RealCharlesChia
2850b3a46c fix(gui): fallback to folder ID when label is empty in remove dialog (#10657)
## Summary

Fixes issue #10458: When removing a folder without a Folder Label, the
confirmation dialog now shows the folder ID instead of an empty string.

### Before
> Are you sure you want to remove folder **?**

### After  
> Are you sure you want to remove folder **dnjdr-hssze**?

### Changes

Modified `gui/default/syncthing/folder/removeFolderDialogView.html`:
```html
<!-- Before -->
<p translate translate-value-label="{{currentFolder.label}}">

<!-- After -->
<p translate translate-value-label="{{currentFolder.label || currentFolder.id}}">
```

### Testing

1. Create a folder without a label
2. Open the folder edit dialog
3. Click remove
4. Verify the confirmation dialog shows the folder ID instead of blank

Fixes #10458

Signed-off-by: RealCharlesChia <161665317+RealCharlesChia@users.noreply.github.com>
2026-04-23 09:02:25 +00:00
Jakob Borg
2721b7b522 chore(model): more efficient tracking of renames during scan (#10653) 2026-04-23 07:20:52 +02:00
Jakob Borg
b1ccf3f3fd chore: trivial fixes (#10650)
... which keep getting filed by AI agents.

Closes #10649, closes #10486, closes #10648, closes #10499, closes
#10647, closes #10635, closes #10636, closes #10607.

---------

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-22 06:38:05 +00:00
Syncthing Release Automation
199e07e3d2 chore(gui, man, authors): update docs, translations, and contributors 2026-04-20 04:46:00 +00:00
Syncthing Release Automation
74997c05e8 chore(gui, man, authors): update docs, translations, and contributors 2026-04-13 04:46:14 +00:00
Ben Norcombe
017ef5a57b fix(gui): order folders alphabetically and ensure local device stays hidden (ref #10563, ref #10631)
### Purpose

There were some additional regression created during #10563 and #10631 which are:

* Folders were not being ordered by their label within their group
* Local device could still show up randomly with the list of remote devices

The respective fixes in this PR does the following:

* Ensure sorting of the grouped folders (and devices) are done by group name (the top level map key) and then by the specified nested object property or a fallback property if specified property value is empty. So in the case of the folders it's `label` and device is `name`.
* When populating the `devicesGrouped` using `$scope.otherDevices`, do this within a watcher on `$scope.myID` as this is what `$scope.otherDevices` relies on to determine what is a remote device. This is required because `$scope.myID` might not be populated yet given the indeterministic call order being made to `refreshSystem` and `refreshConfig`.

### Testing

Populate folders and devices into different groups, and ensure the ordering is correct and the local device is not showing in remote devices even after many, many refreshes on the UI or restarts of syncthing entirely.

### Screenshots

Before the fix

<img width="1108" height="951" alt="Screenshot_20260409_083910" src="https://github.com/user-attachments/assets/6eb8cacc-5924-4612-aa70-29ed4f691233" />

After the fix

<img width="1090" height="934" alt="Screenshot_20260409_084553" src="https://github.com/user-attachments/assets/f5b74391-228a-43d3-b5ee-433958236d84" />

### Documentation

N/A

## Authorship

Ben Norcombe [bennorcombe@pm.me](mailto:bennorcombe@pm.me)
2026-04-11 13:52:20 +02:00
Ben Norcombe
6b9fa76c01 fix(gui): don't show local device under remote devices (ref #10563) (#10631)
### Purpose

Regression was introduced in PR #10563 due to new devices grouping
feature not utlising the otherDevices utility function to ensure the
local device is not shown in the remote devices list

### Testing

Open web GUI and ensure your local device isn't listed under Remote
Devices

### Screenshots

Regression before fix 

<img width="589" height="601" alt="Screenshot_20260407_202526"
src="https://github.com/user-attachments/assets/ffa315e4-f901-4d0c-8755-15b0c31464b3"
/>

Fix

<img width="598" height="555" alt="Screenshot_20260407_202656"
src="https://github.com/user-attachments/assets/8f0721c0-3fd2-4ae5-9db5-23c0d46c268e"
/>


### Documentation

N/A

## Authorship

Ben Norcombe [bennorcombe@pm.me](mailto:bennorcombe@pm.me)

Signed-off-by: Ben Norcombe <bennorcombe@pm.me>
Co-authored-by: Jakob Borg <jakob@kastelo.net>
2026-04-08 16:30:46 +00:00
Jakob Borg
a211fafdc4 policy: pushing invalidates PR approval
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-08 17:48:27 +02:00
Jakob Borg
e4e9402cd9 docs: add release notes for 2.1
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-07 17:25:53 +02:00
Jakob Borg
f806967958 Merge branch 'infrastructure'
* infrastructure:
  chore(stdiscosrv): smooth retry-after delays over a slightly larger normal distribution
  chore(stdiscosrv): optionally delay shutdown
  chore(stdiscosrv): adjust desired seen and unseen rate separately
2026-04-07 17:22:35 +02:00
Ben Norcombe
6a26d56ad9 feat(gui, config): support simple folder grouping (fixes #2070) (#10563)
Adds a very simple way to group up folders to help with organising from
the GUI. 

Signed-off-by: Ben Norcombe <bennorcombe@pm.me>
2026-04-07 17:05:41 +02:00
Jakob Borg
5d877f65f5 build: have dependabot group PRs and use cooldown (#10630)
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-07 16:57:42 +02:00
dagecko
e36bf6d6b1 build: pin 20 third-party actions to immutable commit SHAs (#10625)
fix: pin 20 third-party actions to immutable commit SHAs

Signed-off-by: Chris Nyhuis <cnyhuis@vigilantnow.com>
2026-04-07 16:55:54 +02:00
Jakob Borg
5febc056a8 fix(protocol): limit size of incoming request messages (#10629)
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-07 16:28:18 +02:00
dagecko
f234a61fb4 build: extract github.ref_name expression to env mapping (#10624)
Signed-off-by: Chris Nyhuis <cnyhuis@vigilantnow.com>
2026-04-06 15:24:12 +00:00
Jakob Borg
3ac9b83f40 chore(stdiscosrv): smooth retry-after delays over a slightly larger normal distribution
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-06 14:49:13 +02:00
Jakob Borg
1d4df9c1f4 chore(stdiscosrv): optionally delay shutdown
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-06 11:06:25 +02:00
Jakob Borg
a80b53d113 chore(stdiscosrv): adjust desired seen and unseen rate separately
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-06 10:42:24 +02:00
Jakob Borg
b594b7491f chore: systematic syncthing_build_info metric
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-06 09:44:49 +02:00
Syncthing Release Automation
e2cb283155 chore(gui, man, authors): update docs, translations, and contributors 2026-04-06 04:38:32 +00:00
bt90
ab9b11749c fix(gui): disable autocomplete for folder password (#10342)
Disable autocomplete

Signed-off-by: bt90 <btom1990@googlemail.com>
2026-04-05 14:29:56 +00:00
Syncthing Release Automation
1a3cbca017 chore(gui, man, authors): update docs, translations, and contributors 2026-03-30 04:38:35 +00:00
Marcus Spencer
76f91750c1 build(deps): temporarily switch to fork of gateway discovery library (fixes #10593) (#10594)
Signed-off-by: Marcus B Spencer <marcus@marcusspencer.us>
Signed-off-by: Jakob Borg <jakob@kastelo.net>
Co-authored-by: Jakob Borg <jakob@kastelo.net>
2026-03-29 22:05:06 +02:00
cui
1106e2e332 fix(stdiscosrv): close file descriptor on flush error in write (#10615)
The error path after bw.Flush() failed referenced fd.Close without calling it, so the descriptor was not closed when flush failed.

Signed-off-by: Weixie Cui <cuiweixie@gmail.com>
2026-03-26 00:37:34 +00:00
Syncthing Release Automation
351be52481 chore(gui, man, authors): update docs, translations, and contributors 2026-03-23 04:35:31 +00:00