The Tor Project issueshttps://gitlab.torproject.org/groups/tpo/-/issues2024-03-25T20:15:38Zhttps://gitlab.torproject.org/tpo/tpa/team/-/issues/41563evaluate impact of Let's Encrypt chain shortening2024-03-25T20:15:38Zanarcatevaluate impact of Let's Encrypt chain shorteningIn [this article from July 2023](https://letsencrypt.org/2023/07/10/cross-sign-expiration.html), let's encrypt mentioned the cross-sign with IdenTrust will stop working in September 2024.
Their timeline is this:
> - On Thursday, Feb 8t...In [this article from July 2023](https://letsencrypt.org/2023/07/10/cross-sign-expiration.html), let's encrypt mentioned the cross-sign with IdenTrust will stop working in September 2024.
Their timeline is this:
> - On Thursday, Feb 8th, 2024, we stopped providing the cross-sign by default in requests made to our /acme/certificate API endpoint. For most Subscribers, this means that your ACME client will configure a chain which terminates at ISRG Root X1, and your webserver will begin providing this shorter chain in all TLS handshakes. The longer chain, terminating at the soon-to-expire cross-sign, will still be available as an alternate chain which you can configure your client to request.
> - On Thursday, June 6th, 2024, we will stop providing the longer cross-signed chain entirely. This is just over 90 days (the lifetime of one certificate) before the cross-sign expires, and we need to make sure subscribers have had at least one full issuance cycle to migrate off of the cross-signed chain.
> - On Monday, September 30th, 2024, the cross-signed certificate will expire. This should be a non-event for most people, as any client breakages should have occurred over the preceding six months.
So part of the transition has already happened, with a reduced chain for most certificates issued. This should already have impacted us.
We need to see what other impacts that has for us. In #32351, we've been hesitant at performing cipher changes for backwards compatibility concerns. According to [this graph](https://gs.statcounter.com/android-version-market-share/mobile-tablet/worldwide/#monthly-202302-202402-bar), we're talking about 5% of Android users affected here, for example. The [compatibility page](https://letsencrypt.org/docs/certificate-compatibility/) has a more detailed breakdown.
So basically the task is to evaluate the above table and see if we need to do anything special to any of our services.2024-04-25https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/issues/278Create asset(s) for the Mullvad Browser installer2024-03-25T19:09:50ZPier Angelo VendrameCreate asset(s) for the Mullvad Browser installerCurrently, we use NSIS's default images for the last page of the installers, however we could customize it:
<details><summary>Screenshots</summary>
Our page:
![Screenshot_from_2024-02-06_17-22-53](/uploads/cbbb28d1d4fb72f83165b82ba92...Currently, we use NSIS's default images for the last page of the installers, however we could customize it:
<details><summary>Screenshots</summary>
Our page:
![Screenshot_from_2024-02-06_17-22-53](/uploads/cbbb28d1d4fb72f83165b82ba920bc04/Screenshot_from_2024-02-06_17-22-53.png)
Firefox:
![Screenshot_2024-01-17_054914](/uploads/513037b0c2df23114fb5008bf431fa0f/Screenshot_2024-01-17_054914.png)
</details>
Firefox uses the same asset is used also for the first page.
We don't use that page, but in case we can also re-use the same asset, or create a new issue if needed.
We customize the icon for the channel, so if easy enough we could have multiple version of that asset, too (but I'm not sure of the requirement on the sponsor side).
/cc @donuts @nicobnicobnicobhttps://gitlab.torproject.org/tpo/core/arti/-/issues/1342Use d-a for our ad-hoc BinaryHeap entry implementations2024-03-25T10:30:18Zgabi-250Use d-a for our ad-hoc BinaryHeap entry implementationsWe have a lot of types meant for use in a [std BinaryHeap](https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html) to make it behave as a min-heap instead of max-heap. These types all have formulaic `Ord`/`ParialOrd`/`Eq`/`Part...We have a lot of types meant for use in a [std BinaryHeap](https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html) to make it behave as a min-heap instead of max-heap. These types all have formulaic `Ord`/`ParialOrd`/`Eq`/`PartialEq` impls
```rust
impl Ord for ReuploadTimer {
fn cmp(&self, other: &Self) -> Ordering {
// Reversed, because we want the earlier
// `ReuploadTimer` to be "greater".
self.when.cmp(&other.when).reverse()
}
}
impl PartialOrd for ReuploadTimer {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl PartialEq for ReuploadTimer {
fn eq(&self, other: &Self) -> bool {
self.when == other.when
}
}
impl Eq for ReuploadTimer {}
```
```rust
impl<TT: Ord, RD> Ord for RefetchEntry<TT, RD> {
fn cmp(&self, other: &Self) -> Ordering {
self.when.cmp(&other.when).reverse()
// We don't care about the ordering of BridgeConfig or retry_delay.
// Different BridgeConfig with the same fetch time will be fetched in "some order".
}
}
impl<TT: Ord, RD> PartialOrd for RefetchEntry<TT, RD> {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl<TT: Ord, RD> PartialEq for RefetchEntry<TT, RD> {
fn eq(&self, other: &Self) -> bool {
self.cmp(other) == Ordering::Equal
}
}
impl<TT: Ord, RD> Eq for RefetchEntry<TT, RD> {}
```
```rust
impl PartialEq for SleepEntry {
fn eq(&self, other: &Self) -> bool {
self.when == other.when
}
}
impl Eq for SleepEntry {}
impl PartialOrd for SleepEntry {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl Ord for SleepEntry {
fn cmp(&self, other: &Self) -> Ordering {
self.when.cmp(&other.when).reverse()
}
}
```
```rust
impl<TT: Ord, RD> Ord for RefetchEntry<TT, RD> {
fn cmp(&self, other: &Self) -> Ordering {
self.when.cmp(&other.when).reverse()
// We don't care about the ordering of BridgeConfig or retry_delay.
// Different BridgeConfig with the same fetch time will be fetched in "some order".
}
}
impl<TT: Ord, RD> PartialOrd for RefetchEntry<TT, RD> {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl<TT: Ord, RD> PartialEq for RefetchEntry<TT, RD> {
fn eq(&self, other: &Self) -> bool {
self.cmp(other) == Ordering::Equal
}
}
impl<TT: Ord, RD> Eq for RefetchEntry<TT, RD> {}
```
And I'm about to add another such type!
ISTM these could all be auto-generated (probably with d-a).gabi-250gabi-250https://gitlab.torproject.org/tpo/network-health/metrics/descriptorParser/-/issues/85Fix tests for server status2024-03-26T09:57:52ZHiroFix tests for server statusThere are a few fields in the server status class that are not being tested.
Leaving here a few comments for reference:
https://gitlab.torproject.org/tpo/network-health/metrics/descriptorParser/-/merge_requests/51#note_2998894
https:/...There are a few fields in the server status class that are not being tested.
Leaving here a few comments for reference:
https://gitlab.torproject.org/tpo/network-health/metrics/descriptorParser/-/merge_requests/51#note_2998894
https://gitlab.torproject.org/tpo/network-health/metrics/descriptorParser/-/merge_requests/51#note_2998067https://gitlab.torproject.org/tpo/community/outreach/-/issues/40064/ETC2024-03-21T16:40:31Zjuga/ETC[/ETC](https://eclectictechcarnival.org/etc/call/) 2024 happens in Berlin during June 5 - 9 (FLINTA)
/cc @gaba
CFP deadline on April 6th[/ETC](https://eclectictechcarnival.org/etc/call/) 2024 happens in Berlin during June 5 - 9 (FLINTA)
/cc @gaba
CFP deadline on April 6th2024-04-05https://gitlab.torproject.org/tpo/core/arti/-/issues/1339Be consistent with our STUB/STUB+ terminology throughout circmgr/guardmgr2024-03-20T12:31:52Zgabi-250Be consistent with our STUB/STUB+ terminology throughout circmgr/guardmgrThe following discussion from !2046 should be addressed:
- [ ] @nickm started a [discussion](https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2046#note_3010014): (+3 comments)
> IMO we should do these things in the doc...The following discussion from !2046 should be addressed:
- [ ] @nickm started a [discussion](https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2046#note_3010014): (+3 comments)
> IMO we should do these things in the docs:
> - Explain what a stub circuit is
> - Explain when we would choose STUB and when we would choose STUB+
> - Get our terminology uniform on "STUB+" vs "Extended". (But let's not do a big rename until we've decided.)Arti: Guard discovery researchgabi-250gabi-250https://gitlab.torproject.org/tpo/web/support/-/issues/358Add Letterboxing to the glossary2024-03-25T15:27:33ZemmapeelAdd Letterboxing to the glossaryWe need to add Letterboxing to the glossary, as it is a new term that we use on the documentation.We need to add Letterboxing to the glossary, as it is a new term that we use on the documentation.ebanamebanam@torproject.orgebanamebanam@torproject.orghttps://gitlab.torproject.org/tpo/web/donate-neo/-/issues/24Convert uses of px into relative units?2024-03-26T14:34:50ZdonutsConvert uses of px into relative units?By default, Figma wants measurements to be specific in px. However we try and use multiples or clean fractions of 16 in our designs so that dimensions in px can be translated into relative units like rem during implementation.By default, Figma wants measurements to be specific in px. However we try and use multiples or clean fractions of 16 in our designs so that dimensions in px can be translated into relative units like rem during implementation.stephenstephenhttps://gitlab.torproject.org/tpo/network-health/exitmap/-/issues/55test_relayselector.py hardcodes `/tmp` which breaks test_get_exits()2024-03-18T09:59:02ZGeorg Koppentest_relayselector.py hardcodes `/tmp` which breaks test_get_exits()```
test/test_relayselector.py::TestRelaySelector::test_get_exits
----------------------------------- live log call -----------------------------------
DEBUG relayselector:relayselector.py:176 Selecting exits depending on parameters....```
test/test_relayselector.py::TestRelaySelector::test_get_exits
----------------------------------- live log call -----------------------------------
DEBUG relayselector:relayselector.py:176 Selecting exits depending on parameters.
CRITICAL relayselector:relayselector.py:128 File "/tmp/cached-consensus" could not be read: [Errno 2] No such file or directory: '/tmp/cached-consensus'
```
I guess we should make use of `test/data/cached-consensus` as we do in other tests instead.https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/issues/40345migrate docker image to this repo2024-03-23T19:38:24Zmeskiomeskio@torproject.orgmigrate docker image to this repoWe used to develop the docker image in a separated repo: https://gitlab.torproject.org/tpo/anti-censorship/docker-snowflake-proxy/
But now we have a CI building the docker image in this repo: !246
Let's deprecate the original docker re...We used to develop the docker image in a separated repo: https://gitlab.torproject.org/tpo/anti-censorship/docker-snowflake-proxy/
But now we have a CI building the docker image in this repo: !246
Let's deprecate the original docker repo and move everything here. Things that might be missing:
* [ ] move docker-compose.yml to this repo or somewhere
* [ ] update the community documentation to use our repo
* [ ] integrate publishing the docker image in the release process
* [ ] are we cross building in the CI?
* [ ] how are we going to push to dockerhub the image?
* [ ] archive docker-snowflake-proxy reposhelikhooshelikhoohttps://gitlab.torproject.org/tpo/web/manual/-/issues/157Add entry about letterboxing (about:manual#letterboxing)2024-03-12T20:36:03Zma1Add entry about letterboxing (about:manual#letterboxing)We're implementing a `Learn more` link in the new user-facing letteboxing preferences (tpo/applications/tor-browser#41916) and we need some content to be referenced by about:manual#letterboxing :)
@donuts' [comment](https://gitlab.torp...We're implementing a `Learn more` link in the new user-facing letteboxing preferences (tpo/applications/tor-browser#41916) and we need some content to be referenced by about:manual#letterboxing :)
@donuts' [comment](https://gitlab.torproject.org/tpo/applications/tor-browser/-/issues/32324#note_2876483):
> It's on support-dot, but possibly not the manual?
> https://support.torproject.org/tbb/maximized-torbrowser-window/ebanamebanam@torproject.orgebanamebanam@torproject.orghttps://gitlab.torproject.org/tpo/applications/vpn/-/issues/146Convert typography to use Inter instead of Figtree or Roboto2024-03-05T19:40:15ZdonutsConvert typography to use Inter instead of Figtree or RobotoIn the most recent iteration of the designs, we're using [MD3's default type scale](https://m3.material.io/styles/typography/type-scale-tokens) set in Inter instead of Roboto:
- [Inter on Google Fonts](https://fonts.google.com/specimen/...In the most recent iteration of the designs, we're using [MD3's default type scale](https://m3.material.io/styles/typography/type-scale-tokens) set in Inter instead of Roboto:
- [Inter on Google Fonts](https://fonts.google.com/specimen/Inter)
- [Inter on GitHub](https://github.com/rsms/inter)
This is different from earlier versions of the designs, which were set in [Figtree](https://fonts.google.com/specimen/Figtree). Since then we've adopted stricter requirements for a UI font, such as better latin coverage and compatibility with Cyrillic scripts. We also wish to use Inter as our corporate body font too, so everything matches nicely.
For reference, the styles used in the app are:
<details><summary>Show styles</summary>
**Headline** / Large
- Font: Inter
- Weight: 400
- Size: 32
- Line height: 40
- Letter spacing: 0
**Headline** / Medium
- Font: Inter
- Weight: 400
- Size: 28
- Line height: 36
- Letter spacing: 0
**Headline** / Small
- Font: Inter
- Weight: 400
- Size: 24
- Line height: 32
- Letter spacing: 0
**Title** / Large
- Font: Inter
- Weight: 500
- Size: 22
- Line height: 28
- Letter spacing: 0
**Title** / Medium
- Font: Inter
- Weight: 500
- Size: 16
- Line height: 24
- Letter spacing: 0
**Title** / Small
- Font: Inter
- Weight: 500
- Size: 14
- Line height: 20
- Letter spacing: 0
**Body** / Large
- Font: Inter
- Weight: 400
- Size: 16
- Line height: 24
- Letter spacing: 0
**Body** / Medium
- Font: Inter
- Weight: 400
- Size: 14
- Line height: 20
- Letter spacing: 0
**Body** / Small
- Font: Inter
- Weight: 400
- Size: 12
- Line height: 16
- Letter spacing: 0
**Label** / Large
- Font: Inter
- Weight: 600
- Size: 14
- Line height: 20
- Letter spacing: 0
**Label** / Medium
- Font: Inter
- Weight: 600
- Size: 12
- Line height: 16
- Letter spacing: 0
**Label** / Small
- Font: Inter
- Weight: 600
- Size: 11
- Line height: 16
- Letter spacing: 0
</details>
All text within the app should use one of these styles. Although the styles, sizes and line heights all match to MD3's type scale – note that the weights are different for selected styles ("Title / Large" and all "Label" styles), and letter spacing is always "0".VPN pre-alpha 07https://gitlab.torproject.org/tpo/applications/vpn/-/issues/145Fix the connection bar animation2024-03-27T17:36:16ZdonutsFix the connection bar animationThe connection bar is intended to animate like so: [Figma / Tor VPN for Android](https://www.figma.com/proto/sjNWeIOpb0BckjmxApXd5m/Tor-VPN-for-Android?page-id=4280%3A1524&type=design&node-id=4621-6088&viewport=-2084%2C233%2C0.65&t=O5WUU...The connection bar is intended to animate like so: [Figma / Tor VPN for Android](https://www.figma.com/proto/sjNWeIOpb0BckjmxApXd5m/Tor-VPN-for-Android?page-id=4280%3A1524&type=design&node-id=4621-6088&viewport=-2084%2C233%2C0.65&t=O5WUUZ62ub2lXys1-1&scaling=min-zoom&starting-point-node-id=4621%3A6088&mode=design)
At the moment it appears to be doing something different. However it should match the same color transition/animation as Tor Browser's connection bar – but remain fixed at 100% of the device's width.VPN pre-alpha 07https://gitlab.torproject.org/tpo/applications/vpn/-/issues/144Add "General" and "About" sections to Configure2024-03-07T00:04:57ZdonutsAdd "General" and "About" sections to ConfigureThere are additional Configure screens in the Figma file that haven't been built yet – "General", which contains sections for the app icon and notifications, and "About".
The Figma file can be found here: [Figma / Tor VPN for Android](h...There are additional Configure screens in the Figma file that haven't been built yet – "General", which contains sections for the app icon and notifications, and "About".
The Figma file can be found here: [Figma / Tor VPN for Android](https://www.figma.com/file/sjNWeIOpb0BckjmxApXd5m/Tor-VPN-for-Android?type=design&node-id=4280%3A1524&mode=design&t=QaXRFt9BKyClRF4p-1)VPN pre-alpha 07https://gitlab.torproject.org/tpo/applications/vpn/-/issues/143Convert "Add new bridges" dialog into a full-screen dialog2024-03-05T17:32:20ZdonutsConvert "Add new bridges" dialog into a full-screen dialogThe previous dialog we designed is a little claustrophobic. The text area is quite narrow, and the dialog awkwardly grows in height when new lines are entered. We could improve on this by switching to a full-screen dialog as described he...The previous dialog we designed is a little claustrophobic. The text area is quite narrow, and the dialog awkwardly grows in height when new lines are entered. We could improve on this by switching to a full-screen dialog as described here: https://m3.material.io/components/dialogs/guidelines
The Figma file can be found here: [Figma / Tor VPN for Android](https://www.figma.com/file/sjNWeIOpb0BckjmxApXd5m/Tor-VPN-for-Android?type=design&node-id=4395%3A1618&mode=design&t=QaXRFt9BKyClRF4p-1)VPN pre-alpha 07https://gitlab.torproject.org/tpo/anti-censorship/team/-/issues/137A new home for bridges.tpo/info2024-03-04T17:40:00Zmeskiomeskio@torproject.orgA new home for bridges.tpo/infohttps://bridges.torproject.org/info lists all the bridge distribution mechanisms. AFAIK the only place this is being linked from is the *Bridge distribution mechanism* on the bridge page in metrics.tpo. We might have a better place for t...https://bridges.torproject.org/info lists all the bridge distribution mechanisms. AFAIK the only place this is being linked from is the *Bridge distribution mechanism* on the bridge page in metrics.tpo. We might have a better place for this page than BridgeDB (soon to be rdsys).meskiomeskio@torproject.orgmeskiomeskio@torproject.orghttps://gitlab.torproject.org/tpo/anti-censorship/gettor-project/OnionSproutsBot/-/issues/60Some languages are not appearing in the 'Change Language' menu2024-03-04T16:49:34Zmeskiomeskio@torproject.orgSome languages are not appearing in the 'Change Language' menuThe following translations are installed but don't appear in the menu: ar, be, bg, ca, hr, cs, is, it, ja, pt_BR, roThe following translations are installed but don't appear in the menu: ar, be, bg, ca, hr, cs, is, it, ja, pt_BR, romeskiomeskio@torproject.orgmeskiomeskio@torproject.orghttps://gitlab.torproject.org/tpo/team/-/issues/264Code audit for sponsor 1502024-03-07T15:23:37ZGabagaba@torproject.orgCode audit for sponsor 150We are contracting a third party to audit the code changed on project sponsor 150.
- [ ] Write RFP
- [ ] Send to auditors
- [ ] Choose and contract auditor
- [ ] Start audit by July 1st.We are contracting a third party to audit the code changed on project sponsor 150.
- [ ] Write RFP
- [ ] Send to auditors
- [ ] Choose and contract auditor
- [ ] Start audit by July 1st.Gabagaba@torproject.orgGabagaba@torproject.org2024-05-27https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/issues/40342Shadow integration tests occasionally panic2024-03-07T22:51:40ZCecylia BocovichShadow integration tests occasionally panicA recent job failed: https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/jobs/491691
This is likely runner-dependent, since no changes were made to the Shadow tests since it last passed:
```
$ shadow --log...A recent job failed: https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/jobs/491691
This is likely runner-dependent, since no changes were made to the Shadow tests since it last passed:
```
$ shadow --log-level=debug --model-unblocked-syscall-latency=true snowflake-minimal.yaml > shadow.log
** Starting Shadow v3.0.0-557-g193924aa 2023-08-25--13:24:51 with GLib v2.66.8
thread 'shadow-worker' panicked at 'called `Result::unwrap()` on an `Err` value: ENOSYS', main/utility/childpid_watcher.rs:269:37
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
thread 'shadow-worker' panicked at 'called `Result::unwrap()` on an `Err` value: PoisonError { .. }', main/utility/childpid_watcher.rs:268:43
thread 'shadow-worker' panicked at 'called `Result::unwrap()` on an `Err` value: PoisonError { .. }thread '', shadow-workermain/utility/childpid_watcher.rs' panicked at ':assertion failed: self.shim_shmem_lock.borrow().is_none()268', :main/host/host.rs43:
971:9
fatal runtime error: thread local panicked on drop
thread 'shadow-worker' panicked at 'called `Result::unwrap()` on an `Err` value: PoisonError { .. }', main/utility/childpid_watcher.rs:268:43
thread 'shadow-worker' panicked at 'assertion failed: self.shim_shmem_lock.borrow().is_none()', main/host/host.rs:971:9/bin/bash: line 210: 30403 Aborted (core dumped) shadow --log-level=debug --model-unblocked-syscall-latency=true snowflake-minimal.yaml > shadow.log
```https://gitlab.torproject.org/tpo/applications/tor-browser/-/issues/42436Allow for multiple configured (front, reflector) domain fronting pairs in Moa...2024-03-06T18:39:12ZCecylia BocovichAllow for multiple configured (front, reflector) domain fronting pairs in Moat moduleIt's happened twice now that the domain fronting settings for Moat have stopped working:
- [when `cdn.sstatic.net` moved to CloudFlare](https://lists.torproject.org/pipermail/anti-censorship-team/2023-September/000314.html)
- [when Fastl...It's happened twice now that the domain fronting settings for Moat have stopped working:
- [when `cdn.sstatic.net` moved to CloudFlare](https://lists.torproject.org/pipermail/anti-censorship-team/2023-September/000314.html)
- [when Fastly stopped supporting domain fronting and `foursquare.com` renewed its cert](https://github.com/net4people/bbs/issues/309)
When Moat stops working, it leaves us scrambling to find new front domains, the update process requires a new release, and it can be difficult for users to receive updates or connect if Connection Assist is unreachable. It's also difficult to choose a single front domain that will work in almost every place. Even though Connect Assist allows us offer country-specific circumvention settings, we have only a single setting for using Connect Assist itself.
Ideally, we could provide multiple (front, reflector) pairs, and iterate through them until a working pair is found. That pair can be saved for future use until it stops working and the module will re-iterate through the list until a new pair is found.