postfix_admin 0.1.4 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -20,17 +20,21 @@ module PostfixAdmin
20
20
  @config_file = value
21
21
  end
22
22
 
23
+ def db_setup
24
+ @base.db_setup
25
+ end
26
+
23
27
  def show(name)
24
28
  name = name.downcase if name
25
29
 
26
30
  if name =~ /@/
27
- if Admin.exist?(name)
31
+ if Admin.exists?(name)
28
32
  show_admin_details(name)
29
33
  end
30
34
 
31
- if Mailbox.exist?(name)
35
+ if Mailbox.exists?(name)
32
36
  show_account_details(name)
33
- elsif Alias.exist?(name)
37
+ elsif Alias.exists?(name)
34
38
  show_alias_details(name)
35
39
  end
36
40
 
@@ -49,7 +53,7 @@ module PostfixAdmin
49
53
  end
50
54
  end
51
55
 
52
- def show_summary(domain_name=nil)
56
+ def show_summary(domain_name = nil)
53
57
  title = "Summary"
54
58
  if domain_name
55
59
  domain_name = domain_name.downcase
@@ -60,15 +64,15 @@ module PostfixAdmin
60
64
  report(title) do
61
65
  if domain_name
62
66
  domain = Domain.find(domain_name)
63
- puts "Mailboxes : %4d / %4s" % [domain.mailboxes.count, max_str(domain.maxmailboxes)]
64
- puts "Aliases : %4d / %4s" % [domain.num_total_aliases, max_str(domain.maxaliases)]
67
+ puts "Mailboxes : %4d / %4s" % [domain.rel_mailboxes.count, max_str(domain.mailboxes)]
68
+ puts "Aliases : %4d / %4s" % [domain.pure_aliases.count, max_str(domain.aliases)]
65
69
  puts "Max Quota : %4d MB" % domain.maxquota
66
70
  puts "Active : %3s" % domain.active_str
67
71
  else
68
- puts "Domains : %4d" % Domain.all_without_special_domain.count
72
+ puts "Domains : %4d" % Domain.without_all.count
69
73
  puts "Admins : %4d" % Admin.count
70
74
  puts "Mailboxes : %4d" % Mailbox.count
71
- puts "Aliases : %4d" % Domain.num_total_aliases
75
+ puts "Aliases : %4d" % Alias.pure.count
72
76
  end
73
77
  end
74
78
  end
@@ -102,7 +106,7 @@ module PostfixAdmin
102
106
  report("Admin") do
103
107
  puts "Name : %s" % admin.username
104
108
  puts "Password : %s" % admin.password
105
- puts "Domains : %s" % (admin.super_admin? ? "ALL" : admin.domains.count)
109
+ puts "Domains : %s" % (admin.super_admin? ? "ALL" : admin.rel_domains.count)
106
110
  puts "Role : %s" % (admin.super_admin? ? "Super admin" : "Admin")
107
111
  puts "Active : %s" % admin.active_str
108
112
  end
@@ -121,18 +125,17 @@ module PostfixAdmin
121
125
  def show_domain
122
126
  index = " No. Domain Aliases Mailboxes Quota (MB) Active"
123
127
  report('Domains', index) do
124
- if Domain.all_without_special_domain.empty?
128
+ if Domain.without_all.empty?
125
129
  puts " No domains"
126
130
  next
127
131
  end
128
132
 
129
- Domain.all_without_special_domain.each_with_index do |d, i|
133
+ Domain.without_all.each_with_index do |d, i|
130
134
  puts "%4d %-30s %3d /%3s %3d /%3s %10d %-3s" %
131
- [i+1, d.domain_name, d.num_total_aliases, max_str(d.maxaliases),
132
- d.mailboxes.count, max_str(d.maxmailboxes), d.maxquota, d.active_str]
135
+ [i+1, d.domain, d.pure_aliases.count, max_str(d.aliases),
136
+ d.rel_mailboxes.count, max_str(d.mailboxes), d.maxquota, d.active_str]
133
137
  end
134
138
  end
135
-
136
139
  end
137
140
 
138
141
  def add_domain(domain_name)
@@ -151,9 +154,13 @@ module PostfixAdmin
151
154
  def edit_admin(admin_name, options)
152
155
  admin_check(admin_name)
153
156
  admin = Admin.find(admin_name)
154
- admin.super_admin = options[:super] unless options[:super].nil?
157
+
158
+ unless options[:super].nil?
159
+ admin.super_admin = options[:super]
160
+ end
161
+
155
162
  admin.active = options[:active] unless options[:active].nil?
156
- admin.save or raise "Could not save Admin"
163
+ admin.save!
157
164
 
158
165
  puts "Successfully updated #{admin_name}"
159
166
  show_admin_details(admin_name)
