postfix_admin 0.1.1 → 0.2.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 +5 -5
- data/.github/workflows/ruby.yml +37 -0
- data/.gitignore +2 -0
- data/.rubocop.yml +2 -0
- data/CHANGELOG.md +22 -0
- data/README.md +47 -32
- data/Rakefile +6 -0
- data/bin/console +18 -0
- data/docker-admin/Dockerfile +6 -0
- data/docker-admin/config.local.php +21 -0
- data/docker-app-2.5/Dockerfile +15 -0
- data/docker-app/Dockerfile +25 -0
- data/docker-app/docker-entrypoint.sh +5 -0
- data/docker-app/my.cnf +5 -0
- data/docker-compose.yml +46 -0
- data/docker-db/postfix.v1841.sql +383 -0
- data/{spec/postfix_test.sql → docker-db/postfix.v352.sql} +1 -28
- data/docker-db/postfix.v740.sql +269 -0
- data/{bin → exe}/postfix_admin +1 -0
- data/lib/postfix_admin.rb +1 -1
- data/lib/postfix_admin/admin.rb +62 -0
- data/lib/postfix_admin/alias.rb +65 -0
- data/lib/postfix_admin/application_record.rb +44 -0
- data/lib/postfix_admin/base.rb +120 -75
- data/lib/postfix_admin/cli.rb +173 -58
- data/lib/postfix_admin/concerns/.keep +0 -0
- data/lib/postfix_admin/concerns/dovecot_cram_md5_password.rb +30 -0
- data/lib/postfix_admin/concerns/existing_timestamp.rb +18 -0
- data/lib/postfix_admin/domain.rb +98 -0
- data/lib/postfix_admin/domain_admin.rb +8 -0
- data/lib/postfix_admin/doveadm.rb +37 -0
- data/lib/postfix_admin/log.rb +5 -0
- data/lib/postfix_admin/mail_domain.rb +9 -0
- data/lib/postfix_admin/mailbox.rb +89 -0
- data/lib/postfix_admin/models.rb +10 -170
- data/lib/postfix_admin/quota.rb +6 -0
- data/lib/postfix_admin/runner.rb +108 -36
- data/lib/postfix_admin/version.rb +1 -1
- data/postfix_admin.gemspec +22 -12
- metadata +80 -55
- data/spec/base_spec.rb +0 -235
- data/spec/cli_spec.rb +0 -286
- data/spec/models_spec.rb +0 -146
- data/spec/postfix_admin.conf +0 -5
- data/spec/runner_spec.rb +0 -194
- data/spec/spec_helper.rb +0 -159
@@ -35,14 +35,6 @@ CREATE TABLE IF NOT EXISTS `admin` (
|
|
35
35
|
PRIMARY KEY (`username`)
|
36
36
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Postfix Admin - Virtual Admins';
|
37
37
|
|
38
|
-
--
|
39
|
-
-- テーブルのデータをダンプしています `admin`
|
40
|
-
--
|
41
|
-
|
42
|
-
INSERT INTO `admin` (`username`, `password`, `created`, `modified`, `active`) VALUES
|
43
|
-
('all@example.com', 'password', '2012-08-31 15:39:02', '2012-08-31 15:39:19', 1),
|
44
|
-
('admin@example.com', 'password', '2012-08-31 10:27:58', '2012-08-31 10:28:16', 1);
|
45
|
-
|
46
38
|
-- --------------------------------------------------------
|
47
39
|
|
48
40
|
--
|
@@ -63,9 +55,6 @@ CREATE TABLE IF NOT EXISTS `alias` (
|
|
63
55
|
-- テーブルのデータをダンプしています `alias`
|
64
56
|
--
|
65
57
|
|
66
|
-
INSERT INTO `alias` (`address`, `goto`, `domain`, `created`, `modified`, `active`) VALUES
|
67
|
-
('user@example.com', 'user@example.com', 'example.com', '2012-08-31 10:24:12', '2012-08-31 10:24:12', 1);
|
68
|
-
|
69
58
|
-- --------------------------------------------------------
|
70
59
|
|
71
60
|
--
|
@@ -113,8 +102,7 @@ CREATE TABLE IF NOT EXISTS `domain` (
|
|
113
102
|
--
|
114
103
|
|
115
104
|
INSERT INTO `domain` (`domain`, `description`, `aliases`, `mailboxes`, `maxquota`, `quota`, `transport`, `backupmx`, `created`, `modified`, `active`) VALUES
|
116
|
-
('ALL', '', 0, 0, 0, 0, NULL, 0, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 1)
|
117
|
-
('example.com', '', 100, 100, 100, 0, 'virtual', 0, '2012-08-31 10:21:49', '2012-08-31 10:21:49', 1);
|
105
|
+
('ALL', '', 0, 0, 0, 0, NULL, 0, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 1);
|
118
106
|
|
119
107
|
-- --------------------------------------------------------
|
120
108
|
|
@@ -130,14 +118,6 @@ CREATE TABLE IF NOT EXISTS `domain_admins` (
|
|
130
118
|
KEY `username` (`username`)
|
131
119
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Postfix Admin - Domain Admins';
|
132
120
|
|
133
|
-
--
|
134
|
-
-- テーブルのデータをダンプしています `domain_admins`
|
135
|
-
--
|
136
|
-
|
137
|
-
INSERT INTO `domain_admins` (`username`, `domain`, `created`, `active`) VALUES
|
138
|
-
('all@example.com', 'ALL', '2012-08-31 15:39:19', 1),
|
139
|
-
('admin@example.com', 'example.com', '2012-08-31 10:28:16', 1);
|
140
|
-
|
141
121
|
-- --------------------------------------------------------
|
142
122
|
|
143
123
|
--
|
@@ -197,13 +177,6 @@ CREATE TABLE IF NOT EXISTS `mailbox` (
|
|
197
177
|
PRIMARY KEY (`username`)
|
198
178
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Postfix Admin - Virtual Mailboxes';
|
199
179
|
|
200
|
-
--
|
201
|
-
-- テーブルのデータをダンプしています `mailbox`
|
202
|
-
--
|
203
|
-
|
204
|
-
INSERT INTO `mailbox` (`username`, `password`, `name`, `maildir`, `quota`, `domain`, `created`, `modified`, `active`) VALUES
|
205
|
-
('user@example.com', 'password', '', 'example.com/user@example.com/', 102400000, 'example.com', '2012-08-31 10:24:12', '2012-08-31 10:24:12', 1);
|
206
|
-
|
207
180
|
-- --------------------------------------------------------
|
208
181
|
|
209
182
|
--
|
@@ -0,0 +1,269 @@
|
|
1
|
+
|
2
|
+
-- phpMyAdmin SQL Dump
|
3
|
+
-- version 3.5.7
|
4
|
+
-- http://www.phpmyadmin.net
|
5
|
+
--
|
6
|
+
-- ホスト: localhost
|
7
|
+
-- 生成日時: 2013 年 5 月 09 日 08:25
|
8
|
+
-- サーバのバージョン: 5.5.29
|
9
|
+
-- PHP のバージョン: 5.3.20
|
10
|
+
|
11
|
+
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
|
12
|
+
SET time_zone = "+00:00";
|
13
|
+
|
14
|
+
|
15
|
+
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
16
|
+
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
17
|
+
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
18
|
+
/*!40101 SET NAMES utf8 */;
|
19
|
+
|
20
|
+
--
|
21
|
+
-- データベース: `postfix`
|
22
|
+
--
|
23
|
+
|
24
|
+
-- --------------------------------------------------------
|
25
|
+
|
26
|
+
--
|
27
|
+
-- テーブルの構造 `admin`
|
28
|
+
--
|
29
|
+
|
30
|
+
CREATE TABLE IF NOT EXISTS `admin` (
|
31
|
+
`username` varchar(255) NOT NULL,
|
32
|
+
`password` varchar(255) NOT NULL,
|
33
|
+
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
34
|
+
`modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
35
|
+
`active` tinyint(1) NOT NULL DEFAULT '1',
|
36
|
+
PRIMARY KEY (`username`)
|
37
|
+
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='Postfix Admin - Virtual Admins';
|
38
|
+
|
39
|
+
-- --------------------------------------------------------
|
40
|
+
|
41
|
+
--
|
42
|
+
-- テーブルの構造 `alias`
|
43
|
+
--
|
44
|
+
|
45
|
+
CREATE TABLE IF NOT EXISTS `alias` (
|
46
|
+
`address` varchar(255) NOT NULL,
|
47
|
+
`goto` text NOT NULL,
|
48
|
+
`domain` varchar(255) NOT NULL,
|
49
|
+
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
50
|
+
`modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
51
|
+
`active` tinyint(1) NOT NULL DEFAULT '1',
|
52
|
+
PRIMARY KEY (`address`),
|
53
|
+
KEY `domain` (`domain`)
|
54
|
+
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='Postfix Admin - Virtual Aliases';
|
55
|
+
|
56
|
+
-- --------------------------------------------------------
|
57
|
+
|
58
|
+
--
|
59
|
+
-- テーブルの構造 `alias_domain`
|
60
|
+
--
|
61
|
+
|
62
|
+
CREATE TABLE IF NOT EXISTS `alias_domain` (
|
63
|
+
`alias_domain` varchar(255) NOT NULL,
|
64
|
+
`target_domain` varchar(255) NOT NULL,
|
65
|
+
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
66
|
+
`modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
67
|
+
`active` tinyint(1) NOT NULL DEFAULT '1',
|
68
|
+
PRIMARY KEY (`alias_domain`),
|
69
|
+
KEY `active` (`active`),
|
70
|
+
KEY `target_domain` (`target_domain`)
|
71
|
+
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='Postfix Admin - Domain Aliases';
|
72
|
+
|
73
|
+
-- --------------------------------------------------------
|
74
|
+
|
75
|
+
--
|
76
|
+
-- テーブルの構造 `config`
|
77
|
+
--
|
78
|
+
|
79
|
+
CREATE TABLE IF NOT EXISTS `config` (
|
80
|
+
`id` int(11) NOT NULL AUTO_INCREMENT,
|
81
|
+
`name` varchar(20) CHARACTER SET utf8 NOT NULL DEFAULT '',
|
82
|
+
`value` varchar(20) CHARACTER SET utf8 NOT NULL DEFAULT '',
|
83
|
+
PRIMARY KEY (`id`),
|
84
|
+
UNIQUE KEY `name` (`name`)
|
85
|
+
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='PostfixAdmin settings' AUTO_INCREMENT=2 ;
|
86
|
+
|
87
|
+
--
|
88
|
+
-- テーブルのデータのダンプ `config`
|
89
|
+
--
|
90
|
+
|
91
|
+
INSERT INTO `config` (`id`, `name`, `value`) VALUES
|
92
|
+
(1, 'version', '740');
|
93
|
+
|
94
|
+
-- --------------------------------------------------------
|
95
|
+
|
96
|
+
--
|
97
|
+
-- テーブルの構造 `domain`
|
98
|
+
--
|
99
|
+
|
100
|
+
CREATE TABLE IF NOT EXISTS `domain` (
|
101
|
+
`domain` varchar(255) NOT NULL,
|
102
|
+
`description` varchar(255) CHARACTER SET utf8 NOT NULL,
|
103
|
+
`aliases` int(10) NOT NULL DEFAULT '0',
|
104
|
+
`mailboxes` int(10) NOT NULL DEFAULT '0',
|
105
|
+
`maxquota` bigint(20) NOT NULL DEFAULT '0',
|
106
|
+
`quota` bigint(20) NOT NULL DEFAULT '0',
|
107
|
+
`transport` varchar(255) NOT NULL,
|
108
|
+
`backupmx` tinyint(1) NOT NULL DEFAULT '0',
|
109
|
+
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
110
|
+
`modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
111
|
+
`active` tinyint(1) NOT NULL DEFAULT '1',
|
112
|
+
PRIMARY KEY (`domain`)
|
113
|
+
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='Postfix Admin - Virtual Domains';
|
114
|
+
|
115
|
+
--
|
116
|
+
-- テーブルのデータのダンプ `domain`
|
117
|
+
--
|
118
|
+
|
119
|
+
INSERT INTO `domain` (`domain`, `description`, `aliases`, `mailboxes`, `maxquota`, `quota`, `transport`, `backupmx`, `created`, `modified`, `active`) VALUES
|
120
|
+
('ALL', '', 0, 0, 0, 0, '', 0, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 1);
|
121
|
+
|
122
|
+
-- --------------------------------------------------------
|
123
|
+
|
124
|
+
--
|
125
|
+
-- テーブルの構造 `domain_admins`
|
126
|
+
--
|
127
|
+
|
128
|
+
CREATE TABLE IF NOT EXISTS `domain_admins` (
|
129
|
+
`username` varchar(255) NOT NULL,
|
130
|
+
`domain` varchar(255) NOT NULL,
|
131
|
+
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
132
|
+
`active` tinyint(1) NOT NULL DEFAULT '1',
|
133
|
+
KEY `username` (`username`)
|
134
|
+
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='Postfix Admin - Domain Admins';
|
135
|
+
|
136
|
+
-- --------------------------------------------------------
|
137
|
+
|
138
|
+
--
|
139
|
+
-- テーブルの構造 `fetchmail`
|
140
|
+
--
|
141
|
+
|
142
|
+
CREATE TABLE IF NOT EXISTS `fetchmail` (
|
143
|
+
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
|
144
|
+
`mailbox` varchar(255) NOT NULL,
|
145
|
+
`src_server` varchar(255) NOT NULL,
|
146
|
+
`src_auth` enum('password','kerberos_v5','kerberos','kerberos_v4','gssapi','cram-md5','otp','ntlm','msn','ssh','any') CHARACTER SET utf8 DEFAULT NULL,
|
147
|
+
`src_user` varchar(255) NOT NULL,
|
148
|
+
`src_password` varchar(255) NOT NULL,
|
149
|
+
`src_folder` varchar(255) NOT NULL,
|
150
|
+
`poll_time` int(11) unsigned NOT NULL DEFAULT '10',
|
151
|
+
`fetchall` tinyint(1) unsigned NOT NULL DEFAULT '0',
|
152
|
+
`keep` tinyint(1) unsigned NOT NULL DEFAULT '0',
|
153
|
+
`protocol` enum('POP3','IMAP','POP2','ETRN','AUTO') CHARACTER SET utf8 DEFAULT NULL,
|
154
|
+
`usessl` tinyint(1) unsigned NOT NULL DEFAULT '0',
|
155
|
+
`extra_options` text,
|
156
|
+
`returned_text` text,
|
157
|
+
`mda` varchar(255) NOT NULL,
|
158
|
+
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
159
|
+
PRIMARY KEY (`id`)
|
160
|
+
) ENGINE=INNODB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
|
161
|
+
|
162
|
+
-- --------------------------------------------------------
|
163
|
+
|
164
|
+
--
|
165
|
+
-- テーブルの構造 `log`
|
166
|
+
--
|
167
|
+
|
168
|
+
CREATE TABLE IF NOT EXISTS `log` (
|
169
|
+
`timestamp` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
170
|
+
`username` varchar(255) NOT NULL,
|
171
|
+
`domain` varchar(255) NOT NULL,
|
172
|
+
`action` varchar(255) NOT NULL,
|
173
|
+
`data` text NOT NULL,
|
174
|
+
KEY `timestamp` (`timestamp`)
|
175
|
+
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='Postfix Admin - Log';
|
176
|
+
|
177
|
+
|
178
|
+
-- --------------------------------------------------------
|
179
|
+
|
180
|
+
--
|
181
|
+
-- テーブルの構造 `mailbox`
|
182
|
+
--
|
183
|
+
|
184
|
+
CREATE TABLE IF NOT EXISTS `mailbox` (
|
185
|
+
`username` varchar(255) NOT NULL,
|
186
|
+
`password` varchar(255) NOT NULL,
|
187
|
+
`name` varchar(255) CHARACTER SET utf8 NOT NULL,
|
188
|
+
`maildir` varchar(255) NOT NULL,
|
189
|
+
`quota` bigint(20) NOT NULL DEFAULT '0',
|
190
|
+
`local_part` varchar(255) NOT NULL,
|
191
|
+
`domain` varchar(255) NOT NULL,
|
192
|
+
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
193
|
+
`modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
194
|
+
`active` tinyint(1) NOT NULL DEFAULT '1',
|
195
|
+
PRIMARY KEY (`username`),
|
196
|
+
KEY `domain` (`domain`)
|
197
|
+
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='Postfix Admin - Virtual Mailboxes';
|
198
|
+
|
199
|
+
|
200
|
+
-- --------------------------------------------------------
|
201
|
+
|
202
|
+
--
|
203
|
+
-- テーブルの構造 `quota`
|
204
|
+
--
|
205
|
+
|
206
|
+
CREATE TABLE IF NOT EXISTS `quota` (
|
207
|
+
`username` varchar(255) CHARACTER SET utf8 NOT NULL,
|
208
|
+
`path` varchar(100) CHARACTER SET utf8 NOT NULL,
|
209
|
+
`current` bigint(20) DEFAULT NULL,
|
210
|
+
PRIMARY KEY (`username`,`path`)
|
211
|
+
) ENGINE=INNODB DEFAULT CHARSET=utf8;
|
212
|
+
|
213
|
+
-- --------------------------------------------------------
|
214
|
+
|
215
|
+
--
|
216
|
+
-- テーブルの構造 `quota2`
|
217
|
+
--
|
218
|
+
|
219
|
+
CREATE TABLE IF NOT EXISTS `quota2` (
|
220
|
+
`username` varchar(100) CHARACTER SET utf8 NOT NULL,
|
221
|
+
`bytes` bigint(20) NOT NULL DEFAULT '0',
|
222
|
+
`messages` int(11) NOT NULL DEFAULT '0',
|
223
|
+
PRIMARY KEY (`username`)
|
224
|
+
) ENGINE=INNODB DEFAULT CHARSET=utf8;
|
225
|
+
|
226
|
+
-- --------------------------------------------------------
|
227
|
+
|
228
|
+
--
|
229
|
+
-- テーブルの構造 `vacation`
|
230
|
+
--
|
231
|
+
|
232
|
+
CREATE TABLE IF NOT EXISTS `vacation` (
|
233
|
+
`email` varchar(255) NOT NULL,
|
234
|
+
`subject` varchar(255) CHARACTER SET utf8 NOT NULL,
|
235
|
+
`body` text CHARACTER SET utf8 NOT NULL,
|
236
|
+
`cache` text NOT NULL,
|
237
|
+
`domain` varchar(255) NOT NULL,
|
238
|
+
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
239
|
+
`active` tinyint(1) NOT NULL DEFAULT '1',
|
240
|
+
PRIMARY KEY (`email`),
|
241
|
+
KEY `email` (`email`)
|
242
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Postfix Admin - Virtual Vacation';
|
243
|
+
|
244
|
+
-- --------------------------------------------------------
|
245
|
+
|
246
|
+
--
|
247
|
+
-- テーブルの構造 `vacation_notification`
|
248
|
+
--
|
249
|
+
|
250
|
+
CREATE TABLE IF NOT EXISTS `vacation_notification` (
|
251
|
+
`on_vacation` varchar(150) CHARACTER SET utf8 NOT NULL,
|
252
|
+
`notified` varchar(150) NOT NULL,
|
253
|
+
`notified_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
254
|
+
PRIMARY KEY (`on_vacation`,`notified`)
|
255
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Postfix Admin - Virtual Vacation Notifications';
|
256
|
+
|
257
|
+
--
|
258
|
+
-- ダンプしたテーブルの制約
|
259
|
+
--
|
260
|
+
|
261
|
+
--
|
262
|
+
-- テーブルの制約 `vacation_notification`
|
263
|
+
--
|
264
|
+
ALTER TABLE `vacation_notification`
|
265
|
+
ADD CONSTRAINT `vacation_notification_pkey` FOREIGN KEY (`on_vacation`) REFERENCES `vacation` (`email`) ON DELETE CASCADE;
|
266
|
+
|
267
|
+
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
268
|
+
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
269
|
+
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
data/{bin → exe}/postfix_admin
RENAMED
data/lib/postfix_admin.rb
CHANGED
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'postfix_admin/concerns/dovecot_cram_md5_password'
|
2
|
+
|
3
|
+
module PostfixAdmin
|
4
|
+
class Admin < ApplicationRecord
|
5
|
+
self.table_name = :admin
|
6
|
+
self.primary_key = :username
|
7
|
+
|
8
|
+
include DovecotCramMD5Password
|
9
|
+
|
10
|
+
validates :username, presence: true, uniqueness: { case_sensitive: false },
|
11
|
+
format: { with: RE_EMAIL_LIKE_WITH_ANCHORS,
|
12
|
+
message: "must be a valid email address" }
|
13
|
+
|
14
|
+
has_many :domain_admins, foreign_key: :username, dependent: :delete_all
|
15
|
+
has_many :rel_domains, through: :domain_admins
|
16
|
+
|
17
|
+
attr_accessor :domain_ids
|
18
|
+
attribute :form_super_admin, :boolean, default: false
|
19
|
+
|
20
|
+
# just in case
|
21
|
+
validate on: :update do |admin|
|
22
|
+
admin.errors.add(:username, 'cannot be changed') if admin.username_changed?
|
23
|
+
end
|
24
|
+
|
25
|
+
def super_admin?
|
26
|
+
if @super_admin.nil?
|
27
|
+
@super_admin = if has_superadmin_column?
|
28
|
+
self.superadmin && rel_domains.exists?("ALL")
|
29
|
+
else
|
30
|
+
rel_domains.exists?("ALL")
|
31
|
+
end
|
32
|
+
else
|
33
|
+
@super_admin
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def super_admin=(value)
|
38
|
+
if value
|
39
|
+
domain_ids = self.rel_domain_ids.dup
|
40
|
+
domain_ids << "ALL"
|
41
|
+
self.rel_domain_ids = domain_ids
|
42
|
+
self.superadmin = true if has_superadmin_column?
|
43
|
+
else
|
44
|
+
domain_admins.where(domain: "ALL").delete_all
|
45
|
+
self.superadmin = false if has_superadmin_column?
|
46
|
+
end
|
47
|
+
save!
|
48
|
+
end
|
49
|
+
|
50
|
+
def has_superadmin_column?
|
51
|
+
has_attribute?(:superadmin)
|
52
|
+
end
|
53
|
+
|
54
|
+
def has_admin?(admin)
|
55
|
+
self == admin || super_admin?
|
56
|
+
end
|
57
|
+
|
58
|
+
def has_domain?(domain)
|
59
|
+
!rel_domains.where(domain: ["ALL", domain.domain]).empty?
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module PostfixAdmin
|
2
|
+
class Alias < ApplicationRecord
|
3
|
+
self.table_name = :alias
|
4
|
+
self.primary_key = :address
|
5
|
+
|
6
|
+
validate on: :create do |a|
|
7
|
+
domain = a.rel_domain
|
8
|
+
if domain.aliases.zero? || a.mailbox
|
9
|
+
elsif domain.rel_aliases.pure.count >= domain.aliases
|
10
|
+
message = "already has the maximum number of aliases " \
|
11
|
+
"(maximum is #{domain.aliases} aliases)"
|
12
|
+
a.errors.add(:domain, message)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
validates :address, presence: true, uniqueness: { case_sensitive: false },
|
17
|
+
format: { with: RE_EMAIL_LIKE_WITH_ANCHORS,
|
18
|
+
message: "must be a valid email address" }
|
19
|
+
validates :goto, presence: true
|
20
|
+
|
21
|
+
belongs_to :rel_domain, class_name: "Domain", foreign_key: :domain
|
22
|
+
belongs_to :mailbox, foreign_key: :address, optional: true
|
23
|
+
|
24
|
+
scope :pure, -> { joins("LEFT OUTER JOIN mailbox ON alias.address = mailbox.username").where("mailbox.username" => nil) }
|
25
|
+
|
26
|
+
attribute :local_part, :string
|
27
|
+
attr_writer :forward_addresses
|
28
|
+
|
29
|
+
def forward_addresses
|
30
|
+
if @forward_addresses.nil?
|
31
|
+
if goto.nil?
|
32
|
+
[nil]
|
33
|
+
else
|
34
|
+
goto.split(",") + [nil]
|
35
|
+
end
|
36
|
+
else
|
37
|
+
@forward_addresses
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
before_validation do |a|
|
42
|
+
unless a.address
|
43
|
+
a.address = "#{a.local_part}@#{a.domain}" unless a.local_part.empty?
|
44
|
+
end
|
45
|
+
|
46
|
+
unless a.forward_addresses.empty?
|
47
|
+
forward_addresses = a.forward_addresses.dup
|
48
|
+
forward_addresses.delete_if { |f| f.blank? }
|
49
|
+
a.goto = forward_addresses.join(",")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def mailbox?
|
54
|
+
!!mailbox
|
55
|
+
end
|
56
|
+
|
57
|
+
def pure_alias?
|
58
|
+
!mailbox
|
59
|
+
end
|
60
|
+
|
61
|
+
def gotos
|
62
|
+
goto.split(",")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|