mirror of https://gitlab.com/bashrc2/epicyon
Merge branch 'main' of gitlab.com:bashrc2/epicyon
commit
2ab7a4de99
69
daemon.py
69
daemon.py
|
@ -296,8 +296,8 @@ from utils import dangerousMarkup
|
||||||
from utils import refreshNewswire
|
from utils import refreshNewswire
|
||||||
from utils import isImageFile
|
from utils import isImageFile
|
||||||
from utils import hasGroupType
|
from utils import hasGroupType
|
||||||
from manualapprove import manualDenyFollowRequest
|
from manualapprove import manualDenyFollowRequestThread
|
||||||
from manualapprove import manualApproveFollowRequest
|
from manualapprove import manualApproveFollowRequestThread
|
||||||
from announce import createAnnounce
|
from announce import createAnnounce
|
||||||
from content import getPriceFromString
|
from content import getPriceFromString
|
||||||
from content import replaceEmojiFromTags
|
from content import replaceEmojiFromTags
|
||||||
|
@ -1235,6 +1235,37 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
self.server.CWlists,
|
self.server.CWlists,
|
||||||
self.server.listsEnabled)
|
self.server.listsEnabled)
|
||||||
|
|
||||||
|
def _getOutboxThreadIndex(self, nickname: str,
|
||||||
|
maxOutboxThreadsPerAccount: int) -> int:
|
||||||
|
"""Returns the outbox thread index for the given account
|
||||||
|
This is a ring buffer used to store the thread objects which
|
||||||
|
are sending out posts
|
||||||
|
"""
|
||||||
|
accountOutboxThreadName = nickname
|
||||||
|
if not accountOutboxThreadName:
|
||||||
|
accountOutboxThreadName = '*'
|
||||||
|
|
||||||
|
# create the buffer for the given account
|
||||||
|
if not self.server.outboxThread.get(accountOutboxThreadName):
|
||||||
|
self.server.outboxThread[accountOutboxThreadName] = \
|
||||||
|
[None] * maxOutboxThreadsPerAccount
|
||||||
|
self.server.outboxThreadIndex[accountOutboxThreadName] = 0
|
||||||
|
return 0
|
||||||
|
|
||||||
|
# increment the ring buffer index
|
||||||
|
index = self.server.outboxThreadIndex[accountOutboxThreadName] + 1
|
||||||
|
if index >= maxOutboxThreadsPerAccount:
|
||||||
|
index = 0
|
||||||
|
|
||||||
|
self.server.outboxThreadIndex[accountOutboxThreadName] = index
|
||||||
|
|
||||||
|
# remove any existing thread from the current index in the buffer
|
||||||
|
if self.server.outboxThread.get(accountOutboxThreadName):
|
||||||
|
acct = accountOutboxThreadName
|
||||||
|
if self.server.outboxThread[acct][index].is_alive():
|
||||||
|
self.server.outboxThread[acct][index].kill()
|
||||||
|
return index
|
||||||
|
|
||||||
def _postToOutboxThread(self, messageJson: {}) -> bool:
|
def _postToOutboxThread(self, messageJson: {}) -> bool:
|
||||||
"""Creates a thread to send a post
|
"""Creates a thread to send a post
|
||||||
"""
|
"""
|
||||||
|
@ -1242,24 +1273,18 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
if not accountOutboxThreadName:
|
if not accountOutboxThreadName:
|
||||||
accountOutboxThreadName = '*'
|
accountOutboxThreadName = '*'
|
||||||
|
|
||||||
if self.server.outboxThread.get(accountOutboxThreadName):
|
index = self._getOutboxThreadIndex(accountOutboxThreadName, 8)
|
||||||
print('Waiting for previous outbox thread to end')
|
|
||||||
waitCtr = 0
|
|
||||||
thName = accountOutboxThreadName
|
|
||||||
while self.server.outboxThread[thName].is_alive() and waitCtr < 8:
|
|
||||||
time.sleep(1)
|
|
||||||
waitCtr += 1
|
|
||||||
if waitCtr >= 8:
|
|
||||||
self.server.outboxThread[accountOutboxThreadName].kill()
|
|
||||||
|
|
||||||
print('Creating outbox thread')
|
print('Creating outbox thread ' +
|
||||||
self.server.outboxThread[accountOutboxThreadName] = \
|
accountOutboxThreadName + '/' +
|
||||||
|
str(self.server.outboxThreadIndex[accountOutboxThreadName]))
|
||||||
|
self.server.outboxThread[accountOutboxThreadName][index] = \
|
||||||
threadWithTrace(target=self._postToOutbox,
|
threadWithTrace(target=self._postToOutbox,
|
||||||
args=(messageJson.copy(),
|
args=(messageJson.copy(),
|
||||||
self.server.projectVersion, None),
|
self.server.projectVersion, None),
|
||||||
daemon=True)
|
daemon=True)
|
||||||
print('Starting outbox thread')
|
print('Starting outbox thread')
|
||||||
self.server.outboxThread[accountOutboxThreadName].start()
|
self.server.outboxThread[accountOutboxThreadName][index].start()
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def _updateInboxQueue(self, nickname: str, messageJson: {},
|
def _updateInboxQueue(self, nickname: str, messageJson: {},
|
||||||
|
@ -3497,7 +3522,7 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
shareActor = shareActor.split('&')[0]
|
shareActor = shareActor.split('&')[0]
|
||||||
adminNickname = getConfigParam(baseDir, 'admin')
|
adminNickname = getConfigParam(baseDir, 'admin')
|
||||||
adminActor = \
|
adminActor = \
|
||||||
localActorUrl(httpPrefix, domainFull, adminNickname)
|
localActorUrl(httpPrefix, adminNickname, domainFull)
|
||||||
actor = originPathStr
|
actor = originPathStr
|
||||||
actorNickname = getNicknameFromActor(actor)
|
actorNickname = getNicknameFromActor(actor)
|
||||||
if actor == shareActor or actor == adminActor or \
|
if actor == shareActor or actor == adminActor or \
|
||||||
|
@ -3564,7 +3589,7 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
shareActor = shareActor.split('&')[0]
|
shareActor = shareActor.split('&')[0]
|
||||||
adminNickname = getConfigParam(baseDir, 'admin')
|
adminNickname = getConfigParam(baseDir, 'admin')
|
||||||
adminActor = \
|
adminActor = \
|
||||||
localActorUrl(httpPrefix, domainFull, adminNickname)
|
localActorUrl(httpPrefix, adminNickname, domainFull)
|
||||||
actor = originPathStr
|
actor = originPathStr
|
||||||
actorNickname = getNicknameFromActor(actor)
|
actorNickname = getNicknameFromActor(actor)
|
||||||
if actor == shareActor or actor == adminActor or \
|
if actor == shareActor or actor == adminActor or \
|
||||||
|
@ -6930,7 +6955,8 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
del self.server.iconsCache['repeat.png']
|
del self.server.iconsCache['repeat.png']
|
||||||
|
|
||||||
# send out the announce within a separate thread
|
# send out the announce within a separate thread
|
||||||
self._postToOutboxThread(announceJson)
|
self._postToOutbox(announceJson,
|
||||||
|
self.server.projectVersion, self.postToNickname)
|
||||||
|
|
||||||
fitnessPerformance(GETstartTime, self.server.fitness,
|
fitnessPerformance(GETstartTime, self.server.fitness,
|
||||||
'_GET', '_announceButton postToOutboxThread',
|
'_GET', '_announceButton postToOutboxThread',
|
||||||
|
@ -7088,7 +7114,9 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
nickname, domain, postFilename,
|
nickname, domain, postFilename,
|
||||||
debug, recentPostsCache)
|
debug, recentPostsCache)
|
||||||
|
|
||||||
self._postToOutboxThread(newUndoAnnounce)
|
self._postToOutbox(newUndoAnnounce,
|
||||||
|
self.server.projectVersion, self.postToNickname)
|
||||||
|
|
||||||
self.server.GETbusy = False
|
self.server.GETbusy = False
|
||||||
actorAbsolute = self._getInstanceUrl(callingDomain) + actor
|
actorAbsolute = self._getInstanceUrl(callingDomain) + actor
|
||||||
actorPathStr = \
|
actorPathStr = \
|
||||||
|
@ -7126,7 +7154,7 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
self._404()
|
self._404()
|
||||||
self.server.GETbusy = False
|
self.server.GETbusy = False
|
||||||
return
|
return
|
||||||
manualApproveFollowRequest(self.server.session,
|
manualApproveFollowRequestThread(self.server.session,
|
||||||
baseDir, httpPrefix,
|
baseDir, httpPrefix,
|
||||||
followerNickname,
|
followerNickname,
|
||||||
domain, port,
|
domain, port,
|
||||||
|
@ -7284,7 +7312,7 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
followingHandle = \
|
followingHandle = \
|
||||||
handleNickname + '@' + getFullDomain(handleDomain, handlePort)
|
handleNickname + '@' + getFullDomain(handleDomain, handlePort)
|
||||||
if '@' in followingHandle:
|
if '@' in followingHandle:
|
||||||
manualDenyFollowRequest(self.server.session,
|
manualDenyFollowRequestThread(self.server.session,
|
||||||
baseDir, httpPrefix,
|
baseDir, httpPrefix,
|
||||||
followerNickname,
|
followerNickname,
|
||||||
domain, port,
|
domain, port,
|
||||||
|
@ -17197,6 +17225,7 @@ def runDaemon(listsEnabled: str,
|
||||||
httpd.registration = False
|
httpd.registration = False
|
||||||
httpd.enableSharedInbox = enableSharedInbox
|
httpd.enableSharedInbox = enableSharedInbox
|
||||||
httpd.outboxThread = {}
|
httpd.outboxThread = {}
|
||||||
|
httpd.outboxThreadIndex = {}
|
||||||
httpd.newPostThread = {}
|
httpd.newPostThread = {}
|
||||||
httpd.projectVersion = projectVersion
|
httpd.projectVersion = projectVersion
|
||||||
httpd.secureMode = secureMode
|
httpd.secureMode = secureMode
|
||||||
|
|
2
inbox.py
2
inbox.py
|
@ -172,7 +172,7 @@ def _updateCachedHashtagSwarm(baseDir: str, nickname: str, domain: str,
|
||||||
else:
|
else:
|
||||||
print('WARN: no modified date for ' + str(lastModified))
|
print('WARN: no modified date for ' + str(lastModified))
|
||||||
if saveSwarm:
|
if saveSwarm:
|
||||||
actor = localActorUrl(httpPrefix, domainFull, nickname)
|
actor = localActorUrl(httpPrefix, nickname, domainFull)
|
||||||
newSwarmStr = htmlHashTagSwarm(baseDir, actor, translate)
|
newSwarmStr = htmlHashTagSwarm(baseDir, actor, translate)
|
||||||
if newSwarmStr:
|
if newSwarmStr:
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -16,6 +16,7 @@ from utils import removeDomainPort
|
||||||
from utils import getPortFromDomain
|
from utils import getPortFromDomain
|
||||||
from utils import getUserPaths
|
from utils import getUserPaths
|
||||||
from utils import acctDir
|
from utils import acctDir
|
||||||
|
from threads import threadWithTrace
|
||||||
|
|
||||||
|
|
||||||
def manualDenyFollowRequest(session, baseDir: str,
|
def manualDenyFollowRequest(session, baseDir: str,
|
||||||
|
@ -67,6 +68,35 @@ def manualDenyFollowRequest(session, baseDir: str,
|
||||||
print('Follow request from ' + denyHandle + ' was denied.')
|
print('Follow request from ' + denyHandle + ' was denied.')
|
||||||
|
|
||||||
|
|
||||||
|
def manualDenyFollowRequestThread(session, baseDir: str,
|
||||||
|
httpPrefix: str,
|
||||||
|
nickname: str, domain: str, port: int,
|
||||||
|
denyHandle: str,
|
||||||
|
federationList: [],
|
||||||
|
sendThreads: [], postLog: [],
|
||||||
|
cachedWebfingers: {}, personCache: {},
|
||||||
|
debug: bool,
|
||||||
|
projectVersion: str,
|
||||||
|
signingPrivateKeyPem: str) -> None:
|
||||||
|
"""Manually deny a follow request, within a thread so that the
|
||||||
|
user interface doesn't lag
|
||||||
|
"""
|
||||||
|
thr = \
|
||||||
|
threadWithTrace(target=manualDenyFollowRequest,
|
||||||
|
args=(session, baseDir,
|
||||||
|
httpPrefix,
|
||||||
|
nickname, domain, port,
|
||||||
|
denyHandle,
|
||||||
|
federationList,
|
||||||
|
sendThreads, postLog,
|
||||||
|
cachedWebfingers, personCache,
|
||||||
|
debug,
|
||||||
|
projectVersion,
|
||||||
|
signingPrivateKeyPem), daemon=True)
|
||||||
|
thr.start()
|
||||||
|
sendThreads.append(thr)
|
||||||
|
|
||||||
|
|
||||||
def _approveFollowerHandle(accountDir: str, approveHandle: str) -> None:
|
def _approveFollowerHandle(accountDir: str, approveHandle: str) -> None:
|
||||||
""" Record manually approved handles so that if they unfollow and then
|
""" Record manually approved handles so that if they unfollow and then
|
||||||
re-follow later then they don't need to be manually approved again
|
re-follow later then they don't need to be manually approved again
|
||||||
|
@ -231,3 +261,32 @@ def manualApproveFollowRequest(session, baseDir: str,
|
||||||
os.remove(approveFollowsFilename + '.new')
|
os.remove(approveFollowsFilename + '.new')
|
||||||
except BaseException:
|
except BaseException:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def manualApproveFollowRequestThread(session, baseDir: str,
|
||||||
|
httpPrefix: str,
|
||||||
|
nickname: str, domain: str, port: int,
|
||||||
|
approveHandle: str,
|
||||||
|
federationList: [],
|
||||||
|
sendThreads: [], postLog: [],
|
||||||
|
cachedWebfingers: {}, personCache: {},
|
||||||
|
debug: bool,
|
||||||
|
projectVersion: str,
|
||||||
|
signingPrivateKeyPem: str) -> None:
|
||||||
|
"""Manually approve a follow request, in a thread so as not to cause
|
||||||
|
the UI to lag
|
||||||
|
"""
|
||||||
|
thr = \
|
||||||
|
threadWithTrace(target=manualApproveFollowRequest,
|
||||||
|
args=(session, baseDir,
|
||||||
|
httpPrefix,
|
||||||
|
nickname, domain, port,
|
||||||
|
approveHandle,
|
||||||
|
federationList,
|
||||||
|
sendThreads, postLog,
|
||||||
|
cachedWebfingers, personCache,
|
||||||
|
debug,
|
||||||
|
projectVersion,
|
||||||
|
signingPrivateKeyPem), daemon=True)
|
||||||
|
thr.start()
|
||||||
|
sendThreads.append(thr)
|
||||||
|
|
4
posts.py
4
posts.py
|
@ -1846,7 +1846,7 @@ def createUnlistedPost(baseDir: str,
|
||||||
"""Unlisted post. This has the #Public and followers links inverted.
|
"""Unlisted post. This has the #Public and followers links inverted.
|
||||||
"""
|
"""
|
||||||
domainFull = getFullDomain(domain, port)
|
domainFull = getFullDomain(domain, port)
|
||||||
localActor = localActorUrl(httpPrefix, domainFull, nickname)
|
localActor = localActorUrl(httpPrefix, nickname, domainFull)
|
||||||
return _createPostBase(baseDir, nickname, domain, port,
|
return _createPostBase(baseDir, nickname, domain, port,
|
||||||
localActor + '/followers',
|
localActor + '/followers',
|
||||||
'https://www.w3.org/ns/activitystreams#Public',
|
'https://www.w3.org/ns/activitystreams#Public',
|
||||||
|
@ -1879,7 +1879,7 @@ def createFollowersOnlyPost(baseDir: str,
|
||||||
"""Followers only post
|
"""Followers only post
|
||||||
"""
|
"""
|
||||||
domainFull = getFullDomain(domain, port)
|
domainFull = getFullDomain(domain, port)
|
||||||
localActor = localActorUrl(httpPrefix, domainFull, nickname)
|
localActor = localActorUrl(httpPrefix, nickname, domainFull)
|
||||||
return _createPostBase(baseDir, nickname, domain, port,
|
return _createPostBase(baseDir, nickname, domain, port,
|
||||||
localActor + '/followers',
|
localActor + '/followers',
|
||||||
None,
|
None,
|
||||||
|
|
Loading…
Reference in New Issue