offline_license/
offline_license.rs1use ai_cortex_sdk::{
2 verify_offline_license, CortexClient, CortexConfig, OfflineLicenseFile,
3};
4
5#[tokio::main]
15async fn main() {
16 let server_url =
17 std::env::var("CORTEX_SERVER_URL").unwrap_or_else(|_| "http://localhost:40404".into());
18 let pat = std::env::args()
19 .nth(1)
20 .or_else(|| std::env::var("CORTEX_PAT").ok())
21 .unwrap_or_else(|| "REPLACE_WITH_YOUR_PAT".to_string());
22 let software_id = std::env::args()
23 .nth(2)
24 .or_else(|| std::env::var("CORTEX_SOFTWARE_ID").ok())
25 .unwrap_or_else(|| "00000000-0000-0000-0000-000000000000".to_string());
26 let pinned_pk = std::env::args().nth(3);
27
28 let config = CortexConfig::new(&server_url, &pat, &software_id)
30 .without_heartbeat();
31 let config = if let Some(pk) = &pinned_pk {
32 config.with_software_public_key(pk)
33 } else {
34 config
35 };
36 let client = CortexClient::new(config);
37
38 let dev = ai_cortex_sdk::device::collect();
40 let fingerprint = dev.fingerprint.as_str();
41 println!("Device fingerprint: {fingerprint}");
42
43 println!("\n=== Fetch offline license ===");
45 let file: OfflineLicenseFile = match client.fetch_offline_license(fingerprint).await {
46 Ok(f) => f,
47 Err(e) => {
48 eprintln!("fetch failed: {e}");
49 return;
50 }
51 };
52 println!("public_key: {}", file.public_key);
53 println!("signature : {}", file.signature);
54 println!("payload : {}", file.payload);
55
56 println!("\n=== Verify offline license ===");
58 match verify_offline_license(
59 &file,
60 &software_id,
61 fingerprint,
62 pinned_pk.as_deref(),
63 ) {
64 Ok(payload) => {
65 println!("VALID. payload parsed:");
66 println!(" license_id : {}", payload.license_id);
67 println!(" user_id : {}", payload.user_id);
68 println!(" software_id : {}", payload.software_id);
69 println!(" fingerprint : {}", payload.fingerprint);
70 println!(" max_devices : {}", payload.max_devices);
71 println!(" issued_at : {}", payload.issued_at);
72 println!(" expire_time : {}", payload.expire_time);
73 }
74 Err(e) => {
75 eprintln!("INVALID license: {e}");
76 }
77 }
78}