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.
Files changed (46) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ruby.yml +37 -0
  3. data/.gitignore +2 -0
  4. data/.rubocop.yml +2 -0
  5. data/CHANGELOG.md +22 -0
  6. data/README.md +47 -32
  7. data/Rakefile +6 -0
  8. data/bin/console +18 -0
  9. data/docker-admin/Dockerfile +6 -0
  10. data/docker-admin/config.local.php +21 -0
  11. data/docker-app-2.5/Dockerfile +15 -0
  12. data/docker-app/Dockerfile +25 -0
  13. data/docker-app/docker-entrypoint.sh +5 -0
  14. data/docker-app/my.cnf +5 -0
  15. data/docker-compose.yml +46 -0
  16. data/docker-db/postfix.v1841.sql +383 -0
  17. data/{spec/postfix_test.sql → docker-db/postfix.v352.sql} +1 -28
  18. data/docker-db/postfix.v740.sql +269 -0
  19. data/{bin → exe}/postfix_admin +1 -0
  20. data/lib/postfix_admin.rb +1 -1
  21. data/lib/postfix_admin/admin.rb +62 -0
  22. data/lib/postfix_admin/alias.rb +65 -0
  23. data/lib/postfix_admin/application_record.rb +44 -0
  24. data/lib/postfix_admin/base.rb +120 -75
  25. data/lib/postfix_admin/cli.rb +173 -58
  26. data/lib/postfix_admin/concerns/.keep +0 -0
  27. data/lib/postfix_admin/concerns/dovecot_cram_md5_password.rb +30 -0
  28. data/lib/postfix_admin/concerns/existing_timestamp.rb +18 -0
  29. data/lib/postfix_admin/domain.rb +98 -0
  30. data/lib/postfix_admin/domain_admin.rb +8 -0
  31. data/lib/postfix_admin/doveadm.rb +37 -0
  32. data/lib/postfix_admin/log.rb +5 -0
  33. data/lib/postfix_admin/mail_domain.rb +9 -0
  34. data/lib/postfix_admin/mailbox.rb +89 -0
  35. data/lib/postfix_admin/models.rb +10 -170
  36. data/lib/postfix_admin/quota.rb +6 -0
  37. data/lib/postfix_admin/runner.rb +108 -36
  38. data/lib/postfix_admin/version.rb +1 -1
  39. data/postfix_admin.gemspec +22 -12
  40. metadata +80 -55
  41. data/spec/base_spec.rb +0 -235
  42. data/spec/cli_spec.rb +0 -286
  43. data/spec/models_spec.rb +0 -146
  44. data/spec/postfix_admin.conf +0 -5
  45. data/spec/runner_spec.rb +0 -194
  46. 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 */;
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ $LOAD_PATH << File.expand_path(File.dirname(__FILE__) + "/../lib")
3
4
  require 'postfix_admin/runner'
4
5
 
5
6
  PostfixAdmin::Runner.start
@@ -2,5 +2,5 @@ require "postfix_admin/version"
2
2
  require "postfix_admin/base"
3
3
 
4
4
  module PostfixAdmin
5
- KB_TO_MB = 1024000
5
+ KB_TO_MB = 1_024_000
6
6
  end
@@ -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