Fix double HTML escaping in switcher and harden JS edge cases

This commit is contained in:
Laurent Dinclaux
2026-02-10 23:26:27 +11:00
parent dd477c1b83
commit efcca69d43
19 changed files with 15 additions and 319 deletions

View File

@@ -162,6 +162,8 @@ Database migrations are applied automatically by the Roundcube plugin installer.
If you are upgrading from `boressoft/ident_switch`, `toteph42/identity_switch`, or another fork:
> **Important:** This version (5.x) requires a **v4.x database schema** as its starting point. If you are running v1.xv3.x, you must first upgrade to v4.x (`boressoft/ident_switch`) before migrating to this fork. This applies to all supported databases (MySQL, PostgreSQL, SQLite).
### With Composer
1. Replace the old package in `composer.json` with `gecka/roundcube-ident_switch` and run `composer update`
@@ -202,7 +204,7 @@ Original code by Boris Gulay licensed under GPL-3.0+. New contributions licensed
- **Boris Gulay** — Original developer (20162022)
- **Christian Landvogt** — Special folders support
- **Gergely Papp** — Bug fixes
- **Laurent Dinclaux - Gecka** — Current maintainer ([Gecka](https://gecka.nc))
- **Laurent Dinclaux** — Current maintainer ([Gecka](https://gecka.nc))
---

View File

@@ -1,5 +0,0 @@
ALTER TABLE
`ident_switch`
MODIFY
`username`
varchar(64);

View File

@@ -1,6 +0,0 @@
ALTER TABLE
`ident_switch`
MODIFY
`username`
varchar(64)
NULL;

View File

@@ -1,29 +0,0 @@
ALTER TABLE
`ident_switch`
CHANGE
`host`
`imap_host` varchar(64);
ALTER TABLE
`ident_switch`
CHANGE
`port`
`imap_port` int;
ALTER TABLE
`ident_switch`
ADD COLUMN
`smtp_host`
varchar(64);
ALTER TABLE
`ident_switch`
ADD COLUMN
`smtp_port`
int
CHECK(`smtp_port` > 0 AND `smtp_port` <= 65535);
ALTER TABLE
`ident_switch`
DROP COLUMN
`delimiter`;

View File

@@ -1,5 +0,0 @@
ALTER TABLE
`ident_switch`
ADD COLUMN
`imap_delimiter`
char(1);

View File

@@ -1,14 +0,0 @@
ALTER TABLE
`ident_switch`
ADD COLUMN
`drafts_mbox`
varchar(64),
ADD COLUMN
`sent_mbox`
varchar(64),
ADD COLUMN
`junk_mbox`
varchar(64),
ADD COLUMN
`trash_mbox`
varchar(64);

View File

@@ -1,7 +0,0 @@
ALTER TABLE
`ident_switch`
ADD COLUMN
`smtp_auth`
smallint
NOT NULL
DEFAULT 1;

View File

@@ -1,11 +0,0 @@
ALTER TABLE
ident_switch
ALTER COLUMN
host
DROP NOT NULL;
ALTER TABLE
ident_switch
ALTER COLUMN
label
DROP NOT NULL;

View File

@@ -1,5 +0,0 @@
ALTER TABLE
ident_switch
ALTER COLUMN
username
DROP NOT NULL;

View File

@@ -1,5 +0,0 @@
ALTER TABLE
ident_switch
ALTER COLUMN
username
DROP NOT NULL;

View File

@@ -1,31 +0,0 @@
ALTER TABLE
ident_switch
RENAME COLUMN
host
TO
imap_host;
ALTER TABLE
ident_switch
RENAME COLUMN
port
TO
imap_port;
ALTER TABLE
ident_switch
ADD COLUMN
smtp_host
varchar(64);
ALTER TABLE
ident_switch
ADD COLUMN
smtp_port
integer
CHECK(smtp_port > 0 AND smtp_port <= 65535);
ALTER TABLE
ident_switch
DROP COLUMN
delimiter;

View File

@@ -1,5 +0,0 @@
ALTER TABLE
ident_switch
ADD COLUMN
imap_delimiter
char(1);

View File

@@ -1,14 +0,0 @@
ALTER TABLE
ident_switch
ADD COLUMN
drafts_mbox
varchar(64),
ADD COLUMN
sent_mbox
varchar(64),
ADD COLUMN
junk_mbox
varchar(64),
ADD COLUMN
trash_mbox
varchar(64);

View File

@@ -1,7 +0,0 @@
ALTER TABLE
ident_switch
ADD COLUMN
smtp_auth
smallint
NOT NULL
DEFAULT(1);

View File

@@ -1,76 +0,0 @@
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE ident_switch RENAME TO ident_switch_old;
CREATE TABLE ident_switch
(
id
integer
PRIMARY KEY,
user_id
integer
NOT NULL
REFERENCES users(user_id) ON DELETE CASCADE ON UPDATE CASCADE,
iid
integer
NOT NULL
REFERENCES identities(identity_id) ON DELETE CASCADE ON UPDATE CASCADE
UNIQUE,
username
varchar(64),
password
varchar(64),
imap_host
varchar(64),
imap_port
integer
CHECK(imap_port > 0 AND imap_port <= 65535),
label
varchar(32),
flags
integer
NOT NULL
DEFAULT(0),
smtp_host
varchar(64),
smtp_port
integer
CHECK(smtp_port > 0 AND smtp_port <= 65535),
UNIQUE (user_id, label)
);
CREATE INDEX IX_ident_switch_user_id ON ident_switch(user_id);
CREATE INDEX IX_ident_switch_iid on ident_switch(iid);
INSERT OR ROLLBACK INTO
ident_switch (
id,
user_id,
iid,
username,
password,
imap_host,
imap_port,
label,
flags,
smtp_host
)
SELECT
id,
user_id,
iid,
username,
password,
host,
port,
label,
flags,
host
FROM
ident_switch_old;
DROP TABLE
ident_switch_old;
COMMIT;
PRAGMA foreign_keys=on;

View File

@@ -1,92 +0,0 @@
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE ident_switch RENAME TO ident_switch_old;
CREATE TABLE ident_switch
(
id
integer
PRIMARY KEY,
user_id
integer
NOT NULL
REFERENCES users(user_id) ON DELETE CASCADE ON UPDATE CASCADE,
iid
integer
NOT NULL
REFERENCES identities(identity_id) ON DELETE CASCADE ON UPDATE CASCADE
UNIQUE,
username
varchar(64),
password
varchar(64),
imap_host
varchar(64),
imap_port
integer
CHECK(imap_port > 0 AND imap_port <= 65535),
imap_delimiter
char(1),
label
varchar(32),
flags
integer
NOT NULL
DEFAULT(0),
smtp_host
varchar(64),
smtp_port
integer
CHECK(smtp_port > 0 AND smtp_port <= 65535),
smtp_auth
smallint
NOT NULL
DEFAULT 1,
drafts_mbox
varchar(64),
sent_mbox
varchar(64),
junk_mbox
varchar(64),
trash_mbox
varchar(64),
UNIQUE (user_id, label)
);
CREATE INDEX IX_ident_switch_user_id ON ident_switch(user_id);
CREATE INDEX IX_ident_switch_iid on ident_switch(iid);
INSERT OR ROLLBACK INTO
ident_switch (
id,
user_id,
iid,
username,
password,
imap_host,
imap_port,
label,
flags,
smtp_host,
smtp_port
)
SELECT
id,
user_id,
iid,
username,
password,
imap_host,
imap_port,
label,
flags,
smtp_host,
smtp_port
FROM
ident_switch_old;
DROP TABLE
ident_switch_old;
COMMIT;
PRAGMA foreign_keys=on;

View File

@@ -2,7 +2,7 @@
"name": "gecka/roundcube-ident_switch",
"type": "roundcube-plugin",
"description": "This plugin allows users to switch between different accounts (including remote) in single Roundcube session.",
"homepage": "https://github.com/Gecka-apps/ident_switch",
"homepage": "https://github.com/Gecka-Apps/roundcube-ident_switch",
"keywords": ["identity", "imap", "mail", "switch"],
"license": "AGPL-3.0+",
"authors": [
@@ -47,10 +47,11 @@
"toteph42/identity_switch": "*"
},
"support": {
"issues": "https://github.com/Gecka-apps/ident_switch/issues"
"issues": "https://github.com/Gecka-Apps/roundcube-ident_switch/issues"
},
"extra": {
"roundcube": {
"plugin-name": "ident_switch",
"min-version": "1.6",
"sql-dir": "SQL"
}

View File

@@ -122,7 +122,11 @@ function plugin_switchIdent_addCbElastic($wrapper, $sw) {
/**
* Perform account switch via AJAX (called from <select> onchange).
*/
var ident_switch_switching = false;
function plugin_switchIdent_switch(val) {
if (ident_switch_switching) return;
ident_switch_switching = true;
rcmail.env.unread_counts = {};
rcmail.http_post('plugin.ident_switch.switch', {
'_ident-id': val,
@@ -167,7 +171,7 @@ function ident_switch_updateCounts(data) {
if (map[iid] === undefined) continue;
var selectVal = '' + map[iid];
var $opt = $select.find('option[value="' + selectVal + '"]');
var $opt = $select.find('option').filter(function() { return $(this).val() === selectVal; });
if (!$opt.length) continue;
// Skip active account on mail task
@@ -295,8 +299,9 @@ function plugin_switchIdent_filterFrom() {
});
// If selected option was removed, select the first remaining
if (allowed.indexOf(currentVal) === -1) {
$from.val($from.find('option:first').val()).trigger('change');
var $remaining = $from.find('option:first');
if (allowed.indexOf(currentVal) === -1 && $remaining.length) {
$from.val($remaining.val()).trigger('change');
}
}

View File

@@ -209,7 +209,7 @@ class ident_switch extends rcube_plugin
}
$lbl = $r['label'] ?: $r['username'] ?: $r['email'];
$accNames[] = rcube::Q($lbl);
$accNames[] = $lbl;
}
if (count($accValues) <= 1) {