@forzalabs/remora
Version:
A powerful CLI tool for seamless data translation.
65 lines (64 loc) • 3.02 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const crypto_1 = __importDefault(require("crypto"));
const PUBLICK_KEY = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7BWugM83YKGzTyZ6kJyy
M01JoGYBQYn/9H9utQQyC/uugV4g9d7vv87I2yUfqiHtx7BQj0mOGctqnK7vuRcg
py7fghTjsUj0MDhs8cEpc+47m0xdsU9MQQ8Xze8B3FcdvCc4xtT5nruTAUWMGIAM
WLHG8lWxkHjTSZn4S0RdpRBB7fw4jyVkc+vXCTtVtYQwMWjcErNFrdCenvci4Vus
nKlyfKS6ccLQphOc/I2w6zllFwD/l90vQeQ6kDO01aJLOmJPzvlU/TSP/lcxCYTA
TgQJQxd5UdnTSDjNw+Uu/jzZ5mVlCbtYH1RoJ6cGNglzN8Q50mVk/iVyoZCZ94b4
bwIDAQAB
-----END PUBLIC KEY-----`;
class LicenceManagerClass {
constructor() {
this.generate = (customer, expirationDays, features, privateKey) => {
const now = new Date();
const expirationDate = new Date(now.getTime() + expirationDays * 24 * 60 * 60 * 1000);
const licenceData = {
customer,
features,
issued: now.toISOString(),
expires: expirationDate.toISOString()
};
const licenceString = JSON.stringify(licenceData);
const sign = crypto_1.default.createSign('SHA256');
sign.update(licenceString);
sign.end();
const signature = sign.sign(privateKey, 'base64');
const licence = { data: licenceData, signature };
return Buffer.from(JSON.stringify(licence)).toString('base64');
};
this.validate = (licence) => {
try {
const licenceJSON = Buffer.from(licence, 'base64').toString();
const licenceData = JSON.parse(licenceJSON);
const { data, signature } = licenceData;
const now = new Date();
const expirationDate = new Date(data.expires);
if (now > expirationDate)
return { valid: false, reason: 'License expired', expiryDate: expirationDate };
const verify = crypto_1.default.createVerify('SHA256');
verify.update(JSON.stringify(data));
const isSignatureValid = verify.verify(PUBLICK_KEY, signature, 'base64');
if (!isSignatureValid)
return { valid: false, reason: 'Invalid license signature' };
return {
valid: true,
expiryDate: expirationDate,
daysRemaining: Math.ceil((expirationDate.getTime() - now.getTime()) / (24 * 60 * 60 * 1000)),
features: data.features,
customer: data.customer
};
}
catch (error) {
return { valid: false, reason: 'License parsing error', details: error.message };
}
};
}
}
const LicenceManager = new LicenceManagerClass();
exports.default = LicenceManager;