├── .ci ├── compose.yaml ├── config-test.inc.php ├── docker-images │ ├── Dockerfile │ └── build.sh ├── run_browser_tests.sh ├── run_test_message_rendering.sh └── run_tests.sh ├── .editorconfig ├── .eslintrc.js ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.yml │ ├── config.yml │ └── feature_request.yml ├── dependabot.yml └── workflows │ ├── bot-create-manual-reminder.yml │ ├── bot-manual-reminder.yml │ ├── browser_tests.yml │ ├── ci.yml │ ├── docker_image.yml │ ├── message_rendering.yml │ └── tests.yml ├── .gitignore ├── .php-cs-fixer.dist.php ├── .tx └── config ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── INSTALL ├── LICENSE ├── Makefile ├── README.md ├── RELEASE_MANAGEMENT.md ├── SECURITY.md ├── SOCIAL_WORK_GUIDELINES.md ├── SQL ├── mysql.initial.sql ├── mysql │ ├── 2008030300.sql │ ├── 2008040500.sql │ ├── 2008060900.sql │ ├── 2008092100.sql │ ├── 2009090400.sql │ ├── 2009103100.sql │ ├── 2010042300.sql │ ├── 2010100600.sql │ ├── 2011011200.sql │ ├── 2011092800.sql │ ├── 2011111600.sql │ ├── 2011121400.sql │ ├── 2012080700.sql │ ├── 2013011000.sql │ ├── 2013042700.sql │ ├── 2013052500.sql │ ├── 2013061000.sql │ ├── 2014042900.sql │ ├── 2015030800.sql │ ├── 2015111100.sql │ ├── 2016081200.sql │ ├── 2016100900.sql │ ├── 2016112200.sql │ ├── 2018021600.sql │ ├── 2018122300.sql │ ├── 2019092900.sql │ ├── 2020020100.sql │ ├── 2020020101.sql │ ├── 2020091000.sql │ ├── 2020122900.sql │ ├── 2021081000.sql │ ├── 2021100300.sql │ ├── 2022081200.sql │ └── 2022100100.sql ├── postgres.initial.sql ├── postgres │ ├── 2008030300.sql │ ├── 2008060900.sql │ ├── 2008092100.sql │ ├── 2009090400.sql │ ├── 2009103100.sql │ ├── 2010042300.sql │ ├── 2010100600.sql │ ├── 2011011200.sql │ ├── 2011092800.sql │ ├── 2011111600.sql │ ├── 2011121400.sql │ ├── 2012080700.sql │ ├── 2013011000.sql │ ├── 2013042700.sql │ ├── 2013052500.sql │ ├── 2013061000.sql │ ├── 2014042900.sql │ ├── 2015030800.sql │ ├── 2015111100.sql │ ├── 2016081200.sql │ ├── 2016100900.sql │ ├── 2016112200.sql │ ├── 2018021600.sql │ ├── 2018122300.sql │ ├── 2019092900.sql │ ├── 2020020100.sql │ ├── 2020020101.sql │ ├── 2020091000.sql │ ├── 2020122900.sql │ ├── 2021081000.sql │ ├── 2021100300.sql │ ├── 2022081200.sql │ └── 2022100100.sql ├── sqlite.initial.sql └── sqlite │ ├── 2008030300.sql │ ├── 2008060900.sql │ ├── 2008092100.sql │ ├── 2009090400.sql │ ├── 2009103100.sql │ ├── 2010042300.sql │ ├── 2010100600.sql │ ├── 2011011200.sql │ ├── 2011092800.sql │ ├── 2011111600.sql │ ├── 2011121400.sql │ ├── 2012080700.sql │ ├── 2013011000.sql │ ├── 2013011700.sql │ ├── 2013042700.sql │ ├── 2013052500.sql │ ├── 2013061000.sql │ ├── 2014042900.sql │ ├── 2015030800.sql │ ├── 2015111100.sql │ ├── 2016081200.sql │ ├── 2016100900.sql │ ├── 2016112200.sql │ ├── 2018021600.sql │ ├── 2018122300.sql │ ├── 2019092900.sql │ ├── 2020020100.sql │ ├── 2020020101.sql │ ├── 2020091000.sql │ ├── 2020122900.sql │ ├── 2021081000.sql │ ├── 2021100300.sql │ ├── 2022081200.sql │ └── 2022100100.sql ├── UPGRADING ├── bin ├── cleandb.sh ├── cssshrink.sh ├── decrypt.sh ├── deluser.sh ├── gc.sh ├── identity.sh ├── indexcontacts.sh ├── initdb.sh ├── install-jsdeps.sh ├── installto.sh ├── jsshrink.sh ├── makedoc.sh ├── moduserprefs.sh ├── msgexport.sh ├── msgimport.sh ├── transifexpull.sh ├── update.sh ├── updatecss.sh └── updatedb.sh ├── composer.json ├── config ├── .htaccess ├── config.inc.php.sample ├── defaults.inc.php └── mimetypes.php ├── index.php ├── installer ├── check.php ├── client.js ├── config.php ├── images │ ├── add.png │ ├── banner_gradient.gif │ ├── banner_schraffur.gif │ ├── delete.png │ ├── error.png │ └── roundcube_logo.png ├── index.php ├── styles.css └── test.php ├── jsdeps.json ├── logs └── .htaccess ├── package.json ├── phpstan.neon.dist ├── plugins ├── acl │ ├── acl.js │ ├── acl.php │ ├── composer.json │ ├── config.inc.php.dist │ ├── localization │ │ ├── ar.inc │ │ ├── ar_SA.inc │ │ ├── ast.inc │ │ ├── az_AZ.inc │ │ ├── be_BE.inc │ │ ├── bg_BG.inc │ │ ├── bn_BD.inc │ │ ├── br.inc │ │ ├── bs_BA.inc │ │ ├── ca_ES.inc │ │ ├── cs_CZ.inc │ │ ├── cy_GB.inc │ │ ├── da_DK.inc │ │ ├── de_CH.inc │ │ ├── de_DE.inc │ │ ├── el_GR.inc │ │ ├── en_CA.inc │ │ ├── en_GB.inc │ │ ├── en_US.inc │ │ ├── eo.inc │ │ ├── es_419.inc │ │ ├── es_AR.inc │ │ ├── es_ES.inc │ │ ├── et_EE.inc │ │ ├── eu_ES.inc │ │ ├── fa_AF.inc │ │ ├── fa_IR.inc │ │ ├── fi_FI.inc │ │ ├── fo_FO.inc │ │ ├── fr_FR.inc │ │ ├── fy_NL.inc │ │ ├── ga_IE.inc │ │ ├── gl_ES.inc │ │ ├── he_IL.inc │ │ ├── hi_IN.inc │ │ ├── hr_HR.inc │ │ ├── hu_HU.inc │ │ ├── hy_AM.inc │ │ ├── ia.inc │ │ ├── id_ID.inc │ │ ├── is_IS.inc │ │ ├── it_IT.inc │ │ ├── ja_JP.inc │ │ ├── ka_GE.inc │ │ ├── kab.inc │ │ ├── km_KH.inc │ │ ├── kn_IN.inc │ │ ├── ko_KR.inc │ │ ├── ku.inc │ │ ├── ku_IQ.inc │ │ ├── lb_LU.inc │ │ ├── lt_LT.inc │ │ ├── lv_LV.inc │ │ ├── mk_MK.inc │ │ ├── ml_IN.inc │ │ ├── mn_MN.inc │ │ ├── mr_IN.inc │ │ ├── ms_MY.inc │ │ ├── nb_NO.inc │ │ ├── ne_NP.inc │ │ ├── nl_BE.inc │ │ ├── nl_NL.inc │ │ ├── nn_NO.inc │ │ ├── pl_PL.inc │ │ ├── ps.inc │ │ ├── pt_BR.inc │ │ ├── pt_PT.inc │ │ ├── ro_RO.inc │ │ ├── ru_RU.inc │ │ ├── si_LK.inc │ │ ├── sk_SK.inc │ │ ├── sl_SI.inc │ │ ├── sq_AL.inc │ │ ├── sr_CS.inc │ │ ├── sv_SE.inc │ │ ├── ta_IN.inc │ │ ├── th_TH.inc │ │ ├── ti.inc │ │ ├── tr_TR.inc │ │ ├── tzl.inc │ │ ├── ug.inc │ │ ├── uk_UA.inc │ │ ├── uz.inc │ │ ├── vi_VN.inc │ │ ├── zh_CN.inc │ │ └── zh_TW.inc │ ├── skins │ │ └── elastic │ │ │ └── templates │ │ │ └── table.html │ └── tests │ │ └── AclTest.php ├── additional_message_headers │ ├── additional_message_headers.php │ ├── composer.json │ ├── config.inc.php.dist │ └── tests │ │ └── AdditionalMessageHeadersTest.php ├── archive │ ├── archive.js │ ├── archive.php │ ├── composer.json │ ├── localization │ │ ├── ar.inc │ │ ├── ar_SA.inc │ │ ├── ast.inc │ │ ├── az_AZ.inc │ │ ├── be_BE.inc │ │ ├── bg_BG.inc │ │ ├── bn_BD.inc │ │ ├── br.inc │ │ ├── bs_BA.inc │ │ ├── ca_ES.inc │ │ ├── cs_CZ.inc │ │ ├── cy_GB.inc │ │ ├── da_DK.inc │ │ ├── de_CH.inc │ │ ├── de_DE.inc │ │ ├── el_GR.inc │ │ ├── en_CA.inc │ │ ├── en_GB.inc │ │ ├── en_US.inc │ │ ├── eo.inc │ │ ├── es_419.inc │ │ ├── es_AR.inc │ │ ├── es_ES.inc │ │ ├── et_EE.inc │ │ ├── eu_ES.inc │ │ ├── fa_AF.inc │ │ ├── fa_IR.inc │ │ ├── fi_FI.inc │ │ ├── fo_FO.inc │ │ ├── fr_FR.inc │ │ ├── fy_NL.inc │ │ ├── ga_IE.inc │ │ ├── gl_ES.inc │ │ ├── he_IL.inc │ │ ├── hi_IN.inc │ │ ├── hr_HR.inc │ │ ├── hu_HU.inc │ │ ├── hy_AM.inc │ │ ├── ia.inc │ │ ├── id_ID.inc │ │ ├── is_IS.inc │ │ ├── it_IT.inc │ │ ├── ja_JP.inc │ │ ├── ka_GE.inc │ │ ├── kab.inc │ │ ├── km_KH.inc │ │ ├── ko_KR.inc │ │ ├── ku.inc │ │ ├── ku_IQ.inc │ │ ├── lb_LU.inc │ │ ├── lt_LT.inc │ │ ├── lv_LV.inc │ │ ├── mk_MK.inc │ │ ├── ml_IN.inc │ │ ├── mn_MN.inc │ │ ├── mr_IN.inc │ │ ├── ms_MY.inc │ │ ├── nb_NO.inc │ │ ├── ne_NP.inc │ │ ├── nl_BE.inc │ │ ├── nl_NL.inc │ │ ├── nn_NO.inc │ │ ├── pl_PL.inc │ │ ├── ps.inc │ │ ├── pt_BR.inc │ │ ├── pt_PT.inc │ │ ├── ro_RO.inc │ │ ├── ru_RU.inc │ │ ├── si_LK.inc │ │ ├── sk_SK.inc │ │ ├── sl_SI.inc │ │ ├── sq_AL.inc │ │ ├── sr_CS.inc │ │ ├── sv_SE.inc │ │ ├── ta_IN.inc │ │ ├── th_TH.inc │ │ ├── tr_TR.inc │ │ ├── tzl.inc │ │ ├── ug.inc │ │ ├── uk_UA.inc │ │ ├── uz.inc │ │ ├── vi_VN.inc │ │ ├── zh_CN.inc │ │ └── zh_TW.inc │ └── tests │ │ ├── ArchiveTest.php │ │ └── Browser │ │ ├── MailTest.php │ │ └── SettingsTest.php ├── attachment_reminder │ ├── attachment_reminder.js │ ├── attachment_reminder.php │ ├── composer.json │ ├── localization │ │ ├── ar.inc │ │ ├── ar_SA.inc │ │ ├── ast.inc │ │ ├── az_AZ.inc │ │ ├── be_BE.inc │ │ ├── bg_BG.inc │ │ ├── br.inc │ │ ├── bs_BA.inc │ │ ├── ca_ES.inc │ │ ├── cs_CZ.inc │ │ ├── cy_GB.inc │ │ ├── da_DK.inc │ │ ├── de_CH.inc │ │ ├── de_DE.inc │ │ ├── el_GR.inc │ │ ├── en_CA.inc │ │ ├── en_GB.inc │ │ ├── en_US.inc │ │ ├── es_419.inc │ │ ├── es_AR.inc │ │ ├── es_ES.inc │ │ ├── et_EE.inc │ │ ├── eu_ES.inc │ │ ├── fa_AF.inc │ │ ├── fa_IR.inc │ │ ├── fi_FI.inc │ │ ├── fo_FO.inc │ │ ├── fr_FR.inc │ │ ├── fy_NL.inc │ │ ├── ga_IE.inc │ │ ├── gl_ES.inc │ │ ├── he_IL.inc │ │ ├── hr_HR.inc │ │ ├── hu_HU.inc │ │ ├── ia.inc │ │ ├── id_ID.inc │ │ ├── is_IS.inc │ │ ├── it_IT.inc │ │ ├── ja_JP.inc │ │ ├── kab.inc │ │ ├── km_KH.inc │ │ ├── kn_IN.inc │ │ ├── ko_KR.inc │ │ ├── ku.inc │ │ ├── ku_IQ.inc │ │ ├── lb_LU.inc │ │ ├── lt_LT.inc │ │ ├── lv_LV.inc │ │ ├── mk_MK.inc │ │ ├── ml_IN.inc │ │ ├── mn_MN.inc │ │ ├── nb_NO.inc │ │ ├── nl_BE.inc │ │ ├── nl_NL.inc │ │ ├── pl_PL.inc │ │ ├── pt_BR.inc │ │ ├── pt_PT.inc │ │ ├── ro_RO.inc │ │ ├── ru_RU.inc │ │ ├── sk_SK.inc │ │ ├── sl_SI.inc │ │ ├── sq_AL.inc │ │ ├── sr_CS.inc │ │ ├── sv_SE.inc │ │ ├── tr_TR.inc │ │ ├── ug.inc │ │ ├── uk_UA.inc │ │ ├── uz.inc │ │ ├── vi_VN.inc │ │ ├── zh_CN.inc │ │ └── zh_TW.inc │ └── tests │ │ ├── AttachmentReminderTest.php │ │ └── Browser │ │ └── PluginTest.php ├── autologon │ ├── autologon.php │ ├── composer.json │ └── tests │ │ └── AutologonTest.php ├── autologout │ ├── autologout.php │ ├── composer.json │ └── tests │ │ └── AutologoutTest.php ├── database_attachments │ ├── composer.json │ ├── config.inc.php.dist │ ├── database_attachments.php │ └── tests │ │ └── DatabaseAttachmentsTest.php ├── debug_logger │ ├── composer.json │ ├── debug_logger.php │ ├── runlog │ │ └── runlog.php │ └── tests │ │ └── DebugLoggerTest.php ├── emoticons │ ├── composer.json │ ├── config.inc.php.dist │ ├── emoticons.php │ ├── localization │ │ ├── ar.inc │ │ ├── ar_SA.inc │ │ ├── bg_BG.inc │ │ ├── br.inc │ │ ├── ca_ES.inc │ │ ├── cs_CZ.inc │ │ ├── cy_GB.inc │ │ ├── da_DK.inc │ │ ├── de_CH.inc │ │ ├── de_DE.inc │ │ ├── el_GR.inc │ │ ├── en_GB.inc │ │ ├── en_US.inc │ │ ├── es_AR.inc │ │ ├── es_ES.inc │ │ ├── et_EE.inc │ │ ├── eu_ES.inc │ │ ├── fi_FI.inc │ │ ├── fo_FO.inc │ │ ├── fr_FR.inc │ │ ├── fy_NL.inc │ │ ├── ga_IE.inc │ │ ├── gl_ES.inc │ │ ├── he_IL.inc │ │ ├── hr_HR.inc │ │ ├── hu_HU.inc │ │ ├── ia.inc │ │ ├── id_ID.inc │ │ ├── is_IS.inc │ │ ├── it_IT.inc │ │ ├── ja_JP.inc │ │ ├── ko_KR.inc │ │ ├── ku_IQ.inc │ │ ├── lt_LT.inc │ │ ├── lv_LV.inc │ │ ├── mk_MK.inc │ │ ├── nb_NO.inc │ │ ├── nl_BE.inc │ │ ├── nl_NL.inc │ │ ├── pl_PL.inc │ │ ├── pt_BR.inc │ │ ├── pt_PT.inc │ │ ├── ro_RO.inc │ │ ├── ru_RU.inc │ │ ├── sk_SK.inc │ │ ├── sl_SI.inc │ │ ├── sq_AL.inc │ │ ├── sr_CS.inc │ │ ├── sv_SE.inc │ │ ├── tr_TR.inc │ │ ├── ug.inc │ │ ├── uk_UA.inc │ │ ├── uz.inc │ │ ├── zh_CN.inc │ │ └── zh_TW.inc │ └── tests │ │ └── EmoticonsTest.php ├── enigma │ ├── .gitignore │ ├── README │ ├── bin │ │ └── import_keys.sh │ ├── composer.json │ ├── config.inc.php.dist │ ├── enigma.js │ ├── enigma.php │ ├── lib │ │ ├── enigma_driver.php │ │ ├── enigma_driver_gnupg.php │ │ ├── enigma_driver_phpssl.php │ │ ├── enigma_engine.php │ │ ├── enigma_error.php │ │ ├── enigma_key.php │ │ ├── enigma_mime_message.php │ │ ├── enigma_signature.php │ │ ├── enigma_subkey.php │ │ ├── enigma_ui.php │ │ └── enigma_userid.php │ ├── localization │ │ ├── ar.inc │ │ ├── ar_SA.inc │ │ ├── ast.inc │ │ ├── az_AZ.inc │ │ ├── be_BE.inc │ │ ├── bg_BG.inc │ │ ├── bn_BD.inc │ │ ├── br.inc │ │ ├── bs_BA.inc │ │ ├── ca_ES.inc │ │ ├── cs_CZ.inc │ │ ├── cy_GB.inc │ │ ├── da_DK.inc │ │ ├── de_CH.inc │ │ ├── de_DE.inc │ │ ├── el_GR.inc │ │ ├── en_CA.inc │ │ ├── en_GB.inc │ │ ├── en_US.inc │ │ ├── eo.inc │ │ ├── es_419.inc │ │ ├── es_AR.inc │ │ ├── es_ES.inc │ │ ├── et_EE.inc │ │ ├── eu_ES.inc │ │ ├── fa_AF.inc │ │ ├── fa_IR.inc │ │ ├── fi_FI.inc │ │ ├── fo_FO.inc │ │ ├── fr_FR.inc │ │ ├── fy_NL.inc │ │ ├── ga_IE.inc │ │ ├── gl_ES.inc │ │ ├── he_IL.inc │ │ ├── hi_IN.inc │ │ ├── hr_HR.inc │ │ ├── hu_HU.inc │ │ ├── hy_AM.inc │ │ ├── ia.inc │ │ ├── id_ID.inc │ │ ├── is_IS.inc │ │ ├── it_IT.inc │ │ ├── ja_JP.inc │ │ ├── ka_GE.inc │ │ ├── kab.inc │ │ ├── km_KH.inc │ │ ├── kn_IN.inc │ │ ├── ko_KR.inc │ │ ├── ku.inc │ │ ├── ku_IQ.inc │ │ ├── lb_LU.inc │ │ ├── lt_LT.inc │ │ ├── lv_LV.inc │ │ ├── mk_MK.inc │ │ ├── ml_IN.inc │ │ ├── mn_MN.inc │ │ ├── mr_IN.inc │ │ ├── ms_MY.inc │ │ ├── nb_NO.inc │ │ ├── ne_NP.inc │ │ ├── nl_BE.inc │ │ ├── nl_NL.inc │ │ ├── nn_NO.inc │ │ ├── pl_PL.inc │ │ ├── ps.inc │ │ ├── pt_BR.inc │ │ ├── pt_PT.inc │ │ ├── ro_RO.inc │ │ ├── ru_RU.inc │ │ ├── si_LK.inc │ │ ├── sk_SK.inc │ │ ├── sl_SI.inc │ │ ├── sq_AL.inc │ │ ├── sr_CS.inc │ │ ├── sv_SE.inc │ │ ├── ta_IN.inc │ │ ├── th_TH.inc │ │ ├── ti.inc │ │ ├── tr_TR.inc │ │ ├── tzl.inc │ │ ├── ug.inc │ │ ├── uk_UA.inc │ │ ├── ur_PK.inc │ │ ├── uz.inc │ │ ├── vi_VN.inc │ │ ├── zh_CN.inc │ │ └── zh_TW.inc │ ├── skins │ │ └── elastic │ │ │ └── templates │ │ │ ├── keycreate.html │ │ │ ├── keyimport.html │ │ │ ├── keyinfo.html │ │ │ ├── keys.html │ │ │ └── keysearch.html │ └── tests │ │ ├── EnigmaDriverGnupgTest.php │ │ ├── EnigmaEngineTest.php │ │ ├── EnigmaErrorTest.php │ │ ├── EnigmaKeyTest.php │ │ ├── EnigmaMimeMessageTest.php │ │ ├── EnigmaSignatureTest.php │ │ ├── EnigmaSubkeyTest.php │ │ ├── EnigmaTest.php │ │ └── EnigmaUseridTest.php ├── example_addressbook │ ├── composer.json │ ├── example_addressbook.php │ ├── example_addressbook_backend.php │ └── tests │ │ └── ExampleAddressbookTest.php ├── filesystem_attachments │ ├── composer.json │ ├── filesystem_attachments.php │ └── tests │ │ └── FilesystemAttachmentsTest.php ├── help │ ├── composer.json │ ├── config.inc.php.dist │ ├── content │ │ └── license.html │ ├── help.js │ ├── help.php │ ├── localization │ │ ├── ar.inc │ │ ├── ar_SA.inc │ │ ├── ast.inc │ │ ├── az_AZ.inc │ │ ├── be_BE.inc │ │ ├── bg_BG.inc │ │ ├── br.inc │ │ ├── bs_BA.inc │ │ ├── ca_ES.inc │ │ ├── cs_CZ.inc │ │ ├── cy_GB.inc │ │ ├── da_DK.inc │ │ ├── de_CH.inc │ │ ├── de_DE.inc │ │ ├── el_GR.inc │ │ ├── en_CA.inc │ │ ├── en_GB.inc │ │ ├── en_US.inc │ │ ├── eo.inc │ │ ├── es_419.inc │ │ ├── es_AR.inc │ │ ├── es_ES.inc │ │ ├── et_EE.inc │ │ ├── eu_ES.inc │ │ ├── fa_AF.inc │ │ ├── fa_IR.inc │ │ ├── fi_FI.inc │ │ ├── fo_FO.inc │ │ ├── fr_FR.inc │ │ ├── fy_NL.inc │ │ ├── ga_IE.inc │ │ ├── gl_ES.inc │ │ ├── he_IL.inc │ │ ├── hr_HR.inc │ │ ├── hu_HU.inc │ │ ├── hy_AM.inc │ │ ├── ia.inc │ │ ├── id_ID.inc │ │ ├── is_IS.inc │ │ ├── it_IT.inc │ │ ├── ja_JP.inc │ │ ├── km_KH.inc │ │ ├── kn_IN.inc │ │ ├── ko_KR.inc │ │ ├── ku.inc │ │ ├── ku_IQ.inc │ │ ├── lb_LU.inc │ │ ├── lt_LT.inc │ │ ├── lv_LV.inc │ │ ├── mk_MK.inc │ │ ├── ml_IN.inc │ │ ├── mn_MN.inc │ │ ├── mr_IN.inc │ │ ├── nb_NO.inc │ │ ├── nl_BE.inc │ │ ├── nl_NL.inc │ │ ├── nn_NO.inc │ │ ├── pl_PL.inc │ │ ├── pt_BR.inc │ │ ├── pt_PT.inc │ │ ├── ro_RO.inc │ │ ├── ru_RU.inc │ │ ├── si_LK.inc │ │ ├── sk_SK.inc │ │ ├── sl_SI.inc │ │ ├── sq_AL.inc │ │ ├── sr_CS.inc │ │ ├── sv_SE.inc │ │ ├── th_TH.inc │ │ ├── ti.inc │ │ ├── tr_TR.inc │ │ ├── tzl.inc │ │ ├── ug.inc │ │ ├── uk_UA.inc │ │ ├── uz.inc │ │ ├── vi_VN.inc │ │ ├── zh_CN.inc │ │ └── zh_TW.inc │ ├── skins │ │ └── elastic │ │ │ └── templates │ │ │ ├── content.html │ │ │ └── help.html │ └── tests │ │ └── HelpTest.php ├── hide_blockquote │ ├── composer.json │ ├── hide_blockquote.js │ ├── hide_blockquote.php │ ├── localization │ │ ├── ar.inc │ │ ├── ar_SA.inc │ │ ├── ast.inc │ │ ├── az_AZ.inc │ │ ├── be_BE.inc │ │ ├── bg_BG.inc │ │ ├── bn_BD.inc │ │ ├── br.inc │ │ ├── bs_BA.inc │ │ ├── ca_ES.inc │ │ ├── cs_CZ.inc │ │ ├── cy_GB.inc │ │ ├── da_DK.inc │ │ ├── de_CH.inc │ │ ├── de_DE.inc │ │ ├── el_GR.inc │ │ ├── en_CA.inc │ │ ├── en_GB.inc │ │ ├── en_US.inc │ │ ├── eo.inc │ │ ├── es.inc │ │ ├── es_419.inc │ │ ├── es_AR.inc │ │ ├── es_ES.inc │ │ ├── et_EE.inc │ │ ├── eu_ES.inc │ │ ├── fa_AF.inc │ │ ├── fa_IR.inc │ │ ├── fi_FI.inc │ │ ├── fo_FO.inc │ │ ├── fr_FR.inc │ │ ├── fy_NL.inc │ │ ├── ga_IE.inc │ │ ├── gl_ES.inc │ │ ├── he_IL.inc │ │ ├── hr_HR.inc │ │ ├── hu_HU.inc │ │ ├── hy_AM.inc │ │ ├── ia.inc │ │ ├── id_ID.inc │ │ ├── is_IS.inc │ │ ├── it_IT.inc │ │ ├── ja_JP.inc │ │ ├── ka_GE.inc │ │ ├── km_KH.inc │ │ ├── kn_IN.inc │ │ ├── ko_KR.inc │ │ ├── ku.inc │ │ ├── ku_IQ.inc │ │ ├── lb_LU.inc │ │ ├── lt_LT.inc │ │ ├── lv_LV.inc │ │ ├── mk_MK.inc │ │ ├── ml_IN.inc │ │ ├── mn_MN.inc │ │ ├── nb_NO.inc │ │ ├── nl_BE.inc │ │ ├── nl_NL.inc │ │ ├── nn_NO.inc │ │ ├── pl_PL.inc │ │ ├── pt_BR.inc │ │ ├── pt_PT.inc │ │ ├── ro_RO.inc │ │ ├── ru_RU.inc │ │ ├── sk_SK.inc │ │ ├── sl_SI.inc │ │ ├── sq_AL.inc │ │ ├── sr_CS.inc │ │ ├── sv_SE.inc │ │ ├── th_TH.inc │ │ ├── tr_TR.inc │ │ ├── tzl.inc │ │ ├── ug.inc │ │ ├── uk_UA.inc │ │ ├── ur_PK.inc │ │ ├── uz.inc │ │ ├── vi_VN.inc │ │ ├── zh_CN.inc │ │ └── zh_TW.inc │ └── tests │ │ └── HideBlockquoteTest.php ├── http_authentication │ ├── composer.json │ ├── config.inc.php.dist │ ├── http_authentication.php │ ├── logout.html │ └── tests │ │ └── HttpAuthenticationTest.php ├── identicon │ ├── composer.json │ ├── identicon.php │ ├── identicon_engine.php │ └── tests │ │ ├── IdenticonEngineTest.php │ │ └── IdenticonTest.php ├── identity_select │ ├── composer.json │ ├── identity_select.php │ └── tests │ │ └── IdentitySelectTest.php ├── jqueryui │ ├── README │ ├── composer.json │ ├── config.inc.php.dist │ ├── jqueryui.php │ ├── js │ │ ├── i18n │ │ │ ├── datepicker-af.js │ │ │ ├── datepicker-ar-DZ.js │ │ │ ├── datepicker-ar.js │ │ │ ├── datepicker-az.js │ │ │ ├── datepicker-be.js │ │ │ ├── datepicker-bg.js │ │ │ ├── datepicker-bs.js │ │ │ ├── datepicker-ca.js │ │ │ ├── datepicker-cs.js │ │ │ ├── datepicker-cy-GB.js │ │ │ ├── datepicker-da.js │ │ │ ├── datepicker-de-AT.js │ │ │ ├── datepicker-de.js │ │ │ ├── datepicker-el.js │ │ │ ├── datepicker-en-AU.js │ │ │ ├── datepicker-en-GB.js │ │ │ ├── datepicker-en-NZ.js │ │ │ ├── datepicker-eo.js │ │ │ ├── datepicker-es.js │ │ │ ├── datepicker-et.js │ │ │ ├── datepicker-eu.js │ │ │ ├── datepicker-fa.js │ │ │ ├── datepicker-fi.js │ │ │ ├── datepicker-fo.js │ │ │ ├── datepicker-fr-CA.js │ │ │ ├── datepicker-fr-CH.js │ │ │ ├── datepicker-fr.js │ │ │ ├── datepicker-gl.js │ │ │ ├── datepicker-he.js │ │ │ ├── datepicker-hi.js │ │ │ ├── datepicker-hr.js │ │ │ ├── datepicker-hu.js │ │ │ ├── datepicker-hy.js │ │ │ ├── datepicker-id.js │ │ │ ├── datepicker-is.js │ │ │ ├── datepicker-it-CH.js │ │ │ ├── datepicker-it.js │ │ │ ├── datepicker-ja.js │ │ │ ├── datepicker-ka.js │ │ │ ├── datepicker-kk.js │ │ │ ├── datepicker-km.js │ │ │ ├── datepicker-ko.js │ │ │ ├── datepicker-ky.js │ │ │ ├── datepicker-lb.js │ │ │ ├── datepicker-lt.js │ │ │ ├── datepicker-lv.js │ │ │ ├── datepicker-mk.js │ │ │ ├── datepicker-ml.js │ │ │ ├── datepicker-ms.js │ │ │ ├── datepicker-nb.js │ │ │ ├── datepicker-nl-BE.js │ │ │ ├── datepicker-nl.js │ │ │ ├── datepicker-nn.js │ │ │ ├── datepicker-no.js │ │ │ ├── datepicker-pl.js │ │ │ ├── datepicker-pt-BR.js │ │ │ ├── datepicker-pt.js │ │ │ ├── datepicker-rm.js │ │ │ ├── datepicker-ro.js │ │ │ ├── datepicker-ru.js │ │ │ ├── datepicker-sk.js │ │ │ ├── datepicker-sl.js │ │ │ ├── datepicker-sq.js │ │ │ ├── datepicker-sr-SR.js │ │ │ ├── datepicker-sr.js │ │ │ ├── datepicker-sv.js │ │ │ ├── datepicker-ta.js │ │ │ ├── datepicker-th.js │ │ │ ├── datepicker-tj.js │ │ │ ├── datepicker-tr.js │ │ │ ├── datepicker-uk.js │ │ │ ├── datepicker-vi.js │ │ │ ├── datepicker-zh-CN.js │ │ │ ├── datepicker-zh-HK.js │ │ │ └── datepicker-zh-TW.js │ │ ├── jquery-ui-accessible-datepicker.js │ │ ├── jquery-ui.min.js │ │ ├── jquery.minicolors.min.js │ │ └── jquery.tagedit.js │ ├── tests │ │ └── JqueryuiTest.php │ └── themes │ │ └── elastic │ │ ├── images │ │ ├── jquery.minicolors.png │ │ ├── ui-icons-datepicker.png │ │ ├── ui-icons_444444_256x240.png │ │ └── ui-icons_777777_256x240.png │ │ ├── jquery-ui.css │ │ ├── jquery-ui.css.diff │ │ ├── jquery.minicolors.css │ │ └── jquery.minicolors.css.diff ├── krb_authentication │ ├── composer.json │ ├── config.inc.php.dist │ ├── krb_authentication.php │ └── tests │ │ └── KrbAuthenticationTest.php ├── managesieve │ ├── Changelog │ ├── composer.json │ ├── config.inc.php.dist │ ├── helpdocs │ │ ├── en_US │ │ │ ├── settings-filters.rst │ │ │ └── settings-vacation.rst │ │ └── po │ │ │ ├── settings-filters.pot │ │ │ └── settings-vacation.pot │ ├── lib │ │ └── Roundcube │ │ │ ├── rcube_sieve.php │ │ │ ├── rcube_sieve_engine.php │ │ │ ├── rcube_sieve_forward.php │ │ │ ├── rcube_sieve_script.php │ │ │ └── rcube_sieve_vacation.php │ ├── localization │ │ ├── ar.inc │ │ ├── ar_SA.inc │ │ ├── ast.inc │ │ ├── az_AZ.inc │ │ ├── be_BE.inc │ │ ├── bg_BG.inc │ │ ├── bn_BD.inc │ │ ├── br.inc │ │ ├── bs_BA.inc │ │ ├── ca_ES.inc │ │ ├── cs_CZ.inc │ │ ├── cy_GB.inc │ │ ├── da_DK.inc │ │ ├── de_CH.inc │ │ ├── de_DE.inc │ │ ├── el_GR.inc │ │ ├── en_CA.inc │ │ ├── en_GB.inc │ │ ├── en_US.inc │ │ ├── eo.inc │ │ ├── es_419.inc │ │ ├── es_AR.inc │ │ ├── es_ES.inc │ │ ├── et_EE.inc │ │ ├── eu_ES.inc │ │ ├── fa_AF.inc │ │ ├── fa_IR.inc │ │ ├── fi_FI.inc │ │ ├── fo_FO.inc │ │ ├── fr_FR.inc │ │ ├── fy_NL.inc │ │ ├── ga_IE.inc │ │ ├── gl_ES.inc │ │ ├── he_IL.inc │ │ ├── hi_IN.inc │ │ ├── hr_HR.inc │ │ ├── hu_HU.inc │ │ ├── hy_AM.inc │ │ ├── ia.inc │ │ ├── id_ID.inc │ │ ├── is_IS.inc │ │ ├── it_IT.inc │ │ ├── ja_JP.inc │ │ ├── ka_GE.inc │ │ ├── kab.inc │ │ ├── km_KH.inc │ │ ├── kn_IN.inc │ │ ├── ko_KR.inc │ │ ├── ku.inc │ │ ├── ku_IQ.inc │ │ ├── lb_LU.inc │ │ ├── lt_LT.inc │ │ ├── lv_LV.inc │ │ ├── mk_MK.inc │ │ ├── ml_IN.inc │ │ ├── mn_MN.inc │ │ ├── mr_IN.inc │ │ ├── ms_MY.inc │ │ ├── nb_NO.inc │ │ ├── ne_NP.inc │ │ ├── nl_BE.inc │ │ ├── nl_NL.inc │ │ ├── nn_NO.inc │ │ ├── pl_PL.inc │ │ ├── ps.inc │ │ ├── pt_BR.inc │ │ ├── pt_PT.inc │ │ ├── ro_RO.inc │ │ ├── ru_RU.inc │ │ ├── si_LK.inc │ │ ├── sk_SK.inc │ │ ├── sl_SI.inc │ │ ├── sq_AL.inc │ │ ├── sr_CS.inc │ │ ├── sv_SE.inc │ │ ├── ta_IN.inc │ │ ├── th_TH.inc │ │ ├── ti.inc │ │ ├── tr_TR.inc │ │ ├── tzl.inc │ │ ├── ug.inc │ │ ├── uk_UA.inc │ │ ├── ur_PK.inc │ │ ├── uz.inc │ │ ├── vi_VN.inc │ │ ├── zh_CN.inc │ │ └── zh_TW.inc │ ├── managesieve.js │ ├── managesieve.php │ ├── skins │ │ └── elastic │ │ │ └── templates │ │ │ ├── filteredit.html │ │ │ ├── forward.html │ │ │ ├── managesieve.html │ │ │ ├── setedit.html │ │ │ ├── seteditraw.html │ │ │ └── vacation.html │ └── tests │ │ ├── ManagesieveEngineTest.php │ │ ├── ManagesieveForwardTest.php │ │ ├── ManagesieveScriptTest.php │ │ ├── ManagesieveTest.php │ │ ├── ManagesieveVacationTest.php │ │ └── src │ │ ├── parser │ │ ├── parser.out │ │ ├── parser_body │ │ ├── parser_comments │ │ ├── parser_comments.out │ │ ├── parser_date │ │ ├── parser_duplicate │ │ ├── parser_editheader │ │ ├── parser_enotify_a │ │ ├── parser_enotify_b │ │ ├── parser_imapflags │ │ ├── parser_include │ │ ├── parser_index │ │ ├── parser_kep14 │ │ ├── parser_kep14.out │ │ ├── parser_nesting │ │ ├── parser_nesting.out │ │ ├── parser_notify_a │ │ ├── parser_notify_b │ │ ├── parser_prefix │ │ ├── parser_relational │ │ ├── parser_spamtest │ │ ├── parser_subaddress │ │ ├── parser_vacation │ │ ├── parser_vacation_seconds │ │ └── parser_variables ├── markasjunk │ ├── README.md │ ├── composer.json │ ├── config.inc.php.dist │ ├── drivers │ │ ├── amavis_blacklist.php │ │ ├── cmd_learn.php │ │ ├── dir_learn.php │ │ ├── edit_headers.php │ │ ├── email_learn.php │ │ ├── jsevent.php │ │ ├── sa_blacklist.php │ │ └── sa_detach.php │ ├── localization │ │ ├── ar.inc │ │ ├── ar_SA.inc │ │ ├── bg_BG.inc │ │ ├── ca_ES.inc │ │ ├── cs_CZ.inc │ │ ├── cy_GB.inc │ │ ├── da_DK.inc │ │ ├── de_CH.inc │ │ ├── de_DE.inc │ │ ├── el_GR.inc │ │ ├── en_GB.inc │ │ ├── en_US.inc │ │ ├── es_AR.inc │ │ ├── es_ES.inc │ │ ├── et_EE.inc │ │ ├── eu_ES.inc │ │ ├── fi_FI.inc │ │ ├── fr_FR.inc │ │ ├── ga_IE.inc │ │ ├── gl_ES.inc │ │ ├── he_IL.inc │ │ ├── hr_HR.inc │ │ ├── hu_HU.inc │ │ ├── ia.inc │ │ ├── id_ID.inc │ │ ├── is_IS.inc │ │ ├── it_IT.inc │ │ ├── ja_JP.inc │ │ ├── ko_KR.inc │ │ ├── ku.inc │ │ ├── lt_LT.inc │ │ ├── lv_LV.inc │ │ ├── nb_NO.inc │ │ ├── nl_NL.inc │ │ ├── pl_PL.inc │ │ ├── pt_BR.inc │ │ ├── pt_PT.inc │ │ ├── ru_RU.inc │ │ ├── sk_SK.inc │ │ ├── sq_AL.inc │ │ ├── sv_SE.inc │ │ ├── tr_TR.inc │ │ ├── ug.inc │ │ └── zh_TW.inc │ ├── markasjunk.js │ ├── markasjunk.php │ └── tests │ │ ├── Browser │ │ └── MailTest.php │ │ └── MarkasjunkTest.php ├── new_user_dialog │ ├── composer.json │ ├── localization │ │ ├── ar.inc │ │ ├── ar_SA.inc │ │ ├── ast.inc │ │ ├── az_AZ.inc │ │ ├── be_BE.inc │ │ ├── bg_BG.inc │ │ ├── br.inc │ │ ├── bs_BA.inc │ │ ├── ca_ES.inc │ │ ├── cs_CZ.inc │ │ ├── cy_GB.inc │ │ ├── da_DK.inc │ │ ├── de_CH.inc │ │ ├── de_DE.inc │ │ ├── el_GR.inc │ │ ├── en_CA.inc │ │ ├── en_GB.inc │ │ ├── en_US.inc │ │ ├── eo.inc │ │ ├── es.inc │ │ ├── es_419.inc │ │ ├── es_AR.inc │ │ ├── es_ES.inc │ │ ├── et_EE.inc │ │ ├── eu_ES.inc │ │ ├── fa_AF.inc │ │ ├── fa_IR.inc │ │ ├── fi_FI.inc │ │ ├── fo_FO.inc │ │ ├── fr_FR.inc │ │ ├── fy_NL.inc │ │ ├── ga_IE.inc │ │ ├── gl_ES.inc │ │ ├── he_IL.inc │ │ ├── hr_HR.inc │ │ ├── hu_HU.inc │ │ ├── hy_AM.inc │ │ ├── ia.inc │ │ ├── id_ID.inc │ │ ├── is_IS.inc │ │ ├── it_IT.inc │ │ ├── ja_JP.inc │ │ ├── km_KH.inc │ │ ├── ko_KR.inc │ │ ├── ku.inc │ │ ├── ku_IQ.inc │ │ ├── lb_LU.inc │ │ ├── lt_LT.inc │ │ ├── lv_LV.inc │ │ ├── mk_MK.inc │ │ ├── ml_IN.inc │ │ ├── mn_MN.inc │ │ ├── mr_IN.inc │ │ ├── nb_NO.inc │ │ ├── nl_BE.inc │ │ ├── nl_NL.inc │ │ ├── nn_NO.inc │ │ ├── pl_PL.inc │ │ ├── pt_BR.inc │ │ ├── pt_PT.inc │ │ ├── ro_RO.inc │ │ ├── ru_RU.inc │ │ ├── sk_SK.inc │ │ ├── sl_SI.inc │ │ ├── sq_AL.inc │ │ ├── sr_CS.inc │ │ ├── sv_SE.inc │ │ ├── th_TH.inc │ │ ├── tr_TR.inc │ │ ├── ug.inc │ │ ├── uk_UA.inc │ │ ├── vi_VN.inc │ │ ├── zh_CN.inc │ │ └── zh_TW.inc │ ├── new_user_dialog.php │ └── tests │ │ └── NewUserDialogTest.php ├── new_user_identity │ ├── composer.json │ ├── config.inc.php.dist │ ├── new_user_identity.php │ └── tests │ │ └── NewUserIdentityTest.php ├── newmail_notifier │ ├── composer.json │ ├── config.inc.php.dist │ ├── favicon.ico │ ├── localization │ │ ├── ar.inc │ │ ├── ar_SA.inc │ │ ├── ast.inc │ │ ├── az_AZ.inc │ │ ├── be_BE.inc │ │ ├── bg_BG.inc │ │ ├── br.inc │ │ ├── bs_BA.inc │ │ ├── ca_ES.inc │ │ ├── cs_CZ.inc │ │ ├── cy_GB.inc │ │ ├── da_DK.inc │ │ ├── de_CH.inc │ │ ├── de_DE.inc │ │ ├── el_GR.inc │ │ ├── en_CA.inc │ │ ├── en_GB.inc │ │ ├── en_US.inc │ │ ├── eo.inc │ │ ├── es_419.inc │ │ ├── es_AR.inc │ │ ├── es_ES.inc │ │ ├── et_EE.inc │ │ ├── eu_ES.inc │ │ ├── fa_IR.inc │ │ ├── fi_FI.inc │ │ ├── fo_FO.inc │ │ ├── fr_FR.inc │ │ ├── fy_NL.inc │ │ ├── ga_IE.inc │ │ ├── gl_ES.inc │ │ ├── he_IL.inc │ │ ├── hr_HR.inc │ │ ├── hu_HU.inc │ │ ├── hy_AM.inc │ │ ├── ia.inc │ │ ├── id_ID.inc │ │ ├── is_IS.inc │ │ ├── it_IT.inc │ │ ├── ja_JP.inc │ │ ├── km_KH.inc │ │ ├── ko_KR.inc │ │ ├── ku.inc │ │ ├── ku_IQ.inc │ │ ├── lb_LU.inc │ │ ├── lt_LT.inc │ │ ├── lv_LV.inc │ │ ├── mk_MK.inc │ │ ├── ml_IN.inc │ │ ├── mn_MN.inc │ │ ├── mr_IN.inc │ │ ├── nb_NO.inc │ │ ├── nl_BE.inc │ │ ├── nl_NL.inc │ │ ├── nn_NO.inc │ │ ├── pl_PL.inc │ │ ├── pt_BR.inc │ │ ├── pt_PT.inc │ │ ├── ro_RO.inc │ │ ├── ru_RU.inc │ │ ├── si_LK.inc │ │ ├── sk_SK.inc │ │ ├── sl_SI.inc │ │ ├── sq_AL.inc │ │ ├── sr_CS.inc │ │ ├── sv_SE.inc │ │ ├── th_TH.inc │ │ ├── ti.inc │ │ ├── tr_TR.inc │ │ ├── ug.inc │ │ ├── uk_UA.inc │ │ ├── uz.inc │ │ ├── vi_VN.inc │ │ ├── zh_CN.inc │ │ └── zh_TW.inc │ ├── mail.png │ ├── newmail_notifier.js │ ├── newmail_notifier.php │ ├── overlay.ico │ ├── sound.mp3 │ ├── sound.wav │ └── tests │ │ └── NewmailNotifierTest.php ├── password │ ├── README │ ├── composer.json │ ├── config.inc.php.dist │ ├── drivers │ │ ├── chpasswd.php │ │ ├── cpanel.php │ │ ├── dbmail.php │ │ ├── directadmin.php │ │ ├── domainfactory.php │ │ ├── dovecot_passwdfile.php │ │ ├── expect.php │ │ ├── gearman.php │ │ ├── hmail.php │ │ ├── httpapi.php │ │ ├── kpasswd.php │ │ ├── ldap.php │ │ ├── ldap_exop.php │ │ ├── ldap_ppolicy.php │ │ ├── ldap_samba_ad.php │ │ ├── ldap_simple.php │ │ ├── mailcow.php │ │ ├── miab.php │ │ ├── modoboa.php │ │ ├── pam.php │ │ ├── plesk.php │ │ ├── poppassd.php │ │ ├── pw_usermod.php │ │ ├── pwned.php │ │ ├── sasl.php │ │ ├── smb.php │ │ ├── sql.php │ │ ├── tinycp.php │ │ ├── virtualmin.php │ │ ├── vpopmaild.php │ │ ├── ximss.php │ │ ├── xmail.php │ │ └── zxcvbn.php │ ├── helpers │ │ ├── change_ldap_pass.pl │ │ ├── chgdbmailusers.c │ │ ├── chgsaslpasswd.c │ │ ├── chgvirtualminpasswd.c │ │ ├── chpass-wrapper.py │ │ └── passwd-expect │ ├── localization │ │ ├── ar.inc │ │ ├── ar_SA.inc │ │ ├── ast.inc │ │ ├── az_AZ.inc │ │ ├── be_BE.inc │ │ ├── bg_BG.inc │ │ ├── br.inc │ │ ├── bs_BA.inc │ │ ├── ca_ES.inc │ │ ├── cs_CZ.inc │ │ ├── cy_GB.inc │ │ ├── da_DK.inc │ │ ├── de_CH.inc │ │ ├── de_DE.inc │ │ ├── el_GR.inc │ │ ├── en_CA.inc │ │ ├── en_GB.inc │ │ ├── en_US.inc │ │ ├── eo.inc │ │ ├── es_419.inc │ │ ├── es_AR.inc │ │ ├── es_ES.inc │ │ ├── et_EE.inc │ │ ├── eu_ES.inc │ │ ├── fa_AF.inc │ │ ├── fa_IR.inc │ │ ├── fi_FI.inc │ │ ├── fo_FO.inc │ │ ├── fr_FR.inc │ │ ├── fy_NL.inc │ │ ├── ga_IE.inc │ │ ├── gl_ES.inc │ │ ├── he_IL.inc │ │ ├── hr_HR.inc │ │ ├── hu_HU.inc │ │ ├── hy_AM.inc │ │ ├── ia.inc │ │ ├── id_ID.inc │ │ ├── is_IS.inc │ │ ├── it_IT.inc │ │ ├── ja_JP.inc │ │ ├── kab.inc │ │ ├── km_KH.inc │ │ ├── ko_KR.inc │ │ ├── ku.inc │ │ ├── ku_IQ.inc │ │ ├── lb_LU.inc │ │ ├── lt_LT.inc │ │ ├── lv_LV.inc │ │ ├── mk_MK.inc │ │ ├── ml_IN.inc │ │ ├── mn_MN.inc │ │ ├── nb_NO.inc │ │ ├── nl_BE.inc │ │ ├── nl_NL.inc │ │ ├── nn_NO.inc │ │ ├── pl_PL.inc │ │ ├── pt_BR.inc │ │ ├── pt_PT.inc │ │ ├── ro_RO.inc │ │ ├── ru_RU.inc │ │ ├── sk_SK.inc │ │ ├── sl_SI.inc │ │ ├── sq_AL.inc │ │ ├── sr_CS.inc │ │ ├── sv_SE.inc │ │ ├── th_TH.inc │ │ ├── ti.inc │ │ ├── tr_TR.inc │ │ ├── ug.inc │ │ ├── uk_UA.inc │ │ ├── uz.inc │ │ ├── vi_VN.inc │ │ ├── zh_CN.inc │ │ └── zh_TW.inc │ ├── password.js │ ├── password.php │ └── tests │ │ └── PasswordTest.php ├── reconnect │ ├── composer.json │ ├── config.inc.php.dist │ ├── readme.md │ ├── reconnect.php │ └── tests │ │ └── ReconnectTest.php ├── redundant_attachments │ ├── composer.json │ ├── config.inc.php.dist │ ├── redundant_attachments.php │ └── tests │ │ └── RedundantAttachmentsTest.php ├── show_additional_headers │ ├── composer.json │ ├── show_additional_headers.php │ └── tests │ │ └── ShowAdditionalHeadersTest.php ├── squirrelmail_usercopy │ ├── composer.json │ ├── config.inc.php.dist │ ├── squirrelmail_usercopy.php │ └── tests │ │ └── SquirrelmailUsercopyTest.php ├── subscriptions_option │ ├── composer.json │ ├── localization │ │ ├── ar.inc │ │ ├── ar_SA.inc │ │ ├── ast.inc │ │ ├── az_AZ.inc │ │ ├── be_BE.inc │ │ ├── bg_BG.inc │ │ ├── br.inc │ │ ├── bs_BA.inc │ │ ├── ca_ES.inc │ │ ├── cs_CZ.inc │ │ ├── cy_GB.inc │ │ ├── da_DK.inc │ │ ├── de_CH.inc │ │ ├── de_DE.inc │ │ ├── el_GR.inc │ │ ├── en_CA.inc │ │ ├── en_GB.inc │ │ ├── en_US.inc │ │ ├── eo.inc │ │ ├── es.inc │ │ ├── es_419.inc │ │ ├── es_AR.inc │ │ ├── es_ES.inc │ │ ├── et_EE.inc │ │ ├── eu_ES.inc │ │ ├── fa_AF.inc │ │ ├── fa_IR.inc │ │ ├── fi_FI.inc │ │ ├── fo_FO.inc │ │ ├── fr_FR.inc │ │ ├── fy_NL.inc │ │ ├── ga_IE.inc │ │ ├── gl_ES.inc │ │ ├── he_IL.inc │ │ ├── hr_HR.inc │ │ ├── hu_HU.inc │ │ ├── hy_AM.inc │ │ ├── ia.inc │ │ ├── id_ID.inc │ │ ├── is_IS.inc │ │ ├── it_IT.inc │ │ ├── ja_JP.inc │ │ ├── km_KH.inc │ │ ├── ko_KR.inc │ │ ├── ku.inc │ │ ├── lb_LU.inc │ │ ├── lt_LT.inc │ │ ├── lv_LV.inc │ │ ├── mk_MK.inc │ │ ├── ml_IN.inc │ │ ├── mn_MN.inc │ │ ├── nb_NO.inc │ │ ├── nl_NL.inc │ │ ├── nn_NO.inc │ │ ├── pl_PL.inc │ │ ├── pt_BR.inc │ │ ├── pt_PT.inc │ │ ├── ro_RO.inc │ │ ├── ru_RU.inc │ │ ├── sk_SK.inc │ │ ├── sl_SI.inc │ │ ├── sq_AL.inc │ │ ├── sr_CS.inc │ │ ├── sv_SE.inc │ │ ├── th_TH.inc │ │ ├── tr_TR.inc │ │ ├── ug.inc │ │ ├── uk_UA.inc │ │ ├── uz.inc │ │ ├── vi_VN.inc │ │ ├── zh_CN.inc │ │ └── zh_TW.inc │ ├── subscriptions_option.php │ └── tests │ │ └── SubscriptionsOptionTest.php ├── userinfo │ ├── composer.json │ ├── localization │ │ ├── ar.inc │ │ ├── ar_SA.inc │ │ ├── ast.inc │ │ ├── az_AZ.inc │ │ ├── be_BE.inc │ │ ├── bg_BG.inc │ │ ├── br.inc │ │ ├── bs_BA.inc │ │ ├── ca_ES.inc │ │ ├── cs_CZ.inc │ │ ├── cy_GB.inc │ │ ├── da_DK.inc │ │ ├── de_CH.inc │ │ ├── de_DE.inc │ │ ├── el_GR.inc │ │ ├── en_CA.inc │ │ ├── en_GB.inc │ │ ├── en_US.inc │ │ ├── eo.inc │ │ ├── es_419.inc │ │ ├── es_AR.inc │ │ ├── es_ES.inc │ │ ├── et_EE.inc │ │ ├── eu_ES.inc │ │ ├── fa_AF.inc │ │ ├── fa_IR.inc │ │ ├── fi_FI.inc │ │ ├── fo_FO.inc │ │ ├── fr_FR.inc │ │ ├── fy_NL.inc │ │ ├── ga_IE.inc │ │ ├── gl_ES.inc │ │ ├── he_IL.inc │ │ ├── hr_HR.inc │ │ ├── hu_HU.inc │ │ ├── hy_AM.inc │ │ ├── ia.inc │ │ ├── id_ID.inc │ │ ├── is_IS.inc │ │ ├── it_IT.inc │ │ ├── ja_JP.inc │ │ ├── km_KH.inc │ │ ├── ko_KR.inc │ │ ├── ku.inc │ │ ├── ku_IQ.inc │ │ ├── lb_LU.inc │ │ ├── lt_LT.inc │ │ ├── lv_LV.inc │ │ ├── mk_MK.inc │ │ ├── ml_IN.inc │ │ ├── mn_MN.inc │ │ ├── mr_IN.inc │ │ ├── nb_NO.inc │ │ ├── nl_BE.inc │ │ ├── nl_NL.inc │ │ ├── nn_NO.inc │ │ ├── pl_PL.inc │ │ ├── pt_BR.inc │ │ ├── pt_PT.inc │ │ ├── ro_RO.inc │ │ ├── ru_RU.inc │ │ ├── sk_SK.inc │ │ ├── sl_SI.inc │ │ ├── sq_AL.inc │ │ ├── sr_CS.inc │ │ ├── sv_SE.inc │ │ ├── th_TH.inc │ │ ├── ti.inc │ │ ├── tr_TR.inc │ │ ├── ug.inc │ │ ├── uk_UA.inc │ │ ├── uz.inc │ │ ├── vi_VN.inc │ │ ├── zh_CN.inc │ │ └── zh_TW.inc │ ├── tests │ │ └── UserinfoTest.php │ └── userinfo.php ├── vcard_attachments │ ├── composer.json │ ├── localization │ │ ├── ar.inc │ │ ├── ar_SA.inc │ │ ├── ast.inc │ │ ├── az_AZ.inc │ │ ├── be_BE.inc │ │ ├── bg_BG.inc │ │ ├── br.inc │ │ ├── bs_BA.inc │ │ ├── ca_ES.inc │ │ ├── cs_CZ.inc │ │ ├── cy_GB.inc │ │ ├── da_DK.inc │ │ ├── de_CH.inc │ │ ├── de_DE.inc │ │ ├── el_GR.inc │ │ ├── en_CA.inc │ │ ├── en_GB.inc │ │ ├── en_US.inc │ │ ├── eo.inc │ │ ├── es_419.inc │ │ ├── es_AR.inc │ │ ├── es_ES.inc │ │ ├── et_EE.inc │ │ ├── eu_ES.inc │ │ ├── fa_IR.inc │ │ ├── fi_FI.inc │ │ ├── fo_FO.inc │ │ ├── fr_FR.inc │ │ ├── fy_NL.inc │ │ ├── ga_IE.inc │ │ ├── gl_ES.inc │ │ ├── he_IL.inc │ │ ├── hr_HR.inc │ │ ├── hu_HU.inc │ │ ├── hy_AM.inc │ │ ├── ia.inc │ │ ├── id_ID.inc │ │ ├── is_IS.inc │ │ ├── it_IT.inc │ │ ├── ja_JP.inc │ │ ├── km_KH.inc │ │ ├── ko_KR.inc │ │ ├── ku.inc │ │ ├── lb_LU.inc │ │ ├── lt_LT.inc │ │ ├── lv_LV.inc │ │ ├── mk_MK.inc │ │ ├── ml_IN.inc │ │ ├── mn_MN.inc │ │ ├── mr_IN.inc │ │ ├── nb_NO.inc │ │ ├── nl_NL.inc │ │ ├── nn_NO.inc │ │ ├── pl_PL.inc │ │ ├── pt_BR.inc │ │ ├── pt_PT.inc │ │ ├── ro_RO.inc │ │ ├── ru_RU.inc │ │ ├── si_LK.inc │ │ ├── sk_SK.inc │ │ ├── sl_SI.inc │ │ ├── sq_AL.inc │ │ ├── sr_CS.inc │ │ ├── sv_SE.inc │ │ ├── th_TH.inc │ │ ├── tr_TR.inc │ │ ├── ug.inc │ │ ├── uk_UA.inc │ │ ├── uz.inc │ │ ├── vi_VN.inc │ │ ├── zh_CN.inc │ │ └── zh_TW.inc │ ├── tests │ │ └── VcardAttachmentsTest.php │ ├── vcard_attachments.php │ └── vcardattach.js ├── virtuser_file │ ├── composer.json │ ├── tests │ │ └── VirtuserFileTest.php │ └── virtuser_file.php ├── virtuser_query │ ├── composer.json │ ├── tests │ │ └── VirtuserQueryTest.php │ └── virtuser_query.php └── zipdownload │ ├── README │ ├── composer.json │ ├── config.inc.php.dist │ ├── localization │ ├── ar.inc │ ├── ar_SA.inc │ ├── ast.inc │ ├── az_AZ.inc │ ├── be_BE.inc │ ├── bg_BG.inc │ ├── br.inc │ ├── bs_BA.inc │ ├── ca_ES.inc │ ├── cs_CZ.inc │ ├── cy_GB.inc │ ├── da_DK.inc │ ├── de_CH.inc │ ├── de_DE.inc │ ├── el_GR.inc │ ├── en_CA.inc │ ├── en_GB.inc │ ├── en_US.inc │ ├── eo.inc │ ├── es_419.inc │ ├── es_AR.inc │ ├── es_ES.inc │ ├── et_EE.inc │ ├── eu_ES.inc │ ├── fa_AF.inc │ ├── fa_IR.inc │ ├── fi_FI.inc │ ├── fo_FO.inc │ ├── fr_FR.inc │ ├── fy_NL.inc │ ├── ga_IE.inc │ ├── gl_ES.inc │ ├── he_IL.inc │ ├── hr_HR.inc │ ├── hu_HU.inc │ ├── hy_AM.inc │ ├── ia.inc │ ├── id_ID.inc │ ├── is_IS.inc │ ├── it_IT.inc │ ├── ja_JP.inc │ ├── km_KH.inc │ ├── ko_KR.inc │ ├── ku.inc │ ├── ku_IQ.inc │ ├── lb_LU.inc │ ├── lt_LT.inc │ ├── lv_LV.inc │ ├── mk_MK.inc │ ├── ml_IN.inc │ ├── mn_MN.inc │ ├── nb_NO.inc │ ├── nl_NL.inc │ ├── nn_NO.inc │ ├── pl_PL.inc │ ├── pt_BR.inc │ ├── pt_PT.inc │ ├── ro_RO.inc │ ├── ru_RU.inc │ ├── sk_SK.inc │ ├── sl_SI.inc │ ├── sq_AL.inc │ ├── sr_CS.inc │ ├── sv_SE.inc │ ├── th_TH.inc │ ├── tr_TR.inc │ ├── ug.inc │ ├── uk_UA.inc │ ├── uz.inc │ ├── vi_VN.inc │ ├── zh_CN.inc │ └── zh_TW.inc │ ├── tests │ ├── Browser │ │ └── MailTest.php │ └── ZipdownloadTest.php │ ├── zipdownload.js │ └── zipdownload.php ├── program ├── actions │ ├── contacts │ │ ├── copy.php │ │ ├── delete.php │ │ ├── edit.php │ │ ├── export.php │ │ ├── group_addmembers.php │ │ ├── group_create.php │ │ ├── group_delete.php │ │ ├── group_delmembers.php │ │ ├── group_rename.php │ │ ├── import.php │ │ ├── index.php │ │ ├── list.php │ │ ├── mailto.php │ │ ├── move.php │ │ ├── photo.php │ │ ├── print.php │ │ ├── qrcode.php │ │ ├── save.php │ │ ├── search.php │ │ ├── search_create.php │ │ ├── search_delete.php │ │ ├── show.php │ │ ├── undo.php │ │ └── upload_photo.php │ ├── login │ │ ├── oauth.php │ │ └── oauth_backchannel.php │ ├── mail │ │ ├── addcontact.php │ │ ├── attachment_delete.php │ │ ├── attachment_display.php │ │ ├── attachment_rename.php │ │ ├── attachment_upload.php │ │ ├── autocomplete.php │ │ ├── bounce.php │ │ ├── check_recent.php │ │ ├── compose.php │ │ ├── copy.php │ │ ├── delete.php │ │ ├── folder_expunge.php │ │ ├── folder_purge.php │ │ ├── get.php │ │ ├── getunread.php │ │ ├── group_expand.php │ │ ├── headers.php │ │ ├── import.php │ │ ├── index.php │ │ ├── list.php │ │ ├── list_contacts.php │ │ ├── mark.php │ │ ├── move.php │ │ ├── pagenav.php │ │ ├── search.php │ │ ├── search_contacts.php │ │ ├── send.php │ │ ├── sendmdn.php │ │ ├── show.php │ │ └── viewsource.php │ ├── settings │ │ ├── about.php │ │ ├── folder_create.php │ │ ├── folder_delete.php │ │ ├── folder_edit.php │ │ ├── folder_purge.php │ │ ├── folder_rename.php │ │ ├── folder_save.php │ │ ├── folder_size.php │ │ ├── folder_subscribe.php │ │ ├── folder_unsubscribe.php │ │ ├── folders.php │ │ ├── identities.php │ │ ├── identity_create.php │ │ ├── identity_delete.php │ │ ├── identity_edit.php │ │ ├── identity_save.php │ │ ├── index.php │ │ ├── prefs_edit.php │ │ ├── prefs_save.php │ │ ├── response_create.php │ │ ├── response_delete.php │ │ ├── response_edit.php │ │ ├── response_get.php │ │ ├── response_save.php │ │ ├── responses.php │ │ ├── upload.php │ │ └── upload_display.php │ └── utils │ │ ├── error.php │ │ ├── html2text.php │ │ ├── killcache.php │ │ ├── modcss.php │ │ ├── save_pref.php │ │ ├── spell.php │ │ ├── spell_html.php │ │ └── text2html.php ├── include │ ├── clisetup.php │ ├── iniset.php │ ├── rcmail.php │ ├── rcmail_action.php │ ├── rcmail_attachment_handler.php │ ├── rcmail_html_page.php │ ├── rcmail_install.php │ ├── rcmail_oauth.php │ ├── rcmail_output.php │ ├── rcmail_output_cli.php │ ├── rcmail_output_html.php │ ├── rcmail_output_json.php │ ├── rcmail_resend_mail.php │ ├── rcmail_sendmail.php │ ├── rcmail_string_replacer.php │ └── rcmail_utils.php ├── js │ ├── app.js │ ├── common.js │ ├── editor.js │ ├── googiespell.js │ ├── list.js │ └── treelist.js ├── lib │ └── Roundcube │ │ ├── README.md │ │ ├── bootstrap.php │ │ ├── cache │ │ ├── apcu.php │ │ ├── db.php │ │ ├── memcache.php │ │ ├── memcached.php │ │ └── redis.php │ │ ├── db │ │ ├── mysql.php │ │ ├── param.php │ │ ├── pgsql.php │ │ └── sqlite.php │ │ ├── html.php │ │ ├── rcube.php │ │ ├── rcube_addressbook.php │ │ ├── rcube_addresses.php │ │ ├── rcube_base_replacer.php │ │ ├── rcube_browser.php │ │ ├── rcube_cache.php │ │ ├── rcube_charset.php │ │ ├── rcube_config.php │ │ ├── rcube_contacts.php │ │ ├── rcube_content_filter.php │ │ ├── rcube_csv2vcard.php │ │ ├── rcube_db.php │ │ ├── rcube_enriched.php │ │ ├── rcube_html2text.php │ │ ├── rcube_image.php │ │ ├── rcube_imap.php │ │ ├── rcube_imap_cache.php │ │ ├── rcube_imap_generic.php │ │ ├── rcube_imap_search.php │ │ ├── rcube_ldap.php │ │ ├── rcube_ldap_generic.php │ │ ├── rcube_message.php │ │ ├── rcube_message_header.php │ │ ├── rcube_message_part.php │ │ ├── rcube_mime.php │ │ ├── rcube_mime_decode.php │ │ ├── rcube_output.php │ │ ├── rcube_plugin.php │ │ ├── rcube_plugin_api.php │ │ ├── rcube_result_index.php │ │ ├── rcube_result_multifolder.php │ │ ├── rcube_result_set.php │ │ ├── rcube_result_thread.php │ │ ├── rcube_session.php │ │ ├── rcube_smtp.php │ │ ├── rcube_spellchecker.php │ │ ├── rcube_spoofchecker.php │ │ ├── rcube_storage.php │ │ ├── rcube_string_replacer.php │ │ ├── rcube_text2html.php │ │ ├── rcube_tnef_decoder.php │ │ ├── rcube_uploads.php │ │ ├── rcube_user.php │ │ ├── rcube_utils.php │ │ ├── rcube_vcard.php │ │ ├── rcube_washtml.php │ │ ├── session │ │ ├── db.php │ │ ├── memcache.php │ │ ├── memcached.php │ │ ├── php.php │ │ └── redis.php │ │ └── spellchecker │ │ ├── atd.php │ │ ├── enchant.php │ │ ├── engine.php │ │ ├── googie.php │ │ └── pspell.php ├── localization │ ├── ar │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── ar_SA │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── ast │ │ ├── labels.inc │ │ └── messages.inc │ ├── az_AZ │ │ ├── labels.inc │ │ └── messages.inc │ ├── be_BE │ │ ├── labels.inc │ │ └── messages.inc │ ├── ber │ │ └── labels.inc │ ├── bg_BG │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── bn_BD │ │ ├── labels.inc │ │ └── messages.inc │ ├── br │ │ ├── labels.inc │ │ └── messages.inc │ ├── bs_BA │ │ ├── labels.inc │ │ └── messages.inc │ ├── ca_ES │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── cs_CZ │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── cy_GB │ │ ├── labels.inc │ │ └── messages.inc │ ├── da_DK │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── de_CH │ │ ├── csv2vcard.inc │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── de_DE │ │ ├── csv2vcard.inc │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── el_GR │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── en_CA │ │ ├── labels.inc │ │ └── messages.inc │ ├── en_GB │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── en_US │ │ ├── csv2vcard.inc │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── eo │ │ ├── labels.inc │ │ └── messages.inc │ ├── es_419 │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── es_AR │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── es_ES │ │ ├── csv2vcard.inc │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── et_EE │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── eu_ES │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── fa_AF │ │ ├── labels.inc │ │ └── messages.inc │ ├── fa_IR │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── fi_FI │ │ ├── csv2vcard.inc │ │ ├── labels.inc │ │ └── messages.inc │ ├── fo_FO │ │ ├── labels.inc │ │ └── messages.inc │ ├── fr_FR │ │ ├── csv2vcard.inc │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── fy_NL │ │ ├── labels.inc │ │ └── messages.inc │ ├── ga_IE │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── gl_ES │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── he_IL │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── hi_IN │ │ ├── labels.inc │ │ └── messages.inc │ ├── hr_HR │ │ ├── labels.inc │ │ └── messages.inc │ ├── hu_HU │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── hy_AM │ │ ├── labels.inc │ │ └── messages.inc │ ├── ia │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── id_ID │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── index.inc │ ├── is_IS │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── it_IT │ │ ├── csv2vcard.inc │ │ ├── labels.inc │ │ └── messages.inc │ ├── ja_JP │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── ka_GE │ │ ├── labels.inc │ │ └── messages.inc │ ├── kab │ │ ├── labels.inc │ │ └── messages.inc │ ├── km_KH │ │ ├── labels.inc │ │ └── messages.inc │ ├── kn_IN │ │ ├── labels.inc │ │ └── messages.inc │ ├── ko_KR │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── ku │ │ ├── labels.inc │ │ └── messages.inc │ ├── ku_IQ │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── lb_LU │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── lt_LT │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── lv_LV │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── mk_MK │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── ml_IN │ │ ├── labels.inc │ │ └── messages.inc │ ├── mn_MN │ │ ├── labels.inc │ │ └── messages.inc │ ├── mr_IN │ │ ├── labels.inc │ │ └── messages.inc │ ├── ms_MY │ │ ├── labels.inc │ │ └── messages.inc │ ├── nb_NO │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── ne_NP │ │ ├── labels.inc │ │ └── messages.inc │ ├── nl_BE │ │ ├── labels.inc │ │ └── messages.inc │ ├── nl_NL │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── nn_NO │ │ ├── labels.inc │ │ └── messages.inc │ ├── pl_PL │ │ ├── csv2vcard.inc │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── ps │ │ ├── labels.inc │ │ └── messages.inc │ ├── pt_BR │ │ ├── csv2vcard.inc │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── pt_PT │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── ro_RO │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── ru_RU │ │ ├── csv2vcard.inc │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── si_LK │ │ ├── labels.inc │ │ └── messages.inc │ ├── sk_SK │ │ ├── csv2vcard.inc │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── sl_SI │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── sq_AL │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── sr_CS │ │ ├── labels.inc │ │ └── messages.inc │ ├── sv_SE │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── ta_IN │ │ ├── labels.inc │ │ └── messages.inc │ ├── th_TH │ │ ├── labels.inc │ │ └── messages.inc │ ├── ti │ │ ├── labels.inc │ │ └── messages.inc │ ├── tr_TR │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── tzl │ │ ├── labels.inc │ │ └── messages.inc │ ├── ug │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── uk_UA │ │ ├── labels.inc │ │ └── messages.inc │ ├── ur_PK │ │ └── labels.inc │ ├── uz │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc │ ├── vi_VN │ │ ├── labels.inc │ │ └── messages.inc │ ├── zh_CN │ │ ├── labels.inc │ │ └── messages.inc │ └── zh_TW │ │ ├── csv2vcard.inc │ │ ├── labels.inc │ │ ├── messages.inc │ │ └── timezones.inc └── resources │ ├── blank.gif │ ├── blank.tiff │ ├── blank.webp │ ├── blocked.gif │ ├── dummy.pdf │ ├── error.html │ └── tinymce │ ├── browser.css │ ├── content.css │ └── video.png ├── public_html ├── .htaccess ├── index.php ├── installer.php └── static.php ├── skins └── elastic │ ├── .gitignore │ ├── Makefile │ ├── README.md │ ├── fonts │ ├── fa-regular-400.woff │ ├── fa-regular-400.woff2 │ ├── fa-solid-900.woff │ ├── fa-solid-900.woff2 │ ├── roboto-v29-italic-700.woff │ ├── roboto-v29-italic-700.woff2 │ ├── roboto-v29-italic.woff │ ├── roboto-v29-italic.woff2 │ ├── roboto-v29-regular-700.woff │ ├── roboto-v29-regular-700.woff2 │ ├── roboto-v29-regular.woff │ └── roboto-v29-regular.woff2 │ ├── images │ ├── contactgroup.svg │ ├── contactpic.svg │ ├── corner-handle.svg │ ├── download.svg │ ├── favicon.ico │ ├── google-icon.svg │ ├── logo.svg │ └── microsoft-icon.svg │ ├── meta.json │ ├── styles │ ├── colors.less │ ├── dark.less │ ├── embed.less │ ├── fontawesome.less │ ├── global.less │ ├── layout.less │ ├── mixins.less │ ├── print.less │ ├── styles.less │ ├── variables.less │ └── widgets │ │ ├── buttons.less │ │ ├── common.less │ │ ├── dialogs.less │ │ ├── editor.less │ │ ├── forms.less │ │ ├── jqueryui.less │ │ ├── lists.less │ │ ├── menu.less │ │ └── messages.less │ ├── templates │ ├── about.html │ ├── addressbook.html │ ├── bounce.html │ ├── compose.html │ ├── contact.html │ ├── contactedit.html │ ├── contactimport.html │ ├── contactprint.html │ ├── contactsearch.html │ ├── dialog.html │ ├── error.html │ ├── folderedit.html │ ├── folders.html │ ├── identities.html │ ├── identityedit.html │ ├── includes │ │ ├── footer.html │ │ ├── layout.html │ │ ├── mail-menu.html │ │ ├── menu.html │ │ ├── pagenav.html │ │ └── settings-menu.html │ ├── login.html │ ├── mail.html │ ├── message.html │ ├── messagepart.html │ ├── messageprint.html │ ├── plugin.html │ ├── responseedit.html │ ├── responses.html │ ├── settings.html │ └── settingsedit.html │ ├── thumbnail.png │ ├── ui.js │ └── watermark.html ├── temp └── .htaccess └── tests ├── .gitattributes ├── ActionTestCase.php ├── Actions ├── Contacts │ ├── CopyTest.php │ ├── DeleteTest.php │ ├── EditTest.php │ ├── ExportTest.php │ ├── Group_AddmembersTest.php │ ├── Group_CreateTest.php │ ├── Group_DeleteTest.php │ ├── Group_DelmembersTest.php │ ├── Group_RenameTest.php │ ├── ImportTest.php │ ├── IndexTest.php │ ├── ListTest.php │ ├── MailtoTest.php │ ├── MoveTest.php │ ├── PhotoTest.php │ ├── PrintTest.php │ ├── QrcodeTest.php │ ├── SaveTest.php │ ├── SearchTest.php │ ├── Search_CreateTest.php │ ├── Search_DeleteTest.php │ ├── ShowTest.php │ ├── UndoTest.php │ └── Upload_PhotoTest.php ├── Login │ └── OauthTest.php ├── Mail │ ├── AddcontactTest.php │ ├── AttachmentDeleteTest.php │ ├── AttachmentDisplayTest.php │ ├── AttachmentRenameTest.php │ ├── AttachmentUploadTest.php │ ├── AutocompleteTest.php │ ├── BounceTest.php │ ├── CheckRecentTest.php │ ├── ComposeTest.php │ ├── CopyTest.php │ ├── DeleteTest.php │ ├── FolderExpungeTest.php │ ├── FolderPurgeTest.php │ ├── GetTest.php │ ├── GetunreadTest.php │ ├── GroupExpandTest.php │ ├── HeadersTest.php │ ├── ImportTest.php │ ├── IndexTest.php │ ├── ListContactsTest.php │ ├── ListTest.php │ ├── MarkTest.php │ ├── MoveTest.php │ ├── PagenavTest.php │ ├── SearchContactsTest.php │ ├── SearchTest.php │ ├── SendTest.php │ ├── SendmdnTest.php │ ├── ShowTest.php │ └── ViewsourceTest.php ├── Settings │ ├── AboutTest.php │ ├── FolderCreateTest.php │ ├── FolderDeleteTest.php │ ├── FolderEditTest.php │ ├── FolderPurgeTest.php │ ├── FolderRenameTest.php │ ├── FolderSaveTest.php │ ├── FolderSizeTest.php │ ├── FolderSubscribeTest.php │ ├── FolderUnsubscribeTest.php │ ├── FoldersTest.php │ ├── IdentitiesTest.php │ ├── IdentityCreateTest.php │ ├── IdentityDeleteTest.php │ ├── IdentityEditTest.php │ ├── IdentitySaveTest.php │ ├── IndexTest.php │ ├── PrefsEditTest.php │ ├── PrefsSaveTest.php │ ├── ResponseCreateTest.php │ ├── ResponseDeleteTest.php │ ├── ResponseEditTest.php │ ├── ResponseGetTest.php │ ├── ResponseSaveTest.php │ ├── ResponsesTest.php │ ├── UploadDisplayTest.php │ └── UploadTest.php └── Utils │ ├── ErrorTest.php │ ├── Html2textTest.php │ ├── KillcacheTest.php │ ├── ModcssTest.php │ ├── SavePrefTest.php │ ├── SpellHtmlTest.php │ ├── SpellTest.php │ └── Text2htmlTest.php ├── Browser ├── Browser.php ├── Components │ ├── App.php │ ├── Dialog.php │ ├── HtmlEditor.php │ ├── Popupmenu.php │ ├── RecipientInput.php │ ├── Taskmenu.php │ └── Toolbarmenu.php ├── Contacts │ ├── ContactsTest.php │ ├── ExportTest.php │ ├── GroupsTest.php │ ├── ImportTest.php │ └── PrintTest.php ├── Logon │ ├── LoginTest.php │ └── LogoutTest.php ├── Mail │ ├── ComposeTest.php │ ├── GetunreadTest.php │ ├── ListTest.php │ ├── MailTest.php │ ├── OpenTest.php │ ├── PreviewTest.php │ └── PrintTest.php ├── README.md ├── Settings │ ├── AboutTest.php │ ├── FoldersTest.php │ ├── IdentitiesTest.php │ ├── Preferences │ │ ├── GeneralTest.php │ │ └── ServerTest.php │ ├── PreferencesTest.php │ ├── ResponsesTest.php │ └── SettingsTest.php ├── TestCase.php ├── bootstrap.php ├── data │ ├── contacts.vcf │ ├── data.sql │ └── mail │ │ ├── list_00.eml │ │ └── list_01.eml ├── downloads │ └── .keep ├── install.php └── phpunit.xml ├── ExitException.php ├── Framework ├── AddressbookTest.php ├── AddressesTest.php ├── BaseReplacerTest.php ├── BootstrapTest.php ├── BrowserTest.php ├── CacheDBTest.php ├── CacheTest.php ├── CharsetTest.php ├── ConfigTest.php ├── ContactsTest.php ├── ContentFilterTest.php ├── Csv2vcardTest.php ├── DBMysqlTest.php ├── DBPgsqlTest.php ├── DBSqliteTest.php ├── DBTest.php ├── EnrichedTest.php ├── Html2textTest.php ├── HtmlCheckboxTest.php ├── HtmlTest.php ├── ImageTest.php ├── ImapCacheTest.php ├── ImapGenericTest.php ├── ImapSearchTest.php ├── ImapTest.php ├── LdapGenericTest.php ├── LdapTest.php ├── MessageHeaderTest.php ├── MessagePartTest.php ├── MessageTest.php ├── MimeDecodeTest.php ├── MimeTest.php ├── OutputTest.php ├── PluginApiTest.php ├── RcubeTest.php ├── ResultIndexTest.php ├── ResultMultifolderTest.php ├── ResultSetTest.php ├── ResultThreadTest.php ├── SessionTest.php ├── SmtpTest.php ├── SpellcheckerAtdTest.php ├── SpellcheckerEnchantTest.php ├── SpellcheckerGoogieTest.php ├── SpellcheckerPspellTest.php ├── SpellcheckerTest.php ├── SpoofcheckerTest.php ├── StringReplacerTest.php ├── Text2HtmlTest.php ├── TnefDecoderTest.php ├── UserTest.php ├── UtilsTest.php ├── VCardTest.php └── WashtmlTest.php ├── HttpClientMock.php ├── MessageRendering ├── .gitignore ├── BasicMessagesTest.php ├── InlineImageTest.php ├── MessageRenderingTestCase.php ├── MessageRfc822Test.php ├── SingleAttachedImageNoTextTest.php ├── TnefEmailsTest.php ├── bootstrap.php ├── data │ └── greenmail │ │ └── test-message-rendering@localhost │ │ └── INBOX │ │ ├── attached-image-with-content-id-in-multipart-alternative.eml │ │ ├── attached-image-with-content-id.eml │ │ ├── attachment-gh9443.eml │ │ ├── filename.eml │ │ ├── fwd_lines.eml │ │ ├── list_00.eml │ │ ├── list_01.eml │ │ ├── spam-with-image-data-uri.eml │ │ ├── tnef1.eml │ │ ├── tnef2.eml │ │ └── tnef3.eml └── phpunit.xml ├── OutputHtmlMock.php ├── OutputJsonMock.php ├── Public ├── InstallerTest.php └── StaticTest.php ├── Rcmail ├── ActionTest.php ├── AttachmentHandlerTest.php ├── HtmlPageTest.php ├── InstallTest.php ├── OauthTest.php ├── OutputCliTest.php ├── OutputHtmlTest.php ├── OutputJsonTest.php ├── RcmailTest.php ├── ResendMailTest.php ├── SendmailTest.php ├── StringReplacerTest.php └── UtilsTest.php ├── ServerTestCase.php ├── StderrMock.php ├── StorageMock.php ├── bootstrap.php ├── phpunit.xml └── src ├── BID-26800.txt ├── Csv2vcard ├── email.csv ├── email.vcf ├── gmail.csv ├── gmail.vcf ├── outlook.csv ├── outlook.vcf ├── tb_plain.csv └── tb_plain.vcf ├── apple.vcf ├── body.tnef ├── filename.eml ├── format-flowed-unfolded.txt ├── format-flowed.txt ├── html.msg ├── htmlbase.txt ├── htmlbody.txt ├── htmlcom.txt ├── htmlxss.txt ├── imap_thread.txt ├── import.mbox ├── invalidchars.html ├── johndoe.vcf ├── mail0.eml ├── mailto.txt ├── media.css ├── one-file.tnef ├── photo.vcf ├── plainbody.txt ├── sample.rtf ├── sql ├── contacts.sql ├── identities.sql ├── init.sql ├── responses.sql └── searches.sql ├── test.base64 ├── test.pdf ├── test.uuencode ├── thebat.vcf ├── utf-16_sample.vcf └── valid.css /.ci/docker-images/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | case "$1" in 4 | 8.1|8.3) 5 | phpversion="$1" 6 | ;; 7 | *) 8 | echo "Error: first and only argument must be the wanted PHP version." 9 | echo "Usage: $(basename $0) 8.1|8.3" 10 | exit 1 11 | ;; 12 | esac 13 | 14 | exec docker build --build-arg "PHPVERSION=$phpversion" -f "$(realpath $(dirname $0)/Dockerfile)" -t "ghcr.io/pabzm/roundcubemail-testrunner:php$phpversion" "$(realpath $(dirname $0)/../../..)" 15 | -------------------------------------------------------------------------------- /.ci/run_test_message_rendering.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -ex 2 | 3 | if ! test -f config/config-test.inc.php; then 4 | cp -v .ci/config-test.inc.php config/config-test.inc.php 5 | fi 6 | 7 | # Install dependencies, prefer highest. 8 | composer update --prefer-dist --no-interaction --no-progress 9 | 10 | # Execute tests. 11 | vendor/bin/phpunit -c ./tests/MessageRendering/phpunit.xml --fail-on-warning --fail-on-risky 12 | -------------------------------------------------------------------------------- /.ci/run_tests.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -ex 2 | 3 | if ! test -f config/config-test.inc.php; then 4 | cp -v .ci/config-test.inc.php config/config-test.inc.php 5 | fi 6 | 7 | composer require "kolab/net_ldap3:~1.1.4" --no-update 8 | 9 | # Install dependencies, prefer highest. 10 | composer update --prefer-dist --no-interaction --no-progress 11 | 12 | # Execute tests. 13 | vendor/bin/phpunit -c tests/phpunit.xml --fail-on-warning --fail-on-risky 14 | 15 | # Downgrade dependencies to the lowest versions. 16 | composer update --prefer-dist --prefer-stable --prefer-lowest --no-interaction --no-progress --optimize-autoloader 17 | 18 | # Execute tests again. 19 | vendor/bin/phpunit -c tests/phpunit.xml --fail-on-warning --fail-on-risky 20 | -------------------------------------------------------------------------------- /.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 | [*.{json, php, sh, js}] 10 | charset = utf-8 11 | indent_style = space 12 | indent_size = 4 13 | trim_trailing_whitespace = true 14 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | contact_links: 2 | - name: Ask for help 3 | url: https://www.roundcubeforum.net/ 4 | about: Ask and discuss questions with other Roundcube community members. 5 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "github-actions" 4 | directory: "/" 5 | schedule: 6 | interval: "weekly" 7 | - package-ecosystem: "composer" 8 | directory: "/" 9 | schedule: 10 | interval: "weekly" 11 | versioning-strategy: "widen" 12 | - package-ecosystem: "npm" 13 | directory: "/" 14 | schedule: 15 | interval: "weekly" 16 | versioning-strategy: "widen" 17 | -------------------------------------------------------------------------------- /.github/workflows/bot-create-manual-reminder.yml: -------------------------------------------------------------------------------- 1 | name: 'Create reminder from comment' 2 | 3 | permissions: 4 | issues: write 5 | pull-requests: write 6 | 7 | on: 8 | issue_comment: 9 | types: [created, edited] 10 | 11 | jobs: 12 | reminder: 13 | if: github.repository == 'roundcube/roundcubemail' 14 | runs-on: ubuntu-latest 15 | 16 | steps: 17 | - name: 👀 check for reminder 18 | uses: agrc/create-reminder-action@9ff30cde74284045941af16a04362938957253b1 # v1.1.17 19 | -------------------------------------------------------------------------------- /.github/workflows/bot-manual-reminder.yml: -------------------------------------------------------------------------------- 1 | name: 'Notify manually requested reminders' 2 | 3 | on: 4 | schedule: 5 | - cron: '0 * * * *' 6 | 7 | permissions: 8 | issues: write 9 | pull-requests: write 10 | 11 | jobs: 12 | reminder: 13 | if: github.repository == 'roundcube/roundcubemail' 14 | runs-on: ubuntu-latest 15 | 16 | steps: 17 | - name: check reminders and notify 18 | uses: agrc/reminder-action@96f2ec2e1a7a53ead156504922e9bc36d64f49ee # v1.0.16 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # ignore files added to these directories 2 | logs/* 3 | temp/* 4 | config/* 5 | plugins/*/config.inc.php 6 | 7 | # this is for the sample plugin (via composer) 8 | plugins/rcsample 9 | plugins/plugin_manager 10 | 11 | # composer-related 12 | composer.phar 13 | composer.lock 14 | vendor 15 | 16 | # javascript dependencies 17 | plugins/enigma/openpgp.min.js 18 | plugins/managesieve/codemirror/ 19 | program/js/jquery.min.js 20 | program/js/jstz.min.js 21 | program/js/publickey.js 22 | program/js/tinymce/ 23 | 24 | # eslint dependencies 25 | /node_modules 26 | /package.json 27 | /package-lock.json 28 | 29 | # skin customization files 30 | skins/elastic/styles/_styles.less 31 | skins/elastic/styles/_variables.less 32 | 33 | # ignore IDE files 34 | .vscode 35 | .DS_Store 36 | .idea 37 | 38 | # Ignore files used for local overriding. 39 | /tests/MessageRendering/.env 40 | -------------------------------------------------------------------------------- /SQL/mysql/2008030300.sql: -------------------------------------------------------------------------------- 1 | -- Updates from version 0.1-stable 2 | 3 | TRUNCATE TABLE `messages`; 4 | 5 | ALTER TABLE `messages` 6 | DROP INDEX `idx`, 7 | DROP INDEX `uid`; 8 | 9 | ALTER TABLE `cache` 10 | DROP INDEX `cache_key`, 11 | DROP INDEX `session_id`, 12 | ADD INDEX `user_cache_index` (`user_id`,`cache_key`); 13 | 14 | ALTER TABLE `users` 15 | ADD INDEX `username_index` (`username`), 16 | ADD INDEX `alias_index` (`alias`); 17 | -------------------------------------------------------------------------------- /SQL/mysql/2008040500.sql: -------------------------------------------------------------------------------- 1 | -- Updates from version 0.1.1 2 | 3 | ALTER TABLE `identities` 4 | MODIFY `signature` text, 5 | MODIFY `bcc` varchar(128) NOT NULL DEFAULT '', 6 | MODIFY `reply-to` varchar(128) NOT NULL DEFAULT '', 7 | MODIFY `organization` varchar(128) NOT NULL DEFAULT '', 8 | MODIFY `name` varchar(128) NOT NULL, 9 | MODIFY `email` varchar(128) NOT NULL; 10 | -------------------------------------------------------------------------------- /SQL/mysql/2008060900.sql: -------------------------------------------------------------------------------- 1 | -- Updates from version 0.2-alpha 2 | 3 | ALTER TABLE `messages` 4 | ADD INDEX `created_index` (`created`); 5 | -------------------------------------------------------------------------------- /SQL/mysql/2008092100.sql: -------------------------------------------------------------------------------- 1 | -- Updates from version 0.2-beta (InnoDB required) 2 | 3 | ALTER TABLE `cache` 4 | DROP `session_id`; 5 | 6 | ALTER TABLE `session` 7 | ADD INDEX `changed_index` (`changed`); 8 | 9 | ALTER TABLE `cache` 10 | ADD INDEX `created_index` (`created`); 11 | 12 | ALTER TABLE `users` 13 | CHANGE `language` `language` varchar(5); 14 | 15 | ALTER TABLE `cache` ENGINE=InnoDB; 16 | ALTER TABLE `session` ENGINE=InnoDB; 17 | ALTER TABLE `messages` ENGINE=InnoDB; 18 | ALTER TABLE `users` ENGINE=InnoDB; 19 | ALTER TABLE `contacts` ENGINE=InnoDB; 20 | ALTER TABLE `identities` ENGINE=InnoDB; 21 | -------------------------------------------------------------------------------- /SQL/mysql/2009090400.sql: -------------------------------------------------------------------------------- 1 | -- Updates from version 0.3-stable 2 | 3 | TRUNCATE `messages`; 4 | 5 | ALTER TABLE `messages` 6 | ADD INDEX `index_index` (`user_id`, `cache_key`, `idx`); 7 | 8 | ALTER TABLE `session` 9 | CHANGE `vars` `vars` MEDIUMTEXT NOT NULL; 10 | 11 | ALTER TABLE `contacts` 12 | ADD INDEX `user_contacts_index` (`user_id`,`email`); 13 | -------------------------------------------------------------------------------- /SQL/mysql/2010042300.sql: -------------------------------------------------------------------------------- 1 | -- Updates from version 0.4-beta 2 | 3 | ALTER TABLE `users` CHANGE `last_login` `last_login` datetime DEFAULT NULL; 4 | UPDATE `users` SET `last_login` = NULL WHERE `last_login` = '1000-01-01 00:00:00'; 5 | -------------------------------------------------------------------------------- /SQL/mysql/2010100600.sql: -------------------------------------------------------------------------------- 1 | -- Updates from version 0.4.2 2 | 3 | ALTER TABLE `users` DROP INDEX `username_index`; 4 | ALTER TABLE `users` ADD UNIQUE `username` (`username`, `mail_host`); 5 | 6 | ALTER TABLE `contacts` MODIFY `email` varchar(255) NOT NULL; 7 | 8 | TRUNCATE TABLE `messages`; 9 | -------------------------------------------------------------------------------- /SQL/mysql/2011011200.sql: -------------------------------------------------------------------------------- 1 | -- Updates from version 0.5.x 2 | 3 | ALTER TABLE `contacts` ADD `words` TEXT NULL AFTER `vcard`; 4 | ALTER TABLE `contacts` CHANGE `vcard` `vcard` LONGTEXT /*!40101 CHARACTER SET utf8 */ NULL DEFAULT NULL; 5 | ALTER TABLE `contactgroupmembers` ADD INDEX `contactgroupmembers_contact_index` (`contact_id`); 6 | 7 | TRUNCATE TABLE `messages`; 8 | TRUNCATE TABLE `cache`; 9 | -------------------------------------------------------------------------------- /SQL/mysql/2011111600.sql: -------------------------------------------------------------------------------- 1 | -- Updates from version 0.7-beta 2 | 3 | ALTER TABLE `session` CHANGE `sess_id` `sess_id` varchar(128) NOT NULL; 4 | -------------------------------------------------------------------------------- /SQL/mysql/2012080700.sql: -------------------------------------------------------------------------------- 1 | -- Updates from version 0.8 2 | 3 | ALTER TABLE `cache` DROP COLUMN `cache_id`; 4 | ALTER TABLE `users` DROP COLUMN `alias`; 5 | ALTER TABLE `identities` ADD INDEX `email_identities_index` (`email`, `del`); 6 | -------------------------------------------------------------------------------- /SQL/mysql/2013011000.sql: -------------------------------------------------------------------------------- 1 | -- Upgrade from 0.9-beta 2 | 3 | CREATE TABLE IF NOT EXISTS `system` ( 4 | `name` varchar(64) NOT NULL, 5 | `value` mediumtext, 6 | PRIMARY KEY(`name`) 7 | ) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */; 8 | -------------------------------------------------------------------------------- /SQL/mysql/2013042700.sql: -------------------------------------------------------------------------------- 1 | -- empty -------------------------------------------------------------------------------- /SQL/mysql/2013052500.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `cache_shared` ( 2 | `cache_key` varchar(255) /*!40101 CHARACTER SET ascii COLLATE ascii_general_ci */ NOT NULL, 3 | `created` datetime NOT NULL DEFAULT '1000-01-01 00:00:00', 4 | `data` longtext NOT NULL, 5 | INDEX `created_index` (`created`), 6 | INDEX `cache_key_index` (`cache_key`) 7 | ) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */; 8 | -------------------------------------------------------------------------------- /SQL/mysql/2014042900.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE `users` CHANGE `preferences` `preferences` longtext; 2 | -------------------------------------------------------------------------------- /SQL/mysql/2015030800.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE `identities` CHANGE `signature` `signature` longtext; 2 | -------------------------------------------------------------------------------- /SQL/mysql/2015111100.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE `users` 2 | ADD `failed_login` datetime DEFAULT NULL, 3 | ADD `failed_login_counter` int(10) UNSIGNED DEFAULT NULL; 4 | -------------------------------------------------------------------------------- /SQL/mysql/2016081200.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE `session` DROP COLUMN `created`; 2 | -------------------------------------------------------------------------------- /SQL/mysql/2016100900.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE `session` MODIFY `ip` varchar(40) NOT NULL; 2 | -------------------------------------------------------------------------------- /SQL/mysql/2018021600.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `filestore` ( 2 | `file_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, 3 | `user_id` int(10) UNSIGNED NOT NULL, 4 | `filename` varchar(128) NOT NULL, 5 | `mtime` int(10) NOT NULL, 6 | `data` longtext NOT NULL, 7 | PRIMARY KEY (`file_id`), 8 | CONSTRAINT `user_id_fk_filestore` FOREIGN KEY (`user_id`) 9 | REFERENCES `users` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE, 10 | UNIQUE `uniqueness` (`user_id`, `filename`) 11 | ) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */; 12 | -------------------------------------------------------------------------------- /SQL/mysql/2018122300.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE `filestore` ADD COLUMN `context` varchar(32) NOT NULL; 2 | UPDATE `filestore` SET `context` = 'enigma'; 3 | ALTER TABLE `filestore` DROP FOREIGN KEY `user_id_fk_filestore`; 4 | ALTER TABLE `filestore` DROP INDEX `uniqueness`; 5 | ALTER TABLE `filestore` ADD UNIQUE INDEX `uniqueness` (`user_id`, `context`, `filename`); 6 | ALTER TABLE `filestore` ADD CONSTRAINT `user_id_fk_filestore` FOREIGN KEY (`user_id`) 7 | REFERENCES `users` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE; 8 | -------------------------------------------------------------------------------- /SQL/mysql/2019092900.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE `cache` CHANGE `cache_key` `cache_key` varchar(128) BINARY NOT NULL; 2 | ALTER TABLE `cache_shared` CHANGE `cache_key` `cache_key` varchar(255) BINARY NOT NULL; 3 | -------------------------------------------------------------------------------- /SQL/mysql/2020020100.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE `users` MODIFY `language` varchar(16); 2 | ALTER TABLE `dictionary` MODIFY `language` varchar(16) NOT NULL; 3 | -------------------------------------------------------------------------------- /SQL/mysql/2020091000.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `collected_addresses` ( 2 | `address_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, 3 | `changed` datetime NOT NULL DEFAULT '1000-01-01 00:00:00', 4 | `name` varchar(255) NOT NULL DEFAULT '', 5 | `email` varchar(255) NOT NULL, 6 | `user_id` int(10) UNSIGNED NOT NULL, 7 | `type` int(10) UNSIGNED NOT NULL, 8 | PRIMARY KEY(`address_id`), 9 | CONSTRAINT `user_id_fk_collected_addresses` FOREIGN KEY (`user_id`) 10 | REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE, 11 | UNIQUE INDEX `user_email_collected_addresses_index` (`user_id`, `type`, `email`) 12 | ) ROW_FORMAT=DYNAMIC ENGINE=INNODB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 13 | -------------------------------------------------------------------------------- /SQL/mysql/2020122900.sql: -------------------------------------------------------------------------------- 1 | -- empty 2 | -------------------------------------------------------------------------------- /SQL/mysql/2021081000.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `responses` ( 2 | `response_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, 3 | `user_id` int(10) UNSIGNED NOT NULL, 4 | `name` varchar(255) NOT NULL, 5 | `data` longtext NOT NULL, 6 | `is_html` tinyint(1) NOT NULL DEFAULT '0', 7 | `changed` datetime NOT NULL DEFAULT '1000-01-01 00:00:00', 8 | `del` tinyint(1) NOT NULL DEFAULT '0', 9 | PRIMARY KEY (`response_id`), 10 | CONSTRAINT `user_id_fk_responses` FOREIGN KEY (`user_id`) 11 | REFERENCES `users` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE, 12 | INDEX `user_responses_index` (`user_id`, `del`) 13 | ) ROW_FORMAT=DYNAMIC ENGINE=INNODB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 14 | -------------------------------------------------------------------------------- /SQL/mysql/2021100300.sql: -------------------------------------------------------------------------------- 1 | -- SQLite only -------------------------------------------------------------------------------- /SQL/mysql/2022081200.sql: -------------------------------------------------------------------------------- 1 | -- SQLite/Postgres only -------------------------------------------------------------------------------- /SQL/mysql/2022100100.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `uploads` ( 2 | `upload_id` varchar(64) NOT NULL, 3 | `session_id` varchar(128) NOT NULL, 4 | `group` varchar(128) NOT NULL, 5 | `metadata` mediumtext NOT NULL, 6 | `created` datetime NOT NULL DEFAULT '1000-01-01 00:00:00', 7 | PRIMARY KEY (`upload_id`), 8 | INDEX `uploads_session_group_index` (`session_id`, `group`, `created`) 9 | ) ROW_FORMAT=DYNAMIC ENGINE=INNODB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 10 | -------------------------------------------------------------------------------- /SQL/postgres/2008060900.sql: -------------------------------------------------------------------------------- 1 | -- Updates from version 0.2-alpha 2 | 3 | CREATE INDEX messages_created_idx ON messages (created); 4 | -------------------------------------------------------------------------------- /SQL/postgres/2008092100.sql: -------------------------------------------------------------------------------- 1 | -- Updates from version 0.2-beta 2 | 3 | ALTER TABLE cache DROP session_id; 4 | 5 | CREATE INDEX session_changed_idx ON session (changed); 6 | CREATE INDEX cache_created_idx ON "cache" (created); 7 | 8 | ALTER TABLE users ALTER "language" DROP NOT NULL; 9 | ALTER TABLE users ALTER "language" DROP DEFAULT; 10 | 11 | ALTER TABLE identities ALTER del TYPE smallint; 12 | ALTER TABLE identities ALTER standard TYPE smallint; 13 | ALTER TABLE contacts ALTER del TYPE smallint; 14 | ALTER TABLE messages ALTER del TYPE smallint; 15 | -------------------------------------------------------------------------------- /SQL/postgres/2009090400.sql: -------------------------------------------------------------------------------- 1 | -- Updates from version 0.3-stable 2 | 3 | TRUNCATE messages; 4 | CREATE INDEX messages_index_idx ON messages (user_id, cache_key, idx); 5 | DROP INDEX contacts_user_id_idx; 6 | CREATE INDEX contacts_user_id_idx ON contacts (user_id, email); 7 | -------------------------------------------------------------------------------- /SQL/postgres/2010042300.sql: -------------------------------------------------------------------------------- 1 | -- Updates from version 0.4-beta 2 | 3 | ALTER TABLE users ALTER last_login DROP NOT NULL; 4 | ALTER TABLE users ALTER last_login SET DEFAULT NULL; 5 | -------------------------------------------------------------------------------- /SQL/postgres/2010100600.sql: -------------------------------------------------------------------------------- 1 | -- Updates from version 0.4.2 2 | 3 | DROP INDEX users_username_id_idx; 4 | ALTER TABLE users ADD CONSTRAINT users_username_key UNIQUE (username, mail_host); 5 | ALTER TABLE contacts ALTER email TYPE varchar(255); 6 | 7 | TRUNCATE messages; 8 | -------------------------------------------------------------------------------- /SQL/postgres/2011011200.sql: -------------------------------------------------------------------------------- 1 | -- Updates from version 0.5.x 2 | 3 | ALTER TABLE contacts ADD words TEXT NULL; 4 | CREATE INDEX contactgroupmembers_contact_id_idx ON contactgroupmembers (contact_id); 5 | 6 | TRUNCATE messages; 7 | TRUNCATE cache; 8 | -------------------------------------------------------------------------------- /SQL/postgres/2011111600.sql: -------------------------------------------------------------------------------- 1 | -- Updates from version 0.7-beta 2 | 3 | ALTER TABLE "session" ALTER sess_id TYPE varchar(128); 4 | -------------------------------------------------------------------------------- /SQL/postgres/2011121400.sql: -------------------------------------------------------------------------------- 1 | -- Updates from version 0.7 2 | 3 | DROP INDEX contacts_user_id_idx; 4 | CREATE INDEX contacts_user_id_idx ON contacts USING btree (user_id, del); 5 | ALTER TABLE contacts ALTER email TYPE text; 6 | -------------------------------------------------------------------------------- /SQL/postgres/2012080700.sql: -------------------------------------------------------------------------------- 1 | -- Updates from version 0.8 2 | 3 | ALTER TABLE cache DROP COLUMN cache_id; 4 | DROP SEQUENCE cache_ids; 5 | 6 | ALTER TABLE users DROP COLUMN alias; 7 | CREATE INDEX identities_email_idx ON identities (email, del); 8 | -------------------------------------------------------------------------------- /SQL/postgres/2013011000.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "system" ( 2 | name varchar(64) NOT NULL PRIMARY KEY, 3 | value text 4 | ); 5 | -------------------------------------------------------------------------------- /SQL/postgres/2013042700.sql: -------------------------------------------------------------------------------- 1 | ALTER SEQUENCE user_ids RENAME TO users_seq; 2 | ALTER TABLE users ALTER COLUMN user_id SET DEFAULT nextval('users_seq'::text); 3 | 4 | ALTER SEQUENCE identity_ids RENAME TO identities_seq; 5 | ALTER TABLE identities ALTER COLUMN identity_id SET DEFAULT nextval('identities_seq'::text); 6 | 7 | ALTER SEQUENCE contact_ids RENAME TO contacts_seq; 8 | ALTER TABLE contacts ALTER COLUMN contact_id SET DEFAULT nextval('contacts_seq'::text); 9 | 10 | ALTER SEQUENCE contactgroups_ids RENAME TO contactgroups_seq; 11 | ALTER TABLE contactgroups ALTER COLUMN contactgroup_id SET DEFAULT nextval('contactgroups_seq'::text); 12 | 13 | ALTER SEQUENCE search_ids RENAME TO searches_seq; 14 | ALTER TABLE searches ALTER COLUMN search_id SET DEFAULT nextval('searches_seq'::text); 15 | -------------------------------------------------------------------------------- /SQL/postgres/2013052500.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "cache_shared" ( 2 | cache_key varchar(255) NOT NULL, 3 | created timestamp with time zone DEFAULT now() NOT NULL, 4 | data text NOT NULL 5 | ); 6 | 7 | CREATE INDEX cache_shared_cache_key_idx ON "cache_shared" (cache_key); 8 | CREATE INDEX cache_shared_created_idx ON "cache_shared" (created); 9 | -------------------------------------------------------------------------------- /SQL/postgres/2014042900.sql: -------------------------------------------------------------------------------- 1 | -- empty -------------------------------------------------------------------------------- /SQL/postgres/2015030800.sql: -------------------------------------------------------------------------------- 1 | -- empty -------------------------------------------------------------------------------- /SQL/postgres/2015111100.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE "users" ADD failed_login timestamp with time zone DEFAULT NULL; 2 | ALTER TABLE "users" ADD failed_login_counter integer DEFAULT NULL; 3 | -------------------------------------------------------------------------------- /SQL/postgres/2016081200.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE "session" DROP COLUMN created; 2 | -------------------------------------------------------------------------------- /SQL/postgres/2016100900.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE session ALTER COLUMN ip TYPE character varying(41); 2 | -------------------------------------------------------------------------------- /SQL/postgres/2016112200.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE "cache"; 2 | DROP TABLE "cache_shared"; 3 | 4 | CREATE TABLE "cache" ( 5 | user_id integer NOT NULL 6 | REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE, 7 | cache_key varchar(128) DEFAULT '' NOT NULL, 8 | expires timestamp with time zone DEFAULT NULL, 9 | data text NOT NULL, 10 | PRIMARY KEY (user_id, cache_key) 11 | ); 12 | 13 | CREATE INDEX cache_expires_idx ON "cache" (expires); 14 | 15 | CREATE TABLE "cache_shared" ( 16 | cache_key varchar(255) NOT NULL PRIMARY KEY, 17 | expires timestamp with time zone DEFAULT NULL, 18 | data text NOT NULL 19 | ); 20 | 21 | CREATE INDEX cache_shared_expires_idx ON "cache_shared" (expires); 22 | -------------------------------------------------------------------------------- /SQL/postgres/2018021600.sql: -------------------------------------------------------------------------------- 1 | CREATE SEQUENCE "filestore_seq" 2 | INCREMENT BY 1 3 | NO MAXVALUE 4 | NO MINVALUE 5 | CACHE 1; 6 | 7 | CREATE TABLE "filestore" ( 8 | file_id integer DEFAULT nextval('filestore_seq'::text) PRIMARY KEY, 9 | user_id integer NOT NULL 10 | REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE, 11 | filename varchar(128) NOT NULL, 12 | mtime integer NOT NULL, 13 | data text NOT NULL, 14 | CONSTRAINT filestore_user_id_filename UNIQUE (user_id, filename) 15 | ); 16 | -------------------------------------------------------------------------------- /SQL/postgres/2018122300.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE "filestore" ADD COLUMN context varchar(32); 2 | UPDATE "filestore" SET context = 'enigma'; 3 | ALTER TABLE "filestore" ALTER COLUMN context SET NOT NULL; 4 | ALTER TABLE "filestore" DROP CONSTRAINT "filestore_user_id_filename"; 5 | ALTER TABLE "filestore" ADD CONSTRAINT "filestore_user_id_context_filename" UNIQUE (user_id, context, filename); 6 | -------------------------------------------------------------------------------- /SQL/postgres/2019092900.sql: -------------------------------------------------------------------------------- 1 | -- empty -------------------------------------------------------------------------------- /SQL/postgres/2020020100.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE "dictionary" ALTER COLUMN "language" TYPE varchar(16); 2 | ALTER TABLE "users" ALTER COLUMN "language" TYPE varchar(16); 3 | -------------------------------------------------------------------------------- /SQL/postgres/2020020101.sql: -------------------------------------------------------------------------------- 1 | -- empty -------------------------------------------------------------------------------- /SQL/postgres/2020091000.sql: -------------------------------------------------------------------------------- 1 | 2 | CREATE SEQUENCE collected_addresses_seq 3 | START WITH 1 4 | INCREMENT BY 1 5 | NO MAXVALUE 6 | NO MINVALUE 7 | CACHE 1; 8 | 9 | CREATE TABLE collected_addresses ( 10 | address_id integer DEFAULT nextval('collected_addresses_seq'::text) PRIMARY KEY, 11 | user_id integer NOT NULL 12 | REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE, 13 | changed timestamp with time zone DEFAULT now() NOT NULL, 14 | name varchar(255) DEFAULT '' NOT NULL, 15 | email varchar(255) NOT NULL, 16 | "type" integer NOT NULL 17 | ); 18 | 19 | CREATE UNIQUE INDEX collected_addresses_user_id_idx ON collected_addresses (user_id, "type", email); 20 | -------------------------------------------------------------------------------- /SQL/postgres/2020122900.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE "users" ALTER COLUMN "preferences" DROP NOT NULL; 2 | ALTER TABLE "users" ALTER COLUMN "preferences" SET DEFAULT NULL; 3 | -------------------------------------------------------------------------------- /SQL/postgres/2021081000.sql: -------------------------------------------------------------------------------- 1 | CREATE SEQUENCE responses_seq 2 | START WITH 1 3 | INCREMENT BY 1 4 | NO MAXVALUE 5 | NO MINVALUE 6 | CACHE 1; 7 | 8 | CREATE TABLE responses ( 9 | response_id integer DEFAULT nextval('responses_seq'::text) PRIMARY KEY, 10 | user_id integer NOT NULL 11 | REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE, 12 | changed timestamp with time zone DEFAULT now() NOT NULL, 13 | del smallint DEFAULT 0 NOT NULL, 14 | name varchar(255) NOT NULL, 15 | data text NOT NULL, 16 | is_html smallint DEFAULT 0 NOT NULL 17 | ); 18 | 19 | CREATE UNIQUE INDEX responses_user_id_idx ON responses (user_id, del); 20 | 21 | ALTER TABLE identities ALTER html_signature TYPE smallint; 22 | -------------------------------------------------------------------------------- /SQL/postgres/2021100300.sql: -------------------------------------------------------------------------------- 1 | -- SQLite only -------------------------------------------------------------------------------- /SQL/postgres/2022081200.sql: -------------------------------------------------------------------------------- 1 | DROP INDEX responses_user_id_idx; 2 | CREATE INDEX responses_user_id_idx ON responses (user_id, del); 3 | -------------------------------------------------------------------------------- /SQL/postgres/2022100100.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "uploads" ( 2 | upload_id varchar(64) PRIMARY KEY, 3 | session_id varchar(128) NOT NULL, 4 | "group" varchar(128) NOT NULL, 5 | metadata text NOT NULL, 6 | created timestamp with time zone DEFAULT now() NOT NULL 7 | ); 8 | 9 | CREATE INDEX uploads_session_id_idx ON uploads (session_id, "group", created); 10 | -------------------------------------------------------------------------------- /SQL/sqlite/2008060900.sql: -------------------------------------------------------------------------------- 1 | -- Updates from version 0.2-alpha 2 | 3 | CREATE INDEX ix_messages_created ON messages (created); 4 | -------------------------------------------------------------------------------- /SQL/sqlite/2008092100.sql: -------------------------------------------------------------------------------- 1 | -- Updates from version 0.2-beta 2 | 3 | CREATE INDEX ix_session_changed ON session (changed); 4 | CREATE INDEX ix_cache_created ON cache (created); 5 | -------------------------------------------------------------------------------- /SQL/sqlite/2009090400.sql: -------------------------------------------------------------------------------- 1 | -- Updates from version 0.3-stable 2 | 3 | DELETE FROM messages; 4 | DROP INDEX ix_messages_user_cache_uid; 5 | CREATE UNIQUE INDEX ix_messages_user_cache_uid ON messages (user_id,cache_key,uid); 6 | CREATE INDEX ix_messages_index ON messages (user_id,cache_key,idx); 7 | DROP INDEX ix_contacts_user_id; 8 | CREATE INDEX ix_contacts_user_id ON contacts(user_id, email); 9 | -------------------------------------------------------------------------------- /SQL/sqlite/2011111600.sql: -------------------------------------------------------------------------------- 1 | -- Updates from version 0.7-beta 2 | 3 | DROP TABLE session; 4 | CREATE TABLE session ( 5 | sess_id varchar(128) NOT NULL PRIMARY KEY, 6 | created datetime NOT NULL default '0000-00-00 00:00:00', 7 | changed datetime NOT NULL default '0000-00-00 00:00:00', 8 | ip varchar(40) NOT NULL default '', 9 | vars text NOT NULL 10 | ); 11 | CREATE INDEX ix_session_changed ON session (changed); 12 | -------------------------------------------------------------------------------- /SQL/sqlite/2013011000.sql: -------------------------------------------------------------------------------- 1 | -- Updates from version 0.9-beta 2 | 3 | CREATE TABLE IF NOT EXISTS system ( 4 | name varchar(64) NOT NULL PRIMARY KEY, 5 | value text NOT NULL 6 | ); 7 | -------------------------------------------------------------------------------- /SQL/sqlite/2013011700.sql: -------------------------------------------------------------------------------- 1 | -- drop temp table created in 2012080700.sql 2 | DROP TABLE IF EXISTS tmp_users; 3 | -------------------------------------------------------------------------------- /SQL/sqlite/2013042700.sql: -------------------------------------------------------------------------------- 1 | -- empty -------------------------------------------------------------------------------- /SQL/sqlite/2013052500.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE cache_shared ( 2 | cache_key varchar(255) NOT NULL, 3 | created datetime NOT NULL default '0000-00-00 00:00:00', 4 | data text NOT NULL 5 | ); 6 | 7 | CREATE INDEX ix_cache_shared_cache_key ON cache_shared(cache_key); 8 | CREATE INDEX ix_cache_shared_created ON cache_shared(created); 9 | -------------------------------------------------------------------------------- /SQL/sqlite/2014042900.sql: -------------------------------------------------------------------------------- 1 | -- empty -------------------------------------------------------------------------------- /SQL/sqlite/2015030800.sql: -------------------------------------------------------------------------------- 1 | -- empty -------------------------------------------------------------------------------- /SQL/sqlite/2016081200.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE session; 2 | CREATE TABLE session ( 3 | sess_id varchar(128) NOT NULL PRIMARY KEY, 4 | changed datetime NOT NULL default '0000-00-00 00:00:00', 5 | ip varchar(40) NOT NULL default '', 6 | vars text NOT NULL 7 | ); 8 | 9 | CREATE INDEX ix_session_changed ON session (changed); 10 | -------------------------------------------------------------------------------- /SQL/sqlite/2016100900.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roundcube/roundcubemail/6a0cec468ebf98eb1a96208d0f9cb76b72648dc9/SQL/sqlite/2016100900.sql -------------------------------------------------------------------------------- /SQL/sqlite/2016112200.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE cache; 2 | DROP TABLE cache_shared; 3 | 4 | CREATE TABLE cache ( 5 | user_id integer NOT NULL default 0, 6 | cache_key varchar(128) NOT NULL default '', 7 | expires datetime DEFAULT NULL, 8 | data text NOT NULL, 9 | PRIMARY KEY (user_id, cache_key) 10 | ); 11 | 12 | CREATE INDEX ix_cache_expires ON cache(expires); 13 | 14 | CREATE TABLE cache_shared ( 15 | cache_key varchar(255) NOT NULL, 16 | expires datetime DEFAULT NULL, 17 | data text NOT NULL, 18 | PRIMARY KEY (cache_key) 19 | ); 20 | 21 | CREATE INDEX ix_cache_shared_expires ON cache_shared(expires); 22 | -------------------------------------------------------------------------------- /SQL/sqlite/2018021600.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE filestore ( 2 | file_id integer PRIMARY KEY, 3 | user_id integer NOT NULL, 4 | filename varchar(128) NOT NULL, 5 | mtime integer NOT NULL, 6 | data text NOT NULL 7 | ); 8 | 9 | CREATE UNIQUE INDEX ix_filestore_user_id ON filestore(user_id, filename); 10 | -------------------------------------------------------------------------------- /SQL/sqlite/2019092900.sql: -------------------------------------------------------------------------------- 1 | -- empty -------------------------------------------------------------------------------- /SQL/sqlite/2020020101.sql: -------------------------------------------------------------------------------- 1 | -- empty -------------------------------------------------------------------------------- /SQL/sqlite/2020091000.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE collected_addresses ( 2 | address_id integer NOT NULL PRIMARY KEY, 3 | user_id integer NOT NULL, 4 | changed datetime NOT NULL default '0000-00-00 00:00:00', 5 | name varchar(255) NOT NULL default '', 6 | email varchar(255) NOT NULL, 7 | "type" integer NOT NULL 8 | ); 9 | 10 | CREATE UNIQUE INDEX ix_collected_addresses_user_id ON collected_addresses(user_id, "type", email); 11 | -------------------------------------------------------------------------------- /SQL/sqlite/2021081000.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE responses ( 2 | response_id integer NOT NULL PRIMARY KEY, 3 | user_id integer NOT NULL default '0', 4 | changed datetime NOT NULL default '0000-00-00 00:00:00', 5 | del tinyint NOT NULL default '0', 6 | name varchar(255) NOT NULL, 7 | data text NOT NULL, 8 | is_html tinyint NOT NULL default '0' 9 | ); 10 | 11 | CREATE UNIQUE INDEX ix_responses_user_id ON responses(user_id, del); 12 | -------------------------------------------------------------------------------- /SQL/sqlite/2022081200.sql: -------------------------------------------------------------------------------- 1 | DROP INDEX ix_responses_user_id; 2 | CREATE INDEX ix_responses_user_id ON responses(user_id, del); 3 | -------------------------------------------------------------------------------- /SQL/sqlite/2022100100.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE uploads ( 2 | upload_id varchar(64) NOT NULL PRIMARY KEY, 3 | session_id varchar(128) NOT NULL, 4 | "group" varchar(128) NOT NULL, 5 | metadata text NOT NULL, 6 | created datetime NOT NULL default '0000-00-00 00:00:00' 7 | ); 8 | 9 | CREATE INDEX ix_uploads_session_id ON uploads(session_id, "group", created); 10 | -------------------------------------------------------------------------------- /bin/makedoc.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -x 4 | 5 | BIN_PHPDOC=`/usr/bin/which phpdoc` 6 | 7 | if [ ! -x "$BIN_PHPDOC" ] 8 | then 9 | echo "phpdoc not found" 10 | exit 1 11 | fi 12 | 13 | INSTALL_PATH="`dirname $0`/.." 14 | PATH_PROJECT=$INSTALL_PATH/program/include 15 | PATH_FRAMEWORK=$INSTALL_PATH/program/lib/Roundcube 16 | PATH_DOCS=$INSTALL_PATH/doc/phpdoc 17 | TITLE="Roundcube Webmail" 18 | PACKAGES="Webmail" 19 | OUTPUTFORMAT=HTML 20 | TEMPLATE=responsive-twig 21 | 22 | # make documentation 23 | $BIN_PHPDOC -d $PATH_PROJECT,$PATH_FRAMEWORK -t $PATH_DOCS --title "$TITLE" \ 24 | --defaultpackagename $PACKAGES --template=$TEMPLATE 25 | -------------------------------------------------------------------------------- /config/.htaccess: -------------------------------------------------------------------------------- 1 | # deny webserver access to this directory 2 | 3 | Require all denied 4 | 5 | 6 | Deny from all 7 | 8 | -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | 3 | Require all denied 4 | 5 | 6 | Deny from all 7 | 8 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "csso-cli": "^4.0.2", 4 | "eslint": "^8.57.0", 5 | "eslint-config-airbnb-base": "^15.0.0", 6 | "eslint-plugin-import": "^2.29.1", 7 | "eslint-plugin-unicorn": "^54.0.0", 8 | "less": "^4.2.0", 9 | "less-plugin-clean-css": "^1.5.1", 10 | "uglify-js": "^3.17.4" 11 | }, 12 | "optionalDependencies": { 13 | "jquery": "^3.7.1", 14 | "tinymce": "^5.10.9", 15 | "openpgp": "^5.0.0", 16 | "codemirror": "^5.58.3", 17 | "bootstrap": "^4.5.3", 18 | "less": "^4.1.3" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /plugins/acl/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roundcube/acl", 3 | "type": "roundcube-plugin", 4 | "description": "IMAP Folders Access Control Lists Management (RFC4314, RFC2086).", 5 | "license": "GPL-3.0-or-later", 6 | "version": "1.9", 7 | "authors": [ 8 | { 9 | "name": "Aleksander Machniak", 10 | "email": "alec@alec.pl", 11 | "role": "Lead" 12 | } 13 | ], 14 | "require": { 15 | "php": ">=7.3.0", 16 | "roundcube/plugin-installer": "~0.3.5" 17 | }, 18 | "autoload": { 19 | "classmap": [ 20 | "acl.php" 21 | ] 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /plugins/acl/tests/AclTest.php: -------------------------------------------------------------------------------- 1 | plugins); 16 | 17 | $this->assertInstanceOf('acl', $plugin); 18 | $this->assertInstanceOf('rcube_plugin', $plugin); 19 | 20 | $plugin->init(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /plugins/additional_message_headers/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roundcube/additional_message_headers", 3 | "type": "roundcube-plugin", 4 | "description": "Very simple plugin which will add additional headers to or remove them from outgoing messages.", 5 | "license": "GPL-3.0-or-later", 6 | "version": "1.2.1", 7 | "authors": [ 8 | { 9 | "name": "Ziba Scott", 10 | "email": "email@example.org", 11 | "role": "Lead" 12 | } 13 | ], 14 | "require": { 15 | "php": ">=7.3.0", 16 | "roundcube/plugin-installer": "~0.3.5" 17 | }, 18 | "autoload": { 19 | "classmap": [ 20 | "additional_message_headers.php" 21 | ] 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /plugins/additional_message_headers/config.inc.php.dist: -------------------------------------------------------------------------------- 1 | =7.3.0", 21 | "roundcube/plugin-installer": "~0.3.5" 22 | }, 23 | "autoload": { 24 | "classmap": [ 25 | "archive.php" 26 | ] 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /plugins/archive/localization/bn_BD.inc: -------------------------------------------------------------------------------- 1 | =7.3.0", 20 | "roundcube/plugin-installer": "~0.3.5" 21 | }, 22 | "autoload": { 23 | "classmap": [ 24 | "attachment_reminder.php" 25 | ] 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /plugins/attachment_reminder/localization/kn_IN.inc: -------------------------------------------------------------------------------- 1 | =7.3.0", 16 | "roundcube/plugin-installer": "~0.3.5" 17 | }, 18 | "autoload": { 19 | "classmap": [ 20 | "autologon.php" 21 | ] 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /plugins/autologon/tests/AutologonTest.php: -------------------------------------------------------------------------------- 1 | plugins); 16 | 17 | $this->assertInstanceOf('autologon', $plugin); 18 | $this->assertInstanceOf('rcube_plugin', $plugin); 19 | 20 | // TODO 21 | $plugin->startup([]); 22 | $plugin->authenticate([]); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /plugins/autologout/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roundcube/autologout", 3 | "type": "roundcube-plugin", 4 | "description": "Plugin to auto log out users with a POST request sent from an external site.", 5 | "license": "GPL-3.0-or-later", 6 | "version": "1.0", 7 | "authors": [ 8 | { 9 | "name": "Cover Tower LLC", 10 | "email": "contact@covertower.com" 11 | } 12 | ], 13 | "require": { 14 | "php": ">=7.3.0", 15 | "roundcube/plugin-installer": "~0.3.5" 16 | }, 17 | "autoload": { 18 | "classmap": [ 19 | "autologout.php" 20 | ] 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /plugins/autologout/tests/AutologoutTest.php: -------------------------------------------------------------------------------- 1 | plugins); 16 | 17 | $this->assertInstanceOf('autologout', $plugin); 18 | $this->assertInstanceOf('rcube_plugin', $plugin); 19 | 20 | // TODO 21 | $plugin->startup([]); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /plugins/database_attachments/config.inc.php.dist: -------------------------------------------------------------------------------- 1 | plugins); 16 | 17 | $this->assertInstanceOf('database_attachments', $plugin); 18 | $this->assertInstanceOf('rcube_plugin', $plugin); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /plugins/debug_logger/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roundcube/debug_logger", 3 | "type": "roundcube-plugin", 4 | "description": "Enhanced logging for debugging purposes. It is not recommended to be enabled on production systems without testing because of the somewhat increased memory, cpu and disk i/o overhead.", 5 | "license": "GPL-3.0-or-later", 6 | "version": "1.0", 7 | "authors": [ 8 | { 9 | "name": "Ziba Scott", 10 | "email": "ziba@umich.edu", 11 | "role": "Lead" 12 | } 13 | ], 14 | "require": { 15 | "php": ">=7.3.0", 16 | "roundcube/plugin-installer": "~0.3.5" 17 | }, 18 | "autoload": { 19 | "classmap": [ 20 | "debug_logger.php", 21 | "runlog/runlog.php" 22 | ] 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /plugins/debug_logger/tests/DebugLoggerTest.php: -------------------------------------------------------------------------------- 1 | plugins); 16 | 17 | $this->assertInstanceOf('debug_logger', $plugin); 18 | $this->assertInstanceOf('rcube_plugin', $plugin); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /plugins/emoticons/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roundcube/emoticons", 3 | "type": "roundcube-plugin", 4 | "description": "Plugin that adds emoticons support.", 5 | "license": "GPL-3.0-or-later", 6 | "version": "3.0", 7 | "authors": [ 8 | { 9 | "name": "Thomas Bruederli", 10 | "email": "roundcube@gmail.com", 11 | "role": "Lead" 12 | }, 13 | { 14 | "name": "Aleksander Machniak", 15 | "email": "alec@alec.pl", 16 | "role": "Developer" 17 | } 18 | ], 19 | "require": { 20 | "php": ">=7.3.0", 21 | "roundcube/plugin-installer": "~0.3.5" 22 | }, 23 | "autoload": { 24 | "classmap": [ 25 | "emoticons.php" 26 | ] 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /plugins/emoticons/config.inc.php.dist: -------------------------------------------------------------------------------- 1 | plugins); 16 | 17 | $this->assertInstanceOf('emoticons', $plugin); 18 | $this->assertInstanceOf('rcube_plugin', $plugin); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /plugins/enigma/.gitignore: -------------------------------------------------------------------------------- 1 | home 2 | -------------------------------------------------------------------------------- /plugins/enigma/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roundcube/enigma", 3 | "type": "roundcube-plugin", 4 | "description": "Server-side PGP Encryption for Roundcube", 5 | "license": "GPL-3.0-or-later", 6 | "version": "0.9", 7 | "authors": [ 8 | { 9 | "name": "Aleksander Machniak", 10 | "email": "alec@alec.pl", 11 | "role": "Lead" 12 | } 13 | ], 14 | "require": { 15 | "php": ">=7.3.0", 16 | "roundcube/plugin-installer": "~0.3.5", 17 | "pear/crypt_gpg": "~1.6.3" 18 | }, 19 | "autoload": { 20 | "classmap": [ 21 | "lib/", 22 | "enigma.php" 23 | ] 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /plugins/enigma/localization/kn_IN.inc: -------------------------------------------------------------------------------- 1 | 2 | 3 |

