diff options
| -rw-r--r-- | Cargo.lock | 2 | ||||
| -rw-r--r-- | Cargo.toml | 2 | ||||
| -rw-r--r-- | src/handlers.rs | 81 |
3 files changed, 45 insertions, 40 deletions
| @@ -503,7 +503,7 @@ dependencies = [ | |||
| 503 | 503 | ||
| 504 | [[package]] | 504 | [[package]] |
| 505 | name = "gradecoin" | 505 | name = "gradecoin" |
| 506 | version = "0.3.0" | 506 | version = "0.3.1" |
| 507 | dependencies = [ | 507 | dependencies = [ |
| 508 | "aes", | 508 | "aes", |
| 509 | "askama", | 509 | "askama", |
| @@ -1,6 +1,6 @@ | |||
| 1 | [package] | 1 | [package] |
| 2 | name = "gradecoin" | 2 | name = "gradecoin" |
| 3 | version = "0.3.0" | 3 | version = "0.3.1" |
| 4 | authors = ["Yigit Sever <yigit@ceng.metu.edu.tr>", | 4 | authors = ["Yigit Sever <yigit@ceng.metu.edu.tr>", |
| 5 | "İlker Işık (necrashter) <iiilker99@gmail.com>", | 5 | "İlker Işık (necrashter) <iiilker99@gmail.com>", |
| 6 | "Alperen Keleş <alpkeles99@gmail.com>"] | 6 | "Alperen Keleş <alpkeles99@gmail.com>"] |
diff --git a/src/handlers.rs b/src/handlers.rs index 09cd2a5..e45ebcd 100644 --- a/src/handlers.rs +++ b/src/handlers.rs | |||
| @@ -335,11 +335,7 @@ pub async fn authenticate_user( | |||
| 335 | }) | 335 | }) |
| 336 | .unwrap(); | 336 | .unwrap(); |
| 337 | 337 | ||
| 338 | fs::write( | 338 | write_guy_file(&db.config.name, &new_user.user_id, &user_at_rest_json); |
| 339 | format!("users/{}/{}.guy", db.config.name, new_user.user_id), | ||
| 340 | user_at_rest_json, | ||
| 341 | ) | ||
| 342 | .unwrap(); | ||
| 343 | 339 | ||
| 344 | let mut userlist = db.users.write(); | 340 | let mut userlist = db.users.write(); |
| 345 | userlist.insert(fingerprint.clone(), new_user); | 341 | userlist.insert(fingerprint.clone(), new_user); |
| @@ -621,34 +617,30 @@ pub async fn propose_block( | |||
| 621 | } | 617 | } |
| 622 | 618 | ||
| 623 | // just update everyone's .guy file | 619 | // just update everyone's .guy file |
| 624 | for (fp, guy) in users_store.iter() { | 620 | for (fp, user) in users_store.iter() { |
| 625 | if !guy.is_bot { | 621 | if !user.is_bot { |
| 626 | let user_at_rest_json = serde_json::to_string(&UserAtRest { | 622 | let user_at_rest_json = serde_json::to_string(&UserAtRest { |
| 627 | fingerprint: fp.clone(), | 623 | fingerprint: fp.clone(), |
| 628 | user: User { | 624 | user: User { |
| 629 | user_id: guy.user_id.clone(), | 625 | user_id: user.user_id.clone(), |
| 630 | public_key: guy.public_key.clone(), | 626 | public_key: user.public_key.clone(), |
| 631 | balance: guy.balance, | 627 | balance: user.balance, |
| 632 | is_bot: false, | 628 | is_bot: false, |
| 633 | }, | 629 | }, |
| 634 | }) | 630 | }) |
| 635 | .unwrap(); | 631 | .unwrap(); |
| 636 | fs::write(format!("users/{}.guy", guy.user_id), user_at_rest_json).unwrap(); | 632 | write_guy_file(&db.config.name, &user.user_id, &user_at_rest_json); |
| 637 | } | 633 | } |
| 638 | } | 634 | } |
| 639 | } | 635 | } |
| 640 | 636 | ||
| 641 | let block_json = serde_json::to_string(&new_block).unwrap(); | 637 | let block_json = serde_json::to_string(&new_block).unwrap(); |
| 642 | 638 | ||
| 643 | fs::write( | 639 | write_block( |
| 644 | format!( | 640 | &db.config.name, |
| 645 | "blocks/{}/{}.block", | 641 | new_block.timestamp.timestamp(), |
| 646 | db.config.name, | 642 | &block_json, |
| 647 | new_block.timestamp.timestamp() | 643 | ); |
| 648 | ), | ||
| 649 | block_json, | ||
| 650 | ) | ||
| 651 | .unwrap(); | ||
| 652 | 644 | ||
| 653 | { | 645 | { |
| 654 | let mut blockchain = db.blockchain.write(); | 646 | let mut blockchain = db.blockchain.write(); |
| @@ -928,13 +920,31 @@ pub async fn propose_transaction( | |||
| 928 | /// GET /block | 920 | /// GET /block |
| 929 | /// Returns the last block's JSON | 921 | /// Returns the last block's JSON |
| 930 | /// Cannot fail | 922 | /// Cannot fail |
| 931 | /// Mostly around for debug purposes | ||
| 932 | pub async fn list_blocks(db: Db) -> Result<impl warp::Reply, Infallible> { | 923 | pub async fn list_blocks(db: Db) -> Result<impl warp::Reply, Infallible> { |
| 933 | let block = db.blockchain.read(); | 924 | let block = db.blockchain.read(); |
| 934 | 925 | ||
| 935 | Ok(reply::with_status(reply::json(&*block), StatusCode::OK)) | 926 | Ok(reply::with_status(reply::json(&*block), StatusCode::OK)) |
| 936 | } | 927 | } |
| 937 | 928 | ||
| 929 | /// GET /user | ||
| 930 | /// Returns an HTML file with the current standing of users | ||
| 931 | pub async fn user_list_handler(db: Db) -> Result<impl warp::Reply, warp::Rejection> { | ||
| 932 | let users = db.users.read(); | ||
| 933 | let mut sane_users = Vec::new(); | ||
| 934 | |||
| 935 | for (fingerprint, user) in users.iter() { | ||
| 936 | sane_users.push(DisplayUsers { | ||
| 937 | fingerprint: fingerprint.clone(), | ||
| 938 | balance: user.balance, | ||
| 939 | is_bot: user.is_bot, | ||
| 940 | }); | ||
| 941 | } | ||
| 942 | |||
| 943 | let template = UserTemplate { users: &sane_users }; | ||
| 944 | let res = template.render().unwrap(); | ||
| 945 | Ok(warp::reply::html(res)) | ||
| 946 | } | ||
| 947 | |||
| 938 | /// Handles the JWT Authorization | 948 | /// Handles the JWT Authorization |
| 939 | /// | 949 | /// |
| 940 | /// *[`jwt_token`]: The raw JWT token, "Bearer aaa.bbb.ccc" | 950 | /// *[`jwt_token`]: The raw JWT token, "Bearer aaa.bbb.ccc" |
| @@ -986,6 +996,18 @@ fn authorize_proposer(jwt_token: &str, user_pem: &str) -> Result<TokenData<Claim | |||
| 986 | Ok(token_payload) | 996 | Ok(token_payload) |
| 987 | } | 997 | } |
| 988 | 998 | ||
| 999 | fn write_guy_file(network_name: &str, guy: &MetuId, content: &str) { | ||
| 1000 | fs::write(format!("users/{}/{}.guy", network_name, guy), content).unwrap(); | ||
| 1001 | } | ||
| 1002 | |||
| 1003 | fn write_block(network_name: &str, timestamp: i64, block: &str) { | ||
| 1004 | fs::write( | ||
| 1005 | format!("blocks/{}/{}.block", network_name, timestamp), | ||
| 1006 | block, | ||
| 1007 | ) | ||
| 1008 | .unwrap(); | ||
| 1009 | } | ||
| 1010 | |||
| 989 | fn calculate_transaction_id(source: &str, target: &str) -> String { | 1011 | fn calculate_transaction_id(source: &str, target: &str) -> String { |
| 990 | let long_fingerprint = format!("{}{}{}", source, target, Utc::now()); | 1012 | let long_fingerprint = format!("{}{}{}", source, target, Utc::now()); |
| 991 | let id = format!("{:x}", Sha256::digest(long_fingerprint.as_bytes())); | 1013 | let id = format!("{:x}", Sha256::digest(long_fingerprint.as_bytes())); |
| @@ -1004,23 +1026,6 @@ struct DisplayUsers { | |||
| 1004 | is_bot: bool, | 1026 | is_bot: bool, |
| 1005 | } | 1027 | } |
| 1006 | 1028 | ||
| 1007 | pub async fn user_list_handler(db: Db) -> Result<impl warp::Reply, warp::Rejection> { | ||
| 1008 | let users = db.users.read(); | ||
| 1009 | let mut sane_users = Vec::new(); | ||
| 1010 | |||
| 1011 | for (fingerprint, user) in users.iter() { | ||
| 1012 | sane_users.push(DisplayUsers { | ||
| 1013 | fingerprint: fingerprint.clone(), | ||
| 1014 | balance: user.balance, | ||
| 1015 | is_bot: user.is_bot, | ||
| 1016 | }); | ||
| 1017 | } | ||
| 1018 | |||
| 1019 | let template = UserTemplate { users: &sane_users }; | ||
| 1020 | let res = template.render().unwrap(); | ||
| 1021 | Ok(warp::reply::html(res)) | ||
| 1022 | } | ||
| 1023 | |||
| 1024 | fn has_unique_elements<T>(iter: T) -> bool | 1029 | fn has_unique_elements<T>(iter: T) -> bool |
| 1025 | where | 1030 | where |
| 1026 | T: IntoIterator, | 1031 | T: IntoIterator, |
