mirror of https://gitlab.com/bashrc2/epicyon
				
				
				
			Faster checking for blocked domains
							parent
							
								
									71b5e1e57a
								
							
						
					
					
						commit
						36267ac5f4
					
				
							
								
								
									
										18
									
								
								blocking.py
								
								
								
								
							
							
						
						
									
										18
									
								
								blocking.py
								
								
								
								
							|  | @ -8,6 +8,7 @@ __status__="Production" | |||
| 
 | ||||
| import os | ||||
| from utils import isEvil | ||||
| from utils import evilIncarnate | ||||
| 
 | ||||
| def addGlobalBlock(baseDir: str, \ | ||||
|                    blockNickname: str,blockDomain: str) -> bool: | ||||
|  | @ -113,6 +114,23 @@ def isBlockedHashtag(baseDir: str,hashtag: str) -> bool: | |||
|             return True | ||||
|     return False | ||||
| 
 | ||||
| def getDomainBlocklist(baseDir: str) -> str: | ||||
|     """Returns all globally blocked domains as a string | ||||
|     This can be used for fast matching to mitigate flooding | ||||
|     """ | ||||
|     blockedStr='' | ||||
| 
 | ||||
|     evilDomains=evilIncarnate() | ||||
|     for evil in evilDomains: | ||||
|         blockedStr+=evil+'\n' | ||||
| 
 | ||||
|     globalBlockingFilename=baseDir+'/accounts/blocking.txt' | ||||
|     if not os.path.isfile(globalBlockingFilename): | ||||
|         return blockedStr | ||||
|     with open(globalBlockingFilename, 'r') as file: | ||||
|         blockedStr += file.read() | ||||
|     return blockedStr | ||||
| 
 | ||||
| def isBlockedDomain(baseDir: str,domain: str) -> bool: | ||||
|     """Is the given domain blocked? | ||||
|     """ | ||||
|  |  | |||
							
								
								
									
										25
									
								
								daemon.py
								
								
								
								
							
							
						
						
									
										25
									
								
								daemon.py
								
								
								
								
							|  | @ -107,6 +107,7 @@ from blocking import addGlobalBlock | |||
| from blocking import removeGlobalBlock | ||||
| from blocking import isBlockedHashtag | ||||
| from blocking import isBlockedDomain | ||||
| from blocking import getDomainBlocklist | ||||
| from config import setConfigParam | ||||
| from config import getConfigParam | ||||
| from roles import outboxDelegate | ||||
|  | @ -936,7 +937,14 @@ class PubServer(BaseHTTPRequestHandler): | |||
|         callingDomain=None | ||||
|         if self.headers.get('Host'): | ||||
|             callingDomain=self.headers['Host'] | ||||
|             if isBlockedDomain(self.server.baseDir,callingDomain): | ||||
| 
 | ||||
|             if self.server.blocklistUpdateCtr<=0: | ||||
|                 self.server.blocklistUpdateCtr=self.server.blocklistUpdateInterval | ||||
|                 self.server.domainBlocklist=getDomainBlocklist(self.server.baseDir) | ||||
| 
 | ||||
|             self.server.blocklistUpdateCtr-=1 | ||||
| 
 | ||||
|             if callingDomain in self.server.domainBlocklist: | ||||
|                 print('GET domain blocked: '+callingDomain) | ||||
|                 self._400() | ||||
|                 return | ||||
|  | @ -4381,7 +4389,14 @@ class PubServer(BaseHTTPRequestHandler): | |||
|         callingDomain=None | ||||
|         if self.headers.get('Host'): | ||||
|             callingDomain=self.headers['Host'] | ||||
|             if isBlockedDomain(self.server.baseDir,callingDomain): | ||||
| 
 | ||||
|             if self.server.blocklistUpdateCtr<=0: | ||||
|                 self.server.blocklistUpdateCtr=self.server.blocklistUpdateInterval | ||||
|                 self.server.domainBlocklist=getDomainBlocklist(self.server.baseDir) | ||||
| 
 | ||||
|             self.server.blocklistUpdateCtr-=1 | ||||
| 
 | ||||
|             if callingDomain in self.server.domainBlocklist: | ||||
|                 print('POST domain blocked: '+callingDomain) | ||||
|                 self._400() | ||||
|                 return | ||||
|  | @ -6194,6 +6209,12 @@ def runDaemon(blogsInstance: bool,mediaInstance: bool, \ | |||
|         print('ERROR: HTTP server failed to start. '+str(e)) | ||||
|         return False | ||||
| 
 | ||||
|     # This counter is used to update the list of blocked domains in memory. | ||||
|     # It helps to avoid touching the disk and so improves flooding resistance | ||||
|     httpd.blocklistUpdateCtr=0 | ||||
|     httpd.blocklistUpdateInterval=100 | ||||
|     httpd.domainBlocklist=getDomainBlocklist(baseDir) | ||||
| 
 | ||||
|     httpd.onionDomain=onionDomain | ||||
|     httpd.useBlurHash=useBlurHash | ||||
|     httpd.mediaInstance=mediaInstance | ||||
|  |  | |||
							
								
								
									
										5
									
								
								utils.py
								
								
								
								
							
							
						
						
									
										5
									
								
								utils.py
								
								
								
								
							|  | @ -93,12 +93,15 @@ def getStatusNumber() -> (str,str): | |||
|     published=currTime.strftime("%Y-%m-%dT%H:%M:%SZ") | ||||
|     return statusNumber,published | ||||
| 
 | ||||
| def evilIncarnate() -> []: | ||||
|     return ('gab.com','gabfed.com','spinster.xyz','kiwifarms.cc','djitter.com') | ||||
| 
 | ||||
| def isEvil(domain: str) -> bool: | ||||
|     if not isinstance(domain, str): | ||||
|         print('WARN: Malformed domain '+str(domain)) | ||||
|         return True | ||||
|     # https://www.youtube.com/watch?v=5qw1hcevmdU | ||||
|     evilDomains=('gab.com','gabfed.com','spinster.xyz','kiwifarms.cc','djitter.com') | ||||
|     evilDomains=evilIncarnate() | ||||
|     for concentratedEvil in evilDomains: | ||||
|         if domain.endswith(concentratedEvil): | ||||
|             return True | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue