Giter Site home page Giter Site logo

firstlookmedia / gpgsync Goto Github PK

View Code? Open in Web Editor NEW
343.0 16.0 30.0 1.29 MB

:lock: GPG Sync is designed to let users always have up-to-date public keys for other members of their organization

License: GNU General Public License v3.0

Shell 1.11% Python 95.19% Makefile 0.38% Batchfile 0.28% NSIS 3.04%
gpg gpg-sync pgp openpgp encrypted-email techie osx linux

gpgsync's Introduction

GPG Sync

GPG Sync

GPG Sync is designed to let users always have up-to-date OpenPGP public keys for other members of their organization.

If you're part of an organization that uses GPG internally you might notice that it doesn't scale well. New people join and create new keys and existing people revoke their old keys and transition to new ones. It quickly becomes unwieldy to ensure that everyone has a copy of everyone else's current key, and that old revoked keys get refreshed to prevent users from accidentally using them.

GPG Sync solves this problem by offloading the complexity of GPG to a single trusted person in your organization. As a member of an organization, you install GPG Sync on your computer, configure it with a few settings, and then you forget about it. GPG Sync takes care of everything else.

A single keylist is used by GPG Sync to keep keys in sync. This keylist must follow a specific JSON format, see our example for guidance on creating one for your organization if it does not already exist. GPG Sync complies with the in-progress Distributing OpenPGP Keys with Signed Keylist Subscriptions internet standard draft.

Learn More

To learn how GPG Sync works and how to use it, check out the Wiki.

Getting GPG Sync

To install GPG Sync, follow these instructions.

Important note about keyservers