@@ -162,11 +169,11 @@ module PostfixAdmin
162
169
  def edit_domain(domain_name, options)
163
170
  domain_check(domain_name)
164
171
  domain = Domain.find(domain_name)
165
- domain.maxaliases = options[:aliases] if options[:aliases]
166
- domain.maxmailboxes = options[:mailboxes] if options[:mailboxes]
172
+ domain.aliases = options[:aliases] if options[:aliases]
173
+ domain.mailboxes = options[:mailboxes] if options[:mailboxes]
167
174
  domain.maxquota = options[:maxquota] if options[:maxquota]
168
175
  domain.active = options[:active] unless options[:active].nil?
169
- domain.save or raise "Could not save Domain"
176
+ domain.save!
170
177
 
171
178
  puts "Successfully updated #{domain_name}"
172
179
  show_summary(domain_name)
@@ -177,8 +184,8 @@ module PostfixAdmin
177
184
  puts_deleted(domain_name)
178
185
  end
179
186
 
180
- def show_admin(domain_name=nil)
181
- admins = domain_name ? Admin.select{|a| a.has_domain?(domain_name)} : Admin.all
187
+ def show_admin(domain_name = nil)
188
+ admins = domain_name ? Admin.select { |a| a.rel_domains.exists?(domain_name) } : Admin.all
182
189
  index = " No. Admin Domains Active"
183
190
  report("Admins", index) do
184
191
  if admins.empty?
@@ -187,17 +194,16 @@ module PostfixAdmin
187
194
  end
188
195
 
189
196
  admins.each_with_index do |a, i|
190
- domains = a.super_admin? ? 'Super admin' : a.domains.count
197
+ domains = a.super_admin? ? 'Super admin' : a.rel_domains.count
191
198
  puts "%4d %-40s %11s %-3s" % [i+1, a.username, domains, a.active_str]
192
199
  end
193
200
  end
194
-
195
201
  end
196
202
 
197
203
  def show_address(domain_name)
198
204
  domain_check(domain_name)
199
205
 
200
- mailboxes = Domain.find(domain_name).mailboxes
206
+ mailboxes = Domain.find(domain_name).rel_mailboxes
201
207
  index = " No. Email Name Quota (MB) Active Maildir"
202
208
  report("Addresses", index) do
203
209
  if mailboxes.empty?
@@ -210,13 +216,12 @@ module PostfixAdmin
210
216
  puts "%4d %-30s %-20s %10s %-3s %s" % [i+1, m.username, m.name, max_str(quota.to_i), m.active_str, m.maildir]
211
217
  end
212
218
  end
213
-
214
219
  end
215
220
 
216
221
  def show_alias(domain_name)
217
222
  domain_check(domain_name)
218
223
 
219
- forwards, aliases = Domain.find(domain_name).aliases.partition{|a| a.mailbox?}
224
+ forwards, aliases = Domain.find(domain_name).rel_aliases.partition { |a| a.mailbox? }
220
225
 
221
226
  forwards.delete_if do |f|
222
227
  f.address == f.goto
@@ -228,19 +233,19 @@ module PostfixAdmin
228
233
 
229
234
  def show_admin_domain(user_name)
230
235
  admin = Admin.find(user_name)
231
- if admin.domains.empty?
236
+ if admin.rel_domains.empty?
232
237
  puts "\nNo domain in database"
233
238
  return
234
239
  end
235
240
 
236
241
  report("Domains (#{user_name})", " No. Domain") do
237
- admin.domains.each_with_index do |d, i|
238
- puts "%4d %-30s" % [i+1, d.domain_name]
242
+ admin.rel_domains.each_with_index do |d, i|
243
+ puts "%4d %-30s" % [i + 1, d.domain]
239
244
  end
240
245
  end
241
246
  end
242
247
 
243
- def add_admin(user_name, password, super_admin=false, scheme=nil)
248
+ def add_admin(user_name, password, super_admin = false, scheme = nil)
244
249
  validate_password(password)
245
250
 
246
251
  @base.add_admin(user_name, hashed_password(password, scheme))
@@ -262,7 +267,7 @@ module PostfixAdmin
262
267
  puts "#{domain_name} was successfully deleted from #{user_name}"
263
268
  end
264
269
 
265
- def add_account(address, password, scheme=nil, name=nil)
270
+ def add_account(address, password, scheme = nil, name = nil)
266
271
  validate_password(password)
267
272
 
268
273
  @base.add_account(address, hashed_password(password, scheme), name)
@@ -281,12 +286,12 @@ module PostfixAdmin
281
286
  mailbox.name = options[:name] if options[:name]
282
287
  mailbox.quota = options[:quota] * KB_TO_MB if options[:quota]
