diff --git a/inbox.py b/inbox.py index 350545355..b0b88308c 100644 --- a/inbox.py +++ b/inbox.py @@ -1370,11 +1370,13 @@ def _receiveAnnounce(recentPostsCache: {}, if debug: print('DEBUG: Downloading announce post ' + messageJson['actor'] + ' -> ' + messageJson['object']) - postJsonObject = downloadAnnounce(session, baseDir, httpPrefix, - nickname, domain, messageJson, - __version__, translate, - YTReplacementDomain, - allowLocalNetworkAccess) + postJsonObject, alreadyExists = downloadAnnounce(session, baseDir, + httpPrefix, + nickname, domain, + messageJson, + __version__, translate, + YTReplacementDomain, + allowLocalNetworkAccess) if not postJsonObject: notInOnion = True if onionDomain: @@ -1407,9 +1409,10 @@ def _receiveAnnounce(recentPostsCache: {}, if '/statuses/' in lookupActor: lookupActor = lookupActor.split('/statuses/')[0] - _updateSpeaker(baseDir, nickname, domain, - postJsonObject, personCache, - translate) + if not alreadyExists: + _updateSpeaker(baseDir, nickname, domain, + postJsonObject, personCache, + translate) if debug: print('DEBUG: Obtaining actor for announce post ' + diff --git a/posts.py b/posts.py index ff00c98a1..930228de9 100644 --- a/posts.py +++ b/posts.py @@ -2956,7 +2956,7 @@ def isImageMedia(session, baseDir: str, httpPrefix: str, """Returns true if the given post has attached image media """ if postJsonObject['type'] == 'Announce': - postJsonAnnounce = \ + postJsonAnnounce, alreadyExists = \ downloadAnnounce(session, baseDir, httpPrefix, nickname, domain, postJsonObject, __version__, translate, @@ -3879,13 +3879,13 @@ def downloadAnnounce(session, baseDir: str, httpPrefix: str, nickname: str, domain: str, postJsonObject: {}, projectVersion: str, translate: {}, YTReplacementDomain: str, - allowLocalNetworkAccess: bool) -> {}: + allowLocalNetworkAccess: bool) -> ({}, bool): """Download the post referenced by an announce """ if not postJsonObject.get('object'): - return None + return None, False if not isinstance(postJsonObject['object'], str): - return None + return None, False # get the announced post announceCacheDir = baseDir + '/cache/announce/' + nickname @@ -3896,14 +3896,14 @@ def downloadAnnounce(session, baseDir: str, httpPrefix: str, postJsonObject['object'].replace('/', '#') + '.json' if os.path.isfile(announceFilename + '.reject'): - return None + return None, False if os.path.isfile(announceFilename): print('Reading cached Announce content for ' + postJsonObject['object']) postJsonObject = loadJson(announceFilename) if postJsonObject: - return postJsonObject + return postJsonObject, True else: profileStr = 'https://www.w3.org/ns/activitystreams' asHeader = { @@ -3920,18 +3920,18 @@ def downloadAnnounce(session, baseDir: str, httpPrefix: str, print('Announce actor does not contain a ' + 'valid domain or port number: ' + str(postJsonObject['actor'])) - return None + return None, False if isBlocked(baseDir, nickname, domain, actorNickname, actorDomain): print('Announce download blocked actor: ' + actorNickname + '@' + actorDomain) - return None + return None, False objectNickname = getNicknameFromActor(postJsonObject['object']) objectDomain, objectPort = getDomainFromActor(postJsonObject['object']) if not objectDomain: print('Announce object does not contain a ' + 'valid domain or port number: ' + str(postJsonObject['object'])) - return None + return None, False if isBlocked(baseDir, nickname, domain, objectNickname, objectDomain): if objectNickname and objectDomain: print('Announce download blocked object: ' + @@ -3939,56 +3939,56 @@ def downloadAnnounce(session, baseDir: str, httpPrefix: str, else: print('Announce download blocked object: ' + str(postJsonObject['object'])) - return None + return None, False print('Downloading Announce content for ' + postJsonObject['object']) announcedJson = \ getJson(session, postJsonObject['object'], asHeader, None, projectVersion, httpPrefix, domain) if not announcedJson: - return None + return None, False if not isinstance(announcedJson, dict): print('WARN: announce json is not a dict - ' + postJsonObject['object']) _rejectAnnounce(announceFilename) - return None + return None, False if not announcedJson.get('id'): _rejectAnnounce(announceFilename) - return None + return None, False if '/statuses/' not in announcedJson['id']: _rejectAnnounce(announceFilename) - return None + return None, False if not hasUsersPath(announcedJson['id']): _rejectAnnounce(announceFilename) - return None + return None, False if not announcedJson.get('type'): _rejectAnnounce(announceFilename) - return None + return None, False if announcedJson['type'] != 'Note' and \ announcedJson['type'] != 'Article': # You can only announce Note or Article types _rejectAnnounce(announceFilename) - return None + return None, False if not announcedJson.get('content'): _rejectAnnounce(announceFilename) - return None + return None, False if not announcedJson.get('published'): _rejectAnnounce(announceFilename) - return None + return None, False if not validPostDate(announcedJson['published']): _rejectAnnounce(announceFilename) - return None + return None, False # Check the content of the announce contentStr = announcedJson['content'] if dangerousMarkup(contentStr, allowLocalNetworkAccess): _rejectAnnounce(announceFilename) - return None + return None, False if isFiltered(baseDir, nickname, domain, contentStr): _rejectAnnounce(announceFilename) - return None + return None, False # remove any long words contentStr = removeLongWords(contentStr, 40, []) @@ -4007,7 +4007,7 @@ def downloadAnnounce(session, baseDir: str, httpPrefix: str, if announcedJson['type'] != 'Create': # Create wrap failed _rejectAnnounce(announceFilename) - return None + return None, False # labelAccusatoryPost(postJsonObject, translate) # set the id to the original status @@ -4023,12 +4023,12 @@ def downloadAnnounce(session, baseDir: str, httpPrefix: str, if isBlocked(baseDir, nickname, domain, attributedNickname, attributedDomain): _rejectAnnounce(announceFilename) - return None + return None, False postJsonObject = announcedJson replaceYouTube(postJsonObject, YTReplacementDomain) if saveJson(postJsonObject, announceFilename): - return postJsonObject - return None + return postJsonObject, False + return None, False def isMuted(baseDir: str, nickname: str, domain: str, postId: str) -> bool: diff --git a/webapp_post.py b/webapp_post.py index f66d53a87..4e6086c08 100644 --- a/webapp_post.py +++ b/webapp_post.py @@ -1281,7 +1281,7 @@ def individualPostAsHtml(allowDownloads: bool, galleryStr = '' isAnnounced = False if postJsonObject['type'] == 'Announce': - postJsonAnnounce = \ + postJsonAnnounce, alreadyExists = \ downloadAnnounce(session, baseDir, httpPrefix, nickname, domain, postJsonObject, projectVersion, translate,