├── .editorconfig
├── .github
└── workflows
│ └── ci.yml
├── .gitignore
├── LICENSE
├── README.md
├── ispconfig3_account
├── account.js
├── config
│ └── config.inc.php.dist
├── ispconfig3_account.php
├── localization
│ ├── bg_BG.inc
│ ├── cs_CZ.inc
│ ├── da_DK.inc
│ ├── de_DE.inc
│ ├── en_US.inc
│ ├── es_ES.inc
│ ├── et_EE.inc
│ ├── fi_FI.inc
│ ├── fr_FR.inc
│ ├── gl_ES.inc
│ ├── hu_HU.inc
│ ├── it_IT.inc
│ ├── lb_LU.inc
│ ├── lv_LV.inc
│ ├── nl_NL.inc
│ ├── pl_PL.inc
│ ├── pt_BR.inc
│ ├── ru_RU.inc
│ ├── sk_SK.inc
│ ├── sl_SI.inc
│ ├── sv_SE.inc
│ ├── tr_TR.inc
│ └── uk_UA.inc
└── skins
│ ├── classic
│ ├── account.css
│ ├── general.css
│ └── templates
│ │ ├── account.html
│ │ └── general.html
│ ├── elastic
│ ├── account.css
│ └── templates
│ │ ├── account.html
│ │ └── general.html
│ └── larry
│ ├── account.css
│ └── templates
│ ├── account.html
│ └── general.html
├── ispconfig3_autoreply
├── autoreply.js
├── ispconfig3_autoreply.php
├── localization
│ ├── bg_BG.inc
│ ├── cs_CZ.inc
│ ├── da_DK.inc
│ ├── de_DE.inc
│ ├── en_US.inc
│ ├── es_ES.inc
│ ├── et_EE.inc
│ ├── fi_FI.inc
│ ├── fr_FR.inc
│ ├── gl_ES.inc
│ ├── hu_HU.inc
│ ├── it_IT.inc
│ ├── lb_LU.inc
│ ├── lv_LV.inc
│ ├── nl_NL.inc
│ ├── pl_PL.inc
│ ├── pt_BR.inc
│ ├── ru_RU.inc
│ ├── sk_SK.inc
│ ├── sl_SI.inc
│ ├── sv_SE.inc
│ ├── tr_TR.inc
│ └── uk_UA.inc
└── skins
│ ├── classic
│ ├── jquery.ui.datetime.css
│ ├── jquery.ui.datetime.min.js
│ └── templates
│ │ └── autoreply.html
│ ├── elastic
│ ├── jquery.ui.datetime.css
│ └── templates
│ │ └── autoreply.html
│ └── larry
│ └── templates
│ └── autoreply.html
├── ispconfig3_autoselect
├── config
│ └── config.inc.php.dist
└── ispconfig3_autoselect.php
├── ispconfig3_fetchmail
├── config
│ └── config.inc.php.dist
├── fetchmail.js
├── ispconfig3_fetchmail.php
├── localization
│ ├── bg_BG.inc
│ ├── cs_CZ.inc
│ ├── da_DK.inc
│ ├── de_DE.inc
│ ├── en_US.inc
│ ├── es_ES.inc
│ ├── fi_FI.inc
│ ├── fr_FR.inc
│ ├── gl_ES.inc
│ ├── hu_HU.inc
│ ├── it_IT.inc
│ ├── lb_LU.inc
│ ├── lv_LV.inc
│ ├── nl_NL.inc
│ ├── pl_PL.inc
│ ├── pt_BR.inc
│ ├── ru_RU.inc
│ ├── sk_SK.inc
│ ├── sl_SI.inc
│ ├── sv_SE.inc
│ ├── tr_TR.inc
│ └── uk_UA.inc
└── skins
│ ├── classic
│ ├── delete.png
│ ├── disabled.png
│ ├── enabled.png
│ ├── fetchmail.css
│ └── templates
│ │ └── fetchmail.html
│ ├── elastic
│ ├── fetchmail.css
│ └── templates
│ │ └── fetchmail.html
│ └── larry
│ ├── delete.png
│ ├── disabled.png
│ ├── enabled.png
│ ├── fetchmail.css
│ └── templates
│ └── fetchmail.html
├── ispconfig3_filter
├── config
│ └── config.inc.php.dist
├── filter.js
├── ispconfig3_filter.php
├── localization
│ ├── cs_CZ.inc
│ ├── da_DK.inc
│ ├── de_DE.inc
│ ├── en_US.inc
│ ├── es_ES.inc
│ ├── fi_FI.inc
│ ├── fr_FR.inc
│ ├── gl_ES.inc
│ ├── hu_HU.inc
│ ├── it_IT.inc
│ ├── lb_LU.inc
│ ├── lv_LV.inc
│ ├── nl_NL.inc
│ ├── pl_PL.inc
│ ├── pt_BR.inc
│ ├── ru_RU.inc
│ ├── sk_SK.inc
│ ├── sl_SI.inc
│ ├── sv_SE.inc
│ ├── tr_TR.inc
│ └── uk_UA.inc
└── skins
│ ├── classic
│ ├── delete.png
│ ├── disabled.png
│ ├── enabled.png
│ ├── filter.css
│ └── templates
│ │ └── filter.html
│ ├── elastic
│ ├── filter.css
│ └── templates
│ │ └── filter.html
│ └── larry
│ ├── delete.png
│ ├── disabled.png
│ ├── enabled.png
│ ├── filter.css
│ └── templates
│ └── filter.html
├── ispconfig3_forward
├── forward.js
├── ispconfig3_forward.php
├── localization
│ ├── cs_CZ.inc
│ ├── da_DK.inc
│ ├── de_DE.inc
│ ├── en_US.inc
│ ├── es_ES.inc
│ ├── fi_FI.inc
│ ├── fr_FR.inc
│ ├── gl_ES.inc
│ ├── hu_HU.inc
│ ├── it_IT.inc
│ ├── lb_LU.inc
│ ├── lv_LV.inc
│ ├── pl_PL.inc
│ ├── pt_BR.inc
│ ├── ru_RU.inc
│ ├── sk_SK.inc
│ ├── sl_SI.inc
│ ├── sv_SE.inc
│ ├── tr_TR.inc
│ └── uk_UA.inc
└── skins
│ ├── classic
│ ├── delete.png
│ ├── forward.css
│ └── templates
│ │ └── forward.html
│ ├── elastic
│ └── templates
│ │ └── forward.html
│ └── larry
│ ├── delete.png
│ ├── forward.css
│ └── templates
│ └── forward.html
├── ispconfig3_pass
├── config
│ └── config.inc.php.dist
├── ispconfig3_pass.php
├── localization
│ ├── bg_BG.inc
│ ├── cs_CZ.inc
│ ├── da_DK.inc
│ ├── de_DE.inc
│ ├── en_US.inc
│ ├── es_ES.inc
│ ├── fi_FI.inc
│ ├── fr_FR.inc
│ ├── gl_ES.inc
│ ├── hu_HU.inc
│ ├── it_IT.inc
│ ├── lb_LU.inc
│ ├── lv_LV.inc
│ ├── nl_NL.inc
│ ├── pl_PL.inc
│ ├── pt_BR.inc
│ ├── ru_RU.inc
│ ├── sk_SK.inc
│ ├── sl_SI.inc
│ ├── sv_SE.inc
│ ├── tr_TR.inc
│ └── uk_UA.inc
├── pass.js
├── pwdmeter.js
└── skins
│ ├── classic
│ ├── pass.css
│ └── templates
│ │ └── pass.html
│ ├── elastic
│ ├── pass.css
│ └── templates
│ │ └── pass.html
│ └── larry
│ ├── pass.css
│ └── templates
│ └── pass.html
├── ispconfig3_spam
├── ispconfig3_spam.php
├── localization
│ ├── bg_BG.inc
│ ├── cs_CZ.inc
│ ├── da_DK.inc
│ ├── de_DE.inc
│ ├── en_US.inc
│ ├── es_ES.inc
│ ├── fi_FI.inc
│ ├── fr_FR.inc
│ ├── gl_ES.inc
│ ├── hu_HU.inc
│ ├── it_IT.inc
│ ├── lb_LU.inc
│ ├── lv_LV.inc
│ ├── nl_NL.inc
│ ├── pl_PL.inc
│ ├── pt_BR.inc
│ ├── ru_RU.inc
│ ├── sk_SK.inc
│ ├── sl_SI.inc
│ ├── sv_SE.inc
│ └── uk_UA.inc
├── skins
│ ├── classic
│ │ ├── spam.css
│ │ └── templates
│ │ │ ├── delete.png
│ │ │ ├── disabled.png
│ │ │ ├── enabled.png
│ │ │ └── spam.html
│ ├── elastic
│ │ ├── spam.css
│ │ └── templates
│ │ │ └── spam.html
│ └── larry
│ │ ├── spam.css
│ │ └── templates
│ │ └── spam.html
└── spam.js
└── ispconfig3_wblist
├── config
└── config.inc.php.dist
├── ispconfig3_wblist.php
├── localization
├── bg_BG.inc
├── cs_CZ.inc
├── da_DK.inc
├── de_DE.inc
├── en_US.inc
├── es_ES.inc
├── fi_FI.inc
├── fr_FR.inc
├── gl_ES.inc
├── hu_HU.inc
├── it_IT.inc
├── lb_LU.inc
├── lv_LV.inc
├── pl_PL.inc
├── pt_BR.inc
├── ru_RU.inc
├── sk_SK.inc
├── sl_SI.inc
├── sv_SE.inc
└── uk_UA.inc
├── skins
├── classic
│ ├── blacklist.png
│ ├── delete.png
│ ├── disabled.png
│ ├── enabled.png
│ ├── templates
│ │ └── wblist.html
│ ├── wblist.css
│ └── whitelist.png
├── elastic
│ ├── templates
│ │ └── wblist.html
│ └── wblist.css
└── larry
│ ├── blacklist.png
│ ├── delete.png
│ ├── disabled.png
│ ├── enabled.png
│ ├── templates
│ └── wblist.html
│ ├── wblist.css
│ └── whitelist.png
└── wblist.js
/.editorconfig:
--------------------------------------------------------------------------------
1 | # top-most EditorConfig file
2 | root = true
3 |
4 | # Unix-style newlines with a newline ending every file
5 | [*]
6 | end_of_line = lf
7 | insert_final_newline = true
8 |
9 | [*.{css, inc, js, php, sh}]
10 | charset = utf-8
11 | indent_style = space
12 | indent_size = 4
13 | trim_trailing_whitespace = true
14 |
--------------------------------------------------------------------------------
/.github/workflows/ci.yml:
--------------------------------------------------------------------------------
1 | name: tests
2 |
3 | on: [push, pull_request, workflow_dispatch]
4 |
5 | jobs:
6 | lint:
7 | runs-on: ubuntu-latest
8 | strategy:
9 | fail-fast: false
10 | matrix:
11 | php: ['7.0', '7.1', '7.2', '7.3', '7.4', '8.0', '8.1']
12 | steps:
13 | - name: Checkout repository
14 | uses: actions/checkout@v2
15 |
16 | - name: Setup PHP
17 | uses: shivammathur/setup-php@v2
18 | with:
19 | php-version: ${{ matrix.php }}
20 | ini-values: error_reporting=-1, display_errors=On, zend.assertions=1
21 | coverage: none
22 | tools: cs2pr, phpcs
23 |
24 | - name: Lint PHP files
25 | run: find . -type f -name '*.php' -print0 | xargs -0 -n1 -P4 php -l -n | (! grep -v "No syntax errors detected" )
26 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
2 | *.iml
3 | ispconfig3_account/config/config.inc.php
4 | ispconfig3_autoselect/config/config.inc.php
5 | ispconfig3_fetchmail/config/config.inc.php
6 | ispconfig3_filter/config/config.inc.php
7 | ispconfig3_pass/config/config.inc.php
8 | ispconfig3_wblist/config/config.inc.php
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ispconfig3_roundcube
2 | ====================
3 |
4 | > ISPConfig3 Plugins for Roundcube
5 |
6 | Documentation: https://github.com/w2c/ispconfig3_roundcube/wiki/
7 |
--------------------------------------------------------------------------------
/ispconfig3_account/account.js:
--------------------------------------------------------------------------------
1 | window.rcmail && rcmail.addEventListener('init', function (evt) {
2 | rcmail.register_command('plugin.ispconfig3_account', function () {
3 | rcmail.goto_url('plugin.ispconfig3_account')
4 | }, true);
5 |
6 | if (rcmail.env.action.startsWith('plugin.ispconfig3_account')) {
7 | if (rcmail.gui_objects.accountlist) {
8 | rcmail.account_list = new rcube_list_widget(rcmail.gui_objects.accountlist,
9 | {multiselect: false, draggable: false, keyboard: true});
10 |
11 | rcmail.account_list
12 | .addEventListener('select', function (o) { rcmail.plugin_select(o); })
13 | .init()
14 | .focus();
15 |
16 | //rcmail.account_list.select_row('general');
17 | }
18 | }
19 |
20 | // Compat shim for rcmail.confirm_dialog - undefined in Roundcube <= 1.4
21 | if (!rcmail.confirm_dialog) {
22 | rcmail.confirm_dialog = function(content, button_label, action) {
23 | if (confirm(content)) { action(this, rcmail); }
24 | }
25 | }
26 | });
27 |
28 | rcube_webmail.prototype.plugin_select = function (list) {
29 | var id = list.get_single_selection(), add_url = '', target = window;
30 |
31 | if (id) {
32 | if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) {
33 | add_url = '&_framed=1';
34 | target = window.frames[this.env.contentframe];
35 | }
36 |
37 | if (id === 'general') {
38 | id = 'account.show';
39 | }
40 |
41 | rcmail.location_href(this.env.comm_path + '&_action=plugin.ispconfig3_' + id + add_url, target, true);
42 | }
43 |
44 | return true;
45 | };
--------------------------------------------------------------------------------
/ispconfig3_account/config/config.inc.php.dist:
--------------------------------------------------------------------------------
1 | body *#alias-table[id$="alias-table"]:not([class="none"]) {
28 | table-layout: auto;
29 | }
30 |
31 | #alias-table td {
32 | text-align: left;
33 | vertical-align: middle;
34 | padding-left: 10px;
35 | }
--------------------------------------------------------------------------------
/ispconfig3_account/skins/classic/templates/account.html:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/ispconfig3_account/skins/classic/templates/general.html:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/ispconfig3_account/skins/elastic/account.css:
--------------------------------------------------------------------------------
1 | .listing.iconized li.account > a:before{
2 | content:"\f013"
3 | }
--------------------------------------------------------------------------------
/ispconfig3_account/skins/elastic/templates/account.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
25 |
26 |
--------------------------------------------------------------------------------
/ispconfig3_account/skins/elastic/templates/general.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/ispconfig3_account/skins/larry/account.css:
--------------------------------------------------------------------------------
1 | #accountlist {
2 | position: absolute;
3 | top: 0;
4 | left: 0;
5 | width: 260px;
6 | bottom: 0;
7 | }
--------------------------------------------------------------------------------
/ispconfig3_account/skins/larry/templates/account.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/ispconfig3_account/skins/larry/templates/general.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/ispconfig3_autoreply/autoreply.js:
--------------------------------------------------------------------------------
1 | window.rcmail && rcmail.addEventListener('init', function (evt) {
2 | rcmail.register_command('plugin.ispconfig3_autoreply.save', function () {
3 | var input_text = rcube_find_object('_autoreplybody');
4 | var input_subject = rcube_find_object('_autoreplysubject');
5 | var input_enabled = rcube_find_object('_autoreplyenabled');
6 |
7 | if (input_text.value == '' && input_enabled.checked) {
8 | parent.rcmail.display_message(rcmail.gettext('ispconfig3_autoreply.textempty'), 'error');
9 | input_text.focus();
10 | }
11 | else if (input_subject.value == '') {
12 | parent.rcmail.display_message(rcmail.gettext('ispconfig3_autoreply.textempty'), 'error');
13 | input_subject.focus();
14 | }
15 | else {
16 | document.forms.autoreply_form.submit();
17 | }
18 | }, true);
19 |
20 | if (rcmail.env.action.startsWith('plugin.ispconfig3_autoreply')) {
21 | $('#autoreplystarton').datetime({
22 | chainTo: '#autoreplyendby'
23 | });
24 |
25 | $('input:not(:hidden)').first().focus();
26 | }
27 | });
--------------------------------------------------------------------------------
/ispconfig3_autoreply/localization/bg_BG.inc:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ispconfig3_autoreply/skins/elastic/jquery.ui.datetime.css:
--------------------------------------------------------------------------------
1 | .ui-datetime {
2 | top: -250px;
3 | }
--------------------------------------------------------------------------------
/ispconfig3_autoreply/skins/elastic/templates/autoreply.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
11 |
12 |
--------------------------------------------------------------------------------
/ispconfig3_autoreply/skins/larry/templates/autoreply.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/ispconfig3_autoselect/config/config.inc.php.dist:
--------------------------------------------------------------------------------
1 | rcmail = rcmail::get_instance();
12 | $this->require_plugin('ispconfig3_account');
13 |
14 | $this->load_config('config/config.inc.php.dist');
15 | if (file_exists($this->home . '/config/config.inc.php')) {
16 | $this->load_config('config/config.inc.php');
17 | }
18 |
19 | $this->load_con_config();
20 |
21 | $this->add_hook('authenticate', [$this, 'authenticate']);
22 | $this->add_hook('template_object_loginform', [$this, 'template_object_loginform']);
23 |
24 | $this->soap = new SoapClient(null, [
25 | 'location' => $this->rcmail->config->get('soap_url') . 'index.php',
26 | 'uri' => $this->rcmail->config->get('soap_url'),
27 | $this->rcmail->config->get('soap_validate_cert') ?:
28 | 'stream_context' => stream_context_create(['ssl' => [
29 | 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true
30 | ]])
31 | ]);
32 | }
33 |
34 | function load_con_config()
35 | {
36 | $config = $this->api->dir . 'ispconfig3_account/config/config.inc.php';
37 | if (file_exists($config)) {
38 | if (!$this->rcmail->config->load_from_file($config)) {
39 | rcube::raise_error(['code' => 527, 'type' => 'php', 'file' => __FILE__, 'line' => __LINE__,
40 | 'message' => "Failed to load config from $config"], true, false);
41 | }
42 | }
43 | else if (file_exists($config . ".dist")) {
44 | if (!$this->rcmail->config->load_from_file($config . '.dist')) {
45 | rcube::raise_error(['code' => 527, 'type' => 'php', 'file' => __FILE__, 'line' => __LINE__,
46 | 'message' => "Failed to load config from $config"], true, false);
47 | }
48 | }
49 | }
50 |
51 | function template_object_loginform($args)
52 | {
53 | $args['content'] = preg_replace("/ |