@lumiapassport/ui-kit 1.14.20 → 1.14.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -15,7 +15,7 @@
15
15
  <meta http-equiv="X-Content-Type-Options" content="nosniff" />
16
16
  <meta http-equiv="Referrer-Policy" content="strict-origin-when-cross-origin" />
17
17
 
18
- <title>Lumia Passport Secure Wallet - iframe version 1.14.20</title>
18
+ <title>Lumia Passport Secure Wallet - iframe version 1.14.22</title>
19
19
 
20
20
  <!-- Styles will be injected by build process -->
21
21
  <style>
@@ -1570,6 +1570,12 @@ var AuthorizationManager = class {
1570
1570
  const metadata = await this.fetchProjectMetadata(projectId);
1571
1571
  return metadata?.trustedAuthorizedApp === true;
1572
1572
  }
1573
+ /**
1574
+ * Get project metadata (name, logo, etc.) - uses cache
1575
+ */
1576
+ async getProjectMetadata(projectId) {
1577
+ return this.fetchProjectMetadata(projectId);
1578
+ }
1573
1579
  /**
1574
1580
  * Fetch project metadata from public API (with caching)
1575
1581
  */
@@ -3874,6 +3880,84 @@ var TrustedAppsManager = class {
3874
3880
  }
3875
3881
  };
3876
3882
 
3883
+ // src/iframe/lib/opted-out-apps-manager.ts
3884
+ var STORAGE_KEY2 = "lumia_passport_opted_out_apps";
3885
+ var OptedOutAppsManager = class {
3886
+ /**
3887
+ * Check if user has opted out of auto-trust for this app
3888
+ */
3889
+ isOptedOut(userId, projectId, origin) {
3890
+ const optedOutApps = this.getOptedOutApps();
3891
+ const result = optedOutApps.some(
3892
+ (app) => app.userId === userId && app.projectId === projectId && app.origin === origin
3893
+ );
3894
+ return result;
3895
+ }
3896
+ /**
3897
+ * Add app to opted-out list (when user removes ecosystem app from trusted list)
3898
+ */
3899
+ addOptedOut(userId, projectId, origin) {
3900
+ const optedOutApps = this.getOptedOutApps();
3901
+ const exists = optedOutApps.some(
3902
+ (app) => app.userId === userId && app.projectId === projectId && app.origin === origin
3903
+ );
3904
+ if (exists) {
3905
+ return;
3906
+ }
3907
+ optedOutApps.push({
3908
+ userId,
3909
+ projectId,
3910
+ origin,
3911
+ optedOutAt: Date.now()
3912
+ });
3913
+ this.saveOptedOutApps(optedOutApps);
3914
+ }
3915
+ /**
3916
+ * Remove app from opted-out list (when user manually re-trusts via checkbox)
3917
+ */
3918
+ removeOptedOut(userId, projectId, origin) {
3919
+ const optedOutApps = this.getOptedOutApps();
3920
+ const filtered = optedOutApps.filter(
3921
+ (app) => !(app.userId === userId && app.projectId === projectId && app.origin === origin)
3922
+ );
3923
+ this.saveOptedOutApps(filtered);
3924
+ }
3925
+ /**
3926
+ * Clear all opted-out apps for a user (when clearing all trusted apps)
3927
+ */
3928
+ clearOptedOutForUser(userId) {
3929
+ const optedOutApps = this.getOptedOutApps();
3930
+ const filtered = optedOutApps.filter((app) => app.userId !== userId);
3931
+ this.saveOptedOutApps(filtered);
3932
+ }
3933
+ /**
3934
+ * Get all opted-out apps from storage
3935
+ */
3936
+ getOptedOutApps() {
3937
+ try {
3938
+ const data = localStorage.getItem(STORAGE_KEY2);
3939
+ if (!data) {
3940
+ return [];
3941
+ }
3942
+ const apps = JSON.parse(data);
3943
+ return Array.isArray(apps) ? apps : [];
3944
+ } catch (error) {
3945
+ console.error("[OptedOutApps] Error reading opted-out apps:", error);
3946
+ return [];
3947
+ }
3948
+ }
3949
+ /**
3950
+ * Save opted-out apps to storage
3951
+ */
3952
+ saveOptedOutApps(apps) {
3953
+ try {
3954
+ localStorage.setItem(STORAGE_KEY2, JSON.stringify(apps));
3955
+ } catch (error) {
3956
+ console.error("[OptedOutApps] Error saving opted-out apps:", error);
3957
+ }
3958
+ }
3959
+ };
3960
+
3877
3961
  // src/iframe/lib/signing-manager.ts