By default, GPG Sync downloads PGP public keys from keys.openpgp.org, a modern abuse-resistent keyserver. (The old SKS keyserver pool is vulnerable to certificate flooding attacks, and it's based on unmaintained software that will likely never get fixed.)

For this reason, it's important that your authority key, as well as every key on your keylist, has a user ID that contains an email address and that all users must opt-in to allowing their email addresses on this keyserver. You can opt-in by uploading your public key here, requesting to verify each email address on it, and then clicking the links you receive in those verification emails.

If a member of your organization doesn't opt-in to allowing their email addresses on this keyserver, then when subscribers of your keylist refresh it, the public key that GPG Sync will import won't contain the information necessary to be able to send that member an encrypted email. GPG Sync still supports the legacy, vulnerable SKS keyserver network; this can be enabled in the advanced settings of each keylist.

Test Status

CircleCI

Screenshot

gpgsync's People

Contributors

come-maiz avatar huertanix avatar icco avatar jefforulez avatar micahflee avatar milesmcc avatar msheiny avatar samuelcouch avatar thisisparker 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

gpgsync's Issues

Use GnuPG 2.1's DIRMNGR instead of command line args to gpg2

Starting with GnuPG 2.1, a bunch of keyserver-related command line arguments (like --keyserver and --keyserver-options) are deprecated. This makes it difficult to specify a custom key server, specify an HPKS certificate, etc.

I keep getting inconsistent errors like:

gpg args ['/usr/bin/gpg2', '--batch', '--no-tty', '--keyserver', 'hkps://hkps.pool.sks-keyservers.net', '--keyserver-options', 'ca-cert-file=/usr/share/pgpsync/sks-keyservers.netCA.pem', '--recv-keys', b'927F419D7EC82C2F149C1BD1403C2657CD994F73']
stdout b''
stderr b"gpg: keyserver option 'ca-cert-file' is obsolete; please use 'hkp-cacert' in dirmngr.conf\ngpg: keyserver receive failed: No keyserver available\n"

In order to use dirmngr.conf it looks like I may need to do all of the gpg2 calls in a custom homedir rather than using the default homedir. Then, once I refresh public keys, export them from the custom homedir and import them into the default homedir. Unless there's a way to specify the location of the dirmngr.conf file as a gpg2 argument, but it looks like you can't.

Add options UI, option to disable checking for updates, and check for updates over Tor

At the moment there's only one option, Run PGP Sync automatically on login, and it the checkbox for it gets displayed at the bottom of the main window. I think we should create a separate dialog for options (or maybe keep it as a hidden part of the main window, with a button to show/hide options or something), and add a few more options.

Now that we have automatic updates (#17), I see a need for these three options:

  • Run PGP Sync automatically on login
  • Check for updates automatically (so, if for whatever reason, users can disable autoupdates)
  • Check for updates through SOCKS5 proxy (e.g. Tor)
    • SOCKS5 Host
    • SOCKS5 Port

I think some users would prefer software on their computer that automatically makes web requests to make the requests over Tor, so github doesn't know their IP address as they change networks, etc.

I'm not sure that I should set the 0.1.0 milestone for this one though, unless you want to implement this now @samuelcouch. I'd be fine with pushing this off to the next 0.1.1 release.

Configurable refresh period

Right now Refresher.run only executes once per 24 hours, it would be good to let this be configurable to the user -- defaulting to 24 hours.

App info

About PGP Sync menu item

  • App Name
  • Version
  • URLs

Debian packaging fails to build (Debian unstable)

I'm running the ./install/build_deb.sh and I get this error (Debian unstable, grsecurity kernel but I doubt that's related):

running build_scripts
creating build
creating build/scripts-3.5
copying and adjusting install/pgpsync -> build/scripts-3.5
changing mode of build/scripts-3.5/pgpsync from 644 to 755
dh_auto_test -O--buildsystem=pybuild
I: pybuild base:184: cd /home/user/src/pgpsync-master/deb_dist/pgpsync-0.1.0rc1/.pybuild/pythonX.Y_3.5/build; python3.5 -m unittest discover -v
pgpsync (unittest.loader._FailedTest) ... ERROR

ERROR: pgpsync (unittest.loader._FailedTest)

ImportError: Failed to import test module: pgpsync
Traceback (most recent call last):
File "/usr/lib/python3.5/unittest/loader.py", line 462, in _find_test_path
package = self._get_module_from_name(name)
File "/usr/lib/python3.5/unittest/loader.py", line 369, in _get_module_from_name
import(name)
File "/home/user/src/pgpsync-master/deb_dist/pgpsync-0.1.0rc1/.pybuild/pythonX.Y_3.5/build/pgpsync/init.py", line 2, in
from .pgpsync import *
File "/home/user/src/pgpsync-master/deb_dist/pgpsync-0.1.0rc1/.pybuild/pythonX.Y_3.5/build/pgpsync/pgpsync.py", line 3, in
from packaging.version import parse
ImportError: No module named 'packaging'


Ran 1 test in 0.000s

FAILED (errors=1)
E: pybuild pybuild:274: test: plugin distutils failed with: exit code=1: cd /home/user/src/pgpsync-master/deb_dist/pgpsync-0.1.0rc1/.pybuild/pythonX.Y_3.5/build; python3.5 -m unittest discover -v
dh_auto_test: pybuild --test -i python{version} -p 3.5 returned exit code 13
debian/rules:7: recipe for target 'build' failed
make: *** [build] Error 25
dpkg-buildpackage: error: debian/rules build gave error exit status 2
Traceback (most recent call last):
File "setup.py", line 44, in
(os.path.join(sys.prefix, 'share/pgpsync/'), share_files + ['install/pgpsync.desktop'])
File "/usr/lib/python3.5/distutils/core.py", line 148, in setup
dist.run_commands()
File "/usr/lib/python3.5/distutils/dist.py", line 955, in run_commands
self.run_command(cmd)
File "/usr/lib/python3.5/distutils/dist.py", line 974, in run_command
cmd_obj.run()
File "/usr/lib/python3/dist-packages/stdeb/command/bdist_deb.py", line 48, in run
util.process_command(syscmd,cwd=target_dirs[0])
File "/usr/lib/python3/dist-packages/stdeb/util.py", line 183, in process_command
check_call(args, cwd=cwd)
File "/usr/lib/python3/dist-packages/stdeb/util.py", line 46, in check_call
raise CalledProcessError(retcode)
stdeb.util.CalledProcessError: 2

Include fingerprints file for public testing

People might be interested in trying out GPG Sync before they're ready to actually set up the infrastructure themselves. For these people, README.md should include test endpoint settings for people to use. To make it simpler, I think the gpgsync repository should contain a simple fingerprints.txt.asc file with a few fingerprints in it, and instructions for how to use it.

Check for updates error message

When I merged #21, I went ahead and changed the URL for releases from the test repo to https://api.github.com/repos/firstlookmedia/pgpsync/releases/latest. Now when I open PGP Sync in OSX, it immediately throws this error:

screen shot 2016-06-27 at 5 14 11 pm

I wonder if this error should be more subtle? For example, I bet if you turn on your computer and haven't connected to wifi yet, that alert will pop up when PGP Sync automatically runs. I'm not sure how to make it more subtle -- perhaps adding a label to bottom of the main window that's hidden most of the time, but displays the error in red if it can't check for updates, and hides it again as soon as it successfully checks?

I also noticed that when I first run PGP Sync and this error pops up, the systray and main window get confused. The window is open, but the systray has the option to "Show PGP Sync" instead of hide. And when I click the X in the main window, it doesn't hide it (I think because it believes it's already hidden). I have to click the systray and choose "Show PGP Sync", then click again and choose "Hide PGP Sync" to hide the window.

