Skip to content

Commit 4b443dd

Browse files
feat(mini-apps): per-app cross-origin access flag
The global `miniAppsCrossOriginAccess` setting applied the same security posture to every mini-app, making it impossible to isolate automation-heavy apps from ones that don't need it. - Move the flag from a global setting to `MiniAppDefinition` so each app opts in independently - Default to `false` (secure) instead of the previous global `true` - Persist and parse `allowCrossOrigin` in both workspace and JSON serialisation paths - Expose a checkbox in `EditMiniAppsDialog` so users can toggle it per app with a clear security trade-off label
1 parent ce9d3c5 commit 4b443dd

7 files changed

Lines changed: 22 additions & 10 deletions

src/ApplicationSettings.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,6 @@ CREATE_SETTING(QuickBrowser, LastProxyHost, lastProxyHost, QString, QStringLiter
107107
CREATE_SETTING(QuickBrowser, LastProxyPort, lastProxyPort, int, 0)
108108
CREATE_SETTING(QuickBrowser, LastProxyBypassList, lastProxyBypassList, QString, QStringLiteral(""))
109109

110-
// Cross-origin iframe access for page-agent. Default ON — target users are
111-
// automation users who need page-agent to read cross-origin iframe content.
112-
CREATE_SETTING(MiniApps, MiniAppsCrossOriginAccess, miniAppsCrossOriginAccess, bool, true)
113-
114110
CREATE_SETTING(Git, SyntaxHighlightDiffEnabled, syntaxHighlightDiffEnabled, bool, true)
115111

116112
// Files-tab decoration master toggle — see file-tree-git-decorations spec.

src/ApplicationSettings.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -140,11 +140,6 @@ class ApplicationSettings : public QSettings
140140
DEFINE_SETTING(LastProxyPort, lastProxyPort, int)
141141
DEFINE_SETTING(LastProxyBypassList, lastProxyBypassList, QString)
142142

143-
// When true, WebView2 launches with --disable-web-security and
144-
// --disable-site-isolation-trials so page-agent scripts can access
145-
// cross-origin iframe content. Also gates Page.setBypassCSP.
146-
DEFINE_SETTING(MiniAppsCrossOriginAccess, miniAppsCrossOriginAccess, bool)
147-
148143
// Per-workspace task registry. Stored as a single JSON object:
149144
// { "<cleanPath>": [{"name":"...","command":"..."},...], ... }
150145
// Never deleted — tasks survive workspace close/removal.

src/MiniAppDefinition.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ struct MiniAppDefinition
2626
QString proxyHost;
2727
int proxyPort = 0; // 0 = use scheme default
2828
QString proxyBypassList;
29+
bool allowCrossOrigin = false;
2930

3031
bool isValid() const { return !name.isEmpty() && !url.isEmpty(); }
3132

src/MiniAppManager.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ void MiniAppManager::launchApp(const MiniAppDefinition &def)
240240
m_instances.append(instance);
241241
emit instanceCountChanged(m_instances.size());
242242

243-
instance->setAllowCrossOrigin(m_app->getSettings()->miniAppsCrossOriginAccess());
243+
instance->setAllowCrossOrigin(def.allowCrossOrigin);
244244
instance->start();
245245
}
246246

src/MiniAppRegistry.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ QList<MiniAppDefinition> MiniAppRegistry::workspaceApps(const QString &workspace
7272
def.proxyHost = obj.value(QStringLiteral("proxyHost")).toString();
7373
def.proxyPort = obj.value(QStringLiteral("proxyPort")).toInt(0);
7474
def.proxyBypassList = obj.value(QStringLiteral("proxyBypassList")).toString();
75+
def.allowCrossOrigin = obj.value(QStringLiteral("allowCrossOrigin")).toBool(false);
7576
if (!def.name.isEmpty())
7677
result.append(def);
7778
}
@@ -119,6 +120,7 @@ void MiniAppRegistry::setWorkspaceApps(const QString &workspacePath, const QList
119120
if (def.proxyPort > 0) obj.insert(QStringLiteral("proxyPort"), def.proxyPort);
120121
if (!def.proxyBypassList.isEmpty()) obj.insert(QStringLiteral("proxyBypassList"), def.proxyBypassList);
121122
}
123+
if (def.allowCrossOrigin) obj.insert(QStringLiteral("allowCrossOrigin"), true);
122124
arr.append(obj);
123125
}
124126