3878
3962
  var SigningManager = class extends TokenRefreshApiClient {
3879
3963
  constructor() {
@@ -3886,6 +3970,7 @@ var SigningManager = class extends TokenRefreshApiClient {
3886
3970
  this.metadataCache = /* @__PURE__ */ new Map();
3887
3971
  this.storage = new StorageManager();
3888
3972
  this.trustedApps = new TrustedAppsManager();
3973
+ this.optedOutApps = new OptedOutAppsManager();
3889
3974
  }
3890
3975
  /**
3891
3976
  * Initialize WASM module
@@ -3993,6 +4078,7 @@ var SigningManager = class extends TokenRefreshApiClient {
3993
4078
  }
3994
4079
  if (confirmResult.trustApp) {
3995
4080
  this.trustedApps.addTrustedApp(userId, projectId, origin, confirmResult.appName, confirmResult.appLogo);
4081
+ this.optedOutApps.removeOptedOut(userId, projectId, origin);
3996
4082
  }
3997
4083
  } else if (isMinimalOperation) {
3998
4084
  console.log("[iframe][Sign] Auto-approving minimal safe operation (account deployment)");
@@ -4241,6 +4327,7 @@ var SigningManager = class extends TokenRefreshApiClient {
4241
4327
  }
4242
4328
  if (confirmResult.trustApp) {
4243
4329
  this.trustedApps.addTrustedApp(userId, projectId, origin, confirmResult.appName, confirmResult.appLogo);
4330
+ this.optedOutApps.removeOptedOut(userId, projectId, origin);
4244
4331
  }
4245
4332
  }
4246
4333
  const keyshareData = this.storage.loadKeyshare(userId);
@@ -4315,7 +4402,7 @@ var SigningManager = class extends TokenRefreshApiClient {
4315
4402
  };
4316
4403
 
4317
4404
  // src/iframe/main.ts
4318
- var IFRAME_VERSION = "1.14.20";
4405
+ var IFRAME_VERSION = "1.14.22";
4319
4406
  var IframeWallet = class {
4320
4407
  constructor() {
4321
4408
  console.log("=".repeat(60));
@@ -4328,6 +4415,7 @@ var IframeWallet = class {
4328
4415
  this.authManager = new AuthorizationManager();
4329
4416
  this.storage = new StorageManager();
4330
4417
  this.trustedApps = new TrustedAppsManager();
4418
+ this.optedOutApps = new OptedOutAppsManager();
4331
4419
  this.backupManager = new BackupManager();
4332
4420
  this.binance = new BinanceOnrampAPI(this.messenger.sendResponse.bind(this.messenger));
4333
4421
  this.rampnow = new RampnowOnrampAPI(this.messenger.sendResponse.bind(this.messenger));
@@ -4454,6 +4542,26 @@ var IframeWallet = class {
4454
4542
  console.log(`[iframe] Project ${projectId} is a trusted authorized app, auto-authorizing`);
4455
4543
  await this.authManager.storeAuthorization(userId, projectId, origin);
4456
4544
  console.log(`[iframe] \u2705 Auto-authorization granted for trusted app: ${userId} -> ${projectId}`);
4545
+ try {
4546
+ const isOptedOut = this.optedOutApps.isOptedOut(userId, projectId, origin);
4547
+ console.log(`[iframe] Checking opt-out status: ${isOptedOut}`);
4548
+ if (!isOptedOut) {
4549
+ const metadata = await this.authManager.getProjectMetadata(projectId);
4550
+ console.log(`[iframe] Got metadata for auto-trust:`, metadata?.name, metadata?.logo);
4551
+ this.trustedApps.addTrustedApp(
4552
+ userId,
4553
+ projectId,
4554
+ origin,
4555
+ metadata?.name,
4556
+ metadata?.logo
4557
+ );
4558
+ console.log(`[iframe] \u2705 Auto-added to trusted apps list for seamless transactions`);
4559
+ } else {
4560
+ console.log(`[iframe] \u2139\uFE0F User opted-out of auto-trust for this app, skipping`);
4561
+ }
4562
+ } catch (error) {
4563
+ console.error(`[iframe] \u274C Error adding to trusted apps list:`, error);
4564
+ }
4457
4565
  } else {
4458
4566
  console.log(`[iframe] Authorization needed for project: ${projectId}`);
4459
4567
  const projectInfo = {
@@ -4650,6 +4758,15 @@ var IframeWallet = class {
4650
4758
  console.error("[iframe] REMOVE_TRUSTED_APP: Session validation failed");
4651
4759
  throw new Error("Invalid session");
4652
4760
  }
4761
+ const isEcosystemApp = await this.authManager.isTrustedAuthorizedApp(projectId);
4762
+ if (isEcosystemApp) {
4763
+ try {
4764
+ this.optedOutApps.addOptedOut(userId, projectId, appOrigin);
4765
+ console.log(`[iframe] \u2139\uFE0F Ecosystem app removed - added to opted-out list`);
4766
+ } catch (e) {
4767
+ console.error("[iframe] Failed to persist opted-out flag; proceeding with removal:", e);
4768
+ }
4769
+ }
4653
4770
  this.trustedApps.removeTrustedApp(userId, projectId, appOrigin);
4654
4771
  this.messenger.sendResponse(
4655
4772
  messageId,