diff --git a/crates/rooch-framework-tests/src/tests/transaction_validator_tests.rs b/crates/rooch-framework-tests/src/tests/transaction_validator_tests.rs index e0f8fe03be..021520ed47 100644 --- a/crates/rooch-framework-tests/src/tests/transaction_validator_tests.rs +++ b/crates/rooch-framework-tests/src/tests/transaction_validator_tests.rs @@ -38,7 +38,7 @@ fn test_session_key_rooch() { ) .unwrap(); let app_name = MoveString::from_str("test").unwrap(); - let app_url = MoveAsciiString::from_str("https:://test.rooch.network").unwrap(); + let app_url = MoveAsciiString::from_str("https://test-seed.rooch.network").unwrap(); let max_inactive_interval = 100; let action = rooch_types::framework::session_key::SessionKeyModule::create_session_key_action( app_name, diff --git a/crates/rooch-types/src/framework/auth_validator.rs b/crates/rooch-types/src/framework/auth_validator.rs index 3301b591b9..167d26090c 100644 --- a/crates/rooch-types/src/framework/auth_validator.rs +++ b/crates/rooch-types/src/framework/auth_validator.rs @@ -158,7 +158,7 @@ pub struct TxValidateResult { impl MoveStructType for TxValidateResult { const ADDRESS: AccountAddress = ROOCH_FRAMEWORK_ADDRESS; - const MODULE_NAME: &'static IdentStr = ident_str!("transaction_validtor"); + const MODULE_NAME: &'static IdentStr = ident_str!("auth_validator"); const STRUCT_NAME: &'static IdentStr = ident_str!("TxValidateResult"); } @@ -177,6 +177,10 @@ impl MoveStructState for TxValidateResult { } impl TxValidateResult { + pub fn auth_validator_id(&self) -> u64 { + self.auth_validator_id.clone() + } + pub fn auth_validator(&self) -> Option { self.auth_validator.clone().into() } diff --git a/crates/testsuite/features/cmd.feature b/crates/testsuite/features/cmd.feature index a5effe1803..f51757ea3f 100644 --- a/crates/testsuite/features/cmd.feature +++ b/crates/testsuite/features/cmd.feature @@ -37,10 +37,15 @@ Feature: Rooch CLI integration tests Then assert: "{{$.move[-1].execution_info.status.type}} == executed" # session key - Then cmd: "session-key create --app-name test --app-url https:://test.rooch.network --scope 0x3::empty::empty" + Then cmd: "session-key create --app-name test --app-url https://test-seed.rooch.network --scope 0x3::empty::empty" Then cmd: "move run --function 0x3::empty::empty --session-key {{$.session-key[-1].authentication_key}}" Then assert: "{{$.move[-1].execution_info.status.type}} == executed" + # session key from session key + Then cmd: "session-key create --app-name test --app-url https://test-seed.rooch.network --session-key {{$.session-key[-1].authentication_key}} --scope 0x3::empty::empty" + Then cmd: "move run --function 0x3:cargo test -p testsuite --test integration:empty::empty --session-key {{$.session-key[-1].authentication_key}}" + Then assert: "{{$.move[-1].execution_info.status.type}} == executed" + # transaction Then cmd: "transaction get-transactions-by-order --cursor 0 --limit 1 --descending-order false" Then cmd: "transaction get-transactions-by-hash --hashes {{$.transaction[-1].data[0].execution_info.tx_hash}}" diff --git a/frameworks/rooch-framework/doc/auth_validator.md b/frameworks/rooch-framework/doc/auth_validator.md index f3634b4f4a..cc743d5a12 100644 --- a/frameworks/rooch-framework/doc/auth_validator.md +++ b/frameworks/rooch-framework/doc/auth_validator.md @@ -200,7 +200,7 @@ Get the auth validator's id from the TxValidateResult in the TxContext ## Function `get_session_key_from_ctx_option` Get the session key from the TxValidateResult in the TxContext -If the TxValidateResult is None or SessionKey is None, return None +If the TxValidateResult, AuthValidator or SessionKey is None, return None
public fun get_session_key_from_ctx_option(): option::Option<vector<u8>>
diff --git a/frameworks/rooch-framework/sources/auth_validator/auth_validator.move b/frameworks/rooch-framework/sources/auth_validator/auth_validator.move
index c5809050d0..18ca469f33 100644
--- a/frameworks/rooch-framework/sources/auth_validator/auth_validator.move
+++ b/frameworks/rooch-framework/sources/auth_validator/auth_validator.move
@@ -95,12 +95,12 @@ module rooch_framework::auth_validator {
     }
 
     /// Get the session key from the TxValidateResult in the TxContext
-    /// If the TxValidateResult is None or SessionKey is None, return None
+    /// If the TxValidateResult, AuthValidator or SessionKey is None, return None
     public fun get_session_key_from_ctx_option(): Option> {
         let validate_result_opt = tx_context::get_attribute();
         if (option::is_some(&validate_result_opt)) {
             let validate_result = option::extract(&mut validate_result_opt);
-            validate_result.session_key 
+            validate_result.session_key
         }else {
             option::none>()
         }
diff --git a/frameworks/rooch-framework/sources/tests/session_key_test.move b/frameworks/rooch-framework/sources/tests/session_key_test.move
index 7f63c9f13d..111be8ea99 100644
--- a/frameworks/rooch-framework/sources/tests/session_key_test.move
+++ b/frameworks/rooch-framework/sources/tests/session_key_test.move
@@ -12,6 +12,9 @@ module rooch_framework::session_key_test{
     use rooch_framework::session_key;
     use rooch_framework::timestamp;
 
+    /// Create session key in this context is not allowed
+    const ErrorSessionKeyCreatePermissionDenied: u64 = 1;
+
     #[test]
     fun test_session_key_end_to_end(){
         rooch_framework::genesis::init_for_test();
@@ -21,8 +24,8 @@ module rooch_framework::session_key_test{
         let authentication_key = bcs::to_bytes(&sender_addr);
         let max_inactive_interval = 10;
         let app_name = std::string::utf8(b"test");
-        let app_url = std::ascii::string(b"https://test.rooch.network");
-        session_key::create_session_key(&sender, app_name, app_url,  authentication_key, vector::singleton(scope), max_inactive_interval);
+        let app_url = std::ascii::string(b"https://test-seed.rooch.network");
+        session_key::create_session_key(&sender, app_name, app_url, authentication_key, vector::singleton(scope), max_inactive_interval);
         let session_key_opt = session_key::get_session_key(sender_addr, authentication_key);
         assert!(option::is_some(&session_key_opt), 1000);
 
@@ -35,9 +38,31 @@ module rooch_framework::session_key_test{
         timestamp::fast_forward_seconds_for_test(2);
         assert!(session_key::is_expired_session_key(sender_addr, authentication_key), 1004);
         session_key::remove_session_key(&sender, authentication_key);
+    }
+
+    #[test]
+    #[expected_failure(abort_code = ErrorSessionKeyCreatePermissionDenied, location = Self)]
+    fun test_session_key_from_session_key(){
+        rooch_framework::genesis::init_for_test();
+        let sender_addr = tx_context::sender();
+        let sender = moveos_std::account::create_signer_for_testing(sender_addr);
+        let scope = session_key::new_session_scope(@0x1, std::ascii::string(b"*"), std::ascii::string(b"*"));
+        let authentication_key = bcs::to_bytes(&sender_addr);
+        let max_inactive_interval = 10;
+        let app_name = std::string::utf8(b"test");
+        let app_url = std::ascii::string(b"https://test-seed.rooch.network");
+        session_key::create_session_key(&sender, app_name, app_url, authentication_key, vector::singleton(scope), max_inactive_interval);
+        let session_key_opt = session_key::get_session_key(sender_addr, authentication_key);
+        assert!(option::is_some(&session_key_opt), 1000);
+
+        let session_key = bcs::to_bytes(&option::extract(&mut session_key_opt));
+        std::debug::print(&session_key);
+        session_key::create_session_key(&sender, app_name, app_url, session_key, vector::singleton(scope), max_inactive_interval);
+        let other_session_key_opt = session_key::get_session_key(sender_addr, session_key);
+        assert!(option::is_some(&other_session_key_opt), 1000);
 
-        
-        
+        let other_session_key = bcs::to_bytes(&option::extract(&mut other_session_key_opt));
+        std::debug::print(&other_session_key);
     }
 
 }