Compare commits

...

23 Commits

Author SHA1 Message Date
Sarah Jamie Lewis c6b3ae5cc1
1.14 2024-02-13 21:16:58 -08:00
Sarah Jamie Lewis ca0b28130f Managed Group Formal Model 2024-01-22 15:08:03 -08:00
Sarah Jamie Lewis c58f0f0207 Spelling and other issues. 2024-01-15 10:26:43 -08:00
Sarah Jamie Lewis 439ba2686f Final Pass 2024-01-15 10:22:49 -08:00
Sarah Jamie Lewis 01fcffac65 Build 2024-01-11 12:04:40 -08:00
Sarah Jamie Lewis f8c78e1cb0 Enhanced Permissions 2024-01-11 12:03:27 -08:00
Sarah Jamie Lewis 1d6c1a3f98 Add bot note 2024-01-04 13:52:25 -08:00
Sarah Jamie Lewis 149fe25173 Upgrade Docusarus, Fixup Markdown Issues 2024-01-04 13:42:21 -08:00
Sarah Jamie Lewis b83543a163 Links 2024-01-04 13:03:10 -08:00
Sarah Jamie Lewis f32efa8636 Timeline Updates 2024-01-04 12:59:48 -08:00
Sarah Jamie Lewis 7c68f40403 Hybrid Groups 2024-01-04 10:50:46 -08:00
Sarah Jamie Lewis 23f7906e37 Spelling 2023-09-27 11:57:14 -07:00
Sarah Jamie Lewis 18a2dbff0e Spelling 2023-09-27 10:54:53 -07:00
Sarah Jamie Lewis 25d7f50372 Date 2023-09-27 10:51:05 -07:00
Sarah Jamie Lewis 42e2a22699 Cwtch 1.13 2023-09-27 10:44:52 -07:00
Sarah Jamie Lewis 25514834a9 Fix 2023-09-06 14:51:51 -07:00
Sarah Jamie Lewis 6ad63a4fae Update 2023-09-06 14:45:50 -07:00
Sarah Jamie Lewis ca2b762d04 New Nightly 2023-09-06 14:40:42 -07:00
Sarah Jamie Lewis 874de424d0 Merge pull request 'Whonix documentation update' (#10) from nyxnor/docs.cwtch.im:doc-whonix into staging
Reviewed-on: cwtch.im/docs.cwtch.im#10
2023-09-06 17:59:20 +00:00
nyxnor aa4aa22305 Whonix also packages the onion-grater profile 2023-09-06 01:04:26 +00:00
nyxnor 760c004b73 Remove onion-grater profile from Whonix doc 2023-09-06 00:03:41 +00:00
nyxnor b5cc3cf24c Harden Whonix onion-grater profile 2023-09-04 02:43:06 +00:00
nyxnor 9736c73e57 Whonix doc 2023-09-02 20:00:38 +00:00
2421 changed files with 41691 additions and 15251 deletions

View File

@ -35,7 +35,7 @@ As part of a broader effort to [refine the Cwtch API in preparation for Cwtch St
## Cwtch Autobindings
The current `lib.go` file that encapsulates the vast majority of libCwtch-go currently sits at 1500+ lines of code. However, much of that code is boilerplate calling conventions e.g. the `BlockContact` API implementation is:
```
//export c_BlockContact
func c_BlockContact(profilePtr *C.char, profileLen C.int, conversation_id C.int) {
BlockContact(C.GoStringN(profilePtr, profileLen), int(conversation_id))
@ -47,7 +47,7 @@ The current `lib.go` file that encapsulates the vast majority of libCwtch-go cur
profile.BlockConversation(conversationID)
}
}
```
All that code is doing is defining a C-compatible API, performing some basic checking of parameters, and passing the result into the core Cwtch library. The two functions themselves support the C-bindings and Java-bindings respectively.
In the new [cwtch-autobindings](https://git.openprivacy.ca/cwtch.im/autobindings) we reduce these multiple lines to [a single one](https://git.openprivacy.ca/cwtch.im/autobindings/src/branch/main/spec#L19):

View File

@ -43,10 +43,11 @@ For now this interface is rather minimal, and has been mapped almost exactly to
We can then generate, and optionally include blocks of code like:
```
<experimentGlobal> = <experimentPackage>.Init(&globalACN, appDir)
eventHandler.AddModule(<experimentGlobal>)
<experimentGlobal>.Enable(application, &globalACN)
```
and place them at specific points in the code. `EventHandler` has also been extended to maintain a collection of `modules` so that it can
pass on interesting events.
@ -56,6 +57,7 @@ We have introduced a new `!` operator which can be used to gate APIs behind a co
templating option `exp` which will call the function on the configured experiment, and `global` to allow the setting up
of a global functionality within the library.
```
# Server Hosting Experiment
!serverExperiment import "git.openprivacy.ca/cwtch.im/cwtch-autobindings/experiments/servers"
!serverExperiment global serverExperiment *servers.ServersFunctionality servers
@ -68,7 +70,7 @@ of a global functionality within the library.
!serverExperiment exp StopServers application
!serverExperiment exp DestroyServers
!serverExperiment exp DeleteServer application string:handle password
```
### Generation-Time Inclusion
Without any arguments provided `generate-bindings` will not generate code for any experiments.

View File

@ -3,7 +3,7 @@ title: Cwtch Beta 1.12
description: "Cwtch Beta 1.12 is now available for download"
slug: cwtch-nightly-1-12
tags: [cwtch, cwtch-stable, release]
image: /img/devlog13_small.png
image: /img/devlog1_small.png
hide_table_of_contents: false
toc_max_heading_level: 4
authors:
@ -16,7 +16,7 @@ authors:
Cwtch 1.12 is the culmination of the last few months of effort by the Cwtch team, and includes many foundational changes that pave the way for [Cwtch Stable](/blog/path-to-cwtch-stable) including new features like [profile attributes](https://docs.cwtch.im/docs/profiles/profile-info), support for new platforms like [Tails](https://docs.cwtch.im/docs/platforms/tails), and multiple improvements to performance and stability.
![](/img/devlog13.png)
![](/img/devlog1.png)
<!--truncate-->

View File

@ -0,0 +1,74 @@
---
title: September Cwtch Stable Roadmap Update
description: "Back in July we provided an update on several goals that we would have to hit on our way to Cwtch Stable, and the timelines to hit them. In this post we provide a new update on those goals"
slug: cwtch-stable-roadmap-update-sept
tags: [cwtch, cwtch-stable, planning]
image: /img/devlog1_small.jpg
hide_table_of_contents: false
authors:
- name: Sarah Jamie Lewis
title: Executive Director, Open Privacy Research Society
image_url: /img/sarah.jpg
---
The next large step for the Cwtch project to take is a move from public **Beta** to **Stable** marking a point at which we consider
Cwtch to be secure and usable. We have been working hard towards that goal over the last year.
Today, as we approach the release of Cwtch Stable we would like to provide another update on the ongoing work, and the remaining blockers to certifying a Cwtch Stable release. We also have a new nightly to
test out!
![](/img/devlog1.png)
<!--truncate-->
## Stable Blocker and Timelines
Back in January we set the ambitious goal of launching a Cwtch Stable in the Summer of 2023. We had planned to finish all of the work
prior to the end of August. The vast majority of that work has now been completed - what remains is captured in [Stable Blockers](https://git.openprivacy.ca/cwtch.im/cwtch-ui/projects/15) project which tracks the current state
of work that we have marked as being critical to a Cwtch Stable release.
Despite there being a large number of remaining issues, many of the outstanding work is inter-related, relies on common implementations or
are tightly coupled together.
In summary the final few areas of concern are:
- The ability to delete or purge group conversation history. (For historical reasons storing group history was once considered necessary
but this is no longer the case. We plan on enabling this feature in the coming weeks)
- Appropriate handling of less common system configurations. Cwtch current emits non-fatal exceptions if certain services are not available
e.g. dbus. This is related to former 3rd party code for managing networking and notification.
- A final UI pass. We have designs for better ways to convey certain information and functionality. We would like to implement these
prior to a stable release.
Because of this, we have set a goal of labelling a Cwtch Stable Release Candidate by **30th September 2023**.
## A New Nightly
There is a [new nightly version of Cwtch available for testing (2023-09-06-21-25-v1.12.0-33-g05b1)](https://build.openprivacy.ca/files/flwtch-2023-09-06-21-25-v1.12.0-33-g05b1/). This version contains a few bug fixes related to file share management,
in addition to a significant improvement in the connection management code.
Additionally, thanks to volunteer testers [and contributors](https://git.openprivacy.ca/cwtch.im/cwtch-ui/pulls/715) the installation instructions
and packaged configurations for Whonix have been much improved. See [running Cwtch on Whonix](https://docs.cwtch.im/docs/platforms/whonix) for more information.
## Get Involved
Staff and volunteer shortages have slightly extended our original estimates. In particular we are bottle-necked on review effort for new code. This is
why we would like to encourage people to test out the latest nightlies and report any bugs/issues/improvements.
In order to help people get acclimated to our development flow we have created a new section on the main documentation site called [Developing Cwtch](/docs/contribute/developing) - there you will find a collection of useful links and information about how to get started with Cwtch development, what libraries and tools we use, how pull requests are validated and verified, and how to choose an issue to work on.
We also also updated our guides on [Translating Cwtch](/docs/contribute/translate) and [Testing Cwtch](/docs/contribute/testing).
If you are interested in getting started with Cwtch development then please check it out, and feel free to reach out to `team@cwtch.im` (or open an issue) with any questions. All types of contributions [are eligible for stickers](/docs/contribute/stickers).
## Help us go further!
We couldn't do what we do without all the wonderful community support we get, from [one-off donations](https://openprivacy.ca/donate) to [recurring support via Patreon](https://www.patreon.com/openprivacy).
If you want to see us move faster on some of these goals and are in a position to, please [donate](https://openprivacy.ca/donate). If you happen to be at a company that wants to do more for the community and this aligns, please consider donating or sponsoring a developer.
Donations of **$5 or more** can opt to receive stickers as a thank-you gift!
For more information about donating to Open Privacy and claiming a thank you gift [please visit the Open Privacy Donate page](https://openprivacy.ca/donate/).
![A Photo of Cwtch Stickers](/img/stickers-new.jpg)

View File

@ -0,0 +1,127 @@
---
title: Cwtch 1.13 Stable Release Candidate
description: "Cwtch 1.13 (Stable Release Candidate)"
slug: cwtch-1-13
tags: [cwtch, cwtch-stable, release]
image: /img/picnic1.13.png
hide_table_of_contents: false
toc_max_heading_level: 4
authors:
- name: Sarah Jamie Lewis
title: Executive Director, Open Privacy Research Society
image_url: /img/sarah.jpg
---
[Cwtch 1.13 is now available for download](https://cwtch.im/download)!
Cwtch is a communication application (and associated libraries) that uses Tor v3 Onion Services to establish surveillance resistant channels between people. Cwtch has been designed to be
secure, private, and resilient.
Cwtch 1.13 is the culmination of the last few years of effort by the Cwtch team, and is the first release that meets our bar to be labelled a [Cwtch Stable](/blog/path-to-cwtch-stable) candidate.
While much more work remains, we are now very confident in the state of the Cwtch library, and the Cwtch UI. We are prepared to make certain commitments regarding peer-to-peer messaging, the UI,
and experimental interfaces. In this post we will chart the journey that got us to this point, highlight what is in this new release, and talk about our next steps.
![](/img/devlog14.png)
<!--truncate-->
## Cwtch Stable and Beyond!
Over five years ago, on the 28th June 2018, we published the first official announcement of Cwtch. Throughout 2019 we published various Alpha releases of Cwtch. The original plan was to release a Cwtch Beta in 2020.
Like so many other projects in 2020, Cwtch Beta was delayed, and towards the end of 2020 it became clear that our original approach to a cross-platform UI was not sustainable long term.
Finally, in June 2021 we launched Cwtch Beta 1.0. We have spent the years since refining beta, adding features, and responding to feedback.
We have now reached a pivotal moment in Cwtch, one that the team has been working towards for many years. We now believe that Cwtch has reached a point where people can use core features, and enable
experimental features, with a confidence that any risks are well understood and appropriately mitigated. As such we are dropping the "beta" label.
Some features, like automatically downloading and displaying images, will always carry some risk - as such these will always remain off-by-default in Cwtch.
However, if approporate precautions are taken (like never accepting conversations from untrusted entities) then these features can be turned on and used without additional considerable risk.
Further, we believe that the API presented by libCwtch has reached a point where its core design is unlikely to require changes - and as such are prepared to make additional committements to the stability
of that API going forward. Any new functionality will be provided by new interfaces, or otherwise be handled behind the scenes.
This is certainly not the end of Cwtch development. We have big plans for the future including the long-anticipated Hybrid Groups
implementation, a light client for restricted mobile operating systems, a return of the bulletin boards overlay, and much more.
We want to extend a huge thank you to everyone who helped Cwtch get this far. We could not have done it without you. If you
have helped in any way and would like to be listed in the contributor credits [please reach out](https://docs.cwtch.im/blog/cwtch-stable-call-for-credits).
## A Big Thank You
On a personal note, as Executive Director of Open Privacy, and lead of the Cwtch project. I want to take this opportunity to thank the Cwtch core team across time: Dan Ballard, Erinn Atwater and Marcia Díaz Agudelo - this work isnt glamorous, and doesnt pay well,
there is no profit to be made in decentralizing power. A lack of funding means we don't all work together any more, but you all still contribute so much to this project.
It takes a special kind of person to be willing to spend a significant fraction of their lives devoted to working on something for the benefit of other people.
Thank you for believing in this mission.
I also want to say thank you to all the people who tested Cwtch over the years and provided invaluable feedback, bug reports and critique.
You have made Cwtch what it is today, and I am sure you will be making it even better in the coming weeks, months, and years.
Last, but certainly not least, I want to extend a big thank you to all of the supporters of Open Privacy around the world - without your donations
and continued enthusiasm for the work that we do, none of this would be possible.
## Download Cwtch 1.13
You can download Cwtch from [https://cwtch.im/download](https://cwtch.im/download).
Subscribe to our [RSS feed](/blog/rss.xml), [Atom feed](/blog/atom.xml), or [JSON feed](/blog/feed.json) to stay up to date, and get the latest on, all aspects of Cwtch development.
Alternatively we also provide a [releases-only RSS feed](https://cwtch.im/releases/index.xml).
## In This Release
<figure>
[![](/img/picnic1.13.png)](/img/picnic1.13.png)
<figcaption>A screenshot of Cwtch 1.13</figcaption>
</figure>
A special thanks to the [amazing volunteer translators](https://docs.cwtch.im/docs/contribute/translate) and [testers](https://docs.cwtch.im/docs/contribute/testing) who made this release possible.
- **New Features:**
- **Conversation Search** - Cwtch can now find messages based on their content.
- **Appear Offline Mode** - in this mode Cwtch does not launch a listening service for inbound contacts, and allows a profile to be more selective in the contacts they connect to.
- **Whonix Support** - new runtime flags make changes that allow Cwtch to [run on Whonix](https://docs.cwtch.im/docs/platforms/whonix)
- **Save History Global Setting** - by default Cwtch deletes all messages on shutdown unless a conversation is otherwise configured. This change allows a user to change this default behaviour.
- **Bug Fixes / Improvements:**
- Based on Flutter 3.13.4
- Updated Android Target to 33
- Profile Status Menu now has many more options, including offline status, edit profile and enabling/disabling profile
- File Sharing Bug Fixes
- Manage shared files now supports re-enabling older file shares
- Improvements towards [UI Reproducible Builds](https://docs.cwtch.im/blog/cwtch-ui-reproducible-builds-linux)
- Server Info now propagates to the UI consistently
- Prevent DBus Exceptions on platforms where it is unsupported
- Packaged Emoji Font
- Fixes to retry manager which have greater improved (re)connection efficacy
- Allow deleting server info in Manage Servers
- **Accessibility / UX:**
- Core translations for **Brazilian Portuguese**, **Danish** , **Dutch**, **French**, **German**, **Italian**, **Norwegian** , **Romanian** , **Russian**, **Polish**, **Slovak**, **Spanish**, **Swahili**, **Swedish**, **Turkish**, and **Welsh**
- Partial translations for **Korean** (37%), **Japanese** (27%), , **Luxembourgish** (20%), **Greek** (15%), **Uzbek** (10%), and **Portuguese** (5%)
- Font Scaling improvements on several screens
## Reproducible Bindings
Cwtch 1.13 is based on libCwtch version `libCwtch-autobindings-2023-09-26-13-15-v0.0.10`.
The [repliqate scripts](https://docs.cwtch.im/blog/cwtch-bindings-reproducible#introducing-repliqate) to reproduce these bindings from source
can be found at [https://git.openprivacy.ca/cwtch.im/repliqate-scripts/src/branch/main/cwtch-autobindings-v0.0.10](https://git.openprivacy.ca/cwtch.im/repliqate-scripts/src/branch/main/cwtch-autobindings-v0.0.10)
## Help us go further!
We couldn't do what we do without all the wonderful community support we get, from [one-off donations](https://openprivacy.ca/donate) to [recurring support via Patreon](https://www.patreon.com/openprivacy).
If you want to see us move faster on some of these goals and are in a position to, please [donate](https://openprivacy.ca/donate). If you happen to be at a company that wants to do more for the community and this aligns, please consider donating or sponsoring a developer.
Donations of **$5 or more** can opt to receive stickers as a thank-you gift!
For more information about donating to Open Privacy and claiming a thank you gift [please visit the Open Privacy Donate page](https://openprivacy.ca/donate/).
![A Photo of Cwtch Stickers](/img/stickers-new.jpg)

View File

@ -0,0 +1,113 @@
---
title: "Path to Hybrid Groups"
description: "A look at how we plan on implementing the next generation of Cwtch multi-party messaging"
slug: path-to-hybrid-groups
tags: [cwtch, hybrid-groups]
image: /img/hybridgroups.png
hide_table_of_contents: false
toc_max_heading_level: 4
authors:
- name: Sarah Jamie Lewis
title: Executive Director, Open Privacy Research Society
image_url: /img/sarah.jpg
---
Back in [September 2023 we released Cwtch 1.13](/blog/cwtch-1-13), the first version of Cwtch to be labelled as **stable**,
and a major milestone in Cwtch development.
With the Cwtch interface now stable, we are in a position to begin a new phase in Cwtch development: a Path towards
**Hybrid Groups**.
![](/img/hybridgroups.png)
<!--truncate-->
## The Problem with Cwtch Groups
One of the unique features of Cwtch is that [groups](/docs/groups/introduction) are dependent on [untrusted infrastructure](/security/components/cwtch/server).
Because of this, at their most basic, a Cwtch group is simply an agreement between a set of peers on a common
cryptographic key, and a common (set of) untrusted server(s).
This provides Cwtch Groups with very nice properties such as anonymity to anyone not in the group, but it does mean
that certain other nice properties like member flexibility, and credential rotation are difficult to achieve.
We want to allow people to make the right trade-off when it comes to their own risk models, i.e. to be able to trade
efficiency for trust when that decision makes sense.
To do that we need to introduce a new class of group into Cwtch, something we are calling **Hybrid Groups**.
## What Are Hybrid Groups?
The goal of hybrid groups is to balance the security properties of Cwtch peer-to-peer communication with the
properties of untrusted infrastructure.
This is done by augmenting existing Cwtch Groups with an additional layer of peer-to-peer communication in order to provide
efficient participant management, key rotation, and other useful features.
### Levels of Hybrid Groups
In practice, we imagine there will be a few different levels of Hybrid Group, reflecting different trade-offs between inter-peer trust,
communication efficiency, and group security.
There are **Traditional Groups**, these have similar properties to the existing Cwtch Groups. Highly inefficient, but essentially
require zero-trust on behalf of participants other than an expectation that the key is kept secret.
We plan to introduce **Managed Groups**: A new kind of group where all participants explicitly trust a given always-online peer (e.g. a bot) with group operations. These
will be highly efficient, at the cost of that explicit trust (if that peer behaves maliciously then certain properties are broken). Managed groups will
be the first Cwtch groups to allow **Contractable** and **Expandable** groups, and more efficient **Key Rotation**.
To start with this *trusted peer* will take the form of an external bot (powered by [a cwtch bot framework](/developing/building-a-cwtch-app/building-an-echobot)) however we
eventually plan to expose this capability as part of the Cwtch UI.
And finally a category of **Augmented Groups**: An extension of Managed Groups that places configurable restrictions of the trust given to
the peer e.g. by requiring participants to take part in a meta-protocol that confirms certain actions before they are carried out (preventing
the trusted-peer from harming properties like **Participant Consistency**.
## Group Messaging Metadata
As with the rest of Cwtch, our ultimate goal is that no metadata (and specifically as part of this work, no group metadata e.g. membership, message timing) be
available to a party outside of the group.
Traditional Cwtch Groups take this to the extreme, and the expense of long syncing times, and a high possibility of disruption. Managed Groups
and Augmented groups will allow communities to make the right trade-offs allowing for greater resilience and faster syncing.
## A Rough Timeline (Q1: Week 0 - Week 10 2024)
- **Week 0** - Planning Q1 Cwtch Timeline (this devlog), minor bug fixes and other small UI-focused work originating from reports and feedback
from [Cwtch testers](/docs/contribute/testing).
- **Week 1** - Work begins on exposing **Enhanced Permissions** in the Cwtch library. These are essential to implementing many of the aspects
of the new group design, as well as improving other parts of contact management. (Expect more about this in a future devlog). Also, a formal model for Managed Groups will be created and documented.
This will form the basis of the implementation.
- **Week 2** - At this point we should be able to begin designing the Managed Group Extension to Cwtch. This will use the Cwtch Event Hooks API
to respond to Peer events to manage groups. During this work, we also expect to migrate the legacy group code into it's own similar extension to make
best use of the APIs.
- **Week 3** - Towards the end of January we expect to have a complete formal model of Managed Groups and to be able to start integrating the new extensions into the
Cwtch-UI. We also expect to be in the process of releasing a new 1.14 version of Cwtch that supports Enhanced Permissions.
- **Weeks 4 - Week 6** - February marks the 6th anniversary of the founding of [Open Privacy Research Society](https://openprivacy.ca), and our organizational year end. During this
time core members of the Cwtch team are often involved in administrative tasks that need to be done during this time, as such we are not planning to make too much progress on Cwtch during this time.
- **Weeks 7 - Week 10** - As we approach March, we will be formally integrating Managed Groups in Cwtch, and planning a Cwtch 1.15 release which will feature the new group type. During this time we will also be updating
Cwtch [Group Documentation](https://docs.cwtch.im/docs/category/groups) .
Once Managed Groups have been rolled out, we will assess what we have learned and proceed with similar steps for
Augmented Groups in Q2 (more on that in a later devlog!).
## Stay up to date!
As always, we will be regularly updating this devlog [and other channels](https://fosstodon.org/@cwtch) as we continue to make progress towards
surveillance resistant infrastructure!
Subscribe to our [RSS feed](/blog/rss.xml), [Atom feed](/blog/atom.xml), or [JSON feed](/blog/feed.json) to stay up to date, and get the latest on, all aspects of Cwtch development.
## Help us go further!
We couldn't do what we do without all the wonderful community support we get, from [one-off donations](https://openprivacy.ca/donate) to [recurring support via Patreon](https://www.patreon.com/openprivacy).
If you want to see us move faster on some of these goals and are in a position to, please [donate](https://openprivacy.ca/donate). If you happen to be at a company that wants to do more for the community and this aligns, please consider donating or sponsoring a developer.
Donations of **$5 or more** can opt to receive stickers as a thank-you gift!
For more information about donating to Open Privacy and claiming a thank you gift [please visit the Open Privacy Donate page](https://openprivacy.ca/donate/).
![A Photo of Cwtch Stickers](/img/stickers-new.jpg)

View File

@ -0,0 +1,107 @@
---
title: "Enhanced Permissions"
description: "An introduction to the new fine-grained permissions API exposed in libCwtch"
slug: enhanced-permissions
tags: [cwtch, hybrid-groups, acl]
image: /img/enhancedpermissions.png
hide_table_of_contents: false
toc_max_heading_level: 4
authors:
- name: Sarah Jamie Lewis
title: Executive Director, Open Privacy Research Society
image_url: /img/sarah.jpg
---
[Last week](/blog/path-to-hybrid-groups), we mentioned that **enhanced permissions** are essential to implementing many of the aspects
of the new **hybrid groups** design.
In this post we will introduce the new enhanced permissions api in libCwtch, explain why it is needed, and how future releases of Cwtch will manage
conversation-level permissions.
![](/img/enhancedpermissions.png)
<!--truncate-->
## How do conversation-level permissions work in Cwtch right now?
Underneath the libCwtch API, all conversations maintain an access control list. For peer-to-peer conversations this list has a single entry, keyed by
the handle of the contact.
Currently, this access control list only maintains the `Blocked`-state of the contact. If a user blocks another, then this is where the flag is stored. While
there are other fields in this list, they have been unused, until now.
Additionally, each conversation also stored an `Accepted` flag, indicating if the user has approved a contact request. The `Accepted` flag has many different
effects including whether certain features (like file sharing) are accessible, or whether connection attempts with the contact are tried automatically.
## What Are Enhanced Permissions?
The current approach has several issues; the major issue being that profiles have minimal control over how they interact with contacts. Ideally, you should be able to
automatically attempt to connect with a given cwtch user, but not allow file shares, for example.
This is the initial driving use case behind Enhanced Permissions. Exposing this underlying ACL and augmenting it with additional flags like `ShareFiles`,
`RenderImages`, and `AutoConnect`.
## The API
Enhanced permissions will be available through a new set of low level libCwtch APIs i.e.:
```
UpdateConversationAccessControlList(id int, acl model.AccessControlList) error
EnhancedUpdateConversationAccessControlList(conversation int, serialized_acl string) error
GetConversationAccessControlList(conversation int) (model.AccessControlList, error)
EnhancedGetConversationAccessControlList(conversation int) (string, error)
```
As with other libCwtch APIs the `Enhanced` functions speak JSON and be suitable for integration with UIs and other clients that cannot speak the
Go model.
`AccessControlList` maintains it's current structure, while `AccessControl` itself has been augmented with the fields
described in the previous section.
Existing access-control APIs e.g. `AcceptConversation`, `BlockConversation` and `UnblockConversation` have been updated
internally to use the augmented `AccessControl` model, and will be able to be safely used by existing and future clients.
However, the `Accepted` field in the `Conversation` model is now considered deprecated, and will be removed in a future Cwtch version.
## How will Migration Work?
To simplify migration newer versions of Cwtch will detect if Enhanced Permissions have been enabled, and if they haven't will automatically turn on
all new flags for `Accepted` conversations. This will maintain behaviour between versions, and should minimize any potential confusion.
You will then be able to modify this ACL on a per-conversation level in the Cwtch UI.
## When will Enhanced Permissions be Available?
We are aiming to roll out a nightly with Enhanced Permissions in the coming weeks. We will then spend some time iterating
on the UI to ensure that the new permissions are understandable and usable.
## How does this fit into Hybrid Groups?
That is not the end of the story as far as Enhanced Permissions go. As I mentioned above for peer-to-peer conversations the
ACL has a single entry.
For Hybrid Groups, this list will have multiple entries, for each member of the group. This will allow group admins to
control who can post to a group, and what kinds of messages they can post.
How this list will be maintained, propagated, and authenticated by group members will be a topic of a future development log.
## Stay up to date!
As always, we will be regularly updating this devlog [and other channels](https://fosstodon.org/@cwtch) as we continue to make progress towards
surveillance resistant infrastructure!
Subscribe to our [RSS feed](/blog/rss.xml), [Atom feed](/blog/atom.xml), or [JSON feed](/blog/feed.json) to stay up to date, and get the latest on, all aspects of Cwtch development.
## Help us go further!
We couldn't do what we do without all the wonderful community support we get, from [one-off donations](https://openprivacy.ca/donate) to [recurring support via Patreon](https://www.patreon.com/openprivacy).
If you want to see us move faster on some of these goals and are in a position to, please [donate](https://openprivacy.ca/donate). If you happen to be at a company that wants to do more for the community and this aligns, please consider donating or sponsoring a developer.
Donations of **$5 or more** can opt to receive stickers as a thank-you gift!
For more information about donating to Open Privacy and claiming a thank you gift [please visit the Open Privacy Donate page](https://openprivacy.ca/donate/).
![A Photo of Cwtch Stickers](/img/stickers-new.jpg)

View File

@ -0,0 +1,77 @@
---
title: Cwtch 1.14
description: "Cwtch 1.14 is now available to download"
slug: cwtch-1-14
tags: [cwtch, cwtch-stable, release]
image: /img/Themes_collage.png
hide_table_of_contents: false
toc_max_heading_level: 4
authors:
- name: Sarah Jamie Lewis
title: Executive Director, Open Privacy Research Society
image_url: /img/sarah.jpg
---
[Cwtch 1.14 is now available for download](https://cwtch.im/download)!
Cwtch is a communication application (and associated libraries) that uses Tor v3 Onion Services to establish surveillance resistant channels between people. Cwtch has been designed to be
secure, private, and resilient.
You can download Cwtch from [https://cwtch.im/download](https://cwtch.im/download).
Subscribe to our [RSS feed](/blog/rss.xml), [Atom feed](/blog/atom.xml), or [JSON feed](/blog/feed.json) to stay up to date, and get the latest on, all aspects of Cwtch development.
Alternatively we also provide a [releases-only RSS feed](https://cwtch.im/releases/index.xml).
## In This Release
<figure>
[![](/img/Themes_collage.png)](/img/Themes_collage.png)
<figcaption>We have made many changes to Cwtch themeing in 1.14, including new Custom Themes</figcaption>
</figure>
<!--truncate-->
A special thanks to the [amazing volunteer translators](https://docs.cwtch.im/docs/contribute/translate) and [testers](https://docs.cwtch.im/docs/contribute/testing) who made this release possible.
- **New Features:**
- **Custom Themes** - You can now load [custom themes](https://docs.cwtch.im/docs/contribute/themes) into Cwtch.
- **Message View Backgrounds** - This release contains the first support for (optional) background images in the message view. Future releases will allow per-conversation images.
- **Bug Fixes / Improvements:**
- Fixed tor connectivity in newer Tails releases
- Fixes in the Retry Plugin for better managing of a large number of contacts
- Several UX improvements for font scaling, and styling
- Fixed Android File Sharing Bug which prevent downloads of [non-previewed files](https://docs.cwtch.im/docs/settings/experiments/image-previews-and-profile-pictures).
- Fixed Android File Sharing Bug that resulted in a UI reset triggered by a rate race condition between reconnection and new message arriving
- Split Settings Pane into multiple tabs for easier navigation of options
- Fixed contact row date time/localization inconsistency
- Fixed contact row issue where `LANG` wasn't set on some linux systems
- libCwtch now support older Mac releases (min 10.12)
- Updates images and descriptions in the Windows Installer
- **Accessibility / UX:**
- Core translations for **Brazilian Portuguese**, **Danish** , **Dutch**, **French**, **German**, **Italian**, **Norwegian** , **Romanian** , **Russian**, **Polish**, **Slovak**, **Spanish**, **Swahili**, **Swedish**, **Turkish**, and **Welsh**
- Partial translations for **Korean** (41%), **Japanese** (26%), , **Luxembourgish** (19%), **Greek** (15%), **Uzbek** (9%), and **Portuguese** (5%)
- **Theme Refresh** - Many small adjustments to existing themes to make them more accessible
## Reproducible Bindings
Cwtch 1.14 is based on libCwtch version `libCwtch-autobindings-2024-02-12-11-04-v0.0.12`.
The [repliqate scripts](https://docs.cwtch.im/blog/cwtch-bindings-reproducible#introducing-repliqate) to reproduce these bindings from source
can be found at [https://git.openprivacy.ca/cwtch.im/repliqate-scripts/src/branch/main/cwtch-autobindings-v0.0.12](https://git.openprivacy.ca/cwtch.im/repliqate-scripts/src/branch/main/cwtch-autobindings-v0.0.12)
<hr/>
## Help us go further!
We couldn't do what we do without all the wonderful community support we get, from [one-off donations](https://openprivacy.ca/donate) to [recurring support via Patreon](https://www.patreon.com/openprivacy).
If you want to see us move faster on some of these goals and are in a position to, please [donate](https://openprivacy.ca/donate). If you happen to be at a company that wants to do more for the community and this aligns, please consider donating or sponsoring a developer.
Donations of **$5 or more** can opt to receive stickers as a thank-you gift!
For more information about donating to Open Privacy and claiming a thank you gift [please visit the Open Privacy Donate page](https://openprivacy.ca/donate/).
![A Photo of Cwtch Stickers](/img/stickers-new.jpg)

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 821 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 821 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 484 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 480 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[3080],{6502:s=>{s.exports=JSON.parse('{"label":"bindings","permalink":"/blog/tags/bindings","allTagsPath":"/blog/tags","count":5}')}}]);

View File

@ -0,0 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[3080],{6502:s=>{s.exports=JSON.parse('{"label":"bindings","permalink":"/blog/tags/bindings","allTagsPath":"/blog/tags","count":5,"unlisted":false}')}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[815],{5566:e=>{e.exports=JSON.parse('{"label":"developer-documentation","permalink":"/blog/tags/developer-documentation","allTagsPath":"/blog/tags","count":1}')}}]);

View File

@ -0,0 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[815],{5566:e=>{e.exports=JSON.parse('{"label":"developer-documentation","permalink":"/blog/tags/developer-documentation","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]);

View File

@ -0,0 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[6977],{4388:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/acl","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[7538],{959:a=>{a.exports=JSON.parse('{"label":"autobindings","permalink":"/blog/tags/autobindings","allTagsPath":"/blog/tags","count":2}')}}]);

View File

@ -0,0 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[7538],{959:s=>{s.exports=JSON.parse('{"label":"autobindings","permalink":"/blog/tags/autobindings","allTagsPath":"/blog/tags","count":2,"unlisted":false}')}}]);

View File

@ -1 +0,0 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[606],{2592:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/cwtch-stable/page/3","page":3,"postsPerPage":10,"totalPages":3,"totalCount":21,"previousPage":"/blog/tags/cwtch-stable/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]);

View File

@ -0,0 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[606],{2592:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/cwtch-stable/page/3","page":3,"postsPerPage":10,"totalPages":3,"totalCount":24,"previousPage":"/blog/tags/cwtch-stable/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[8392],{9610:s=>{s.exports=JSON.parse('{"label":"testing","permalink":"/blog/tags/testing","allTagsPath":"/blog/tags","count":2}')}}]);

View File

@ -0,0 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[8392],{9610:s=>{s.exports=JSON.parse('{"label":"testing","permalink":"/blog/tags/testing","allTagsPath":"/blog/tags","count":2,"unlisted":false}')}}]);

View File

@ -1 +0,0 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[1174],{3170:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/cwtch","page":1,"postsPerPage":10,"totalPages":3,"totalCount":21,"nextPage":"/blog/tags/cwtch/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]);

View File

@ -0,0 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[1174],{3170:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/cwtch","page":1,"postsPerPage":10,"totalPages":3,"totalCount":26,"nextPage":"/blog/tags/cwtch/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]);

View File

@ -0,0 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[4704],{4674:s=>{s.exports=JSON.parse('{"label":"cwtch","permalink":"/blog/tags/cwtch","allTagsPath":"/blog/tags","count":26,"unlisted":false}')}}]);

View File

@ -1 +0,0 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[4704],{4674:a=>{a.exports=JSON.parse('{"label":"cwtch","permalink":"/blog/tags/cwtch","allTagsPath":"/blog/tags","count":21}')}}]);

View File

@ -0,0 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[1772],{5658:(e,t,n)=>{n.d(t,{Z:()=>a});n(7294);var o=n(6905),i=n(5999),s=n(2503),r=n(5893);function a(e){let{className:t}=e;return(0,r.jsx)("main",{className:(0,o.Z)("container margin-vert--xl",t),children:(0,r.jsx)("div",{className:"row",children:(0,r.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,r.jsx)(s.Z,{as:"h1",className:"hero__title",children:(0,r.jsx)(i.Z,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,r.jsx)("p",{children:(0,r.jsx)(i.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,r.jsx)("p",{children:(0,r.jsx)(i.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}},1772:(e,t,n)=>{n.r(t),n.d(t,{default:()=>d});n(7294);var o=n(5999),i=n(1944),s=n(6040),r=n(5658),a=n(5893);function d(){const e=(0,o.I)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(i.d,{title:e}),(0,a.jsx)(s.Z,{children:(0,a.jsx)(r.Z,{})})]})}}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[9140],{2796:s=>{s.exports=JSON.parse('{"label":"security-handbook","permalink":"/blog/tags/security-handbook","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]);

View File

@ -1 +0,0 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[9140],{2796:a=>{a.exports=JSON.parse('{"label":"security-handbook","permalink":"/blog/tags/security-handbook","allTagsPath":"/blog/tags","count":1}')}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[962],{4871:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>d,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var s=t(5893),o=t(1151);const i={sidebar_position:3},r="UI columns",c={id:"settings/appearance/ui-columns",title:"UI columns",description:"1. Press the settings icon",source:"@site/docs/settings/appearance/ui-columns.md",sourceDirName:"settings/appearance",slug:"/settings/appearance/ui-columns",permalink:"/docs/settings/appearance/ui-columns",draft:!1,unlisted:!1,editUrl:"https://git.openprivacy.ca/cwtch.im/docs.cwtch.im/src/branch/staging/docs/settings/appearance/ui-columns.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Light/Dark and themes Breakdown",permalink:"/docs/settings/appearance/light-dark-mode"},next:{title:"Streamer/Presentation Mode",permalink:"/docs/settings/appearance/streamer-mode"}},a={},l=[];function u(e){const n={h1:"h1",li:"li",ol:"ol",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"ui-columns",children:"UI columns"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Press the settings icon"}),"\n",(0,s.jsx)(n.li,{children:"Click on single"}),"\n",(0,s.jsx)(n.li,{children:"Select the configuration of columns you want to use"}),"\n"]})]})}function d(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>r});var s=t(7294);const o={},i=s.createContext(o);function r(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[645],{1019:a=>{a.exports=JSON.parse('{"label":"acl","permalink":"/blog/tags/acl","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]);

View File

@ -1 +0,0 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[9667],{2686:a=>{a.exports=JSON.parse('{"label":"documentation","permalink":"/blog/tags/documentation","allTagsPath":"/blog/tags","count":1}')}}]);

View File

@ -0,0 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[9667],{2686:a=>{a.exports=JSON.parse('{"label":"documentation","permalink":"/blog/tags/documentation","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]);

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[8793],{4990:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/cwtch/page/2","page":2,"postsPerPage":10,"totalPages":3,"totalCount":26,"previousPage":"/blog/tags/cwtch","nextPage":"/blog/tags/cwtch/page/3","blogDescription":"Blog","blogTitle":"Blog"}')}}]);

View File

@ -1 +0,0 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[8793],{4990:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/cwtch/page/2","page":2,"postsPerPage":10,"totalPages":3,"totalCount":21,"previousPage":"/blog/tags/cwtch","nextPage":"/blog/tags/cwtch/page/3","blogDescription":"Blog","blogTitle":"Blog"}')}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More