4 | 5 |
6 | 7 |
8 | 9 |
10 | 11 |
12 | 13 | 14 | -------------------------------------------------------------------------------- /plugins/enigma/skins/elastic/templates/keyimport.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

4 | 5 |
6 | 7 |
8 | 9 | 10 | -------------------------------------------------------------------------------- /plugins/enigma/skins/elastic/templates/keyinfo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

4 | 5 |
6 | 7 |
8 | 9 | 10 | -------------------------------------------------------------------------------- /plugins/enigma/skins/elastic/templates/keysearch.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

4 | 5 |
6 | 7 |
8 | 9 | 10 | -------------------------------------------------------------------------------- /plugins/enigma/tests/EnigmaDriverGnupgTest.php: -------------------------------------------------------------------------------- 1 | user); 16 | 17 | $this->assertInstanceOf('enigma_driver', $plugin); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /plugins/enigma/tests/EnigmaErrorTest.php: -------------------------------------------------------------------------------- 1 | 'test2']); 15 | 16 | $this->assertInstanceOf('enigma_error', $error); 17 | $this->assertSame(\enigma_error::EXPIRED, $error->getCode()); 18 | $this->assertSame('message', $error->getMessage()); 19 | $this->assertSame('test2', $error->getData('test1')); 20 | $this->assertSame(['test1' => 'test2'], $error->getData()); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /plugins/enigma/tests/EnigmaKeyTest.php: -------------------------------------------------------------------------------- 1 | assertInstanceOf('enigma_key', $key); 17 | $this->assertSame(\enigma_key::TYPE_UNKNOWN, $key->get_type()); 18 | $this->assertFalse($key->is_revoked()); 19 | $this->assertFalse($key->is_valid()); 20 | $this->assertFalse($key->is_private()); 21 | $this->assertNull($key->find_subkey('test@domain.com', \enigma_key::CAN_SIGN)); 22 | 23 | $this->assertSame('89E037A5', $key::format_id('04622F2089E037A5')); 24 | // TODO: format_fingerprint(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /plugins/enigma/tests/EnigmaSignatureTest.php: -------------------------------------------------------------------------------- 1 | assertInstanceOf('enigma_signature', $error); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /plugins/enigma/tests/EnigmaSubkeyTest.php: -------------------------------------------------------------------------------- 1 | assertInstanceOf('enigma_subkey', $error); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /plugins/enigma/tests/EnigmaTest.php: -------------------------------------------------------------------------------- 1 | plugins); 16 | 17 | $this->assertInstanceOf('enigma', $plugin); 18 | $this->assertInstanceOf('rcube_plugin', $plugin); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /plugins/enigma/tests/EnigmaUseridTest.php: -------------------------------------------------------------------------------- 1 | assertInstanceOf('enigma_userid', $error); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /plugins/example_addressbook/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roundcube/example_addressbook", 3 | "type": "roundcube-plugin", 4 | "description": "Sample plugin to add a new address book with just a static list of contacts", 5 | "license": "GPL-3.0-or-later", 6 | "version": "1.0", 7 | "authors": [ 8 | { 9 | "name": "Thomas Bruederli", 10 | "email": "roundcube@gmail.com", 11 | "role": "Lead" 12 | } 13 | ], 14 | "require": { 15 | "php": ">=7.3.0", 16 | "roundcube/plugin-installer": "~0.3.5" 17 | }, 18 | "autoload": { 19 | "classmap": [ 20 | "example_addressbook.php", 21 | "example_addressbook_backend.php" 22 | ] 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /plugins/filesystem_attachments/tests/FilesystemAttachmentsTest.php: -------------------------------------------------------------------------------- 1 | plugins); 16 | 17 | $this->assertInstanceOf('filesystem_attachments', $plugin); 18 | $this->assertInstanceOf('rcube_plugin', $plugin); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /plugins/help/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roundcube/help", 3 | "type": "roundcube-plugin", 4 | "description": "Plugin adds a new item (Help) in taskbar.", 5 | "license": "GPL-3.0-or-later", 6 | "version": "1.4", 7 | "authors": [ 8 | { 9 | "name": "Aleksander Machniak", 10 | "email": "alec@alec.pl", 11 | "role": "Lead" 12 | } 13 | ], 14 | "require": { 15 | "php": ">=7.3.0", 16 | "roundcube/plugin-installer": "~0.3.5" 17 | }, 18 | "autoload": { 19 | "classmap": [ 20 | "help.php" 21 | ] 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /plugins/help/localization/kn_IN.inc: -------------------------------------------------------------------------------- 1 | 2 | 3 |

