Skip to content

Message passing in Diaspora

benlangfeld edited this page Oct 7, 2010 · 12 revisions

Current as of Oct 6, 11:00 PM

Message Passing

Given an object like a StatusMessage or a friend request, Diaspora first serializes that object to xml with post.to_diaspora_xml def push_to_people(post, people) salmon = salmon(post) <---- this is just Salmon::SalmonSlap.create(self, post.to_diaspora_xml) people.each{|person| xml = salmon.xml_for person push_to_person( person, xml) } end

Salmon::SalmonSlap.create aes encrypts the body(that xml) and signs the aes ciphertext def self.create(user, activity) salmon = self.new salmon.author = user.person aes_key_hash = user.person.gen_aes_key salmon.aes_key = aes_key_hash['key'] salmon.iv = aes_key_hash['iv'] salmon.magic_sig = MagicSigEnvelope.create(user , user.person.aes_encrypt(activity, aes_key_hash)) salmon end

before push_to_person is called the salmon object encrypts the headers with person's public key and returns the xml of the form:

<salmon>
    <encrypted author info>
        author name
        author diaspora_handle
        aes-private-key
    </encrypted author info>
    <data>
        aes encrypted data
    </data>
    <salmon signature>
         On the aes encrypted data
    </salmon signature>
</salmon>

the resulting xml is then POSTed it to the receive hook of the person that is passed in. QUEUE.add_post_request( person.receive_url, xml )

Discovery

Given a diaspora_handle, Diaspora webfingers that server, creates a Person object from the information retrieved, and stores it in the database. The information from webfinger is a collection of tags. Diaspora uses the webfinger description to find the user's seed URL, the globally unique identifier (guid), and the public encryption key.

  • <Link rel="http://joindiaspora.com/seed_location" type = 'text/html' href="http://tom.joindiaspora.com/"/>
  • <Link rel="http://joindiaspora.com/guid" type = 'text/html' href="4c97e47634b7da329d000003"/>
  • <Link rel="diaspora-public-key" type = 'RSA' href="LS0...=="/>
Clone this wiki locally