{"action":"created","comment":{"url":"https://api.github.com/repos/EFForg/starttls-everywhere/pulls/comments/177908772","pull_request_review_id":107872270,"id":177908772,"diff_hunk":"@@ -1,62 +1,118 @@\n # Policy rule configuration format\n-The TLS policy file is a `json` file which conforms to the following specification. These fields are heavily inspired by the [MTA-STS policy file format](https://tools.ietf.org/html/draft-ietf-uta-mta-sts-14).\n \n-## Top-level fields\n+The TLS policy file is a `json` file which conforms to the following specification. These fields are draw inspiration from the [MTA-STS policy file format](https://tools.ietf.org/html/draft-ietf-uta-mta-sts-14) as well as [Chromium's HSTS Preload List](https://src.chromium.org/chrome/trunk/src/net/http/transport_security_state_static.json) (and the associated CA Pinning list).\n+The basic file format will be JSON. Example:\n+\n+```\n+{\n+  \"timestamp\": \"2014-06-06T14:30:16+00:00\",\n+  \"author\": \"Electronic Frontier Foundation https://eff.org\",\n+  \"expires\": \"2014-06-06T14:30:16+00:00\",\n+  \"pinsets\": {\n+    \"eff\": {\n+      \"static-spki-hashes\": [\n+        \"sha1/5R0zeLx7EWRxqw6HRlgCRxNLHDo=\",\n+        \"sha1/YlrkMlC6C4SJRZSVyRvnvoJ+8eM=\",\n+      ]\n+    }\n+   },\n+  \"policy-aliases\": {\n+    \"gmail\": {\n+      \"mode\": \"log-only\",\n+      \"report-uris\": [\"https://google.com/post/reports/here\"],\n+      \"mxs\": [\".mail.google.com\"],\n+    }\n+  },\n+  \"policies\": {\n+    \"yahoo.com\": {\n+      \"mode\": \"enforce\",\n+      \"mxs\": [\".yahoodns.net\"]\n+     },\n+    \"eff.org\": {\n+      \"mode\": \"enforce\",\n+      \"pin\": \"eff\",\n+      \"mxs\": [\".eff.org\"]\n+    },\n+    \"gmail.com\": {\n+      \"policy-alias\": \"gmail\"\n+    },\n+    \"example.com\": {\n+      \"mode\": \"log-only\",\n+      \"mta-sts\": true,\n+      \"mxs\": [\"mail.example.com\", \".example.net\"]\n+    },\n+  },\n+}\n+```\n+\n+At a high level, senders will expect the following for recipient domains:\n+ - 1. Email domain resolves to an MX hostname which matches an entry in `mxs`\n+ - 2. Provides a valid certificate. Validity means:\n+    - a. The CN or DNS entry under subjectAltName matches an appropriate hostname.\n+    - b. The certificate is unexpired.\n+    - c. There is a valid chain from the certificate to a root included in [Mozilla's trust store](https://www.mozilla.org/en-US/about/governance/policies/security-group/certs/included/) (available as [Debian package ca-certificates](https://packages.debian.org/sid/ca-certificates)).\n+    - d. If `pins` is set, then one of the `static_spki_hashes` SPKIs in the pinset is found in the chain.\n+ - 3. Successfully negotiates a TLS session.\n+    - Includes honoring `min-tls-version` field.\n+\n+A user of this file format may choose to override individual domain policies. For instance, the EFF might provide an overall configuration covering major mail providers, and another organization might produce an overlay for mail providers in a specific country.\n+\n+Before adding a policy to this list, we validate:\n+ - 1. The email domain conforms to the policy, as above.\n+ - 2. Any specified reporting endpoints via `report-uris` are active.\n+\n+Note that there is no inline signature field. The configuration file should be distributed with authentication using an offline signing key, generated using `gpg --clearsign`. Config-generator should validate the signature against a known GPG public key before extracting. The public key is part of the permanent system configuration, like the fetch URL.\n+\n+### Top-level fields\n #### expires\n-When this configuration file expires. Can be in epoch seconds or in UTC.\n+When this configuration file expires, in UTC. Can be in epoch seconds from 00:00:00 UTC on 1 January 1970, or a string `yyyy-MM-dd'T'HH:mm:ssZZZZ`. If the file has ceased being regularly updated for any reason, and the policy file has expired, the MTA should fall-back to opportunistic TLS for e-mail delivery, and the system operator should be alerted.\n \n #### timestamp\n-When this configuration file was distributed/fetched. Can be in epoch seconds or UTC.\n+When this configuration file was distributed/fetched, in UTC. Can be in epoch seconds from 00:00:00 UTC on 1 January 1970, or a string `yyyy-MM-dd'T'HH:mm:ssZZZZ`. This field will be monotonically increasing for every update to the policy file. When updating this policy file, should validate that the timestamp is greater than or equal to the existing one.\n+\n+#### policy-aliases\n+A mapping of alias names onto a policy. Domains in the `policies` field can refer to policies defined in this object.\n \n-#### tls-policies\n-A mapping of domains to policies.\n+#### policies\n+A mapping of mail domains (the part of an address after the \"@\") onto a \"policy\". Matching of mail domains is on an exact-match basis. For instance, `eff.org` would be listed separately from `lists.eff.org`. Fields in this policy specify security requirements that should be applied when connecting to any MTA server for a given mail domain. If the `mode` is `testing`, then the sender should not stop mail delivery on policy failures, but should produce logging information.\n \n-## Policy fields\n+#### pinsets\n+Maps a unique pinset name to a list of accepted pins. For a given pinset, a certificate is accepted if at least one of the `static_spki_hashes` SPKIs is found in the chain.\n+\n+### Pinset fields\n+#### static-spki-hashes\n+The set of allowed SPKIs hashes.\n+\n+### Policy fields\n Every field in `tls-policies` maps to a policy object. A policy object can have the following fields:\n \n+#### policy-alias\n+\n+If set, other fields are ignored. This value should be a key in the upper-level \"policy-aliases\" configuration object. The policy for this domain will be configured as the denoted policy in the \"policy-aliases\" object.\n+\n #### min-tls-version\n Default: `TLSv1.2`\n \n-The minimum TLS version expected from this domain.\n+The minimum TLS version expected from this domain. Sending mail to domains under this policy should fail if the sending MTA cannot negotiate a TLS version equal to or greater than the listed version. Valid values are `TLSv1`, `TLSv1.1`, and `TLSv1.2`.\n \n #### mode\n-Default: `testing`\n+Default: `testing` (required)\n \n Either `testing` or `enforce`. If `testing` is set, then any failure in TLS negotiation is logged and reported, but the message is sent over the insecure communication.\n \n-#### mxs\n-A list of domains that the receiver's certificates could be valid for.\n+#### mta-sts\n+Default: `false`\n \n-#### tls-report\n-An endpoint to report errors to if TLS negotiation fails (either due to a misconfiguration or man-in-the-middle).\n+If set, then senders should expect this recipient domain to support MTA-STS.\n \n-#### require-valid-certificate\n-Default: `false`\n+#### mxs\n \n-If set to true, checks to see the domain's certificate:\n- \n-1. Is valid for a matched entry in `mxs`\n-2. Has not expired\n-3. Has a valid chain to a root certificate in `ca-certificates`\n+A list of hostnames that the recipient email server's certificates could be valid for. If the server's certificate matches no entry in `mxs`, the MTA should fail delivery or log an advisory failure, according to `mode`. Entries in the `mxs` list can either be a suffix indicated by a leading dot `.example.net` or a fully qualified domain name `mail.example.com`. Arbitrarily deep subdomains can match a particular suffix. For instance, `mta7.am0.yahoodns.net` would match `.yahoodns.net`.\n \n-## Sample rules file\n+#### pin\n \n-```\n-{\n-    \"author\": \"Electronic Frontier Foundation\",\n-    \"comment\": \"Sample policy configuration file\",\n-    \"expires\": 1404677353,\n-    \"timestamp\": 1401093333,\n-    \"tls-policies\": {\n-        \".valid.example-recipient.com\": {\n-            \"min-tls-version\": \"TLSv1.1\",\n-            \"mode\": \"enforce\",\n-            \"mxs\": [\".valid.example-recipient.com\"],\n-            \"require-valid-certificate\": true,\n-            \"tls-report\": \"https://tls-rpt.example-recipient.org/api/report\"\n-        }\n-    }\n-}\n-```\n+Should match a key of `pinsets` in the higher-level config. For a given pinset, a certificate for this mail domain should be accepted if at least one of the `static_spki_hashes` SPKIs is found in the trust chain.\n \n+#### report-uris\n \n+Endpoints to report errors to if TLS negotiation fails according to a particular policy. Reports should be aggregated and sent in the format specified by TLSRPT. These URIs should be `https` endpoints, and aggregated reports should be `POST`ed to the specified URL.","path":"RULES.md","position":156,"original_position":156,"commit_id":"8fd41190487a853ff28ce6270e56308f60ae2b88","original_commit_id":"8fd41190487a853ff28ce6270e56308f60ae2b88","user":{"login":"jgillula","id":6627267,"avatar_url":"https://avatars0.githubusercontent.com/u/6627267?v=4","gravatar_id":"","url":"https://api.github.com/users/jgillula","html_url":"https://github.com/jgillula","followers_url":"https://api.github.com/users/jgillula/followers","following_url":"https://api.github.com/users/jgillula/following{/other_user}","gists_url":"https://api.github.com/users/jgillula/gists{/gist_id}","starred_url":"https://api.github.com/users/jgillula/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jgillula/subscriptions","organizations_url":"https://api.github.com/users/jgillula/orgs","repos_url":"https://api.github.com/users/jgillula/repos","events_url":"https://api.github.com/users/jgillula/events{/privacy}","received_events_url":"https://api.github.com/users/jgillula/received_events","type":"User","site_admin":false},"body":"TLSRPT allows for `mailto` reports. Is there any reason we shouldn't as well?","created_at":"2018-03-28T22:27:42Z","updated_at":"2018-03-28T22:28:00Z","html_url":"https://github.com/EFForg/starttls-everywhere/pull/42#discussion_r177908772","pull_request_url":"https://api.github.com/repos/EFForg/starttls-everywhere/pulls/42","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/EFForg/starttls-everywhere/pulls/comments/177908772"},"html":{"href":"https://github.com/EFForg/starttls-everywhere/pull/42#discussion_r177908772"},"pull_request":{"href":"https://api.github.com/repos/EFForg/starttls-everywhere/pulls/42"}}},"pull_request":{"url":"https://api.github.com/repos/EFForg/starttls-everywhere/pulls/42","id":176359256,"html_url":"https://github.com/EFForg/starttls-everywhere/pull/42","diff_url":"https://github.com/EFForg/starttls-everywhere/pull/42.diff","patch_url":"https://github.com/EFForg/starttls-everywhere/pull/42.patch","issue_url":"https://api.github.com/repos/EFForg/starttls-everywhere/issues/42","number":42,"state":"open","locked":false,"title":"Readme updates","user":{"login":"sydneyli","id":1813285,"avatar_url":"https://avatars3.githubusercontent.com/u/1813285?v=4","gravatar_id":"","url":"https://api.github.com/users/sydneyli","html_url":"https://github.com/sydneyli","followers_url":"https://api.github.com/users/sydneyli/followers","following_url":"https://api.github.com/users/sydneyli/following{/other_user}","gists_url":"https://api.github.com/users/sydneyli/gists{/gist_id}","starred_url":"https://api.github.com/users/sydneyli/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sydneyli/subscriptions","organizations_url":"https://api.github.com/users/sydneyli/orgs","repos_url":"https://api.github.com/users/sydneyli/repos","events_url":"https://api.github.com/users/sydneyli/events{/privacy}","received_events_url":"https://api.github.com/users/sydneyli/received_events","type":"User","site_admin":false},"body":"Updates to the README, reflecting new policy file changes, and updated information about the project. We may want to split the gigantic `README.md` into something more digestible in the future. This will serve a good basis for the documentation website.","created_at":"2018-03-21T00:39:09Z","updated_at":"2018-03-28T22:28:00Z","closed_at":null,"merged_at":null,"merge_commit_sha":"fb3924cce343dfbf3408ef9496a37eecdb0e922e","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/EFForg/starttls-everywhere/pulls/42/commits","review_comments_url":"https://api.github.com/repos/EFForg/starttls-everywhere/pulls/42/comments","review_comment_url":"https://api.github.com/repos/EFForg/starttls-everywhere/pulls/comments{/number}","comments_url":"https://api.github.com/repos/EFForg/starttls-everywhere/issues/42/comments","statuses_url":"https://api.github.com/repos/EFForg/starttls-everywhere/statuses/8fd41190487a853ff28ce6270e56308f60ae2b88","head":{"label":"sydneyli:readme-updates","ref":"readme-updates","sha":"8fd41190487a853ff28ce6270e56308f60ae2b88","user":{"login":"sydneyli","id":1813285,"avatar_url":"https://avatars3.githubusercontent.com/u/1813285?v=4","gravatar_id":"","url":"https://api.github.com/users/sydneyli","html_url":"https://github.com/sydneyli","followers_url":"https://api.github.com/users/sydneyli/followers","following_url":"https://api.github.com/users/sydneyli/following{/other_user}","gists_url":"https://api.github.com/users/sydneyli/gists{/gist_id}","starred_url":"https://api.github.com/users/sydneyli/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sydneyli/subscriptions","organizations_url":"https://api.github.com/users/sydneyli/orgs","repos_url":"https://api.github.com/users/sydneyli/repos","events_url":"https://api.github.com/users/sydneyli/events{/privacy}","received_events_url":"https://api.github.com/users/sydneyli/received_events","type":"User","site_admin":false},"repo":{"id":121811292,"name":"starttls-everywhere","full_name":"sydneyli/starttls-everywhere","owner":{"login":"sydneyli","id":1813285,"avatar_url":"https://avatars3.githubusercontent.com/u/1813285?v=4","gravatar_id":"","url":"https://api.github.com/users/sydneyli","html_url":"https://github.com/sydneyli","followers_url":"https://api.github.com/users/sydneyli/followers","following_url":"https://api.github.com/users/sydneyli/following{/other_user}","gists_url":"https://api.github.com/users/sydneyli/gists{/gist_id}","starred_url":"https://api.github.com/users/sydneyli/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sydneyli/subscriptions","organizations_url":"https://api.github.com/users/sydneyli/orgs","repos_url":"https://api.github.com/users/sydneyli/repos","events_url":"https://api.github.com/users/sydneyli/events{/privacy}","received_events_url":"https://api.github.com/users/sydneyli/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/sydneyli/starttls-everywhere","description":"A system for ensuring & authenticating STARTTLS encryption between mail servers","fork":true,"url":"https://api.github.com/repos/sydneyli/starttls-everywhere","forks_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/forks","keys_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/teams","hooks_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/hooks","issue_events_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/issues/events{/number}","events_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/events","assignees_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/assignees{/user}","branches_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/branches{/branch}","tags_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/tags","blobs_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/git/refs{/sha}","trees_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/statuses/{sha}","languages_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/languages","stargazers_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/stargazers","contributors_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/contributors","subscribers_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/subscribers","subscription_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/subscription","commits_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/commits{/sha}","git_commits_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/git/commits{/sha}","comments_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/comments{/number}","issue_comment_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/issues/comments{/number}","contents_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/contents/{+path}","compare_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/merges","archive_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/downloads","issues_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/issues{/number}","pulls_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/pulls{/number}","milestones_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/milestones{/number}","notifications_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/labels{/name}","releases_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/releases{/id}","deployments_url":"https://api.github.com/repos/sydneyli/starttls-everywhere/deployments","created_at":"2018-02-16T23:19:58Z","updated_at":"2018-03-21T00:43:06Z","pushed_at":"2018-03-28T07:09:06Z","git_url":"git://github.com/sydneyli/starttls-everywhere.git","ssh_url":"git@github.com:sydneyli/starttls-everywhere.git","clone_url":"https://github.com/sydneyli/starttls-everywhere.git","svn_url":"https://github.com/sydneyli/starttls-everywhere","homepage":null,"size":957,"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,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"EFForg:master","ref":"master","sha":"eed1c3f157378d362afcd3f4ea80fa876f9ee32c","user":{"login":"EFForg","id":2120271,"avatar_url":"https://avatars3.githubusercontent.com/u/2120271?v=4","gravatar_id":"","url":"https://api.github.com/users/EFForg","html_url":"https://github.com/EFForg","followers_url":"https://api.github.com/users/EFForg/followers","following_url":"https://api.github.com/users/EFForg/following{/other_user}","gists_url":"https://api.github.com/users/EFForg/gists{/gist_id}","starred_url":"https://api.github.com/users/EFForg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/EFForg/subscriptions","organizations_url":"https://api.github.com/users/EFForg/orgs","repos_url":"https://api.github.com/users/EFForg/repos","events_url":"https://api.github.com/users/EFForg/events{/privacy}","received_events_url":"https://api.github.com/users/EFForg/received_events","type":"Organization","site_admin":false},"repo":{"id":20764971,"name":"starttls-everywhere","full_name":"EFForg/starttls-everywhere","owner":{"login":"EFForg","id":2120271,"avatar_url":"https://avatars3.githubusercontent.com/u/2120271?v=4","gravatar_id":"","url":"https://api.github.com/users/EFForg","html_url":"https://github.com/EFForg","followers_url":"https://api.github.com/users/EFForg/followers","following_url":"https://api.github.com/users/EFForg/following{/other_user}","gists_url":"https://api.github.com/users/EFForg/gists{/gist_id}","starred_url":"https://api.github.com/users/EFForg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/EFForg/subscriptions","organizations_url":"https://api.github.com/users/EFForg/orgs","repos_url":"https://api.github.com/users/EFForg/repos","events_url":"https://api.github.com/users/EFForg/events{/privacy}","received_events_url":"https://api.github.com/users/EFForg/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/EFForg/starttls-everywhere","description":"A system for ensuring & authenticating STARTTLS encryption between mail servers","fork":false,"url":"https://api.github.com/repos/EFForg/starttls-everywhere","forks_url":"https://api.github.com/repos/EFForg/starttls-everywhere/forks","keys_url":"https://api.github.com/repos/EFForg/starttls-everywhere/keys{/key_id}","collaborators_url":"https://api.github.com/repos/EFForg/starttls-everywhere/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/EFForg/starttls-everywhere/teams","hooks_url":"https://api.github.com/repos/EFForg/starttls-everywhere/hooks","issue_events_url":"https://api.github.com/repos/EFForg/starttls-everywhere/issues/events{/number}","events_url":"https://api.github.com/repos/EFForg/starttls-everywhere/events","assignees_url":"https://api.github.com/repos/EFForg/starttls-everywhere/assignees{/user}","branches_url":"https://api.github.com/repos/EFForg/starttls-everywhere/branches{/branch}","tags_url":"https://api.github.com/repos/EFForg/starttls-everywhere/tags","blobs_url":"https://api.github.com/repos/EFForg/starttls-everywhere/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/EFForg/starttls-everywhere/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/EFForg/starttls-everywhere/git/refs{/sha}","trees_url":"https://api.github.com/repos/EFForg/starttls-everywhere/git/trees{/sha}","statuses_url":"https://api.github.com/repos/EFForg/starttls-everywhere/statuses/{sha}","languages_url":"https://api.github.com/repos/EFForg/starttls-everywhere/languages","stargazers_url":"https://api.github.com/repos/EFForg/starttls-everywhere/stargazers","contributors_url":"https://api.github.com/repos/EFForg/starttls-everywhere/contributors","subscribers_url":"https://api.github.com/repos/EFForg/starttls-everywhere/subscribers","subscription_url":"https://api.github.com/repos/EFForg/starttls-everywhere/subscription","commits_url":"https://api.github.com/repos/EFForg/starttls-everywhere/commits{/sha}","git_commits_url":"https://api.github.com/repos/EFForg/starttls-everywhere/git/commits{/sha}","comments_url":"https://api.github.com/repos/EFForg/starttls-everywhere/comments{/number}","issue_comment_url":"https://api.github.com/repos/EFForg/starttls-everywhere/issues/comments{/number}","contents_url":"https://api.github.com/repos/EFForg/starttls-everywhere/contents/{+path}","compare_url":"https://api.github.com/repos/EFForg/starttls-everywhere/compare/{base}...{head}","merges_url":"https://api.github.com/repos/EFForg/starttls-everywhere/merges","archive_url":"https://api.github.com/repos/EFForg/starttls-everywhere/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/EFForg/starttls-everywhere/downloads","issues_url":"https://api.github.com/repos/EFForg/starttls-everywhere/issues{/number}","pulls_url":"https://api.github.com/repos/EFForg/starttls-everywhere/pulls{/number}","milestones_url":"https://api.github.com/repos/EFForg/starttls-everywhere/milestones{/number}","notifications_url":"https://api.github.com/repos/EFForg/starttls-everywhere/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/EFForg/starttls-everywhere/labels{/name}","releases_url":"https://api.github.com/repos/EFForg/starttls-everywhere/releases{/id}","deployments_url":"https://api.github.com/repos/EFForg/starttls-everywhere/deployments","created_at":"2014-06-12T11:24:25Z","updated_at":"2018-03-17T11:26:25Z","pushed_at":"2018-03-28T15:03:13Z","git_url":"git://github.com/EFForg/starttls-everywhere.git","ssh_url":"git@github.com:EFForg/starttls-everywhere.git","clone_url":"https://github.com/EFForg/starttls-everywhere.git","svn_url":"https://github.com/EFForg/starttls-everywhere","homepage":null,"size":909,"stargazers_count":247,"watchers_count":247,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":25,"mirror_url":null,"archived":false,"open_issues_count":16,"license":null,"forks":25,"open_issues":16,"watchers":247,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/EFForg/starttls-everywhere/pulls/42"},"html":{"href":"https://github.com/EFForg/starttls-everywhere/pull/42"},"issue":{"href":"https://api.github.com/repos/EFForg/starttls-everywhere/issues/42"},"comments":{"href":"https://api.github.com/repos/EFForg/starttls-everywhere/issues/42/comments"},"review_comments":{"href":"https://api.github.com/repos/EFForg/starttls-everywhere/pulls/42/comments"},"review_comment":{"href":"https://api.github.com/repos/EFForg/starttls-everywhere/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/EFForg/starttls-everywhere/pulls/42/commits"},"statuses":{"href":"https://api.github.com/repos/EFForg/starttls-everywhere/statuses/8fd41190487a853ff28ce6270e56308f60ae2b88"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"jgillula"}}