postfix_admin 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +2 -0
- data/.rubocop.yml +2 -0
- data/CHANGELOG.md +18 -0
- data/Dockerfile +24 -0
- data/README.md +57 -27
- data/Rakefile +6 -0
- data/bin/console +18 -0
- data/docker-compose.yml +24 -0
- data/docker-entrypoint.sh +5 -0
- data/exe/postfix_admin +6 -0
- data/lib/postfix_admin.rb +4 -0
- data/lib/postfix_admin/admin.rb +52 -0
- data/lib/postfix_admin/alias.rb +65 -0
- data/lib/postfix_admin/application_record.rb +44 -0
- data/lib/postfix_admin/base.rb +138 -81
- data/lib/postfix_admin/cli.rb +321 -119
- 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 +32 -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 -171
- data/lib/postfix_admin/quota.rb +6 -0
- data/lib/postfix_admin/runner.rb +136 -30
- data/lib/postfix_admin/version.rb +1 -1
- data/postfix_admin.gemspec +20 -11
- metadata +91 -54
- data/bin/postfix_admin +0 -9
- data/spec/base_spec.rb +0 -218
- data/spec/cli_spec.rb +0 -165
- data/spec/models_spec.rb +0 -136
- data/spec/postfix_admin.conf +0 -5
- data/spec/postfix_test.sql +0 -250
- data/spec/runner_spec.rb +0 -144
- data/spec/spec_helper.rb +0 -160
data/lib/postfix_admin/cli.rb
CHANGED
@@ -1,32 +1,62 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
require 'postfix_admin'
|
3
|
+
require 'postfix_admin/doveadm'
|
3
4
|
|
4
5
|
module PostfixAdmin
|
5
6
|
class CLI
|
6
|
-
|
7
|
+
@config_file = '~/.postfix_admin.conf'
|
7
8
|
MIN_NUM_PASSWORD_CHARACTER = 5
|
8
9
|
|
9
10
|
def initialize
|
10
11
|
@config = load_config
|
11
|
-
@base =
|
12
|
+
@base = Base.new(@config)
|
12
13
|
end
|
13
14
|
|
14
|
-
def
|
15
|
-
|
15
|
+
def self.config_file
|
16
|
+
@config_file
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.config_file=(value)
|
20
|
+
@config_file = value
|
21
|
+
end
|
22
|
+
|
23
|
+
def db_setup
|
24
|
+
@base.db_setup
|
25
|
+
end
|
26
|
+
|
27
|
+
def show(name)
|
28
|
+
name = name.downcase if name
|
29
|
+
|
30
|
+
if name =~ /@/
|
31
|
+
if Admin.exists?(name)
|
32
|
+
show_admin_details(name)
|
33
|
+
end
|
34
|
+
|
35
|
+
if Mailbox.exists?(name)
|
36
|
+
show_account_details(name)
|
37
|
+
elsif Alias.exists?(name)
|
38
|
+
show_alias_details(name)
|
39
|
+
end
|
40
|
+
|
41
|
+
return
|
42
|
+
end
|
16
43
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
44
|
+
show_summary(name)
|
45
|
+
|
46
|
+
if name
|
47
|
+
show_admin(name)
|
48
|
+
show_address(name)
|
49
|
+
show_alias(name)
|
21
50
|
else
|
22
51
|
show_domain
|
23
52
|
show_admin
|
24
53
|
end
|
25
54
|
end
|
26
55
|
|
27
|
-
def show_summary(domain_name=nil)
|
56
|
+
def show_summary(domain_name = nil)
|
28
57
|
title = "Summary"
|
29
58
|
if domain_name
|
59
|
+
domain_name = domain_name.downcase
|
30
60
|
domain_check(domain_name)
|
31
61
|
title = "Summary of #{domain_name}"
|
32
62
|
end
|
@@ -34,60 +64,85 @@ module PostfixAdmin
|
|
34
64
|
report(title) do
|
35
65
|
if domain_name
|
36
66
|
domain = Domain.find(domain_name)
|
37
|
-
puts "Mailboxes : %4d" % domain.
|
38
|
-
puts "Aliases : %4d" % domain.
|
39
|
-
puts "Quota
|
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)]
|
69
|
+
puts "Max Quota : %4d MB" % domain.maxquota
|
70
|
+
puts "Active : %3s" % domain.active_str
|
40
71
|
else
|
41
|
-
puts "Domains : %4d" % Domain.
|
72
|
+
puts "Domains : %4d" % Domain.without_all.count
|
42
73
|
puts "Admins : %4d" % Admin.count
|
43
74
|
puts "Mailboxes : %4d" % Mailbox.count
|
44
|
-
puts "Aliases : %4d" %
|
75
|
+
puts "Aliases : %4d" % Alias.pure.count
|
45
76
|
end
|
46
77
|
end
|
47
78
|
end
|
48
79
|
|
49
|
-
def setup_domain(
|
50
|
-
admin = "admin@#{
|
51
|
-
add_domain(
|
80
|
+
def setup_domain(domain_name, password)
|
81
|
+
admin = "admin@#{domain_name}"
|
82
|
+
add_domain(domain_name)
|
52
83
|
add_admin(admin, password)
|
53
|
-
add_admin_domain(admin,
|
84
|
+
add_admin_domain(admin, domain_name)
|
54
85
|
end
|
55
86
|
|
56
|
-
def
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
87
|
+
def show_account_details(user_name)
|
88
|
+
account_check(user_name)
|
89
|
+
mailbox = Mailbox.find(user_name)
|
90
|
+
mail_alias = Alias.find(user_name)
|
91
|
+
|
92
|
+
report("Mailbox") do
|
93
|
+
puts "Address : %s" % mailbox.username
|
94
|
+
puts "Name : %s" % mailbox.name
|
95
|
+
puts "Password : %s" % mailbox.password
|
96
|
+
puts "Quota : %d MB" % max_str(mailbox.quota / KB_TO_MB)
|
97
|
+
puts "Go to : %s" % mail_alias.goto
|
98
|
+
puts "Active : %s" % mailbox.active_str
|
68
99
|
end
|
69
100
|
end
|
70
101
|
|
71
|
-
def
|
72
|
-
|
73
|
-
|
102
|
+
def show_admin_details(name)
|
103
|
+
admin_check(name)
|
104
|
+
admin = Admin.find(name)
|
105
|
+
|
106
|
+
report("Admin") do
|
107
|
+
puts "Name : %s" % admin.username
|
108
|
+
puts "Password : %s" % admin.password
|
109
|
+
puts "Domains : %s" % (admin.super_admin? ? "ALL" : admin.rel_domains.count)
|
110
|
+
puts "Role : %s" % (admin.super_admin? ? "Super admin" : "Admin")
|
111
|
+
puts "Active : %s" % admin.active_str
|
74
112
|
end
|
75
113
|
end
|
76
114
|
|
77
|
-
def
|
78
|
-
|
79
|
-
|
115
|
+
def show_alias_details(name)
|
116
|
+
alias_check(name)
|
117
|
+
mail_alias = Alias.find(name)
|
118
|
+
report("Alias") do
|
119
|
+
puts "Address : %s" % mail_alias.address
|
120
|
+
puts "Go to : %s" % mail_alias.goto
|
121
|
+
puts "Active : %s" % mail_alias.active_str
|
80
122
|
end
|
123
|
+
end
|
81
124
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
125
|
+
def show_domain
|
126
|
+
index = " No. Domain Aliases Mailboxes Quota (MB) Active"
|
127
|
+
report('Domains', index) do
|
128
|
+
if Domain.without_all.empty?
|
129
|
+
puts " No domains"
|
130
|
+
next
|
131
|
+
end
|
132
|
+
|
133
|
+
Domain.without_all.each_with_index do |d, i|
|
134
|
+
puts "%4d %-30s %3d /%3s %3d /%3s %10d %-3s" %
|
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]
|
137
|
+
end
|
88
138
|
end
|
89
139
|
end
|
90
140
|
|
141
|
+
def add_domain(domain_name)
|
142
|
+
@base.add_domain(domain_name)
|
143
|
+
puts_registered(domain_name, "a domain")
|
144
|
+
end
|
145
|
+
|
91
146
|
def change_admin_password(user_name, password)
|
92
147
|
change_password(Admin, user_name, password)
|
93
148
|
end
|
@@ -96,124 +151,233 @@ module PostfixAdmin
|
|
96
151
|
change_password(Mailbox, user_name, password)
|
97
152
|
end
|
98
153
|
|
99
|
-
def
|
100
|
-
|
101
|
-
|
154
|
+
def edit_admin(admin_name, options)
|
155
|
+
admin_check(admin_name)
|
156
|
+
admin = Admin.find(admin_name)
|
157
|
+
|
158
|
+
unless options[:super].nil?
|
159
|
+
admin.super_admin = options[:super]
|
102
160
|
end
|
161
|
+
|
162
|
+
admin.active = options[:active] unless options[:active].nil?
|
163
|
+
admin.save!
|
164
|
+
|
165
|
+
puts "Successfully updated #{admin_name}"
|
166
|
+
show_admin_details(admin_name)
|
167
|
+
end
|
168
|
+
|
169
|
+
def edit_domain(domain_name, options)
|
170
|
+
domain_check(domain_name)
|
171
|
+
domain = Domain.find(domain_name)
|
172
|
+
domain.aliases = options[:aliases] if options[:aliases]
|
173
|
+
domain.mailboxes = options[:mailboxes] if options[:mailboxes]
|
174
|
+
domain.maxquota = options[:maxquota] if options[:maxquota]
|
175
|
+
domain.active = options[:active] unless options[:active].nil?
|
176
|
+
domain.save!
|
177
|
+
|
178
|
+
puts "Successfully updated #{domain_name}"
|
179
|
+
show_summary(domain_name)
|
103
180
|
end
|
104
181
|
|
105
|
-
def
|
106
|
-
|
107
|
-
|
182
|
+
def delete_domain(domain_name)
|
183
|
+
@base.delete_domain(domain_name)
|
184
|
+
puts_deleted(domain_name)
|
185
|
+
end
|
186
|
+
|
187
|
+
def show_admin(domain_name = nil)
|
188
|
+
admins = domain_name ? Admin.select { |a| a.rel_domains.exists?(domain_name) } : Admin.all
|
189
|
+
index = " No. Admin Domains Active"
|
108
190
|
report("Admins", index) do
|
109
|
-
if admins.
|
191
|
+
if admins.empty?
|
110
192
|
puts " No admins"
|
111
|
-
|
112
|
-
admins.each_with_index do |a, i|
|
113
|
-
domains = a.super_admin? ? 'Super admin' : a.domains.count
|
114
|
-
puts "%4d %-30s %11s %s" % [i+1, a.username, domains, a.password]
|
115
|
-
end
|
193
|
+
next
|
116
194
|
end
|
117
|
-
end
|
118
195
|
|
196
|
+
admins.each_with_index do |a, i|
|
197
|
+
domains = a.super_admin? ? 'Super admin' : a.rel_domains.count
|
198
|
+
puts "%4d %-40s %11s %-3s" % [i+1, a.username, domains, a.active_str]
|
199
|
+
end
|
200
|
+
end
|
119
201
|
end
|
120
202
|
|
121
|
-
def show_address(
|
122
|
-
domain_check(
|
203
|
+
def show_address(domain_name)
|
204
|
+
domain_check(domain_name)
|
123
205
|
|
124
|
-
mailboxes = Domain.find(
|
125
|
-
index = " No. Email Quota (MB)
|
206
|
+
mailboxes = Domain.find(domain_name).rel_mailboxes
|
207
|
+
index = " No. Email Name Quota (MB) Active Maildir"
|
126
208
|
report("Addresses", index) do
|
127
|
-
if mailboxes.
|
209
|
+
if mailboxes.empty?
|
128
210
|
puts " No addresses"
|
129
|
-
|
130
|
-
mailboxes.each_with_index do |m, i|
|
131
|
-
quota = m.quota.to_f/1024000.0
|
132
|
-
puts "%4d %-30s %10.1f %s" % [i+1, m.username, quota, m.password]
|
133
|
-
end
|
211
|
+
next
|
134
212
|
end
|
135
|
-
end
|
136
213
|
|
214
|
+
mailboxes.each_with_index do |m, i|
|
215
|
+
quota = m.quota.to_f/ KB_TO_MB.to_f
|
216
|
+
puts "%4d %-30s %-20s %10s %-3s %s" % [i+1, m.username, m.name, max_str(quota.to_i), m.active_str, m.maildir]
|
217
|
+
end
|
218
|
+
end
|
137
219
|
end
|
138
220
|
|
139
|
-
def show_alias(
|
140
|
-
domain_check(
|
221
|
+
def show_alias(domain_name)
|
222
|
+
domain_check(domain_name)
|
141
223
|
|
142
|
-
aliases = Domain.find(
|
143
|
-
mail_alias.address != mail_alias.goto
|
144
|
-
end
|
224
|
+
forwards, aliases = Domain.find(domain_name).rel_aliases.partition { |a| a.mailbox? }
|
145
225
|
|
146
|
-
|
147
|
-
|
148
|
-
if aliases.count == 0
|
149
|
-
puts " No aliases"
|
150
|
-
else
|
151
|
-
aliases.each_with_index do |a, i|
|
152
|
-
puts "%4d %-30s %s" % [i+1, a.address, a.goto]
|
153
|
-
end
|
154
|
-
end
|
226
|
+
forwards.delete_if do |f|
|
227
|
+
f.address == f.goto
|
155
228
|
end
|
156
229
|
|
230
|
+
show_alias_base("Forwards", forwards)
|
231
|
+
show_alias_base("Aliases", aliases)
|
157
232
|
end
|
158
233
|
|
159
234
|
def show_admin_domain(user_name)
|
160
235
|
admin = Admin.find(user_name)
|
161
|
-
if admin.
|
236
|
+
if admin.rel_domains.empty?
|
162
237
|
puts "\nNo domain in database"
|
163
238
|
return
|
164
239
|
end
|
240
|
+
|
165
241
|
report("Domains (#{user_name})", " No. Domain") do
|
166
|
-
admin.
|
167
|
-
puts "%4d %-
|
242
|
+
admin.rel_domains.each_with_index do |d, i|
|
243
|
+
puts "%4d %-30s" % [i + 1, d.domain]
|
168
244
|
end
|
169
245
|
end
|
170
246
|
end
|
171
247
|
|
172
|
-
def add_admin(user_name, password, super_admin=false)
|
248
|
+
def add_admin(user_name, password, super_admin = false, scheme = nil)
|
173
249
|
validate_password(password)
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
250
|
+
|
251
|
+
@base.add_admin(user_name, hashed_password(password, scheme))
|
252
|
+
if super_admin
|
253
|
+
Admin.find(user_name).super_admin = true
|
254
|
+
puts_registered(user_name, "a super admin")
|
255
|
+
else
|
256
|
+
puts_registered(user_name, "an admin")
|
181
257
|
end
|
182
258
|
end
|
183
259
|
|
184
|
-
def add_admin_domain(user_name,
|
185
|
-
|
186
|
-
|
187
|
-
end
|
260
|
+
def add_admin_domain(user_name, domain_name)
|
261
|
+
@base.add_admin_domain(user_name, domain_name)
|
262
|
+
puts_registered(domain_name, "a domain of #{user_name}")
|
188
263
|
end
|
189
264
|
|
190
|
-
def
|
265
|
+
def delete_admin_domain(user_name, domain_name)
|
266
|
+
@base.delete_admin_domain(user_name, domain_name)
|
267
|
+
puts "#{domain_name} was successfully deleted from #{user_name}"
|
268
|
+
end
|
269
|
+
|
270
|
+
def add_account(address, password, scheme = nil, name = nil)
|
191
271
|
validate_password(password)
|
192
|
-
|
193
|
-
|
194
|
-
|
272
|
+
|
273
|
+
@base.add_account(address, hashed_password(password, scheme), name)
|
274
|
+
puts_registered(address, "an account")
|
275
|
+
show_account_details(address)
|
195
276
|
end
|
196
277
|
|
197
278
|
def add_alias(address, goto)
|
198
|
-
|
199
|
-
|
279
|
+
@base.add_alias(address, goto)
|
280
|
+
puts_registered("#{address}: #{goto}", "an alias")
|
281
|
+
end
|
282
|
+
|
283
|
+
def edit_account(address, options)
|
284
|
+
mailbox_check(address)
|
285
|
+
mailbox = Mailbox.find(address)
|
286
|
+
mailbox.name = options[:name] if options[:name]
|
287
|
+
mailbox.quota = options[:quota] * KB_TO_MB if options[:quota]
|
288
|
+
mailbox.active = options[:active] unless options[:active].nil?
|
289
|
+
mailbox.save!
|
290
|
+
|
291
|
+
if options[:goto]
|
292
|
+
mail_alias = Alias.find(address)
|
293
|
+
mail_alias.goto = options[:goto]
|
294
|
+
mail_alias.save!
|
200
295
|
end
|
296
|
+
|
297
|
+
puts "Successfully updated #{address}"
|
298
|
+
show_account_details(address)
|
299
|
+
end
|
300
|
+
|
301
|
+
def edit_alias(address, options)
|
302
|
+
alias_check(address)
|
303
|
+
mail_alias = Alias.find(address)
|
304
|
+
mail_alias.goto = options[:goto] if options[:goto]
|
305
|
+
mail_alias.active = options[:active] unless options[:active].nil?
|
306
|
+
mail_alias.save or raise "Could not save Alias"
|
307
|
+
|
308
|
+
puts "Successfully updated #{address}"
|
309
|
+
show_alias_details(address)
|
201
310
|
end
|
202
311
|
|
203
312
|
def delete_alias(address)
|
204
|
-
|
313
|
+
@base.delete_alias(address)
|
314
|
+
puts_deleted(address)
|
205
315
|
end
|
206
316
|
|
207
317
|
def delete_admin(user_name)
|
208
|
-
|
318
|
+
@base.delete_admin(user_name)
|
319
|
+
puts_deleted(user_name)
|
209
320
|
end
|
210
321
|
|
211
322
|
def delete_account(address)
|
212
|
-
|
323
|
+
@base.delete_account(address)
|
324
|
+
puts_deleted(address)
|
325
|
+
end
|
326
|
+
|
327
|
+
def log
|
328
|
+
Log.all.each do |l|
|
329
|
+
time = l.timestamp.strftime("%Y-%m-%d %X %Z")
|
330
|
+
puts "#{time} #{l.username} #{l.domain} #{l.action} #{l.data}"
|
331
|
+
end
|
332
|
+
end
|
333
|
+
|
334
|
+
def dump
|
335
|
+
puts "Admins"
|
336
|
+
puts "User Name,Password,Super Admin,Active"
|
337
|
+
Admin.all.each do |a|
|
338
|
+
puts [a.username, %Q!"#{a.password}"!, a.super_admin?, a.active].join(',')
|
339
|
+
end
|
340
|
+
puts
|
341
|
+
puts "Domains"
|
342
|
+
puts "Domain Name,Max Quota,Active"
|
343
|
+
Domain.without_all.each do |d|
|
344
|
+
puts [d.domain, d.maxquota, d.active].join(',')
|
345
|
+
end
|
346
|
+
puts
|
347
|
+
puts "Mailboxes"
|
348
|
+
puts "User Name,Name,Password,Quota,Maildir,Active"
|
349
|
+
Mailbox.all.each do |m|
|
350
|
+
puts [m.username, %Q!"#{m.name}"!, %Q!"#{m.password}"!, m.quota, %Q!"#{m.maildir}"!, m.active].join(',')
|
351
|
+
end
|
352
|
+
puts
|
353
|
+
puts "Aliases"
|
354
|
+
puts "Address,Go to,Active"
|
355
|
+
Alias.all.select { |a| !a.mailbox? }.each do |a|
|
356
|
+
puts [a.address, %Q!"#{a.goto}"!, a.active].join(',')
|
357
|
+
end
|
358
|
+
puts
|
359
|
+
puts "Forwards"
|
360
|
+
puts "Address,Go to,Active"
|
361
|
+
Alias.all.select { |a| a.mailbox? && a.goto != a.address }.each do |a|
|
362
|
+
puts [a.address, %Q!"#{a.goto}"!, a.active].join(',')
|
363
|
+
end
|
213
364
|
end
|
214
365
|
|
215
366
|
private
|
216
367
|
|
368
|
+
def show_alias_base(title, addresses)
|
369
|
+
report(title, " No. Address Active Go to") do
|
370
|
+
if addresses.empty?
|
371
|
+
puts " No #{title.downcase}"
|
372
|
+
next
|
373
|
+
end
|
374
|
+
|
375
|
+
addresses.each_with_index do |a, i|
|
376
|
+
puts "%4d %-40s %-3s %s" % [i+1, a.address, a.active_str, a.goto]
|
377
|
+
end
|
378
|
+
end
|
379
|
+
end
|
380
|
+
|
217
381
|
def puts_registered(name, as_str)
|
218
382
|
puts %Q!"#{name}" was successfully registered as #{as_str}.!
|
219
383
|
end
|
@@ -223,7 +387,7 @@ module PostfixAdmin
|
|
223
387
|
end
|
224
388
|
|
225
389
|
def config_file
|
226
|
-
config_file = File.expand_path(
|
390
|
+
config_file = File.expand_path(CLI.config_file)
|
227
391
|
end
|
228
392
|
|
229
393
|
def load_config
|
@@ -237,18 +401,18 @@ module PostfixAdmin
|
|
237
401
|
end
|
238
402
|
end
|
239
403
|
|
240
|
-
def create_config(
|
241
|
-
open(
|
242
|
-
f.write
|
404
|
+
def create_config(file)
|
405
|
+
open(file, 'w') do |f|
|
406
|
+
f.write Base::DEFAULT_CONFIG.to_yaml
|
243
407
|
end
|
244
|
-
File.chmod(0600,
|
408
|
+
File.chmod(0600, file)
|
245
409
|
end
|
246
410
|
|
247
411
|
def print_line
|
248
|
-
puts "-"*
|
412
|
+
puts "-"*120
|
249
413
|
end
|
250
414
|
|
251
|
-
def report(title, index=nil)
|
415
|
+
def report(title, index = nil)
|
252
416
|
puts "\n[#{title}]"
|
253
417
|
print_line if index
|
254
418
|
puts index if index
|
@@ -257,12 +421,33 @@ module PostfixAdmin
|
|
257
421
|
print_line
|
258
422
|
end
|
259
423
|
|
260
|
-
def
|
261
|
-
unless
|
262
|
-
raise Error, %Q!Could not find
|
424
|
+
def account_check(user_name)
|
425
|
+
unless Mailbox.exists?(user_name) && Alias.exists?(user_name)
|
426
|
+
raise Error, %Q!Could not find account "#{user_name}"!
|
263
427
|
end
|
264
428
|
end
|
265
429
|
|
430
|
+
def domain_check(domain_name)
|
431
|
+
klass_check(Domain, domain_name)
|
432
|
+
end
|
433
|
+
|
434
|
+
def mailbox_check(address)
|
435
|
+
klass_check(Mailbox, address)
|
436
|
+
end
|
437
|
+
|
438
|
+
def alias_check(address)
|
439
|
+
klass_check(Alias, address)
|
440
|
+
end
|
441
|
+
|
442
|
+
def admin_check(user_name)
|
443
|
+
klass_check(Admin, user_name)
|
444
|
+
end
|
445
|
+
|
446
|
+
def klass_check(klass, name)
|
447
|
+
object_name = klass.name.gsub(/PostfixAdmin::/, '').downcase
|
448
|
+
raise Error, %Q!Could not find #{object_name} "#{name}"! unless klass.exists?(name)
|
449
|
+
end
|
450
|
+
|
266
451
|
def validate_password(password)
|
267
452
|
if password.size < MIN_NUM_PASSWORD_CHARACTER
|
268
453
|
raise ArgumentError, "Password is too short. It should be larger than #{MIN_NUM_PASSWORD_CHARACTER}"
|
@@ -270,19 +455,36 @@ module PostfixAdmin
|
|
270
455
|
end
|
271
456
|
|
272
457
|
def change_password(klass, user_name, password)
|
273
|
-
unless klass.
|
274
|
-
|
275
|
-
end
|
458
|
+
raise Error, "Could not find #{user_name}" unless klass.exists?(user_name)
|
459
|
+
|
276
460
|
validate_password(password)
|
277
461
|
|
278
462
|
obj = klass.find(user_name)
|
279
|
-
|
280
|
-
if obj.
|
463
|
+
|
464
|
+
if obj.update(password: hashed_password(password))
|
281
465
|
puts "the password of #{user_name} was successfully changed."
|
282
466
|
else
|
283
467
|
raise "Could not change password of #{klass.name}"
|
284
468
|
end
|
285
469
|
end
|
286
470
|
|
471
|
+
def max_str(value)
|
472
|
+
case value
|
473
|
+
when 0
|
474
|
+
'--'
|
475
|
+
when -1
|
476
|
+
'0'
|
477
|
+
else
|
478
|
+
value.to_s
|
479
|
+
end
|
480
|
+
end
|
481
|
+
|
482
|
+
private
|
483
|
+
|
484
|
+
def hashed_password(password, in_scheme = nil)
|
485
|
+
scheme = in_scheme || @base.config[:scheme]
|
486
|
+
puts "scheme: #{scheme}"
|
487
|
+
PostfixAdmin::Doveadm.password(password, scheme)
|
488
|
+
end
|
287
489
|
end
|
288
490
|
end
|