smartmachine 1.3.0 → 1.3.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5103e5b3902c6f7cf9e295547ff6a5fd43682c9ca11f4d740a5b193fc09a2090
4
- data.tar.gz: c99f47d9287341f7960223dfcbd44feeacdfdaed16cbf15215865d370706c3f8
3
+ metadata.gz: 77a473a51fb2d59eaf9ac27e62ca6564a078d3785f7aebcc7154d3199b034668
4
+ data.tar.gz: b3585bff1d2bc40cddd557c4876507f7c3fd99d90c55cfc6bfe3d34737341fe4
5
5
  SHA512:
6
- metadata.gz: 93e8261b8739b1cc1a2fa3d0400ea8c2e4bbf0b10ec3ce697ef5597b61177fd0de253dbd47e49cd5411f172c4edfd87d73e9e40ea520569d74a8c7086444b1d0
7
- data.tar.gz: 35abb8c1171082c17b76d277d2f77f9404c6888910b00be89cfb775ea702cec73085c017f3a8c70515c80b837c7c20bbc0f681a405247e25ad46d5ffd3ca9741
6
+ metadata.gz: 83d98d2d1ee25354e75a7beacb27d32d7c29000694149d56596e5595a6cc40bdbb1c35c3224eb4be5751606f451e7d862c4e4ff32800b6fd56a4a47ce4790ee3
7
+ data.tar.gz: 27e7660555110321dfb73b0d5217d288465aef2080547c4ab540a85faa14b878107156a8458f7654b4e65017ca6fd4cf96b8d5f54cd13f18a9b29c215bf1514f
@@ -47,6 +47,7 @@ module SmartMachine
47
47
 
48
48
  ## Docker
49
49
  VIRTUAL_HOST=#{@appname}.#{appdomain}
50
+ VIRTUAL_PATH=/
50
51
  LETSENCRYPT_HOST=#{@appname}.#{appdomain}
51
52
  LETSENCRYPT_EMAIL=#{@username}
52
53
  LETSENCRYPT_TEST=false
@@ -91,8 +91,8 @@ module SmartMachine
91
91
  poppler-utils && \
