def error_envelope(self, subject="Error", topic="sitecontent", body=None): if body is None: body = """ Oh my, something seems to have happened that we weren't expecting. Hopefully this will get cleared up relatively quickly. If not, you might want to send a note to [email protected], with the URL, and notes on how you got here :/ So sorry for the trouble. -The Barkeep """ e = Envelope() e.dict['envelope']['payload'] = OrderedDict() e.dict['envelope']['payload']['subject'] = subject e.dict['envelope']['payload']['topic'] = topic e.dict['envelope']['payload']['formatting'] = "markdown" e.dict['envelope']['payload']['class'] = "message" e.dict['envelope']['payload']['body'] = body e.dict['envelope']['payload']['author'] = OrderedDict() e.dict['envelope']['payload']['author']['pubkey'] = "1234" e.dict['envelope']['payload']['author']['friendlyname'] = "ERROR!" e.dict['envelope']['payload']['author']['useragent'] = "Error Agent" e.dict['envelope']['payload']['author']['friendlyname'] = "Error" e.addStamp(stampclass='author', keys=self.ServerKeys, friendlyname=defaultsettings.settings['hostname']) e.flatten() e.munge() e.dict['envelope']['local']['time_added'] = 1297396876 e.dict['envelope']['local'][ 'author_wordhash'] = "Automatically generated message" e.dict['envelope']['local']['sorttopic'] = "error" e.dict['envelope']['local']['payload_sha512'] = e.payload.hash() return e
def error_envelope(self, subject="Error", topic="sitecontent", body=None): if body is None: body = """ Oh my, something seems to have happened that we weren't expecting. Hopefully this will get cleared up relatively quickly. If not, you might want to send a note to [email protected], with the URL, and notes on how you got here :/ So sorry for the trouble. -The Barkeep """ e = Envelope() e.dict['envelope']['payload'] = OrderedDict() e.dict['envelope']['payload']['subject'] = subject e.dict['envelope']['payload']['topic'] = topic e.dict['envelope']['payload']['formatting'] = "markdown" e.dict['envelope']['payload']['class'] = "message" e.dict['envelope']['payload'][ 'body'] = body e.dict['envelope']['payload']['author'] = OrderedDict() e.dict['envelope']['payload']['author']['pubkey'] = "1234" e.dict['envelope']['payload']['author']['friendlyname'] = "ERROR!" e.dict['envelope']['payload']['author']['useragent'] = "Error Agent" e.dict['envelope']['payload']['author']['friendlyname'] = "Error" e.addStamp( stampclass='author', keys=self.ServerKeys, friendlyname=defaultsettings.settings['hostname']) e.flatten() e.munge() e.dict['envelope']['local']['time_added'] = 1297396876 e.dict['envelope']['local'][ 'author_wordhash'] = "Automatically generated message" e.dict['envelope']['local']['sorttopic'] = "error" e.dict['envelope']['local']['payload_sha512'] = e.payload.hash() return e
def receiveEnvelope(self, envstr=None, env=None): """Receive an envelope for processing in the server. Can take either a string, or an envelope obj. """ if envstr is None and env is None: raise Exception( 'receiveEnvelope MUST receive an envelope. Really! ;)') if env is not None: # If we get an envelope, flatten it - The caller may not have. c = env.flatten() else: c = Envelope() c.loadstring(importstring=envstr) # Fill-out the message's local fields. c.munge() # Make sure the message is valid, meets our standards, and is good to # accept and save. if not c.validate(): self.logger.info( "Received an Envelope which does not validate- " + c.payload.hash()) self.logger.debug(c.text()) return False utctime = time.time() existing = self.db.unsafe.find_one( 'envelopes', {'envelope.local.payload_sha512': c.dict['envelope']['local']['payload_sha512']}) if existing is not None: self.logger.debug("We already have that msg.") return c.dict['envelope']['local']['payload_sha512'] # Sign the message to saw we saw it. if self.serversettings.settings['mark-seen']: c.addStamp( stampclass='server', keys=self.ServerKeys, hostname=defaultsettings.settings['hostname']) # Store the time, in full UTC (with precision). This is used to skip # pages in the viewer later. c.dict['envelope']['local']['time_added'] = utctime if c.dict['envelope']['payload']['class'] == "message": # If the message referenes anyone, mark the original, for ease of finding it later. # Do this in the 'local' block, so we don't waste bits passing this on to others. # Partners can calculate this when they receive it. if 'regarding' in c.dict['envelope']['payload']: repliedTo = Envelope() if repliedTo.loadmongo(mongo_id=c.dict['envelope']['payload']['regarding']): self.logger.debug( " I am :: " + c.dict['envelope']['local']['payload_sha512']) self.logger.debug( " Adding a cite on my parent :: " + repliedTo.dict[ 'envelope'][ 'local'][ 'payload_sha512']) repliedTo.addcite( c.dict[ 'envelope'][ 'local'][ 'payload_sha512']) c.addAncestor(c.dict['envelope']['payload']['regarding']) print("id is :" + c.dict['envelope']['local']['payload_sha512']) # It could also be that this message is cited BY others we already have! # Sometimes we received them out of order. Better check. for citedict in self.db.unsafe.find('envelopes', {'envelope.payload.regarding': c.dict['envelope']['local']['payload_sha512']}): self.logger.debug('found existing cite, bad order. ') self.logger.debug( " I am :: " + c.dict['envelope']['local']['payload_sha512']) self.logger.debug(" Found pre-existing cite at :: " + citedict['envelope']['local']['payload_sha512']) # If it's a message, write that in the reply, and in me. if citedict['envelope']['payload']['class'] == 'message': citedme = Envelope() citedme.loaddict(citedict) c.addcite( citedme.dict[ 'envelope'][ 'local'][ 'payload_sha512']) citedme.addAncestor( c.dict[ 'envelope'][ 'local'][ 'payload_sha512']) citedme.saveMongo() # If it's an edit, write that in me. elif citedict['envelope']['payload']['class'] == 'messagerevision': c.addEdit(citedict['envelope']['local']['payload_sha512']) elif citedict['envelope']['payload']['class'] == 'messagerating': citedme = Envelope() citedme.loaddict(citedict) citedme.dict[ 'envelope'][ 'local'][ 'regardingAuthor'] = c.dict[ 'envelope'][ 'payload'][ 'author'] citedme.saveMongo() elif c.dict['envelope']['payload']['class'] == "messagerating": # If this is a rating, cache the AUTHOR of the rated message. regardingPost = self.db.unsafe.find_one( 'envelopes', {'envelope.local.payload_sha512': c.dict['envelope']['payload']['regarding']}) if regardingPost is not None: c.dict[ 'envelope'][ 'local'][ 'regardingAuthor'] = regardingPost[ 'envelope'][ 'payload'][ 'author'] elif c.dict['envelope']['payload']['class'] == "messagerevision": # This is an edit to an existing message. regardingPost = self.db.unsafe.find_one( 'envelopes', {'envelope.local.payload_sha512': c.dict['envelope']['payload']['regarding']}) if regardingPost is not None: if 'priority' in c.dict['envelope']['payload']: c.dict[ 'envelope'][ 'local'][ 'priority'] = c.dict[ 'envelope'][ 'payload'][ 'priority'] else: c.dict['envelope']['local']['priority'] = 0 # Store this edit. # Save this message out to mongo, so we can then retrieve it in # addEdit(). c.saveMongo() # Modify the original message. r = Envelope() r.loaddict(regardingPost) r.addEdit(c.dict['envelope']['local']['payload_sha512']) # Ensure we have the freshest version in memory. c.reloadmongo() else: self.logger.debug("Received an edit without the original") # Store our Envelope c.saveMongo() return c.dict['envelope']['local']['payload_sha512']
def setup(self): num_nodes = 10 messages_per_server = 100 # Ensure we have conf files for all our simulated nodes. # In particular, we want to make sure they all write to separate databases. for i in range(0, num_nodes): ss = ServerSettings.ServerSettings(settingsfile='tmpnode-' + str(i)) # Give them each a unique DB ss.settings['dbname'] = 'tmp' + str(i) ss.settings['hostname'] = 'tmp' + str(i) ss.saveconfig() del (ss) # Create array of Nodes nodes = [] for i in range(0, num_nodes): print("Creating server " + str(i)) node = Node() node.server = Server.Server(settingsfile='tmpnode-' + str(i), slot=i) node.server.debug = False node.server.logger.setLevel("INFO") node.servernum = i nodes.append(node) for node in nodes: node.server.start() print("We have node - " + str(node.servernum)) SHA512 = hashlib.sha512() SHA512.update(node.server.ServerKeys.pubkey.encode('utf-8')) print("Our keyhash is - " + SHA512.hexdigest()) for count in range(0, messages_per_server): e = Envelope(srv=node.server) # Inserting the time so that each message is different. e.payload.dict[ 'body'] = """This env was inserted into server: """ + str( node.servernum) + """ at """ + str(time.time()) + """ This is message #""" + str(count) + """ Thanks!! """ e.payload.dict['formatting'] = "markdown" e.payload.dict['class'] = "message" e.payload.dict['topic'] = "testmessage" e.payload.dict['subject'] = "Test from server: " + str( node.servernum) user = User() user.generate(AllowGuestKey=False) e.payload.dict['author'] = OrderedDict() e.payload.dict['author']['replyto'] = user.Keys['posted'][ -1].pubkey e.payload.dict['author']['friendlyname'] = user.UserSettings[ 'friendlyname'] e.addStamp(stampclass='author', friendlyname=user.UserSettings['friendlyname'], keys=user.Keys['master'], passkey=user.passkey) msgid = node.server.receiveEnvelope(env=e) print("Sent " + msgid + "to server- " + str(node.servernum))
def setup(self): num_nodes = 10 messages_per_server = 100 # Ensure we have conf files for all our simulated nodes. # In particular, we want to make sure they all write to separate databases. for i in range(0,num_nodes): ss = ServerSettings.ServerSettings(settingsfile='tmpnode-'+str(i)) # Give them each a unique DB ss.settings['dbname'] = 'tmp' + str(i) ss.settings['hostname'] = 'tmp' + str(i) ss.saveconfig() del(ss) # Create array of Nodes nodes = [] for i in range(0,num_nodes): print("Creating server " + str(i)) node = Node() node.server = Server.Server(settingsfile='tmpnode-'+str(i),slot=i) node.server.debug = False node.server.logger.setLevel("INFO") node.servernum = i nodes.append(node) for node in nodes: node.server.start() print("We have node - " + str(node.servernum)) SHA512 = hashlib.sha512() SHA512.update(node.server.ServerKeys.pubkey.encode('utf-8')) print("Our keyhash is - " + SHA512.hexdigest()) for count in range(0,messages_per_server): e = Envelope(srv=node.server) # Inserting the time so that each message is different. e.payload.dict['body'] = """This env was inserted into server: """ + str(node.servernum) + """ at """ + str(time.time()) + """ This is message #""" + str(count) + """ Thanks!! """ e.payload.dict['formatting'] = "markdown" e.payload.dict['class'] = "message" e.payload.dict['topic'] = "testmessage" e.payload.dict['subject'] = "Test from server: " + str(node.servernum) user = User() user.generate(AllowGuestKey=False) e.payload.dict['author'] = OrderedDict() e.payload.dict['author']['replyto'] = user.Keys['posted'][-1].pubkey e.payload.dict['author']['friendlyname'] = user.UserSettings['friendlyname'] e.addStamp(stampclass='author',friendlyname=user.UserSettings['friendlyname'],keys=user.Keys['master'],passkey=user.passkey) msgid = node.server.receiveEnvelope(env=e) print("Sent " + msgid + "to server- " + str(node.servernum))
def receiveEnvelope(self, envstr=None, env=None): """Receive an envelope for processing in the server. Can take either a string, or an envelope obj. """ if envstr is None and env is None: raise Exception( 'receiveEnvelope MUST receive an envelope. Really! ;)') if env is not None: # If we get an envelope, flatten it - The caller may not have. c = env.flatten() else: c = Envelope() c.loadstring(importstring=envstr) # Fill-out the message's local fields. c.munge() # Make sure the message is valid, meets our standards, and is good to # accept and save. if not c.validate(): self.logger.info( "Received an Envelope which does not validate- " + c.payload.hash()) self.logger.debug(c.text()) return False utctime = time.time() existing = self.db.unsafe.find_one( 'envelopes', { 'envelope.local.payload_sha512': c.dict['envelope']['local']['payload_sha512'] }) if existing is not None: self.logger.debug("We already have that msg.") return c.dict['envelope']['local']['payload_sha512'] # Sign the message to saw we saw it. if self.serversettings.settings['mark-seen']: c.addStamp(stampclass='server', keys=self.ServerKeys, hostname=defaultsettings.settings['hostname']) # Store the time, in full UTC (with precision). This is used to skip # pages in the viewer later. c.dict['envelope']['local']['time_added'] = utctime if c.dict['envelope']['payload']['class'] == "message": # If the message referenes anyone, mark the original, for ease of finding it later. # Do this in the 'local' block, so we don't waste bits passing this on to others. # Partners can calculate this when they receive it. if 'regarding' in c.dict['envelope']['payload']: repliedTo = Envelope() if repliedTo.loadmongo( mongo_id=c.dict['envelope']['payload']['regarding']): self.logger.debug( " I am :: " + c.dict['envelope']['local']['payload_sha512']) self.logger.debug( " Adding a cite on my parent :: " + repliedTo.dict['envelope']['local']['payload_sha512']) repliedTo.addcite( c.dict['envelope']['local']['payload_sha512']) c.addAncestor(c.dict['envelope']['payload']['regarding']) print("id is :" + c.dict['envelope']['local']['payload_sha512']) # It could also be that this message is cited BY others we already have! # Sometimes we received them out of order. Better check. for citedict in self.db.unsafe.find( 'envelopes', { 'envelope.payload.regarding': c.dict['envelope']['local']['payload_sha512'] }): self.logger.debug('found existing cite, bad order. ') self.logger.debug( " I am :: " + c.dict['envelope']['local']['payload_sha512']) self.logger.debug( " Found pre-existing cite at :: " + citedict['envelope']['local']['payload_sha512']) # If it's a message, write that in the reply, and in me. if citedict['envelope']['payload']['class'] == 'message': citedme = Envelope() citedme.loaddict(citedict) c.addcite( citedme.dict['envelope']['local']['payload_sha512']) citedme.addAncestor( c.dict['envelope']['local']['payload_sha512']) citedme.saveMongo() # If it's an edit, write that in me. elif citedict['envelope']['payload'][ 'class'] == 'messagerevision': c.addEdit(citedict['envelope']['local']['payload_sha512']) elif citedict['envelope']['payload'][ 'class'] == 'messagerating': citedme = Envelope() citedme.loaddict(citedict) citedme.dict['envelope']['local'][ 'regardingAuthor'] = c.dict['envelope']['payload'][ 'author'] citedme.saveMongo() elif c.dict['envelope']['payload']['class'] == "messagerating": # If this is a rating, cache the AUTHOR of the rated message. regardingPost = self.db.unsafe.find_one( 'envelopes', { 'envelope.local.payload_sha512': c.dict['envelope']['payload']['regarding'] }) if regardingPost is not None: c.dict['envelope']['local']['regardingAuthor'] = regardingPost[ 'envelope']['payload']['author'] elif c.dict['envelope']['payload']['class'] == "messagerevision": # This is an edit to an existing message. regardingPost = self.db.unsafe.find_one( 'envelopes', { 'envelope.local.payload_sha512': c.dict['envelope']['payload']['regarding'] }) if regardingPost is not None: if 'priority' in c.dict['envelope']['payload']: c.dict['envelope']['local']['priority'] = c.dict[ 'envelope']['payload']['priority'] else: c.dict['envelope']['local']['priority'] = 0 # Store this edit. # Save this message out to mongo, so we can then retrieve it in # addEdit(). c.saveMongo() # Modify the original message. r = Envelope() r.loaddict(regardingPost) r.addEdit(c.dict['envelope']['local']['payload_sha512']) # Ensure we have the freshest version in memory. c.reloadmongo() else: self.logger.debug("Received an edit without the original") # Store our Envelope c.saveMongo() return c.dict['envelope']['local']['payload_sha512']