{"action":"created","comment":{"url":"https://api.github.com/repos/freedomofpress/securedrop/pulls/comments/304967813","pull_request_review_id":263719729,"id":304967813,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDMwNDk2NzgxMw==","diff_hunk":"@@ -3,8 +3,13 @@ Section: web\n Priority: optional\n Maintainer: SecureDrop Team <securedrop@freedom.press>\n Homepage: https://securedrop.org\n+Build-Depends: debhelper (>= 9), dh-python, python3-all, python3-setuptools, dh-virtualenv\n+Standards-Version: 3.9.8\n+X-Python3-Version: >= 3.5\n \n Package: securedrop-app-code\n Architecture: amd64\n-Depends: python-pip,apparmor-utils,gnupg2,haveged,python,secure-delete,sqlite3,${dist:Depends},libapache2-mod-wsgi,libapache2-mod-xsendfile,redis-server,supervisor,securedrop-keyring,securedrop-config,libpython2.7-dev\n+Conflicts: libapache2-mod-wsgi\n+Replaces: libapache2-mod-wsgi\n+Depends: ${python3:Depends},${misc:Depends},apache2,paxctld,apparmor-utils,gnupg2,haveged,secure-delete,sqlite3,${dist:Depends},libapache2-mod-xsendfile,redis-server,supervisor,securedrop-keyring,securedrop-config","path":"install_files/securedrop-app-code/debian/control","position":13,"original_position":13,"commit_id":"6467f2d26762ffeb9eeaf9d51229f099e599b43e","original_commit_id":"8a3932585071364314dd0b622caebcd503c2519f","user":{"login":"kushaldas","id":272303,"node_id":"MDQ6VXNlcjI3MjMwMw==","avatar_url":"https://avatars3.githubusercontent.com/u/272303?v=4","gravatar_id":"","url":"https://api.github.com/users/kushaldas","html_url":"https://github.com/kushaldas","followers_url":"https://api.github.com/users/kushaldas/followers","following_url":"https://api.github.com/users/kushaldas/following{/other_user}","gists_url":"https://api.github.com/users/kushaldas/gists{/gist_id}","starred_url":"https://api.github.com/users/kushaldas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kushaldas/subscriptions","organizations_url":"https://api.github.com/users/kushaldas/orgs","repos_url":"https://api.github.com/users/kushaldas/repos","events_url":"https://api.github.com/users/kushaldas/events{/privacy}","received_events_url":"https://api.github.com/users/kushaldas/received_events","type":"User","site_admin":false},"body":"Those are standard `Python3` and if we add anything special based on debian packaging guides.","created_at":"2019-07-18T15:03:49Z","updated_at":"2019-07-18T15:03:50Z","html_url":"https://github.com/freedomofpress/securedrop/pull/4622#discussion_r304967813","pull_request_url":"https://api.github.com/repos/freedomofpress/securedrop/pulls/4622","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/freedomofpress/securedrop/pulls/comments/304967813"},"html":{"href":"https://github.com/freedomofpress/securedrop/pull/4622#discussion_r304967813"},"pull_request":{"href":"https://api.github.com/repos/freedomofpress/securedrop/pulls/4622"}},"in_reply_to_id":304938742},"pull_request":{"url":"https://api.github.com/repos/freedomofpress/securedrop/pulls/4622","id":298620850,"node_id":"MDExOlB1bGxSZXF1ZXN0Mjk4NjIwODUw","html_url":"https://github.com/freedomofpress/securedrop/pull/4622","diff_url":"https://github.com/freedomofpress/securedrop/pull/4622.diff","patch_url":"https://github.com/freedomofpress/securedrop/pull/4622.patch","issue_url":"https://api.github.com/repos/freedomofpress/securedrop/issues/4622","number":4622,"state":"open","locked":false,"title":"Create securedrop-app-code package with dh-virtualenv and mod_wsgi","user":{"login":"rmol","id":47430598,"node_id":"MDQ6VXNlcjQ3NDMwNTk4","avatar_url":"https://avatars1.githubusercontent.com/u/47430598?v=4","gravatar_id":"","url":"https://api.github.com/users/rmol","html_url":"https://github.com/rmol","followers_url":"https://api.github.com/users/rmol/followers","following_url":"https://api.github.com/users/rmol/following{/other_user}","gists_url":"https://api.github.com/users/rmol/gists{/gist_id}","starred_url":"https://api.github.com/users/rmol/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rmol/subscriptions","organizations_url":"https://api.github.com/users/rmol/orgs","repos_url":"https://api.github.com/users/rmol/repos","events_url":"https://api.github.com/users/rmol/events{/privacy}","received_events_url":"https://api.github.com/users/rmol/received_events","type":"User","site_admin":false},"body":"## Status\r\n\r\nReady for review\r\n\r\n## Description of Changes\r\n\r\nBuilding on https://github.com/freedomofpress/securedrop/pull/4555, change the Debian packaging of `securedrop-app-code` to use dh-virtualenv, allowing us to embed mod_wsgi in the package.\r\n\r\nThis means we don't have to include wheels and pip install them during postinst. Not requiring `python3-pip`, which isn't available in the apt repositories in `/etc/apt/security.list`, means upgrading to Python 3 is going to be smoother.\r\n\r\nThe `securedrop-app-code` Debian package now Conflicts/Replaces `libapache2-mod-wsgi`, so that package will be removed when this new package is installed.\r\n\r\nThis requires updates to the builder Docker image, so I've made changes under molecule/builder-xenial to support building the Debian packages with a local image.\r\n\r\nFixes #4355 .\r\n\r\n## Testing\r\n\r\n### Building Debian packages\r\n\r\n- Check out this branch.\r\n- `cd molecule/builder-xenial`\r\n- `make build-container`\r\n\r\n   This will create a Docker image for building the new securedrop-app-code package. You will need to copy the image name from the last line of the output, e.g.:\r\n   ```\r\n   Successfully tagged quay.io/freedomofpress/sd-docker-builder-xenial:2019_07_16\r\n   ```\r\n- Then, to use this image when building the .debs, instead of pulling an image from quay.io based on the content of `molecule/builder-xenial/image_hash`, set the `BUILDER_IMAGE` environment variable:\r\n\r\n  `export BUILDER_IMAGE=\"quay.io/freedomofpress/sd-docker-builder-xenial:2019_07_16\"`\r\n- In the root of your securedrop working copy, run `make build-debs`. There should be no errors.\r\n\r\n### Upgrade testing\r\n\r\n- Create the upgrade test VMs with `make upgrade-start`. Near the end of the output you will find the source interface onion address, e.g.:\r\n   ```\r\n   TASK [Spit out tor details] ****************************************************\r\n    ok: [localhost] => {\r\n        \"msg\": \"Source interface available at ybbhys7etvuoig5l.onion\"\r\n    }\r\n   ```\r\n- Visit the source interface in the Tor browser to verify that it's working at version 0.14.0.\r\n- Log in to the upgrade app server with `molecule login -s upgrade -h app-staging`.\r\n- Get the journalist interface onion address: `sudo cat /var/lib/tor/services/journalist/hostname`\r\n- Add that address (prefixed with `HidServAuth`) to the `torrc` of your local system Tor or Tor Browser, and verify that the journalist interface is also working at 0.14.0.\r\n- Back on the upgrade app server, simulate an automatic nightly upgrade: `sudo cron-apt -i -s`\r\n- Check that all the SD packages are at `1.0.0~rc1` with `dpkg -l 'securedrop*'`:\r\n   ```\r\n   ii  securedrop-app-code                                1.0.0~rc1+xenial\r\n   ii  securedrop-config                                  0.1.3+1.0.0~rc1\r\n   ii  securedrop-grsec                                   4.4.182\r\n   ii  securedrop-keyring                                 0.1.3+1.0.0~rc1\r\n   ii  securedrop-ossec-agent                             3.0.0+1.0.0~rc1\r\n   un  securedrop-ossec-server                            <none>\r\n   ```\r\n- Confirm that `libapache2-mod-wsgi` was removed: `dpkg -l 'libapache2-mod-wsgi'` should show this:\r\n   ```\r\n   rc  libapache2-mod-wsgi                                4.3.0-1.1build1                amd64                          Python WSGI adapter module for Apache\r\n   ```\r\n- Verify that the source and journalist interfaces are still functioning and are now at version `1.0.0~rc1`.\r\n\r\n### Configuration testing\r\n\r\n- `make staging`\r\n- `molecule verify -s libvirt-staging-xenial`\r\n\r\n## Deployment\r\n\r\nWe intend for this change to be accomplished seamlessly in the automatic nightly updates. The content of the `securedrop-app-code` package is changing significantly, as instead of bundling wheels to be installed at the system level with `pip install`, we're moving all of our dependencies into a virtualenv, including mod_wsgi, which has previously been obtained via the system packages.\r\n\r\n## Checklist\r\n\r\n### If you made changes to the server application code:\r\n\r\n- [x] Linting (`make lint`) and tests (`make test`) pass in the development container\r\n\r\n### If you made changes to the system configuration:\r\n\r\n- [x] [Configuration tests](https://docs.securedrop.org/en/latest/development/testing_configuration_tests.html) pass\r\n\r\n### If you made non-trivial code changes:\r\n\r\n- [x] I have written a test plan and validated it for this PR\r\n","created_at":"2019-07-17T18:39:28Z","updated_at":"2019-07-18T15:03:50Z","closed_at":null,"merged_at":null,"merge_commit_sha":"91b73add0b4496e634603bec0b1ae5edf82379d3","assignee":null,"assignees":[],"requested_reviewers":[{"login":"conorsch","id":657862,"node_id":"MDQ6VXNlcjY1Nzg2Mg==","avatar_url":"https://avatars0.githubusercontent.com/u/657862?v=4","gravatar_id":"","url":"https://api.github.com/users/conorsch","html_url":"https://github.com/conorsch","followers_url":"https://api.github.com/users/conorsch/followers","following_url":"https://api.github.com/users/conorsch/following{/other_user}","gists_url":"https://api.github.com/users/conorsch/gists{/gist_id}","starred_url":"https://api.github.com/users/conorsch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/conorsch/subscriptions","organizations_url":"https://api.github.com/users/conorsch/orgs","repos_url":"https://api.github.com/users/conorsch/repos","events_url":"https://api.github.com/users/conorsch/events{/privacy}","received_events_url":"https://api.github.com/users/conorsch/received_events","type":"User","site_admin":false},{"login":"msheiny","id":1727935,"node_id":"MDQ6VXNlcjE3Mjc5MzU=","avatar_url":"https://avatars0.githubusercontent.com/u/1727935?v=4","gravatar_id":"","url":"https://api.github.com/users/msheiny","html_url":"https://github.com/msheiny","followers_url":"https://api.github.com/users/msheiny/followers","following_url":"https://api.github.com/users/msheiny/following{/other_user}","gists_url":"https://api.github.com/users/msheiny/gists{/gist_id}","starred_url":"https://api.github.com/users/msheiny/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/msheiny/subscriptions","organizations_url":"https://api.github.com/users/msheiny/orgs","repos_url":"https://api.github.com/users/msheiny/repos","events_url":"https://api.github.com/users/msheiny/events{/privacy}","received_events_url":"https://api.github.com/users/msheiny/received_events","type":"User","site_admin":false},{"login":"heartsucker","id":3998464,"node_id":"MDQ6VXNlcjM5OTg0NjQ=","avatar_url":"https://avatars0.githubusercontent.com/u/3998464?v=4","gravatar_id":"","url":"https://api.github.com/users/heartsucker","html_url":"https://github.com/heartsucker","followers_url":"https://api.github.com/users/heartsucker/followers","following_url":"https://api.github.com/users/heartsucker/following{/other_user}","gists_url":"https://api.github.com/users/heartsucker/gists{/gist_id}","starred_url":"https://api.github.com/users/heartsucker/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/heartsucker/subscriptions","organizations_url":"https://api.github.com/users/heartsucker/orgs","repos_url":"https://api.github.com/users/heartsucker/repos","events_url":"https://api.github.com/users/heartsucker/events{/privacy}","received_events_url":"https://api.github.com/users/heartsucker/received_events","type":"User","site_admin":false},{"login":"redshiftzero","id":7832803,"node_id":"MDQ6VXNlcjc4MzI4MDM=","avatar_url":"https://avatars3.githubusercontent.com/u/7832803?v=4","gravatar_id":"","url":"https://api.github.com/users/redshiftzero","html_url":"https://github.com/redshiftzero","followers_url":"https://api.github.com/users/redshiftzero/followers","following_url":"https://api.github.com/users/redshiftzero/following{/other_user}","gists_url":"https://api.github.com/users/redshiftzero/gists{/gist_id}","starred_url":"https://api.github.com/users/redshiftzero/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/redshiftzero/subscriptions","organizations_url":"https://api.github.com/users/redshiftzero/orgs","repos_url":"https://api.github.com/users/redshiftzero/repos","events_url":"https://api.github.com/users/redshiftzero/events{/privacy}","received_events_url":"https://api.github.com/users/redshiftzero/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/freedomofpress/securedrop/pulls/4622/commits","review_comments_url":"https://api.github.com/repos/freedomofpress/securedrop/pulls/4622/comments","review_comment_url":"https://api.github.com/repos/freedomofpress/securedrop/pulls/comments{/number}","comments_url":"https://api.github.com/repos/freedomofpress/securedrop/issues/4622/comments","statuses_url":"https://api.github.com/repos/freedomofpress/securedrop/statuses/6467f2d26762ffeb9eeaf9d51229f099e599b43e","head":{"label":"rmol:dh-virtualenv-mod-wsgi","ref":"dh-virtualenv-mod-wsgi","sha":"6467f2d26762ffeb9eeaf9d51229f099e599b43e","user":{"login":"rmol","id":47430598,"node_id":"MDQ6VXNlcjQ3NDMwNTk4","avatar_url":"https://avatars1.githubusercontent.com/u/47430598?v=4","gravatar_id":"","url":"https://api.github.com/users/rmol","html_url":"https://github.com/rmol","followers_url":"https://api.github.com/users/rmol/followers","following_url":"https://api.github.com/users/rmol/following{/other_user}","gists_url":"https://api.github.com/users/rmol/gists{/gist_id}","starred_url":"https://api.github.com/users/rmol/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rmol/subscriptions","organizations_url":"https://api.github.com/users/rmol/orgs","repos_url":"https://api.github.com/users/rmol/repos","events_url":"https://api.github.com/users/rmol/events{/privacy}","received_events_url":"https://api.github.com/users/rmol/received_events","type":"User","site_admin":false},"repo":{"id":170766323,"node_id":"MDEwOlJlcG9zaXRvcnkxNzA3NjYzMjM=","name":"securedrop","full_name":"rmol/securedrop","private":false,"owner":{"login":"rmol","id":47430598,"node_id":"MDQ6VXNlcjQ3NDMwNTk4","avatar_url":"https://avatars1.githubusercontent.com/u/47430598?v=4","gravatar_id":"","url":"https://api.github.com/users/rmol","html_url":"https://github.com/rmol","followers_url":"https://api.github.com/users/rmol/followers","following_url":"https://api.github.com/users/rmol/following{/other_user}","gists_url":"https://api.github.com/users/rmol/gists{/gist_id}","starred_url":"https://api.github.com/users/rmol/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rmol/subscriptions","organizations_url":"https://api.github.com/users/rmol/orgs","repos_url":"https://api.github.com/users/rmol/repos","events_url":"https://api.github.com/users/rmol/events{/privacy}","received_events_url":"https://api.github.com/users/rmol/received_events","type":"User","site_admin":false},"html_url":"https://github.com/rmol/securedrop","description":"GitHub repository for the SecureDrop whistleblower platform. Do not submit tips here!","fork":true,"url":"https://api.github.com/repos/rmol/securedrop","forks_url":"https://api.github.com/repos/rmol/securedrop/forks","keys_url":"https://api.github.com/repos/rmol/securedrop/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rmol/securedrop/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rmol/securedrop/teams","hooks_url":"https://api.github.com/repos/rmol/securedrop/hooks","issue_events_url":"https://api.github.com/repos/rmol/securedrop/issues/events{/number}","events_url":"https://api.github.com/repos/rmol/securedrop/events","assignees_url":"https://api.github.com/repos/rmol/securedrop/assignees{/user}","branches_url":"https://api.github.com/repos/rmol/securedrop/branches{/branch}","tags_url":"https://api.github.com/repos/rmol/securedrop/tags","blobs_url":"https://api.github.com/repos/rmol/securedrop/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rmol/securedrop/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rmol/securedrop/git/refs{/sha}","trees_url":"https://api.github.com/repos/rmol/securedrop/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rmol/securedrop/statuses/{sha}","languages_url":"https://api.github.com/repos/rmol/securedrop/languages","stargazers_url":"https://api.github.com/repos/rmol/securedrop/stargazers","contributors_url":"https://api.github.com/repos/rmol/securedrop/contributors","subscribers_url":"https://api.github.com/repos/rmol/securedrop/subscribers","subscription_url":"https://api.github.com/repos/rmol/securedrop/subscription","commits_url":"https://api.github.com/repos/rmol/securedrop/commits{/sha}","git_commits_url":"https://api.github.com/repos/rmol/securedrop/git/commits{/sha}","comments_url":"https://api.github.com/repos/rmol/securedrop/comments{/number}","issue_comment_url":"https://api.github.com/repos/rmol/securedrop/issues/comments{/number}","contents_url":"https://api.github.com/repos/rmol/securedrop/contents/{+path}","compare_url":"https://api.github.com/repos/rmol/securedrop/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rmol/securedrop/merges","archive_url":"https://api.github.com/repos/rmol/securedrop/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rmol/securedrop/downloads","issues_url":"https://api.github.com/repos/rmol/securedrop/issues{/number}","pulls_url":"https://api.github.com/repos/rmol/securedrop/pulls{/number}","milestones_url":"https://api.github.com/repos/rmol/securedrop/milestones{/number}","notifications_url":"https://api.github.com/repos/rmol/securedrop/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rmol/securedrop/labels{/name}","releases_url":"https://api.github.com/repos/rmol/securedrop/releases{/id}","deployments_url":"https://api.github.com/repos/rmol/securedrop/deployments","created_at":"2019-02-14T22:22:22Z","updated_at":"2019-07-17T18:48:01Z","pushed_at":"2019-07-18T14:15:37Z","git_url":"git://github.com/rmol/securedrop.git","ssh_url":"git@github.com:rmol/securedrop.git","clone_url":"https://github.com/rmol/securedrop.git","svn_url":"https://github.com/rmol/securedrop","homepage":"https://securedrop.org/","size":81172,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":0,"license":{"key":"agpl-3.0","name":"GNU Affero General Public License v3.0","spdx_id":"AGPL-3.0","url":"https://api.github.com/licenses/agpl-3.0","node_id":"MDc6TGljZW5zZTE="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"develop"}},"base":{"label":"freedomofpress:develop","ref":"develop","sha":"0dec74fa0313139f794ad6eafc0eb67ae64190c2","user":{"login":"freedomofpress","id":5388147,"node_id":"MDEyOk9yZ2FuaXphdGlvbjUzODgxNDc=","avatar_url":"https://avatars1.githubusercontent.com/u/5388147?v=4","gravatar_id":"","url":"https://api.github.com/users/freedomofpress","html_url":"https://github.com/freedomofpress","followers_url":"https://api.github.com/users/freedomofpress/followers","following_url":"https://api.github.com/users/freedomofpress/following{/other_user}","gists_url":"https://api.github.com/users/freedomofpress/gists{/gist_id}","starred_url":"https://api.github.com/users/freedomofpress/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/freedomofpress/subscriptions","organizations_url":"https://api.github.com/users/freedomofpress/orgs","repos_url":"https://api.github.com/users/freedomofpress/repos","events_url":"https://api.github.com/users/freedomofpress/events{/privacy}","received_events_url":"https://api.github.com/users/freedomofpress/received_events","type":"Organization","site_admin":false},"repo":{"id":3156820,"node_id":"MDEwOlJlcG9zaXRvcnkzMTU2ODIw","name":"securedrop","full_name":"freedomofpress/securedrop","private":false,"owner":{"login":"freedomofpress","id":5388147,"node_id":"MDEyOk9yZ2FuaXphdGlvbjUzODgxNDc=","avatar_url":"https://avatars1.githubusercontent.com/u/5388147?v=4","gravatar_id":"","url":"https://api.github.com/users/freedomofpress","html_url":"https://github.com/freedomofpress","followers_url":"https://api.github.com/users/freedomofpress/followers","following_url":"https://api.github.com/users/freedomofpress/following{/other_user}","gists_url":"https://api.github.com/users/freedomofpress/gists{/gist_id}","starred_url":"https://api.github.com/users/freedomofpress/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/freedomofpress/subscriptions","organizations_url":"https://api.github.com/users/freedomofpress/orgs","repos_url":"https://api.github.com/users/freedomofpress/repos","events_url":"https://api.github.com/users/freedomofpress/events{/privacy}","received_events_url":"https://api.github.com/users/freedomofpress/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/freedomofpress/securedrop","description":"GitHub repository for the SecureDrop whistleblower platform. Do not submit tips here!","fork":false,"url":"https://api.github.com/repos/freedomofpress/securedrop","forks_url":"https://api.github.com/repos/freedomofpress/securedrop/forks","keys_url":"https://api.github.com/repos/freedomofpress/securedrop/keys{/key_id}","collaborators_url":"https://api.github.com/repos/freedomofpress/securedrop/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/freedomofpress/securedrop/teams","hooks_url":"https://api.github.com/repos/freedomofpress/securedrop/hooks","issue_events_url":"https://api.github.com/repos/freedomofpress/securedrop/issues/events{/number}","events_url":"https://api.github.com/repos/freedomofpress/securedrop/events","assignees_url":"https://api.github.com/repos/freedomofpress/securedrop/assignees{/user}","branches_url":"https://api.github.com/repos/freedomofpress/securedrop/branches{/branch}","tags_url":"https://api.github.com/repos/freedomofpress/securedrop/tags","blobs_url":"https://api.github.com/repos/freedomofpress/securedrop/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/freedomofpress/securedrop/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/freedomofpress/securedrop/git/refs{/sha}","trees_url":"https://api.github.com/repos/freedomofpress/securedrop/git/trees{/sha}","statuses_url":"https://api.github.com/repos/freedomofpress/securedrop/statuses/{sha}","languages_url":"https://api.github.com/repos/freedomofpress/securedrop/languages","stargazers_url":"https://api.github.com/repos/freedomofpress/securedrop/stargazers","contributors_url":"https://api.github.com/repos/freedomofpress/securedrop/contributors","subscribers_url":"https://api.github.com/repos/freedomofpress/securedrop/subscribers","subscription_url":"https://api.github.com/repos/freedomofpress/securedrop/subscription","commits_url":"https://api.github.com/repos/freedomofpress/securedrop/commits{/sha}","git_commits_url":"https://api.github.com/repos/freedomofpress/securedrop/git/commits{/sha}","comments_url":"https://api.github.com/repos/freedomofpress/securedrop/comments{/number}","issue_comment_url":"https://api.github.com/repos/freedomofpress/securedrop/issues/comments{/number}","contents_url":"https://api.github.com/repos/freedomofpress/securedrop/contents/{+path}","compare_url":"https://api.github.com/repos/freedomofpress/securedrop/compare/{base}...{head}","merges_url":"https://api.github.com/repos/freedomofpress/securedrop/merges","archive_url":"https://api.github.com/repos/freedomofpress/securedrop/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/freedomofpress/securedrop/downloads","issues_url":"https://api.github.com/repos/freedomofpress/securedrop/issues{/number}","pulls_url":"https://api.github.com/repos/freedomofpress/securedrop/pulls{/number}","milestones_url":"https://api.github.com/repos/freedomofpress/securedrop/milestones{/number}","notifications_url":"https://api.github.com/repos/freedomofpress/securedrop/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/freedomofpress/securedrop/labels{/name}","releases_url":"https://api.github.com/repos/freedomofpress/securedrop/releases{/id}","deployments_url":"https://api.github.com/repos/freedomofpress/securedrop/deployments","created_at":"2012-01-11T19:57:55Z","updated_at":"2019-07-17T15:29:07Z","pushed_at":"2019-07-18T14:15:39Z","git_url":"git://github.com/freedomofpress/securedrop.git","ssh_url":"git@github.com:freedomofpress/securedrop.git","clone_url":"https://github.com/freedomofpress/securedrop.git","svn_url":"https://github.com/freedomofpress/securedrop","homepage":"https://securedrop.org/","size":81223,"stargazers_count":2679,"watchers_count":2679,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":564,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":470,"license":{"key":"agpl-3.0","name":"GNU Affero General Public License v3.0","spdx_id":"AGPL-3.0","url":"https://api.github.com/licenses/agpl-3.0","node_id":"MDc6TGljZW5zZTE="},"forks":564,"open_issues":470,"watchers":2679,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/freedomofpress/securedrop/pulls/4622"},"html":{"href":"https://github.com/freedomofpress/securedrop/pull/4622"},"issue":{"href":"https://api.github.com/repos/freedomofpress/securedrop/issues/4622"},"comments":{"href":"https://api.github.com/repos/freedomofpress/securedrop/issues/4622/comments"},"review_comments":{"href":"https://api.github.com/repos/freedomofpress/securedrop/pulls/4622/comments"},"review_comment":{"href":"https://api.github.com/repos/freedomofpress/securedrop/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/freedomofpress/securedrop/pulls/4622/commits"},"statuses":{"href":"https://api.github.com/repos/freedomofpress/securedrop/statuses/6467f2d26762ffeb9eeaf9d51229f099e599b43e"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"kushaldas"}}