.app crashes on OSX that doesn't have the development environment installed

From the OSX console:

2/16/16 4:01:14.537 PM PGP Sync[33272]: PGP Sync Error
2/16/16 4:01:14.537 PM PGP Sync[33272]: 2016-02-16 16:01:14.536 PGP Sync[33272:1485544] PGP Sync Error2/16/16 4:01:16.321 PM PGP Sync[33272]: Traceback (most recent call last):
2/16/16 4:01:16.321 PM PGP Sync[33272]:   File "/Users/joshua/Downloads/PGP Sync.app/Contents/Resources/__boot__.py", line 351, in 
2/16/16 4:01:16.321 PM PGP Sync[33272]:     _run()
2/16/16 4:01:16.321 PM PGP Sync[33272]:   File "/Users/joshua/Downloads/PGP Sync.app/Contents/Resources/__boot__.py", line 336, in _run
2/16/16 4:01:16.321 PM PGP Sync[33272]:     exec(compile(source, path, 'exec'), globals(), globals())
2/16/16 4:01:16.321 PM PGP Sync[33272]:   File "/Users/joshua/Downloads/PGP Sync.app/Contents/Resources/pgpsync", line 3, in 
2/16/16 4:01:16.322 PM PGP Sync[33272]:     import pgpsync
2/16/16 4:01:16.322 PM PGP Sync[33272]:   File "pgpsync/__init__.pyc", line 2, in 
2/16/16 4:01:16.322 PM PGP Sync[33272]:   File "pgpsync/pgpsync.pyc", line 4, in 
2/16/16 4:01:16.322 PM PGP Sync[33272]:   File "PyQt5/QtCore.pyc", line 14, in 
2/16/16 4:01:16.322 PM PGP Sync[33272]:   File "PyQt5/QtCore.pyc", line 10, in __load
2/16/16 4:01:16.322 PM PGP Sync[33272]:   File "imp.pyc", line 342, in load_dynamic
2/16/16 4:01:16.322 PM PGP Sync[33272]: ImportError: dlopen(/Users/joshua/Downloads/PGP Sync.app/Contents/Resources/lib/python3.5/lib-dynload/PyQt5/QtCore.so, 2): Library not loaded: @rpath/QtCore.framework/Versions/5/QtCore
2/16/16 4:01:16.322 PM PGP Sync[33272]:   Referenced from: /Users/joshua/Downloads/PGP Sync.app/Contents/Resources/lib/python3.5/lib-dynload/PyQt5/QtCore.so
2/16/16 4:01:16.322 PM PGP Sync[33272]:   Reason: image not found

