parlement 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.
Files changed (162) hide show
  1. data/CHANGES +709 -0
  2. data/COPYING +223 -0
  3. data/README +20 -0
  4. data/Rakefile +136 -0
  5. data/app/controllers/account_controller.rb +181 -0
  6. data/app/controllers/application.rb +30 -0
  7. data/app/controllers/elt_controller.rb +83 -0
  8. data/app/helpers/account_helper.rb +2 -0
  9. data/app/helpers/application_helper.rb +4 -0
  10. data/app/helpers/elt_helper.rb +37 -0
  11. data/app/helpers/live_tree.rb +238 -0
  12. data/app/helpers/mailman.rb +96 -0
  13. data/app/models/attachment.rb +4 -0
  14. data/app/models/elt.rb +17 -0
  15. data/app/models/mail.rb +4 -0
  16. data/app/models/notifier.rb +13 -0
  17. data/app/models/person.rb +9 -0
  18. data/app/models/user.rb +7 -0
  19. data/app/models/user_notify.rb +75 -0
  20. data/app/views/account/_help.rhtml +23 -0
  21. data/app/views/account/_login.rhtml +57 -0
  22. data/app/views/account/_show.rhtml +31 -0
  23. data/app/views/account/logout.rhtml +10 -0
  24. data/app/views/account/signup.rhtml +17 -0
  25. data/app/views/account/welcome.rhtml +13 -0
  26. data/app/views/elt/_elt.rhtml +105 -0
  27. data/app/views/elt/_form.rhtml +31 -0
  28. data/app/views/elt/_list.rhtml +28 -0
  29. data/app/views/elt/new.rhtml +102 -0
  30. data/app/views/elt/rss.rxml +31 -0
  31. data/app/views/elt/show.rhtml +46 -0
  32. data/app/views/elt/show_tree.rhtml +8 -0
  33. data/app/views/layouts/scaffold.rhtml +13 -0
  34. data/app/views/layouts/top.rhtml +45 -0
  35. data/app/views/notifier/changeEmail.rhtml +10 -0
  36. data/config/boot.rb +17 -0
  37. data/config/database.yml +82 -0
  38. data/config/environment.rb +92 -0
  39. data/config/environments/development.rb +17 -0
  40. data/config/environments/production.rb +17 -0
  41. data/config/environments/test.rb +17 -0
  42. data/config/environments/user_environment.rb +1 -0
  43. data/config/routes.rb +28 -0
  44. data/db/ROOT/CV.txt +166 -0
  45. data/db/ROOT/IP.txt +3 -0
  46. data/db/ROOT/parleR.txt +3 -0
  47. data/db/ROOT/parlement/security.txt +34 -0
  48. data/db/ROOT/parlement/test.txt +4 -0
  49. data/db/ROOT/parlement.txt +51 -0
  50. data/db/ROOT/perso.txt +215 -0
  51. data/db/schema.sql +127 -0
  52. data/lib/data_import.rb +54 -0
  53. data/lib/file_column.rb +263 -0
  54. data/lib/file_column_helper.rb +45 -0
  55. data/lib/localization.rb +88 -0
  56. data/lib/localizer.rb +88 -0
  57. data/lib/login_system.rb +87 -0
  58. data/lib/rails_file_column.rb +19 -0
  59. data/lib/user_system.rb +101 -0
  60. data/public/404.html +8 -0
  61. data/public/500.html +8 -0
  62. data/public/dispatch.cgi +10 -0
  63. data/public/dispatch.fcgi +24 -0
  64. data/public/dispatch.rb +10 -0
  65. data/public/engine_files/README +5 -0
  66. data/public/engine_files/login_engine/stylesheets/login_engine.css +81 -0
  67. data/public/favicon.ico +0 -0
  68. data/public/favicon.png +0 -0
  69. data/public/images/live_tree_branch_collapsed_icon.gif +0 -0
  70. data/public/images/live_tree_branch_expanded_icon.gif +0 -0
  71. data/public/images/live_tree_leaf_icon.gif +0 -0
  72. data/public/images/live_tree_loading_spinner.gif +0 -0
  73. data/public/images/webfeed.gif +0 -0
  74. data/public/javascripts/controls.js +721 -0
  75. data/public/javascripts/dragdrop.js +519 -0
  76. data/public/javascripts/effects.js +992 -0
  77. data/public/javascripts/live_tree.js +749 -0
  78. data/public/javascripts/prototype.js +1726 -0
  79. data/public/javascripts/scriptaculous.js +47 -0
  80. data/public/javascripts/slider.js +258 -0
  81. data/public/oldREADME +190 -0
  82. data/public/oldindex.html +78 -0
  83. data/public/robots.txt +1 -0
  84. data/public/stylesheets/default.css +238 -0
  85. data/public/stylesheets/live_tree.css +62 -0
  86. data/public/stylesheets/scaffold.css +74 -0
  87. data/script/about +3 -0
  88. data/script/benchmarker +19 -0
  89. data/script/breakpointer +3 -0
  90. data/script/console +3 -0
  91. data/script/create_db +7 -0
  92. data/script/destroy +3 -0
  93. data/script/generate +3 -0
  94. data/script/performance/benchmarker +3 -0
  95. data/script/performance/profiler +3 -0
  96. data/script/plugin +3 -0
  97. data/script/process/reaper +3 -0
  98. data/script/process/spawner +3 -0
  99. data/script/process/spinner +3 -0
  100. data/script/profiler +34 -0
  101. data/script/runner +3 -0
  102. data/script/server +3 -0
  103. data/test/fixtures/attachments.yml +10 -0
  104. data/test/fixtures/elts.yml +15 -0
  105. data/test/fixtures/mails.yml +7 -0
  106. data/test/fixtures/people.yml +49 -0
  107. data/test/fixtures/users.yml +41 -0
  108. data/test/functional/account_controller_test.rb +239 -0
  109. data/test/functional/elt_controller_test.rb +18 -0
  110. data/test/mocks/test/time.rb +17 -0
  111. data/test/mocks/test/user_notify.rb +16 -0
  112. data/test/test_helper.rb +28 -0
  113. data/test/unit/attachment_test.rb +14 -0
  114. data/test/unit/elt_test.rb +14 -0
  115. data/test/unit/mail_test.rb +14 -0
  116. data/test/unit/notifier_test.rb +31 -0
  117. data/test/unit/person_test.rb +24 -0
  118. data/test/unit/user_test.rb +94 -0
  119. data/vendor/plugins/engines/CHANGELOG +7 -0
  120. data/vendor/plugins/engines/README +128 -0
  121. data/vendor/plugins/engines/init.rb +33 -0
  122. data/vendor/plugins/engines/lib/action_mailer_extensions.rb +160 -0
  123. data/vendor/plugins/engines/lib/action_view_extensions.rb +130 -0
  124. data/vendor/plugins/engines/lib/dependencies_extensions.rb +56 -0
  125. data/vendor/plugins/engines/lib/engines.rb +292 -0
  126. data/vendor/plugins/engines/lib/ruby_extensions.rb +127 -0
  127. data/vendor/plugins/engines/lib/testing_extensions.rb +33 -0
  128. data/vendor/plugins/engines/test/ruby_extensions_test.rb +94 -0
  129. data/vendor/plugins/login_engine/README +258 -0
  130. data/vendor/plugins/login_engine/app/controllers/user_controller.rb +248 -0
  131. data/vendor/plugins/login_engine/app/helpers/user_helper.rb +88 -0
  132. data/vendor/plugins/login_engine/app/models/user.rb +7 -0
  133. data/vendor/plugins/login_engine/app/models/user_notify.rb +75 -0
  134. data/vendor/plugins/login_engine/app/views/user/_edit.rhtml +11 -0
  135. data/vendor/plugins/login_engine/app/views/user/_password.rhtml +9 -0
  136. data/vendor/plugins/login_engine/app/views/user/change_password.rhtml +17 -0
  137. data/vendor/plugins/login_engine/app/views/user/edit.rhtml +23 -0
  138. data/vendor/plugins/login_engine/app/views/user/forgot_password.rhtml +18 -0
  139. data/vendor/plugins/login_engine/app/views/user/home.rhtml +7 -0
  140. data/vendor/plugins/login_engine/app/views/user/login.rhtml +17 -0
  141. data/vendor/plugins/login_engine/app/views/user/logout.rhtml +8 -0
  142. data/vendor/plugins/login_engine/app/views/user/signup.rhtml +17 -0
  143. data/vendor/plugins/login_engine/app/views/user_notify/change_password.rhtml +10 -0
  144. data/vendor/plugins/login_engine/app/views/user_notify/delete.rhtml +5 -0
  145. data/vendor/plugins/login_engine/app/views/user_notify/forgot_password.rhtml +11 -0
  146. data/vendor/plugins/login_engine/app/views/user_notify/pending_delete.rhtml +9 -0
  147. data/vendor/plugins/login_engine/app/views/user_notify/signup.rhtml +12 -0
  148. data/vendor/plugins/login_engine/db/schema.rb +25 -0
  149. data/vendor/plugins/login_engine/init_engine.rb +10 -0
  150. data/vendor/plugins/login_engine/lib/login_engine/authenticated_system.rb +107 -0
  151. data/vendor/plugins/login_engine/lib/login_engine/authenticated_user.rb +149 -0
  152. data/vendor/plugins/login_engine/lib/login_engine.rb +58 -0
  153. data/vendor/plugins/login_engine/public/stylesheets/login_engine.css +81 -0
  154. data/vendor/plugins/login_engine/tasks/tasks.rake +4 -0
  155. data/vendor/plugins/login_engine/test/fixtures/templates/users.yml +41 -0
  156. data/vendor/plugins/login_engine/test/fixtures/users.yml +41 -0
  157. data/vendor/plugins/login_engine/test/functional/user_controller_test.rb +533 -0
  158. data/vendor/plugins/login_engine/test/mocks/mail.rb +14 -0
  159. data/vendor/plugins/login_engine/test/mocks/time.rb +19 -0
  160. data/vendor/plugins/login_engine/test/test_helper.rb +15 -0
  161. data/vendor/plugins/login_engine/test/unit/user_test.rb +94 -0
  162. metadata +276 -0
