use super::helpers::*;
use eidetica::{
Instance,
auth::Permission,
backend::database::InMemory,
crdt::{Doc, doc::Value},
instance::LegacyInstanceOps,
};
use std::time::Duration;
#[tokio::test]
async fn test_bootstrap_permission_denied_insufficient_admin() {
println!("\n๐งช TEST: Bootstrap with insufficient admin permissions (should be rejected)");
let server_instance =
Instance::open(Box::new(InMemory::new())).expect("Failed to create test instance");
server_instance
.enable_sync()
.expect("Failed to initialize sync on server");
server_instance
.add_private_key("server_admin")
.expect("Failed to add server admin key");
let mut settings = Doc::new();
settings.set_string("name", "Restricted Database");
let server_admin_pubkey = server_instance
.get_formatted_public_key("server_admin")
.expect("Failed to get server admin public key");
let mut auth_doc = Doc::new();
auth_doc
.set_json(
"server_admin",
serde_json::json!({
"pubkey": server_admin_pubkey,
"permissions": {"Admin": 0}, "status": "Active"
}),
)
.expect("Failed to set server admin auth");
settings.set_doc("auth", auth_doc);
let server_database = server_instance
.new_database(settings, "server_admin")
.expect("Failed to create restricted database");
let restricted_tree_id = server_database.root_id().clone();
println!(
"๐ Created restricted database with ID: {}",
restricted_tree_id
);
let server_addr = {
let server_sync = server_instance.sync().expect("Server should have sync");
start_sync_server(&server_sync).await
};
let client_instance =
Instance::open(Box::new(InMemory::new())).expect("Failed to create test instance");
client_instance
.enable_sync()
.expect("Failed to initialize sync on client");
client_instance
.add_private_key("unauthorized_client")
.expect("Failed to add client key");
let client_pubkey = client_instance
.get_formatted_public_key("unauthorized_client")
.expect("Failed to get client public key");
println!(
"๐ค Client attempting bootstrap with unauthorized key: {}",
client_pubkey
);
let bootstrap_result = {
let client_sync = client_instance.sync().expect("Client should have sync");
client_sync
.enable_http_transport()
.expect("Failed to enable HTTP transport");
let result = client_sync
.sync_with_peer_for_bootstrap(
&server_addr,
&restricted_tree_id,
"unauthorized_client", Permission::Write(10), )
.await;
tokio::time::sleep(Duration::from_millis(100)).await;
result
};
println!("๐ Bootstrap result: {:?}", bootstrap_result);
assert!(
bootstrap_result.is_err(),
"Bootstrap should be REJECTED for unauthorized client - test fails because security is not implemented"
);
assert!(
client_instance.load_database(&restricted_tree_id).is_err(),
"Client should be DENIED access to restricted database - test fails because security is not implemented"
);
let server_auth_settings = server_database
.get_settings()
.expect("Failed to get server database settings")
.get_all()
.expect("Failed to get all settings");
if let Some(auth_node) = server_auth_settings.get("auth")
&& let Value::Doc(auth_doc) = auth_node
{
assert!(
!auth_doc.as_hashmap().contains_key("unauthorized_client"),
"Unauthorized client key should NOT be added to server auth config - test fails because security is not implemented"
);
println!(
"๐ Server auth keys should remain unchanged: {:?}",
auth_doc.as_hashmap().keys().collect::<Vec<_>>()
);
}
println!(
"โ
TEST: Expected secure behavior (will fail until security is properly implemented)"
);
let server_sync = server_instance.sync().expect("Server should have sync");
server_sync.stop_server_async().await.unwrap();
}
#[tokio::test]
async fn test_bootstrap_permission_denied_no_auth_config() {
println!(
"\n๐งช TEST: Bootstrap key approval with no auth config (should have defined behavior)"
);
let server_instance =
Instance::open(Box::new(InMemory::new())).expect("Failed to create test instance");
server_instance
.enable_sync()
.expect("Failed to initialize sync on server");
server_instance
.add_private_key("server_key")
.expect("Failed to add server key");
let mut settings = Doc::new();
settings.set_string("name", "Unprotected Database");
let server_database = server_instance
.new_database(settings, "server_key")
.expect("Failed to create unprotected database");
let unprotected_tree_id = server_database.root_id().clone();
println!(
"๐ Created database with no auth config, ID: {}",
unprotected_tree_id
);
let server_addr = {
let server_sync = server_instance.sync().expect("Server should have sync");
start_sync_server(&server_sync).await
};
let client_instance =
Instance::open(Box::new(InMemory::new())).expect("Failed to create test instance");
client_instance
.enable_sync()
.expect("Failed to initialize sync on client");
client_instance
.add_private_key("client_key")
.expect("Failed to add client key");
let _client_pubkey = client_instance
.get_formatted_public_key("client_key")
.expect("Failed to get client public key");
let bootstrap_result = {
let client_sync = client_instance.sync().expect("Client should have sync");
client_sync
.enable_http_transport()
.expect("Failed to enable HTTP transport");
let result = client_sync
.sync_with_peer_for_bootstrap(
&server_addr,
&unprotected_tree_id,
"client_key",
Permission::Write(10),
)
.await;
tokio::time::sleep(Duration::from_millis(100)).await;
result
};
println!("๐ Bootstrap result: {:?}", bootstrap_result);
assert!(
bootstrap_result.is_err(),
"Bootstrap should FAIL when no auth framework exists to validate against - test fails because security policy is not implemented"
);
assert!(
client_instance.load_database(&unprotected_tree_id).is_err(),
"Client should not receive database without proper authorization framework - test fails because security is not implemented"
);
let server_auth_settings = server_database
.get_settings()
.expect("Failed to get server database settings")
.get_all()
.expect("Failed to get all settings");
if let Some(auth_node) = server_auth_settings.get("auth")
&& let Value::Doc(auth_doc) = auth_node
{
assert!(
!auth_doc.as_hashmap().contains_key("client_key"),
"Auth config should NOT be created by unauthorized bootstrap - test fails because security is not implemented"
);
println!(
"๐ Server should not have unauthorized auth modifications: {:?}",
auth_doc.as_hashmap().keys().collect::<Vec<_>>()
);
}
println!(
"โ
TEST: Expected secure behavior for no-auth database (will fail until proper security policy is implemented)"
);
let server_sync = server_instance.sync().expect("Server should have sync");
server_sync.stop_server_async().await.unwrap();
}
#[tokio::test]
async fn test_bootstrap_invalid_public_key_format() {
println!("\n๐งช TEST: Bootstrap with malformed public key format");
let server_instance =
Instance::open(Box::new(InMemory::new())).expect("Failed to create test instance");
server_instance
.enable_sync()
.expect("Failed to initialize sync on server");
server_instance
.add_private_key("server_key")
.expect("Failed to add server key");
let mut settings = Doc::new();
settings.set_string("name", "Test Database");
let server_database = server_instance
.new_database(settings, "server_key")
.expect("Failed to create database");
let tree_id = server_database.root_id().clone();
let server_addr = {
let server_sync = server_instance.sync().expect("Server should have sync");
start_sync_server(&server_sync).await
};
let client_instance =
Instance::open(Box::new(InMemory::new())).expect("Failed to create test instance");
client_instance
.enable_sync()
.expect("Failed to initialize sync on client");
client_instance
.add_private_key("client_with_spaces_and_symbols!@#")
.expect("Failed to add client key");
let client_sync = client_instance.sync().expect("Client should have sync");
client_sync
.enable_http_transport()
.expect("Failed to enable HTTP transport");
let bootstrap_result = client_sync
.sync_with_peer_for_bootstrap(
&server_addr,
&tree_id,
"client_with_spaces_and_symbols!@#",
Permission::Write(10),
)
.await;
tokio::time::sleep(Duration::from_millis(100)).await;
println!(
"๐ Bootstrap result with unusual key name: {:?}",
bootstrap_result
);
assert!(
bootstrap_result.is_err(),
"Bootstrap should FAIL with unusual key name due to proper validation - test fails because validation is not implemented"
);
println!("โ
Expected secure behavior: Bootstrap rejected unusual key name");
let server_sync = server_instance.sync().expect("Server should have sync");
server_sync.stop_server_async().await.unwrap();
}
#[tokio::test]
async fn test_bootstrap_with_revoked_key() {
println!("\n๐งช TEST: Bootstrap attempt with revoked key");
let server_instance =
Instance::open(Box::new(InMemory::new())).expect("Failed to create test instance");
server_instance
.enable_sync()
.expect("Failed to initialize sync on server");
server_instance
.add_private_key("server_admin")
.expect("Failed to add server admin key");
server_instance
.add_private_key("revoked_client")
.expect("Failed to add revoked client key");
let server_admin_pubkey = server_instance
.get_formatted_public_key("server_admin")
.expect("Failed to get server admin public key");
let revoked_client_pubkey = server_instance
.get_formatted_public_key("revoked_client")
.expect("Failed to get revoked client public key");
let mut settings = Doc::new();
settings.set_string("name", "Database With Revoked Key");
let mut auth_doc = Doc::new();
auth_doc
.set_json(
"server_admin",
serde_json::json!({
"pubkey": server_admin_pubkey,
"permissions": {"Admin": 0},
"status": "Active"
}),
)
.expect("Failed to set server admin auth");
auth_doc
.set_json(
"revoked_client",
serde_json::json!({
"pubkey": revoked_client_pubkey,
"permissions": {"Write": 10},
"status": "Revoked" }),
)
.expect("Failed to set revoked client auth");
settings.set_doc("auth", auth_doc);
let server_database = server_instance
.new_database(settings, "server_admin")
.expect("Failed to create database");
let tree_id = server_database.root_id().clone();
let server_addr = {
let server_sync = server_instance.sync().expect("Server should have sync");
start_sync_server(&server_sync).await
};
let client_instance =
Instance::open(Box::new(InMemory::new())).expect("Failed to create test instance");
client_instance
.enable_sync()
.expect("Failed to initialize sync on client");
client_instance
.add_private_key("attempting_revoked_access")
.expect("Failed to add client key");
let client_sync = client_instance.sync().expect("Client should have sync");
client_sync
.enable_http_transport()
.expect("Failed to enable HTTP transport");
let bootstrap_result = client_sync
.sync_with_peer_for_bootstrap(
&server_addr,
&tree_id,
"attempting_revoked_access",
Permission::Write(10),
)
.await;
tokio::time::sleep(Duration::from_millis(100)).await;
println!(
"๐ Bootstrap result with new key on database containing revoked keys: {:?}",
bootstrap_result
);
assert!(
bootstrap_result.is_err(),
"Bootstrap should FAIL when database contains revoked keys and proper validation exists - test fails because key status validation is not implemented"
);
println!(
"โ
TEST: Expected secure behavior for revoked key scenario (will fail until key status validation is implemented)"
);
let server_sync = server_instance.sync().expect("Server should have sync");
server_sync.stop_server_async().await.unwrap();
}
#[tokio::test]
async fn test_bootstrap_exceeds_granted_permissions() {
println!("\n๐งช TEST: Bootstrap requesting excessive permissions");
let server_instance =
Instance::open(Box::new(InMemory::new())).expect("Failed to create test instance");
server_instance
.enable_sync()
.expect("Failed to initialize sync on server");
server_instance
.add_private_key("server_admin")
.expect("Failed to add server admin key");
let server_admin_pubkey = server_instance
.get_formatted_public_key("server_admin")
.expect("Failed to get server admin public key");
let mut settings = Doc::new();
settings.set_string("name", "Restrictive Permission Database");
let mut auth_doc = Doc::new();
auth_doc
.set_json(
"server_admin",
serde_json::json!({
"pubkey": server_admin_pubkey,
"permissions": {"Admin": 0},
"status": "Active"
}),
)
.expect("Failed to set server admin auth");
settings.set_doc("auth", auth_doc);
let server_database = server_instance
.new_database(settings, "server_admin")
.expect("Failed to create database");
let tree_id = server_database.root_id().clone();
let server_addr = {
let server_sync = server_instance.sync().expect("Server should have sync");
start_sync_server(&server_sync).await
};
let client_instance =
Instance::open(Box::new(InMemory::new())).expect("Failed to create test instance");
client_instance
.enable_sync()
.expect("Failed to initialize sync on client");
client_instance
.add_private_key("greedy_client")
.expect("Failed to add client key");
let client_sync = client_instance.sync().expect("Client should have sync");
client_sync
.enable_http_transport()
.expect("Failed to enable HTTP transport");
let bootstrap_result = client_sync
.sync_with_peer_for_bootstrap(
&server_addr,
&tree_id,
"greedy_client",
Permission::Admin(0), )
.await;
tokio::time::sleep(Duration::from_millis(100)).await;
println!(
"๐ Bootstrap result requesting excessive Admin permissions: {:?}",
bootstrap_result
);
assert!(
bootstrap_result.is_err(),
"Bootstrap should FAIL when requesting excessive Admin permissions - test fails because permission validation is not implemented"
);
let server_auth_settings = server_database
.get_settings()
.expect("Failed to get server database settings")
.get_all()
.expect("Failed to get all settings");
if let Some(auth_node) = server_auth_settings.get("auth")
&& let Value::Doc(auth_doc) = auth_node
{
assert!(
!auth_doc.as_hashmap().contains_key("greedy_client"),
"Greedy client should NOT be granted any permissions for excessive request - test fails because permission validation is not implemented"
);
}
println!(
"โ
TEST: Expected secure behavior for excessive permission requests (will fail until permission validation is implemented)"
);
let server_sync = server_instance.sync().expect("Server should have sync");
server_sync.stop_server_async().await.unwrap();
}