Get bucket during trust promotion or level up

This commit is contained in:
Vecna 2023-09-12 09:13:57 -04:00
parent ae8ca89bc6
commit 5acbd6845c
2 changed files with 24 additions and 28 deletions

View File

@ -75,8 +75,7 @@ pub async fn eligible_for_trust_promotion(
None => return false, None => return false,
}; };
get_cred_trust_level(cred) == 0 get_cred_trust_level(cred) == 0
&& level_since + lox_library::proto::trust_promotion::UNTRUSTED_INTERVAL && level_since + trust_promotion::UNTRUSTED_INTERVAL <= get_today(net).await
<= get_today(net).await
} }
// Helper function to check if credential is eligible for // Helper function to check if credential is eligible for
@ -186,16 +185,11 @@ pub async fn level_up(
encbuckets: &HashMap<u32, EncryptedBucket>, encbuckets: &HashMap<u32, EncryptedBucket>,
lox_pub: &IssuerPubKey, lox_pub: &IssuerPubKey,
reachability_pub: &IssuerPubKey, reachability_pub: &IssuerPubKey,
) -> lox_library::cred::Lox { ) -> (lox_library::cred::Lox, [BridgeLine; MAX_BRIDGES_PER_BUCKET]) {
// Read the bucket in the credential to get today's Bucket // Read the bucket in the credential to get today's Bucket
// Reachability credential // Reachability credential
let (id, key) = lox_library::bridge_table::from_scalar(lox_cred.bucket).unwrap(); let (id, key) = from_scalar(lox_cred.bucket).unwrap();
let bucket = lox_library::bridge_table::BridgeTable::decrypt_bucket( let bucket = BridgeTable::decrypt_bucket(id, &key, &encbuckets.get(&id).unwrap()).unwrap();
id,
&key,
&encbuckets.get(&id).unwrap(),
)
.unwrap();
let reachcred = bucket.1.unwrap(); let reachcred = bucket.1.unwrap();
// Use the Bucket Reachability credential to advance to the next // Use the Bucket Reachability credential to advance to the next
@ -212,7 +206,12 @@ pub async fn level_up(
let encoded_resp = net.request("/levelup".to_string(), encoded_req).await; let encoded_resp = net.request("/levelup".to_string(), encoded_req).await;
let decoded_resp: level_up::Response = serde_json::from_slice(&encoded_resp).unwrap(); let decoded_resp: level_up::Response = serde_json::from_slice(&encoded_resp).unwrap();
let cred = level_up::handle_response(state, decoded_resp, lox_pub).unwrap(); let cred = level_up::handle_response(state, decoded_resp, lox_pub).unwrap();
cred
// Get bucket
let (id, key) = from_scalar(lox_cred.bucket).unwrap();
let bucket = BridgeTable::decrypt_bucket(id, &key, &encbuckets.get(&id).unwrap()).unwrap();
(cred, bucket.0)
} }
// Request an Invitation credential to give to a friend // Request an Invitation credential to give to a friend
@ -227,13 +226,8 @@ pub async fn issue_invite(
// Read the bucket in the credential to get today's Bucket // Read the bucket in the credential to get today's Bucket
// Reachability credential // Reachability credential
let (id, key) = lox_library::bridge_table::from_scalar(lox_cred.bucket).unwrap(); let (id, key) = from_scalar(lox_cred.bucket).unwrap();
let bucket = lox_library::bridge_table::BridgeTable::decrypt_bucket( let bucket = BridgeTable::decrypt_bucket(id, &key, &encbuckets.get(&id).unwrap()).unwrap();
id,
&key,
&encbuckets.get(&id).unwrap(),
)
.unwrap();
let reachcred = bucket.1.unwrap(); let reachcred = bucket.1.unwrap();
let (req, state) = issue_invite::request( let (req, state) = issue_invite::request(

View File

@ -52,7 +52,7 @@ async fn main() {
opts.optflag("I", "invite", "generate invitation for a friend"); opts.optflag("I", "invite", "generate invitation for a friend");
opts.optflag("L", "level-up", "increase trust level"); opts.optflag("L", "level-up", "increase trust level");
opts.optflag("N", "new-lox-cred", "get a new Lox Credential"); opts.optflag("N", "new-lox-cred", "get a new Lox Credential");
opts.optflag("R", "redeem", "redeem invitation"); opts.optopt("R", "redeem", "redeem invitation", "INVITE_FILE");
opts.optopt( opts.optopt(
"", "",
"server", "server",
@ -145,11 +145,11 @@ async fn main() {
(cred, bucket) (cred, bucket)
}; };
let lox_cred = if matches.opt_present("L") { let (lox_cred, bucket) = if matches.opt_present("L") {
let old_level = get_cred_trust_level(&lox_cred); let old_level = get_cred_trust_level(&lox_cred);
// If trust level is 0, do trust promotion, otherwise level up. // If trust level is 0, do trust promotion, otherwise level up.
let cred = if old_level == 0 { let (cred, bucket) = if old_level == 0 {
if eligible_for_trust_promotion(&net, &lox_cred).await { if eligible_for_trust_promotion(&net, &lox_cred).await {
let migration_cred = let migration_cred =
trust_promotion(&net, &lox_cred, get_lox_pub(&lox_auth_pubkeys)).await; trust_promotion(&net, &lox_cred, get_lox_pub(&lox_auth_pubkeys)).await;
@ -161,14 +161,15 @@ async fn main() {
get_migration_pub(&lox_auth_pubkeys), get_migration_pub(&lox_auth_pubkeys),
) )
.await; .await;
cred let bucket = get_bucket(&net, &cred).await;
(cred, bucket)
} else { } else {
lox_cred (lox_cred, bucket)
} }
} else { } else {
if eligible_for_level_up(&net, &lox_cred).await { if eligible_for_level_up(&net, &lox_cred).await {
let encbuckets = get_reachability_credential(&net).await; let encbuckets = get_reachability_credential(&net).await;
let cred = level_up( let (cred, bucket) = level_up(
&net, &net,
&lox_cred, &lox_cred,
&encbuckets, &encbuckets,
@ -176,21 +177,22 @@ async fn main() {
get_reachability_pub(&lox_auth_pubkeys), get_reachability_pub(&lox_auth_pubkeys),
) )
.await; .await;
cred (cred, bucket)
} else { } else {
lox_cred (lox_cred, bucket)
} }
}; };
save_object(&cred, &lox_cred_filename); save_object(&cred, &lox_cred_filename);
save_object(&bucket, &bucket_filename);
let new_level = get_cred_trust_level(&cred); let new_level = get_cred_trust_level(&cred);
if new_level > old_level { if new_level > old_level {
println!("Old level: {}\nNew level: {}", old_level, new_level); println!("Old level: {}\nNew level: {}", old_level, new_level);
} else if new_level == old_level { } else if new_level == old_level {
println!("Unable to level up. Current level: {}", new_level); println!("Unable to level up. Current level: {}", new_level);
} }
cred (cred, bucket)
} else { } else {
lox_cred (lox_cred, bucket)
}; };
// Invite a friend // Invite a friend