mirror of https://gitlab.com/bashrc2/epicyon
Tidy moderator actions
parent
6b5b0ea16a
commit
c045406174
285
daemon.py
285
daemon.py
|
@ -1181,6 +1181,143 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
'/users/' + nickname + '/statuses/' + userEnding2[1]
|
'/users/' + nickname + '/statuses/' + userEnding2[1]
|
||||||
return locatePost(baseDir, nickname, domain, messageId), nickname
|
return locatePost(baseDir, nickname, domain, messageId), nickname
|
||||||
|
|
||||||
|
def _moderatorActions(self, path: str, callingDomain: str, cookie: str,
|
||||||
|
baseDir: str, httpPrefix: str,
|
||||||
|
domain: str, domainFull: str, port: int,
|
||||||
|
onionDomain: str, i2pDomain: str,
|
||||||
|
debug: bool):
|
||||||
|
"""Actions on the moderator screeen
|
||||||
|
"""
|
||||||
|
usersPath = path.replace('/moderationaction', '')
|
||||||
|
actorStr = httpPrefix + '://' + domainFull + usersPath
|
||||||
|
|
||||||
|
length = int(self.headers['Content-length'])
|
||||||
|
|
||||||
|
try:
|
||||||
|
moderationParams = self.rfile.read(length).decode('utf-8')
|
||||||
|
except SocketError as e:
|
||||||
|
if e.errno == errno.ECONNRESET:
|
||||||
|
print('WARN: POST moderationParams connection was reset')
|
||||||
|
else:
|
||||||
|
print('WARN: POST moderationParams ' +
|
||||||
|
'rfile.read socket error')
|
||||||
|
self.send_response(400)
|
||||||
|
self.end_headers()
|
||||||
|
self.server.POSTbusy = False
|
||||||
|
return
|
||||||
|
except ValueError as e:
|
||||||
|
print('ERROR: POST moderationParams rfile.read failed')
|
||||||
|
print(e)
|
||||||
|
self.send_response(400)
|
||||||
|
self.end_headers()
|
||||||
|
self.server.POSTbusy = False
|
||||||
|
return
|
||||||
|
|
||||||
|
if '&' in moderationParams:
|
||||||
|
moderationText = None
|
||||||
|
moderationButton = None
|
||||||
|
for moderationStr in moderationParams.split('&'):
|
||||||
|
if moderationStr.startswith('moderationAction'):
|
||||||
|
if '=' in moderationStr:
|
||||||
|
moderationText = \
|
||||||
|
moderationStr.split('=')[1].strip()
|
||||||
|
modText = moderationText.replace('+', ' ')
|
||||||
|
moderationText = \
|
||||||
|
urllib.parse.unquote_plus(modText.strip())
|
||||||
|
elif moderationStr.startswith('submitInfo'):
|
||||||
|
msg = htmlModerationInfo(self.server.translate,
|
||||||
|
baseDir, httpPrefix)
|
||||||
|
msg = msg.encode('utf-8')
|
||||||
|
self._login_headers('text/html',
|
||||||
|
len(msg), callingDomain)
|
||||||
|
self._write(msg)
|
||||||
|
self.server.POSTbusy = False
|
||||||
|
return
|
||||||
|
elif moderationStr.startswith('submitBlock'):
|
||||||
|
moderationButton = 'block'
|
||||||
|
elif moderationStr.startswith('submitUnblock'):
|
||||||
|
moderationButton = 'unblock'
|
||||||
|
elif moderationStr.startswith('submitSuspend'):
|
||||||
|
moderationButton = 'suspend'
|
||||||
|
elif moderationStr.startswith('submitUnsuspend'):
|
||||||
|
moderationButton = 'unsuspend'
|
||||||
|
elif moderationStr.startswith('submitRemove'):
|
||||||
|
moderationButton = 'remove'
|
||||||
|
if moderationButton and moderationText:
|
||||||
|
if debug:
|
||||||
|
print('moderationButton: ' + moderationButton)
|
||||||
|
print('moderationText: ' + moderationText)
|
||||||
|
nickname = moderationText
|
||||||
|
if nickname.startswith('http') or \
|
||||||
|
nickname.startswith('dat'):
|
||||||
|
nickname = getNicknameFromActor(nickname)
|
||||||
|
if '@' in nickname:
|
||||||
|
nickname = nickname.split('@')[0]
|
||||||
|
if moderationButton == 'suspend':
|
||||||
|
suspendAccount(baseDir, nickname, domain)
|
||||||
|
if moderationButton == 'unsuspend':
|
||||||
|
unsuspendAccount(baseDir, nickname)
|
||||||
|
if moderationButton == 'block':
|
||||||
|
fullBlockDomain = None
|
||||||
|
if moderationText.startswith('http') or \
|
||||||
|
moderationText.startswith('dat'):
|
||||||
|
blockDomain, blockPort = \
|
||||||
|
getDomainFromActor(moderationText)
|
||||||
|
fullBlockDomain = blockDomain
|
||||||
|
if blockPort:
|
||||||
|
if blockPort != 80 and blockPort != 443:
|
||||||
|
if ':' not in blockDomain:
|
||||||
|
fullBlockDomain = \
|
||||||
|
blockDomain + ':' + str(blockPort)
|
||||||
|
if '@' in moderationText:
|
||||||
|
fullBlockDomain = moderationText.split('@')[1]
|
||||||
|
if fullBlockDomain or nickname.startswith('#'):
|
||||||
|
addGlobalBlock(baseDir, nickname, fullBlockDomain)
|
||||||
|
if moderationButton == 'unblock':
|
||||||
|
fullBlockDomain = None
|
||||||
|
if moderationText.startswith('http') or \
|
||||||
|
moderationText.startswith('dat'):
|
||||||
|
blockDomain, blockPort = \
|
||||||
|
getDomainFromActor(moderationText)
|
||||||
|
fullBlockDomain = blockDomain
|
||||||
|
if blockPort:
|
||||||
|
if blockPort != 80 and blockPort != 443:
|
||||||
|
if ':' not in blockDomain:
|
||||||
|
fullBlockDomain = \
|
||||||
|
blockDomain + ':' + str(blockPort)
|
||||||
|
if '@' in moderationText:
|
||||||
|
fullBlockDomain = moderationText.split('@')[1]
|
||||||
|
if fullBlockDomain or nickname.startswith('#'):
|
||||||
|
removeGlobalBlock(baseDir, nickname, fullBlockDomain)
|
||||||
|
if moderationButton == 'remove':
|
||||||
|
if '/statuses/' not in moderationText:
|
||||||
|
removeAccount(baseDir, nickname, domain, port)
|
||||||
|
else:
|
||||||
|
# remove a post or thread
|
||||||
|
postFilename = \
|
||||||
|
locatePost(baseDir, nickname, domain,
|
||||||
|
moderationText)
|
||||||
|
if postFilename:
|
||||||
|
if canRemovePost(baseDir,
|
||||||
|
nickname,
|
||||||
|
domain,
|
||||||
|
port,
|
||||||
|
moderationText):
|
||||||
|
deletePost(baseDir,
|
||||||
|
httpPrefix,
|
||||||
|
nickname, domain,
|
||||||
|
postFilename,
|
||||||
|
debug,
|
||||||
|
self.server.recentPostsCache)
|
||||||
|
if callingDomain.endswith('.onion') and onionDomain:
|
||||||
|
actorStr = 'http://' + onionDomain + usersPath
|
||||||
|
elif (callingDomain.endswith('.i2p') and i2pDomain):
|
||||||
|
actorStr = 'http://' + i2pDomain + usersPath
|
||||||
|
self._redirect_headers(actorStr + '/moderation',
|
||||||
|
cookie, callingDomain)
|
||||||
|
self.server.POSTbusy = False
|
||||||
|
return
|
||||||
|
|
||||||
def _personOptions(self, path: str, callingDomain: str, cookie: str,
|
def _personOptions(self, path: str, callingDomain: str, cookie: str,
|
||||||
baseDir: str, httpPrefix: str,
|
baseDir: str, httpPrefix: str,
|
||||||
domain: str, domainFull: str, port: int,
|
domain: str, domainFull: str, port: int,
|
||||||
|
@ -8095,145 +8232,15 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
# moderator action buttons
|
# moderator action buttons
|
||||||
if authorized and '/users/' in self.path and \
|
if authorized and '/users/' in self.path and \
|
||||||
self.path.endswith('/moderationaction'):
|
self.path.endswith('/moderationaction'):
|
||||||
usersPath = self.path.replace('/moderationaction', '')
|
self._moderatorActions(self.path, callingDomain, cookie,
|
||||||
actorStr = \
|
self.server.baseDir,
|
||||||
self.server.httpPrefix + '://' + \
|
self.server.httpPrefix,
|
||||||
self.server.domainFull + usersPath
|
self.server.domain,
|
||||||
length = int(self.headers['Content-length'])
|
self.server.domainFull,
|
||||||
try:
|
self.server.port,
|
||||||
moderationParams = self.rfile.read(length).decode('utf-8')
|
self.server.onionDomain,
|
||||||
except SocketError as e:
|
self.server.i2pDomain,
|
||||||
if e.errno == errno.ECONNRESET:
|
self.server.debug)
|
||||||
print('WARN: POST moderationParams connection was reset')
|
|
||||||
else:
|
|
||||||
print('WARN: POST moderationParams ' +
|
|
||||||
'rfile.read socket error')
|
|
||||||
self.send_response(400)
|
|
||||||
self.end_headers()
|
|
||||||
self.server.POSTbusy = False
|
|
||||||
return
|
|
||||||
except ValueError as e:
|
|
||||||
print('ERROR: POST moderationParams rfile.read failed')
|
|
||||||
print(e)
|
|
||||||
self.send_response(400)
|
|
||||||
self.end_headers()
|
|
||||||
self.server.POSTbusy = False
|
|
||||||
return
|
|
||||||
if '&' in moderationParams:
|
|
||||||
moderationText = None
|
|
||||||
moderationButton = None
|
|
||||||
for moderationStr in moderationParams.split('&'):
|
|
||||||
if moderationStr.startswith('moderationAction'):
|
|
||||||
if '=' in moderationStr:
|
|
||||||
moderationText = \
|
|
||||||
moderationStr.split('=')[1].strip()
|
|
||||||
modText = moderationText.replace('+', ' ')
|
|
||||||
moderationText = \
|
|
||||||
urllib.parse.unquote_plus(modText.strip())
|
|
||||||
elif moderationStr.startswith('submitInfo'):
|
|
||||||
msg = htmlModerationInfo(self.server.translate,
|
|
||||||
self.server.baseDir,
|
|
||||||
self.server.httpPrefix)
|
|
||||||
msg = msg.encode('utf-8')
|
|
||||||
self._login_headers('text/html',
|
|
||||||
len(msg), callingDomain)
|
|
||||||
self._write(msg)
|
|
||||||
self.server.POSTbusy = False
|
|
||||||
return
|
|
||||||
elif moderationStr.startswith('submitBlock'):
|
|
||||||
moderationButton = 'block'
|
|
||||||
elif moderationStr.startswith('submitUnblock'):
|
|
||||||
moderationButton = 'unblock'
|
|
||||||
elif moderationStr.startswith('submitSuspend'):
|
|
||||||
moderationButton = 'suspend'
|
|
||||||
elif moderationStr.startswith('submitUnsuspend'):
|
|
||||||
moderationButton = 'unsuspend'
|
|
||||||
elif moderationStr.startswith('submitRemove'):
|
|
||||||
moderationButton = 'remove'
|
|
||||||
if moderationButton and moderationText:
|
|
||||||
if self.server.debug:
|
|
||||||
print('moderationButton: ' + moderationButton)
|
|
||||||
print('moderationText: ' + moderationText)
|
|
||||||
nickname = moderationText
|
|
||||||
if nickname.startswith('http') or \
|
|
||||||
nickname.startswith('dat'):
|
|
||||||
nickname = getNicknameFromActor(nickname)
|
|
||||||
if '@' in nickname:
|
|
||||||
nickname = nickname.split('@')[0]
|
|
||||||
if moderationButton == 'suspend':
|
|
||||||
suspendAccount(self.server.baseDir, nickname,
|
|
||||||
self.server.domain)
|
|
||||||
if moderationButton == 'unsuspend':
|
|
||||||
unsuspendAccount(self.server.baseDir, nickname)
|
|
||||||
if moderationButton == 'block':
|
|
||||||
fullBlockDomain = None
|
|
||||||
if moderationText.startswith('http') or \
|
|
||||||
moderationText.startswith('dat'):
|
|
||||||
blockDomain, blockPort = \
|
|
||||||
getDomainFromActor(moderationText)
|
|
||||||
fullBlockDomain = blockDomain
|
|
||||||
if blockPort:
|
|
||||||
if blockPort != 80 and blockPort != 443:
|
|
||||||
if ':' not in blockDomain:
|
|
||||||
fullBlockDomain = \
|
|
||||||
blockDomain + ':' + str(blockPort)
|
|
||||||
if '@' in moderationText:
|
|
||||||
fullBlockDomain = moderationText.split('@')[1]
|
|
||||||
if fullBlockDomain or nickname.startswith('#'):
|
|
||||||
addGlobalBlock(self.server.baseDir,
|
|
||||||
nickname, fullBlockDomain)
|
|
||||||
if moderationButton == 'unblock':
|
|
||||||
fullBlockDomain = None
|
|
||||||
if moderationText.startswith('http') or \
|
|
||||||
moderationText.startswith('dat'):
|
|
||||||
blockDomain, blockPort = \
|
|
||||||
getDomainFromActor(moderationText)
|
|
||||||
fullBlockDomain = blockDomain
|
|
||||||
if blockPort:
|
|
||||||
if blockPort != 80 and blockPort != 443:
|
|
||||||
if ':' not in blockDomain:
|
|
||||||
fullBlockDomain = \
|
|
||||||
blockDomain + ':' + str(blockPort)
|
|
||||||
if '@' in moderationText:
|
|
||||||
fullBlockDomain = moderationText.split('@')[1]
|
|
||||||
if fullBlockDomain or nickname.startswith('#'):
|
|
||||||
removeGlobalBlock(self.server.baseDir,
|
|
||||||
nickname, fullBlockDomain)
|
|
||||||
if moderationButton == 'remove':
|
|
||||||
if '/statuses/' not in moderationText:
|
|
||||||
removeAccount(self.server.baseDir,
|
|
||||||
nickname,
|
|
||||||
self.server.domain,
|
|
||||||
self.server.port)
|
|
||||||
else:
|
|
||||||
# remove a post or thread
|
|
||||||
postFilename = \
|
|
||||||
locatePost(self.server.baseDir,
|
|
||||||
nickname, self.server.domain,
|
|
||||||
moderationText)
|
|
||||||
if postFilename:
|
|
||||||
if canRemovePost(self.server.baseDir,
|
|
||||||
nickname,
|
|
||||||
self.server.domain,
|
|
||||||
self.server.port,
|
|
||||||
moderationText):
|
|
||||||
deletePost(self.server.baseDir,
|
|
||||||
self.server.httpPrefix,
|
|
||||||
nickname, self.server.domain,
|
|
||||||
postFilename,
|
|
||||||
self.server.debug,
|
|
||||||
self.server.recentPostsCache)
|
|
||||||
if callingDomain.endswith('.onion') and \
|
|
||||||
self.server.onionDomain:
|
|
||||||
actorStr = \
|
|
||||||
'http://' + self.server.onionDomain + usersPath
|
|
||||||
elif (callingDomain.endswith('.i2p') and
|
|
||||||
self.server.i2pDomain):
|
|
||||||
actorStr = \
|
|
||||||
'http://' + self.server.i2pDomain + usersPath
|
|
||||||
self._redirect_headers(actorStr + '/moderation',
|
|
||||||
cookie, callingDomain)
|
|
||||||
self.server.POSTbusy = False
|
|
||||||
return
|
return
|
||||||
|
|
||||||
self._benchmarkPOSTtimings(POSTstartTime, POSTtimings, 4)
|
self._benchmarkPOSTtimings(POSTstartTime, POSTtimings, 4)
|
||||||
|
|
Loading…
Reference in New Issue