@@ -186,6 +188,7 @@ QList<MiniAppDefinition> MiniAppRegistry::parseJson(const QString &json)
186188
def.proxyHost = obj.value(QStringLiteral("proxyHost")).toString();
187189
def.proxyPort = obj.value(QStringLiteral("proxyPort")).toInt(0);
188190
def.proxyBypassList = obj.value(QStringLiteral("proxyBypassList")).toString();
191+
def.allowCrossOrigin = obj.value(QStringLiteral("allowCrossOrigin")).toBool(false);
189192
if (!def.name.isEmpty())
190193
result.append(def);
191194
}
@@ -216,6 +219,7 @@ QString MiniAppRegistry::toJson(const QList<MiniAppDefinition> &apps)
216219
if (def.proxyPort > 0) obj.insert(QStringLiteral("proxyPort"), def.proxyPort);
217220
if (!def.proxyBypassList.isEmpty()) obj.insert(QStringLiteral("proxyBypassList"), def.proxyBypassList);
218221
}
222+
if (def.allowCrossOrigin) obj.insert(QStringLiteral("allowCrossOrigin"), true);
219223
arr.append(obj);
220224
}
221225
return QString::fromUtf8(QJsonDocument(arr).toJson(QJsonDocument::Compact));

src/dialogs/EditMiniAppsDialog.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include "EditMiniAppsDialog.h"
99

10+
#include <QCheckBox>
1011
#include <QComboBox>
1112
#include <QDialogButtonBox>
1213
#include <QDir>
@@ -161,6 +162,13 @@ EditMiniAppsDialog::EditMiniAppsDialog(MiniAppRegistry *registry,
161162
debugLayout->addWidget(m_portWarningLabel);
162163
formLayout->addWidget(m_debugGroup);
163164

165+
// Cross-origin access checkbox
166+
m_crossOriginCheck = new QCheckBox(tr("Allow cross-origin iframe access (better automation, less security)"), rightWidget);
167+
m_crossOriginCheck->setToolTip(
168+
tr("Disables browser sandbox isolation so scripts can access cross-origin iframe content.\n"
169+
"Improves automation coverage but reduces security."));
170+
formLayout->addWidget(m_crossOriginCheck);
171+
164172
// Proxy section (collapsible)
165173
m_proxyGroup = new QGroupBox(tr("Proxy"), rightWidget);
166174
m_proxyGroup->setCheckable(true);
@@ -311,6 +319,7 @@ void EditMiniAppsDialog::commitCurrentApp()
311319
def.proxyHost = m_proxyGroup->isChecked() ? m_proxyHostEdit->text().trimmed() : QString();
312320
def.proxyPort = m_proxyGroup->isChecked() ? m_proxyPortSpin->value() : 0;
313321
def.proxyBypassList = m_proxyGroup->isChecked() ? m_proxyBypassEdit->text().trimmed() : QString();
322+
def.allowCrossOrigin = m_crossOriginCheck->isChecked();
314323

315324
// Ensure ID
316325
if (def.id.isEmpty())
@@ -336,6 +345,7 @@ void EditMiniAppsDialog::loadApp(int row)
336345
m_timeoutSpin->setEnabled(valid);
337346
m_debugPortSpin->setEnabled(valid);
338347
m_randomPortBtn->setEnabled(valid);
348+
m_crossOriginCheck->setEnabled(valid);
339349

340350
if (!valid) {
341351
m_nameEdit->clear();
@@ -351,6 +361,7 @@ void EditMiniAppsDialog::loadApp(int row)
351361
m_proxyHostEdit->clear();
352362
m_proxyPortSpin->setValue(0);
353363
m_proxyBypassEdit->clear();
364+
m_crossOriginCheck->setChecked(false);
354365
m_proxyWarningLabel->hide();
355366
m_urlWarningLabel->hide();
356367
m_envWarningLabel->hide();
@@ -377,6 +388,7 @@ void EditMiniAppsDialog::loadApp(int row)
377388
m_proxyHostEdit->setText(def.proxyHost);
378389
m_proxyPortSpin->setValue(def.proxyPort);
379390
m_proxyBypassEdit->setText(def.proxyBypassList);
391+
m_crossOriginCheck->setChecked(def.allowCrossOrigin);
380392
m_urlWarningLabel->hide();
381393
m_portWarningLabel->hide();
382394
validateFields();

src/dialogs/EditMiniAppsDialog.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <QDialog>
1414
#include <QList>
1515

16+
class QCheckBox;
1617
class QComboBox;
1718
class QDialogButtonBox;
1819
class QGroupBox;
@@ -93,6 +94,9 @@ private slots:
9394
QLineEdit *m_proxyBypassEdit = nullptr;
9495
QLabel *m_proxyWarningLabel = nullptr;
9596

97+
// Cross-origin
98+
QCheckBox *m_crossOriginCheck = nullptr;
99+
96100
QLabel *m_urlWarningLabel = nullptr;
97101
QDialogButtonBox *m_buttonBox = nullptr;
98102
};

0 commit comments

Comments
 (0)