last_checked should always be displayed to the user

The app looks for updates once per minute, but the messaging to the user only shows the last time there were updates.
screen shot 2016-07-05 at 12 58 32 pm

Last checked: 30 seconds ago
Last updated: 4 days ago

Might make things clearer that the app is still working.

Hide dock icon in OSX

Now that I've switched from py2app to PyInstaller (#2), the dock icon is displaying again. pyinstaller-osx.spec set LSUIElement to True in Info.plist, but it isn't working.

Unconfigured endpoints should not be synced

If you click "Add Endpoint" and then, before configuring it, click "Sync Now", it tries to sync the unconfigured endpoint and crashes with this error:

$ pgpsync                                                                                                                                                                                                       
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/pgpsync/pgpsync.py", line 293, in sync_all_endpoints
    self.toggle_input(False, "Syncing: {} {}".format(self.gpg.get_uid(r.e.fingerprint), common.fp_to_keyid(r.e.fingerprint).decode()))
  File "/usr/lib/python3/dist-packages/pgpsync/gnupg.py", line 119, in get_uid
    raise InvalidFingerprint(fp)
pgpsync.gnupg.InvalidFingerprint: b''

crash on keyserver error

this might be a dupe of issue #10, but i'm opening a new issue in case it's unrelated.

i've been running gpgsync from the command-line and got this crash output this morning:

It has been 0.25 hours since the last sync.
Fetching public key 0x9BB29FF9FD3ED09F First Look Authority
Downloading URL https://raw.githubusercontent.com/firstlookmedia/gpgsync-firstlook-fingerprints/master/fingerprints.txt
Downloading URL https://raw.githubusercontent.com/firstlookmedia/gpgsync-firstlook-fingerprints/master/fingerprints.txt.sig
Verifying signature
Validating fingerprints
Fetching public key 0xEABF89F4F1F0A6B4 Adam Pincus (Maisie the Dog) <[email protected]>
Fetching public key 0xBD5EF609E51DE8F5 Adam Weinstein <[email protected]>
Fetching public key 0xD0ADE81116D8C60F AJ Schnack <[email protected]>
Fetching public key 0xA72F3B3D3E45FD67 Akil Harris <[email protected]>
Fetching public key 0xAA924516F6DCEAF5 Alex Emmons <[email protected]>
Fetching public key 0x9663A6CF1D7541C5 Alice Speri <[email protected]>
Fetching public key 0x59379E23EA012B37 Alleen Brown <[email protected]>
Fetching public key 0x9F2E722783F41CED Allegra Denton <[email protected]>
Fetching public key 0xABF07AE900D23580 Alyssa Coppelman <[email protected]>
Fetching public key 0x4D629E7E3F008709 Andrea Jones <[email protected]>
Fetching public key 0x83D61C016FC994C1 Andrew Fishman <[email protected]>
Fetching public key 0x00AC0C344269F13F Andrew Hinderaker <[email protected]>
Fetching public key 0x5799496184D0AAB9 Andy Carvin <[email protected]>
Fetching public key 0xCD948BBF5EE4ABE9 Andy Gillette <[email protected]>
Fetching public key 0xAE448F97DB63F948 Anna Carolina Cardoso <[email protected]>
Traceback (most recent call last):
  File "gpgsync/endpoint.py", line 410, in run
  File "gpgsync/gnupg.py", line 123, in recv_key
gpgsync.gnupg.KeyserverError: hkps://hkps.pool.sks-keyservers.net
Abort trap: 6

Last updated time not always accurate

I haven't looked into this in detail yet, but I opened PGP Sync and it said, "Last updated: 1 hour ago", when I know that I hadn't actually last updated since yesterday. I'm also not certain, but it appears that last_checked gets set to the current timestamp when a sync fails sometimes, not only when it succeeds.

