@bobfrankston/rmfmail 1.0.479 → 1.0.481

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.
Files changed (29) hide show
  1. package/client/app.js +22 -2
  2. package/client/app.js.map +1 -1
  3. package/client/app.ts +15 -2
  4. package/client/lib/local-store.js +1 -1
  5. package/client/lib/local-store.js.map +1 -1
  6. package/package.json +5 -5
  7. package/packages/mailx-service/index.d.ts +5 -0
  8. package/packages/mailx-service/index.d.ts.map +1 -1
  9. package/packages/mailx-service/index.ts +1 -1
  10. package/packages/mailx-settings/index.d.ts +3 -0
  11. package/packages/mailx-settings/index.d.ts.map +1 -1
  12. package/packages/mailx-settings/index.js +6 -5
  13. package/packages/mailx-settings/index.js.map +1 -1
  14. package/packages/mailx-settings/index.ts +7 -6
  15. package/packages/mailx-store-web/android-bootstrap.d.ts.map +1 -1
  16. package/packages/mailx-store-web/android-bootstrap.js +46 -11
  17. package/packages/mailx-store-web/android-bootstrap.js.map +1 -1
  18. package/packages/mailx-store-web/android-bootstrap.ts +50 -13
  19. package/packages/mailx-store-web/web-service.d.ts +4 -0
  20. package/packages/mailx-store-web/web-service.d.ts.map +1 -1
  21. package/packages/mailx-store-web/web-service.ts +1 -1
  22. package/packages/mailx-store-web/web-settings.d.ts +5 -1
  23. package/packages/mailx-store-web/web-settings.d.ts.map +1 -1
  24. package/packages/mailx-store-web/web-settings.js +22 -3
  25. package/packages/mailx-store-web/web-settings.js.map +1 -1
  26. package/packages/mailx-store-web/web-settings.ts +20 -4
  27. package/packages/mailx-store-web/worker-entry.js +39 -8
  28. package/packages/mailx-store-web/worker-entry.js.map +1 -1
  29. package/packages/mailx-store-web/worker-entry.ts +40 -10
