Giter VIP home page Giter VIP logo

coyim's Introduction

CoyIM - a safe and secure chat client

Build Status Coverage Status Translation status Go Report Card

CoyIM is a chat client for the XMPP protocol. It is built upon https://github.com/agl/xmpp-client and https://github.com/coyim/otr3. It adds a graphical user interface and defaults to safe and secure options. Our ambition is that it should be possible for even the most high-risk people on the planet to safely use CoyIM, without having to make any configuration changes.

To do this, CoyIM has OTR enabled and uses Tor by default. Besides that, it will only use the Tor Onion Service for a known server and also uses TLS and TLS certificates to verify the connection - no configuration required. The implementation is written in the Go language, to avoid many common types of vulnerabilities that come from using unsafe languages.

We use Weblate (https://hosted.weblate.org/projects/coyim/) to help crowd-source translation.

Security warning

CoyIM is currently under active development. The code for our OTR implementation has been audited, with good results. You can find out more information on our website. However, the rest of CoyIM still has not received an audit. This is worth keeping in mind if you are using CoyIM for something sensitive.

Getting started

Using CoyIM is very simple: you just need to download the executable file from the project's home page and then run it.

If you are using Arch Linux, you can install CoyIM via the AUR.

When you first launch CoyIM, a wizard will appear. If you already have a Jabber client installed and configured for OTR encryption in your computer, you can use this wizard to import your account settings as well as your OTR keys, and your contacts' fingerprints. By importing them, you won't have to do anything else to use CoyIM.

If you don't import your account settings, keys and fingerprints through the wizard that opens at the first launch, you can still import them by going to Accounts -> Import at a later stage.

If the client you have been using so far is Pidgin, you will find the files you need to import in the .purple directory in your home.

If you want to know more about the features you will and will not find in CoyIM, read this page.

Building CoyIM

Please note: CoyIM requires Golang version 1.19 or higher to build. CoyIM also requires at least GTK+ version 3.12 or higher. The installation of this depends on your operating system:

Ubuntu:

sudo apt-get install gtk+3.0 libgtk-3-dev

MacOS:

brew install gnome-icon-theme
brew install gtk+3 gtk-mac-integration

In order to build CoyIM, you should check out the source code, and run:

make build

It might be possible to build CoyIM using go get but we currently do not support this method.

Contributing to CoyIM

We have instructions here on how you can get started contributing to CoyIM.

Reproducibility

CoyIM supports reproducible builds for Linux on AMD64. See REPRODUCIBILITY for instructions on how to build and verify these builds.

License

The CoyIM project and all source files licensed under the GPL version 3, unless otherwise noted.

coyim's People

Contributors

ageis avatar azlancpool avatar brl avatar claucece avatar dependabot[bot] avatar giovaneliberato avatar grayleonard avatar iapazmino avatar ivanjijon avatar jreyes33 avatar juniorz avatar maurovelasco avatar olabini avatar olabiniv2 avatar pedropalau avatar piratax007 avatar pixelrust avatar polariandev avatar reginazabo avatar rmendoza83 avatar sacurio avatar satta avatar silke avatar tcz001 avatar tdruiva avatar tuliocasagrande avatar unkaktus avatar varac avatar xmunoz avatar xsmurf avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

coyim's Issues

Security status/rating

In order to simplify the user interface, I've been thinking about whether we can in a simple way communicate how secure/safe/private the current conversation is. My proposal is that we calculate a number from 0 to 100, that is a combination of several different features, such as:

  • Is OTR used?
  • Which version of OTR?
  • Is encryption required?
  • Is the peer authenticated or not?
  • Is Tor used?
  • Is TLS used?
  • Is the crypto used to connect to the server forward secret and of high quality?
  • Is the TLS certificate valid?
  • Is the quality of the TLS certificate good?
  • Are you connecting to a Tor Hidden service?

There are probably some other things we can add here. But once we have this number we can do a few different things (and even offer different options)

  • We can display a smiley figure with a frown/smile that depends on how good the value is
  • We can display the number itself (people love gamification "see if you can get a rating of 100")
  • We can change the background color of each "message" to go from red to green depending on how safe the connection was when the message was sent/received

I kinda like the last one, because it's a very strong indicator. It won't work for red-green colorblind people, of course, but thinking about it this way might be helpful.

If we do this, we can also provide an explanation, if someone clicks on the number for example, we can do a drop down with
"For added security, install Tor - CoyIM will use Tor automatically once installed"
"For added security, consider moving your account to a server that provides better transport security, for example xyz.com, blah.com or somewhere.org"

Use Snap CI (and Docker) if we want to

We have access to Snap Docker Preview and we can use docker images to build and test:

sudo docker build -t twstrike/coyim ./ci/Dockerfile
sudo docker run --rm twstrike/coyim

coyim fails to build on Tails (due go version 1.0.2)

The golang verson available at debian is old (reason: http://blog.labix.org/2013/06/15/in-flight-deb-packages-of-go)

$ docker run -i -t debian:wheezy bash -c "DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y golang && go version"
go version go1.0.2

Installing a different go version on wheezy using godeb also fails (reason: http://stackoverflow.com/a/26845235)

$ docker run -i -t debian:wheezy bash -c "DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y golang git bzr && export GOPATH=/gopath && mkdir $GOPATH && go get github.com/niemeyer/godeb && $GOPATH/bin/godeb list"
error: Get https://code.google.com/p/go/wiki/Downloads: x509: certificate signed by unknown authority

We can instruct the user to install the testing version (similarly to pond install instructions) and it should work.

foo@tails $ apt-get install -y -t testing golang && go version
go version go1.4.2 linux/amd64

But go get still have problems to download packages from golang.org/x/. Replacing them by their github.com/golang/ counterparts fix the issue.

Related build https://travis-ci.org/twstrike/coyim/jobs/82831870

Ensure a JID can be Unicode

According to the spec:
A valid JID is a string of [UNICODE] code points, encoded using [UTF‑8],

AFAICT, this is not what our code is doing...

TLS handshake do not timeout

We noticed something weird today. coyim hanged during the Starting TLS handshake and did not time out.

We suspected something was wrong with my Tor, then we found this in the logs

Sep 22 10:20:39.000 [notice] Your system clock just jumped 2034 seconds forward; assuming established circuits no longer work.
Sep 22 10:22:53.000 [notice] Tried for 120 seconds to get a connection to [scrubbed]:5222. Giving up. (waiting for circuit)
Sep 22 10:22:59.000 [notice] No circuits are opened. Relaxed timeout for circuit 41 (a General-purpose client 3-hop circuit in s
tate doing handshakes with channel state open) to 139912ms. However, it appears the circuit has timed out anyway. 14 guards are
live.
Sep 22 10:23:00.000 [notice] Tor has not observed any network activity for the past 2181 seconds. Disabling circuit build timeou
t recording.
Sep 22 10:23:00.000 [notice] Our IP address has changed.  Rotating keys...
Sep 22 10:23:00.000 [notice] Tor now sees network activity. Restoring circuit build timeout recording. Network was down for 2181
 seconds during 1 circuit attempts.
Sep 22 10:23:01.000 [notice] Tor has successfully opened a circuit. Looks like client functionality is working.
Sep 22 10:23:01.000 [notice] Tor has successfully opened a circuit. Looks like client functionality is working.
Sep 22 12:41:57.000 [notice] Catching signal TERM, exiting cleanly.

The weirdness happened during the time in between the last two lines on the log.

After restarting Tor, everything worked fine.

We should at least timeout the connection when it takes too long to do the TLS handshake.

TLS Certificate verification

Including possibility of manually trusting a cert. These are the specific pieces of functionality I think we need:

  • Trusting the certificate temporarily
  • Setting for manual approval of everything
  • Show connection info per account, right click or something
  • Look at parents of certs
  • Save more than one valid cert
  • Pin certs
  • Recognize the google situation
  • Edit list of saved certs
  • Certs are saved per account

What should the default UI be?

What do we plan to have as the default UI: GUI or CLI?

We can use build tags to enable the alternative UI (or disable the default UI).

For instance, pond client defaults to GUI. If you want to build a CLI version, you can use the build tag nogui: go get -tags nogui github.com/agl/pond/client

Fail to send message after the other end closes the OTR channel

When you attempt to send a message after the other end has closed the OTR channel, you receive a cannot send message because secure conversation has finished error.

This is intended to protect us from accidentally sending a message through an unencrypted channel. The protocol says we should store the message for possible retransmission once when the channel is restored. Should we implement this? Where (client vs protocol)?

This is a very confusing moment, and an opportunity to improve the experience.

Personal information warner

Somehow warn the user when it's about to disclose personal information.

Does it mean we should trust personal information to the app?

Account setup wizard

At the moment, the only way to start a GUI instance is if you have a config file containing a saved password (on the file).

We need to have a "setup wizard" similarly the one existing in the CLI version. It would also be nice to have a simple version of an "account manager" screen. For now, it could be a simple form to edit the current account.

File transfer

The feature of file transfer is quite complicated, and we will implement it using several different issues, for implementing the different parts of XEPs we need - and also define the potential new standards we would need to support good encrypted support.
The issues tracking this work are:

  • #377 - Out of band transfers
  • #378 - Stream Initiation
  • #379 - File transfer profile for stream initiation
  • #380 - SOCKS5 Bytestreams
  • #381 - In-band bytestreams
  • #382 - Support transferring folders
  • #383 - Support encrypted transfers
  • #384 - Design the experience of file transfer

We will for the moment NOT implement Jingle support - it's a large, complicated beast, and since we are not planning on supporting audio or video, Jingle feels a bit like overkill.

For the encrypted data, we will in general derive the encryption key from the OTR extra symmetric key. We will likely not use the "usage" field of the extra symmetric key for anything else than the most basic tying things together.

Random connect times for each account

We should randomize the order and random delay between each account connecting to their servers, to minimize fingerprinting and leak-over attacks

Restarting the OTR channel after the other end closes it

Adium's UI does not allow you to restart the OTR channel after the other end terminates it unless you terminate the channel on your side.

I can think of 2 possible reasons for this:

  • Making sure all data structures are freed/wiped before starting another conversation
  • Making sure you will reveal the final MAC keys before you start a new conversation

We are currently doing this differently. Should we do not?

The second reason seems to be reasonable enough for me, but nothing prevents me from not ending the conversation on my side. Restarting the AKE will not wipe the the reveal MAC keys, and the final MAC keys will be revealed as soon as you send the next encrypted message. But again there's no guarantee this will happen.

I'm concerned about this being a responsibility of the client rather than the protocol. Having retransmission builtin the protocol (see #47) would move this responsibility to the protocol, but would not fix it.

xmpp-client has an OTRAutoTearDown config which seems to be used to address this issue.

Migrate to GTK+ 3

We are currently using a modified version of mattn/go-gtk which is GTK+ 2. That would be another open source contribution.

By the way, pond uses its own go-gtk which has been migrated to GTK+ 3.

Start thinking about user testing

I think we should start doing user testing soon. Maybe aim for the week of Oct 5, or Oct 12?
We should figure out what questions are most important for us to get answers too, and start thinking about how to find the right audience to ask. For technical users, we can ask TWers, but we should find at least 5 non-technical people that can help us with this as well. Let's coordinate with Bridget about how to get the most out of this.

Enable InstanceTag support

OTR3 is supporting InstanceTag for multi devices, but we also do some change on Client to make it possible

Improve test coverage

  • main 15.8% ->
  • xmpp 13.2% -> 19.9% -> 28.6% -> 32.9% -> 42.2% ->
  • session 0% ->
  • config 14.6% -> 14.1% ->
  • ui 55.9% ->

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.