283
288
  mailbox.active = options[:active] unless options[:active].nil?
284
- mailbox.save or raise "Could not save Mailbox"
289
+ mailbox.save!
285
290
 
286
291
  if options[:goto]
287
292
  mail_alias = Alias.find(address)
288
293
  mail_alias.goto = options[:goto]
289
- mail_alias.save or raise "Could not save Alias"
294
+ mail_alias.save!
290
295
  end
291
296
 
292
297
  puts "Successfully updated #{address}"
@@ -322,7 +327,7 @@ module PostfixAdmin
322
327
  def log
323
328
  Log.all.each do |l|
324
329
  time = l.timestamp.strftime("%Y-%m-%d %X %Z")
325
- puts "#{time} #{l.username} #{l.domain_name} #{l.action} #{l.data}"
330
+ puts "#{time} #{l.username} #{l.domain} #{l.action} #{l.data}"
326
331
  end
327
332
  end
328
333
 
@@ -335,8 +340,8 @@ module PostfixAdmin
335
340
  puts
336
341
  puts "Domains"
337
342
  puts "Domain Name,Max Quota,Active"
338
- Domain.all_without_special_domain.each do |d|
339
- puts [d.domain_name, d.maxquota, d.active].join(',')
343
+ Domain.without_all.each do |d|
344
+ puts [d.domain, d.maxquota, d.active].join(',')
340
345
  end
341
346
  puts
342
347
  puts "Mailboxes"
@@ -347,13 +352,13 @@ module PostfixAdmin
347
352
  puts
348
353
  puts "Aliases"
349
354
  puts "Address,Go to,Active"
350
- Alias.all.select{|a| !a.mailbox? }.each do |a|
355
+ Alias.all.select { |a| !a.mailbox? }.each do |a|
351
356
  puts [a.address, %Q!"#{a.goto}"!, a.active].join(',')
352
357
  end
353
358
  puts
354
359
  puts "Forwards"
355
360
  puts "Address,Go to,Active"
356
- Alias.all.select{|a| a.mailbox? && a.goto != a.address }.each do |a|
361
+ Alias.all.select { |a| a.mailbox? && a.goto != a.address }.each do |a|
357
362
  puts [a.address, %Q!"#{a.goto}"!, a.active].join(',')
358
363
  end
359
364
  end
@@ -407,7 +412,7 @@ module PostfixAdmin
407
412
  puts "-"*120
408
413
  end
409
414
 
410
- def report(title, index=nil)
415
+ def report(title, index = nil)
411
416
  puts "\n[#{title}]"
412
417
  print_line if index
413
418
  puts index if index
@@ -417,7 +422,7 @@ module PostfixAdmin
417
422
  end
418
423
 
419
424
  def account_check(user_name)
420
- unless Mailbox.exist?(user_name) && Alias.exist?(user_name)
425
+ unless Mailbox.exists?(user_name) && Alias.exists?(user_name)
421
426
  raise Error, %Q!Could not find account "#{user_name}"!
422
427
  end
423
428
  end
@@ -440,7 +445,7 @@ module PostfixAdmin
440
445
 
441
446
  def klass_check(klass, name)
442
447
  object_name = klass.name.gsub(/PostfixAdmin::/, '').downcase
443
- raise Error, %Q!Could not find #{object_name} "#{name}"! unless klass.exist?(name)
448
+ raise Error, %Q!Could not find #{object_name} "#{name}"! unless klass.exists?(name)
444
449
  end
445
450
 
446
451
  def validate_password(password)
@@ -450,13 +455,13 @@ module PostfixAdmin
450
455
  end
451
456
 
452
457
  def change_password(klass, user_name, password)
453
- raise Error, "Could not find #{user_name}" unless klass.exist?(user_name)
458
+ raise Error, "Could not find #{user_name}" unless klass.exists?(user_name)
454
459
 
455
460
  validate_password(password)
456
461
 
457
462
  obj = klass.find(user_name)
458
- obj.password = hashed_password(password)
459
- if obj.save
463
+
464
+ if obj.update(password: hashed_password(password))
460
465
  puts "the password of #{user_name} was successfully changed."
461
466
  else
462
467
  raise "Could not change password of #{klass.name}"
@@ -476,11 +481,10 @@ module PostfixAdmin
476
481
 
477
482
  private
478
483
 
479
- def hashed_password(password, in_scheme=nil)
484
+ def hashed_password(password, in_scheme = nil)
480
485
  scheme = in_scheme || @base.config[:scheme]
481
486
  puts "scheme: #{scheme}"
482
487
  PostfixAdmin::Doveadm.password(password, scheme)
483
488
  end
484
-
485
489
  end
486
490
  end