4 | 5 |
" class="frame-content"> 6 | 7 |
8 | 9 | 10 | -------------------------------------------------------------------------------- /plugins/hide_blockquote/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roundcube/hide_blockquote", 3 | "type": "roundcube-plugin", 4 | "description": "This allows to hide long blocks of cited text in messages.", 5 | "license": "GPL-3.0-or-later", 6 | "version": "1.0", 7 | "authors": [ 8 | { 9 | "name": "Aleksander Machniak", 10 | "email": "alec@alec.pl", 11 | "role": "Lead" 12 | } 13 | ], 14 | "require": { 15 | "php": ">=7.3.0", 16 | "roundcube/plugin-installer": "~0.3.5" 17 | }, 18 | "autoload": { 19 | "classmap": [ 20 | "hide_blockquote.php" 21 | ] 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /plugins/hide_blockquote/localization/bn_BD.inc: -------------------------------------------------------------------------------- 1 | =7.3.0", 16 | "roundcube/plugin-installer": "~0.3.5" 17 | }, 18 | "autoload": { 19 | "classmap": [ 20 | "http_authentication.php" 21 | ] 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /plugins/http_authentication/config.inc.php.dist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Logout 6 | 7 | 25 | 26 | 27 |

You've successfully been logged out!

28 | 29 | -------------------------------------------------------------------------------- /plugins/http_authentication/tests/HttpAuthenticationTest.php: -------------------------------------------------------------------------------- 1 | plugins); 16 | 17 | $this->assertInstanceOf('http_authentication', $plugin); 18 | $this->assertInstanceOf('rcube_plugin', $plugin); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /plugins/identicon/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roundcube/identicon", 3 | "type": "roundcube-plugin", 4 | "description": "Displays Github-like identicons for contacts/addresses without photo specified.", 5 | "license": "GPL-3.0-or-later", 6 | "version": "0.1", 7 | "authors": [ 8 | { 9 | "name": "Aleksander Machniak", 10 | "email": "alec@alec.pl", 11 | "role": "Lead" 12 | } 13 | ], 14 | "require": { 15 | "php": ">=7.3.0", 16 | "ext-gd": "*", 17 | "roundcube/plugin-installer": "~0.3.5" 18 | }, 19 | "autoload": { 20 | "classmap": [ 21 | "identicon.php", 22 | "identicon_engine.php" 23 | ] 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /plugins/identicon/tests/IdenticonEngineTest.php: -------------------------------------------------------------------------------- 1 | markTestSkipped(); 16 | } 17 | 18 | $engine = new \identicon_engine('test@domain.com', 10); 19 | 20 | $icon = $engine->getBinary(); 21 | 22 | $this->assertMatchesRegularExpression('/^\x89\x50\x4E\x47/', $icon); 23 | $this->assertSame('image/png', $engine->getMimetype()); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /plugins/identicon/tests/IdenticonTest.php: -------------------------------------------------------------------------------- 1 | plugins); 16 | 17 | $this->assertInstanceOf('identicon', $plugin); 18 | $this->assertInstanceOf('rcube_plugin', $plugin); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /plugins/identity_select/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roundcube/identity_select", 3 | "type": "roundcube-plugin", 4 | "description": "On reply to a message user identity selection is based on\n\t\tcontent of standard headers like From, To, Cc and Return-Path.\n\t\tHere you can add header(s) set by your SMTP server (e.g.\n\t\tDelivered-To, Envelope-To, X-Envelope-To, X-RCPT-TO) to make\n\t\tidentity selection more accurate.", 5 | "license": "GPL-3.0-or-later", 6 | "version": "1.1", 7 | "authors": [ 8 | { 9 | "name": "Aleksander Machniak", 10 | "email": "alec@alec.pl", 11 | "role": "Lead" 12 | } 13 | ], 14 | "require": { 15 | "php": ">=7.3.0", 16 | "roundcube/plugin-installer": "~0.3.5" 17 | }, 18 | "autoload": { 19 | "classmap": [ 20 | "identity_select.php" 21 | ] 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /plugins/identity_select/tests/IdentitySelectTest.php: -------------------------------------------------------------------------------- 1 | plugins); 16 | 17 | $this->assertInstanceOf('identity_select', $plugin); 18 | $this->assertInstanceOf('rcube_plugin', $plugin); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /plugins/jqueryui/config.inc.php.dist: -------------------------------------------------------------------------------- 1 | 'larry', 11 | 'default' => 'elastic', 12 | ]; 13 | -------------------------------------------------------------------------------- /plugins/jqueryui/tests/JqueryuiTest.php: -------------------------------------------------------------------------------- 1 | plugins); 16 | 17 | $this->assertInstanceOf('jqueryui', $plugin); 18 | $this->assertInstanceOf('rcube_plugin', $plugin); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /plugins/jqueryui/themes/elastic/images/jquery.minicolors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roundcube/roundcubemail/6a0cec468ebf98eb1a96208d0f9cb76b72648dc9/plugins/jqueryui/themes/elastic/images/jquery.minicolors.png -------------------------------------------------------------------------------- /plugins/jqueryui/themes/elastic/images/ui-icons-datepicker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roundcube/roundcubemail/6a0cec468ebf98eb1a96208d0f9cb76b72648dc9/plugins/jqueryui/themes/elastic/images/ui-icons-datepicker.png -------------------------------------------------------------------------------- /plugins/jqueryui/themes/elastic/images/ui-icons_444444_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roundcube/roundcubemail/6a0cec468ebf98eb1a96208d0f9cb76b72648dc9/plugins/jqueryui/themes/elastic/images/ui-icons_444444_256x240.png -------------------------------------------------------------------------------- /plugins/jqueryui/themes/elastic/images/ui-icons_777777_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roundcube/roundcubemail/6a0cec468ebf98eb1a96208d0f9cb76b72648dc9/plugins/jqueryui/themes/elastic/images/ui-icons_777777_256x240.png -------------------------------------------------------------------------------- /plugins/krb_authentication/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roundcube/krb_authentication", 3 | "type": "roundcube-plugin", 4 | "description": "Kerberos Authentication", 5 | "license": "GPL-3.0-or-later", 6 | "version": "1.2", 7 | "authors": [ 8 | { 9 | "name": "Jeroen van Meeuwen", 10 | "email": "vanmeeuwen@kolabsys.com", 11 | "role": "Lead" 12 | } 13 | ], 14 | "require": { 15 | "php": ">=7.3.0", 16 | "roundcube/plugin-installer": "~0.3.5" 17 | }, 18 | "autoload": { 19 | "classmap": [ 20 | "krb_authentication.php" 21 | ] 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /plugins/krb_authentication/config.inc.php.dist: -------------------------------------------------------------------------------- 1 | 'imap/host.fqdn@REALM.NAME', 19 | // 'smtp' => 'smtp/host.fqdn@REALM.NAME', 20 | // 'sieve' => 'sieve/host.fqdn@REALM.NAME', 21 | // ]; 22 | $config['krb_authentication_context'] = 'principal@REALM.NAME'; 23 | -------------------------------------------------------------------------------- /plugins/krb_authentication/tests/KrbAuthenticationTest.php: -------------------------------------------------------------------------------- 1 | plugins); 16 | 17 | $this->assertInstanceOf('krb_authentication', $plugin); 18 | $this->assertInstanceOf('rcube_plugin', $plugin); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /plugins/managesieve/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roundcube/managesieve", 3 | "type": "roundcube-plugin", 4 | "description": "Adds a possibility to manage Sieve scripts (incoming mail filters). It's clickable interface which operates on text scripts and communicates with server using managesieve protocol. Adds Filters tab in Settings.", 5 | "license": "GPL-3.0-or-later", 6 | "version": "9.5", 7 | "authors": [ 8 | { 9 | "name": "Aleksander Machniak", 10 | "email": "alec@alec.pl", 11 | "role": "Lead" 12 | } 13 | ], 14 | "require": { 15 | "php": ">=7.3.0", 16 | "roundcube/plugin-installer": "~0.3.5", 17 | "pear/net_sieve": "~1.4.4" 18 | }, 19 | "autoload": { 20 | "classmap": [ 21 | "lib/", 22 | "managesieve.php" 23 | ] 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /plugins/managesieve/skins/elastic/templates/filteredit.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

5 | 6 | 7 |
8 | 9 |
10 | 11 | 12 |
13 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /plugins/managesieve/skins/elastic/templates/setedit.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

4 | 5 |
6 | 7 |
8 | 9 |
10 | 11 |
12 | 13 | 14 | -------------------------------------------------------------------------------- /plugins/managesieve/skins/elastic/templates/seteditraw.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

4 | 5 |
6 | 7 |
8 | 9 |
10 | 11 |
12 | 13 | 14 | -------------------------------------------------------------------------------- /plugins/managesieve/tests/ManagesieveTest.php: -------------------------------------------------------------------------------- 1 | plugins); 16 | 17 | $this->assertInstanceOf('managesieve', $plugin); 18 | $this->assertInstanceOf('rcube_plugin', $plugin); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /plugins/managesieve/tests/src/parser_body: -------------------------------------------------------------------------------- 1 | require ["body","fileinto"]; 2 | if body :raw :contains "MAKE MONEY FAST" 3 | { 4 | stop; 5 | } 6 | if body :content "text" :contains ["missile","coordinates"] 7 | { 8 | fileinto "secrets"; 9 | } 10 | if body :content "audio/mp3" :contains "" 11 | { 12 | fileinto "jukebox"; 13 | } 14 | if body :text :contains "project schedule" 15 | { 16 | fileinto "project/schedule"; 17 | } 18 | -------------------------------------------------------------------------------- /plugins/managesieve/tests/src/parser_comments: -------------------------------------------------------------------------------- 1 | require ["envelope","fileinto","imap4flags","subaddress"]; 2 | 3 | # simple to-be-ignored comment with an empty line after (#5657) 4 | 5 | # another comment 6 | if envelope :detail "to" "addressextension" 7 | { 8 | setflag "\\Flagged"; 9 | } 10 | 11 | # Spam 12 | if header :is "X-Spam-Flag" "YES" 13 | { 14 | fileinto "Junk"; 15 | stop; 16 | } 17 | -------------------------------------------------------------------------------- /plugins/managesieve/tests/src/parser_comments.out: -------------------------------------------------------------------------------- 1 | require ["envelope","fileinto","imap4flags","subaddress"]; 2 | if envelope :detail "to" "addressextension" 3 | { 4 | setflag "\\Flagged"; 5 | } 6 | if header :is "X-Spam-Flag" "YES" 7 | { 8 | fileinto "Junk"; 9 | stop; 10 | } 11 | -------------------------------------------------------------------------------- /plugins/managesieve/tests/src/parser_date: -------------------------------------------------------------------------------- 1 | require ["comparator-i;ascii-numeric","date","fileinto","relational"]; 2 | # rule:[date] 3 | if allof (date :originalzone :value "ge" :comparator "i;ascii-numeric" "date" "hour" "09") 4 | { 5 | fileinto "urgent"; 6 | } 7 | # rule:[date-weekday] 8 | if date :is "received" "weekday" "0" 9 | { 10 | fileinto "weekend"; 11 | } 12 | # rule:[date-zone] 13 | if date :zone "-0500" :value "gt" :comparator "i;ascii-numeric" "received" "iso8601" "2007-02-26T09:00:00-05:00" 14 | { 15 | stop; 16 | } 17 | # rule:[currentdate] 18 | if anyof (currentdate :is "weekday" "0", currentdate :value "lt" :comparator "i;ascii-numeric" "hour" "09", currentdate :value "ge" :comparator "i;ascii-numeric" "date" "2007-06-30") 19 | { 20 | stop; 21 | } 22 | -------------------------------------------------------------------------------- /plugins/managesieve/tests/src/parser_duplicate: -------------------------------------------------------------------------------- 1 | require ["duplicate","fileinto"]; 2 | # rule:[test-duplicate] 3 | if duplicate 4 | { 5 | fileinto "urgent"; 6 | } 7 | # rule:[test-duplicate-2] 8 | if allof (duplicate :handle "support" :header "X-Ticket-ID", header :contains "subject" "fileserver") 9 | { 10 | fileinto "test"; 11 | } 12 | # rule:[test-duplicate-3] 13 | if not duplicate :uniqueid "test" :seconds 1800 14 | { 15 | discard; 16 | } 17 | -------------------------------------------------------------------------------- /plugins/managesieve/tests/src/parser_enotify_a: -------------------------------------------------------------------------------- 1 | require ["enotify","variables"]; 2 | # rule:[notify1] 3 | if header :contains "from" "boss@example.org" 4 | { 5 | notify :importance "1" :message "This is probably very important" "mailto:alm@example.com"; 6 | stop; 7 | } 8 | # rule:[subject] 9 | if header :matches "Subject" "*" 10 | { 11 | set "subject" "${1}"; 12 | } 13 | # rule:[from notify2] 14 | if header :matches "From" "*" 15 | { 16 | set "from" "${1}"; 17 | notify :importance "3" :message "${from}: ${subject}" "mailto:alm@example.com"; 18 | } 19 | -------------------------------------------------------------------------------- /plugins/managesieve/tests/src/parser_enotify_b: -------------------------------------------------------------------------------- 1 | require ["enotify","envelope","variables"]; 2 | # rule:[from] 3 | if envelope :matches "from" "*" 4 | { 5 | set "env_from" " [really: ${1}]"; 6 | } 7 | # rule:[subject] 8 | if header :matches "Subject" "*" 9 | { 10 | set "subject" "${1}"; 11 | } 12 | # rule:[from notify] 13 | if address :matches "from" "*" 14 | { 15 | set "from_addr" "${1}"; 16 | notify :message "${from_addr}${env_from}: ${subject}" "mailto:alm@example.com"; 17 | } 18 | 19 | -------------------------------------------------------------------------------- /plugins/managesieve/tests/src/parser_imapflags: -------------------------------------------------------------------------------- 1 | require ["imap4flags"]; 2 | # rule:[imapflags] 3 | if header :matches "Subject" "^Test$" 4 | { 5 | setflag "\\Seen"; 6 | addflag ["\\Answered","\\Deleted"]; 7 | } 8 | -------------------------------------------------------------------------------- /plugins/managesieve/tests/src/parser_include: -------------------------------------------------------------------------------- 1 | require ["include"]; 2 | include "script.sieve"; 3 | # rule:[two] 4 | if true 5 | { 6 | include :optional "second.sieve"; 7 | } 8 | -------------------------------------------------------------------------------- /plugins/managesieve/tests/src/parser_index: -------------------------------------------------------------------------------- 1 | require ["comparator-i;ascii-numeric","date","fileinto","index","relational"]; 2 | # rule:[index-header1] 3 | if header :index 1 :last :contains "X-DSPAM-Result" "Spam" 4 | { 5 | fileinto "Spam"; 6 | stop; 7 | } 8 | # rule:[index-header2] 9 | if header :index 2 :contains ["From","To"] "test@domain.tld" 10 | { 11 | discard; 12 | stop; 13 | } 14 | # rule:[index-address] 15 | if address :index 1 :is "From" "nagios@domain.tld" 16 | { 17 | fileinto "domain.tld"; 18 | stop; 19 | } 20 | # rule:[index-date] 21 | if date :index 1 :last :zone "-0500" :value "gt" :comparator "i;ascii-numeric" "received" "iso8601" "2007-02-26T09:00:00-05:00" 22 | { 23 | stop; 24 | } 25 | -------------------------------------------------------------------------------- /plugins/managesieve/tests/src/parser_kep14: -------------------------------------------------------------------------------- 1 | # EDITOR Roundcube 2 | # EDITOR_VERSION 123 3 | -------------------------------------------------------------------------------- /plugins/managesieve/tests/src/parser_kep14.out: -------------------------------------------------------------------------------- 1 | require ["variables"]; 2 | set "EDITOR" "Roundcube"; 3 | set "EDITOR_VERSION" "123"; 4 | -------------------------------------------------------------------------------- /plugins/managesieve/tests/src/parser_nesting.out: -------------------------------------------------------------------------------- 1 | # Sieve Filter 2 | # Erzeugt von Ingo (http://www.horde.org/ingo/) (30.09.2016, 16:02) 3 | # Nested rules aren't supported and will be ignored (#5540) 4 | 5 | require ["fileinto"]; 6 | if header :contains "Subject" "TAG" 7 | { 8 | fileinto "Tagged"; 9 | } 10 | # rule:[Ausgeschlossene Adressen] 11 | if address :is ["From","Sender","Resent-From"] "noreply@example.org" 12 | { 13 | discard; 14 | stop; 15 | } 16 | -------------------------------------------------------------------------------- /plugins/managesieve/tests/src/parser_notify_a: -------------------------------------------------------------------------------- 1 | require ["notify","variables"]; 2 | # rule:[notify1] 3 | if header :contains "from" "boss@example.org" 4 | { 5 | notify :low :message "This is probably very important"; 6 | stop; 7 | } 8 | # rule:[subject] 9 | if header :matches "Subject" "*" 10 | { 11 | set "subject" "${1}"; 12 | } 13 | # rule:[from notify2] 14 | if header :matches "From" "*" 15 | { 16 | set "from" "${1}"; 17 | notify :high :method "mailto" :options "test@example.org" :message "${from}: ${subject}"; 18 | } 19 | -------------------------------------------------------------------------------- /plugins/managesieve/tests/src/parser_notify_b: -------------------------------------------------------------------------------- 1 | require ["envelope","notify","variables"]; 2 | # rule:[from] 3 | if envelope :matches "from" "*" 4 | { 5 | set "env_from" " [really: ${1}]"; 6 | } 7 | # rule:[subject] 8 | if header :matches "Subject" "*" 9 | { 10 | set "subject" "${1}"; 11 | } 12 | # rule:[from notify] 13 | if address :matches "from" "*" 14 | { 15 | set "from_addr" "${1}"; 16 | notify :method "sms" :options "1234567890" :message "${from_addr}${env_from}: ${subject}"; 17 | } 18 | -------------------------------------------------------------------------------- /plugins/managesieve/tests/src/parser_prefix: -------------------------------------------------------------------------------- 1 | # this is a comment 2 | # and the second line 3 | 4 | require ["variables"]; 5 | set "b" "c"; 6 | -------------------------------------------------------------------------------- /plugins/managesieve/tests/src/parser_relational: -------------------------------------------------------------------------------- 1 | require ["comparator-i;ascii-numeric","relational"]; 2 | # rule:[redirect] 3 | if header :value "ge" :comparator "i;ascii-numeric" "X-Spam-score" "14" 4 | { 5 | redirect "test@test.tld"; 6 | } 7 | -------------------------------------------------------------------------------- /plugins/managesieve/tests/src/parser_spamtest: -------------------------------------------------------------------------------- 1 | require ["comparator-i;ascii-numeric","fileinto","relational","spamtest"]; 2 | # rule:[Spam1] 3 | if allof (spamtest :value "eq" :comparator "i;ascii-numeric" "10") 4 | { 5 | fileinto "Junk"; 6 | } 7 | # rule:[Spam2] 8 | if allof (spamtest :value "ge" :comparator "i;ascii-numeric" "3") 9 | { 10 | fileinto "INBOX.spam-trap"; 11 | } 12 | -------------------------------------------------------------------------------- /plugins/managesieve/tests/src/parser_subaddress: -------------------------------------------------------------------------------- 1 | require ["envelope","fileinto","subaddress"]; 2 | if envelope :user "To" "postmaster" 3 | { 4 | fileinto "postmaster"; 5 | stop; 6 | } 7 | if envelope :detail :is "To" "mta-filters" 8 | { 9 | fileinto "mta-filters"; 10 | stop; 11 | } 12 | -------------------------------------------------------------------------------- /plugins/managesieve/tests/src/parser_vacation: -------------------------------------------------------------------------------- 1 | require ["vacation"]; 2 | # rule:[test-vacation] 3 | if header :contains "Subject" "vacation" 4 | { 5 | vacation :days 1 text: 6 | # test 7 | test test /* test */ 8 | .. 9 | ..test 10 | test 11 | . 12 | ; 13 | stop; 14 | } 15 | -------------------------------------------------------------------------------- /plugins/managesieve/tests/src/parser_vacation_seconds: -------------------------------------------------------------------------------- 1 | require ["vacation-seconds"]; 2 | # rule:[test-vacation] 3 | if header :contains "Subject" "vacation" 4 | { 5 | vacation :seconds 0 text: 6 | # test 7 | test test /* test */ 8 | test 9 | . 10 | ; 11 | stop; 12 | } 13 | -------------------------------------------------------------------------------- /plugins/managesieve/tests/src/parser_variables: -------------------------------------------------------------------------------- 1 | require ["variables"]; 2 | set "honorific" "Mr"; 3 | set "vacation" text: 4 | Dear ${HONORIFIC} ${last_name}, 5 | I am out, please leave a message after the meep. 6 | . 7 | ; 8 | set :length "b" "${a}"; 9 | set :lower "b" "${a}"; 10 | set :upperfirst "b" "${a}"; 11 | set :upperfirst :lower "b" "${a}"; 12 | set :quotewildcard "b" "Rock*"; 13 | if string :matches " ${state} " "* pending *" 14 | { 15 | set "test1" "*"; 16 | } 17 | if string ["aaa","bbb"] ["aaa","bbb"] 18 | { 19 | set "test2" "*"; 20 | } 21 | if string :is :comparator "i;octet" "bbb" "bbb" 22 | { 23 | set "test3" "*"; 24 | } 25 | -------------------------------------------------------------------------------- /plugins/markasjunk/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roundcube/markasjunk", 3 | "type": "roundcube-plugin", 4 | "description": "Adds buttons to mark messages as Junk/Non-Junk with moving to the Junk folder and Spam/Ham learning.", 5 | "license": "GPL-3.0-or-later", 6 | "version": "2.0", 7 | "authors": [ 8 | { 9 | "name": "Thomas Bruederli", 10 | "email": "roundcube@gmail.com", 11 | "role": "Lead" 12 | }, 13 | { 14 | "name": "Philip Weir", 15 | "email": "roundcube@tehinterweb.co.uk", 16 | "role": "Developer" 17 | } 18 | ], 19 | "require": { 20 | "php": ">=7.3.0", 21 | "roundcube/plugin-installer": "~0.3.5" 22 | }, 23 | "autoload": { 24 | "classmap": [ 25 | "drivers/", 26 | "markasjunk.php" 27 | ] 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /plugins/markasjunk/localization/ku.inc: -------------------------------------------------------------------------------- 1 | =7.3.0", 16 | "roundcube/plugin-installer": "~0.3.5" 17 | }, 18 | "autoload": { 19 | "classmap": [ 20 | "new_user_dialog.php" 21 | ] 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /plugins/new_user_dialog/tests/NewUserDialogTest.php: -------------------------------------------------------------------------------- 1 | plugins); 16 | 17 | $this->assertInstanceOf('new_user_dialog', $plugin); 18 | $this->assertInstanceOf('rcube_plugin', $plugin); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /plugins/new_user_identity/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roundcube/new_user_identity", 3 | "type": "roundcube-plugin", 4 | "description": "Populates a new user's default identity from LDAP on their first visit.", 5 | "license": "GPL-3.0-or-later", 6 | "version": "1.2", 7 | "authors": [ 8 | { 9 | "name": "Aleksander Machniak", 10 | "email": "alec@alec.pl", 11 | "role": "Lead" 12 | } 13 | ], 14 | "require": { 15 | "php": ">=7.3.0", 16 | "roundcube/plugin-installer": "~0.3.5" 17 | }, 18 | "autoload": { 19 | "classmap": [ 20 | "new_user_identity.php" 21 | ] 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /plugins/new_user_identity/config.inc.php.dist: -------------------------------------------------------------------------------- 1 | plugins); 16 | 17 | $this->assertInstanceOf('new_user_identity', $plugin); 18 | $this->assertInstanceOf('rcube_plugin', $plugin); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /plugins/newmail_notifier/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roundcube/newmail_notifier", 3 | "type": "roundcube-plugin", 4 | "description": "Supports three methods of notification: 1. Basic - focus browser window and change favicon 2. Sound - play wav file 3. Desktop - display desktop notification (using HTML5 Notification API feature).", 5 | "license": "GPL-3.0-or-later", 6 | "version": "0.8", 7 | "authors": [ 8 | { 9 | "name": "Aleksander Machniak", 10 | "email": "alec@alec.pl", 11 | "role": "Lead" 12 | } 13 | ], 14 | "require": { 15 | "php": ">=7.3.0", 16 | "roundcube/plugin-installer": "~0.3.5" 17 | }, 18 | "autoload": { 19 | "classmap": [ 20 | "newmail_notifier.php" 21 | ] 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /plugins/newmail_notifier/config.inc.php.dist: -------------------------------------------------------------------------------- 1 | plugins); 16 | 17 | $this->assertInstanceOf('newmail_notifier', $plugin); 18 | $this->assertInstanceOf('rcube_plugin', $plugin); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /plugins/password/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roundcube/password", 3 | "type": "roundcube-plugin", 4 | "description": "Password Change for Roundcube. Plugin adds a possibility to change user password using many methods (drivers) via Settings/Password tab.", 5 | "license": "GPL-3.0-or-later", 6 | "version": "5.5", 7 | "authors": [ 8 | { 9 | "name": "Aleksander Machniak", 10 | "email": "alec@alec.pl", 11 | "role": "Lead" 12 | } 13 | ], 14 | "require": { 15 | "php": ">=7.3.0", 16 | "roundcube/plugin-installer": "~0.3.5" 17 | }, 18 | "autoload": { 19 | "classmap": [ 20 | "drivers/", 21 | "password.php" 22 | ] 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /plugins/password/helpers/chgdbmailusers.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | // set the UID this script will run as (root user) 5 | #define UID 0 6 | #define CMD "/usr/sbin/dbmail-users" 7 | 8 | /* INSTALLING: 9 | gcc -o chgdbmailusers chgdbmailusers.c 10 | chown root.apache chgdbmailusers 11 | strip chgdbmailusers 12 | chmod 4550 chgdbmailusers 13 | */ 14 | 15 | main(int argc, char *argv[]) 16 | { 17 | int rc, cc; 18 | 19 | cc = setuid(UID); 20 | rc = execvp(CMD, argv); 21 | 22 | if ((rc != 0) || (cc != 0)) 23 | { 24 | fprintf(stderr, "__ %s: failed %d %d\n", argv[0], rc, cc); 25 | return 1; 26 | } 27 | 28 | return 0; 29 | } 30 | -------------------------------------------------------------------------------- /plugins/password/helpers/chgsaslpasswd.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | // set the UID this script will run as (cyrus user) 5 | #define UID 96 6 | // set the path to saslpasswd or saslpasswd2 7 | #define CMD "/usr/sbin/saslpasswd2" 8 | 9 | /* INSTALLING: 10 | gcc -o chgsaslpasswd chgsaslpasswd.c 11 | chown cyrus.apache chgsaslpasswd 12 | strip chgsaslpasswd 13 | chmod 4550 chgsaslpasswd 14 | */ 15 | 16 | main(int argc, char *argv[]) 17 | { 18 | int rc,cc; 19 | 20 | cc = setuid(UID); 21 | rc = execvp(CMD, argv); 22 | if ((rc != 0) || (cc != 0)) 23 | { 24 | fprintf(stderr, "__ %s: failed %d %d\n", argv[0], rc, cc); 25 | return 1; 26 | } 27 | 28 | return 0; 29 | } 30 | -------------------------------------------------------------------------------- /plugins/password/helpers/chgvirtualminpasswd.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | // set the UID this script will run as (root user) 5 | #define UID 0 6 | #define CMD "/usr/sbin/virtualmin" 7 | 8 | /* INSTALLING: 9 | gcc -o chgvirtualminpasswd chgvirtualminpasswd.c 10 | chown root.apache chgvirtualminpasswd 11 | strip chgvirtualminpasswd 12 | chmod 4550 chgvirtualminpasswd 13 | */ 14 | 15 | main(int argc, char *argv[]) 16 | { 17 | int rc,cc; 18 | 19 | cc = setuid(UID); 20 | rc = execvp(CMD, argv); 21 | if ((rc != 0) || (cc != 0)) 22 | { 23 | fprintf(stderr, "__ %s: failed %d %d\n", argv[0], rc, cc); 24 | return 1; 25 | } 26 | 27 | return 0; 28 | } 29 | -------------------------------------------------------------------------------- /plugins/password/helpers/chpass-wrapper.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import sys 4 | import pwd 5 | import subprocess 6 | 7 | BLACKLIST = ( 8 | # add blacklisted users here 9 | #'user1', 10 | ) 11 | 12 | try: 13 | username, password = sys.stdin.readline().split(':', 1) 14 | except ValueError: 15 | sys.exit('Malformed input') 16 | 17 | try: 18 | user = pwd.getpwnam(username) 19 | except KeyError: 20 | sys.exit('No such user: %s' % username) 21 | 22 | if user.pw_uid < 1000: 23 | sys.exit('Changing the password for user id < 1000 is forbidden') 24 | 25 | if username in BLACKLIST: 26 | sys.exit('Changing password for user %s is forbidden (user blacklisted)' % 27 | username) 28 | 29 | handle = subprocess.Popen('/usr/sbin/chpasswd', stdin = subprocess.PIPE, universal_newlines = True) 30 | handle.communicate('%s:%s' % (username, password)) 31 | 32 | sys.exit(handle.returncode) 33 | -------------------------------------------------------------------------------- /plugins/reconnect/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roundcube/reconnect", 3 | "type": "roundcube-plugin", 4 | "description": "Reconnects to server for several attempts.", 5 | "license": "GPL-3.0-or-later", 6 | "version": "0.2", 7 | "authors": [ 8 | { 9 | "name": "Sandro Knauß", 10 | "email": "hefee@debian.org" 11 | } 12 | ], 13 | "require": { 14 | "php": ">=7.3.0", 15 | "roundcube/plugin-installer": "~0.3.5" 16 | }, 17 | "autoload": { 18 | "classmap": [ 19 | "reconnect.php" 20 | ] 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /plugins/reconnect/config.inc.php.dist: -------------------------------------------------------------------------------- 1 | plugins); 16 | 17 | $this->assertInstanceOf('reconnect', $plugin); 18 | $this->assertInstanceOf('rcube_plugin', $plugin); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /plugins/redundant_attachments/tests/RedundantAttachmentsTest.php: -------------------------------------------------------------------------------- 1 | plugins); 16 | 17 | $this->assertInstanceOf('redundant_attachments', $plugin); 18 | $this->assertInstanceOf('rcube_plugin', $plugin); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /plugins/show_additional_headers/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roundcube/show_additional_headers", 3 | "type": "roundcube-plugin", 4 | "description": "Proof-of-concept plugin which will fetch additional headers and display them in the message view.", 5 | "license": "GPL-3.0-or-later", 6 | "version": "2.0", 7 | "authors": [ 8 | { 9 | "name": "Thomas Bruederli", 10 | "email": "roundcube@gmail.com", 11 | "role": "Lead" 12 | } 13 | ], 14 | "require": { 15 | "php": ">=7.3.0", 16 | "roundcube/plugin-installer": "~0.3.5" 17 | }, 18 | "autoload": { 19 | "classmap": [ 20 | "show_additional_headers.php" 21 | ] 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /plugins/show_additional_headers/tests/ShowAdditionalHeadersTest.php: -------------------------------------------------------------------------------- 1 | plugins); 16 | 17 | $this->assertInstanceOf('show_additional_headers', $plugin); 18 | $this->assertInstanceOf('rcube_plugin', $plugin); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /plugins/squirrelmail_usercopy/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roundcube/squirrelmail_usercopy", 3 | "type": "roundcube-plugin", 4 | "description": "Copy a new users identity and settings from a nearby Squirrelmail installation", 5 | "license": "GPL-3.0-or-later", 6 | "version": "1.6", 7 | "authors": [ 8 | { 9 | "name": "Thomas Bruederli", 10 | "email": "roundcube@gmail.com", 11 | "role": "Lead" 12 | } 13 | ], 14 | "require": { 15 | "php": ">=7.3.0", 16 | "roundcube/plugin-installer": "~0.3.5" 17 | }, 18 | "autoload": { 19 | "classmap": [ 20 | "squirrelmail_usercopy.php" 21 | ] 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /plugins/squirrelmail_usercopy/tests/SquirrelmailUsercopyTest.php: -------------------------------------------------------------------------------- 1 | plugins); 16 | 17 | $this->assertInstanceOf('squirrelmail_usercopy', $plugin); 18 | $this->assertInstanceOf('rcube_plugin', $plugin); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /plugins/userinfo/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roundcube/userinfo", 3 | "type": "roundcube-plugin", 4 | "description": "Sample plugin that adds a new tab to the settings section to display some information about the current user.", 5 | "license": "GPL-3.0-or-later", 6 | "version": "1.2", 7 | "authors": [ 8 | { 9 | "name": "Thomas Bruederli", 10 | "email": "roundcube@gmail.com", 11 | "role": "Lead" 12 | } 13 | ], 14 | "require": { 15 | "php": ">=7.3.0", 16 | "roundcube/plugin-installer": "~0.3.5" 17 | }, 18 | "autoload": { 19 | "classmap": [ 20 | "userinfo.php" 21 | ] 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /plugins/userinfo/tests/UserinfoTest.php: -------------------------------------------------------------------------------- 1 | plugins); 16 | 17 | $this->assertInstanceOf('userinfo', $plugin); 18 | $this->assertInstanceOf('rcube_plugin', $plugin); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /plugins/vcard_attachments/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roundcube/vcard_attachments", 3 | "type": "roundcube-plugin", 4 | "description": "Detects vCard attachments and allows to add them to address book. Also allows to attach vCards of your contacts to composed messages", 5 | "license": "GPL-3.0-or-later", 6 | "version": "4.2", 7 | "authors": [ 8 | { 9 | "name": "Thomas Bruederli", 10 | "email": "roundcube@gmail.com", 11 | "role": "Lead" 12 | }, 13 | { 14 | "name": "Aleksander Machniak", 15 | "email": "alec@alec.pl", 16 | "role": "Lead" 17 | } 18 | ], 19 | "require": { 20 | "php": ">=7.3.0", 21 | "roundcube/plugin-installer": "~0.3.5" 22 | }, 23 | "autoload": { 24 | "classmap": [ 25 | "vcard_attachments.php" 26 | ] 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /plugins/virtuser_file/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roundcube/virtuser_file", 3 | "type": "roundcube-plugin", 4 | "description": "Plugin adds possibility to resolve user email/login according to lookup tables in files.", 5 | "license": "GPL-3.0-or-later", 6 | "version": "1.0", 7 | "authors": [ 8 | { 9 | "name": "Aleksander Machniak", 10 | "email": "alec@alec.pl", 11 | "role": "Lead" 12 | } 13 | ], 14 | "require": { 15 | "php": ">=7.3.0", 16 | "roundcube/plugin-installer": "~0.3.5" 17 | }, 18 | "autoload": { 19 | "classmap": [ 20 | "virtuser_file.php" 21 | ] 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /plugins/virtuser_file/tests/VirtuserFileTest.php: -------------------------------------------------------------------------------- 1 | plugins); 16 | 17 | $this->assertInstanceOf('virtuser_file', $plugin); 18 | $this->assertInstanceOf('rcube_plugin', $plugin); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /plugins/virtuser_query/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roundcube/virtuser_query", 3 | "type": "roundcube-plugin", 4 | "description": "Plugin adds possibility to resolve user email/login according to lookup tables in SQL database.", 5 | "license": "GPL-3.0-or-later", 6 | "version": "2.0", 7 | "authors": [ 8 | { 9 | "name": "Aleksander Machniak", 10 | "email": "alec@alec.pl", 11 | "role": "Lead" 12 | } 13 | ], 14 | "require": { 15 | "php": ">=7.3.0", 16 | "roundcube/plugin-installer": "~0.3.5" 17 | }, 18 | "autoload": { 19 | "classmap": [ 20 | "virtuser_query.php" 21 | ] 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /plugins/virtuser_query/tests/VirtuserQueryTest.php: -------------------------------------------------------------------------------- 1 | plugins); 16 | 17 | $this->assertInstanceOf('virtuser_query', $plugin); 18 | $this->assertInstanceOf('rcube_plugin', $plugin); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /plugins/zipdownload/config.inc.php.dist: -------------------------------------------------------------------------------- 1 | plugins); 16 | 17 | $this->assertInstanceOf('zipdownload', $plugin); 18 | $this->assertInstanceOf('rcube_plugin', $plugin); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /program/localization/ber/labels.inc: -------------------------------------------------------------------------------- 1 | | 13 | +-----------------------------------------------------------------------+ 14 | */ 15 | 16 | $labels['username'] = 'Izwel n'; 17 | 18 | -------------------------------------------------------------------------------- /program/localization/es_419/timezones.inc: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Internal Error 6 | 20 | 21 | 22 |
23 |

Oops... something went wrong!

24 |

An internal error has occurred. Your request cannot be processed at this time.

25 |

For administrators: Please check the application and/or server error logs for more information.

26 |
27 | 28 | 29 | -------------------------------------------------------------------------------- /program/resources/tinymce/content.css: -------------------------------------------------------------------------------- 1 | /* This file contains the CSS data for the editable area(iframe) of TinyMCE */ 2 | 3 | body, td, pre { 4 | font-family: "Lucida Grande", Verdana, Arial, Helvetica, sans-serif; 5 | font-size: 12px; 6 | } 7 | 8 | body { 9 | background-color: #fff; 10 | margin: 4px; 11 | } 12 | 13 | div.pre { 14 | margin: 0; 15 | padding: 0; 16 | font-family: monospace; 17 | } 18 | 19 | blockquote 20 | { 21 | border-left: #1010ff 2px solid; 22 | margin: 0; 23 | padding: 0 0.4em; 24 | } 25 | -------------------------------------------------------------------------------- /program/resources/tinymce/video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roundcube/roundcubemail/6a0cec468ebf98eb1a96208d0f9cb76b72648dc9/program/resources/tinymce/video.png -------------------------------------------------------------------------------- /skins/elastic/.gitignore: -------------------------------------------------------------------------------- 1 | styles/styles.css 2 | styles/print.css 3 | styles/embed.css 4 | deps/* 5 | -------------------------------------------------------------------------------- /skins/elastic/Makefile: -------------------------------------------------------------------------------- 1 | # No default target to avoid this being mistaken as sufficient preparation for 2 | # running the code (these styles depend on bootstrap, which needs to be 3 | # downloaded, too; see bin/install-jsdeps.sh in the repo's root). 4 | 5 | css: 6 | npx lessc --clean-css="--s1 --advanced" styles/styles.less > styles/styles.min.css 7 | npx lessc --clean-css="--s1 --advanced" styles/print.less > styles/print.min.css 8 | npx lessc --clean-css="--s1 --advanced" styles/embed.less > styles/embed.min.css 9 | -------------------------------------------------------------------------------- /skins/elastic/fonts/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roundcube/roundcubemail/6a0cec468ebf98eb1a96208d0f9cb76b72648dc9/skins/elastic/fonts/fa-regular-400.woff -------------------------------------------------------------------------------- /skins/elastic/fonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roundcube/roundcubemail/6a0cec468ebf98eb1a96208d0f9cb76b72648dc9/skins/elastic/fonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /skins/elastic/fonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roundcube/roundcubemail/6a0cec468ebf98eb1a96208d0f9cb76b72648dc9/skins/elastic/fonts/fa-solid-900.woff -------------------------------------------------------------------------------- /skins/elastic/fonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roundcube/roundcubemail/6a0cec468ebf98eb1a96208d0f9cb76b72648dc9/skins/elastic/fonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /skins/elastic/fonts/roboto-v29-italic-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roundcube/roundcubemail/6a0cec468ebf98eb1a96208d0f9cb76b72648dc9/skins/elastic/fonts/roboto-v29-italic-700.woff -------------------------------------------------------------------------------- /skins/elastic/fonts/roboto-v29-italic-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roundcube/roundcubemail/6a0cec468ebf98eb1a96208d0f9cb76b72648dc9/skins/elastic/fonts/roboto-v29-italic-700.woff2 -------------------------------------------------------------------------------- /skins/elastic/fonts/roboto-v29-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roundcube/roundcubemail/6a0cec468ebf98eb1a96208d0f9cb76b72648dc9/skins/elastic/fonts/roboto-v29-italic.woff -------------------------------------------------------------------------------- /skins/elastic/fonts/roboto-v29-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roundcube/roundcubemail/6a0cec468ebf98eb1a96208d0f9cb76b72648dc9/skins/elastic/fonts/roboto-v29-italic.woff2 -------------------------------------------------------------------------------- /skins/elastic/fonts/roboto-v29-regular-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roundcube/roundcubemail/6a0cec468ebf98eb1a96208d0f9cb76b72648dc9/skins/elastic/fonts/roboto-v29-regular-700.woff -------------------------------------------------------------------------------- /skins/elastic/fonts/roboto-v29-regular-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roundcube/roundcubemail/6a0cec468ebf98eb1a96208d0f9cb76b72648dc9/skins/elastic/fonts/roboto-v29-regular-700.woff2 -------------------------------------------------------------------------------- /skins/elastic/fonts/roboto-v29-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roundcube/roundcubemail/6a0cec468ebf98eb1a96208d0f9cb76b72648dc9/skins/elastic/fonts/roboto-v29-regular.woff -------------------------------------------------------------------------------- /skins/elastic/fonts/roboto-v29-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roundcube/roundcubemail/6a0cec468ebf98eb1a96208d0f9cb76b72648dc9/skins/elastic/fonts/roboto-v29-regular.woff2 -------------------------------------------------------------------------------- /skins/elastic/images/contactgroup.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /skins/elastic/images/contactpic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /skins/elastic/images/corner-handle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /skins/elastic/images/download.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /skins/elastic/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roundcube/roundcubemail/6a0cec468ebf98eb1a96208d0f9cb76b72648dc9/skins/elastic/images/favicon.ico -------------------------------------------------------------------------------- /skins/elastic/images/google-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /skins/elastic/images/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /skins/elastic/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Elastic", 3 | "author": "Aleksander Machniak", 4 | "license": "Creative Commons Attribution-ShareAlike", 5 | "license-url": "http://creativecommons.org/licenses/by-sa/3.0/", 6 | "config": { 7 | "supported_layouts": ["widescreen"], 8 | "jquery_ui_colors_theme": "bootstrap", 9 | "embed_css_location": "/styles/embed.css", 10 | "editor_css_location": "/styles/embed.css", 11 | "dark_mode_support": true, 12 | "media_browser_css_location": "none", 13 | "additional_logo_types": ["dark", "small", "small-dark"] 14 | }, 15 | "meta": { 16 | "viewport": "width=device-width, initial-scale=1.0, shrink-to-fit=no, maximum-scale=1.0", 17 | "theme-color": "#f4f4f4", 18 | "msapplication-navbutton-color": "#f4f4f4" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /skins/elastic/templates/about.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

4 | 5 |
6 | 7 |

Roundcube Webmail

8 | 9 |

10 |
11 |

12 | 13 |

14 | 15 |
16 |
17 | 18 | 19 | -------------------------------------------------------------------------------- /skins/elastic/templates/contactimport.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

:

4 | 5 |
6 | 7 |
8 | 9 | 10 | -------------------------------------------------------------------------------- /skins/elastic/templates/contactprint.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |