Files
kintone-data-aggregator-plugin/src/utils/license-storage.ts
2025-11-03 17:07:28 +08:00

148 lines
3.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 本地存储加密工具类
import { LicenseService } from '@/services/license-service';
import type { LicenseJWSResult, LicenseSetting, SavedLicense } from '@/types/license';
import { KJUR } from 'jsrsasign';
export class LicenseStorage {
private static readonly STORAGE_KEY_PREFIX = 'alicorns_plugin_';
private static readonly STORAGE_SETTING_KEY_PREFIX = this.STORAGE_KEY_PREFIX + 'setting_';
/**
* 生成存储key
*/
private static generateStorageKey(pluginId: string): string {
return `${this.STORAGE_KEY_PREFIX}${pluginId}`;
}
/**
* 保存 JWT 到本地存储
*/
static saveLicense(jwt: string): SavedLicense | null {
try {
// 从 JWT 中提取 pluginId 以生成存储key
if (!jwt) return null;
// 解码JWT
const savedLicense = this.convertToSavedLicense(jwt);
if (!savedLicense) {
return null;
}
const key = this.generateStorageKey(savedLicense.licenseInfo.pluginId);
localStorage.setItem(key, jwt);
return savedLicense;
} catch (error) {
console.error('Failed to save license:', error);
throw error;
}
}
/**
* 从本地存储获取许可证信息
*/
static getLicense(pluginId: string): SavedLicense | null {
try {
const key = this.generateStorageKey(pluginId);
const storedJWT = localStorage.getItem(key);
if (!storedJWT) return null;
// 解码JWT
const savedLicense = this.convertToSavedLicense(storedJWT);
if (!savedLicense) {
// JWT解析失败清理存储
this.clearLicense(pluginId);
return null;
}
const isValid = LicenseService.checkLicenseAvailable(savedLicense);
if (!isValid) {
// 获取许可证信息失败,清理存储
this.clearLicense(pluginId);
return null;
}
return savedLicense;
} catch (error) {
console.error('Failed to get license:', error);
// 如果获取失败,清空本地存储
this.clearLicense(pluginId);
return null;
}
}
static convertToSavedLicense(storedJWT: string): SavedLicense | null {
if (!storedJWT) return null;
// decode
let decodedJWT: LicenseJWSResult;
try {
decodedJWT = KJUR.jws.JWS.parse(storedJWT) as LicenseJWSResult;
if (!decodedJWT) {
return null;
}
} catch (error) {
console.error('Failed to get license:', error);
return null;
}
return {
jwt: storedJWT,
parsed: decodedJWT,
licenseInfo: decodedJWT.payloadObj!,
}
}
/**
* 清除许可证信息
*/
static clearLicense(pluginId: string): void {
const key = this.generateStorageKey(pluginId);
localStorage.removeItem(key);
}
/**
* 生成存储key
*/
private static generateSettingStorageKey(pluginId: string): string {
return `${this.STORAGE_SETTING_KEY_PREFIX}${pluginId}`;
}
/**
* 保存设置信息到本地存储
*/
static saveSetting(setting: LicenseSetting, pluginId: string): void {
try {
const key = this.generateSettingStorageKey(pluginId);
localStorage.setItem(key, JSON.stringify(setting));
} catch (error) {
console.error('Failed to save setting:', error);
throw error;
}
}
/**
* 从本地存储获取设置信息
*/
static getSettings(pluginId: string): LicenseSetting {
try {
const key = this.generateSettingStorageKey(pluginId);
const storedData = localStorage.getItem(key);
if (!storedData) return {};
return JSON.parse(storedData);
} catch (error) {
console.error('Failed to get setting:', error);
return {};
}
}
/**
* 清除设置信息
*/
static clearSetting(pluginId: string): void {
const key = this.generateSettingStorageKey(pluginId);
localStorage.removeItem(key);
}
}