File without changes
@@ -0,0 +1,30 @@
1
+ require 'active_support/concern'
2
+
3
+ module DovecotCramMD5Password
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ validates :password_unencrypted, length: { minimum: 5 }, allow_blank: true
8
+ validates_confirmation_of :password_unencrypted, allow_blank: true
9
+
10
+ validate do |record|
11
+ record.errors.add(:password_unencrypted, :blank) unless record.password.present?
12
+ end
13
+
14
+ attr_reader :password_unencrypted
15
+ attr_accessor :password_unencrypted_confirmation
16
+ end
17
+
18
+ def password_unencrypted=(unencrypted_password)
19
+ if unencrypted_password.nil?
20
+ self.password = nil
21
+ elsif !unencrypted_password.empty?
22
+ @password_unencrypted = unencrypted_password
23
+ self.password = DovecotCrammd5.calc(unencrypted_password)
24
+ end
25
+ end
26
+
27
+ def authenticate(unencrypted_password)
28
+ password == DovecotCrammd5.calc(unencrypted_password) && self
29
+ end
30
+ end
@@ -0,0 +1,18 @@
1
+ require 'active_support/concern'
2
+
3
+ module ExistingTimestamp
4
+ extend ActiveSupport::Concern
5
+
6
+ class_methods do
7
+ private
8
+
9
+ def timestamp_attributes_for_create
10
+ ["created"]
11
+ end
12
+
13
+ def timestamp_attributes_for_update
14
+ ["modified"]
15
+ end
16
+ end
17
+
18
+ end
@@ -0,0 +1,98 @@
1
+ module PostfixAdmin
2
+ class Domain < ApplicationRecord
3
+ self.table_name = :domain
4
+ self.primary_key = :domain
5
+
6
+ validates :domain, presence: true, uniqueness: { case_sensitive: false },
7
+ format: { with: RE_DOMAIN_NAME_LIKE_WITH_ANCHORS,
8
+ message: "must be a valid domain name" }
9
+ validates :transport, presence: true
10
+
11
+ validates :aliases, presence: true,
12
+ numericality: { only_integer: true,
13
+ greater_than_or_equal_to: 0 }
14
+ validates :mailboxes, presence: true,
15
+ numericality: { only_integer: true,
16
+ greater_than_or_equal_to: 0 }
17
+ validates :maxquota, presence: true,
18
+ numericality: { only_integer: true,
19
+ greater_than_or_equal_to: 0 }
20
+
21
+ has_many :rel_mailboxes, class_name: "Mailbox", foreign_key: :domain,
22
+ dependent: :destroy
23
+ has_many :rel_aliases, class_name: "Alias", foreign_key: :domain,
24
+ dependent: :destroy
25
+
26
+ has_many :domain_admins, foreign_key: :domain, dependent: :delete_all
27
+ has_many :admins, through: :domain_admins
28
+
29
+ before_validation do |domain|
30
+ domain.domain = domain.domain.downcase unless domain.domain.empty?
31
+ domain.transport = "virtual"
32
+ end
33
+
34
+ scope :without_all, -> { where.not(domain: "ALL") }
35
+
36
+ def pure_aliases
37
+ rel_aliases.pure
38
+ end
39
+
40
+ def aliases_unlimited?
41
+ aliases.zero?
42
+ end
43
+
44
+ def mailboxes_unlimited?
45
+ mailboxes.zero?
46
+ end
47
+
48
+ def aliases_str
49
+ num_str(aliases)
50
+ end
51
+
52
+ def mailboxes_str
53
+ num_str(mailboxes)
54
+ end
55
+
56
+ def aliases_short_str
57
+ num_short_str(aliases)
58
+ end
59
+
60
+ def mailboxes_short_str
61
+ num_short_str(mailboxes)
62
+ end
63
+
64
+ def maxquota_str
65
+ if maxquota.zero?
66
+ "Unlimited"
67
+ else
68
+ "#{maxquota} MB"
69
+ end
70
+ end
71
+
72
+ def maxquota_short_str
73
+ if maxquota.zero?
74
+ "--"
75
+ else
76
+ "#{maxquota} MB"
77
+ end
78
+ end
79
+
80
+ private
81
+
82
+ def num_str(num)
83
+ if num.zero?
84
+ "Unlimited"
85
+ else
86
+ num.to_s
87
+ end
88
+ end
89
+
90
+ def num_short_str(num)
91
+ if num.zero?
92
+ "--"
93
+ else
94
+ num.to_s
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,8 @@
1
+ module PostfixAdmin
2
+ class DomainAdmin < ApplicationRecord
3
+ self.table_name = :domain_admins
4
+
5
+ belongs_to :admin, primary_key: :username, foreign_key: :username
6
+ belongs_to :rel_domain, class_name: "Domain", foreign_key: :domain
7
+ end
8
+ end