11//! License key verification using Ed25519 signatures.
22
33use crate :: licensing:: LicenseData ;
4+ use crate :: licensing:: validation_client:: { activate_short_code, is_short_code} ;
45use base64:: { Engine , engine:: general_purpose:: STANDARD as BASE64 } ;
56use ed25519_dalek:: { Signature , Verifier , VerifyingKey } ;
67use serde:: { Deserialize , Serialize } ;
@@ -21,6 +22,7 @@ pub struct LicenseInfo {
2122 pub email : String ,
2223 pub transaction_id : String ,
2324 pub issued_at : String ,
25+ pub organization_name : Option < String > ,
2426}
2527
2628/// Activate a license key. Returns the license info if valid.
@@ -39,9 +41,25 @@ pub fn activate_license(app: &tauri::AppHandle, license_key: &str) -> Result<Lic
3941 email : data. email ,
4042 transaction_id : data. transaction_id ,
4143 issued_at : data. issued_at ,
44+ organization_name : data. organization_name ,
4245 } )
4346}
4447
48+ /// Activate a license key or short code (async version).
49+ /// If the input is a short code (CMDR-XXXX-XXXX-XXXX), it first exchanges it for the full key.
50+ pub async fn activate_license_async ( app : & tauri:: AppHandle , input : & str ) -> Result < LicenseInfo , String > {
51+ let full_key = if is_short_code ( input) {
52+ // Exchange short code for full key via server
53+ activate_short_code ( input) . await ?
54+ } else {
55+ // Already a full key
56+ input. to_string ( )
57+ } ;
58+
59+ // Now activate with the full key
60+ activate_license ( app, & full_key)
61+ }
62+
4563/// Get stored license info, if any.
4664pub fn get_license_info ( app : & tauri:: AppHandle ) -> Option < LicenseInfo > {
4765 let store = app. store ( "license.json" ) . ok ( ) ?;
@@ -51,6 +69,7 @@ pub fn get_license_info(app: &tauri::AppHandle) -> Option<LicenseInfo> {
5169 email : data. email ,
5270 transaction_id : data. transaction_id ,
5371 issued_at : data. issued_at ,
72+ organization_name : data. organization_name ,
5473 } )
5574}
5675
@@ -188,6 +207,7 @@ mod tests {
188207 transaction_id : "txn_test_123" . to_string ( ) ,
189208 issued_at : "2026-01-08T12:00:00Z" . to_string ( ) ,
190209 license_type : None ,
210+ organization_name : Some ( "Test Corp" . to_string ( ) ) ,
191211 } ;
192212
193213 // Serialize payload (same as server)
@@ -210,6 +230,7 @@ mod tests {
210230 assert_eq ! ( data. email, "test@example.com" ) ;
211231 assert_eq ! ( data. transaction_id, "txn_test_123" ) ;
212232 assert_eq ! ( data. issued_at, "2026-01-08T12:00:00Z" ) ;
233+ assert_eq ! ( data. organization_name, Some ( "Test Corp" . to_string( ) ) ) ;
213234 }
214235
215236 /// Test that tampering with license key is detected
@@ -228,6 +249,7 @@ mod tests {
228249 transaction_id : "txn_original" . to_string ( ) ,
229250 issued_at : "2026-01-08T12:00:00Z" . to_string ( ) ,
230251 license_type : None ,
252+ organization_name : Some ( "Original Corp" . to_string ( ) ) ,
231253 } ;
232254 let original_json = serde_json:: to_string ( & original_data) . unwrap ( ) ;
233255 let signature = signing_key. sign ( original_json. as_bytes ( ) ) ;
@@ -239,6 +261,7 @@ mod tests {
239261 transaction_id : "txn_original" . to_string ( ) ,
240262 issued_at : "2026-01-08T12:00:00Z" . to_string ( ) ,
241263 license_type : None ,
264+ organization_name : Some ( "Original Corp" . to_string ( ) ) ,
242265 } ;
243266 let tampered_json = serde_json:: to_string ( & tampered_data) . unwrap ( ) ;
244267 let tampered_payload_base64 = BASE64 . encode ( tampered_json. as_bytes ( ) ) ;
@@ -273,6 +296,7 @@ mod tests {
273296 transaction_id : "txn_test" . to_string ( ) ,
274297 issued_at : "2026-01-08T12:00:00Z" . to_string ( ) ,
275298 license_type : None ,
299+ organization_name : None ,
276300 } ;
277301 let payload_json = serde_json:: to_string ( & license_data) . unwrap ( ) ;
278302 let signature = signing_key. sign ( payload_json. as_bytes ( ) ) ;
0 commit comments