@@ -4,6 +4,7 @@ import { base64Decode } from "@/lib/utils";
44import { z } from "zod" ;
55import { SOURCEBOT_SUPPORT_EMAIL } from "@/lib/constants" ;
66import { createLogger } from "@sourcebot/logger" ;
7+ import { verifySignature } from "@sourcebot/crypto" ;
78
89const logger = createLogger ( 'entitlements' ) ;
910
@@ -15,6 +16,7 @@ const eeLicenseKeyPayloadSchema = z.object({
1516 seats : z . number ( ) ,
1617 // ISO 8601 date string
1718 expiryDate : z . string ( ) . datetime ( ) ,
19+ sig : z . string ( ) ,
1820} ) ;
1921
2022type LicenseKeyPayload = z . infer < typeof eeLicenseKeyPayloadSchema > ;
@@ -23,7 +25,26 @@ const decodeLicenseKeyPayload = (payload: string): LicenseKeyPayload => {
2325 try {
2426 const decodedPayload = base64Decode ( payload ) ;
2527 const payloadJson = JSON . parse ( decodedPayload ) ;
26- return eeLicenseKeyPayloadSchema . parse ( payloadJson ) ;
28+ const licenseData = eeLicenseKeyPayloadSchema . parse ( payloadJson ) ;
29+
30+ if ( env . SOURCEBOT_PUBLIC_KEY_PATH ) {
31+ const dataToVerify = JSON . stringify ( {
32+ expiryDate : licenseData . expiryDate ,
33+ id : licenseData . id ,
34+ seats : licenseData . seats
35+ } ) ;
36+
37+ const isSignatureValid = verifySignature ( dataToVerify , licenseData . sig , env . SOURCEBOT_PUBLIC_KEY_PATH ) ;
38+ if ( ! isSignatureValid ) {
39+ logger . error ( 'License key signature verification failed' ) ;
40+ process . exit ( 1 ) ;
41+ }
42+ } else {
43+ logger . error ( 'No public key path provided, unable to verify license key signature' ) ;
44+ process . exit ( 1 ) ;
45+ }
46+
47+ return licenseData ;
2748 } catch ( error ) {
2849 logger . error ( `Failed to decode license key payload: ${ error } ` ) ;
2950 process . exit ( 1 ) ;
0 commit comments