def make_contact_path( pubkey_str, email_addr ): global STORAGE_DIR """ enc_filename = storage.encrypt_data( pubkey_str, email_addr ) enc_filename_salted = storage.salt_string( enc_filename ) enc_filename_b64 = base64.b64encode( enc_filename_salted ) """ # TODO: make this scheme IND-CPA filename_salted = storage.salt_string( email_addr ) filename_b64 = base64.b64encode( filename_salted ) return storage.volume_path( STORAGE_DIR, filename_b64 )
def list_contacts( pubkey_str, privkey_str, start_idx=None, length=None ): global STORAGE_DIR, CACHED_CONTACT_LIST cached_contacts = storage.get_cached_data( privkey_str, CACHED_CONTACT_LIST ) if cached_contacts == None: log.info("No cached contacts") else: return cached_contacts contact_dir = storage.volume_path( STORAGE_DIR ) dir_ents = storage.listdir( contact_dir ) dir_ents.sort() if start_idx == None: start_idx = 0 if length == None: length = len(dir_ents) if start_idx + length > len(dir_ents): length = len(dir_ents) - start_idx dir_ents = dir_ents[start_idx:start_idx + length] contact_emails = [] for contact_filename in dir_ents: contact_path = storage.path_join( contact_dir, contact_filename ) contact = read_contact_from_path( privkey_str, contact_path ) if contact == None: log.warning("Failed to read contact file %s" % contact_path) continue contact_emails.append( contact.addr ) storage.cache_data( pubkey_str, CACHED_CONTACT_LIST, contact_emails ) return contact_emails
def delete_syndicate_user_id( volume ): uid_path = storage.volume_path( USER_STORAGE_DIR, "syndicate_user_id" ) return storage.delete_file( uid_path, volume=volume )
def write_syndicate_user_id( pubkey_pem, user_id, volume ): uid_path = storage.volume_path( USER_STORAGE_DIR, "syndicate_user_id" ) return storage.write_encrypted_file( pubkey_pem, uid_path, user_id, volume=volume )
def read_syndicate_user_id( privkey_pem, volume ): uid_path = storage.volume_path( USER_STORAGE_DIR, "syndicate_user_id" ) return storage.read_encrypted_file( privkey_pem, uid_path, volume=volume )
def attachment_path( message_timestamp, message_id, attachment ): name = attachment_storage_name( message_timestamp, message_id, attachment ) return storage.volume_path( ATTACHMENTS_DIR, name )
def incoming_message_path( message_timestamp, message_id ): # message path for remotely-hosted messages that we know about from our server global INCOMING_DIR return storage.volume_path( INCOMING_DIR, message_handle(message_timestamp, message_id))
def incoming_dir(): global INCOMING_DIR return storage.volume_path( INCOMING_DIR )
def folder_dir( folder_name ): global FOLDERS_DIR return storage.volume_path( folder_dir_atroot(folder_name) )
def make_key_volume_path( name ): global STORAGE_DIR # used for loading the private key from the Volume return storage.volume_path( STORAGE_DIR, name )