kopia lustrzana https://github.com/snarfed/bridgy-fed
				
				
				
			activitypub: implement HTTP Signatures using httpsig library
thanks @ahknight!pull/27/head
							rodzic
							
								
									2699de6903
								
							
						
					
					
						commit
						b123088158
					
				|  | @ -3,6 +3,7 @@ | |||
| bs4 | ||||
| feedparser | ||||
| granary>=1.8 | ||||
| httpsig | ||||
| mf2py>=1.0.4 | ||||
| mf2util>=0.5.0 | ||||
| mock | ||||
|  |  | |||
|  | @ -13,6 +13,7 @@ import urllib2 | |||
| from django_salmon import magicsigs, utils | ||||
| import feedparser | ||||
| from granary import atom, microformats2 | ||||
| from httpsig.sign import HeaderSigner | ||||
| import mf2py | ||||
| import mock | ||||
| from mock import call | ||||
|  | @ -105,9 +106,12 @@ class WebmentionTest(testutil.TestCase): | |||
|             ], | ||||
|         }, kwargs['json']) | ||||
| 
 | ||||
|         expected_headers = copy.copy(common.HEADERS) | ||||
|         expected_headers['Content-Type'] = activitypub.CONTENT_TYPE_AS | ||||
|         self.assertEqual(expected_headers, kwargs['headers']) | ||||
|         headers = kwargs['headers'] | ||||
|         self.assertEqual(activitypub.CONTENT_TYPE_AS, headers['Content-Type']) | ||||
| 
 | ||||
|         expected_key = MagicKey.get_by_id('a') | ||||
|         rsa_key = kwargs['auth'].header_signer._rsa._key | ||||
|         self.assertEqual(expected_key.private_pem(), rsa_key.exportKey()) | ||||
| 
 | ||||
|     def test_salmon(self, mock_get, mock_post): | ||||
|         orig_atom = requests_response("""\ | ||||
|  |  | |||
|  | @ -4,6 +4,7 @@ TODO tests: | |||
| * actor/attributedTo could be string URL | ||||
| * salmon rel via webfinger via author.name + domain | ||||
| """ | ||||
| import datetime | ||||
| import json | ||||
| import logging | ||||
| import urlparse | ||||
|  | @ -15,6 +16,7 @@ import django_salmon | |||
| from django_salmon import magicsigs, utils | ||||
| import feedparser | ||||
| from granary import atom, microformats2 | ||||
| from httpsig.requests_auth import HTTPSignatureAuth | ||||
| import mf2py | ||||
| import mf2util | ||||
| from oauth_dropins.webutil import util | ||||
|  | @ -93,10 +95,27 @@ class WebmentionHandler(webapp2.RequestHandler): | |||
|             source_obj['inReplyTo'], | ||||
|         ]) | ||||
| 
 | ||||
|         # deliver source object to target actor's inbox | ||||
|         # prepare HTTP Signature (required by Mastodon) | ||||
|         # https://w3c.github.io/activitypub/#authorization-lds | ||||
|         # https://tools.ietf.org/html/draft-cavage-http-signatures-07 | ||||
|         # https://github.com/tootsuite/mastodon/issues/4906#issuecomment-328844846 | ||||
|         source_domain = urlparse.urlparse(source).netloc | ||||
|         key = models.MagicKey.get_or_create(source_domain) | ||||
| 
 | ||||
|         acct = 'acct:me@%s' % source_domain | ||||
|         auth = HTTPSignatureAuth(secret=key.private_pem(), key_id=acct, | ||||
|                                  algorithm='rsa-sha256') | ||||
| 
 | ||||
|         # deliver source object to target actor's inbox. | ||||
|         headers = { | ||||
|             'Content-Type': activitypub.CONTENT_TYPE_AS, | ||||
|             # required for HTTP Signature | ||||
|             # https://tools.ietf.org/html/draft-cavage-http-signatures-07#section-2.1.3 | ||||
|             'Date': datetime.datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT'), | ||||
|         } | ||||
|         resp = common.requests_post( | ||||
|             urlparse.urljoin(target, inbox_url), json=source_obj, | ||||
|             headers={'Content-Type': activitypub.CONTENT_TYPE_AS}, log=True) | ||||
|             urlparse.urljoin(target, inbox_url), json=source_obj, auth=auth, | ||||
|             headers=headers, log=True) | ||||
| 
 | ||||
|     def send_salmon(self, source_obj, target_url=None, target_resp=None): | ||||
|         # fetch target HTML page, extract Atom rel-alternate link | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 Ryan Barrett
						Ryan Barrett