@@ -64,11 +64,31 @@ function createTokenProvider(email) {
64
64
  // ── GDrive folder lookup ──
65
65
  async function findGDriveMailxFolder(tokenProvider) {
66
66
  const token = await tokenProvider();
67
- const r = await fetch(`https://www.googleapis.com/drive/v3/files?q=name='mailx' and mimeType='application/vnd.google-apps.folder' and trashed=false&fields=files(id,name)`, { headers: { "Authorization": `Bearer ${token}` } });
67
+ const headers = { "Authorization": `Bearer ${token}` };
68
+ // Two-step path traversal: My Drive root → home/ → .rmfmail
69
+ const homeQ = encodeURIComponent("name='home' and mimeType='application/vnd.google-apps.folder' and 'root' in parents and trashed=false");
70
+ const homeRes = await fetch(`https://www.googleapis.com/drive/v3/files?q=${homeQ}&fields=files(id,name)&spaces=drive`, { headers });
71
+ if (!homeRes.ok)
72
+ return null;
73
+ const home = (await homeRes.json()).files?.[0];
74
+ if (!home?.id)
75
+ return null;
76
+ const q = encodeURIComponent(`name='.rmfmail' and mimeType='application/vnd.google-apps.folder' and '${home.id}' in parents and trashed=false`);
77
+ const r = await fetch(`https://www.googleapis.com/drive/v3/files?q=${q}&fields=files(id,name,owners(emailAddress))&spaces=drive`, { headers });
68
78
  if (!r.ok)
69
79
  return null;
70
80
  const data = await r.json();
71
- return data.files?.[0]?.id || null;
81
+ const folder = data.files?.[0];
82
+ if (!folder?.id)
83
+ return null;
84
+ const homeName = home.name || "home";
85
+ const folderName = folder.name || ".rmfmail";
86
+ return {
87
+ id: folder.id,
88
+ name: folderName,
89
+ path: `My Drive/${homeName}/${folderName}`,
90
+ ownerEmail: folder.owners?.[0]?.emailAddress,
91
+ };
72
92
  }
73
93
  // ── Message handler ──
74
94
  self.onmessage = async (e) => {
@@ -144,11 +164,18 @@ async function initialize() {
144
164
  if (gmailTokenProvider) {
145
165
  setGDriveTokenProvider(gmailTokenProvider);
146
166
  try {
147
- console.log("[worker] Looking up GDrive mailx folder...");
148
- const folderId = await findGDriveMailxFolder(gmailTokenProvider);
149
- if (folderId) {
150
- setGDriveFolderId(folderId);
151
- console.log(`[worker] GDrive mailx folder: ${folderId}`);
167
+ console.log("[worker] Looking up GDrive .rmfmail folder...");
168
+ const folder = await findGDriveMailxFolder(gmailTokenProvider);
169
+ if (!folder) {
170
+ emitEvent({
171
+ type: "fatal",
172
+ key: "gdrive-folder-missing",
173
+ message: "GDrive folder '.rmfmail' not found — app cannot start. Create it or sign in with the correct Google account.",
174
+ });
175
+ }
176
+ else {
177
+ setGDriveFolderId(folder.id, folder.name, folder.ownerEmail, folder.path);
178
+ console.log(`[worker] GDrive ${folder.path} folder: ${folder.id} (owner=${folder.ownerEmail || "?"})`);
152
179
  // Load accounts from cloud
153
180
  const cloudAccounts = await loadAccountsFromCloud();
154
181
  if (cloudAccounts && cloudAccounts.length > 0) {
@@ -169,7 +196,11 @@ async function initialize() {
169
196
  }
170
197
  }
171
198
  catch (e) {
172
- console.error(`[worker] GDrive setup error: ${e.message}`);
199
+ emitEvent({
200
+ type: "fatal",
201
+ key: "gdrive-setup-failed",
202
+ message: `GDrive setup failed — app cannot start: ${e.message}`,
203
+ });
173
204
  }
174
205
  }
175
206
  // Periodic sync (runs in Worker — never blocks UI)
@@ -1 +1 @@
1
- {"version":3,"file":"worker-entry.js","sourceRoot":"","sources":["worker-entry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker-entry.js","sourceRoot":"","sources":["worker-entry.ts"],"names":[],"mappings":"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"}
@@ -78,15 +78,35 @@ function createTokenProvider(email: string): () => Promise<string> {
78
78
 
79
79
  // ── GDrive folder lookup ──
80
80
 
81
- async function findGDriveMailxFolder(tokenProvider: () => Promise<string>): Promise<string | null> {
81
+ async function findGDriveMailxFolder(tokenProvider: () => Promise<string>): Promise<{ id: string; name: string; path: string; ownerEmail?: string } | null> {
82
82
  const token = await tokenProvider();
83
+ const headers = { "Authorization": `Bearer ${token}` };
84
+ // Two-step path traversal: My Drive root → home/ → .rmfmail
85
+ const homeQ = encodeURIComponent("name='home' and mimeType='application/vnd.google-apps.folder' and 'root' in parents and trashed=false");
86
+ const homeRes = await fetch(
87
+ `https://www.googleapis.com/drive/v3/files?q=${homeQ}&fields=files(id,name)&spaces=drive`,
88
+ { headers }
89
+ );
90
+ if (!homeRes.ok) return null;
91
+ const home = (await homeRes.json() as any).files?.[0];
92
+ if (!home?.id) return null;
93
+ const q = encodeURIComponent(`name='.rmfmail' and mimeType='application/vnd.google-apps.folder' and '${home.id}' in parents and trashed=false`);
83
94
  const r = await fetch(
84
- `https://www.googleapis.com/drive/v3/files?q=name='mailx' and mimeType='application/vnd.google-apps.folder' and trashed=false&fields=files(id,name)`,
85
- { headers: { "Authorization": `Bearer ${token}` } }
95
+ `https://www.googleapis.com/drive/v3/files?q=${q}&fields=files(id,name,owners(emailAddress))&spaces=drive`,
96
+ { headers }
86
97
  );
87
98
  if (!r.ok) return null;
88
99
  const data = await r.json();
89
- return data.files?.[0]?.id || null;
100
+ const folder = data.files?.[0];
101
+ if (!folder?.id) return null;
102
+ const homeName = home.name || "home";
103
+ const folderName = folder.name || ".rmfmail";
104
+ return {
105
+ id: folder.id,
106
+ name: folderName,
107
+ path: `My Drive/${homeName}/${folderName}`,
108
+ ownerEmail: folder.owners?.[0]?.emailAddress,
109
+ };
90
110
  }
91
111
 
92
112
  // ── Message handler ──
@@ -172,11 +192,17 @@ async function initialize(): Promise<void> {
172
192
  if (gmailTokenProvider) {
173
193
  setGDriveTokenProvider(gmailTokenProvider);
174
194
  try {
175
- console.log("[worker] Looking up GDrive mailx folder...");
176
- const folderId = await findGDriveMailxFolder(gmailTokenProvider);
177
- if (folderId) {
178
- setGDriveFolderId(folderId);
179
- console.log(`[worker] GDrive mailx folder: ${folderId}`);
195
+ console.log("[worker] Looking up GDrive .rmfmail folder...");
196
+ const folder = await findGDriveMailxFolder(gmailTokenProvider);
197
+ if (!folder) {
198
+ emitEvent({
199
+ type: "fatal",
200
+ key: "gdrive-folder-missing",
201
+ message: "GDrive folder '.rmfmail' not found — app cannot start. Create it or sign in with the correct Google account.",
202
+ });
203
+ } else {
204
+ setGDriveFolderId(folder.id, folder.name, folder.ownerEmail, folder.path);
205
+ console.log(`[worker] GDrive ${folder.path} folder: ${folder.id} (owner=${folder.ownerEmail || "?"})`);
180
206
 
181
207
  // Load accounts from cloud
182
208
  const cloudAccounts = await loadAccountsFromCloud();
@@ -195,7 +221,11 @@ async function initialize(): Promise<void> {
195
221
  }
196
222
  }
197
223
  } catch (e: any) {
198
- console.error(`[worker] GDrive setup error: ${e.message}`);
224
+ emitEvent({
225
+ type: "fatal",
226
+ key: "gdrive-setup-failed",
227
+ message: `GDrive setup failed — app cannot start: ${e.message}`,
228
+ });
199
229
  }
200
230
  }
201
231