Sorry about the vagueness, I can spend more time trying to reproduce in detail soon.

Display less of the sync check counter

It's confusing that it checks to see if it should sync endpoints once per hour, even if the next sync won't be for many, many hours. I think this system works well to ensure that all endpoints get updated at least once per day, but maybe it should only display the "next sync check" based on when the actual endpoints were last checked.

For example, if these are the endpoints:

Endpoint 1 last updated: 5 hours ago
Endpoint 2 last updated: 20 hours ago

Right now it might say something like:

Next sync check: 4 minutes

But really it should say:

Next sync check: 4 hours, 4 minutes

Because that's the next time one of the endpoints will expire and it will actually sync something. Even though it might make sense to continue to check once per hour for expired endpoints.

Make .gpgsync non-binary/readable

This would allow a user to manually edit/configure their .pgpsync file. This would also allow us to distribute a default .pgpsync file internally with the FLM endpoint pre-configured. Would also help in debugging issues.

This could either be JSON or YAML I think .

Alert for expiring secret keys

Alert user when local private keys are about to expire.

gnupg.GnuPG should include support for gpg --list-secret-keys and gnupg.GnuPG._gpg will likely need to be rearchitect to make the --homedir flag optional to access the local homedir.

Lock sync_all_endpoints, so it doesn't run while syncing

There is a timer that runs sync_all_endpoints once per minute. If it triggers an actual sync, it might take more than one minute to complete. In case that happens, the next sync_all_endpoints should immediately return.

I'm not sure exactly if this causes a problem, but output ends up looking like this:

