jazz-rs 0.1.0

A framework for CRDT based, end-to-end enrypted distributed apps
Documentation
use conundrum::symm_encr::EncrKey;
use credo::{ClaimKind, GroupSecret, PermissionKind};
use litl::Litl;
use jazz_telepathy::logs::LogID;

use crate::managed_jmbl::LogEncryption;
use crate::ScopedDocID;

pub(crate) fn log_key_secret_name(log_id: LogID) -> String {
    format!("{:?}_key", log_id)
}

pub(crate) fn claim_to_reveal_log_encr_key(
    group_secret: EncrKey<GroupSecret>,
    log_id: LogID,
    log_encr_key: &EncrKey<LogEncryption>,
) -> ClaimKind {
    ClaimKind::RevealToGroupSecret {
        revealed_secret_name: log_key_secret_name(log_id),
        for_key_id: group_secret.id,
        encrypted: group_secret.encrypt(&Litl::from_se(log_encr_key)),
    }
}

pub(crate) fn path_for_doc_branch(scoped_doc_id: ScopedDocID) -> String {
    // TODO-V1: encrypt this
    format!("docs/{}/{}", scoped_doc_id.branch, scoped_doc_id.doc)
}

pub(crate) fn claim_to_declare_log_part_of_doc(
    scoped_doc_id: ScopedDocID,
    log_id: LogID,
) -> ClaimKind {
    ClaimKind::Statement {
        path: path_for_doc_branch(scoped_doc_id),
        // TODO-V1: encrypt this
        value: Litl::from_se(&log_id),
    }
}

pub fn read_permissions() -> Vec<PermissionKind> {
    vec![]
}

pub fn write_permissions() -> Vec<PermissionKind> {
    let mut permissions = read_permissions();
    permissions.extend(vec![
        PermissionKind::RevealSetAccess,
        PermissionKind::MakeStatement {
            path_prefix: "docs/".to_string(),
        },
        PermissionKind::RevealGroupSecret,
        PermissionKind::EntrustToGroupSecret,
        PermissionKind::TimeWitness,
    ]);
    permissions
}

pub fn admin_permissions() -> Vec<PermissionKind> {
    let mut permissions = write_permissions();
    permissions.extend(Some(PermissionKind::AddGroupSecretRecipient));
    permissions.extend(Some(PermissionKind::MakeStatement {
        path_prefix: "invitations/".to_string(),
    },));
    permissions.extend(
        write_permissions()
            .into_iter()
            .map(|permission| PermissionKind::DelegateInfintely(Box::new(permission))),
    );
    permissions
}