@@ -0,0 +1,107 @@
1
+ module LoginEngine
2
+ module AuthenticatedSystem
3
+
4
+ protected
5
+
6
+ # overwrite this if you want to restrict access to only a few actions
7
+ # or if you want to check if the user has the correct rights
8
+ # example:
9
+ #
10
+ # # only allow nonbobs
11
+ # def authorize?(user)
12
+ # user.login != "bob"
13
+ # end
14
+ def authorize?(user)
15
+ true
16
+ end
17
+
18
+ # overwrite this method if you only want to protect certain actions of the controller
19
+ # example:
20
+ #
21
+ # # don't protect the login and the about method
22
+ # def protect?(action)
23
+ # if ['action', 'about'].include?(action)
24
+ # return false
25
+ # else
26
+ # return true
27
+ # end
28
+ # end
29
+ def protect?(action)
30
+ true
31
+ end
32
+
33
+ # login_required filter. add
34
+ #
35
+ # before_filter :login_required
36
+ #
37
+ # if the controller should be under any rights management.
38
+ # for finer access control you can overwrite
39
+ #
40
+ # def authorize?(user)
41
+ #
42
+ def login_required
43
+ if not protect?(action_name)
44
+ return true
45
+ end
46
+
47
+ if user? and authorize?(session[:user])
48
+ return true
49
+ end
50
+
51
+ # store current location so that we can
52
+ # come back after the user logged in
53
+ store_location
54
+
55
+ # call overwriteable reaction to unauthorized access
56
+ access_denied
57
+ return false
58
+ end
59
+
60
+ # overwrite if you want to have special behavior in case the user is not authorized
61
+ # to access the current operation.
62
+ # the default action is to redirect to the login screen
63
+ # example use :
64
+ # a popup window might just close itself for instance
65
+ def access_denied
66
+ redirect_to :controller => "/user", :action => "login"
67
+ end
68
+
69
+ # store current uri in the session.
70
+ # we can return to this location by calling return_location
71
+ def store_location
72
+ session['return-to'] = request.request_uri
73
+ end
74
+
75
+ # move to the last store_location call or to the passed default one
76
+ def redirect_back_or_default(default)
77
+ if session['return-to'].nil?
78
+ redirect_to default
79
+ else
80
+ redirect_to_url session['return-to']
81
+ session['return-to'] = nil
82
+ end
83
+ end
84
+
85
+ def user?
86
+ # First, is the user already authenticated?
87
+ return true if not session[:user].nil?
88
+
89
+ # If not, is the user being authenticated by a token?
90
+ return false if not params[:user]
91
+ id = params[:user][:id]
92
+ key = params[:key]
93
+ if id and key
94
+ session[:user] = User.authenticate_by_token(id, key)
95
+ return true if not session[:user].nil?
96
+ end
97
+
98
+ # Everything failed
99
+ return false
100
+ end
101
+
102
+ # Returns the current user from the session, if any exists
103
+ def current_user
104
+ session[:user]
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,149 @@
1
+ require 'digest/sha1'
2
+
3
+ # this model expects a certain database layout and its based on the name/login pattern.
4
+
5
+ module LoginEngine
6
+ module AuthenticatedUser
7
+
8
+ def self.included(base)
9
+ base.class_eval do
10
+
11
+ # use the table name given
12
+ set_table_name LoginEngine.config(:user_table)
13
+
14
+ attr_accessor :new_password
15
+
16
+ validates_presence_of :login, :on => :create
17
+ validates_length_of :login, :within => 3..40, :on => :create
18
+ validates_uniqueness_of :login, :on => :create
19
+ validates_uniqueness_of :email, :on => :create
20
+
21
+ validates_presence_of :password, :if => :validate_password?
22
+ validates_confirmation_of :password, :if => :validate_password?
23
+ validates_length_of :password, { :minimum => 5, :if => :validate_password? }
24
+ validates_length_of :password, { :maximum => 40, :if => :validate_password? }
25
+
26
+ protected
27
+
28
+ attr_accessor :password, :password_confirmation
29
+
30
+ after_save '@new_password = false'
31
+ after_validation :crypt_password
32
+
33
+ end
34
+ base.extend(ClassMethods)
35
+ end
36
+
37
+ module ClassMethods
38
+
39
+ def authenticate(login, pass)
40
+ u = find_first(["login = ? AND verified = 1 AND deleted = 0", login])
41
+ return nil if u.nil?
42
+ find_first(["login = ? AND salted_password = ? AND verified = 1", login, AuthenticatedUser.salted_password(u.salt, AuthenticatedUser.hashed(pass))])
43
+ end
44
+
45
+ def authenticate_by_token(id, token)
46
+ # Allow logins for deleted accounts, but only via this method (and
47
+ # not the regular authenticate call)
48
+ u = find_first(["id = ? AND security_token = ?", id, token])
49
+ return nil if u.nil? or u.token_expired?
50
+ return nil if false == u.update_expiry
51
+ u
52
+ end
53
+
54
+ end
55
+
56
+
57
+ protected
58
+
59
+ def self.hashed(str)
60
+ # check if a salt has been set...
61
+ if LoginEngine.config(:salt) == nil
62
+ raise "You must define a :salt value in the configuration for the LoginEngine module."
63
+ end
64
+
65
+ return Digest::SHA1.hexdigest("#{LoginEngine.config(:salt)}--#{str}--}")[0..39]
66
+ end
67
+
68
+ def self.salted_password(salt, hashed_password)
69
+ hashed(salt + hashed_password)
70
+ end
71
+
72
+ public
73
+
74
+ # hmmm, how does this interact with the developer's own User model initialize?
75
+ # We would have to *insist* that the User.initialize method called 'super'
76
+ #
77
+ def initialize(attributes = nil)
78
+ super
79
+ @new_password = false
80
+ end
81
+
82
+ def token_expired?
83
+ self.security_token and self.token_expiry and (Time.now > self.token_expiry)
84
+ end
85
+
86
+ def update_expiry
87
+ write_attribute('token_expiry', [self.token_expiry, Time.at(Time.now.to_i + 600 * 1000)].min)
88
+ write_attribute('authenticated_by_token', true)
89
+ write_attribute("verified", 1)
90
+ update_without_callbacks
91
+ end
92
+
93
+ def generate_security_token(hours = nil)
94
+ if not hours.nil? or self.security_token.nil? or self.token_expiry.nil? or
95
+ (Time.now.to_i + token_lifetime / 2) >= self.token_expiry.to_i
96
+ return new_security_token(hours)
97
+ else
98
+ return self.security_token
99
+ end
100
+ end
101
+
102
+ def set_delete_after
103
+ hours = LoginEngine.config(:delayed_delete_days) * 24
104
+ write_attribute('deleted', 1)
105
+ write_attribute('delete_after', Time.at(Time.now.to_i + hours * 60 * 60))
106
+
107
+ # Generate and return a token here, so that it expires at
108
+ # the same time that the account deletion takes effect.
109
+ return generate_security_token(hours)
110
+ end
111
+
112
+ def change_password(pass, confirm = nil)
113
+ self.password = pass
114
+ self.password_confirmation = confirm.nil? ? pass : confirm
115
+ @new_password = true
116
+ end
117
+
118
+ protected
119
+
120
+ def validate_password?
121
+ @new_password
122
+ end
123
+
124
+
125
+ def crypt_password
126
+ if @new_password
127
+ write_attribute("salt", AuthenticatedUser.hashed("salt-#{Time.now}"))
128
+ write_attribute("salted_password", AuthenticatedUser.salted_password(salt, AuthenticatedUser.hashed(@password)))
129
+ end
130
+ end
131
+
132
+ def new_security_token(hours = nil)
133
+ write_attribute('security_token', AuthenticatedUser.hashed(self.salted_password + Time.now.to_i.to_s + rand.to_s))
134
+ write_attribute('token_expiry', Time.at(Time.now.to_i + token_lifetime(hours)))
135
+ update_without_callbacks
136
+ return self.security_token
137
+ end
138
+
139
+ def token_lifetime(hours = nil)
140
+ if hours.nil?
141
+ LoginEngine.config(:security_token_life_hours) * 60 * 60
142
+ else
143
+ hours * 60 * 60
144
+ end
145
+ end
146
+
147
+ end
148
+ end
149
+
@@ -0,0 +1,58 @@
1
+ require 'login_engine/authenticated_user'
2
+ require 'login_engine/authenticated_system'
3
+
4
+ module LoginEngine
5
+ include AuthenticatedSystem # re-include the helper module
6
+
7
+ #--
8
+ # Define the configuration values. config sets the value of the
9
+ # constant ONLY if it has not already been set, i.e. by the user in
10
+ # environment.rb
11
+ #++
12
+
13
+ # Source address for user emails
14
+ config :email_from, 'lazyatom@lazyatom.com'
15
+
16
+ # Destination email for system errors
17
+ config :admin_email, 'lazyatom@lazyatom.com'
18
+
19
+ # Sent in emails to users
20
+ config :app_url, 'http://localhost:3000/'
21
+
22
+ # Sent in emails to users
23
+ config :app_name, 'TestApp'
24
+
25
+ # Email charset
26
+ config :mail_charset, 'utf-8'
27
+
28
+ # Security token lifetime in hours
29
+ config :security_token_life_hours, 24
30
+
31
+ # Two column form input
32
+ config :TwoColumnInput, true
33
+
34
+ # Add all changeable user fields to this array.
35
+ # They will then be able to be edited from the edit action. You
36
+ # should NOT include the email field in this array.
37
+ config :changeable_fields, [ 'firstname', 'lastname' ]
38
+
39
+ # Set to true to allow delayed deletes (i.e., delete of record
40
+ # doesn't happen immediately after user selects delete account,
41
+ # but rather after some expiration of time to allow this action
42
+ # to be reverted).
43
+ config :delayed_delete, false
44
+
45
+ # Default is one week
46
+ config :delayed_delete_days, 7
47
+
48
+ # the table to store user information in
49
+ if ActiveRecord::Base.pluralize_table_names
50
+ config :user_table, "users"
51
+ else
52
+ config :user_table, "user"
53
+ end
54
+
55
+ # controls whether or not email is used
56
+ config :use_email_notification, true
57
+
58
+ end
@@ -0,0 +1,81 @@
1
+ /*
2
+
3
+ This CSS file is basically the scaffold.css file, and is only
4
+ included here to demonstrate using CSS files with Engines.
5
+
6
+ */
7
+
8
+ body { background-color: #fff; color: #333; }
9
+
10
+ body, p, ol, ul, td {
11
+ font-family: verdana, arial, helvetica, sans-serif;
12
+ font-size: 13px;
13
+ line-height: 18px;
14
+ }
15
+
16
+ pre {
17
+ background-color: #eee;
18
+ padding: 10px;
19
+ font-size: 11px;
20
+ }
21
+
22
+ a { color: #000; }
23
+ a:visited { color: #666; }
24
+ a:hover { color: #fff; background-color:#000; }
25
+
26
+ .fieldWithErrors {
27
+ padding: 2px;
28
+ background-color: red;
29
+ display: table;
30
+ }
31
+
32
+ #ErrorExplanation {
33
+ width: 400px;
34
+ border: 2px solid red;
35
+ padding: 7px;
36
+ padding-bottom: 12px;
37
+ margin-bottom: 20px;
38
+ background-color: #f0f0f0;
39
+ }
40
+
41
+ #ErrorExplanation h2 {
42
+ text-align: left;
43
+ font-weight: bold;
44
+ padding: 5px 5px 5px 15px;
45
+ font-size: 12px;
46
+ margin: -7px;
47
+ background-color: #c00;
48
+ color: #fff;
49
+ }
50
+
51
+ #ErrorExplanation p {
52
+ color: #333;
53
+ margin-bottom: 0;
54
+ padding: 5px;
55
+ }
56
+
57
+ #ErrorExplanation ul li {
58
+ font-size: 12px;
59
+ list-style: square;
60
+ }
61
+
62
+ div.uploadStatus {
63
+ margin: 5px;
64
+ }
65
+
66
+ div.progressBar {
67
+ margin: 5px;
68
+ }
69
+
70
+ div.progressBar div.border {
71
+ background-color: #fff;
72
+ border: 1px solid grey;
73
+ width: 100%;
74
+ }
75
+
76
+ div.progressBar div.background {
77
+ background-color: #333;
78
+ height: 18px;
79
+ width: 0%;
80
+ }
81
+
@@ -0,0 +1,4 @@
1
+ desc 'Import the login engine schema'
2
+ task :import_login_engine_schema => :environment do
3
+ load "#{Engines.get(:login).root}/db/schema.rb"
4
+ end
@@ -0,0 +1,41 @@
1
+ # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
2
+
3
+ bob:
4
+ id: 1000001
5
+ login: bob
6
+ salted_password: b1de1d1d2aec05df2be6f02995537c1783f08490 # atest
7
+ salt: bf3c47e71c0bfeb6288c9b6b5e24e15256a0e407
8
+ email: bob@test.com
9
+ verified: 1
10
+
11
+ existingbob:
12
+ id: 1000002
13
+ login: existingbob
14
+ salted_password: b1de1d1d2aec05df2be6f02995537c1783f08490 # atest
15
+ salt: bf3c47e71c0bfeb6288c9b6b5e24e15256a0e407
16
+ email: existingbob@test.com
17
+ verified: 1
18
+
19
+ longbob:
20
+ id: 1000003
21
+ login: longbob
22
+ salted_password: 53427dca242488e885216a579e362ee888c3ebc1 # alongtest
23
+ salt: d35a9cc89af83799d9a938a74cb06a11d295aa9c
24
+ email: longbob@test.com
25
+ verified: 1
26
+
27
+ deletebob1:
28
+ id: 1000004
29
+ login: deletebob1
30
+ salted_password: 53427dca242488e885216a579e362ee888c3ebc1 # alongtest
31
+ salt: d35a9cc89af83799d9a938a74cb06a11d295aa9c
32
+ email: deletebob1@test.com
33
+ verified: 1
34
+
35
+ deletebob2:
36
+ id: 1000005
37
+ login: deletebob2
38
+ salted_password: 53427dca242488e885216a579e362ee888c3ebc1 # alongtest
39
+ salt: d35a9cc89af83799d9a938a74cb06a11d295aa9c
40
+ email: deletebob2@test.com
41
+ verified: 1
@@ -0,0 +1,41 @@
1
+ # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
2
+
3
+ bob:
4
+ id: 1000001
5
+ login: bob
6
+ salted_password: b1de1d1d2aec05df2be6f02995537c1783f08490 # atest
7
+ salt: bf3c47e71c0bfeb6288c9b6b5e24e15256a0e407
8
+ email: bob@test.com
9
+ verified: 1
10
+
11
+ existingbob:
12
+ id: 1000002
13
+ login: existingbob
14
+ salted_password: b1de1d1d2aec05df2be6f02995537c1783f08490 # atest
15
+ salt: bf3c47e71c0bfeb6288c9b6b5e24e15256a0e407
16
+ email: existingbob@test.com
17
+ verified: 1
18
+
19
+ longbob:
20
+ id: 1000003
21
+ login: longbob
22
+ salted_password: 53427dca242488e885216a579e362ee888c3ebc1 # alongtest
23
+ salt: d35a9cc89af83799d9a938a74cb06a11d295aa9c
24
+ email: longbob@test.com
25
+ verified: 1
26
+
27
+ deletebob1:
28
+ id: 1000004
29
+ login: deletebob1
30
+ salted_password: 53427dca242488e885216a579e362ee888c3ebc1 # alongtest
31
+ salt: d35a9cc89af83799d9a938a74cb06a11d295aa9c
32
+ email: deletebob1@test.com
33
+ verified: 1
34
+
35
+ deletebob2:
36
+ id: 1000005
37
+ login: deletebob2
38
+ salted_password: 53427dca242488e885216a579e362ee888c3ebc1 # alongtest
39
+ salt: d35a9cc89af83799d9a938a74cb06a11d295aa9c
40
+ email: deletebob2@test.com
41
+ verified: 1