license.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. const FORMAL_AUTH_DATE = '2099-09-09';
  2. const TRIAL_AUTHORIZATION_TEXT = '试用';
  3. const FORMAL_AUTHORIZATION_TEXT = '';
  4. function normalizeDateValue(value: unknown) {
  5. return String(value ?? '').trim();
  6. }
  7. function normalizeFieldKey(value: string) {
  8. return value.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
  9. }
  10. function resolveAuthorizationSource(source?: unknown) {
  11. const raw = source && typeof source === 'object' ? (source as Record<string, any>) : null;
  12. const rawData = raw?.data;
  13. const data = rawData && typeof rawData === 'object' ? (rawData as Record<string, any>) : null;
  14. return {
  15. raw,
  16. rawData,
  17. data,
  18. };
  19. }
  20. function getAuthorizationField(source: Record<string, any> | null, keys: string[]) {
  21. if (!source) return '';
  22. const matchedKey = keys.find((key) => Object.prototype.hasOwnProperty.call(source, key));
  23. if (matchedKey) {
  24. return normalizeDateValue(source[matchedKey]);
  25. }
  26. const matchedNormalizedKey = Object.keys(source).find((key) =>
  27. keys.some((item) => normalizeFieldKey(item) === normalizeFieldKey(key)),
  28. );
  29. return matchedNormalizedKey ? normalizeDateValue(source[matchedNormalizedKey]) : '';
  30. }
  31. function getAuthorizationValue(source: unknown, keys: string[]) {
  32. const { raw, data } = resolveAuthorizationSource(source);
  33. return getAuthorizationField(data, keys) || getAuthorizationField(raw, keys);
  34. }
  35. function getOverDateTimeValue(source?: unknown) {
  36. return getAuthorizationValue(source, ['overDateTime', 'overdatetime']);
  37. }
  38. function toDateNumber(value: string | undefined, fallback: number) {
  39. const parsed = Number(value);
  40. return Number.isFinite(parsed) ? parsed : fallback;
  41. }
  42. export function getAuthorizationExpirationTime(overDateTime?: unknown) {
  43. const normalized = normalizeDateValue(overDateTime);
  44. if (!normalized || isFormalAuthorization(normalized)) return null;
  45. const normalizedDate = normalized.replace(/\//g, '-');
  46. const timezoneMatched = /(?:z|[+-]\d{2}:?\d{2})$/i.test(normalizedDate);
  47. if (timezoneMatched) {
  48. const timestamp = new Date(normalizedDate.replace(' ', 'T')).getTime();
  49. return Number.isFinite(timestamp) ? timestamp : null;
  50. }
  51. const matched = normalizedDate.match(/^(\d{4})-(\d{1,2})-(\d{1,2})(?:[ T](\d{1,2}):(\d{1,2})(?::(\d{1,2}))?)?/);
  52. if (!matched) return null;
  53. const [, year, month, day, hour, minute, second] = matched;
  54. const isDateOnly = hour === undefined;
  55. const date = new Date(
  56. toDateNumber(year, 0),
  57. toDateNumber(month, 1) - 1,
  58. toDateNumber(day, 1),
  59. isDateOnly ? 23 : toDateNumber(hour, 0),
  60. isDateOnly ? 59 : toDateNumber(minute, 0),
  61. isDateOnly ? 59 : toDateNumber(second, 0),
  62. isDateOnly ? 999 : 0,
  63. );
  64. const timestamp = date.getTime();
  65. return Number.isFinite(timestamp) ? timestamp : null;
  66. }
  67. export function isAuthorizationExpired(overDateTime?: unknown, now: Date = new Date()) {
  68. const expirationTime = getAuthorizationExpirationTime(overDateTime);
  69. return expirationTime !== null && expirationTime < now.getTime();
  70. }
  71. export function getAuthorizationExpiredMessage(overDateTime?: unknown) {
  72. const normalized = normalizeDateValue(overDateTime);
  73. return normalized
  74. ? `当前授权已于 ${normalized} 过期,请重新导入有效授权文件或联系管理员。`
  75. : '当前授权已过期,请重新导入有效授权文件或联系管理员。';
  76. }
  77. export function isFormalAuthorization(overDateTime?: unknown) {
  78. const normalized = normalizeDateValue(overDateTime);
  79. return normalized.startsWith(FORMAL_AUTH_DATE);
  80. }
  81. export function getAuthorizationStatus(overDateTime?: unknown) {
  82. return isFormalAuthorization(overDateTime) ? 'formal' : 'trial';
  83. }
  84. export function getAuthorizationLabel(overDateTime?: unknown) {
  85. const normalized = normalizeDateValue(overDateTime);
  86. if (!normalized) return '';
  87. return isFormalAuthorization(normalized) ? FORMAL_AUTHORIZATION_TEXT : TRIAL_AUTHORIZATION_TEXT;
  88. }
  89. export function isTrialAuthorizationLabel(label?: unknown) {
  90. return normalizeDateValue(label).includes('试用');
  91. }
  92. export function extractAuthorizationCache(source?: unknown) {
  93. const { rawData, data } = resolveAuthorizationSource(source);
  94. const overDateTime = getOverDateTimeValue(source);
  95. const authorizationUnit = getAuthorizationValue(source, ['unit']);
  96. const authorizationLabel =
  97. (typeof rawData === 'string' ? normalizeDateValue(rawData) : '') ||
  98. normalizeDateValue(data?.authorizationLabel || data?.authorizationStatus || data?.authStatus || data?.message) ||
  99. getAuthorizationLabel(overDateTime);
  100. return {
  101. authorizationLabel,
  102. overDateTime,
  103. authorizationUnit,
  104. };
  105. }