forked from indymedia/epicyon
				
			c2s blocking
							parent
							
								
									c34c0a8d8b
								
							
						
					
					
						commit
						ce5488d9fd
					
				
							
								
								
									
										267
									
								
								blocking.py
								
								
								
								
							
							
						
						
									
										267
									
								
								blocking.py
								
								
								
								
							|  | @ -12,6 +12,8 @@ def addBlock(baseDir: str,nickname: str,domain: str, \ | ||||||
|              blockNickname: str,blockDomain: str) -> bool: |              blockNickname: str,blockDomain: str) -> bool: | ||||||
|     """Block the given account |     """Block the given account | ||||||
|     """ |     """ | ||||||
|  |     if ':' in domain: | ||||||
|  |         domain=domain.split(':')[0] | ||||||
|     blockingFilename=baseDir+'/accounts/'+nickname+'@'+domain+'/blocking.txt' |     blockingFilename=baseDir+'/accounts/'+nickname+'@'+domain+'/blocking.txt' | ||||||
|     blockHandle=blockNickName+'@'+blockDomain |     blockHandle=blockNickName+'@'+blockDomain | ||||||
|     if os.path.isfile(blockingFilename): |     if os.path.isfile(blockingFilename): | ||||||
|  | @ -26,6 +28,8 @@ def removeBlock(baseDir: str,nickname: str,domain: str, \ | ||||||
|                 unblockNickname: str,unblockDomain: str) -> bool: |                 unblockNickname: str,unblockDomain: str) -> bool: | ||||||
|     """Unblock the given account |     """Unblock the given account | ||||||
|     """ |     """ | ||||||
|  |     if ':' in domain: | ||||||
|  |         domain=domain.split(':')[0] | ||||||
|     unblockingFilename=baseDir+'/accounts/'+nickname+'@'+domain+'/blocking.txt' |     unblockingFilename=baseDir+'/accounts/'+nickname+'@'+domain+'/blocking.txt' | ||||||
|     unblockHandle=unblockNickName+'@'+unblockDomain |     unblockHandle=unblockNickName+'@'+unblockDomain | ||||||
|     if os.path.isfile(unblockingFilename): |     if os.path.isfile(unblockingFilename): | ||||||
|  | @ -52,3 +56,266 @@ def isBlocked(baseDir: str,nickname: str,domain: str, \ | ||||||
|             return True |             return True | ||||||
|     return False |     return False | ||||||
| 
 | 
 | ||||||
|  | def sendBlockViaServer(session,fromNickname: str,password: str, | ||||||
|  |                        fromDomain: str,fromPort: int, \ | ||||||
|  |                        httpPrefix: str,blockedUrl: str, \ | ||||||
|  |                        cachedWebfingers: {},personCache: {}, \ | ||||||
|  |                        debug: bool) -> {}: | ||||||
|  |     """Creates a block via c2s | ||||||
|  |     """ | ||||||
|  |     if not session: | ||||||
|  |         print('WARN: No session for sendBlockViaServer') | ||||||
|  |         return 6 | ||||||
|  | 
 | ||||||
|  |     fromDomainFull=fromDomain | ||||||
|  |     if fromPort!=80 and fromPort!=443: | ||||||
|  |         fromDomainFull=fromDomain+':'+str(fromPort) | ||||||
|  | 
 | ||||||
|  |     toUrl = 'https://www.w3.org/ns/activitystreams#Public' | ||||||
|  |     ccUrl = httpPrefix + '://'+fromDomainFull+'/users/'+fromNickname+'/followers' | ||||||
|  | 
 | ||||||
|  |     blockActor=httpPrefix+'://'+fromDomainFull+'/users/'+fromNickname | ||||||
|  |     newBlockJson = { | ||||||
|  |         'type': 'Block', | ||||||
|  |         'actor': blockActor, | ||||||
|  |         'object': blockedUrl, | ||||||
|  |         'to': [toUrl], | ||||||
|  |         'cc': [ccUrl] | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     handle=httpPrefix+'://'+fromDomainFull+'/@'+fromNickname | ||||||
|  | 
 | ||||||
|  |     # lookup the inbox for the To handle | ||||||
|  |     wfRequest = webfingerHandle(session,handle,httpPrefix,cachedWebfingers) | ||||||
|  |     if not wfRequest: | ||||||
|  |         if debug: | ||||||
|  |             print('DEBUG: announce webfinger failed for '+handle) | ||||||
|  |         return 1 | ||||||
|  | 
 | ||||||
|  |     postToBox='outbox' | ||||||
|  | 
 | ||||||
|  |     # get the actor inbox for the To handle | ||||||
|  |     inboxUrl,pubKeyId,pubKey,fromPersonId,sharedInbox,capabilityAcquisition = \ | ||||||
|  |         getPersonBox(session,wfRequest,personCache,postToBox) | ||||||
|  |                       | ||||||
|  |     if not inboxUrl: | ||||||
|  |         if debug: | ||||||
|  |             print('DEBUG: No '+postToBox+' was found for '+handle) | ||||||
|  |         return 3 | ||||||
|  |     if not fromPersonId: | ||||||
|  |         if debug: | ||||||
|  |             print('DEBUG: No actor was found for '+handle) | ||||||
|  |         return 4 | ||||||
|  |      | ||||||
|  |     authHeader=createBasicAuthHeader(fromNickname,password) | ||||||
|  |       | ||||||
|  |     headers = {'host': fromDomain, \ | ||||||
|  |                'Content-type': 'application/json', \ | ||||||
|  |                'Authorization': authHeader} | ||||||
|  |     postResult = \ | ||||||
|  |         postJson(session,newBlockJson,[],inboxUrl,headers,"inbox:write") | ||||||
|  |     #if not postResult: | ||||||
|  |     #    if debug: | ||||||
|  |     #        print('DEBUG: POST announce failed for c2s to '+inboxUrl) | ||||||
|  |     #    return 5 | ||||||
|  | 
 | ||||||
|  |     if debug: | ||||||
|  |         print('DEBUG: c2s POST block success') | ||||||
|  | 
 | ||||||
|  |     return newBlockJson | ||||||
|  | 
 | ||||||
|  | def sendUnblockViaServer(session,fromNickname: str,password: str, | ||||||
|  |                          fromDomain: str,fromPort: int, \ | ||||||
|  |                          httpPrefix: str,blockedUrl: str, \ | ||||||
|  |                          cachedWebfingers: {},personCache: {}, \ | ||||||
|  |                          debug: bool) -> {}: | ||||||
|  |     """Creates a block via c2s | ||||||
|  |     """ | ||||||
|  |     if not session: | ||||||
|  |         print('WARN: No session for sendBlockViaServer') | ||||||
|  |         return 6 | ||||||
|  | 
 | ||||||
|  |     fromDomainFull=fromDomain | ||||||
|  |     if fromPort!=80 and fromPort!=443: | ||||||
|  |         fromDomainFull=fromDomain+':'+str(fromPort) | ||||||
|  | 
 | ||||||
|  |     toUrl = 'https://www.w3.org/ns/activitystreams#Public' | ||||||
|  |     ccUrl = httpPrefix + '://'+fromDomainFull+'/users/'+fromNickname+'/followers' | ||||||
|  | 
 | ||||||
|  |     blockActor=httpPrefix+'://'+fromDomainFull+'/users/'+fromNickname | ||||||
|  |     newBlockJson = { | ||||||
|  |         'type': 'Undo', | ||||||
|  |         'actor': blockActor, | ||||||
|  |         'object': { | ||||||
|  |             'type': 'Block', | ||||||
|  |             'actor': blockActor, | ||||||
|  |             'object': blockedUrl, | ||||||
|  |             'to': [toUrl], | ||||||
|  |             'cc': [ccUrl] | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     handle=httpPrefix+'://'+fromDomainFull+'/@'+fromNickname | ||||||
|  | 
 | ||||||
|  |     # lookup the inbox for the To handle | ||||||
|  |     wfRequest = webfingerHandle(session,handle,httpPrefix,cachedWebfingers) | ||||||
|  |     if not wfRequest: | ||||||
|  |         if debug: | ||||||
|  |             print('DEBUG: announce webfinger failed for '+handle) | ||||||
|  |         return 1 | ||||||
|  | 
 | ||||||
|  |     postToBox='outbox' | ||||||
|  | 
 | ||||||
|  |     # get the actor inbox for the To handle | ||||||
|  |     inboxUrl,pubKeyId,pubKey,fromPersonId,sharedInbox,capabilityAcquisition = \ | ||||||
|  |         getPersonBox(session,wfRequest,personCache,postToBox) | ||||||
|  |                       | ||||||
|  |     if not inboxUrl: | ||||||
|  |         if debug: | ||||||
|  |             print('DEBUG: No '+postToBox+' was found for '+handle) | ||||||
|  |         return 3 | ||||||
|  |     if not fromPersonId: | ||||||
|  |         if debug: | ||||||
|  |             print('DEBUG: No actor was found for '+handle) | ||||||
|  |         return 4 | ||||||
|  |      | ||||||
|  |     authHeader=createBasicAuthHeader(fromNickname,password) | ||||||
|  |       | ||||||
|  |     headers = {'host': fromDomain, \ | ||||||
|  |                'Content-type': 'application/json', \ | ||||||
|  |                'Authorization': authHeader} | ||||||
|  |     postResult = \ | ||||||
|  |         postJson(session,newBlockJson,[],inboxUrl,headers,"inbox:write") | ||||||
|  |     #if not postResult: | ||||||
|  |     #    if debug: | ||||||
|  |     #        print('DEBUG: POST announce failed for c2s to '+inboxUrl) | ||||||
|  |     #    return 5 | ||||||
|  | 
 | ||||||
|  |     if debug: | ||||||
|  |         print('DEBUG: c2s POST block success') | ||||||
|  | 
 | ||||||
|  |     return newBlockJson | ||||||
|  | 
 | ||||||
|  | def outboxBlock(baseDir: str,httpPrefix: str, \ | ||||||
|  |                 nickname: str,domain: str,port: int, \ | ||||||
|  |                 messageJson: {},debug: bool) -> None: | ||||||
|  |     """ When a block request is received by the outbox from c2s | ||||||
|  |     """ | ||||||
|  |     if not messageJson.get('type'): | ||||||
|  |         if debug: | ||||||
|  |             print('DEBUG: block - no type') | ||||||
|  |         return | ||||||
|  |     if not messageJson['type']=='Block': | ||||||
|  |         if debug: | ||||||
|  |             print('DEBUG: not a block') | ||||||
|  |         return | ||||||
|  |     if not messageJson.get('object'): | ||||||
|  |         if debug: | ||||||
|  |             print('DEBUG: no object in block') | ||||||
|  |         return | ||||||
|  |     if not isinstance(messageJson['object'], str): | ||||||
|  |         if debug: | ||||||
|  |             print('DEBUG: block object is not string') | ||||||
|  |         return | ||||||
|  |     if debug: | ||||||
|  |         print('DEBUG: c2s block request arrived in outbox') | ||||||
|  | 
 | ||||||
|  |     messageId=messageJson['object'].replace('/activity','') | ||||||
|  |     if '/statuses/' not in messageId: | ||||||
|  |         if debug: | ||||||
|  |             print('DEBUG: c2s block object is not a status') | ||||||
|  |         return | ||||||
|  |     if '/users/' not in messageId: | ||||||
|  |         if debug: | ||||||
|  |             print('DEBUG: c2s block object has no nickname') | ||||||
|  |         return | ||||||
|  |     if ':' in domain: | ||||||
|  |         domain=domain.split(':')[0] | ||||||
|  |     postFilename=locatePost(baseDir,nickname,domain,messageId) | ||||||
|  |     if not postFilename: | ||||||
|  |         if debug: | ||||||
|  |             print('DEBUG: c2s block post not found in inbox or outbox') | ||||||
|  |             print(messageId) | ||||||
|  |         return True | ||||||
|  |     nicknameBlocked=getNicknameFromActor(messageJson['object']) | ||||||
|  |     domainBlocked,portBlocked=getDomainFromActor(messageJson['object']) | ||||||
|  |     domainBlockedFull=domainBlocked | ||||||
|  |     if portBlocked: | ||||||
|  |         if portBlocked!=80 and portBlocked!=443: | ||||||
|  |             domainBlockedFull=domainBlocked+':'+str(portBlocked) | ||||||
|  | 
 | ||||||
|  |     addBlock(baseDir,nickname,domain, \ | ||||||
|  |              nicknameBlocked,domainBlockedFull) | ||||||
|  |      | ||||||
|  |     if debug: | ||||||
|  |         print('DEBUG: post blocked via c2s - '+postFilename) | ||||||
|  | 
 | ||||||
|  | def outboxUndoBlock(baseDir: str,httpPrefix: str, \ | ||||||
|  |                     nickname: str,domain: str,port: int, \ | ||||||
|  |                     messageJson: {},debug: bool) -> None: | ||||||
|  |     """ When an undo block request is received by the outbox from c2s | ||||||
|  |     """ | ||||||
|  |     if not messageJson.get('type'): | ||||||
|  |         if debug: | ||||||
|  |             print('DEBUG: undo block - no type') | ||||||
|  |         return | ||||||
|  |     if not messageJson['type']=='undo': | ||||||
|  |         if debug: | ||||||
|  |             print('DEBUG: not an undo block') | ||||||
|  |         return | ||||||
|  |     if not messageJson.get('object'): | ||||||
|  |         if debug: | ||||||
|  |             print('DEBUG: no object in undo block') | ||||||
|  |         return | ||||||
|  |     if not isinstance(messageJson['object'], dict): | ||||||
|  |         if debug: | ||||||
|  |             print('DEBUG: undo block object is not string') | ||||||
|  |         return | ||||||
|  | 
 | ||||||
|  |     if not messageJson['object'].get('type'): | ||||||
|  |         if debug: | ||||||
|  |             print('DEBUG: undo block - no type') | ||||||
|  |         return | ||||||
|  |     if not messageJson['object']['type']=='Block': | ||||||
|  |         if debug: | ||||||
|  |             print('DEBUG: not an undo block') | ||||||
|  |         return | ||||||
|  |     if not messageJson['object'].get('object'): | ||||||
|  |         if debug: | ||||||
|  |             print('DEBUG: no object in undo block') | ||||||
|  |         return | ||||||
|  |     if not isinstance(messageJson['object']['object'], str): | ||||||
|  |         if debug: | ||||||
|  |             print('DEBUG: undo block object is not string') | ||||||
|  |         return | ||||||
|  |     if debug: | ||||||
|  |         print('DEBUG: c2s undo block request arrived in outbox') | ||||||
|  | 
 | ||||||
|  |     messageId=messageJson['object']['object'].replace('/activity','') | ||||||
|  |     if '/statuses/' not in messageId: | ||||||
|  |         if debug: | ||||||
|  |             print('DEBUG: c2s undo block object is not a status') | ||||||
|  |         return | ||||||
|  |     if '/users/' not in messageId: | ||||||
|  |         if debug: | ||||||
|  |             print('DEBUG: c2s undo block object has no nickname') | ||||||
|  |         return | ||||||
|  |     if ':' in domain: | ||||||
|  |         domain=domain.split(':')[0] | ||||||
|  |     postFilename=locatePost(baseDir,nickname,domain,messageId) | ||||||
|  |     if not postFilename: | ||||||
|  |         if debug: | ||||||
|  |             print('DEBUG: c2s undo block post not found in inbox or outbox') | ||||||
|  |             print(messageId) | ||||||
|  |         return True | ||||||
|  |     nicknameBlocked=getNicknameFromActor(messageJson['object']['object']) | ||||||
|  |     domainBlocked,portBlocked=getDomainFromActor(messageJson['object']['object']) | ||||||
|  |     domainBlockedFull=domainBlocked | ||||||
|  |     if portBlocked: | ||||||
|  |         if portBlocked!=80 and portBlocked!=443: | ||||||
|  |             domainBlockedFull=domainBlocked+':'+str(portBlocked) | ||||||
|  | 
 | ||||||
|  |     removeBlock(baseDir,nickname,domain, \ | ||||||
|  |                 nicknameBlocked,domainBlockedFull) | ||||||
|  |     if debug: | ||||||
|  |         print('DEBUG: post undo blocked via c2s - '+postFilename) | ||||||
|  |  | ||||||
							
								
								
									
										14
									
								
								daemon.py
								
								
								
								
							
							
						
						
									
										14
									
								
								daemon.py
								
								
								
								
							|  | @ -38,6 +38,8 @@ from media import createMediaDirs | ||||||
| from delete import outboxDelete | from delete import outboxDelete | ||||||
| from like import outboxLike | from like import outboxLike | ||||||
| from like import outboxUndoLike | from like import outboxUndoLike | ||||||
|  | from blocking import outboxBlock | ||||||
|  | from blocking import outboxUndoBlock | ||||||
| import os | import os | ||||||
| import sys | import sys | ||||||
| 
 | 
 | ||||||
|  | @ -223,6 +225,18 @@ class PubServer(BaseHTTPRequestHandler): | ||||||
|         outboxDelete(self.server.baseDir,self.server.httpPrefix, \ |         outboxDelete(self.server.baseDir,self.server.httpPrefix, \ | ||||||
|                      self.postToNickname,self.server.domain, \ |                      self.postToNickname,self.server.domain, \ | ||||||
|                      messageJson,self.server.debug) |                      messageJson,self.server.debug) | ||||||
|  |         if self.server.debug: | ||||||
|  |             print('DEBUG: handle block requests') | ||||||
|  |         outboxBlock(self.server.baseDir,self.server.httpPrefix, \ | ||||||
|  |                     self.postToNickname,self.server.domain, \ | ||||||
|  |                     self.server.port, | ||||||
|  |                     messageJson,self.server.debug) | ||||||
|  |         if self.server.debug: | ||||||
|  |             print('DEBUG: handle undo block requests') | ||||||
|  |         outboxUndoBlock(self.server.baseDir,self.server.httpPrefix, \ | ||||||
|  |                         self.postToNickname,self.server.domain, \ | ||||||
|  |                         self.server.port, | ||||||
|  |                         messageJson,self.server.debug) | ||||||
|         if self.server.debug: |         if self.server.debug: | ||||||
|             print('DEBUG: sending c2s post to named addresses') |             print('DEBUG: sending c2s post to named addresses') | ||||||
|             print('c2s sender: '+self.postToNickname+'@'+self.server.domain+':'+str(self.server.port)) |             print('c2s sender: '+self.postToNickname+'@'+self.server.domain+':'+str(self.server.port)) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue