openship 0.4.4 → 0.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (318) hide show
  1. package/README.md +2 -24
  2. package/dist/bare-2HYDXQEH.js +23 -0
  3. package/dist/{bowser-MFQA6OS4.js → bowser-O3AEA6AN.js} +5 -1
  4. package/dist/{chunk-KD7VO4LG.js → chunk-2ZLR7ULL.js} +255 -65
  5. package/dist/{chunk-YHXCHW7Q.js → chunk-3JQTL4R4.js} +236 -99
  6. package/dist/{chunk-E77LJWJK.js → chunk-4TJC4JZQ.js} +20 -9
  7. package/dist/{chunk-YL67EWYZ.js → chunk-4Z5QO7N6.js} +6 -2
  8. package/dist/{chunk-WJPCBU7Z.js → chunk-5FNIWBFI.js} +10 -6
  9. package/dist/{chunk-Y37KHU7L.js → chunk-5MZ624VX.js} +5 -0
  10. package/dist/{chunk-QKFRZNKN.js → chunk-6APIPIJY.js} +8 -4
  11. package/dist/{chunk-JZLNHGLW.js → chunk-6APULWSU.js} +153 -133
  12. package/dist/{chunk-F4DFVG6Q.js → chunk-6B5YCFFV.js} +8 -4
  13. package/dist/{chunk-XVSAUO2I.js → chunk-AVIB7CT7.js} +5 -1
  14. package/dist/{chunk-TEYJYSMT.js → chunk-C5OHTYEF.js} +12 -6
  15. package/dist/{chunk-7UOB5GGQ.js → chunk-DYPH4HCI.js} +5 -0
  16. package/dist/{chunk-XIFRMKYT.js → chunk-EI575GHN.js} +6 -2
  17. package/dist/{chunk-4CQWT2WL.js → chunk-FPRHYBY2.js} +5 -0
  18. package/dist/chunk-FQGJZ2HS.js +248 -0
  19. package/dist/{chunk-JR2OCMJA.js → chunk-FRNAR33O.js} +6 -2
  20. package/dist/{chunk-JUJBBF5U.js → chunk-FXTBHTWY.js} +362 -42
  21. package/dist/chunk-ILFETZOM.js +131 -0
  22. package/dist/{chunk-5ZCKQ2MI.js → chunk-IXCHURVK.js} +7 -3
  23. package/dist/{chunk-6ERIMTBC.js → chunk-JYGD5WSN.js} +5 -0
  24. package/dist/{chunk-4VNS5WPM.js → chunk-KI2EY3WB.js} +4 -0
  25. package/dist/{chunk-3U4SPZD5.js → chunk-L2VOGB2X.js} +7 -104
  26. package/dist/{chunk-NB2VEIWG.js → chunk-MZ2WEHHY.js} +7 -3
  27. package/dist/{chunk-BUBSSKO6.js → chunk-O6ZZF52V.js} +5 -1
  28. package/dist/{chunk-LBFH7THC.js → chunk-OWED2GRM.js} +5 -1
  29. package/dist/{chunk-4MG3BVHE.js → chunk-OXWDY22G.js} +6 -2
  30. package/dist/{chunk-4FABQGQP.js → chunk-Q2CIRAOK.js} +5 -0
  31. package/dist/{chunk-4LEL3H2Z.js → chunk-RPHRPFEH.js} +5 -0
  32. package/dist/{chunk-46YJFP4S.js → chunk-SQ77DZOI.js} +1728 -1484
  33. package/dist/{chunk-S6DSRLNE.js → chunk-TGIINPVM.js} +15 -2
  34. package/dist/{chunk-U2DPZSXA.js → chunk-TYVME3XD.js} +9 -1
  35. package/dist/{chunk-HFYDYK4D.js → chunk-V6AN6XLZ.js} +18 -6
  36. package/dist/{chunk-ZKJOFWBJ.js → chunk-VDMQJHPI.js} +38 -15
  37. package/dist/{chunk-E6W2JMMU.js → chunk-VFINNTUL.js} +22 -1
  38. package/dist/{chunk-OJE6YWPQ.js → chunk-VWPEKOH6.js} +6 -2
  39. package/dist/{chunk-5N7VUGL6.js → chunk-W73X43R7.js} +6 -2
  40. package/dist/cloud-7QYOGF7F.js +11 -0
  41. package/dist/cloud-ZSKOS4GY.js +30 -0
  42. package/dist/detect-SH4FHFBI.js +36 -0
  43. package/dist/{dist-L3MPOWCA.js → dist-IQJ6H6UZ.js} +6 -2
  44. package/dist/{dist-es-KE56MWYO.js → dist-es-5DY7K32L.js} +9 -5
  45. package/dist/dist-es-JSTDUS7Q.js +26 -0
  46. package/dist/{dist-es-GTAMF674.js → dist-es-OSNJBLXB.js} +8 -4
  47. package/dist/{dist-es-NRZIQY5B.js → dist-es-RYHIPOTN.js} +17 -13
  48. package/dist/{dist-es-XQCOTGC7.js → dist-es-VNKHQVIB.js} +7 -3
  49. package/dist/{dist-es-WZCR7DHQ.js → dist-es-WV4AMOII.js} +11 -7
  50. package/dist/{dist-es-ZW3HFQUM.js → dist-es-X3B5QYKB.js} +9 -5
  51. package/dist/docker-U7AF5PTA.js +16 -0
  52. package/dist/docker-edge-executor-VHW3JPJS.js +13 -0
  53. package/dist/edge-import-V5CBA47C.js +45 -0
  54. package/dist/ensure-container-edge-CMYROUSI.js +33 -0
  55. package/dist/{event-streams-7LGDL56D.js → event-streams-EHRAKL75.js} +7 -3
  56. package/dist/executor-YPT6RH6O.js +30 -0
  57. package/dist/index.d.ts +2 -1
  58. package/dist/index.js +258 -245
  59. package/dist/{loadSso-N273C5I7.js → loadSso-46FQRIZS.js} +13 -9
  60. package/dist/local-executor-V7U5VOZW.js +12 -0
  61. package/dist/nginx-2GTRUIDE.js +24 -0
  62. package/dist/noop-FMMFG2EZ.js +11 -0
  63. package/dist/{openresty-lua-HAO4EUDY.js → openresty-lua-4WLGDSER.js} +13 -3
  64. package/dist/server/engine/ChangeLog +2289 -0
  65. package/dist/server/engine/Documentations +5 -0
  66. package/dist/server/engine/LICENSE +674 -0
  67. package/dist/server/engine/README.md +34 -0
  68. package/dist/server/engine/conf/amavisd +150 -0
  69. package/dist/server/engine/conf/clamav +71 -0
  70. package/dist/server/engine/conf/core +632 -0
  71. package/dist/server/engine/conf/dovecot +151 -0
  72. package/dist/server/engine/conf/fail2ban +72 -0
  73. package/dist/server/engine/conf/global +698 -0
  74. package/dist/server/engine/conf/iredapd +52 -0
  75. package/dist/server/engine/conf/logwatch +28 -0
  76. package/dist/server/engine/conf/postfix +97 -0
  77. package/dist/server/engine/conf/postgresql +93 -0
  78. package/dist/server/engine/conf/spamassassin +39 -0
  79. package/dist/server/engine/dialog/config_via_dialog.sh +258 -0
  80. package/dist/server/engine/dialog/optional_components.sh +122 -0
  81. package/dist/server/engine/dialog/pgsql_config.sh +52 -0
  82. package/dist/server/engine/dialog/virtual_domain_config.sh +94 -0
  83. package/dist/server/engine/functions/amavisd.sh +267 -0
  84. package/dist/server/engine/functions/backend.sh +85 -0
  85. package/dist/server/engine/functions/clamav.sh +100 -0
  86. package/dist/server/engine/functions/cleanup.sh +393 -0
  87. package/dist/server/engine/functions/dovecot.sh +583 -0
  88. package/dist/server/engine/functions/fail2ban.sh +209 -0
  89. package/dist/server/engine/functions/iredapd.sh +356 -0
  90. package/dist/server/engine/functions/optional_components.sh +24 -0
  91. package/dist/server/engine/functions/packages.sh +522 -0
  92. package/dist/server/engine/functions/packages_freebsd.sh +179 -0
  93. package/dist/server/engine/functions/postfix.sh +457 -0
  94. package/dist/server/engine/functions/postgresql.sh +239 -0
  95. package/dist/server/engine/functions/spamassassin.sh +49 -0
  96. package/dist/server/engine/functions/system_accounts.sh +128 -0
  97. package/dist/server/engine/iRedMail.sh +144 -0
  98. package/dist/server/engine/pkgs/get_all.sh +338 -0
  99. package/dist/server/engine/pkgs/pkgs.freebsd.sha256 +3 -0
  100. package/dist/server/engine/pkgs/pkgs.openbsd.sha256 +6 -0
  101. package/dist/server/engine/pkgs/pkgs.sha256 +1 -0
  102. package/dist/server/engine/samples/amavisd/amavisd.conf +677 -0
  103. package/dist/server/engine/samples/amavisd/amavisd.mysql +278 -0
  104. package/dist/server/engine/samples/amavisd/amavisd.pgsql +253 -0
  105. package/dist/server/engine/samples/amavisd/amavisd.schema +942 -0
  106. package/dist/server/engine/samples/amavisd/default_spam_policy.sql +46 -0
  107. package/dist/server/engine/samples/dovecot/dovecot-2.4-mariadb.conf +758 -0
  108. package/dist/server/engine/samples/dovecot/dovecot-2.4-openldap.conf +767 -0
  109. package/dist/server/engine/samples/dovecot/dovecot-2.4-pgsql.conf +762 -0
  110. package/dist/server/engine/samples/dovecot/dovecot-last-login.conf +50 -0
  111. package/dist/server/engine/samples/dovecot/dovecot-ldap.conf +21 -0
  112. package/dist/server/engine/samples/dovecot/dovecot-share-folder.conf +22 -0
  113. package/dist/server/engine/samples/dovecot/dovecot-sql.conf +28 -0
  114. package/dist/server/engine/samples/dovecot/dovecot-used-quota.conf +13 -0
  115. package/dist/server/engine/samples/dovecot/dovecot.conf +484 -0
  116. package/dist/server/engine/samples/dovecot/dovecot.sieve +7 -0
  117. package/dist/server/engine/samples/dovecot/dovecot2-quota-warning.sh +38 -0
  118. package/dist/server/engine/samples/dovecot/sql/imap_share_folder.mysql +16 -0
  119. package/dist/server/engine/samples/dovecot/sql/last_login.mysql +12 -0
  120. package/dist/server/engine/samples/dovecot/sql/used_quota.mysql +26 -0
  121. package/dist/server/engine/samples/dovecot/systemd/override.conf +3 -0
  122. package/dist/server/engine/samples/fail2ban/action.d/banned_db.conf +9 -0
  123. package/dist/server/engine/samples/fail2ban/bin/fail2ban_banned_db +268 -0
  124. package/dist/server/engine/samples/fail2ban/fail2ban.local +17 -0
  125. package/dist/server/engine/samples/fail2ban/filter.d/dovecot.iredmail.conf +5 -0
  126. package/dist/server/engine/samples/fail2ban/filter.d/postfix-pregreet.iredmail.conf +16 -0
  127. package/dist/server/engine/samples/fail2ban/filter.d/postfix.iredmail.conf +18 -0
  128. package/dist/server/engine/samples/fail2ban/filter.d/roundcube.iredmail.conf +9 -0
  129. package/dist/server/engine/samples/fail2ban/jail.d/dovecot.local +8 -0
  130. package/dist/server/engine/samples/fail2ban/jail.d/nginx-http-auth.local +8 -0
  131. package/dist/server/engine/samples/fail2ban/jail.d/postfix-pregreet.local +9 -0
  132. package/dist/server/engine/samples/fail2ban/jail.d/postfix.local +8 -0
  133. package/dist/server/engine/samples/fail2ban/jail.d/roundcube.local +9 -0
  134. package/dist/server/engine/samples/fail2ban/jail.d/sogo.local +8 -0
  135. package/dist/server/engine/samples/fail2ban/jail.d/sshd.local +8 -0
  136. package/dist/server/engine/samples/fail2ban/jail.local +6 -0
  137. package/dist/server/engine/samples/fail2ban/openbsd/rc +27 -0
  138. package/dist/server/engine/samples/fail2ban/sql/fail2ban.mysql +49 -0
  139. package/dist/server/engine/samples/fail2ban/sql/fail2ban.pgsql +48 -0
  140. package/dist/server/engine/samples/firewall/firewalld/services/ssh.xml +6 -0
  141. package/dist/server/engine/samples/firewall/firewalld/zones/iredmail.xml +15 -0
  142. package/dist/server/engine/samples/firewall/iptables/ip6tables.init.debian +362 -0
  143. package/dist/server/engine/samples/firewall/iptables/ip6tables.rules +53 -0
  144. package/dist/server/engine/samples/firewall/iptables/iptables.init.debian +363 -0
  145. package/dist/server/engine/samples/firewall/iptables/iptables.rules +54 -0
  146. package/dist/server/engine/samples/firewall/nftables.conf +58 -0
  147. package/dist/server/engine/samples/freebsd/newsyslog.conf.d/dovecot.conf +3 -0
  148. package/dist/server/engine/samples/freebsd/newsyslog.conf.d/iredapd.conf +1 -0
  149. package/dist/server/engine/samples/freebsd/newsyslog.conf.d/mlmmjadmin.conf +1 -0
  150. package/dist/server/engine/samples/freebsd/newsyslog.conf.d/php-fpm.conf +2 -0
  151. package/dist/server/engine/samples/freebsd/newsyslog.conf.d/slapd.conf +1 -0
  152. package/dist/server/engine/samples/freebsd/syslog.d/dovecot.conf +2 -0
  153. package/dist/server/engine/samples/freebsd/syslog.d/fail2ban.conf +2 -0
  154. package/dist/server/engine/samples/freebsd/syslog.d/iredapd.conf +2 -0
  155. package/dist/server/engine/samples/freebsd/syslog.d/mlmmjadmin.conf +2 -0
  156. package/dist/server/engine/samples/freebsd/syslog.d/php-fpm.conf +2 -0
  157. package/dist/server/engine/samples/freebsd/syslog.d/slapd.conf +2 -0
  158. package/dist/server/engine/samples/iredmail/iredmail.mysql +491 -0
  159. package/dist/server/engine/samples/iredmail/iredmail.pgsql +465 -0
  160. package/dist/server/engine/samples/iredmail/iredmail.schema +456 -0
  161. package/dist/server/engine/samples/iredmail/used_quota_triggers_dovecot_2.3.pgsql +40 -0
  162. package/dist/server/engine/samples/iredmail/used_quota_triggers_dovecot_2.4.pgsql +18 -0
  163. package/dist/server/engine/samples/logrotate/dovecot +13 -0
  164. package/dist/server/engine/samples/logrotate/iredapd +13 -0
  165. package/dist/server/engine/samples/logrotate/mlmmjadmin +13 -0
  166. package/dist/server/engine/samples/logrotate/openldap +19 -0
  167. package/dist/server/engine/samples/logrotate/php-fpm +13 -0
  168. package/dist/server/engine/samples/openbsd/ldapd.conf +58 -0
  169. package/dist/server/engine/samples/openbsd/pf.conf +28 -0
  170. package/dist/server/engine/samples/postfix/command_filter.pcre +3 -0
  171. package/dist/server/engine/samples/postfix/freebsd/mailer.conf +9 -0
  172. package/dist/server/engine/samples/postfix/helo_access.pcre +180 -0
  173. package/dist/server/engine/samples/postfix/ldap/catchall_maps.cf +11 -0
  174. package/dist/server/engine/samples/postfix/ldap/recipient_bcc_maps_domain.cf +11 -0
  175. package/dist/server/engine/samples/postfix/ldap/recipient_bcc_maps_user.cf +11 -0
  176. package/dist/server/engine/samples/postfix/ldap/relay_domains.cf +11 -0
  177. package/dist/server/engine/samples/postfix/ldap/sender_bcc_maps_domain.cf +11 -0
  178. package/dist/server/engine/samples/postfix/ldap/sender_bcc_maps_user.cf +11 -0
  179. package/dist/server/engine/samples/postfix/ldap/sender_dependent_relayhost_maps_domain.cf +11 -0
  180. package/dist/server/engine/samples/postfix/ldap/sender_dependent_relayhost_maps_user.cf +11 -0
  181. package/dist/server/engine/samples/postfix/ldap/sender_login_maps.cf +11 -0
  182. package/dist/server/engine/samples/postfix/ldap/transport_maps_domain.cf +11 -0
  183. package/dist/server/engine/samples/postfix/ldap/transport_maps_user.cf +11 -0
  184. package/dist/server/engine/samples/postfix/ldap/virtual_alias_maps.cf +11 -0
  185. package/dist/server/engine/samples/postfix/ldap/virtual_group_maps.cf +11 -0
  186. package/dist/server/engine/samples/postfix/ldap/virtual_group_members_maps.cf +11 -0
  187. package/dist/server/engine/samples/postfix/ldap/virtual_mailbox_domains.cf +11 -0
  188. package/dist/server/engine/samples/postfix/ldap/virtual_mailbox_maps.cf +12 -0
  189. package/dist/server/engine/samples/postfix/main.cf +282 -0
  190. package/dist/server/engine/samples/postfix/main.cf.amavisd +7 -0
  191. package/dist/server/engine/samples/postfix/main.cf.dovecot +8 -0
  192. package/dist/server/engine/samples/postfix/main.cf.ldap +39 -0
  193. package/dist/server/engine/samples/postfix/main.cf.mlmmj +5 -0
  194. package/dist/server/engine/samples/postfix/main.cf.mysql +39 -0
  195. package/dist/server/engine/samples/postfix/main.cf.pgsql +39 -0
  196. package/dist/server/engine/samples/postfix/main.cf.postscreen +30 -0
  197. package/dist/server/engine/samples/postfix/master.cf +87 -0
  198. package/dist/server/engine/samples/postfix/mysql/catchall_maps.cf +5 -0
  199. package/dist/server/engine/samples/postfix/mysql/domain_alias_catchall_maps.cf +5 -0
  200. package/dist/server/engine/samples/postfix/mysql/domain_alias_maps.cf +5 -0
  201. package/dist/server/engine/samples/postfix/mysql/recipient_bcc_maps_domain.cf +5 -0
  202. package/dist/server/engine/samples/postfix/mysql/recipient_bcc_maps_user.cf +5 -0
  203. package/dist/server/engine/samples/postfix/mysql/relay_domains.cf +5 -0
  204. package/dist/server/engine/samples/postfix/mysql/sender_bcc_maps_domain.cf +5 -0
  205. package/dist/server/engine/samples/postfix/mysql/sender_bcc_maps_user.cf +5 -0
  206. package/dist/server/engine/samples/postfix/mysql/sender_dependent_relayhost_maps.cf +6 -0
  207. package/dist/server/engine/samples/postfix/mysql/sender_login_maps.cf +5 -0
  208. package/dist/server/engine/samples/postfix/mysql/transport_maps_domain.cf +5 -0
  209. package/dist/server/engine/samples/postfix/mysql/transport_maps_maillist.cf +5 -0
  210. package/dist/server/engine/samples/postfix/mysql/transport_maps_user.cf +5 -0
  211. package/dist/server/engine/samples/postfix/mysql/virtual_alias_maps.cf +5 -0
  212. package/dist/server/engine/samples/postfix/mysql/virtual_mailbox_domains.cf +5 -0
  213. package/dist/server/engine/samples/postfix/mysql/virtual_mailbox_maps.cf +5 -0
  214. package/dist/server/engine/samples/postfix/pgsql/catchall_maps.cf +5 -0
  215. package/dist/server/engine/samples/postfix/pgsql/domain_alias_catchall_maps.cf +5 -0
  216. package/dist/server/engine/samples/postfix/pgsql/domain_alias_maps.cf +5 -0
  217. package/dist/server/engine/samples/postfix/pgsql/recipient_bcc_maps_domain.cf +5 -0
  218. package/dist/server/engine/samples/postfix/pgsql/recipient_bcc_maps_user.cf +5 -0
  219. package/dist/server/engine/samples/postfix/pgsql/relay_domains.cf +5 -0
  220. package/dist/server/engine/samples/postfix/pgsql/sender_bcc_maps_domain.cf +5 -0
  221. package/dist/server/engine/samples/postfix/pgsql/sender_bcc_maps_user.cf +5 -0
  222. package/dist/server/engine/samples/postfix/pgsql/sender_dependent_relayhost_maps.cf +6 -0
  223. package/dist/server/engine/samples/postfix/pgsql/sender_login_maps.cf +5 -0
  224. package/dist/server/engine/samples/postfix/pgsql/transport_maps_domain.cf +5 -0
  225. package/dist/server/engine/samples/postfix/pgsql/transport_maps_maillist.cf +5 -0
  226. package/dist/server/engine/samples/postfix/pgsql/transport_maps_user.cf +5 -0
  227. package/dist/server/engine/samples/postfix/pgsql/virtual_alias_maps.cf +5 -0
  228. package/dist/server/engine/samples/postfix/pgsql/virtual_mailbox_domains.cf +5 -0
  229. package/dist/server/engine/samples/postfix/pgsql/virtual_mailbox_maps.cf +5 -0
  230. package/dist/server/engine/samples/postfix/postscreen_access.cidr +6 -0
  231. package/dist/server/engine/samples/postgresql/sql/add_first_domain_and_user.sql +34 -0
  232. package/dist/server/engine/samples/postgresql/sql/grant_permissions.sql +14 -0
  233. package/dist/server/engine/samples/postgresql/sql/init_vmail_db.sql +15 -0
  234. package/dist/server/engine/samples/rsyslog.d/1-iredmail-dovecot.conf +23 -0
  235. package/dist/server/engine/samples/rsyslog.d/1-iredmail-fail2ban.conf +2 -0
  236. package/dist/server/engine/samples/rsyslog.d/1-iredmail-iredapd.conf +12 -0
  237. package/dist/server/engine/samples/rsyslog.d/1-iredmail-mlmmjadmin.conf +12 -0
  238. package/dist/server/engine/samples/rsyslog.d/1-iredmail-openldap.conf +2 -0
  239. package/dist/server/engine/samples/rsyslog.d/1-iredmail-phpfpm.conf +3 -0
  240. package/dist/server/engine/samples/spamassassin/local.cf +186 -0
  241. package/dist/server/engine/samples/spamassassin/razor.conf +1 -0
  242. package/dist/server/engine/samples/systemd/clamd.service.d/override.conf +2 -0
  243. package/dist/server/engine/samples/systemd/mariadb.service.d/override.conf +3 -0
  244. package/dist/server/engine/samples/systemd/slapd.service.d/override.conf +6 -0
  245. package/dist/server/engine/samples/yum/CentOS-Linux-AppStream.repo +6 -0
  246. package/dist/server/engine/samples/yum/CentOS-Linux-PowerTools.repo +6 -0
  247. package/dist/server/engine/samples/yum/CentOS-Stream-AppStream.repo +7 -0
  248. package/dist/server/engine/samples/yum/CentOS-Stream-PowerTools.repo +7 -0
  249. package/dist/server/engine/samples/yum/symas-openldap.repo +6 -0
  250. package/dist/server/engine/tools/add_enabled_service.py +60 -0
  251. package/dist/server/engine/tools/backup_mysql.sh +238 -0
  252. package/dist/server/engine/tools/backup_openldap.sh +230 -0
  253. package/dist/server/engine/tools/backup_pgsql.sh +217 -0
  254. package/dist/server/engine/tools/backup_sogo.sh +156 -0
  255. package/dist/server/engine/tools/create_mail_user_OpenLDAP.py +335 -0
  256. package/dist/server/engine/tools/create_mail_user_OpenLDAP.sh +287 -0
  257. package/dist/server/engine/tools/create_mail_user_SQL.sh +127 -0
  258. package/dist/server/engine/tools/enable_postscreen.sh +144 -0
  259. package/dist/server/engine/tools/fail2ban_unban_ip.sh +39 -0
  260. package/dist/server/engine/tools/find_sasl_login_ip.sh +20 -0
  261. package/dist/server/engine/tools/find_top_sasl_usernames.sh +28 -0
  262. package/dist/server/engine/tools/generate_ssl_keys.sh +85 -0
  263. package/dist/server/engine/tools/kill_high_cpu_sogo_process.sh +32 -0
  264. package/dist/server/engine/tools/ldap_assign_user_to_groups.py +151 -0
  265. package/dist/server/engine/tools/ldap_move_members_to_another_group.py +129 -0
  266. package/dist/server/engine/tools/migrate_sql_alias_table.py +177 -0
  267. package/dist/server/engine/update/0.9.8/amavisd.mysql +29 -0
  268. package/dist/server/engine/update/0.9.8/amavisd.pgsql +39 -0
  269. package/dist/server/engine/update/0.9.8/iredmail.mysql +53 -0
  270. package/dist/server/engine/update/0.9.8/iredmail.pgsql +61 -0
  271. package/dist/server/engine/update/0.9.9/iredmail.mysql +2 -0
  272. package/dist/server/engine/update/0.9.9/iredmail.pgsql +2 -0
  273. package/dist/server/engine/update/1.0/iredmail.mysql +2 -0
  274. package/dist/server/engine/update/1.0/iredmail.pgsql +2 -0
  275. package/dist/server/engine/update/1.2/last_login.mysql +16 -0
  276. package/dist/server/engine/update/1.4.0/iredmail.mysql +22 -0
  277. package/dist/server/engine/update/1.4.0/iredmail.pgsql +20 -0
  278. package/dist/server/engine/update/1.4.1/iredmail.mysql +3 -0
  279. package/dist/server/engine/update/1.4.1/iredmail.pgsql +3 -0
  280. package/dist/server/engine/update/1.4.1/sogo.mysql +11 -0
  281. package/dist/server/engine/update/1.4.1/sogo.pgsql +30 -0
  282. package/dist/server/engine/update/1.4.1/update-ldap.py +66 -0
  283. package/dist/server/engine/update/1.4.2/iredmail.mysql +9 -0
  284. package/dist/server/engine/update/1.4.2/iredmail.pgsql +9 -0
  285. package/dist/server/engine/update/1.4.2/sogo.pgsql +30 -0
  286. package/dist/server/engine/update/1.6.0/sogo_view.pgsql +27 -0
  287. package/dist/server/engine/update/1.6.3/iredmail.mysql +1 -0
  288. package/dist/server/engine/update/1.7.0/fail2ban.mysql +11 -0
  289. package/dist/server/engine/update/1.7.0/fail2ban.pgsql +12 -0
  290. package/dist/server/engine/update/1.7.1/amavisd.mysql +1 -0
  291. package/dist/server/engine/update/1.7.2/vmail.mysql +30 -0
  292. package/dist/server/engine/update/1.7.3/deleted_mailboxes.mysql +43 -0
  293. package/dist/server/engine/update/1.7.3/iredadmin.mysql +26 -0
  294. package/dist/server/engine/update/1.7.3/vmail.mysql +79 -0
  295. package/dist/server/engine/update/1.7.3/vmail.pgsql +9 -0
  296. package/dist/server/engine/update/README.md +1 -0
  297. package/dist/server/engine/update/ldap/README.md +40 -0
  298. package/dist/server/engine/update/ldap/update-ldap-dovecot-2.3.py +69 -0
  299. package/dist/server/index.js +55574 -53675
  300. package/dist/server/migrations/0071_gh_device_token.sql +3 -0
  301. package/dist/server/migrations/0072_gh_device_token_method.sql +1 -0
  302. package/dist/server/migrations/meta/_journal.json +14 -0
  303. package/dist/setup-HQIZLUOJ.js +20 -0
  304. package/dist/{signin-DR462ERO.js → signin-ITOPKKUB.js} +13 -9
  305. package/dist/{sso-oidc-VBZLJUK5.js → sso-oidc-NON2PD7Y.js} +13 -9
  306. package/dist/{sts-EJLZ4Z77.js → sts-HHFFSAY2.js} +12 -8
  307. package/package.json +1 -1
  308. package/dist/bare-ITM45QBX.js +0 -18
  309. package/dist/cloud-JMPHO3CW.js +0 -7
  310. package/dist/cloud-W5G6YXAY.js +0 -24
  311. package/dist/dist-es-4C322O5D.js +0 -22
  312. package/dist/docker-3FVJMFC3.js +0 -12
  313. package/dist/docker-edge-executor-ZIWAZWPL.js +0 -9
  314. package/dist/edge-import-Y34YL6JK.js +0 -39
  315. package/dist/executor-J7BHW5HF.js +0 -26
  316. package/dist/nginx-YZWKYKQU.js +0 -16
  317. package/dist/noop-RRNCIUI5.js +0 -7
  318. package/dist/setup-5X3WEEHA.js +0 -14
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Author: Zhang Huangbin (zhb _at_ iredmail.org)
4
+ # Purpose: Create new SSL keys.
5
+ # Project: iRedMail (http://www.iredmail.org/)
6
+
7
+ # USAGE:
8
+ # 1) Edit variables which starts with TLS_ below, then save file.
9
+ # 2) Execute shell command:
10
+ #
11
+ # # bash generate_ssl_keys.sh
12
+ #
13
+ # It will create two new files under CURRENT directory:
14
+ #
15
+ # - certs/iRedMail.crt: Used to replace file on iRedMail server:
16
+ # + on RHEL/CentOS/Scientific Linux: /etc/pki/tls/certs/iRedMail.crt
17
+ # + on Debian/Ubuntu: /etc/ssl/certs/iRedMail.crt
18
+ # + on FreeBSD: /etc/ssl/certs/iRedMail.crt
19
+ # - private/iRedMail.key: Used to replace file on iRedMail server:
20
+ # + on RHEL/CentOS/Scientific Linux: /etc/pki/tls/private/iRedMail.key
21
+ # + on Debian/Ubuntu: /etc/ssl/private/iRedMail.key
22
+ # + on FreeBSD: /etc/ssl/private/iRedMail.key
23
+ #
24
+ # 3) Grant read access to all users. e.g. on RHEL/CentOS/Scientific Linux:
25
+ #
26
+ # # chmod +r /etc/ssl/certs/iRedMail.crt
27
+ # # chmod +r /etc/ssl/private/iRedMail.key
28
+ #
29
+ # If you need more restrict file permission, please use file system ACL instead.
30
+ # Refer to command 'setfacl' and 'getfacl' for more detail.
31
+ #
32
+ # 4) Restart all services which provides SSL secure connection. e.g. http,
33
+ # dovecot, postfix, etc. A system reboot should be easier if possible.
34
+ #
35
+
36
+ export HOSTNAME="$(hostname -f)"
37
+
38
+ # SSL key related settings.
39
+ # Country.
40
+ export TLS_COUNTRY='CN'
41
+
42
+ # State.
43
+ export TLS_STATE='GuangDong'
44
+
45
+ # City.
46
+ export TLS_CITY='ShenZhen'
47
+
48
+ # Company name here, e.g. Apple Inc.
49
+ export TLS_COMPANY="${HOSTNAME}"
50
+
51
+ # Department name.
52
+ export TLS_DEPARTMENT='IT'
53
+
54
+ # Hostname of your mail server.
55
+ export TLS_HOSTNAME="${HOSTNAME}"
56
+
57
+ # Server admininistrator's email address.
58
+ export TLS_ADMIN="root@${HOSTNAME}"
59
+
60
+ # Do not edit below lines.
61
+ export ROOTDIR="$(pwd)"
62
+ export SSL_CERT_FILE="${ROOTDIR}/certs/iRedMail.crt"
63
+ export SSL_KEY_FILE="${ROOTDIR}/private/iRedMail.key"
64
+
65
+ # Create SSL certs/private files.
66
+ generate_ssl_keys()
67
+ {
68
+ # Create necessary directories.
69
+ mkdir -p {certs,private} 2>/dev/null
70
+
71
+ openssl req \
72
+ -x509 -nodes -days 3650 -newkey rsa:2048 \
73
+ -subj "/C=${TLS_COUNTRY}/ST=${TLS_STATE}/L=${TLS_CITY}/O=${TLS_COMPANY}/OU=${TLS_DEPARTMENT}/CN=${TLS_HOSTNAME}/emailAddress=${TLS_ADMIN}/" \
74
+ -out ${SSL_CERT_FILE} -keyout ${SSL_KEY_FILE} >/dev/null 2>&1
75
+
76
+ # Set correct file permission.
77
+ chmod 0444 ${SSL_CERT_FILE}
78
+ chmod 0444 ${SSL_KEY_FILE}
79
+ }
80
+
81
+ generate_ssl_keys && cat <<EOF
82
+ SSL keys were generated:
83
+ - ${SSL_CERT_FILE}
84
+ - ${SSL_KEY_FILE}
85
+ EOF
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # Purpose: Kill SOGo child processes which have been running too long, they
4
+ # may cause high CPU usage.
5
+ # Author: Zhang Huangbin <zhb@iredmail.org>
6
+ # Based on Jan-Frode Myklebust's script published on 04 Apr 2013:
7
+ # https://www.mail-archive.com/users@sogo.nu/msg14152.html
8
+
9
+ # Allow to run for how long (in minutes). e.g. 15, 25.
10
+ LONGEST=10
11
+
12
+ # Kill a pid.
13
+ k() {
14
+ # Usage: k <pid>
15
+ pid="${1}"
16
+
17
+ echo "Killing PID $pid"
18
+ ps -fp $pid
19
+ kill -9 $pid
20
+ }
21
+
22
+ ps -u sogo -opid,ppid,cputime | grep -v PPID | while read pid ppid time; do
23
+ # Don't kill main daemon (ppid=1).
24
+ if [[ X"$ppid" != X"1" ]]; then
25
+ hours="$(echo $time | cut -d: -f1 | sed 's/^0//')"
26
+ minutes="$(echo $time | cut -d: -f2 | sed 's/^0//')"
27
+
28
+ if [[ $minutes -gt ${LONGEST} ]] || [[ $hours -gt 0 ]]; then
29
+ k ${pid}
30
+ fi
31
+ fi
32
+ done
@@ -0,0 +1,151 @@
1
+ #!/usr/bin/env python3
2
+ # encoding: utf-8
3
+
4
+ # Author: Zhang Huangbin <zhb _at_ iredmail.org>
5
+ # Purpose: Assign one user to specified groups.
6
+
7
+ # USAGE
8
+ #
9
+ # * Set correct LDAP server address (LDAP_URI), LDAP suffix (LDAP_SUFFIX),
10
+ # bind dn (BINDDN) and password (BINDPW).
11
+ #
12
+ # * Run this script:
13
+ #
14
+ # $ python3 ldap_assign_user_to_groups.py [options] user@domain.com group@domain.com [group2@domain.com ...]
15
+
16
+ # LDAP server address.
17
+ LDAP_URI = 'ldap://127.0.0.1:389'
18
+ LDAP_SUFFIX = 'dc=example,dc=com'
19
+
20
+ # LDAP base dn, bind dn/password.
21
+ BASEDN = 'o=domains,%s' % LDAP_SUFFIX
22
+ BINDDN = 'cn=Manager,%s' % LDAP_SUFFIX
23
+ BINDPW = 'www'
24
+
25
+
26
+ import sys
27
+ import ldap
28
+
29
+ def usage():
30
+ print("""Usage:
31
+
32
+ $ python3 ldap_assign_user_to_groups.py [options] user@domain.com new_group@domain.com [new_group_2@domain.com ...]
33
+
34
+ Note: Non-existing group will be ignored.
35
+
36
+ Optional arguments:
37
+
38
+ --remove Remove memberships. If no mailing list specified, it will remove
39
+ ALL assigned mailing lists.
40
+
41
+ Samples:
42
+
43
+ *) Remove all memberships:
44
+ python3 ldap_assign_user_to_groups.py --remove user@domain.com
45
+
46
+ *) Remove memberships of specified mailing lists:
47
+ python3 ldap_assign_user_to_groups.py --remove user@domain.com group1@domain.com group2@domain.com
48
+
49
+ *) Assign user to new mailing lists:
50
+ python3 ldap_assign_user_to_groups.py user@domain.com group1@domain.com group2@domain.com
51
+ """)
52
+
53
+
54
+ if len(sys.argv) < 3:
55
+ usage()
56
+ sys.exit()
57
+
58
+ args = sys.argv
59
+ args.pop(0)
60
+
61
+ is_remove = False
62
+ if '--remove' in args:
63
+ args.remove('--remove')
64
+ is_remove = True
65
+
66
+ user = args.pop(0)
67
+ groups = args
68
+
69
+ if not groups and not is_remove:
70
+ print("<<< ERROR >>> No group specified.")
71
+ usage()
72
+ sys.exit()
73
+
74
+ print("* Connecting to LDAP server: %s" % LDAP_URI)
75
+ conn = ldap.initialize(uri=LDAP_URI, trace_level=0)
76
+ conn.bind_s(BINDDN, BINDPW)
77
+
78
+ if not is_remove:
79
+ print("* Querying existing mailing lists.")
80
+
81
+ qr_filter = '(&(objectClass=mailList)(|'
82
+ for g in groups:
83
+ qr_filter += '(mail=%s)(shadowAddress=%s)' % (g, g)
84
+ qr_filter += '))'
85
+
86
+ print("* Query filter:", qr_filter)
87
+
88
+ qr = conn.search_s(BASEDN,
89
+ ldap.SCOPE_SUBTREE,
90
+ qr_filter,
91
+ ['mail'])
92
+
93
+ if qr:
94
+ groups = []
95
+ for (dn, entry) in qr:
96
+ groups += entry['mail']
97
+
98
+ print("* Found %d mailing list(s)." % len(groups))
99
+ else:
100
+ sys.exit("* No specified groups found in LDAP.")
101
+
102
+ print("* Get user's dn and membership of mailing list(s).")
103
+ (user_name, domain) = user.split('@', 1)
104
+ user_dn = 'mail=%s,ou=Users,domainName=%s,%s' % (user, domain, BASEDN)
105
+ try:
106
+ qr = conn.search_s(user_dn,
107
+ ldap.SCOPE_BASE,
108
+ '(mail=%s)' % user,
109
+ ['mail', 'memberOfGroup'])
110
+ except ldap.NO_SUCH_OBJECT:
111
+ print("* <<< ERROR >>> User doesn't exist: %s" % user)
112
+ sys.exit()
113
+
114
+ (dn, entry) = qr[0]
115
+
116
+ # Get existing, assigned mailing lists.
117
+ existing_groups = entry.get('memberOfGroup', [])
118
+ if existing_groups:
119
+ print("* Existing membership: %s" % ', '.join(existing_groups))
120
+ else:
121
+ print("* User is not member of any mailing list.")
122
+
123
+ # New groups
124
+ if is_remove:
125
+ if groups:
126
+ print("* Remove membership: %s" % ', '.join(groups))
127
+ new_groups = list(set(existing_groups) - set(groups))
128
+ else:
129
+ print("* Remove ALL memberships.")
130
+ new_groups = []
131
+
132
+ # Set to None to remove attribute `memberOfGroup`
133
+ if not new_groups:
134
+ print("* No membership left, remove attribute `memberOfGroup`.")
135
+ new_groups = None
136
+ else:
137
+ new_groups = list(set(existing_groups + groups))
138
+ print("* New membership: %s" % ', '.join(new_groups))
139
+
140
+ mod_attrs = [(ldap.MOD_REPLACE, 'memberOfGroup', new_groups)]
141
+
142
+ try:
143
+ print("* Updating membership.")
144
+ conn.modify_s(dn, mod_attrs)
145
+ print("* Updated.")
146
+
147
+ # Unbind connection.
148
+ print("* Unbind LDAP server.")
149
+ conn.unbind()
150
+ except Exception as e:
151
+ print("<<< ERROR >>> %s" % repr(e))
@@ -0,0 +1,129 @@
1
+ #!/usr/bin/env python3
2
+ # encoding: utf-8
3
+
4
+ # Author: Zhang Huangbin <zhb _at_ iredmail.org>
5
+ # Purpose: Move or copy ALL members of specified mailing list to another
6
+ # mailing list.
7
+
8
+ # USAGE
9
+ #
10
+ # * Set correct LDAP server address (LDAP_URI), LDAP suffix (LDAP_SUFFIX),
11
+ # bind dn (BINDDN) and password (BINDPW).
12
+ #
13
+ # * Run this script:
14
+ #
15
+ # $ python3 ldap_move_members_to_another_group.py [options] old_group@domain.com new_group@domain.com [new_group2@domain.com ...]
16
+
17
+ # LDAP server address.
18
+ LDAP_URI = 'ldap://127.0.0.1:389'
19
+ LDAP_SUFFIX = 'dc=example,dc=com'
20
+
21
+ # LDAP base dn, bind dn/password.
22
+ BASEDN = 'o=domains,%s' % LDAP_SUFFIX
23
+ BINDDN = 'cn=Manager,%s' % LDAP_SUFFIX
24
+ BINDPW = 'www'
25
+
26
+
27
+ import sys
28
+ import ldap
29
+
30
+ def usage():
31
+ print("""Usage:
32
+
33
+ $ python3 ldap_move_members_to_another_group.py [options] old_group@domain.com [new_group@domain.com new_group_2@domain.com ...]
34
+
35
+ Available optional options:
36
+
37
+ --copy Assign members of old group to new groups without removing
38
+ membership of old group. That means user will be member of both
39
+ old and new groups.
40
+
41
+ If no --copy specified, this script will remove membership of old
42
+ group.
43
+
44
+ Samples:
45
+
46
+ *) Copy all members of old_group@domain.com to new_group@domain.com
47
+ python3 ldap_move_members_to_another_group --copy old_group@domain.com new_group@domain.com
48
+
49
+ *) Copy all members of old_group@domain.com to new_group@domain.com, and remove
50
+ ALL members of old_group@domain.com.
51
+ python3 ldap_move_members_to_another_group old_group@domain.com new_group@domain.com
52
+
53
+ *) Remove all members (just remove membership, not remove mail accounts) of
54
+ old_group@domain.com.
55
+ python3 ldap_move_members_to_another_group old_group@domain.com
56
+ """)
57
+
58
+
59
+ if len(sys.argv) < 3:
60
+ usage()
61
+ sys.exit()
62
+
63
+ args = sys.argv
64
+ args.pop(0)
65
+
66
+ is_copy = False
67
+ if '--copy' in args:
68
+ is_copy = True
69
+ args.remove('--copy')
70
+
71
+ old_group = args.pop(0)
72
+ new_groups = args
73
+
74
+ # Initialize LDAP connection.
75
+ print("* Connecting to LDAP server: %s" % LDAP_URI)
76
+ conn = ldap.initialize(uri=LDAP_URI, trace_level=0)
77
+ conn.bind_s(BINDDN, BINDPW)
78
+
79
+ # Get all members of old mailing list.
80
+ print("* Get all members of old mailing list: %s" % old_group)
81
+
82
+ qr_filter = '(&(objectClass=mailUser)(memberOfGroup=%s))' % old_group
83
+ print("* Query filter:", qr_filter)
84
+
85
+ qr = conn.search_s(BASEDN,
86
+ ldap.SCOPE_SUBTREE,
87
+ qr_filter,
88
+ ['memberOfGroup'])
89
+
90
+ total = len(qr)
91
+
92
+ if total:
93
+ print("* Old mailing list has %d member(s)." % total)
94
+ else:
95
+ sys.exit("* Old mailing list doesn't have any member. Exit.")
96
+
97
+ # accumulate counter
98
+ count = 1
99
+
100
+ for user in qr:
101
+ (dn, entry) = user
102
+
103
+ # Get all assigned mailing lists.
104
+ groups = entry['memberOfGroup']
105
+
106
+ if not is_copy:
107
+ # Remove old mailing list
108
+ groups.remove(old_group)
109
+
110
+ # Assign to new mailing list
111
+ if new_groups:
112
+ groups = list(set(groups + new_groups))
113
+
114
+ # Use only value of rdn.
115
+ mod_attrs = [(ldap.MOD_REPLACE, 'memberOfGroup', groups)]
116
+
117
+ try:
118
+ print("* (%d of %d) Updating object: %s" % (count, total, dn))
119
+ conn.modify_s(dn, mod_attrs)
120
+ except Exception as e:
121
+ print("<<< ERROR >>> %s" % repr(e))
122
+
123
+ count += 1
124
+
125
+ # Unbind connection.
126
+ print("* Unbind LDAP server.")
127
+ conn.unbind()
128
+
129
+ print("* Done.")
@@ -0,0 +1,177 @@
1
+ #!/usr/bin/env python3
2
+ # This file is used to migrate SQL table `vmail.alias` for SQL backends.
3
+ #
4
+ # Requirements:
5
+ #
6
+ # * Python 3
7
+ # * Make sure you have new SQL tables ready: alias_moderators, forwardings.
8
+ # * For PostgreSQL, please make sure SQL user 'vmail' has 'SELECT' privilege on
9
+ # newly created sql tables.
10
+
11
+ import sys
12
+ import web
13
+
14
+ web.config.debug = False
15
+
16
+ # Read iRedAdmin config file `settings.py` from one of expected paths
17
+ sys.path.insert(0, '/usr/local/www/iredadmin') # FreeBSD
18
+ sys.path.insert(0, '/opt/www/iredadmin') # Debian/Ubuntu
19
+ sys.path.insert(0, '/var/www/iredadmin') # CentOS/OpenBSD
20
+ sys.path.insert(0, '/usr/share/apache2/iredadmin') # Debian/Ubuntu (old iRedMail releases)
21
+
22
+ import settings
23
+ print("* Read SQL username/password from iRedAdmin config file:", settings.__file__)
24
+ print("* Backend:", settings.backend)
25
+
26
+ if settings.backend in ['ldap', 'mysql']:
27
+ sql_dbn = 'mysql'
28
+ elif settings.backend in ['pgsql']:
29
+ sql_dbn = 'postgres'
30
+ else:
31
+ sys.exit('* << ERROR >>: Unsupported backend (%s).' % settings.backend)
32
+
33
+ try:
34
+ if sql_dbn == 'postgres':
35
+ db = web.database(dbn=sql_dbn,
36
+ host=settings.vmail_db_host,
37
+ port=int(settings.vmail_db_port),
38
+ db=settings.vmail_db_name,
39
+ user=settings.vmail_db_user,
40
+ pw=settings.vmail_db_password)
41
+ else:
42
+ db = web.database(dbn=sql_dbn,
43
+ host=settings.vmail_db_host,
44
+ port=int(settings.vmail_db_port),
45
+ db=settings.vmail_db_name,
46
+ user=settings.vmail_db_user,
47
+ pw=settings.vmail_db_password,
48
+ charset='utf8',
49
+ use_unicode=False)
50
+
51
+ db.supports_multiple_insert = True
52
+ except Exception as e:
53
+ print("<< ERROR >> Cannot connecting to SQL server:", e)
54
+ sys.exit()
55
+
56
+ def __bytes2str(b) -> str:
57
+ """Convert object `b` to string."""
58
+ if isinstance(b, str):
59
+ return b
60
+
61
+ if isinstance(b, (bytes, bytearray)):
62
+ return b.decode()
63
+ elif isinstance(b, memoryview):
64
+ return b.tobytes().decode()
65
+ else:
66
+ return repr(b)
67
+
68
+
69
+ def bytes2str(b):
70
+ """Convert `b` from bytes-like type to string."""
71
+ if isinstance(b, (list, web.db.ResultSet)):
72
+ s = [bytes2str(i) for i in b]
73
+ elif isinstance(b, tuple):
74
+ s = tuple([bytes2str(i) for i in b])
75
+ elif isinstance(b, set):
76
+ s = {bytes2str(i) for i in b}
77
+ elif isinstance(b, (dict, web.utils.Storage)):
78
+ new_dict = {}
79
+ for (k, v) in list(b.items()):
80
+ new_dict[k] = bytes2str(v) # v could be list/tuple/dict
81
+ s = new_dict
82
+ else:
83
+ s = __bytes2str(b)
84
+
85
+ return s
86
+
87
+
88
+ # Check required tables
89
+ for tbl in ['forwardings', 'alias_moderators']:
90
+ try:
91
+ db.select(tbl, limit=1)
92
+ except:
93
+ print("<<< ERROR >>> SQL table '%s' doesn't exist. Please create it first." % tbl)
94
+ sys.exit()
95
+
96
+ # Get all existing accounts
97
+ records = db.select('alias', what='address,goto,moderators,domain,active,islist,is_alias')
98
+
99
+ total = len(records)
100
+ counter = 1
101
+ for r in records:
102
+ # standard mail alias account
103
+ is_list = 0
104
+ # per-account alias address
105
+ is_alias = 0
106
+ # forwarding addresses of mail user
107
+ is_forwarding = 0
108
+
109
+ if r.islist == 1:
110
+ is_list = 1
111
+ _type = 'mail alias'
112
+ elif r.is_alias == 1:
113
+ is_alias = 1
114
+ _type = 'per-account alias address'
115
+ else:
116
+ is_forwarding = 1
117
+ _type = 'mail user'
118
+
119
+ account = bytes2str(r.address).lower()
120
+ active = int(r.active)
121
+ domain = bytes2str(r.domain).lower()
122
+
123
+ goto = bytes2str(r.goto).strip(' ')
124
+ goto = goto.replace(' ', '')
125
+ goto = goto.replace(';', ',')
126
+ members = list(set([i.strip().lower() for i in goto.strip(' ').split(',')]))
127
+
128
+ # Migrating forwardings
129
+ print("* [%d/%d] Migrating %s %s" % (counter, total, _type, account))
130
+ for m in members:
131
+ if m:
132
+ try:
133
+ dest_domain = m.split('@', 1)[-1]
134
+
135
+ db.insert('forwardings',
136
+ address=account,
137
+ forwarding=m,
138
+ domain=domain,
139
+ dest_domain=dest_domain,
140
+ active=active,
141
+ is_list=is_list,
142
+ is_alias=is_alias,
143
+ is_forwarding=is_forwarding)
144
+
145
+ except Exception as e:
146
+ if e[0] == 1062 or 'duplicate' in repr(e):
147
+ # Duplicate record
148
+ pass
149
+ else:
150
+ print("Error while migrating %s %s: %s" % (_type, m, repr(e)))
151
+
152
+ # Migrating moderators of mail alias account
153
+ moderators = []
154
+ if is_list == 1:
155
+ if r.moderators:
156
+ moderators = [i.lower() for i in set(r.moderators.strip(' ').split(','))]
157
+
158
+ if moderators:
159
+ for m in moderators:
160
+ try:
161
+ dest_domain = m.split('@', 1)[-1]
162
+
163
+ db.insert('alias_moderators',
164
+ address=account,
165
+ moderator=m,
166
+ domain=domain,
167
+ dest_domain=dest_domain)
168
+ except Exception as e:
169
+ if e[0] == 1062 or 'duplicate' in repr(e):
170
+ # Duplicate record
171
+ pass
172
+ else:
173
+ print("Error while migrating moderators of alias account %s: %s" % (m, repr(e)))
174
+
175
+ counter += 1
176
+
177
+ print("* DONE.")
@@ -0,0 +1,29 @@
1
+ -- If subject contains emoji, varchar doesn't work well.
2
+ ALTER TABLE msgs MODIFY COLUMN subject VARBINARY(255) DEFAULT '';
3
+ ALTER TABLE msgs MODIFY COLUMN from_addr VARBINARY(255) DEFAULT '';
4
+
5
+ -- mail address without address extension: user+abc@domain.com -> user@domain.com
6
+ ALTER TABLE maddr ADD COLUMN email_raw varbinary(255) NOT NULL DEFAULT '';
7
+
8
+ -- index
9
+ CREATE INDEX maddr_idx_email_raw ON maddr (email_raw);
10
+
11
+ -- Create trigger to save email address withou address extension
12
+ -- user+abc@domain.com -> user@domain.com
13
+ DELIMITER //
14
+ CREATE TRIGGER `maddr_email_raw`
15
+ BEFORE INSERT
16
+ ON `maddr`
17
+ FOR EACH ROW
18
+ BEGIN
19
+ IF (NEW.email LIKE '%+%') THEN
20
+ SET NEW.email_raw = CONCAT(SUBSTRING_INDEX(NEW.email, '+', 1), '@', SUBSTRING_INDEX(new.email, '@', -1));
21
+ ELSE
22
+ SET NEW.email_raw = NEW.email;
23
+ END IF;
24
+ END;
25
+ //
26
+ DELIMITER ;
27
+
28
+ -- Update all existing records.
29
+ UPDATE maddr SET email_raw=email WHERE email_raw='';
@@ -0,0 +1,39 @@
1
+ -- If subject/from_addr contains emoji, varchar doesn't work well.
2
+ ALTER TABLE msgs ALTER COLUMN subject DROP DEFAULT;
3
+ ALTER TABLE msgs ALTER COLUMN subject TYPE bytea USING subject::bytea;
4
+ ALTER TABLE msgs ALTER COLUMN subject SET DEFAULT '';
5
+
6
+ ALTER TABLE msgs ALTER COLUMN from_addr DROP DEFAULT;
7
+ ALTER TABLE msgs ALTER COLUMN from_addr TYPE bytea USING subject::bytea;
8
+ ALTER TABLE msgs ALTER COLUMN from_addr SET DEFAULT '';
9
+
10
+ -- mail address without address extension: user+abc@domain.com -> user@domain.com
11
+ ALTER TABLE maddr ADD COLUMN email_raw VARCHAR(255) NOT NULL DEFAULT '';
12
+
13
+ -- index
14
+ CREATE INDEX maddr_idx_email ON maddr (email);
15
+ CREATE INDEX maddr_idx_email_raw ON maddr (email_raw);
16
+ CREATE INDEX maddr_idx_domain ON maddr (domain);
17
+
18
+ -- Create trigger to save email address withou address extension
19
+ -- user+abc@domain.com -> user@domain.com
20
+ -- CREATE OR REPLACE FUNCTION strip_addr_extension(bytea, varchar, integer) RETURNS TRIGGER AS $$
21
+ CREATE OR REPLACE FUNCTION strip_addr_extension()
22
+ RETURNS TRIGGER AS $$
23
+ BEGIN
24
+ IF (NEW.email LIKE '%+%') THEN
25
+ NEW.email_raw := split_part(convert_from(NEW.email, 'UTF8'), '+', 1) || '@' || split_part(convert_from(NEW.email, 'UTF8'), '@', 2);
26
+ ELSE
27
+ NEW.email_raw := convert_from(NEW.email, 'UTF8');
28
+ END IF;
29
+ RETURN NEW;
30
+ END;
31
+ $$ LANGUAGE plpgsql;
32
+
33
+ CREATE TRIGGER maddr_email_raw
34
+ BEFORE INSERT ON maddr
35
+ FOR EACH ROW
36
+ EXECUTE PROCEDURE strip_addr_extension();
37
+
38
+ -- Update all existing records.
39
+ UPDATE maddr SET email_raw=email WHERE email_raw='';
@@ -0,0 +1,53 @@
1
+ -- USE vmail;
2
+
3
+ -- DROP column
4
+ ALTER TABLE mailbox DROP COLUMN local_part;
5
+
6
+ -- New SQL column
7
+ ALTER TABLE mailbox ADD COLUMN enableimaptls TINYINT(1) NOT NULL DEFAULT 1;
8
+ ALTER TABLE mailbox ADD INDEX (enableimaptls);
9
+ ALTER TABLE mailbox ADD COLUMN enablepop3tls TINYINT(1) NOT NULL DEFAULT 1;
10
+ ALTER TABLE mailbox ADD INDEX (enablepop3tls);
11
+ ALTER TABLE mailbox ADD COLUMN enablesievetls TINYINT(1) NOT NULL DEFAULT 1;
12
+ ALTER TABLE mailbox ADD INDEX (enablesievetls);
13
+
14
+ -- Rename table
15
+ RENAME TABLE alias_moderators TO moderators;
16
+
17
+ -- Column used to limit number of mailing lists a domain admin can create
18
+ ALTER TABLE domain ADD COLUMN maillists INT(10) NOT NULL DEFAULT 0;
19
+
20
+ -- Column used to mark sql record is a mailing list
21
+ ALTER TABLE forwardings ADD COLUMN `is_maillist` TINYINT(1) NOT NULL DEFAULT 0;
22
+ ALTER TABLE forwardings ADD INDEX (`is_maillist`);
23
+
24
+ -- Table used to store mailing list accounts
25
+ CREATE TABLE IF NOT EXISTS maillists (
26
+ id BIGINT(20) UNSIGNED AUTO_INCREMENT,
27
+ address VARCHAR(255) NOT NULL DEFAULT '',
28
+ domain VARCHAR(255) NOT NULL DEFAULT '',
29
+ -- Per mailing list transport. for example: 'mlmmj:example.com/listname'.
30
+ transport VARCHAR(255) NOT NULL DEFAULT '',
31
+ accesspolicy VARCHAR(30) NOT NULL DEFAULT '',
32
+ maxmsgsize BIGINT(20) NOT NULL DEFAULT 0,
33
+ -- name of the mailing list
34
+ name VARCHAR(255) NOT NULL DEFAULT '',
35
+ -- short introduction of the mailing list on subscription page
36
+ description TEXT,
37
+ -- a server-wide unique id (a 36-characters string) for each mailing list
38
+ mlid VARCHAR(36) NOT NULL DEFAULT '',
39
+ -- control whether newsletter-style subscription from website is enabled
40
+ -- 1 -> enabled, 0 -> disabled
41
+ is_newsletter TINYINT(1) NOT NULL DEFAULT 0,
42
+ settings TEXT,
43
+ created DATETIME NOT NULL DEFAULT '1970-01-01 01:01:01',
44
+ modified DATETIME NOT NULL DEFAULT '1970-01-01 01:01:01',
45
+ expired DATETIME NOT NULL DEFAULT '9999-12-31 00:00:00',
46
+ active TINYINT(1) NOT NULL DEFAULT 1,
47
+ PRIMARY KEY (id),
48
+ UNIQUE INDEX (address),
49
+ UNIQUE INDEX (mlid),
50
+ INDEX (is_newsletter),
51
+ INDEX (domain),
52
+ INDEX (active)
53
+ ) ENGINE=InnoDB;