sugoi-mail 0.0.0 → 0.0.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.
- data/app/controllers/commandline_controller.rb +3 -2
- data/app/controllers/sugoi_admin_controller.rb +142 -18
- data/app/models/domain.rb +1 -0
- data/app/models/user.rb +15 -4
- data/app/views/sugoi_admin/create_domain.rhtml +1 -1
- data/app/views/sugoi_admin/create_mailing_list.rhtml +2 -0
- data/app/views/sugoi_admin/create_user.rhtml +1 -0
- data/app/views/sugoi_admin/list_addresses.rhtml +1 -1
- data/app/views/sugoi_admin/list_domains.rhtml +1 -1
- data/app/views/sugoi_admin/list_mailinglist_classes.rhtml +2 -0
- data/app/views/sugoi_admin/list_mailinglists.rhtml +1 -1
- data/app/views/sugoi_admin/list_users.rhtml +5 -0
- data/app/views/sugoi_admin/subscribe.rhtml +2 -0
- data/app/views/sugoi_admin/unsubscribe.rhtml +7 -0
- data/bin/sugoi-admin +1 -1
- data/installer/rails_installer_defaults.yml +1 -1
- data/test/functional/mailservice_controller_test.rb +6 -2
- data/test/functional/sugoi_admin_controller_test.rb +281 -0
- data/test/functionals.rb +4 -0
- data/test/integration/test_soap.rb +1 -1
- metadata +21 -9
- data/app/controllers/.sugoi_admin_controller.rb.swp +0 -0
- data/sugoi-mail.gemspec +0 -36
- data/test/functional/domain_controller_test.rb +0 -74
|
@@ -3,8 +3,9 @@ require 'highline/import'
|
|
|
3
3
|
# Controller for command line thingies
|
|
4
4
|
class CommandlineController < ApplicationController
|
|
5
5
|
def perform_action
|
|
6
|
-
if self.class.action_methods.include?(action_name.to_s) ||
|
|
7
|
-
|
|
6
|
+
if self.class.action_methods.include?(action_name.to_s) ||
|
|
7
|
+
self.class.action_methods.include?('method_missing')
|
|
8
|
+
@exitcode = send(action_name,*params["args"]) || 0
|
|
8
9
|
render unless performed?
|
|
9
10
|
elsif template_exists? && template_public?
|
|
10
11
|
render
|
|
@@ -12,10 +12,27 @@ class SugoiAdminController < CommandlineController
|
|
|
12
12
|
|
|
13
13
|
def format_errors errors
|
|
14
14
|
errors.map do |facility, text|
|
|
15
|
-
|
|
15
|
+
" #{facility}: #{text}\n"
|
|
16
16
|
end
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
+
def error(error_text)
|
|
20
|
+
callername = caller[0].gsub(/.*\`(\w+)\'.*/, '\1')
|
|
21
|
+
@error = "#{callername}: #{error_text}"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def message(message_text)
|
|
25
|
+
callername = caller[0].gsub(/.*\`(\w+)\'.*/, '\1')
|
|
26
|
+
@messages ||= []
|
|
27
|
+
@messages << "#{callername}: #{message_text}"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def ask_description(thing)
|
|
31
|
+
description = ask "Description for #{thing}: "
|
|
32
|
+
if description == "" then description = nil end
|
|
33
|
+
description
|
|
34
|
+
end
|
|
35
|
+
|
|
19
36
|
public
|
|
20
37
|
|
|
21
38
|
def list_domains
|
|
@@ -23,8 +40,12 @@ class SugoiAdminController < CommandlineController
|
|
|
23
40
|
end
|
|
24
41
|
|
|
25
42
|
def list_mailinglists(domain_name)
|
|
26
|
-
|
|
27
|
-
|
|
43
|
+
domain = Domain.find_by_name(domain_name)
|
|
44
|
+
if domain then
|
|
45
|
+
@mailinglists = domain.mailinglists
|
|
46
|
+
else
|
|
47
|
+
error "#{domain_name}: not found"
|
|
48
|
+
end
|
|
28
49
|
end
|
|
29
50
|
|
|
30
51
|
def list_addresses(mailinglist_address)
|
|
@@ -33,12 +54,12 @@ class SugoiAdminController < CommandlineController
|
|
|
33
54
|
@mailinglist=@mailinglist[0]
|
|
34
55
|
@addresses = @mailinglist.addresses
|
|
35
56
|
else
|
|
36
|
-
|
|
57
|
+
error "#{mailinglist_address}: not found"
|
|
37
58
|
end
|
|
38
59
|
end
|
|
39
60
|
|
|
40
61
|
def create_domain(domain_name)
|
|
41
|
-
@
|
|
62
|
+
@messages = []
|
|
42
63
|
|
|
43
64
|
domain = Domain.find_by_name domain_name
|
|
44
65
|
if domain == nil then
|
|
@@ -48,29 +69,29 @@ class SugoiAdminController < CommandlineController
|
|
|
48
69
|
domain.password = password
|
|
49
70
|
domain.password_confirmation = confirmation
|
|
50
71
|
if domain.save then
|
|
51
|
-
|
|
72
|
+
message "Domain \"#{domain_name}\" created successfully."
|
|
52
73
|
else
|
|
53
|
-
|
|
74
|
+
error "Could not create domain \"#{domain_name}\":\n" +
|
|
75
|
+
format_errors(domain.errors).join
|
|
54
76
|
end
|
|
55
77
|
else
|
|
56
|
-
|
|
78
|
+
error "Domain \"#{domain_name}\" already exists."
|
|
57
79
|
end
|
|
58
80
|
end
|
|
59
81
|
|
|
60
|
-
def create_user domain_name, username,
|
|
82
|
+
def create_user domain_name, username,
|
|
83
|
+
email_address = nil,
|
|
84
|
+
description = nil
|
|
61
85
|
domain = Domain.find_by_name domain_name
|
|
62
86
|
if domain then
|
|
63
|
-
password,
|
|
87
|
+
password, password_confirmation = get_password
|
|
64
88
|
|
|
65
89
|
if email_address == nil then
|
|
66
90
|
email_address = ask "Address to forward #{username}'s email to: "
|
|
67
91
|
if email_address == "" then email_address = nil end
|
|
68
92
|
end
|
|
69
93
|
|
|
70
|
-
|
|
71
|
-
description = ask "Description for #{username}: "
|
|
72
|
-
if description == "" then description = nil end
|
|
73
|
-
end
|
|
94
|
+
description ||= ask_description(username)
|
|
74
95
|
|
|
75
96
|
user = User.new
|
|
76
97
|
user.domain = domain
|
|
@@ -79,15 +100,118 @@ class SugoiAdminController < CommandlineController
|
|
|
79
100
|
user.password_confirmation = password_confirmation
|
|
80
101
|
user.description = description
|
|
81
102
|
if user.save then
|
|
82
|
-
|
|
103
|
+
message "User \"#{username}@#{domain_name}\" created successfully"
|
|
83
104
|
if email_address then
|
|
84
|
-
|
|
105
|
+
addr=Address.find_or_create_by_address(email_address)
|
|
106
|
+
user.addresses << addr
|
|
107
|
+
end
|
|
108
|
+
else
|
|
109
|
+
error "User \"#{username}@#{domain_name}\" was not created:\n" +
|
|
110
|
+
format_errors(user.errors).join("\n")
|
|
111
|
+
end
|
|
112
|
+
else
|
|
113
|
+
error "Domain \"#{domain_name}\" does not exist."
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def list_users domain_name
|
|
118
|
+
domain = Domain.find_by_name domain_name
|
|
119
|
+
if domain then
|
|
120
|
+
@users = User.find_all_by_domain_id domain.id
|
|
121
|
+
else
|
|
122
|
+
error "Domain \"#{domain_name}\" does not exist."
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def list_mailinglist_classes
|
|
127
|
+
@mailinglist_classes = MailinglistClass.find :all, :order => :id
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def list_mlclasses
|
|
131
|
+
list_mailinglist_classes
|
|
132
|
+
render "sugoi_admin/list_mailinglist_classes"
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def help_list_mailinglist_classes
|
|
136
|
+
usage "list_mailinglist_classes",
|
|
137
|
+
"Outputs a list of mailing list classes defined"
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
alias help_list_mlclasses help_list_mailinglist_classes
|
|
141
|
+
|
|
142
|
+
def create_mailing_list mailinglist_class_id, mailinglist_name,
|
|
143
|
+
domain_name, user_name, description = nil
|
|
144
|
+
|
|
145
|
+
mlclass = begin
|
|
146
|
+
MailinglistClass.find mailinglist_class_id.to_i
|
|
147
|
+
rescue ActiveRecord::RecordNotFound
|
|
148
|
+
nil
|
|
149
|
+
end
|
|
150
|
+
if mlclass then
|
|
151
|
+
domain = Domain.find_by_name domain_name
|
|
152
|
+
if domain then
|
|
153
|
+
user = User.find_by_login_and_domain_id user_name, domain.id
|
|
154
|
+
if user then
|
|
155
|
+
ml=Mailinglist.new
|
|
156
|
+
ml.user = user
|
|
157
|
+
ml.description = description
|
|
158
|
+
ml.mailinglist_class = mlclass
|
|
159
|
+
ml.name = mailinglist_name
|
|
160
|
+
if ml.save then
|
|
161
|
+
message "Mailing list \"#{ml.address}\" created successfully."
|
|
162
|
+
end
|
|
163
|
+
else
|
|
164
|
+
error "User \"#{user_name}\" not found in domain \"#{domain_name}\"."
|
|
85
165
|
end
|
|
86
166
|
else
|
|
87
|
-
|
|
167
|
+
error "Domain \"#{domain_name}\" not found."
|
|
88
168
|
end
|
|
89
169
|
else
|
|
90
|
-
|
|
170
|
+
error "Invalid mailing list class: #{mailinglist_class_id}"
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def subscribe(mailinglist_address, new_address)
|
|
175
|
+
address=Address.find_or_create_by_address new_address
|
|
176
|
+
ml=Mailinglist.find_by_address(mailinglist_address)
|
|
177
|
+
unless ml
|
|
178
|
+
error "Mailing list \"#{mailinglist_address}\" does not exist!"
|
|
179
|
+
return
|
|
180
|
+
end
|
|
181
|
+
ml=ml[0]
|
|
182
|
+
ml.addresses << address
|
|
183
|
+
message "Subscribed \"#{new_address}\" to \"#{mailinglist_address}\""
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def help_create_mailing_list
|
|
187
|
+
usage "create_mailing_list <mailinglist_class_id> <mailinglist_name> " +
|
|
188
|
+
"<domain_name> <user_name> [<description>]",
|
|
189
|
+
"Creates a mailing list of class <mailinglist_class_id> ("
|
|
190
|
+
"use list_mailinglist_classes to see the available mailing "+
|
|
191
|
+
"list classes) named <mailinglist_name> in domain "+
|
|
192
|
+
"<domain_name> owned by the user named <user_name>"
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def unsubscribe(mailinglist_address, address_to_remove)
|
|
196
|
+
address = Address.find_by_address address_to_remove
|
|
197
|
+
unless address
|
|
198
|
+
error "Address \"#{address_to_remove}\" unknown."
|
|
199
|
+
return
|
|
91
200
|
end
|
|
201
|
+
|
|
202
|
+
mailinglist = Mailinglist.find_by_address mailinglist_address
|
|
203
|
+
unless mailinglist
|
|
204
|
+
error "Mailing list \"#{mailinglist_address}\" does not exist."
|
|
205
|
+
return
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
@mailinglist = mailinglist[0]
|
|
209
|
+
|
|
210
|
+
unless @mailinglist.addresses.member? address
|
|
211
|
+
error "Address \"#{address}\" not in mailing list \"#{mailinglist_address}\""
|
|
212
|
+
return
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
@removed_addresses=@mailinglist.remove_addresses address
|
|
92
216
|
end
|
|
93
217
|
end
|
data/app/models/domain.rb
CHANGED
|
@@ -18,6 +18,7 @@ class Domain < ActiveRecord::Base
|
|
|
18
18
|
# First of all, email address stuff
|
|
19
19
|
#----------------------------------------
|
|
20
20
|
has_many :users
|
|
21
|
+
has_many :mailinglists, :through => :users
|
|
21
22
|
|
|
22
23
|
# Please change the salt to something else,
|
|
23
24
|
# Every application should use a different one
|
data/app/models/user.rb
CHANGED
|
@@ -52,15 +52,23 @@ class User < ActiveRecord::Base
|
|
|
52
52
|
# The user's "description"--if the user's a person, this would be
|
|
53
53
|
# their real name.
|
|
54
54
|
def description
|
|
55
|
-
|
|
55
|
+
if new_record?
|
|
56
|
+
@description
|
|
57
|
+
else
|
|
58
|
+
mailinglist.description
|
|
59
|
+
end
|
|
56
60
|
end
|
|
57
61
|
|
|
58
62
|
# Change the user's description. (Actually changes the user's
|
|
59
63
|
# Mailinglist's description.)
|
|
60
64
|
def description=(new_description)
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
65
|
+
if new_record?
|
|
66
|
+
@description = new_description
|
|
67
|
+
else
|
|
68
|
+
m=mailinglist
|
|
69
|
+
m.description = new_description
|
|
70
|
+
m.save
|
|
71
|
+
end
|
|
64
72
|
end
|
|
65
73
|
|
|
66
74
|
# Please change the salt to something else,
|
|
@@ -102,6 +110,9 @@ class User < ActiveRecord::Base
|
|
|
102
110
|
ml.name=self.login
|
|
103
111
|
ml.user_id=self.id
|
|
104
112
|
ml.mailinglist_class=MailinglistClass.find 1
|
|
113
|
+
if @description then
|
|
114
|
+
ml.description = @description
|
|
115
|
+
end
|
|
105
116
|
if ml.save then
|
|
106
117
|
self.mailinglist=ml
|
|
107
118
|
return true
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<% @
|
|
1
|
+
<% @messages.each do |message| %><%= message.chomp+"\n" %><% end %>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<% if @error then %><%= @error %><% else %><% @messages.each do |message| %><%= message.chomp+"\n" %><% end %><% end %>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<% for addr in @addresses %><%= addr.address + "\n" %><% end %>
|
|
1
|
+
<% if @addresses %><% for addr in @addresses %><%= addr.address + "\n" %><% end %><% else %><%= @error %><% end %>
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
<% for domain in @domains %><%= domain.name %>
|
|
2
|
-
<% end %>
|
|
2
|
+
<% end %>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<% for mailinglist in @mailinglists %><%= mailinglist.address + "\n" %><% end %>
|
|
1
|
+
<% if @error then %><%= @error %><% else %><% for mailinglist in @mailinglists %><%= mailinglist.address + "\n" %><% end %><% end %>
|
data/bin/sugoi-admin
CHANGED
|
@@ -200,7 +200,10 @@ class TC_Mailservice_AdminTasks_UserCreation < MailserviceDomainAdmin
|
|
|
200
200
|
assert list
|
|
201
201
|
assert_equal [ [ @admin_name, "Admin" ],
|
|
202
202
|
[ "testuser", "Test User" ],
|
|
203
|
-
[ "virtuser", "Virtual User" ]
|
|
203
|
+
[ "virtuser", "Virtual User" ],
|
|
204
|
+
[ "nodesc", nil ],
|
|
205
|
+
[ "proxuser", "Proxy Mailing List" ]
|
|
206
|
+
].sort, list.sort
|
|
204
207
|
end
|
|
205
208
|
|
|
206
209
|
end
|
|
@@ -408,7 +411,8 @@ class TC_Mailservice_MailinglistClasses < MailserviceUserLogin
|
|
|
408
411
|
end
|
|
409
412
|
|
|
410
413
|
def test_get_mailinglist_classes
|
|
411
|
-
assert_equal [ 'Distribution List', 'Mailing List'
|
|
414
|
+
assert_equal [ 'Distribution List', 'Mailing List',
|
|
415
|
+
'Proxifiable LTMA' ],
|
|
412
416
|
invoke(:mailinglist_classes).sort
|
|
413
417
|
end
|
|
414
418
|
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
|
2
|
+
require 'sugoi_admin_controller'
|
|
3
|
+
|
|
4
|
+
class SugoiAdminController;
|
|
5
|
+
# Re-raise errors caught by the controller.
|
|
6
|
+
def rescue_action(e) raise e end
|
|
7
|
+
|
|
8
|
+
@@ask_responses = []
|
|
9
|
+
|
|
10
|
+
def self.stuff_ask(*responses)
|
|
11
|
+
@@ask_responses = responses
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def ask(prompt)
|
|
15
|
+
# chuck away the prompt
|
|
16
|
+
return @@ask_responses.shift || "test_password"
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def stuff_ask(*responses)
|
|
21
|
+
SugoiAdminController.stuff_ask(*responses)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
class SugoiAdminControllerTest < Test::Unit::TestCase
|
|
25
|
+
def setup
|
|
26
|
+
@controller = SugoiAdminController.new
|
|
27
|
+
# @request = ActionController::TestRequest.new
|
|
28
|
+
@response = ActionController::TestResponse.new
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def invoke(command, *args)
|
|
32
|
+
@request = ActionController::CommandlineRequest.new command, *args
|
|
33
|
+
@controller.process @request, @response
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Replace this with your real tests.
|
|
37
|
+
def test_truth
|
|
38
|
+
assert true
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def test_list_domains
|
|
42
|
+
assert_nothing_raised do
|
|
43
|
+
invoke "list_domains"
|
|
44
|
+
end
|
|
45
|
+
assert_equal [ 1, 2 ], assigns["domains"].map { |d| d.id }.sort
|
|
46
|
+
assert_equal [ "confirm.domain", "test.domain" ],
|
|
47
|
+
assigns["domains"].map { |d| d.name }.sort
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def test_list_mailinglists
|
|
51
|
+
assert_nothing_raised do
|
|
52
|
+
invoke "list_mailinglists", "confirm.domain"
|
|
53
|
+
end
|
|
54
|
+
assert_equal assigns["mailinglists"], []
|
|
55
|
+
assert_nothing_raised do
|
|
56
|
+
invoke "list_mailinglists", "nonexistent.domain"
|
|
57
|
+
end
|
|
58
|
+
assert_equal assigns["error"], "list_mailinglists: nonexistent.domain: not found"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def test_list_addresses
|
|
62
|
+
assert_nothing_raised do
|
|
63
|
+
invoke "list_addresses", "nonexistentml@confirm.domain"
|
|
64
|
+
end
|
|
65
|
+
assert_equal "list_addresses: nonexistentml@confirm.domain: not found",
|
|
66
|
+
assigns["error"]
|
|
67
|
+
assert_nothing_raised do
|
|
68
|
+
invoke "list_addresses", "testuser@test.domain"
|
|
69
|
+
end
|
|
70
|
+
assert_equal [ "address1@foo.test", "address2@foo.test" ],
|
|
71
|
+
assigns["addresses"].map {|a| a.address}.sort
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def test_create_user_nonexistent_domain
|
|
75
|
+
assert_nothing_raised do
|
|
76
|
+
invoke "create_user", "nonexistent.domain", "newuser"
|
|
77
|
+
end
|
|
78
|
+
assert_equal "create_user: Domain \"nonexistent.domain\" does not exist.",
|
|
79
|
+
assigns["error"]
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def test_create_user_normally
|
|
83
|
+
assert_nothing_raised do
|
|
84
|
+
invoke "create_user", "test.domain", "newuser", "newuser@foo.test",
|
|
85
|
+
"New User"
|
|
86
|
+
end
|
|
87
|
+
assert_equal [ "create_user: User \"newuser@test.domain\" created successfully" ],
|
|
88
|
+
assigns["messages"]
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def test_create_user_already_exists
|
|
92
|
+
assert_nothing_raised do
|
|
93
|
+
invoke "create_user", "test.domain", "testuser",
|
|
94
|
+
"testuser@foo.test", "New User"
|
|
95
|
+
end
|
|
96
|
+
assert_equal "create_user: User \"testuser@test.domain\" was not created:\n login: has already been taken\n", assigns["error"]
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def test_create_user_interactive_description
|
|
100
|
+
stuff_ask "test_password", "test_password", "New 2 User"
|
|
101
|
+
assert_nothing_raised do
|
|
102
|
+
invoke "create_user", "test.domain", "new2user", "new2user@foo.test"
|
|
103
|
+
end
|
|
104
|
+
assert_equal [ "create_user: User \"new2user@test.domain\" created successfully" ],
|
|
105
|
+
assigns["messages"]
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def test_create_user_interactive_email_address_and_description
|
|
109
|
+
stuff_ask "test_password", "test_password", "new3user@foo.test", "New 3 User"
|
|
110
|
+
assert_nothing_raised do
|
|
111
|
+
invoke "create_user", "test.domain", "new3user"
|
|
112
|
+
end
|
|
113
|
+
assert_equal [ "create_user: User \"new3user@test.domain\" created successfully" ],
|
|
114
|
+
assigns["messages"]
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def test_create_domain_normally
|
|
118
|
+
assert_nothing_raised do
|
|
119
|
+
invoke "create_domain", "new.domain"
|
|
120
|
+
end
|
|
121
|
+
assert !assigns["error"]
|
|
122
|
+
assert_equal [ "create_domain: Domain \"new.domain\" created successfully." ],
|
|
123
|
+
assigns["messages"]
|
|
124
|
+
|
|
125
|
+
assert_nothing_raised do
|
|
126
|
+
invoke "list_domains"
|
|
127
|
+
end
|
|
128
|
+
assert_equal assigns["domains"].map { |d| d.name }.sort,
|
|
129
|
+
[ "confirm.domain", "new.domain", "test.domain" ]
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def test_create_domain_collision
|
|
133
|
+
assert_nothing_raised do
|
|
134
|
+
invoke "create_domain", "test.domain"
|
|
135
|
+
end
|
|
136
|
+
assert_equal "create_domain: Domain \"test.domain\" already exists.",
|
|
137
|
+
assigns["error"]
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def test_create_mistyped_password
|
|
141
|
+
assert_nothing_raised do
|
|
142
|
+
stuff_ask "test_password", "mismatch_password"
|
|
143
|
+
end
|
|
144
|
+
invoke "create_domain", "new.domain"
|
|
145
|
+
assert_equal "create_domain: Could not create domain \"new.domain\":" +
|
|
146
|
+
"\n password: doesn't match confirmation\n", assigns["error"]
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def test_list_users_no_users_in_domain
|
|
150
|
+
assert_nothing_raised do
|
|
151
|
+
invoke "list_users", "confirm.domain"
|
|
152
|
+
end
|
|
153
|
+
assert_equal [], assigns["users"]
|
|
154
|
+
assert !assigns["error"]
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def test_list_users_invalid_domain
|
|
158
|
+
assert_nothing_raised do
|
|
159
|
+
invoke "list_users", "bogus.domain"
|
|
160
|
+
end
|
|
161
|
+
assert assigns["error"]
|
|
162
|
+
assert_equal "list_users: Domain \"bogus.domain\" does not exist.",
|
|
163
|
+
assigns["error"]
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def test_list_users_valid_with_users
|
|
167
|
+
assert_nothing_raised do
|
|
168
|
+
invoke "list_users", "test.domain"
|
|
169
|
+
end
|
|
170
|
+
assert !assigns["error"]
|
|
171
|
+
assert_equal [ "nodesc", "proxuser", "root", "testuser", "virtuser"],
|
|
172
|
+
assigns["users"].map { |u| u.login }.sort
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def test_list_mailinglist_classes
|
|
176
|
+
assert_nothing_raised do
|
|
177
|
+
invoke "list_mailinglist_classes"
|
|
178
|
+
end
|
|
179
|
+
assert assigns["mailinglist_classes"]
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def test_list_mlclasses
|
|
183
|
+
assert_nothing_raised do
|
|
184
|
+
invoke "list_mlclasses"
|
|
185
|
+
end
|
|
186
|
+
assert assigns["mailinglist_classes"]
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def test_create_mailing_list_wrong_class
|
|
190
|
+
assert_nothing_raised do
|
|
191
|
+
invoke "create_mailing_list", 100, "newmailinglist", "test.domain",
|
|
192
|
+
"testuser", "New Mailing List"
|
|
193
|
+
end
|
|
194
|
+
assert assigns["error"]
|
|
195
|
+
assert_equal "create_mailing_list: Invalid mailing list class: 100",
|
|
196
|
+
assigns["error"]
|
|
197
|
+
assert_nil Mailinglist.find_by_address("newmailinglist@test.domain")
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def test_create_mailing_list_wrong_domain
|
|
201
|
+
assert_nothing_raised do
|
|
202
|
+
invoke "create_mailing_list", 2, "newmailinglist",
|
|
203
|
+
"nonexistent.domain", "testuser", "New Mailing List"
|
|
204
|
+
end
|
|
205
|
+
assert assigns["error"]
|
|
206
|
+
assert_equal "create_mailing_list: Domain \"nonexistent.domain\" not found.",
|
|
207
|
+
assigns["error"]
|
|
208
|
+
assert_nil Mailinglist.find_by_address("newmailinglist@test.domain")
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
def test_create_Mailing_list_wrong_user
|
|
212
|
+
assert_nothing_raised do
|
|
213
|
+
invoke "create_mailing_list", 2, "newmailinglist",
|
|
214
|
+
"test.domain", "nonexistentuser", "New Mailing List"
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
assert assigns["error"]
|
|
218
|
+
assert_equal "create_mailing_list: User \"nonexistentuser\" not found in domain \"test.domain\".",
|
|
219
|
+
assigns["error"]
|
|
220
|
+
assert_nil Mailinglist.find_by_address("newmailinglist@test.domain")
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def test_create_mailing_list_normal
|
|
224
|
+
assert_nothing_raised do
|
|
225
|
+
invoke "create_mailing_list", 2, "newmailinglist", "test.domain",
|
|
226
|
+
"testuser"
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
assert assigns["messages"]
|
|
230
|
+
assert_equal ["create_mailing_list: Mailing list \"newmailinglist@test.domain\" created successfully."],
|
|
231
|
+
assigns["messages"]
|
|
232
|
+
assert Mailinglist.find_by_address("newmailinglist@test.domain")
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
def test_subscribe_address_to_mailing_list
|
|
236
|
+
assert_nothing_raised do
|
|
237
|
+
invoke "subscribe", "testuser@test.domain",
|
|
238
|
+
"newaddress@foo.test"
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
assert assigns["messages"]
|
|
242
|
+
assert_equal [ "subscribe: Subscribed \"newaddress@foo.test\" to \"testuser@test.domain\""], assigns["messages"]
|
|
243
|
+
assert_nil assigns["error"]
|
|
244
|
+
|
|
245
|
+
a=Address.find_by_address "newaddress@foo.test"
|
|
246
|
+
assert a
|
|
247
|
+
assert Mailinglist.find_by_address("testuser@test.domain")[0].addresses.member?(a)
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
def test_subscribe_address_to_nonexistent_mailing_list
|
|
251
|
+
assert_nothing_raised do
|
|
252
|
+
invoke "subscribe", "nonexistent@test.domain", "newaddress@foo.test"
|
|
253
|
+
end
|
|
254
|
+
assert_nil assigns["messages"]
|
|
255
|
+
assert assigns["error"]
|
|
256
|
+
assert_equal "subscribe: Mailing list \"nonexistent@test.domain\" does not exist!", assigns["error"]
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
def test_unsubscribe_address_from_mailing_list
|
|
260
|
+
assert_nothing_raised do
|
|
261
|
+
invoke "unsubscribe", "testuser@test.domain", "address1@foo.test"
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
assert_nil assigns["error"]
|
|
265
|
+
|
|
266
|
+
ml=Mailinglist.find_by_address("testuser@test.domain")[0]
|
|
267
|
+
|
|
268
|
+
assert_equal ["address2@foo.test"], ml.addresses.map { |a| a.address }
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
def test_unsubscribe_address_from_mailinglist_its_not_a_member_of
|
|
272
|
+
assert_nothing_raised do
|
|
273
|
+
invoke "unsubscribe", "testuser@test.domain", "nonexistent@foo.test"
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
assert assigns["error"]
|
|
277
|
+
assert_equal "unsubscribe: Address \"nonexistent@foo.test\" unknown.",
|
|
278
|
+
assigns["error"]
|
|
279
|
+
assert_nil assigns["removed_addresses"]
|
|
280
|
+
end
|
|
281
|
+
end
|
data/test/functionals.rb
ADDED
|
@@ -11,7 +11,7 @@ require "rubygems"
|
|
|
11
11
|
File.unlink *%w{Mailservice.rb
|
|
12
12
|
MailserviceServiceClient.rb
|
|
13
13
|
MailserviceDriver.rb} rescue nil
|
|
14
|
-
system "wsdl2ruby --wsdl http://localhost:3001/wsdl --type client"
|
|
14
|
+
system "wsdl2ruby.rb --wsdl http://localhost:3001/wsdl --type client"
|
|
15
15
|
system "rake db:fixtures:load"
|
|
16
16
|
require "MailserviceDriver"
|
|
17
17
|
require "test/unit"
|
metadata
CHANGED
|
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
|
|
|
3
3
|
specification_version: 1
|
|
4
4
|
name: sugoi-mail
|
|
5
5
|
version: !ruby/object:Gem::Version
|
|
6
|
-
version: 0.0.
|
|
7
|
-
date: 2006-12-
|
|
6
|
+
version: 0.0.1
|
|
7
|
+
date: 2006-12-28 00:00:00 +09:00
|
|
8
8
|
summary: Powerful mailing list manager.
|
|
9
9
|
require_paths:
|
|
10
10
|
- .
|
|
@@ -18,9 +18,9 @@ bindir: bin
|
|
|
18
18
|
has_rdoc: false
|
|
19
19
|
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
|
20
20
|
requirements:
|
|
21
|
-
- - "
|
|
21
|
+
- - ">="
|
|
22
22
|
- !ruby/object:Gem::Version
|
|
23
|
-
version:
|
|
23
|
+
version: 1.8.2
|
|
24
24
|
version:
|
|
25
25
|
platform: ruby
|
|
26
26
|
signing_key:
|
|
@@ -34,7 +34,6 @@ files:
|
|
|
34
34
|
- Rakefile
|
|
35
35
|
- lib
|
|
36
36
|
- config
|
|
37
|
-
- sugoi-mail.gemspec
|
|
38
37
|
- public
|
|
39
38
|
- bin
|
|
40
39
|
- components
|
|
@@ -96,7 +95,6 @@ files:
|
|
|
96
95
|
- app/controllers/mailinglist_controller.rb
|
|
97
96
|
- app/controllers/sugoi_admin_controller.rb
|
|
98
97
|
- app/controllers/mailservice_controller.rb
|
|
99
|
-
- app/controllers/.sugoi_admin_controller.rb.swp
|
|
100
98
|
- app/controllers/commandline_controller.rb
|
|
101
99
|
- app/controllers/address_controller.rb
|
|
102
100
|
- app/controllers/application.rb
|
|
@@ -125,9 +123,15 @@ files:
|
|
|
125
123
|
- app/views/mailinglist/list.rhtml
|
|
126
124
|
- app/views/mailinglist/show.rhtml
|
|
127
125
|
- app/views/mailinglist/_form.rhtml
|
|
126
|
+
- app/views/sugoi_admin/subscribe.rhtml
|
|
128
127
|
- app/views/sugoi_admin/list_addresses.rhtml
|
|
129
128
|
- app/views/sugoi_admin/list_domains.rhtml
|
|
129
|
+
- app/views/sugoi_admin/create_mailing_list.rhtml
|
|
130
|
+
- app/views/sugoi_admin/unsubscribe.rhtml
|
|
131
|
+
- app/views/sugoi_admin/list_mailinglist_classes.rhtml
|
|
130
132
|
- app/views/sugoi_admin/list_mailinglists.rhtml
|
|
133
|
+
- app/views/sugoi_admin/list_users.rhtml
|
|
134
|
+
- app/views/sugoi_admin/create_user.rhtml
|
|
131
135
|
- app/views/sugoi_admin/create_domain.rhtml
|
|
132
136
|
- app/views/layouts/scaffold.rhtml
|
|
133
137
|
- app/views/layouts/address.rhtml
|
|
@@ -201,6 +205,7 @@ files:
|
|
|
201
205
|
- test/fixtures
|
|
202
206
|
- test/functional
|
|
203
207
|
- test/test_helper.rb
|
|
208
|
+
- test/functionals.rb
|
|
204
209
|
- test/mocks/test
|
|
205
210
|
- test/mocks/development
|
|
206
211
|
- test/mocks/test/net-smtp-stub.rb
|
|
@@ -224,8 +229,8 @@ files:
|
|
|
224
229
|
- test/fixtures/mailinglist_classes.yml
|
|
225
230
|
- test/fixtures/domains.yml
|
|
226
231
|
- test/fixtures/users.yml
|
|
232
|
+
- test/functional/sugoi_admin_controller_test.rb
|
|
227
233
|
- test/functional/mailservice_controller_test.rb
|
|
228
|
-
- test/functional/domain_controller_test.rb
|
|
229
234
|
- vendor/plugins
|
|
230
235
|
- vendor/plugins/active_command
|
|
231
236
|
- vendor/plugins/ar_fixtures
|
|
@@ -266,8 +271,6 @@ extra_rdoc_files: []
|
|
|
266
271
|
|
|
267
272
|
executables:
|
|
268
273
|
- sugoi-mail
|
|
269
|
-
- mailc
|
|
270
|
-
- maild
|
|
271
274
|
extensions: []
|
|
272
275
|
|
|
273
276
|
requirements: []
|
|
@@ -318,3 +321,12 @@ dependencies:
|
|
|
318
321
|
- !ruby/object:Gem::Version
|
|
319
322
|
version: 1.2.3
|
|
320
323
|
version:
|
|
324
|
+
- !ruby/object:Gem::Dependency
|
|
325
|
+
name: sqlite3-ruby
|
|
326
|
+
version_requirement:
|
|
327
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
|
328
|
+
requirements:
|
|
329
|
+
- - ">="
|
|
330
|
+
- !ruby/object:Gem::Version
|
|
331
|
+
version: 1.1.0
|
|
332
|
+
version:
|
|
Binary file
|
data/sugoi-mail.gemspec
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
$:.unshift '../lib'
|
|
2
|
-
|
|
3
|
-
require 'rubygems'
|
|
4
|
-
require 'rake'
|
|
5
|
-
|
|
6
|
-
spec = Gem::Specification.new do |s|
|
|
7
|
-
s.name = "sugoi-mail"
|
|
8
|
-
s.version = "0.0.0"
|
|
9
|
-
s.summary = "Powerful mailing list manager."
|
|
10
|
-
s.has_rdoc = false
|
|
11
|
-
s.files = Dir.glob('**/*', File::FNM_DOTMATCH).reject do |f|
|
|
12
|
-
[ /\.$/, /config\/database.yml$/, /config\/database.yml-/,
|
|
13
|
-
/\.log$/, /^pkg/, /\.svn/, /^vendor\/rails/,
|
|
14
|
-
/^public\/(files|xml|articles|pages|index.html)/,
|
|
15
|
-
/^public\/(stylesheets|javascripts|images)\/theme/, /\~$/,
|
|
16
|
-
/\/\._/, /\/#/ ].any? {|regex| f =~ regex }
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
s.require_path = '.'
|
|
20
|
-
s.author = "Dave Brown"
|
|
21
|
-
s.email = "dagbrown@invio.co.jp"
|
|
22
|
-
s.homepage = "http://sugoi-mail.rubyforge.org/"
|
|
23
|
-
s.rubyforge_project = "sugoi-mail"
|
|
24
|
-
s.platform = Gem::Platform::RUBY
|
|
25
|
-
s.executables = ['sugoi-mail', 'mailc', 'maild']
|
|
26
|
-
s.add_dependency("rails", "= 1.1.6")
|
|
27
|
-
s.add_dependency("rails-app-installer", ">= 0.1.2")
|
|
28
|
-
s.add_dependency("gurgitate-mail", ">=1.8.0")
|
|
29
|
-
s.add_dependency("termios", ">=0.9.4")
|
|
30
|
-
s.add_dependency("highline", ">=1.2.3")
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
if $0==__FILE__
|
|
34
|
-
Gem::manage_gems
|
|
35
|
-
Gem::Builder.new(spec).build
|
|
36
|
-
end
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
require File.dirname(__FILE__) + '/../test_helper'
|
|
2
|
-
require 'domain_controller'
|
|
3
|
-
|
|
4
|
-
# Set salt to 'change-me' because thats what the fixtures assume.
|
|
5
|
-
User.salt = 'change-me'
|
|
6
|
-
|
|
7
|
-
# Raise errors beyond the default web-based presentation
|
|
8
|
-
class DomainController; def rescue_action(e) raise e end; end
|
|
9
|
-
|
|
10
|
-
class DomainControllerTest < Test::Unit::TestCase
|
|
11
|
-
|
|
12
|
-
fixtures :domains
|
|
13
|
-
|
|
14
|
-
def setup
|
|
15
|
-
@controller = DomainController.new
|
|
16
|
-
@request, @response = ActionController::TestRequest.new, ActionController::TestResponse.new
|
|
17
|
-
@request.host = "localhost"
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def test_auth_bob
|
|
21
|
-
@request.session[:return_to] = "/bogus/location"
|
|
22
|
-
|
|
23
|
-
post :login, :domain_name => "bob", :domain_password => "test"
|
|
24
|
-
assert_session_has :domain
|
|
25
|
-
|
|
26
|
-
assert_equal @bob, @response.session[:user]
|
|
27
|
-
|
|
28
|
-
assert_redirect_url "/bogus/location"
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def test_signup
|
|
32
|
-
@request.session[:return_to] = "/bogus/location"
|
|
33
|
-
|
|
34
|
-
post :signup, :user => { :login => "newbob", :password => "newpassword", :password_confirmation => "newpassword" }
|
|
35
|
-
assert_session_has :user
|
|
36
|
-
|
|
37
|
-
assert_redirect_url "/bogus/location"
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def test_bad_signup
|
|
41
|
-
@request.session[:return_to] = "/bogus/location"
|
|
42
|
-
|
|
43
|
-
post :signup, :user => { :login => "newbob", :password => "newpassword", :password_confirmation => "wrong" }
|
|
44
|
-
assert_invalid_column_on_record "user", :password
|
|
45
|
-
assert_success
|
|
46
|
-
|
|
47
|
-
post :signup, :user => { :login => "yo", :password => "newpassword", :password_confirmation => "newpassword" }
|
|
48
|
-
assert_invalid_column_on_record "user", :login
|
|
49
|
-
assert_success
|
|
50
|
-
|
|
51
|
-
post :signup, :user => { :login => "yo", :password => "newpassword", :password_confirmation => "wrong" }
|
|
52
|
-
assert_invalid_column_on_record "user", [:login, :password]
|
|
53
|
-
assert_success
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def test_invalid_login
|
|
57
|
-
post :login, :user_login => "bob", :user_password => "not_correct"
|
|
58
|
-
|
|
59
|
-
assert_session_has_no :user
|
|
60
|
-
|
|
61
|
-
assert_template_has "login"
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
def test_login_logoff
|
|
65
|
-
|
|
66
|
-
post :login, :user_login => "bob", :user_password => "test"
|
|
67
|
-
assert_session_has :user
|
|
68
|
-
|
|
69
|
-
get :logout
|
|
70
|
-
assert_session_has_no :user
|
|
71
|
-
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
end
|