Syncing: Micah Lee <[email protected]> 0x403C2657CD994F73
Fetching public key 0x403C2657CD994F73
Syncing: Micah Lee <[email protected]> 0x403C2657CD994F73
Syncing complete.
Downloading URL https://micahflee.com/files/tmp/fingerprints.txt.asc
Verifying signature
Validating fingerprints
Fetching public key 0xEABF89F4F1F0A6B4
Fetching public key 0xBD5EF609E51DE8F5
Fetching public key 0xD0ADE81116D8C60F
Fetching public key 0xAA924516F6DCEAF5
Fetching public key 0x59379E23EA012B37
Fetching public key 0x4D629E7E3F008709
Fetching public key 0x83D61C016FC994C1
Fetching public key 0x5799496184D0AAB9
Fetching public key 0x706208410AE9A362
Fetching public key 0x93150AF0683FAEEE
Fetching public key 0x9214F5D0A5D8C204
Fetching public key 0xB4EB79814ACB7EBF
Fetching public key 0x55F5389B16EAFEDB
Fetching public key 0xDB692347930FC367
Fetching public key 0xF237F239219A5AB1
Fetching public key 0x1BA41B6FD115D439
Fetching public key 0x969F24F4C8092B47
Fetching public key 0x107F3B48AC647C0E
Fetching public key 0xB524CDEB5528528A
Fetching public key 0x2B27E8F5E9E1EF41
Fetching public key 0x882096E0F2FD3916
Fetching public key 0x58F50D5635FCDCF1
Fetching public key 0x808B3E4733291018
Fetching public key 0xEF93340E12EF5151
Fetching public key 0xE1C60D8712554E85
Fetching public key 0xE1AB54043B5F2CB0
Fetching public key 0xA4A928C769CD6E44
Fetching public key 0xEA82AE0D1DD10D96
Fetching public key 0x0D3ED23C1B19BCFA
Fetching public key 0x8974C685BA51BC9D
Fetching public key 0x76DCB6286C3A87CA
Fetching public key 0xFAB3D922893C1FF7
Fetching public key 0x9F904CC845AAB390
Fetching public key 0x7A00FC1BA6EB57F2
Fetching public key 0x74B52358F0DBCC19
Fetching public key 0x43E3727DA48C358A
Fetching public key 0x929705D3ED783DA6
Fetching public key 0xCB377EB6A498FCD3
Fetching public key 0x8AE3C609DC284680
Fetching public key 0xAE776C2860DA73D9
Fetching public key 0xB4FCBA35E4EF04EF
Fetching public key 0x8F15598B0F72930C
Fetching public key 0x7FF6D25F90CE47B7
Fetching public key 0xA3D917203E509809
Fetching public key 0x7614269BDDF73B36
Fetching public key 0xBEAC16CC3766D97C
Fetching public key 0x17CCF4C4218138E4
Fetching public key 0x656CF00A2551C040
Fetching public key 0x7BC67D29ED42B4F7
Fetching public key 0x1B65250D7E98DDE9
Fetching public key 0xB8CBD02CD7D51E78
Fetching public key 0xEFE3DFA25FCED907
Fetching public key 0xE3081EC02BA7FEFB
Fetching public key 0xBB58C7E5F9494209
Fetching public key 0x3AFD8BA1104FE12E
Fetching public key 0x78DA9953FAF59056
Fetching public key 0x950A7D6CFB5AF0A9
Fetching public key 0x4D1698454F69A0A8
Fetching public key 0x403C2657CD994F73
Fetching public key 0x9EE9C2008FF1E71E
Syncing: Micah Lee <[email protected]> 0x403C2657CD994F73
Fetching public key 0x0819F0FFFD4443DC
Syncing complete.
Fetching public key 0xBD5F592540B44416
Fetching public key 0x3EA8914C6790EAF1
Fetching public key 0xB99C7E7706068C48
Fetching public key 0x2198F5B7D4E5391A
Fetching public key 0xB402ED10424487A2
Fetching public key 0x2CB27535C8A54876
Fetching public key 0x8383CB44A9363692
Fetching public key 0x57480F6DED35CFEA
Fetching public key 0xEBDFCC539B524DC9
Fetching public key 0x25D47DD22B4A541E
Fetching public key 0xB709B967781BD8E2
Fetching public key 0x9821E4B00BF157E3
Fetching public key 0x8E9DDDC916C04FB2
Fetching public key 0x491BB5F19E418411
Fetching public key 0xF65AB28F06DF55A6
Fetching public key 0xA998423E21534D14
Fetching public key 0xA871C03EB3ECCA44
Fetching public key 0xCF487B718B060678
Fetching public key 0xC9761933DBEAAA25
Fetching public key 0x3C3DC92FA2B95B98
Fetching public key 0x91437C3FFD3EE3E1
Fetching public key 0x029FE0AEAED1EA5E
Fetching public key 0x7C4B980C737F6EF8
Fetching public key 0x66FA341DF8F2D1F1
Syncing complete.

Window in OSX is weird

When the window is not hidden, it doesn't show up on the doc or in the Apple-Tab menu, making it really hard to get to if you're switching tabs. And when you click the applet icon and choose "Show PGP Sync", it doesn't bring it to the front, which means it might show it behind another window.

Possible to modify fingerprint file in a way where it still verifies and fake data is processed

This issue is reported by @fowlslegs from Freedom of the Press Foundation (I gave them access to the code, but not to this repo, so he reported it a different private repo.)

Below is an example of a tampered with clearsigned fingerprints file that (i) when verified with GPG will return "Good signature" and pass the gpg.GnuPG.verify() method and (ii) when parsed by endpoint.Endpoint.get_fingerprint_list() will contain the appropriate headers to trick the method into thinking the actually signed content is the fake content injected above the real clearsigned text.

This attack relies on a MitM attack (which HTTPS would make harder) or some compromise of the server that would allow you to modify the file. This presents a serious reduction in the security model of gpgsync.

I highly recommend avoiding cleartext signatures altogether in favor of detached signatures because cleartext PGP signatures are notoriously tricky to process correctly. In fact in the gpg2 manual they write:

          Note: When verifying a cleartext signature, gpg verifies only what makes  up  the
          cleartext  signed  data and not any extra data outside of the cleartext signature
          or header lines following directly the dash marker line.  The option --output may
          be  used  to  write out the actual signed data; but there are other pitfalls with
          this format as well.  It is suggested to avoid cleartext signatures in  favor  of
          detached signatures.