92
92
  rm -rf /var/lib/apt/lists/* && \
93
93
  # ImageMagick 7. Remove this after its dependency is gone from ruby on rails.
94
- cd /opt && wget https://download.imagemagick.org/archive/releases/ImageMagick-7.1.1-29.tar.gz && \
95
- tar xvzf ImageMagick-7.1.1-29.tar.gz && \
94
+ cd /opt && wget https://download.imagemagick.org/archive/releases/ImageMagick-7.1.1-29.tar.xz && \
95
+ tar xvJf ImageMagick-7.1.1-29.tar.xz && \
96
96
  cd ImageMagick-7.1.1-29 && \
97
97
  ./configure && \
98
98
  make && \
@@ -4,6 +4,30 @@ module SmartMachine
4
4
  class Roundcube < SubThor
5
5
  include Utilities
6
6
 
7
+ desc "install", "Install roundcube grid"
8
+ def install
9
+ inside_machine_dir do
10
+ with_docker_running do
11
+ puts "-----> Installing Roundcube"
12
+ machine = SmartMachine::Machine.new
13
+ machine.run_on_machine commands: "smartengine grid roundcube installer"
14
+ puts "-----> Roundcube Installation Complete"
15
+ end
16
+ end
17
+ end
18
+
19
+ desc "uninstall", "Uninstall roundcube grid"
20
+ def uninstall
21
+ inside_machine_dir do
22
+ with_docker_running do
23
+ puts "-----> Uninstalling Roundcube"
24
+ machine = SmartMachine::Machine.new
25
+ machine.run_on_machine commands: "smartengine grid roundcube uninstaller"
26
+ puts "-----> Roundcube Uninstallation Complete"
27
+ end
28
+ end
29
+ end
30
+
7
31
  desc "up", "Take UP the roundcube grid"
8
32
  option :name, type: :string
9
33
  def up
@@ -28,6 +52,24 @@ module SmartMachine
28
52
  end
29
53
  end
30
54
 
55
+ desc "installer", "Roundcube grid installer", hide: true
56
+ def installer
57
+ inside_engine_machine_dir do
58
+ name, config = SmartMachine.config.grids.roundcube.first
59
+ roundcube = SmartMachine::Grids::Roundcube.new(name: name.to_s)
60
+ roundcube.installer
61
+ end
62
+ end
63
+
64
+ desc "uninstaller", "Roundcube grid uninstaller", hide: true
65
+ def uninstaller
66
+ inside_engine_machine_dir do
67
+ name, config = SmartMachine.config.grids.roundcube.first
68
+ roundcube = SmartMachine::Grids::Roundcube.new(name: name.to_s)
69
+ roundcube.uninstaller
70
+ end
71
+ end
72
+
31
73
  desc "uper", "Roundcube grid uper", hide: true
32
74
  option :name, type: :string
33
75
  def uper
@@ -28,7 +28,7 @@ module SmartMachine
28
28
 
29
29
  puts "-----> Creating image for Engine ... "
30
30
  command = [
31
- "docker image build --quiet --tag #{engine_image_name_with_version}",
31
+ "docker image build --tag #{engine_image_name_with_version}",
32
32
  "--build-arg TZDATA_TIMEZONE='#{SmartMachine.config.engine.dig(:engineone).dig(:timezone)}'",
33
33
  "--build-arg SMARTMACHINE_MASTER_KEY=#{SmartMachine::Credentials.new.read_key}",
34
34
  "--build-arg USER_NAME=`id -un`",
@@ -0,0 +1,7 @@
1
+ # TODO: Add imapsync feature to emailer.
2
+ # https://imapsync.lamiral.info
3
+ # https://hub.docker.com/r/gilleslamiral/imapsync/
4
+ # docker run --rm --network=networkone gilleslamiral/imapsync imapsync --host1 <hostname> --user1 <email> --password1 <password> --host2 <hostname> --user2 <email> --password2 <password> --addheader --useheader Message-Id
5
+ # Add the following options to delete messages and then their respective folders on the host1 server.
6
+ # --delete1 --delete1emptyfolders --noexpungeaftereach
7
+ # Display Message to User: For Specific IMAP Server Tips go to https://imapsync.lamiral.info/#doc
@@ -6,7 +6,7 @@ module SmartMachine
6
6
  raise "roundcube config for #{name} not found." unless config
7
7
 
8
8
  @fqdn = config.dig(:fqdn)
9
- @image = config.dig(:image)
9
+ @image = "smartmachine/roundcube:#{SmartMachine.version}"
10
10
  @sysadmin_email = config.dig(:sysadmin_email)
11
11
  @networks = config.dig(:networks)
12
12
  @database_type = config.dig(:database_type)
@@ -21,6 +21,11 @@ module SmartMachine
21
21
  @smtp_port = config.dig(:smtp_port)
22
22
  @request_path = config.dig(:request_path)
23
23
  @plugins = config.dig(:plugins)
24
+ @plugins_password_database_type = config.dig(:plugins_password_database_type)
25
+ @plugins_password_database_host = config.dig(:plugins_password_database_host)
26
+ @plugins_password_database_user = config.dig(:plugins_password_database_user)
27
+ @plugins_password_database_pass = config.dig(:plugins_password_database_pass)
28
+ @plugins_password_database_name = config.dig(:plugins_password_database_name)
24
29
  @skin = config.dig(:skin)
25
30
  @upload_max_filesize = config.dig(:upload_max_filesize)
26
31
  @aspell_dictionaries = config.dig(:aspell_dictionaries)
@@ -29,67 +34,110 @@ module SmartMachine
29
34
  @home_dir = File.expand_path('~')
30
35
  end
31
36
 
32
- def uper
33
- FileUtils.mkdir_p("#{@home_dir}/machine/grids/roundcube/#{@name}/backups")
34
- FileUtils.mkdir_p("#{@home_dir}/machine/grids/roundcube/#{@name}/data/html")
35
- FileUtils.mkdir_p("#{@home_dir}/machine/grids/roundcube/#{@name}/data/roundcube-temp")
36
-
37
- # Creating & Starting containers
38
- print "-----> Creating container #{@name} ... "
39
-
40
- command = [
41
- "docker create",
42
- "--name='#{@name}'",
43
- "--env VIRTUAL_HOST=#{@fqdn}",
44
- "--env VIRTUAL_PATH='#{@request_path}'",
45
- "--env LETSENCRYPT_HOST=#{@fqdn}",
46
- "--env LETSENCRYPT_EMAIL=#{@sysadmin_email}",
47
- "--env LETSENCRYPT_TEST=false",
48
- "--env CONTAINER_NAME='#{@name}'",
49
- "--env FQDN='#{@fqdn}'",
50
- "--env ROUNDCUBEMAIL_DEFAULT_HOST='#{@mail_host}'",
51
- "--env ROUNDCUBEMAIL_DEFAULT_PORT='#{@mail_port}'",
52
- "--env ROUNDCUBEMAIL_SMTP_SERVER='#{@smtp_host}'",
53
- "--env ROUNDCUBEMAIL_SMTP_PORT='#{@smtp_port}'",
54
- "--env ROUNDCUBEMAIL_USERNAME_DOMAIN=''",
55
- "--env ROUNDCUBEMAIL_REQUEST_PATH='#{@request_path}'",
56
- "--env ROUNDCUBEMAIL_PLUGINS='#{@plugins.join(',')}'",
57
- "--env ROUNDCUBEMAIL_INSTALL_PLUGINS='1'",
58
- "--env ROUNDCUBEMAIL_SKIN='#{@skin}'",
59
- "--env ROUNDCUBEMAIL_UPLOAD_MAX_FILESIZE='#{@upload_max_filesize}'",
60
- "--env ROUNDCUBEMAIL_SPELLCHECK_URI=''",
61
- "--env ROUNDCUBEMAIL_ASPELL_DICTS='#{@aspell_dictionaries.join(',')}'",
62
- "--env ROUNDCUBEMAIL_DB_TYPE='#{@database_type}'",
63
- "--env ROUNDCUBEMAIL_DB_HOST='#{@database_host}'",
64
- "--env ROUNDCUBEMAIL_DB_PORT='#{@database_port}'",
65
- "--env ROUNDCUBEMAIL_DB_USER='#{@database_user}'",
66
- "--env ROUNDCUBEMAIL_DB_PASSWORD='#{@database_pass}'",
67
- "--env ROUNDCUBEMAIL_DB_NAME='#{@database_name}'",
68
- "--volume='#{@home_dir}/smartmachine/config/roundcube/etc/apache2/sites-available/000-default.conf:/etc/apache2/sites-available/000-default.conf:ro'",
69
- "--volume='#{@home_dir}/smartmachine/config/roundcube/usr/local/etc/php/conf.d/zzz_roundcube-custom.ini:/usr/local/etc/php/conf.d/zzz_roundcube-custom.ini:ro'",
70
- "--volume='#{@home_dir}/smartmachine/config/roundcube/var/roundcube/config:/var/roundcube/config:ro'",
71
- "--volume='#{@home_dir}/smartmachine/grids/roundcube/#{@name}/data/html:/var/www/html'",
72
- "--volume='#{@home_dir}/smartmachine/grids/roundcube/#{@name}/data/roundcube-temp:/tmp/roundcube-temp'",
73
- "--tmpfs /run/tmpfs",
74
- "--init",
75
- "--restart='always'",
76
- "--network='nginx-network'",
77
- "#{@image}"
78
- ]
79
- if system(command.compact.join(" "), out: File::NULL)
80
- @networks.each do |network|
81
- system("docker network connect #{network} #{@name}")
37
+ def installer
38
+ unless system("docker image inspect #{@image}", [:out, :err] => File::NULL)
39
+ puts "-----> Creating image #{@image} ... "
40
+ command = [
41
+ "docker image build -t #{@image}",
42
+ "--build-arg SMARTMACHINE_VERSION=#{SmartMachine.version}",
43
+ "-f- #{SmartMachine.config.gem_dir}/lib/smart_machine/grids/roundcube",
44
+ "<<'EOF'\n#{dockerfile}EOF"
45
+ ]
46
+ if system(command.join(" "), out: File::NULL)
47
+ puts "done"
48
+ else
49
+ raise "Error: Could not install image: #{@image}"
82
50
  end
51
+ else
52
+ raise "Error: Image already installed: #{@image}. Please uninstall using 'smartmachine grids roundcube uninstall' and try installing again."
53
+ end
54
+ end
55
+
56
+ def uninstaller
57
+ unless system("docker inspect -f '{{.State.Running}}' '#{@name}'", [:out, :err] => File::NULL)
58
+ if system("docker image inspect #{@image}", [:out, :err] => File::NULL)
59
+ puts "-----> Removing image #{@image} ... "
60
+ if system("docker image rm #{@image}", out: File::NULL)
61
+ puts "done"
62
+ end
63
+ else
64
+ raise "Error: Roundcube already uninstalled. Please install using 'smartmachine grids roundcube install' and try uninstalling again."
65
+ end
66
+ else
67
+ raise "Error: Roundcube is currently running. Please stop the roundcube using 'smartmachine grids roundcube down' and try uninstalling again."
68
+ end
69
+ end
70
+
71
+ def uper
72
+ if system("docker image inspect #{@image}", [:out, :err] => File::NULL)
73
+ FileUtils.mkdir_p("#{@home_dir}/machine/grids/roundcube/#{@name}/backups")
74
+ FileUtils.mkdir_p("#{@home_dir}/machine/grids/roundcube/#{@name}/data/roundcube-temp")
75
+
76
+ # Setting entrypoint permission.
77
+ system("chmod +x #{@home_dir}/machine/config/roundcube/docker/custom-docker-entrypoint.sh")
78
+ system("chmod +x #{@home_dir}/machine/config/roundcube/docker/entrypoint.rb")
79
+
80
+ # Creating & Starting containers
81
+ print "-----> Creating container #{@name} ... "
82
+
83
+ command = [
84
+ "docker create",
85
+ "--name='#{@name}'",
86
+ "--env VIRTUAL_HOST=#{@fqdn}",
87
+ "--env VIRTUAL_PATH='#{@request_path}'",
88
+ "--env LETSENCRYPT_HOST=#{@fqdn}",
89
+ "--env LETSENCRYPT_EMAIL=#{@sysadmin_email}",
90
+ "--env LETSENCRYPT_TEST=false",
91
+ "--env CONTAINER_NAME='#{@name}'",
92
+ "--env FQDN='#{@fqdn}'",
93
+ "--env ROUNDCUBEMAIL_DEFAULT_HOST='#{@mail_host}'",
94
+ "--env ROUNDCUBEMAIL_DEFAULT_PORT='#{@mail_port}'",
95
+ "--env ROUNDCUBEMAIL_SMTP_SERVER='#{@smtp_host}'",
96
+ "--env ROUNDCUBEMAIL_SMTP_PORT='#{@smtp_port}'",
97
+ "--env ROUNDCUBEMAIL_USERNAME_DOMAIN=''",
98
+ "--env ROUNDCUBEMAIL_REQUEST_PATH='#{@request_path}'",
99
+ "--env ROUNDCUBEMAIL_PLUGINS='#{@plugins.join(',')}'",
100
+ "--env ROUNDCUBEMAIL_PLUGINS_PASSWORD_DATABASE_TYPE='#{@plugins_password_database_type}'",
101
+ "--env ROUNDCUBEMAIL_PLUGINS_PASSWORD_DATABASE_HOST='#{@plugins_password_database_host}'",
102
+ "--env ROUNDCUBEMAIL_PLUGINS_PASSWORD_DATABASE_USER='#{@plugins_password_database_user}'",
103
+ "--env ROUNDCUBEMAIL_PLUGINS_PASSWORD_DATABASE_PASS='#{@plugins_password_database_pass}'",
104
+ "--env ROUNDCUBEMAIL_PLUGINS_PASSWORD_DATABASE_NAME='#{@plugins_password_database_name}'",
105
+ "--env ROUNDCUBEMAIL_INSTALL_PLUGINS='1'",
106
+ "--env ROUNDCUBEMAIL_SKIN='#{@skin}'",
107
+ "--env ROUNDCUBEMAIL_UPLOAD_MAX_FILESIZE='#{@upload_max_filesize}'",
108
+ "--env ROUNDCUBEMAIL_SPELLCHECK_URI=''",
109
+ "--env ROUNDCUBEMAIL_ASPELL_DICTS='#{@aspell_dictionaries.join(',')}'",
110
+ "--env ROUNDCUBEMAIL_DB_TYPE='#{@database_type}'",
111
+ "--env ROUNDCUBEMAIL_DB_HOST='#{@database_host}'",
112
+ "--env ROUNDCUBEMAIL_DB_PORT='#{@database_port}'",
113
+ "--env ROUNDCUBEMAIL_DB_USER='#{@database_user}'",
114
+ "--env ROUNDCUBEMAIL_DB_PASSWORD='#{@database_pass}'",
115
+ "--env ROUNDCUBEMAIL_DB_NAME='#{@database_name}'",
116
+ "--volume='#{@home_dir}/smartmachine/config/roundcube:/smartmachine/config/roundcube:ro'",
117
+ "--volume='#{@home_dir}/smartmachine/grids/roundcube/#{@name}/data/roundcube-temp:/tmp/roundcube-temp'",
118
+ "--tmpfs /run/tmpfs",
119
+ "--init",
120
+ "--restart='always'",
121
+ "--network='nginx-network'",
122
+ "#{@image}"
123
+ ]
124
+ if system(command.compact.join(" "), out: File::NULL)
125
+ @networks.each do |network|
126
+ system("docker network connect #{network} #{@name}")
127
+ end
83
128
 
84
- puts "done"
85
- puts "-----> Starting container #{@name} ... "
86
- if system("docker start #{@name}", out: File::NULL)
87
129
  puts "done"
130
+ puts "-----> Starting container #{@name} ... "
131
+ if system("docker start #{@name}", out: File::NULL)
132
+ puts "done"
133
+ else
134
+ raise "Error: Could not start container: #{@name}"
135
+ end
88
136
  else
89
- raise "Error: Could not start container: #{@name}"
137
+ raise "Error: Could not create container: #{@name}"
90
138
  end
91
139
  else
92
- raise "Error: Could not create container: #{@name}"
140
+ raise "Error: Could not find image: #{@image}"
93
141
  end
94
142
  end
95
143
 
@@ -109,6 +157,28 @@ module SmartMachine
109
157
  end
110
158
  end
111
159
  end
160
+
161
+ private
162
+
163
+ def dockerfile
164
+ file = <<~'DOCKERFILE'
165
+ ARG SMARTMACHINE_VERSION
166
+
167
+ FROM roundcube/roundcubemail:1.6.8-apache
168
+ LABEL maintainer="plainsource <plainsource@humanmind.me>"
169
+
170
+ RUN apt-get update && \
171
+ apt-get install -y --no-install-recommends \
172
+ ruby-full build-essential zlib1g-dev \
173
+ dovecot-common && \
174
+ rm -rf /var/lib/apt/lists/*
175
+
176
+ ENTRYPOINT ["/smartmachine/config/roundcube/docker/custom-docker-entrypoint.sh"]
177
+ CMD ["apache2-foreground"]
178
+ DOCKERFILE
179
+
180
+ format(file, "mailname": @mailname)
181
+ end
112
182
  end
113
183
  end
114
184
  end
@@ -86,6 +86,11 @@ virtual_alias_domains = mysql:/etc/postfix/mysql-virtual-alias-domains.cf
86
86
  # Alias mappings for domains, users and users to themselves.
87
87
  virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps-domains.cf, mysql:/etc/postfix/mysql-virtual-alias-maps-masters.cf, mysql:/etc/postfix/mysql-virtual-alias-maps-users.cf, mysql:/etc/postfix/mysql-virtual-alias-maps-userstothemselves.cf
88
88
 
89
+ # Setting Message Size (default: 10240000).
90
+ # Changed to 37.5MB to allow approximately 25MB of file attachments (includes mime expansion bloat).
91
+ # https://serverfault.com/questions/189508/considering-mime-expansion-bloat-how-does-that-affect-settings-for-exchange-200/189510#189510
92
+ message_size_limit = 39321600
93
+
89
94
  # Even more Restrictions and MTA params
90
95
  disable_vrfy_command = yes
91
96
  strict_rfc821_envelopes = yes
@@ -0,0 +1,185 @@
1
+ #!/bin/bash
2
+ # set -ex
3
+
4
+ # PWD=`pwd`
5
+
6
+ if [[ "$1" == apache2* || "$1" == php-fpm || "$1" == bin* ]]; then
7
+ INSTALLDIR=`pwd`
8
+ # docroot is empty
9
+ if ! [ -e index.php -a -e bin/installto.sh ]; then
10
+ echo >&2 "roundcubemail not found in $PWD - copying now..."
11
+ if [ "$(ls -A)" ]; then
12
+ echo >&2 "WARNING: $PWD is not empty - press Ctrl+C now if this is an error!"
13
+ ( set -x; ls -A; sleep 10 )
14
+ fi
15
+ tar cf - --one-file-system -C /usr/src/roundcubemail . | tar xf -
16
+ echo >&2 "Complete! ROUNDCUBEMAIL has been successfully copied to $INSTALLDIR"
17
+ # update Roundcube in docroot
18
+ else
19
+ echo >&2 "roundcubemail found in $INSTALLDIR - installing update..."
20
+ (cd /usr/src/roundcubemail && bin/installto.sh -y $INSTALLDIR)
21
+ # Re-install composer modules (including plugins)
22
+ composer \
23
+ --working-dir=${INSTALLDIR} \
24
+ --prefer-dist \
25
+ --no-dev \
26
+ --no-interaction \
27
+ --optimize-autoloader \
28
+ install
29
+ fi
30
+
31
+ if [ -f /run/secrets/roundcube_db_user ]; then
32
+ ROUNDCUBEMAIL_DB_USER=`cat /run/secrets/roundcube_db_user`
33
+ fi
34
+ if [ -f /run/secrets/roundcube_db_password ]; then
35
+ ROUNDCUBEMAIL_DB_PASSWORD=`cat /run/secrets/roundcube_db_password`
36
+ fi
37
+ if [ -f /run/secrets/roundcube_oauth_client_secret ]; then
38
+ ROUNDCUBEMAIL_OAUTH_CLIENT_SECRET=`cat /run/secrets/roundcube_oauth_client_secret`
39
+ fi
40
+
41
+ if [ ! -z "${!POSTGRES_ENV_POSTGRES_*}" ] || [ "$ROUNDCUBEMAIL_DB_TYPE" == "pgsql" ]; then
42
+ : "${ROUNDCUBEMAIL_DB_TYPE:=pgsql}"
43
+ : "${ROUNDCUBEMAIL_DB_HOST:=postgres}"
44
+ : "${ROUNDCUBEMAIL_DB_PORT:=5432}"
45
+ : "${ROUNDCUBEMAIL_DB_USER:=${POSTGRES_ENV_POSTGRES_USER}}"
46
+ : "${ROUNDCUBEMAIL_DB_PASSWORD:=${POSTGRES_ENV_POSTGRES_PASSWORD}}"
47
+ : "${ROUNDCUBEMAIL_DB_NAME:=${POSTGRES_ENV_POSTGRES_DB:-roundcubemail}}"
48
+ : "${ROUNDCUBEMAIL_DSNW:=${ROUNDCUBEMAIL_DB_TYPE}://${ROUNDCUBEMAIL_DB_USER}:${ROUNDCUBEMAIL_DB_PASSWORD}@${ROUNDCUBEMAIL_DB_HOST}:${ROUNDCUBEMAIL_DB_PORT}/${ROUNDCUBEMAIL_DB_NAME}}"
49
+
50
+ /wait-for-it.sh ${ROUNDCUBEMAIL_DB_HOST}:${ROUNDCUBEMAIL_DB_PORT} -t 30
51
+ elif [ ! -z "${!MYSQL_ENV_MYSQL_*}" ] || [ "$ROUNDCUBEMAIL_DB_TYPE" == "mysql" ]; then
52
+ : "${ROUNDCUBEMAIL_DB_TYPE:=mysql}"
53
+ : "${ROUNDCUBEMAIL_DB_HOST:=mysql}"
54
+ : "${ROUNDCUBEMAIL_DB_PORT:=3306}"
55
+ : "${ROUNDCUBEMAIL_DB_USER:=${MYSQL_ENV_MYSQL_USER:-root}}"
56
+ if [ "$ROUNDCUBEMAIL_DB_USER" = 'root' ]; then
57
+ : "${ROUNDCUBEMAIL_DB_PASSWORD:=${MYSQL_ENV_MYSQL_ROOT_PASSWORD}}"
58
+ else
59
+ : "${ROUNDCUBEMAIL_DB_PASSWORD:=${MYSQL_ENV_MYSQL_PASSWORD}}"
60
+ fi
61
+ : "${ROUNDCUBEMAIL_DB_NAME:=${MYSQL_ENV_MYSQL_DATABASE:-roundcubemail}}"
62
+ : "${ROUNDCUBEMAIL_DSNW:=${ROUNDCUBEMAIL_DB_TYPE}://${ROUNDCUBEMAIL_DB_USER}:${ROUNDCUBEMAIL_DB_PASSWORD}@${ROUNDCUBEMAIL_DB_HOST}:${ROUNDCUBEMAIL_DB_PORT}/${ROUNDCUBEMAIL_DB_NAME}}"
63
+
64
+ /wait-for-it.sh ${ROUNDCUBEMAIL_DB_HOST}:${ROUNDCUBEMAIL_DB_PORT} -t 30
65
+ else
66
+ # use local SQLite DB in /var/roundcube/db
67
+ : "${ROUNDCUBEMAIL_DB_TYPE:=sqlite}"
68
+ : "${ROUNDCUBEMAIL_DB_DIR:=/var/roundcube/db}"
69
+ : "${ROUNDCUBEMAIL_DB_NAME:=sqlite}"
70
+ : "${ROUNDCUBEMAIL_DSNW:=${ROUNDCUBEMAIL_DB_TYPE}:///$ROUNDCUBEMAIL_DB_DIR/${ROUNDCUBEMAIL_DB_NAME}.db?mode=0646}"
71
+
72
+ mkdir -p $ROUNDCUBEMAIL_DB_DIR
73
+ chown www-data:www-data $ROUNDCUBEMAIL_DB_DIR
74
+ fi
75
+
76
+ : "${ROUNDCUBEMAIL_DEFAULT_HOST:=localhost}"
77
+ : "${ROUNDCUBEMAIL_DEFAULT_PORT:=143}"
78
+ : "${ROUNDCUBEMAIL_SMTP_SERVER:=localhost}"
79
+ : "${ROUNDCUBEMAIL_SMTP_PORT:=587}"
80
+ : "${ROUNDCUBEMAIL_PLUGINS:=archive,zipdownload}"
81
+ : "${ROUNDCUBEMAIL_SKIN:=elastic}"
82
+ : "${ROUNDCUBEMAIL_TEMP_DIR:=/tmp/roundcube-temp}"
83
+ : "${ROUNDCUBEMAIL_REQUEST_PATH:=/}"
84
+ : "${ROUNDCUBEMAIL_COMPOSER_PLUGINS_FOLDER:=$INSTALLDIR}"
85
+
86
+ if [ ! -z "${ROUNDCUBEMAIL_COMPOSER_PLUGINS}" ]; then
87
+ echo "Installing plugins from the list"
88
+ echo "Plugins: ${ROUNDCUBEMAIL_COMPOSER_PLUGINS}"
89
+
90
+ # Change ',' into a space
91
+ ROUNDCUBEMAIL_COMPOSER_PLUGINS_SH=`echo "${ROUNDCUBEMAIL_COMPOSER_PLUGINS}" | tr ',' ' '`
92
+
93
+ composer \
94
+ --working-dir=${ROUNDCUBEMAIL_COMPOSER_PLUGINS_FOLDER} \
95
+ --prefer-dist \
96
+ --prefer-stable \
97
+ --update-no-dev \
98
+ --no-interaction \
99
+ --optimize-autoloader \
100
+ require \
101
+ -- \
102
+ ${ROUNDCUBEMAIL_COMPOSER_PLUGINS_SH};
103
+ fi
104
+
105
+ if [ ! -e config/config.inc.php ]; then
106
+ GENERATED_DES_KEY=`head /dev/urandom | base64 | head -c 24`
107
+ touch config/config.inc.php
108
+
109
+ echo "Write root config to $PWD/config/config.inc.php"
110
+ echo "<?php
111
+ \$config['plugins'] = [];
112
+ \$config['log_driver'] = 'stdout';
113
+ \$config['zipdownload_selection'] = true;
114
+ \$config['des_key'] = '${GENERATED_DES_KEY}';
115
+ \$config['enable_spellcheck'] = true;
116
+ \$config['spellcheck_engine'] = 'pspell';
117
+ include(__DIR__ . '/config.docker.inc.php');
118
+ " > config/config.inc.php
119
+
120
+ elif ! grep -q "config.docker.inc.php" config/config.inc.php; then
121
+ echo "include(__DIR__ . '/config.docker.inc.php');" >> config/config.inc.php
122
+ fi
123
+
124
+ ROUNDCUBEMAIL_PLUGINS_PHP=`echo "${ROUNDCUBEMAIL_PLUGINS}" | sed -E "s/[, ]+/', '/g"`
125
+ echo "Write Docker config to $PWD/config/config.docker.inc.php"
126
+ echo "<?php
127
+ \$config['db_dsnw'] = '${ROUNDCUBEMAIL_DSNW}';
128
+ \$config['db_dsnr'] = '${ROUNDCUBEMAIL_DSNR}';
129
+ \$config['imap_host'] = '${ROUNDCUBEMAIL_DEFAULT_HOST}:${ROUNDCUBEMAIL_DEFAULT_PORT}';
130
+ \$config['smtp_host'] = '${ROUNDCUBEMAIL_SMTP_SERVER}:${ROUNDCUBEMAIL_SMTP_PORT}';
131
+ \$config['username_domain'] = '${ROUNDCUBEMAIL_USERNAME_DOMAIN}';
132
+ \$config['temp_dir'] = '${ROUNDCUBEMAIL_TEMP_DIR}';
133
+ \$config['skin'] = '${ROUNDCUBEMAIL_SKIN}';
134
+ \$config['request_path'] = '${ROUNDCUBEMAIL_REQUEST_PATH}';
135
+ \$config['plugins'] = array_filter(array_unique(array_merge(\$config['plugins'], ['${ROUNDCUBEMAIL_PLUGINS_PHP}'])));
136
+ " > config/config.docker.inc.php
137
+
138
+ if [ -e /run/secrets/roundcube_des_key ]; then
139
+ echo "\$config['des_key'] = file_get_contents('/run/secrets/roundcube_des_key');" >> config/config.docker.inc.php
140
+ elif [ ! -z "${ROUNDCUBEMAIL_DES_KEY}" ]; then
141
+ echo "\$config['des_key'] = getenv('ROUNDCUBEMAIL_DES_KEY');" >> config/config.docker.inc.php
142
+ fi
143
+
144
+ if [ ! -z "${ROUNDCUBEMAIL_OAUTH_CLIENT_SECRET}" ]; then
145
+ echo "\$config['oauth_client_secret'] = '${ROUNDCUBEMAIL_OAUTH_CLIENT_SECRET}';" >> config/config.docker.inc.php
146
+ fi
147
+
148
+ if [ ! -z "${ROUNDCUBEMAIL_SPELLCHECK_URI}"]; then
149
+ echo "\$config['spellcheck_engine'] = 'googie';" >> config/config.docker.inc.php
150
+ echo "\$config['spellcheck_uri'] = '${ROUNDCUBEMAIL_SPELLCHECK_URI}';" >> config/config.docker.inc.php
151
+ fi
152
+
153
+ # include custom config files
154
+ for fn in `ls /var/roundcube/config/*.php 2>/dev/null || true`; do
155
+ echo "include('$fn');" >> config/config.docker.inc.php
156
+ done
157
+
158
+ # initialize or update DB
159
+ bin/initdb.sh --dir=$PWD/SQL --update || echo "Failed to initialize/update the database. Please start with an empty database and restart the container."
160
+
161
+ if [ ! -z "${ROUNDCUBEMAIL_TEMP_DIR}" ]; then
162
+ mkdir -p ${ROUNDCUBEMAIL_TEMP_DIR} && chown www-data ${ROUNDCUBEMAIL_TEMP_DIR}
163
+ fi
164
+
165
+ if [ ! -z "${ROUNDCUBEMAIL_UPLOAD_MAX_FILESIZE}" ]; then
166
+ echo "upload_max_filesize=${ROUNDCUBEMAIL_UPLOAD_MAX_FILESIZE}" >> /usr/local/etc/php/conf.d/roundcube-override.ini
167
+ echo "post_max_size=${ROUNDCUBEMAIL_UPLOAD_MAX_FILESIZE}" >> /usr/local/etc/php/conf.d/roundcube-override.ini
168
+ fi
169
+
170
+ : "${ROUNDCUBEMAIL_LOCALE:=en_US.UTF-8 UTF-8}"
171
+
172
+ if [ -e /usr/sbin/locale-gen ] && [ ! -z "${ROUNDCUBEMAIL_LOCALE}" ]; then
173
+ echo "${ROUNDCUBEMAIL_LOCALE}" > /etc/locale.gen
174
+ /usr/sbin/locale-gen
175
+ fi
176
+
177
+ if [ ! -z "${ROUNDCUBEMAIL_ASPELL_DICTS}" ]; then
178
+ ASPELL_PACKAGES=`echo -n "aspell-${ROUNDCUBEMAIL_ASPELL_DICTS}" | sed -E "s/[, ]+/ aspell-/g"`
179
+ which apt-get && apt-get install -y $ASPELL_PACKAGES
180
+ which apk && apk add --no-cache $ASPELL_PACKAGES
181
+ fi
182
+
183
+ fi
184
+
185
+ exec ruby /smartmachine/config/roundcube/docker/entrypoint.rb "$@"
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'fileutils'
5
+ require 'logger'
6
+ require 'cgi'
7
+
8
+ logger = Logger.new(STDOUT)
9
+ STDOUT.sync = true
10
+
11
+ def update_envkeys_in(filepaths, envkeys)
12
+ filepaths.each do |filepath|
13
+ str = File.read(filepath)
14
+ str = str.gsub(/%(?!<)/, '%%')
15
+ str = format(str, envkeys)
16
+ File.open(filepath, "w") { |file| file << str }
17
+ end
18
+ end
19
+
20
+ # initial setup
21
+ unless File.exist?('/run/initial_container_start')
22
+ FileUtils.touch('/run/initial_container_start')
23
+
24
+ # EnvKeys
25
+ envkeys = {
26
+ container_name: ENV.delete('CONTAINER_NAME'),
27
+ fqdn: ENV.delete('FQDN'),
28
+ timezone: `cat /etc/timezone`.chomp,
29
+ roundcubemail_request_path: ENV.delete('ROUNDCUBEMAIL_REQUEST_PATH'),
30
+ roundcubemail_plugins_password_database_type: ENV.delete('ROUNDCUBEMAIL_PLUGINS_PASSWORD_DATABASE_TYPE'),
31
+ roundcubemail_plugins_password_database_host: ENV.delete('ROUNDCUBEMAIL_PLUGINS_PASSWORD_DATABASE_HOST'),
32
+ roundcubemail_plugins_password_database_user: CGI.escape(ENV.delete('ROUNDCUBEMAIL_PLUGINS_PASSWORD_DATABASE_USER')),
33
+ roundcubemail_plugins_password_database_pass: CGI.escape(ENV.delete('ROUNDCUBEMAIL_PLUGINS_PASSWORD_DATABASE_PASS')),
34
+ roundcubemail_plugins_password_database_name: ENV.delete('ROUNDCUBEMAIL_PLUGINS_PASSWORD_DATABASE_NAME')
35
+ }
36
+
37
+ # Config
38
+ FileUtils.cp '/smartmachine/config/roundcube/etc/apache2/sites-available/000-default.conf', '/etc/apache2/sites-available/000-default.conf'
39
+ FileUtils.cp '/smartmachine/config/roundcube/usr/local/etc/php/conf.d/zzz_roundcube-custom.ini', '/usr/local/etc/php/conf.d/zzz_roundcube-custom.ini'
40
+ FileUtils.cp '/smartmachine/config/roundcube/var/roundcube/config/config.custom.inc.php', '/var/roundcube/config/config.custom.inc.php'
41
+ filepaths = [
42
+ '/etc/apache2/sites-available/000-default.conf'
43
+ ]
44
+ update_envkeys_in(filepaths, envkeys)
45
+
46
+ # Plugins
47
+ FileUtils.cp '/smartmachine/config/roundcube/var/www/html/plugins/password/config.inc.php', '/var/www/html/plugins/password/config.inc.php'
48
+ filepaths = [
49
+ '/var/www/html/plugins/password/config.inc.php'
50
+ ]
51
+ update_envkeys_in(filepaths, envkeys)
52
+ system("chown root:www-data /var/www/html/plugins/password/config.inc.php")
53
+ system("chmod u=rw,g=r,o= /var/www/html/plugins/password/config.inc.php")
54
+
55
+ logger.info "Initial setup completed for #{envkeys[:container_name]}."
56
+ end
57
+
58
+ exec(*ARGV)
@@ -16,6 +16,7 @@
16
16
  # If you are setting a different request_path other than '/' in roundcube.yml config file,
17
17
  # then please uncomment the below line and add that path here as an alias.
18
18
  #Alias /your/request/path /var/www/html
19
+ Alias %<roundcubemail_request_path>s /var/www/html
19
20
 
20
21
  # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
21
22
  # error, crit, alert, emerg.
@@ -0,0 +1,523 @@
1
+ <?php
2
+
3
+ // Password Plugin options
4
+ // -----------------------
5
+ // A driver to use for password change. Default: "sql".
6
+ // See README file for list of supported driver names.
7
+ $config['password_driver'] = 'sql';
8
+
9
+ // A driver to use for checking password strength. Default: null (disabled).
10
+ // See README file for list of supported driver names.
11
+ $config['password_strength_driver'] = null;
12
+
13
+ // Determine whether current password is required to change password.
14
+ // Default: false.
15
+ $config['password_confirm_current'] = true;
16
+
17
+ // Require the new password to be a certain length.
18
+ // set to blank to allow passwords of any length
19
+ //$config['password_minimum_length'] = 8;
20
+ $config['password_minimum_length'] = 12;
21
+
22
+ // Require the new password to have at least the specified strength score.
23
+ // Note: Password strength is scored from 1 (week) to 5 (strong).
24
+ $config['password_minimum_score'] = 0;
25
+
26
+ // Enables logging of password changes into logs/password
27
+ $config['password_log'] = false;
28
+
29
+ // Array of login exceptions for which password change
30
+ // will be not available (no Password tab in Settings)
31
+ $config['password_login_exceptions'] = null;
32
+
33
+ // Array of hosts that support password changing.
34
+ // Listed hosts will feature a Password option in Settings; others will not.
35
+ // Example: ['mail.example.com', 'mail2.example.org'];
36
+ // Default is NULL (all hosts supported).
37
+ $config['password_hosts'] = null;
38
+
39
+ // Enables saving the new password even if it matches the old password. Useful
40
+ // for upgrading the stored passwords after the encryption scheme has changed.
41
+ //$config['password_force_save'] = false;
42
+ $config['password_force_save'] = true;
43
+
44
+ // Enables forcing new users to change their password at their first login.
45
+ $config['password_force_new_user'] = false;
46
+
47
+ // Password hashing/crypting algorithm.
48
+ // Possible options: des-crypt, ext-des-crypt, md5-crypt, blowfish-crypt,
49
+ // sha256-crypt, sha512-crypt, md5, sha, smd5, ssha, ssha256, ssha512, samba, ad, dovecot, clear.
50
+ // Also supported are password_hash() algoriths: hash-bcrypt, hash-argon2i, hash-argon2id.
51
+ // Default: 'clear' (no hashing)
52
+ // For details see password::hash_password() method.
53
+ //$config['password_algorithm'] = 'clear';
54
+ $config['password_algorithm'] = 'dovecot';
55
+
56
+ // Additional options for password hashing function(s).
57
+ // For password_hash()-based passwords see https://www.php.net/manual/en/function.password-hash.php
58
+ // It can be used to set the Blowfish algorithm cost, e.g. ['cost' => 12]
59
+ $config['password_algorithm_options'] = [];
60
+
61
+ // Password prefix (e.g. {CRYPT}, {SHA}) for passwords generated
62
+ // using password_algorithm above. Default: empty.
63
+ $config['password_algorithm_prefix'] = '';
64
+
65
+ // Path for dovecotpw/doveadm-pw (if not in the $PATH).
66
+ // Used for password_algorithm = 'dovecot'.
67
+ // $config['password_dovecotpw'] = '/usr/local/sbin/doveadm pw'; // for dovecot-2.x
68
+ //$config['password_dovecotpw'] = '/usr/local/sbin/dovecotpw'; // for dovecot-1.x
69
+ $config['password_dovecotpw'] = '/usr/bin/doveadm pw';
70
+
71
+ // Dovecot password scheme.
72
+ // Used for password_algorithm = 'dovecot'.
73
+ //$config['password_dovecotpw_method'] = 'CRAM-MD5';
74
+ $config['password_dovecotpw_method'] = 'BLF-CRYPT';
75
+
76
+ // Enables use of password with method prefix, e.g. {MD5}$1$LUiMYWqx$fEkg/ggr/L6Mb2X7be4i1/
77
+ // when using password_algorithm=dovecot
78
+ //$config['password_dovecotpw_with_method'] = false;
79
+ $config['password_dovecotpw_with_method'] = true;
80
+
81
+ // Number of rounds for the sha256 and sha512 crypt hashing algorithms.
82
+ // Must be at least 1000. If not set, then the number of rounds is left up
83
+ // to the crypt() implementation. On glibc this defaults to 5000.
84
+ // Be aware, the higher the value, the longer it takes to generate the password hashes.
85
+ //$config['password_crypt_rounds'] = 50000;
86
+
87
+ // This option temporarily disables the password change functionality.
88
+ // Use it when the users database server is in maintenance mode or something like that.
89
+ // You can set it to TRUE/FALSE or a text describing the reason
90
+ // which will replace the default.
91
+ $config['password_disabled'] = false;
92
+
93
+ // Various drivers/setups use different format of the username.
94
+ // This option allows you to force specified format use. Default: '%u'.
95
+ // Supported variables:
96
+ // %u - full username,
97
+ // %l - the local part of the username (in case the username is an email address)
98
+ // %d - the domain part of the username (in case the username is an email address)
99
+ // Note: This may no apply to some drivers implementing their own rules, e.g. sql.
100
+ $config['password_username_format'] = '%u';
101
+
102
+ // Options passed when creating Guzzle HTTP client, used to access various external APIs.
103
+ // This will overwrite global http_client settings. For example:
104
+ // [
105
+ // 'timeout' => 10,
106
+ // 'proxy' => 'tcp://localhost:8125',
107
+ // ]
108
+ $config['password_http_client'] = [];
109
+
110
+
111
+ // SQL Driver options
112
+ // ------------------
113
+ // PEAR database DSN for performing the query. By default
114
+ // Roundcube DB settings are used.
115
+ // Supported replacement variables:
116
+ // %h - user's IMAP hostname
117
+ // %n - hostname ($_SERVER['SERVER_NAME'])
118
+ // %t - hostname without the first part
119
+ // %d - domain (http hostname $_SERVER['HTTP_HOST'] without the first part)
120
+ // %z - IMAP domain (IMAP hostname without the first part)
121
+ //$config['password_db_dsn'] = '';
122
+ $config['password_db_dsn'] = '%<roundcubemail_plugins_password_database_type>s://%<roundcubemail_plugins_password_database_user>s:%<roundcubemail_plugins_password_database_pass>s@%<roundcubemail_plugins_password_database_host>s/%<roundcubemail_plugins_password_database_name>s';
123
+
124
+ // The SQL query used to change the password.
125
+ // The query can contain the following macros that will be expanded as follows:
126
+ // %p is replaced with the plaintext new password
127
+ // %P is replaced with the crypted/hashed new password
128
+ // according to configured password_algorithm
129
+ // %o is replaced with the old (current) password
130
+ // %O is replaced with the crypted/hashed old (current) password
131
+ // according to configured password_algorithm
132
+ // %h is replaced with the imap host (from the session info)
133
+ // %u is replaced with the username (from the session info)
134
+ // %l is replaced with the local part of the username
135
+ // (in case the username is an email address)
136
+ // %d is replaced with the domain part of the username
137
+ // (in case the username is an email address)
138
+ // Escaping of macros is handled by this module.
139
+ // Default: "SELECT update_passwd(%P, %u)"
140
+ //$config['password_query'] = 'SELECT update_passwd(%P, %u)';
141
+ $config['password_query'] = 'UPDATE virtual_users SET password=%P WHERE email=%u';
142
+
143
+ // By default domains in variables are using unicode.
144
+ // Enable this option to use punycoded names
145
+ $config['password_idn_ascii'] = false;
146
+
147
+
148
+ // Poppassd Driver options
149
+ // -----------------------
150
+ // The host which changes the password (default: localhost)
151
+ // Supported replacement variables:
152
+ // %n - hostname ($_SERVER['SERVER_NAME'])
153
+ // %t - hostname without the first part
154
+ // %d - domain (http hostname $_SERVER['HTTP_HOST'] without the first part)
155
+ // %h - IMAP host
156
+ // %z - IMAP domain without first part
157
+ // %s - domain name after the '@' from e-mail address provided at login screen
158
+ $config['password_pop_host'] = 'localhost';
159
+
160
+ // TCP port used for poppassd connections (default: 106)
161
+ $config['password_pop_port'] = 106;
162
+
163
+
164
+ // SASL Driver options
165
+ // -------------------
166
+ // Additional arguments for the saslpasswd2 call
167
+ $config['password_saslpasswd_args'] = '';
168
+
169
+
170
+ // LDAP, LDAP_SIMPLE and LDAP_EXOP Driver options
171
+ // -----------------------------------
172
+ // LDAP server name to connect to.
173
+ // You can provide one or several hosts in an array in which case the hosts are tried from left to right.
174
+ // Example: ['ldap1.example.com', 'ldap2.example.com'];
175
+ // Default: 'localhost'
176
+ $config['password_ldap_host'] = 'localhost';
177
+
178
+ // LDAP server port to connect to
179
+ // Default: '389'
180
+ $config['password_ldap_port'] = '389';
181
+
182
+ // TLS is started after connecting
183
+ // Using TLS for password modification is recommended.
184
+ // Default: false
185
+ $config['password_ldap_starttls'] = false;
186
+
187
+ // LDAP version
188
+ // Default: '3'
189
+ $config['password_ldap_version'] = '3';
190
+
191
+ // LDAP base name (root directory)
192
+ // Example: 'dc=example,dc=com'
193
+ $config['password_ldap_basedn'] = 'dc=example,dc=com';
194
+
195
+ // LDAP connection method
196
+ // There are two connection methods for changing a user's LDAP password.
197
+ // 'user': use user credential (recommended, require password_confirm_current=true)
198
+ // 'admin': use admin credential (this mode require password_ldap_adminDN and password_ldap_adminPW)
199
+ // Default: 'user'
200
+ $config['password_ldap_method'] = 'user';
201
+
202
+ // LDAP Admin DN
203
+ // Used only in admin connection mode
204
+ // Default: null
205
+ $config['password_ldap_adminDN'] = null;
206
+
207
+ // LDAP Admin Password
208
+ // Used only in admin connection mode
209
+ // Default: null
210
+ $config['password_ldap_adminPW'] = null;
211
+
212
+ // LDAP user DN mask
213
+ // The user's DN is mandatory and as we only have his login,
214
+ // we need to re-create his DN using a mask
215
+ // '%login' will be replaced by the current roundcube user's login
216
+ // '%name' will be replaced by the current roundcube user's name part
217
+ // '%domain' will be replaced by the current roundcube user's domain part
218
+ // '%dc' will be replaced by domain name hierarchal string e.g. "dc=test,dc=domain,dc=com"
219
+ // Example: 'uid=%login,ou=people,dc=example,dc=com'
220
+ $config['password_ldap_userDN_mask'] = 'uid=%login,ou=people,dc=example,dc=com';
221
+
222
+ // LDAP search DN
223
+ // The DN roundcube should bind with to find out user's DN
224
+ // based on his login. Note that you should comment out the default
225
+ // password_ldap_userDN_mask setting for this to take effect.
226
+ // Use this if you cannot specify a general template for user DN with
227
+ // password_ldap_userDN_mask. You need to perform a search based on
228
+ // users login to find his DN instead. A common reason might be that
229
+ // your users are placed under different ou's like engineering or
230
+ // sales which cannot be derived from their login only.
231
+ $config['password_ldap_searchDN'] = 'cn=roundcube,ou=services,dc=example,dc=com';
232
+
233
+ // LDAP search password
234
+ // If password_ldap_searchDN is set, the password to use for
235
+ // binding to search for user's DN. Note that you should comment out the default
236
+ // password_ldap_userDN_mask setting for this to take effect.
237
+ // Warning: Be sure to set appropriate permissions on this file so this password
238
+ // is only accessible to roundcube and don't forget to restrict roundcube's access to
239
+ // your directory as much as possible using ACLs. Should this password be compromised
240
+ // you want to minimize the damage.
241
+ $config['password_ldap_searchPW'] = 'secret';
242
+
243
+ // LDAP search base
244
+ // If password_ldap_searchDN is set, the base to search in using the filter below.
245
+ // Note that you should comment out the default password_ldap_userDN_mask setting
246
+ // for this to take effect.
247
+ $config['password_ldap_search_base'] = 'ou=people,dc=example,dc=com';
248
+
249
+ // LDAP search filter
250
+ // If password_ldap_searchDN is set, the filter to use when
251
+ // searching for user's DN. Note that you should comment out the default
252
+ // password_ldap_userDN_mask setting for this to take effect.
253
+ // '%login' will be replaced by the current roundcube user's login
254
+ // '%name' will be replaced by the current roundcube user's name part
255
+ // '%domain' will be replaced by the current roundcube user's domain part
256
+ // '%dc' will be replaced by domain name hierarchal string e.g. "dc=test,dc=domain,dc=com"
257
+ // Example: '(uid=%login)'
258
+ // Example: '(&(objectClass=posixAccount)(uid=%login))'
259
+ $config['password_ldap_search_filter'] = '(uid=%login)';
260
+
261
+ // LDAP password hash type
262
+ // Standard LDAP encryption type which must be one of: crypt,
263
+ // ext_des, md5crypt, blowfish, md5, sha, smd5, ssha, ad, cram-md5 (dovecot style) or clear.
264
+ // Set to 'default' if you want to use method specified in password_algorithm option above.
265
+ // Multiple password Values can be generated by concatenating encodings with a +. E.g. 'cram-md5+crypt'
266
+ // Default: 'crypt'.
267
+ $config['password_ldap_encodage'] = 'crypt';
268
+
269
+ // LDAP password attribute
270
+ // Name of the ldap's attribute used for storing user password
271
+ // Default: 'userPassword'
272
+ $config['password_ldap_pwattr'] = 'userPassword';
273
+
274
+ // LDAP password force replace
275
+ // Force LDAP replace in cases where ACL allows only replace not read
276
+ // See http://pear.php.net/package/Net_LDAP2/docs/latest/Net_LDAP2/Net_LDAP2_Entry.html#methodreplace
277
+ // Default: true
278
+ $config['password_ldap_force_replace'] = true;
279
+
280
+ // LDAP Password Last Change Date
281
+ // Some places use an attribute to store the date of the last password change
282
+ // The date is measured in "days since epoch" (an integer value)
283
+ // Whenever the password is changed, the attribute will be updated if set (e.g. shadowLastChange)
284
+ $config['password_ldap_lchattr'] = '';
285
+
286
+ // LDAP Samba password attribute, e.g. sambaNTPassword
287
+ // Name of the LDAP's Samba attribute used for storing user password
288
+ $config['password_ldap_samba_pwattr'] = '';
289
+
290
+ // LDAP Samba Password Last Change Date attribute, e.g. sambaPwdLastSet
291
+ // Some places use an attribute to store the date of the last password change
292
+ // The date is measured in "seconds since epoch" (an integer value)
293
+ // Whenever the password is changed, the attribute will be updated if set
294
+ $config['password_ldap_samba_lchattr'] = '';
295
+
296
+ // LDAP PPolicy Driver options
297
+ // -----------------------------------
298
+
299
+ // LDAP Change password command - filename of the perl script
300
+ // Example: 'change_ldap_pass.pl'
301
+ $config['password_ldap_ppolicy_cmd'] = 'change_ldap_pass.pl';
302
+
303
+ // LDAP URI
304
+ // Example: 'ldap://ldap.example.com/ ldaps://ldap2.example.com:636/'
305
+ $config['password_ldap_ppolicy_uri'] = 'ldap://localhost/';
306
+
307
+ // LDAP base name (root directory)
308
+ // Example: 'dc=example,dc=com'
309
+ $config['password_ldap_ppolicy_basedn'] = 'dc=example,dc=com';
310
+
311
+ $config['password_ldap_ppolicy_searchDN'] = 'cn=someuser,dc=example,dc=com';
312
+
313
+ $config['password_ldap_ppolicy_searchPW'] = 'secret';
314
+
315
+ // LDAP search filter
316
+ // Example: '(uid=%login)'
317
+ // Example: '(&(objectClass=posixAccount)(uid=%login))'
318
+ $config['password_ldap_ppolicy_search_filter'] = '(uid=%login)';
319
+
320
+ // CA Certificate file if in URI is LDAPS connection
321
+ $config['password_ldap_ppolicy_cafile'] = '/etc/ssl/cacert.crt';
322
+
323
+
324
+
325
+ // DirectAdmin Driver options
326
+ // --------------------------
327
+ // The host which changes the password
328
+ // Use 'ssl://host' instead of 'tcp://host' when running DirectAdmin over SSL.
329
+ // The host can contain the following macros that will be expanded as follows:
330
+ // %h is replaced with the imap host (from the session info)
331
+ // %d is replaced with the domain part of the username (if the username is an email)
332
+ $config['password_directadmin_host'] = 'tcp://localhost';
333
+
334
+ // TCP port used for DirectAdmin connections
335
+ $config['password_directadmin_port'] = 2222;
336
+
337
+
338
+ // vpopmaild Driver options
339
+ // -----------------------
340
+ // The host which changes the password
341
+ $config['password_vpopmaild_host'] = 'localhost';
342
+
343
+ // TCP port used for vpopmaild connections
344
+ $config['password_vpopmaild_port'] = 89;
345
+
346
+ // Timeout used for the connection to vpopmaild (in seconds)
347
+ $config['password_vpopmaild_timeout'] = 10;
348
+
349
+
350
+ // cPanel Driver options
351
+ // ---------------------
352
+ // The cPanel Host name
353
+ $config['password_cpanel_host'] = 'host.domain.com';
354
+
355
+ // The cPanel port to use
356
+ $config['password_cpanel_port'] = 2096;
357
+
358
+
359
+ // XIMSS (Communigate server) Driver options
360
+ // -----------------------------------------
361
+ // Host name of the Communigate server
362
+ $config['password_ximss_host'] = 'mail.example.com';
363
+
364
+ // XIMSS port on Communigate server
365
+ $config['password_ximss_port'] = 11024;
366
+
367
+
368
+ // chpasswd Driver options
369
+ // ---------------------
370
+ // Command to use (see "Sudo setup" in README)
371
+ $config['password_chpasswd_cmd'] = 'sudo /usr/sbin/chpasswd 2> /dev/null';
372
+
373
+
374
+ // XMail Driver options
375
+ // ---------------------
376
+ $config['xmail_host'] = 'localhost';
377
+ $config['xmail_user'] = 'YourXmailControlUser';
378
+ $config['xmail_pass'] = 'YourXmailControlPass';
379
+ $config['xmail_port'] = 6017;
380
+
381
+
382
+ // hMail Driver options
383
+ // -----------------------
384
+ // Remote hMailServer configuration
385
+ // true: HMailserver is on a remote box (php.ini: com.allow_dcom = true)
386
+ // false: Hmailserver is on same box as PHP
387
+ $config['hmailserver_remote_dcom'] = false;
388
+ // Windows credentials
389
+ $config['hmailserver_server'] = [
390
+ 'Server' => 'localhost', // hostname or ip address
391
+ 'Username' => 'administrator', // windows username
392
+ 'Password' => 'password' // windows user password
393
+ ];
394
+
395
+
396
+ // pw_usermod Driver options
397
+ // --------------------------
398
+ // Use comma delimited exlist to disable password change for users.
399
+ // See "Sudo setup" in README file.
400
+ $config['password_pw_usermod_cmd'] = 'sudo /usr/sbin/pw usermod -h 0 -n';
401
+
402
+
403
+ // DBMail Driver options
404
+ // -------------------
405
+ // Additional arguments for the dbmail-users call
406
+ $config['password_dbmail_args'] = '-p sha512';
407
+
408
+
409
+ // Expect Driver options
410
+ // ---------------------
411
+ // Location of expect binary
412
+ $config['password_expect_bin'] = '/usr/bin/expect';
413
+
414
+ // Location of expect script (see helpers/passwd-expect)
415
+ $config['password_expect_script'] = '';
416
+
417
+ // Arguments for the expect script. See the helpers/passwd-expect file for details.
418
+ // This is probably a good starting default:
419
+ // -telnet -host localhost -output /tmp/passwd.log -log /tmp/passwd.log
420
+ $config['password_expect_params'] = '';
421
+
422
+
423
+ // smb Driver options
424
+ // ---------------------
425
+ // Samba host (default: localhost)
426
+ // Supported replacement variables:
427
+ // %n - hostname ($_SERVER['SERVER_NAME'])
428
+ // %t - hostname without the first part
429
+ // %d - domain (http hostname $_SERVER['HTTP_HOST'] without the first part)
430
+ $config['password_smb_host'] = 'localhost';
431
+ // Location of smbpasswd binary (default: /usr/bin/smbpasswd)
432
+ $config['password_smb_cmd'] = '/usr/bin/smbpasswd';
433
+
434
+ // gearman driver options
435
+ // ---------------------
436
+ // Gearman host (default: localhost)
437
+ $config['password_gearman_host'] = 'localhost';
438
+
439
+
440
+ // Plesk/PPA Driver options
441
+ // --------------------
442
+ // You need to allow RCP for IP of roundcube-server in Plesk/PPA Panel
443
+
444
+ // Plesk RCP Host
445
+ $config['password_plesk_host'] = '10.0.0.5';
446
+
447
+ // Plesk RPC Username
448
+ $config['password_plesk_user'] = 'admin';
449
+
450
+ // Plesk RPC Password
451
+ $config['password_plesk_pass'] = 'password';
452
+
453
+ // Plesk RPC Port
454
+ $config['password_plesk_rpc_port'] = '8443';
455
+
456
+ // Plesk RPC Path
457
+ $config['password_plesk_rpc_path'] = 'enterprise/control/agent.php';
458
+
459
+
460
+ // kpasswd Driver options
461
+ // ---------------------
462
+ // Command to use
463
+ $config['password_kpasswd_cmd'] = '/usr/bin/kpasswd';
464
+
465
+
466
+ // Modoboa Driver options
467
+ // ---------------------
468
+ // put token number from Modoboa server
469
+ $config['password_modoboa_api_token'] = '';
470
+
471
+
472
+ // Mail-in-a-Box Driver options
473
+ // ----------------------------
474
+ // the url to the control panel of Mail-in-a-Box, e.g. https://box.example.com/admin/
475
+ $config['password_miab_url'] = '';
476
+ // name (email) of the admin user used to access api
477
+ $config['password_miab_user'] = '';
478
+ // password of the admin user used to access api
479
+ $config['password_miab_pass'] = '';
480
+
481
+
482
+ // TinyCP
483
+ // --------------
484
+ // TinyCP host, port, user and pass.
485
+ $config['password_tinycp_host'] = '';
486
+ $config['password_tinycp_port'] = '';
487
+ $config['password_tinycp_user'] = '';
488
+ $config['password_tinycp_pass'] = '';
489
+
490
+ // HTTP-API Driver options
491
+ // ---------------------
492
+
493
+ // Base URL of password change API. HTTPS recommended.
494
+ $config['password_httpapi_url'] = 'https://passwordserver.example.org';
495
+
496
+ // Method (also affects how vars are sent). Default: POST.
497
+ // GET is not recommended as passwords will appears in the remote webserver's access log
498
+ $config['password_httpapi_method'] = 'POST';
499
+
500
+ // GET or POST variable in which to put the username
501
+ $config['password_httpapi_var_user'] = 'user';
502
+
503
+ // GET or POST variable in which to put the current password
504
+ $config['password_httpapi_var_curpass'] = 'curpass';
505
+
506
+ // GET or POST variable in which to put the new password
507
+ $config['password_httpapi_var_newpass'] = 'newpass';
508
+
509
+ // HTTP codes other than 2xx are assumed to mean the password changed failed.
510
+ // Optionally, if set, this variable additionally checks the body of the 2xx response to
511
+ // confirm the change. It's a preg_match regular expression.
512
+ $config['password_httpapi_expect'] = '/^ok$/i';
513
+
514
+
515
+ // dovecot_passwdfile
516
+ // ------------------
517
+ $config['password_dovecot_passwdfile_path'] = '/etc/mail/imap.passwd';
518
+
519
+
520
+ // Mailcow driver options
521
+ // ----------------------
522
+ $config['password_mailcow_api_host'] = 'localhost';
523
+ $config['password_mailcow_api_token'] = '';
@@ -1,6 +1,5 @@
1
1
  roundcubeone:
2
2
  fqdn: "yourroundcubeone.yourdomain.com"
3
- image: "roundcube/roundcubemail:1.6.8-apache"
4
3
  sysadmin_email: "adminname@yourdomain.com"
5
4
  networks: ["mysqlone-network"]
6
5
  database_type: "mysql"
@@ -15,13 +14,17 @@ roundcubeone:
15
14
  smtp_port: 587
16
15
  request_path: "/"
17
16
  plugins: ["password", "managesieve", "archive", "zipdownload"]
17
+ plugins_password_database_type: "mysql"
18
+ plugins_password_database_host: mysqlone
19
+ plugins_password_database_user: <%= SmartMachine.credentials.dig(:emailerone, :mysql_user) %>
20
+ plugins_password_database_pass: <%= SmartMachine.credentials.dig(:emailerone, :mysql_password) %>
21
+ plugins_password_database_name: <%= SmartMachine.credentials.dig(:emailerone, :mysql_database_name) %>
18
22
  skin: "elastic"
19
23
  upload_max_filesize: "5M"
20
24
  aspell_dictionaries: ["en"]
21
25
 
22
26
  # roundcubetwo:
23
27
  # fqdn: "yourroundcubetwo.yourdomain.com"
24
- # image: "roundcube/roundcubemail:1.6.8-apache"
25
28
  # sysadmin_email: "adminname@yourdomain.com"
26
29
  # networks: ["mysqlone-network"]
27
30
  # database_type: "mysql"
@@ -30,12 +33,17 @@ roundcubeone:
30
33
  # database_user: <%= SmartMachine.credentials.dig(:roundcubetwo, :database_user) %>
31
34
  # database_pass: <%= SmartMachine.credentials.dig(:roundcubetwo, :database_pass) %>
32
35
  # database_name: <%= SmartMachine.credentials.dig(:roundcubetwo, :database_name) %>
33
- # mail_host: "ssl://youremailerone.yourdomain.com"
36
+ # mail_host: "ssl://youremailertwo.yourdomain.com"
34
37
  # mail_port: 993
35
- # smtp_host: "tls://youremailerone.yourdomain.com"
38
+ # smtp_host: "tls://youremailertwo.yourdomain.com"
36
39
  # smtp_port: 587
37
40
  # request_path: "/"
38
41
  # plugins: ["password", "managesieve", "archive", "zipdownload"]
42
+ # plugins_password_database_type: "mysql"
43
+ # plugins_password_database_host: mysqlone
44
+ # plugins_password_database_user: <%= SmartMachine.credentials.dig(:emailertwo, :mysql_user) %>
45
+ # plugins_password_database_pass: <%= SmartMachine.credentials.dig(:emailertwo, :mysql_password) %>
46
+ # plugins_password_database_name: <%= SmartMachine.credentials.dig(:emailertwo, :mysql_database_name) %>
39
47
  # skin: "elastic"
40
48
  # upload_max_filesize: "5M"
41
49
  # aspell_dictionaries: ["en"]
@@ -17,7 +17,7 @@ module SmartMachine
17
17
  module VERSION
18
18
  MAJOR = 1
19
19
  MINOR = 3
20
- TINY = 0
20
+ TINY = 1
21
21
  PRE = nil
22
22
 
23
23
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smartmachine
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - plainsource
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-08-19 00:00:00.000000000 Z
11
+ date: 2025-05-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: net-ssh
@@ -31,9 +31,9 @@ dependencies:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '1.2'
34
- - - "<"
34
+ - - "<="
35
35
  - !ruby/object:Gem::Version
36
- version: '2.0'
36
+ version: 1.3.0
37
37
  type: :runtime
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
@@ -41,9 +41,9 @@ dependencies:
41
41
  - - ">="
42
42
  - !ruby/object:Gem::Version
43
43
  version: '1.2'
44
- - - "<"
44
+ - - "<="
45
45
  - !ruby/object:Gem::Version
46
- version: '2.0'
46
+ version: 1.3.0
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: bcrypt_pbkdf
49
49
  requirement: !ruby/object:Gem::Requirement
@@ -84,6 +84,26 @@ dependencies:
84
84
  - - ">="
85
85
  - !ruby/object:Gem::Version
86
86
  version: 3.1.13
87
+ - !ruby/object:Gem::Dependency
88
+ name: zeitwerk
89
+ requirement: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: '2.6'
94
+ - - "<="
95
+ - !ruby/object:Gem::Version
96
+ version: 2.6.18
97
+ type: :runtime
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.6'
104
+ - - "<="
105
+ - !ruby/object:Gem::Version
106
+ version: 2.6.18
87
107
  - !ruby/object:Gem::Dependency
88
108
  name: activesupport
89
109
  requirement: !ruby/object:Gem::Requirement
@@ -91,6 +111,9 @@ dependencies:
91
111
  - - "~>"
92
112
  - !ruby/object:Gem::Version
93
113
  version: '6.0'
114
+ - - "<="
115
+ - !ruby/object:Gem::Version
116
+ version: 6.1.7.8
94
117
  type: :runtime
95
118
  prerelease: false
96
119
  version_requirements: !ruby/object:Gem::Requirement
@@ -98,6 +121,9 @@ dependencies:
98
121
  - - "~>"
99
122
  - !ruby/object:Gem::Version
100
123
  version: '6.0'
124
+ - - "<="
125
+ - !ruby/object:Gem::Version
126
+ version: 6.1.7.8
101
127
  - !ruby/object:Gem::Dependency
102
128
  name: thor
103
129
  requirement: !ruby/object:Gem::Requirement
@@ -205,7 +231,7 @@ files:
205
231
  - lib/smart_machine/grids/certbot.rb
206
232
  - lib/smart_machine/grids/elasticsearch.rb
207
233
  - lib/smart_machine/grids/emailer.rb
208
- - lib/smart_machine/grids/emailer/.keep
234
+ - lib/smart_machine/grids/emailer/imapsync.rb
209
235
  - lib/smart_machine/grids/haproxy.rb
210
236
  - lib/smart_machine/grids/mariadb.rb
211
237
  - lib/smart_machine/grids/minio.rb
@@ -221,6 +247,7 @@ files:
221
247
  - lib/smart_machine/grids/redis.rb
222
248
  - lib/smart_machine/grids/redmine.rb
223
249
  - lib/smart_machine/grids/roundcube.rb
250
+ - lib/smart_machine/grids/roundcube/.keep
224
251
  - lib/smart_machine/grids/solr.rb
225
252
  - lib/smart_machine/grids/solr/config/.keep
226
253
  - lib/smart_machine/grids/solr/config/README.txt
@@ -448,9 +475,12 @@ files:
448
475
  - lib/smart_machine/templates/dotsmartmachine/config/prereceiver.yml
449
476
  - lib/smart_machine/templates/dotsmartmachine/config/redis.yml
450
477
  - lib/smart_machine/templates/dotsmartmachine/config/roundcube.yml
478
+ - lib/smart_machine/templates/dotsmartmachine/config/roundcube/docker/custom-docker-entrypoint.sh
479
+ - lib/smart_machine/templates/dotsmartmachine/config/roundcube/docker/entrypoint.rb
451
480
  - lib/smart_machine/templates/dotsmartmachine/config/roundcube/etc/apache2/sites-available/000-default.conf
452
481
  - lib/smart_machine/templates/dotsmartmachine/config/roundcube/usr/local/etc/php/conf.d/zzz_roundcube-custom.ini
453
482
  - lib/smart_machine/templates/dotsmartmachine/config/roundcube/var/roundcube/config/config.custom.inc.php
483
+ - lib/smart_machine/templates/dotsmartmachine/config/roundcube/var/www/html/plugins/password/config.inc.php
454
484
  - lib/smart_machine/templates/dotsmartmachine/config/terminal.yml
455
485
  - lib/smart_machine/templates/dotsmartmachine/config/users.yml
456
486
  - lib/smart_machine/templates/dotsmartmachine/gitignore-template
@@ -468,8 +498,8 @@ licenses:
468
498
  metadata:
469
499
  homepage_uri: https://github.com/plainsource/smartmachine
470
500
  bug_tracker_uri: https://github.com/plainsource/smartmachine/issues
471
- changelog_uri: https://github.com/plainsource/smartmachine/releases/tag/v1.3.0
472
- source_code_uri: https://github.com/plainsource/smartmachine/tree/v1.3.0
501
+ changelog_uri: https://github.com/plainsource/smartmachine/releases/tag/v1.3.1
502
+ source_code_uri: https://github.com/plainsource/smartmachine/tree/v1.3.1
473
503
  post_install_message:
474
504
  rdoc_options: []
475
505
  require_paths: