From 3c6122c56c5f4f1797d4cfd4c1f409c34f0ce62e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 30 Sep 2019 23:39:02 +0100 Subject: [PATCH] Exception handling --- announce.py | 40 +++++++++++++++++------ availability.py | 25 +++++++++++---- cache.py | 7 ++-- capabilities.py | 58 +++++++++++++++++++++++---------- config.py | 7 ++-- daemon.py | 14 +++++--- follow.py | 29 ++++++++++++----- inbox.py | 40 +++++++++++++++-------- like.py | 36 +++++++++++++++------ manualapprove.py | 9 ++++-- person.py | 83 ++++++++++++++++++++++++++++++++++++------------ posts.py | 16 +++++++--- roles.py | 46 +++++++++++++++++++++------ shares.py | 69 ++++++++++++++++++++++++++++------------ skills.py | 47 +++++++++++++++++++++------ tests.py | 1 + utils.py | 9 ++++-- webfinger.py | 21 ++++++++---- 18 files changed, 411 insertions(+), 146 deletions(-) diff --git a/announce.py b/announce.py index 7d5d80b39..4f4d6906f 100644 --- a/announce.py +++ b/announce.py @@ -67,8 +67,14 @@ def undoAnnounceCollectionEntry(postFilename: str,actor: str,debug: bool) -> Non collection within a post. Note that the "shares" collection has no relation to shared items in shares.py. It's shares of posts, not shares of physical objects. """ - with open(postFilename, 'r') as fp: - postJsonObject=commentjson.load(fp) + postJsonObject=None + try: + with open(postFilename, 'r') as fp: + postJsonObject=commentjson.load(fp) + except Exception as e: + print(e) + + if postJsonObject: if not postJsonObject.get('type'): return if postJsonObject['type']!='Create': @@ -103,16 +109,24 @@ def undoAnnounceCollectionEntry(postFilename: str,actor: str,debug: bool) -> Non del postJsonObject['object']['shares'] else: postJsonObject['object']['shares']['totalItems']=len(postJsonObject['object']['shares']['items']) - with open(postFilename, 'w') as fp: - commentjson.dump(postJsonObject, fp, indent=4, sort_keys=False) + try: + with open(postFilename, 'w') as fp: + commentjson.dump(postJsonObject, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) def updateAnnounceCollection(postFilename: str,actor: str,debug: bool) -> None: """Updates the announcements collection within a post Confusingly this is known as "shares", but isn't the same as shared items within shares.py It's shares of posts, not shares of physical objects. """ - with open(postFilename, 'r') as fp: - postJsonObject=commentjson.load(fp) + postJsonObject=None + try: + with open(postFilename, 'r') as fp: + postJsonObject=commentjson.load(fp) + except Exception as e: + print(e) + if postJsonObject: if not postJsonObject.get('object'): if debug: pprint(postJsonObject) @@ -154,8 +168,11 @@ def updateAnnounceCollection(postFilename: str,actor: str,debug: bool) -> None: if debug: print('DEBUG: saving post with shares (announcements) added') pprint(postJsonObject) - with open(postFilename, 'w') as fp: - commentjson.dump(postJsonObject, fp, indent=4, sort_keys=False) + try: + with open(postFilename, 'w') as fp: + commentjson.dump(postJsonObject, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) def announcedByPerson(postJsonObject: {}, nickname: str,domain: str) -> bool: """Returns True if the given post is announced by the given person @@ -218,8 +235,11 @@ def createAnnounce(session,baseDir: str,federationList: [], \ if saveToFile: outboxDir = createOutboxDir(nickname,domain,baseDir) filename=outboxDir+'/'+newAnnounceId.replace('/','#')+'.json' - with open(filename, 'w') as fp: - commentjson.dump(newAnnounce, fp, indent=4, sort_keys=False) + try: + with open(filename, 'w') as fp: + commentjson.dump(newAnnounce, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) announceNickname=None announceDomain=None diff --git a/availability.py b/availability.py index e7d338e3c..905352295 100644 --- a/availability.py +++ b/availability.py @@ -26,11 +26,19 @@ def setAvailability(baseDir: str,nickname: str,domain: str, \ actorFilename=baseDir+'/accounts/'+nickname+'@'+domain+'.json' if not os.path.isfile(actorFilename): return False - with open(actorFilename, 'r') as fp: - actorJson=commentjson.load(fp) + actorJson=None + try: + with open(actorFilename, 'r') as fp: + actorJson=commentjson.load(fp) + except Exception as e: + print(e) + if actorJson: actorJson['availability']=status - with open(actorFilename, 'w') as fp: - commentjson.dump(actorJson, fp, indent=4, sort_keys=False) + try: + with open(actorFilename, 'w') as fp: + commentjson.dump(actorJson, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) return True def getAvailability(baseDir: str,nickname: str,domain: str) -> str: @@ -39,8 +47,13 @@ def getAvailability(baseDir: str,nickname: str,domain: str) -> str: actorFilename=baseDir+'/accounts/'+nickname+'@'+domain+'.json' if not os.path.isfile(actorFilename): return False - with open(actorFilename, 'r') as fp: - actorJson=commentjson.load(fp) + actorJson=None + try: + with open(actorFilename, 'r') as fp: + actorJson=commentjson.load(fp) + except Exception as e: + print(e) + if actorJson: if not actorJson.get('availability'): return None return actorJson['availability'] diff --git a/cache.py b/cache.py index 10e6341b0..5bdf36011 100644 --- a/cache.py +++ b/cache.py @@ -26,8 +26,11 @@ def storePersonInCache(baseDir: str,personUrl: str,personJson: {},personCache: { if os.path.isdir(baseDir+'/cache/actors'): cacheFilename=baseDir+'/cache/actors/'+personUrl.replace('/','#')+'.json' if not os.path.isfile(cacheFilename): - with open(cacheFilename, 'w') as fp: - commentjson.dump(personJson, fp, indent=4, sort_keys=False) + try: + with open(cacheFilename, 'w') as fp: + commentjson.dump(personJson, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) def getPersonFromCache(baseDir: str,personUrl: str,personCache: {}) -> {}: """Get an actor from the cache diff --git a/capabilities.py b/capabilities.py index d96e39337..a3690f14d 100644 --- a/capabilities.py +++ b/capabilities.py @@ -127,8 +127,11 @@ def capabilitiesAccept(baseDir: str,httpPrefix: str, \ # if the capability already exists then load it from file if os.path.isfile(ocapFilename): - with open(ocapFilename, 'r') as fp: - ocapAccept=commentjson.load(fp) + try: + with open(ocapFilename, 'r') as fp: + ocapAccept=commentjson.load(fp) + except Exception as e: + print(e) # otherwise create a new capability if not ocapAccept: acceptedActorNickname=getNicknameFromActor(acceptedActor) @@ -152,8 +155,11 @@ def capabilitiesAccept(baseDir: str,httpPrefix: str, \ ocapAccept['actor']=httpPrefix+"://"+fullDomain+'/users/'+nickname if saveToFile: - with open(ocapFilename, 'w') as fp: - commentjson.dump(ocapAccept, fp, indent=4, sort_keys=False) + try: + with open(ocapFilename, 'w') as fp: + commentjson.dump(ocapAccept, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) return ocapAccept def capabilitiesGrantedSave(baseDir :str,nickname :str,domain :str,ocap: {}) -> bool: @@ -165,8 +171,11 @@ def capabilitiesGrantedSave(baseDir :str,nickname :str,domain :str,ocap: {}) -> ocapFilename=getOcapFilename(baseDir,nickname,domain,ocap['actor'],'granted') if not ocapFilename: return False - with open(ocapFilename, 'w') as fp: - commentjson.dump(ocap, fp, indent=4, sort_keys=False) + try: + with open(ocapFilename, 'w') as fp: + commentjson.dump(ocap, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) return True def capabilitiesUpdate(baseDir: str,httpPrefix: str, \ @@ -208,8 +217,11 @@ def capabilitiesUpdate(baseDir: str,httpPrefix: str, \ } # read the existing capability - with open(ocapFilename, 'r') as fp: - ocapJson=commentjson.load(fp) + try: + with open(ocapFilename, 'r') as fp: + ocapJson=commentjson.load(fp) + except Exception as e: + print(e) # set the new capabilities list. eg. ["inbox:write","objects:read"] ocapJson['capability']=updateCaps @@ -228,9 +240,12 @@ def capabilitiesUpdate(baseDir: str,httpPrefix: str, \ ocapUpdate['object']=ocapJson # save it again - with open(ocapFilename, 'w') as fp: - commentjson.dump(ocapJson, fp, indent=4, sort_keys=False) - + try: + with open(ocapFilename, 'w') as fp: + commentjson.dump(ocapJson, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) + return ocapUpdate def capabilitiesReceiveUpdate(baseDir :str, \ @@ -251,12 +266,21 @@ def capabilitiesReceiveUpdate(baseDir :str, \ print(ocapFilename) return False - with open(ocapFilename, 'r') as fp: - ocapJson=commentjson.load(fp) + ocapJson=None + try: + with open(ocapFilename, 'r') as fp: + ocapJson=commentjson.load(fp) + except Exception as e: + print(e) + + if ocapJson: ocapJson['id']=newCapabilitiesId ocapJson['capability']=capabilityList - - with open(ocapFilename, 'w') as fp: - commentjson.dump(ocapJson, fp, indent=4, sort_keys=False) - return True + + try: + with open(ocapFilename, 'w') as fp: + commentjson.dump(ocapJson, fp, indent=4, sort_keys=False) + return True + except Exception as e: + print(e) return False diff --git a/config.py b/config.py index 85b8b8dfc..cd72025af 100644 --- a/config.py +++ b/config.py @@ -29,8 +29,11 @@ def setConfigParam(baseDir: str, variableName: str, variableValue) -> None: """ createConfig(baseDir) configFilename=baseDir+'/config.json' - with open(configFilename, 'r') as fp: - configJson=commentjson.load(fp) + try: + with open(configFilename, 'r') as fp: + configJson=commentjson.load(fp) + except Exception as e: + print(e) configJson[variableName]=variableValue try: with open(configFilename, 'w') as fp: diff --git a/daemon.py b/daemon.py index e68b6ae1b..fabe8672a 100644 --- a/daemon.py +++ b/daemon.py @@ -3014,13 +3014,19 @@ class PubServer(BaseHTTPRequestHandler): os.remove(allowedInstancesFilename) # save actor json file within accounts if actorChanged: - with open(actorFilename, 'w') as fp: - commentjson.dump(actorJson, fp, indent=4, sort_keys=False) + try: + with open(actorFilename, 'w') as fp: + commentjson.dump(actorJson, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) # also copy to the actors cache and personCache in memory storePersonInCache(self.server.baseDir,actorJson['id'],actorJson,self.server.personCache) actorCacheFilename=self.server.baseDir+'/cache/actors/'+actorJson['id'].replace('/','#')+'.json' - with open(actorCacheFilename, 'w') as fp: - commentjson.dump(actorJson, fp, indent=4, sort_keys=False) + try: + with open(actorCacheFilename, 'w') as fp: + commentjson.dump(actorJson, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) # send actor update to followers updateActorJson={ 'type': 'Update', diff --git a/follow.py b/follow.py index c04b3fb64..eb1026fae 100644 --- a/follow.py +++ b/follow.py @@ -319,8 +319,13 @@ def followApprovalRequired(baseDir: str,nicknameToFollow: str, \ domainToFollow=domainToFollow.split(':')[0] actorFilename=baseDir+'/accounts/'+nicknameToFollow+'@'+domainToFollow+'.json' if os.path.isfile(actorFilename): - with open(actorFilename, 'r') as fp: - actor=commentjson.load(fp) + actor=None + try: + with open(actorFilename, 'r') as fp: + actor=commentjson.load(fp) + except Exception as e: + print(e) + if actor: if actor.get('manuallyApprovesFollowers'): manuallyApproveFollows=actor['manuallyApprovesFollowers'] else: @@ -384,9 +389,12 @@ def storeFollowRequest(baseDir: str, \ if not os.path.isdir(requestsDir): os.mkdir(requestsDir) followActivityfilename=requestsDir+'/'+approveHandle+'.follow' - with open(followActivityfilename, 'w') as fp: - commentjson.dump(followJson, fp, indent=4, sort_keys=False) - return True + try: + with open(followActivityfilename, 'w') as fp: + commentjson.dump(followJson, fp, indent=4, sort_keys=False) + return True + except Exception as e: + print(e) return False def receiveFollowRequest(session,baseDir: str,httpPrefix: str, \ @@ -828,9 +836,14 @@ def getFollowersOfActor(baseDir :str,actor :str,debug: bool) -> {}: ocapFilename=baseDir+'/accounts/'+account+'/ocap/accept/'+httpPrefix+':##'+domain+':'+str(port)+'#users#'+nickname+'.json' if debug: print('DEBUG: checking capabilities of'+account) - if os.path.isfile(ocapFilename): - with open(ocapFilename, 'r') as fp: - ocapJson=commentjson.load(fp) + if os.path.isfile(ocapFilename): + ocapJson=None + try: + with open(ocapFilename, 'r') as fp: + ocapJson=commentjson.load(fp) + except Exception as e: + print(e) + if ocapJson: if ocapJson.get('id'): if debug: print('DEBUG: capabilities id found for '+account) diff --git a/inbox.py b/inbox.py index 118e9408d..6851ad1ae 100644 --- a/inbox.py +++ b/inbox.py @@ -282,9 +282,11 @@ def savePostToInboxQueue(baseDir: str,httpPrefix: str, \ if debug: print('Inbox queue item created') pprint(newQueueItem) - - with open(filename, 'w') as fp: - commentjson.dump(newQueueItem, fp, indent=4, sort_keys=False) + try: + with open(filename, 'w') as fp: + commentjson.dump(newQueueItem, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) return filename def inboxCheckCapabilities(baseDir :str,nickname :str,domain :str, \ @@ -669,9 +671,12 @@ def personReceiveUpdate(baseDir: str, \ # save to cache in memory storePersonInCache(baseDir,personJson['id'],personJson,personCache) # save to cache on file - with open(actorFilename, 'w') as fp: - commentjson.dump(personJson, fp, indent=4, sort_keys=False) - print('actor updated for '+personJson['id']) + try: + with open(actorFilename, 'w') as fp: + commentjson.dump(personJson, fp, indent=4, sort_keys=False) + print('actor updated for '+personJson['id']) + except Exception as e: + print(e) # remove avatar if it exists so that it will be refreshed later # when a timeline is constructed @@ -1263,13 +1268,19 @@ def inboxAfterCapabilities(session,keyId: str,handle: str,messageJson: {}, \ if messageJson.get('postNickname'): if validPostContent(messageJson['post'],maxMentions): obtainReplyToAvatar(baseDir,personCache,messageJson['post']) - with open(destinationFilename, 'w+') as fp: - commentjson.dump(messageJson['post'], fp, indent=4, sort_keys=False) + try: + with open(destinationFilename, 'w+') as fp: + commentjson.dump(messageJson['post'], fp, indent=4, sort_keys=False) + except Exception as e: + print(e) else: if validPostContent(messageJson,maxMentions): obtainReplyToAvatar(baseDir,personCache,messageJson) - with open(destinationFilename, 'w+') as fp: - commentjson.dump(messageJson, fp, indent=4, sort_keys=False) + try: + with open(destinationFilename, 'w+') as fp: + commentjson.dump(messageJson, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) if not os.path.isfile(destinationFilename): return False @@ -1613,9 +1624,12 @@ def runInboxQueue(projectVersion: str, \ if len(recipientsDictFollowers)>0: sharedInboxPostFilename=queueJson['destination'].replace(inboxHandle,inboxHandle) if not os.path.isfile(sharedInboxPostFilename): - with open(sharedInboxPostFilename, 'w') as fp: - commentjson.dump(queueJson['post'],fp,indent=4, \ - sort_keys=False) + try: + with open(sharedInboxPostFilename, 'w') as fp: + commentjson.dump(queueJson['post'],fp,indent=4, \ + sort_keys=False) + except Exception as e: + print(e) # for posts addressed to specific accounts for handle,capsId in recipientsDict.items(): diff --git a/like.py b/like.py index 63c5fca1b..1625634d1 100644 --- a/like.py +++ b/like.py @@ -21,9 +21,15 @@ from posts import getPersonBox def undoLikesCollectionEntry(postFilename: str,objectUrl: str,actor: str,debug: bool) -> None: """Undoes a like for a particular actor - """ - with open(postFilename, 'r') as fp: - postJsonObject=commentjson.load(fp) + """ + postJsonObject=None + try: + with open(postFilename, 'r') as fp: + postJsonObject=commentjson.load(fp) + except Exception as e: + print(e) + + if postJsonObject: if not postJsonObject.get('type'): return if postJsonObject['type']!='Create': @@ -60,8 +66,11 @@ def undoLikesCollectionEntry(postFilename: str,objectUrl: str,actor: str,debug: del postJsonObject['object']['likes'] else: postJsonObject['object']['likes']['totalItems']=len(postJsonObject['likes']['items']) - with open(postFilename, 'w') as fp: - commentjson.dump(postJsonObject, fp, indent=4, sort_keys=False) + try: + with open(postFilename, 'w') as fp: + commentjson.dump(postJsonObject, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) def likedByPerson(postJsonObject: {}, nickname: str,domain: str) -> bool: """Returns True if the given post is liked by the given person @@ -93,8 +102,14 @@ def noOfLikes(postJsonObject: {}) -> int: def updateLikesCollection(postFilename: str,objectUrl: str, actor: str,debug: bool) -> None: """Updates the likes collection within a post """ - with open(postFilename, 'r') as fp: - postJsonObject=commentjson.load(fp) + postJsonObject=None + try: + with open(postFilename, 'r') as fp: + postJsonObject=commentjson.load(fp) + except Exception as e: + print(e) + + if postJsonObject: if not postJsonObject.get('object'): if debug: pprint(postJsonObject) @@ -133,8 +148,11 @@ def updateLikesCollection(postFilename: str,objectUrl: str, actor: str,debug: bo if debug: print('DEBUG: saving post with likes added') pprint(postJsonObject) - with open(postFilename, 'w') as fp: - commentjson.dump(postJsonObject, fp, indent=4, sort_keys=False) + try: + with open(postFilename, 'w') as fp: + commentjson.dump(postJsonObject, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) def like(session,baseDir: str,federationList: [],nickname: str,domain: str,port: int, \ ccList: [],httpPrefix: str,objectUrl: str,clientToServer: bool, \ diff --git a/manualapprove.py b/manualapprove.py index 37190e9b9..65e4057dd 100644 --- a/manualapprove.py +++ b/manualapprove.py @@ -97,8 +97,13 @@ def manualApproveFollowRequest(session,baseDir: str, \ requestsDir=accountsDir+'/requests' followActivityfilename=requestsDir+'/'+handle+'.follow' if os.path.isfile(followActivityfilename): - with open(followActivityfilename, 'r') as fp: - followJson=commentjson.load(fp) + followJson=None + try: + with open(followActivityfilename, 'r') as fp: + followJson=commentjson.load(fp) + except Exception as e: + print(e) + if followJson: approveNickname=approveHandle.split('@')[0] approveDomain=approveHandle.split('@')[1].replace('\n','') approvePort=port2 diff --git a/person.py b/person.py index 71b95e14b..ddf952e6e 100644 --- a/person.py +++ b/person.py @@ -90,12 +90,21 @@ def setProfileImage(baseDir: str,httpPrefix :str,nickname: str,domain: str, \ iconFilename=iconFilenameBase+'.gif' profileFilename=baseDir+'/accounts/'+handle+'/'+iconFilename - with open(personFilename, 'r') as fp: - personJson=commentjson.load(fp) + personJson=None + try: + with open(personFilename, 'r') as fp: + personJson=commentjson.load(fp) + except Exception as e: + print(e) + + if personJson: personJson[iconFilenameBase]['mediaType']=mediaType personJson[iconFilenameBase]['url']=httpPrefix+'://'+fullDomain+'/users/'+nickname+'/'+iconFilename - with open(personFilename, 'w') as fp: - commentjson.dump(personJson, fp, indent=4, sort_keys=False) + try: + with open(personFilename, 'w') as fp: + commentjson.dump(personJson, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) cmd = '/usr/bin/convert '+imageFilename+' -size '+resolution+' -quality 50 '+profileFilename subprocess.call(cmd, shell=True) @@ -115,11 +124,21 @@ def setOrganizationScheme(baseDir: str,nickname: str,domain: str, \ actorFilename=baseDir+'/accounts/'+nickname+'@'+domain+'.json' if not os.path.isfile(actorFilename): return False - with open(actorFilename, 'r') as fp: - actorJson=commentjson.load(fp) + + actorJson=None + try: + with open(actorFilename, 'r') as fp: + actorJson=commentjson.load(fp) + except Exception as e: + print(e) + + if actorJson: actorJson['orgSchema']=schema - with open(actorFilename, 'w') as fp: - commentjson.dump(actorJson, fp, indent=4, sort_keys=False) + try: + with open(actorFilename, 'w') as fp: + commentjson.dump(actorJson, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) return True def accountExists(baseDir: str,nickname: str,domain: str) -> bool: @@ -239,8 +258,11 @@ def createPersonBase(baseDir: str,nickname: str,domain: str,port: int, \ if not os.path.isdir(baseDir+peopleSubdir+'/'+handle+'/queue'): os.mkdir(baseDir+peopleSubdir+'/'+handle+'/queue') filename=baseDir+peopleSubdir+'/'+handle+'.json' - with open(filename, 'w') as fp: - commentjson.dump(newPerson, fp, indent=4, sort_keys=False) + try: + with open(filename, 'w') as fp: + commentjson.dump(newPerson, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) # save to cache if not os.path.isdir(baseDir+'/cache'): @@ -248,8 +270,11 @@ def createPersonBase(baseDir: str,nickname: str,domain: str,port: int, \ if not os.path.isdir(baseDir+'/cache/actors'): os.mkdir(baseDir+'/cache/actors') cacheFilename=baseDir+'/cache/actors/'+newPerson['id'].replace('/','#')+'.json' - with open(cacheFilename, 'w') as fp: - commentjson.dump(newPerson, fp, indent=4, sort_keys=False) + try: + with open(cacheFilename, 'w') as fp: + commentjson.dump(newPerson, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) # save the private key privateKeysSubdir='/keys/private' @@ -504,14 +529,22 @@ def setDisplayNickname(baseDir: str,nickname: str, domain: str, \ filename=baseDir+'/accounts/'+handle.lower()+'.json' if not os.path.isfile(filename): return False + personJson=None - with open(filename, 'r') as fp: - personJson=commentjson.load(fp) + try: + with open(filename, 'r') as fp: + personJson=commentjson.load(fp) + except Exception as e: + print(e) + if not personJson: return False personJson['name']=displayName - with open(filename, 'w') as fp: - commentjson.dump(personJson, fp, indent=4, sort_keys=False) + try: + with open(filename, 'w') as fp: + commentjson.dump(personJson, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) return True def setBio(baseDir: str,nickname: str, domain: str, bio: str) -> bool: @@ -521,16 +554,26 @@ def setBio(baseDir: str,nickname: str, domain: str, bio: str) -> bool: filename=baseDir+'/accounts/'+handle.lower()+'.json' if not os.path.isfile(filename): return False + personJson=None - with open(filename, 'r') as fp: - personJson=commentjson.load(fp) + try: + with open(filename, 'r') as fp: + personJson=commentjson.load(fp) + except Exception as e: + print(e) + if not personJson: return False if not personJson.get('summary'): return False personJson['summary']=bio - with open(filename, 'w') as fp: - commentjson.dump(personJson, fp, indent=4, sort_keys=False) + + try: + with open(filename, 'w') as fp: + commentjson.dump(personJson, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) + return True def isSuspended(baseDir: str,nickname: str) -> bool: diff --git a/posts.py b/posts.py index 15422f7a6..193d186ff 100644 --- a/posts.py +++ b/posts.py @@ -413,8 +413,11 @@ def savePostToBox(baseDir: str,httpPrefix: str,postId: str, \ boxDir = createPersonDir(nickname,domain,baseDir,boxname) filename=boxDir+'/'+postId.replace('/','#')+'.json' - with open(filename, 'w') as fp: - commentjson.dump(postJsonObject, fp, indent=4, sort_keys=False) + try: + with open(filename, 'w') as fp: + commentjson.dump(postJsonObject, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) return filename def updateHashtagsIndex(baseDir: str,tag: {},newPostId: str) -> None: @@ -2282,7 +2285,10 @@ def downloadAnnounce(session,baseDir: str,httpPrefix: str,nickname: str,domain: rejectAnnounce(announceFilename) return None postJsonObject=announcedJson - with open(announceFilename, 'w') as fp: - commentjson.dump(postJsonObject, fp, indent=4, sort_keys=False) - return postJsonObject + try: + with open(announceFilename, 'w') as fp: + commentjson.dump(postJsonObject, fp, indent=4, sort_keys=False) + return postJsonObject + except Exception as e: + print(e) return None diff --git a/roles.py b/roles.py index e5d84ae2b..d67ec6891 100644 --- a/roles.py +++ b/roles.py @@ -28,13 +28,22 @@ def clearModeratorStatus(baseDir: str) -> None: if filename.endswith(".json") and '@' in filename: filename=os.path.join(baseDir+'/accounts/', filename) if '"moderator"' in open(filename).read(): - with open(filename, 'r') as fp: - actorJson=commentjson.load(fp) + actorJson=None + try: + with open(filename, 'r') as fp: + actorJson=commentjson.load(fp) + except Exception as e: + print(e) + + if actorJson: if actorJson['roles'].get('instance'): if 'moderator' in actorJson['roles']['instance']: actorJson['roles']['instance'].remove('moderator') - with open(filename, 'w') as fp: - commentjson.dump(actorJson, fp, indent=4, sort_keys=False) + try: + with open(filename, 'w') as fp: + commentjson.dump(actorJson, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) def addModerator(baseDir: str,nickname: str,domain: str) -> None: """Adds a moderator nickname to the file @@ -87,8 +96,15 @@ def setRole(baseDir: str,nickname: str,domain: str, \ actorFilename=baseDir+'/accounts/'+nickname+'@'+domain+'.json' if not os.path.isfile(actorFilename): return False - with open(actorFilename, 'r') as fp: - actorJson=commentjson.load(fp) + + actorJson=None + try: + with open(actorFilename, 'r') as fp: + actorJson=commentjson.load(fp) + except Exception as e: + print(e) + + if actorJson: if role: # add the role if project=='instance' and 'role'=='moderator': @@ -107,8 +123,11 @@ def setRole(baseDir: str,nickname: str,domain: str, \ # if the project contains no roles then remove it if len(actorJson['roles'][project])==0: del actorJson['roles'][project] - with open(actorFilename, 'w') as fp: - commentjson.dump(actorJson, fp, indent=4, sort_keys=False) + try: + with open(actorFilename, 'w') as fp: + commentjson.dump(actorJson, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) return True def getRoles(baseDir: str,nickname: str,domain: str, \ @@ -118,8 +137,15 @@ def getRoles(baseDir: str,nickname: str,domain: str, \ actorFilename=baseDir+'/accounts/'+nickname+'@'+domain+'.json' if not os.path.isfile(actorFilename): return False - with open(actorFilename, 'r') as fp: - actorJson=commentjson.load(fp) + + actorJson=None + try: + with open(actorFilename, 'r') as fp: + actorJson=commentjson.load(fp) + except Exception as e: + print(e) + + if actorJson: if not actorJson.get('roles'): return None if not actorJson['roles'].get(project): diff --git a/shares.py b/shares.py index c43841303..82702ffa1 100644 --- a/shares.py +++ b/shares.py @@ -25,9 +25,12 @@ def removeShare(baseDir: str,nickname: str,domain: str, \ """Removes a share for a person """ sharesFilename=baseDir+'/accounts/'+nickname+'@'+domain+'/shares.json' - if os.path.isfile(sharesFilename): - with open(sharesFilename, 'r') as fp: - sharesJson=commentjson.load(fp) + if os.path.isfile(sharesFilename): + try: + with open(sharesFilename, 'r') as fp: + sharesJson=commentjson.load(fp) + except Exception as e: + print(e) itemID=displayName.replace(' ','') if sharesJson.get(itemID): @@ -42,8 +45,11 @@ def removeShare(baseDir: str,nickname: str,domain: str, \ os.remove(itemIDfile+'.gif') # remove the item itself del sharesJson[itemID] - with open(sharesFilename, 'w') as fp: - commentjson.dump(sharesJson, fp, indent=4, sort_keys=False) + try: + with open(sharesFilename, 'w') as fp: + commentjson.dump(sharesJson, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) def addShare(baseDir: str, \ httpPrefix: str,nickname: str,domain: str,port: int, \ @@ -59,9 +65,12 @@ def addShare(baseDir: str, \ """ sharesFilename=baseDir+'/accounts/'+nickname+'@'+domain+'/shares.json' sharesJson={} - if os.path.isfile(sharesFilename): - with open(sharesFilename, 'r') as fp: - sharesJson=commentjson.load(fp) + if os.path.isfile(sharesFilename): + try: + with open(sharesFilename, 'r') as fp: + sharesJson=commentjson.load(fp) + except Exception as e: + print(e) duration=duration.lower() durationSec=0 @@ -137,8 +146,11 @@ def addShare(baseDir: str, \ "expire": durationSec } - with open(sharesFilename, 'w') as fp: - commentjson.dump(sharesJson, fp, indent=4, sort_keys=False) + try: + with open(sharesFilename, 'w') as fp: + commentjson.dump(sharesJson, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) def expireShares(baseDir: str,nickname: str,domain: str) -> None: """Removes expired items from shares @@ -149,8 +161,13 @@ def expireShares(baseDir: str,nickname: str,domain: str) -> None: handle=nickname+'@'+handleDomain sharesFilename=baseDir+'/accounts/'+handle+'/shares.json' if os.path.isfile(sharesFilename): - with open(sharesFilename, 'r') as fp: - sharesJson=commentjson.load(fp) + sharesJson=None + try: + with open(sharesFilename, 'r') as fp: + sharesJson=commentjson.load(fp) + except Exception as e: + print(e) + if sharesJson: currTime=int(time.time()) deleteItemID=[] for itemID,item in sharesJson.items(): @@ -167,9 +184,12 @@ def expireShares(baseDir: str,nickname: str,domain: str) -> None: os.remove(itemIDfile+'.jpg') if os.path.isfile(itemIDfile+'.gif'): os.remove(itemIDfile+'.gif') - with open(sharesFilename, 'w') as fp: - commentjson.dump(sharesJson, fp, indent=4, sort_keys=False) - + try: + with open(sharesFilename, 'w') as fp: + commentjson.dump(sharesJson, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) + def getSharesFeedForPerson(baseDir: str, \ domain: str,port: int, \ path: str,httpPrefix: str, \ @@ -219,9 +239,12 @@ def getSharesFeedForPerson(baseDir: str, \ if headerOnly: noOfShares=0 if os.path.isfile(sharesFilename): - with open(sharesFilename, 'r') as fp: - sharesJson=commentjson.load(fp) - noOfShares=len(sharesJson.items()) + try: + with open(sharesFilename, 'r') as fp: + sharesJson=commentjson.load(fp) + noOfShares=len(sharesJson.items()) + except Exception as e: + print(e) shares = { '@context': 'https://www.w3.org/ns/activitystreams', 'first': httpPrefix+'://'+domain+'/users/'+nickname+'/shares?page=1', @@ -249,8 +272,14 @@ def getSharesFeedForPerson(baseDir: str, \ pageCtr=0 totalCtr=0 - with open(sharesFilename, 'r') as fp: - sharesJson=commentjson.load(fp) + sharesJson=None + try: + with open(sharesFilename, 'r') as fp: + sharesJson=commentjson.load(fp) + except Exception as e: + print(e) + + if sharesJson: for itemID,item in sharesJson.items(): pageCtr += 1 totalCtr += 1 diff --git a/skills.py b/skills.py index a028c82c2..fd787aeb0 100644 --- a/skills.py +++ b/skills.py @@ -26,27 +26,47 @@ def setSkillLevel(baseDir: str,nickname: str,domain: str, \ actorFilename=baseDir+'/accounts/'+nickname+'@'+domain+'.json' if not os.path.isfile(actorFilename): return False - with open(actorFilename, 'r') as fp: - actorJson=commentjson.load(fp) + + actorJson=None + try: + with open(actorFilename, 'r') as fp: + actorJson=commentjson.load(fp) + except Exception as e: + print(e) + + if actorJson: if not actorJson.get('skills'): actorJson['skills']={} if skillLevelPercent>0: actorJson['skills'][skill]=skillLevelPercent else: del actorJson['skills'][skill] - with open(actorFilename, 'w') as fp: - commentjson.dump(actorJson, fp, indent=4, sort_keys=False) + try: + with open(actorFilename, 'w') as fp: + commentjson.dump(actorJson, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) return True def setSkills(baseDir: str,nickname: str,domain: str,skills: {}) -> None: actorFilename=baseDir+'/accounts/'+nickname+'@'+domain+'.json' if not os.path.isfile(actorFilename): return False - with open(actorFilename, 'r') as fp: - actorJson=commentjson.load(fp) + + actorJson=None + try: + with open(actorFilename, 'r') as fp: + actorJson=commentjson.load(fp) + except Exception as e: + print(e) + + if actorJson: actorJson['skills']=skills - with open(actorFilename, 'w') as fp: - commentjson.dump(actorJson, fp, indent=4, sort_keys=False) + try: + with open(actorFilename, 'w') as fp: + commentjson.dump(actorJson, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) def getSkills(baseDir: str,nickname: str,domain: str) -> []: """Returns the skills for a given person @@ -54,8 +74,15 @@ def getSkills(baseDir: str,nickname: str,domain: str) -> []: actorFilename=baseDir+'/accounts/'+nickname+'@'+domain+'.json' if not os.path.isfile(actorFilename): return False - with open(actorFilename, 'r') as fp: - actorJson=commentjson.load(fp) + + actorJson=None + try: + with open(actorFilename, 'r') as fp: + actorJson=commentjson.load(fp) + except Exception as e: + print(e) + + if actorJson: if not actorJson.get('skills'): return None return actorJson['skills'] diff --git a/tests.py b/tests.py index 6514a71f3..802190fef 100644 --- a/tests.py +++ b/tests.py @@ -452,6 +452,7 @@ def testPostMessageBetweenServers(): with open(outboxPostFilename, 'r') as fp: alicePostJson=commentjson.load(fp) pprint(alicePostJson) + assert 'likes' in open(outboxPostFilename).read() print('\n\n*******************************************************') diff --git a/utils.py b/utils.py index 6c90cc628..f7b7b4385 100644 --- a/utils.py +++ b/utils.py @@ -229,9 +229,14 @@ def removeModerationPostFromIndex(baseDir: str,postUrl: str,debug: bool) -> None def deletePost(baseDir: str,httpPrefix: str,nickname: str,domain: str,postFilename: str,debug: bool): """Recursively deletes a post and its replies and attachments """ - with open(postFilename, 'r') as fp: - postJsonObject=commentjson.load(fp) + postJsonObject=None + try: + with open(postFilename, 'r') as fp: + postJsonObject=commentjson.load(fp) + except Exception as e: + print(e) + if postJsonObject: # remove any attachment removeAttachment(baseDir,httpPrefix,domain,postJsonObject) diff --git a/webfinger.py b/webfinger.py index 972e0fcb5..e8ef6f41a 100644 --- a/webfinger.py +++ b/webfinger.py @@ -91,13 +91,19 @@ def storeWebfingerEndpoint(nickname: str,domain: str,port: int,baseDir: str, \ if not os.path.isdir(baseDir+wfSubdir): os.mkdir(baseDir+wfSubdir) filename=baseDir+wfSubdir+'/'+handle.lower()+'.json' - with open(filename, 'w') as fp: - commentjson.dump(wfJson, fp, indent=4, sort_keys=False) + try: + with open(filename, 'w') as fp: + commentjson.dump(wfJson, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) if nickname=='inbox': handle=originalDomain+'@'+domain filename=baseDir+wfSubdir+'/'+handle.lower()+'.json' - with open(filename, 'w') as fp: - commentjson.dump(wfJson, fp, indent=4, sort_keys=False) + try: + with open(filename, 'w') as fp: + commentjson.dump(wfJson, fp, indent=4, sort_keys=False) + except Exception as e: + print(e) return True def createWebfingerEndpoint(nickname: str,domain: str,port: int, \ @@ -216,6 +222,9 @@ def webfingerLookup(path: str,baseDir: str,port: int,debug: bool) -> {}: print('DEBUG: WEBFINGER filename not found '+filename) return None wfJson={"nickname": "unknown"} - with open(filename, 'r') as fp: - wfJson=commentjson.load(fp) + try: + with open(filename, 'r') as fp: + wfJson=commentjson.load(fp) + except Exception as e: + print(e) return wfJson