gpg-sync could look in .sig automatically for the detached signature so you don't have to add any text to the UI/ make users fill out any additional fields and it's barely an extra work for the "techie" to make that extra file.

- -----BEGIN PGP SIGNED MESSAGE-----
# The bytes between these two fake headers will be the `content` parsed by the 
# `get_fingerprint_list` method.
<Some fake key w/ Michah's email as a uid>
<Another fake key w/ Morgan's email as a uid>
<etc.>

- -----BEGIN PGP SIGNATURE-----

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

# Micah Lee
927F 419D 7EC8 2C2F 149C  1BD1 403C 2657 CD99 4F73 # current
0B14 9192 9806 5962 5470  0155 FD72 0AD9 EBA3 4B1C # old, revoked

# TODO: add other keys

# First Look warrant canary key
91C0 C982 A41F 8D39 3953  1A71 FAB7 37F9 C5C1 CA80
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2

iQIcBAEBCAAGBQJXqr6bAAoJEMUm3S+zBq4t3RsP/3qCanP+hurMgSe5xxucEOJP
h2txu+87fow6h9rZsS5QZAK6+pJPSPf0gKramz9PeINe8/n64KOISJw+UsIt4hFM
NICy7IZsHBs1juS02A74XC1Q/SYzCbYKMjIQ6R3iVWJJVViqSc7b7OTZREQoZepa
vitMuP5LyBKQPgv1NsgvV93rxt614jbtBt9CeHr7Ag+RJYggYuFkNQ+FESh+IleC
ARGZ9cy0r+IHi15kympPc/vLq17vJ5PZRE1movo2YbkhcT6gttKicCbCOwF0sUrF
PNTKNpiG+Fq76PxMWr7qhRqRyZz7E9UfjnAoqKAXso3YojovwvlEE60PFlRx+R/E
IbyU6D3fOeHKckubVaJOz7Nc+9GuxXOSPhnWK4qJYze3EabomCpiSgvUWMm3vIln
ofsprMBy7eVdntAOdWUsHph3PRqBZ9uk275yPvov6GDxEQSa6J5xj4rOqE3uKVox
SWUKzDbQD5twPe5ScXbWvBy7sLuY5VDSQ77CT3MhZY0bLkZtyXpomX2EWHLQ3r9H
iHCejxpfRZBxVhnDaWSX5dbqnfbYYeFItIDPfyh4BGuoRAiu/eNCLT2LHt67qlOJ
Jfdfqof6ciQqzONfAp52n6QlvGv2KQS/g/fj69jauNsfq87P8mJ00pAmJTarSWWs
wtFq70um0a3Eirqqc/4E
=/5YL
-----END PGP SIGNATURE-----

See if GPG Sync can work with OSX sandboxing

Enabling sandboxing is a prerequisite for getting in the App Store. I'm pretty sure that it simply won't work with this project, not as long as we're subprocessing out to gpg. But it would be good to confirm, because turning on the sandbox would be great.

Relevant research:

If we could find a good python library that implements the OpenPGP spec, and can read/write to ~/.gnupg, and interface with key servers, we could use that instead executing gpg subprocesses. But it does seem not that likely.

Crash when deleting unconfigured endpoints

Steps to reproduce:

  • Open PGP Sync
  • Add an endpoint so it says "Not configured" but don't save
  • Add another endpoint so it also says "Not configured"
  • Select the first endpoint and click Delete

It crashes like this:

coloumb:~ jeffo$ /Applications/PGP\ Sync.app/Contents/MacOS/pgpsync 
Traceback (most recent call last):
 File "pgpsync/pgpsync.py", line 255, in delete_endpoint
 File "pgpsync/endpoint_selection.py", line 182, in delete_endpoint
 File "pgpsync/endpoint_selection.py", line 147, in delete_endpoint
AttributeError: 'NoneType' object has no attribute 'endpoint'
Abort trap: 6

I think that probably there's no need to ever have more than one unconfigured endpoint. Maybe if there's a single unconfigured endpoint, the "Add Endpoint" button should be disabled.

Verbose mode

Have a --verbose mode for running and debugging from the console.

Sync new endpoint on save

Sync the new endpoint immediately to give visual confirmation to the user that everything worked. Right now it waits until the next sync interval.

Connection error should be more useful

screen shot 2016-06-20 at 9 52 02 am

Right now the error message is ugly and generally not useful to the user if Tor is not running, misconfigured or otherwise can't connect through the specified proxy. Should make it a little more clear to check the above mentioned things.

Port from Python to JavaScript

I've been toying with the idea of porting the project from Python to JavaScript and build the app on electron. The upside of this would be making multiplatform support a lot simpler, https://github.com/electron-userland/electron-packager seems to be pretty robust and well maintained. I also think it would make fixing #7 really easy. The obvious downside is having to rewrite the existing codebase, but I don't imagine it would take too long.

Opening this issue to open the discussion and keep it contained in one place.

crash when fingerprints url is not found

$ /Applications/GPG\ Sync.app/Contents/MacOS/gpgsync
Syncing: First Look Authority 0x9BB29FF9FD3ED09F
It has been 0.25 hours since the last sync.
Fetching public key 0x9BB29FF9FD3ED09F First Look Authority
Downloading URL https://raw.githubusercontent.com/firstlookmedia/gpgsync-firstlook-fingerprints/master/fingerprints.txt.asc
Traceback (most recent call last):
File "gpgsync/endpoint.py", line 341, in run
AttributeError: 'Endpoint' object has no attribute 'sig_url'
Abort trap: 6

Update readme

I should thoroughly edit README.md to make sure that it's accurate, possibly include some screenshots, etc. I should also include a section to help people configure PGP Sync using Tor.

Automatic Update without 24hr Timer

The 24hr timer seems to lose track of itself sometimes. Two potential fixes:

  1. Create a shorter timer and compare against a last_update_check timestamp written to ~/.pgpsync to decide whether or not to check GH releases.
    • Adding an item to the settings we'll have to ensure that older versions don't break
  2. Check once per day at (or first-load-after) a predetermined time

Automatic Updates

Yesterday I spent looking in to mac app store options, most opinions pointed towards bundling as a .pkg and there being an avenue to publish that to the store. I was able to create a .pkg but noticed some weird things happening with the .app afterwards (this could be related to #15 (comment)).

Alternatively, I think an simpler approach to get to an initial release would be to just to use a system to tag new releases and prompt the user to download -> close -> relaunch. Since the repo is still private though, to avoid hard coding an access token for the GH API, we could host a version file and .zip elsewhere to compare against. Any thoughts on this?

Don't throw keyserver error if internet is disabled

Right now if GPG Sync tries to sync but fails because there's no network access, it changes the icon and reports that there's a keyserver error. But this isn't actually true, and makes it looks like something went wrong when most likely the user just wasn't connected to wifi.

Codesign release for OS X

In order to do this, First Look Media needs an Apple Developer account, which @jefforulez is working on. Then I just need to tweak build_osx.sh to include codesigning, and verify that it works.

Package 0.1.0-alpha

This is for me to create an alpha release for internal testing. The alpha release should include a hard-coded GitHub API token (with minimal permissions), since the repo won't be public yet.

Adding new settings option breaks app with an existing settings file

In the process of adding a new run_autoupdate settings option, the app crashed

File "~/flm/pgpsync/pgpsync/settings.py", line 21, in load
    self.run_autoupdate = self.settings['run_autoupdate']
KeyError: 'run_autoupdate'

Since we are only checking if os.path.isfile(self.settings_path): the program fails when an individual key doesn't exist.

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.