ae_users 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +47 -0
- data/Rakefile +36 -0
- data/VERSION +1 -0
- data/ae_users.gemspec +117 -0
- data/app/controllers/account_controller.rb +167 -0
- data/app/controllers/auth_controller.rb +202 -0
- data/app/controllers/permission_controller.rb +172 -0
- data/app/helpers/account_helper.rb +2 -0
- data/app/helpers/auth_helper.rb +5 -0
- data/app/helpers/permission_helper.rb +2 -0
- data/app/models/account.rb +50 -0
- data/app/models/auth_notifier.rb +34 -0
- data/app/models/auth_ticket.rb +39 -0
- data/app/models/email_address.rb +17 -0
- data/app/models/login.rb +23 -0
- data/app/models/open_id_identity.rb +5 -0
- data/app/models/permission.rb +57 -0
- data/app/models/person.rb +156 -0
- data/app/models/role.rb +7 -0
- data/app/views/account/_personal_info.rhtml +35 -0
- data/app/views/account/_procon_profile.rhtml +3 -0
- data/app/views/account/_signup_form.html.erb +39 -0
- data/app/views/account/activate.rhtml +6 -0
- data/app/views/account/activation_error.rhtml +11 -0
- data/app/views/account/change_password.rhtml +3 -0
- data/app/views/account/edit_profile.rhtml +117 -0
- data/app/views/account/signup.rhtml +9 -0
- data/app/views/account/signup_noactivation.rhtml +7 -0
- data/app/views/account/signup_success.rhtml +8 -0
- data/app/views/auth/_auth_form.rhtml +54 -0
- data/app/views/auth/_forgot_form.html.erb +12 -0
- data/app/views/auth/_mini_auth_form.rhtml +17 -0
- data/app/views/auth/_openid_auth_form.html.erb +14 -0
- data/app/views/auth/_other_login_options.html.erb +24 -0
- data/app/views/auth/auth_form.js.erb +63 -0
- data/app/views/auth/forgot.rhtml +3 -0
- data/app/views/auth/forgot_form.rhtml +6 -0
- data/app/views/auth/index.css.erb +23 -0
- data/app/views/auth/login.rhtml +6 -0
- data/app/views/auth/needs_activation.rhtml +6 -0
- data/app/views/auth/needs_person.html.erb +32 -0
- data/app/views/auth/needs_profile.rhtml +14 -0
- data/app/views/auth/openid_login.html.erb +6 -0
- data/app/views/auth/resend_activation.rhtml +3 -0
- data/app/views/auth_notifier/account_activation.rhtml +13 -0
- data/app/views/auth_notifier/generated_password.rhtml +10 -0
- data/app/views/permission/_add_grantee.rhtml +47 -0
- data/app/views/permission/_role_member.rhtml +8 -0
- data/app/views/permission/_show.rhtml +81 -0
- data/app/views/permission/_userpicker.rhtml +0 -0
- data/app/views/permission/add_role_member.rhtml +3 -0
- data/app/views/permission/admin.rhtml +45 -0
- data/app/views/permission/edit.rhtml +9 -0
- data/app/views/permission/edit_role.rhtml +63 -0
- data/app/views/permission/grant.rhtml +10 -0
- data/db/migrate/002_create_accounts.rb +17 -0
- data/db/migrate/003_create_email_addresses.rb +17 -0
- data/db/migrate/004_create_people.rb +24 -0
- data/db/migrate/013_simplify_signup.rb +15 -0
- data/db/migrate/014_create_permissions.rb +16 -0
- data/db/migrate/015_create_roles.rb +18 -0
- data/db/migrate/016_refactor_people.rb +36 -0
- data/db/migrate/017_people_permissions.rb +9 -0
- data/generators/ae_users/USAGE +14 -0
- data/generators/ae_users/ae_users_generator.rb +12 -0
- data/generators/ae_users/templates/add.png +0 -0
- data/generators/ae_users/templates/admin.png +0 -0
- data/generators/ae_users/templates/group.png +0 -0
- data/generators/ae_users/templates/logout.png +0 -0
- data/generators/ae_users/templates/migration.rb +25 -0
- data/generators/ae_users/templates/openid.gif +0 -0
- data/generators/ae_users/templates/remove.png +0 -0
- data/generators/ae_users/templates/user.png +0 -0
- data/init.rb +1 -0
- data/install.rb +1 -0
- data/lib/ae_users.rb +781 -0
- data/rails/init.rb +20 -0
- data/tasks/ae_users_tasks.rake +4 -0
- data/test/ae_users_test.rb +8 -0
- data/uninstall.rb +1 -0
- metadata +134 -0
@@ -0,0 +1,23 @@
|
|
1
|
+
.auth_form {
|
2
|
+
margin-left: 0.5em;
|
3
|
+
width: 300px;
|
4
|
+
}
|
5
|
+
.auth_form input {
|
6
|
+
width: 100%;
|
7
|
+
}
|
8
|
+
.auth_form input[type=radio], .auth_form input[type=checkbox] {
|
9
|
+
width: auto;
|
10
|
+
}
|
11
|
+
.auth_form label.block {
|
12
|
+
margin-left: -0.5em;
|
13
|
+
font-weight: bold;
|
14
|
+
display: block;
|
15
|
+
}
|
16
|
+
#openid_url {
|
17
|
+
background-color: #fff;
|
18
|
+
background-image: url(<%= image_path "ae_users/openid.gif" %>);
|
19
|
+
background-position: left;
|
20
|
+
background-repeat: no-repeat;
|
21
|
+
padding-left: 18px;
|
22
|
+
width: 90%;
|
23
|
+
}
|
@@ -0,0 +1,6 @@
|
|
1
|
+
<h1>Account not activated</h1>
|
2
|
+
|
3
|
+
<p>That account hasn't been activated yet. If you want to try resending the activation email (because you
|
4
|
+
didn't receive it, or accidentally deleted it), click the button below.</p>
|
5
|
+
|
6
|
+
<p><%= button_to "Resend activation email", :action => 'resend_activation', :account => params[:account], :email => params[:email] %></p>
|
@@ -0,0 +1,32 @@
|
|
1
|
+
<h2>Welcome!</h2>
|
2
|
+
|
3
|
+
<p>This is the first time you've visited this site. We just need a few pieces of information
|
4
|
+
from you before we can log you in. We've attempted to get as much of it as possible from your
|
5
|
+
OpenID provider, but some of it may be missing and/or incorrect. Please check the following form
|
6
|
+
before pressing "Save changes" below.</p>
|
7
|
+
|
8
|
+
<%= auth_stylesheet %>
|
9
|
+
|
10
|
+
<% form_for("person", @person, :url => {:action => 'needs_person'},
|
11
|
+
:html => {:id => 'edit_profile_form', :style => "max-width: 800px;"}) do |f| %>
|
12
|
+
<%= hidden_field_tag "return_to", params[:return_to] %>
|
13
|
+
<%= render :partial => 'account/personal_info', :locals => {:f => f} %>
|
14
|
+
|
15
|
+
<p>
|
16
|
+
<label for="email" class="block">Email:</label>
|
17
|
+
<%= text_field_tag "email", params[:email] %>
|
18
|
+
</p>
|
19
|
+
|
20
|
+
<% if @app_profile -%>
|
21
|
+
|
22
|
+
<% form_for("app_profile", @app_profile) do |profile_form| %>
|
23
|
+
<%= render :partial => "account/#{@app_profile.class.name.tableize.singularize}",
|
24
|
+
:locals => {:f => profile_form}%>
|
25
|
+
<label></label>
|
26
|
+
<%= submit_tag %>
|
27
|
+
<% end %>
|
28
|
+
<% else -%>
|
29
|
+
<label></label>
|
30
|
+
<%= submit_tag %>
|
31
|
+
<% end -%>
|
32
|
+
<% end %>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<h1>Update your profile</h1>
|
2
|
+
|
3
|
+
<p>Hello! It appears this is the first time you've logged into this site. Before you log in,
|
4
|
+
please take a moment to update your personal information below.</p>
|
5
|
+
|
6
|
+
<%= auth_stylesheet %>
|
7
|
+
|
8
|
+
<% form_for("app_profile", @app_profile, :html => {:class => 'auth_form'}) do |profile_form| %>
|
9
|
+
<%= hidden_field_tag "return_to", params[:return_to] %>
|
10
|
+
<%= hidden_field_tag "person", @person.id %>
|
11
|
+
<%= render :partial => "account/#{@app_profile.class.name.tableize.singularize}",
|
12
|
+
:locals => {:f => profile_form}%>
|
13
|
+
<%= submit_tag "Update your profile" %>
|
14
|
+
<% end %>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
Dear <%=@name%>,
|
2
|
+
|
3
|
+
Thank you for signing up for an account on <%=@server_name%>! There's just one more
|
4
|
+
step you need to do before you can use it: we need you to verify that this email address
|
5
|
+
belongs to you.
|
6
|
+
|
7
|
+
To do that, simply go to:
|
8
|
+
|
9
|
+
<%= url_for :only_path => false, :controller => "account", :action => "activate", :account => @account.id, :activation_key => @account.activation_key, :escape => false%>
|
10
|
+
|
11
|
+
Thanks again for signing up!
|
12
|
+
|
13
|
+
- The Management
|
@@ -0,0 +1,47 @@
|
|
1
|
+
<% if AeUsers.js_framework == "prototype" -%>
|
2
|
+
<ul style="list-style-type: none; padding-left: 0;">
|
3
|
+
<% for grantee in @grantees do -%>
|
4
|
+
<li granteeName="<%=h grantee.name %>">
|
5
|
+
<% if grantee.kind_of? Role -%>
|
6
|
+
<table>
|
7
|
+
<tr>
|
8
|
+
<td>
|
9
|
+
<%= image_tag "ae_users/group.png", :style => "float: left;" %>
|
10
|
+
<div class="grantee_id" style="display: none;"><%= grantee.class.name %>:<%= grantee.id %></div>
|
11
|
+
</td>
|
12
|
+
<td>
|
13
|
+
<b><%=h grantee.name %></b><br/>
|
14
|
+
<i><%=pluralize(grantee.people.count, "person")%></i>
|
15
|
+
</td>
|
16
|
+
</tr>
|
17
|
+
</table>
|
18
|
+
<% elsif grantee.kind_of? Person -%>
|
19
|
+
<table>
|
20
|
+
<tr>
|
21
|
+
<td>
|
22
|
+
<%= image_tag "ae_users/user.png", :style => "float: left;" %>
|
23
|
+
<div class="grantee_id" style="display: none;"><%= grantee.class.name %>:<%= grantee.id %></div>
|
24
|
+
</td>
|
25
|
+
<td>
|
26
|
+
<b><%=h grantee.name %></b><br/>
|
27
|
+
<i>
|
28
|
+
<% if grantee.primary_email_address.nil? -%>
|
29
|
+
No email address
|
30
|
+
<% else -%>
|
31
|
+
<%=h grantee.primary_email_address %>
|
32
|
+
<% end -%>
|
33
|
+
</td>
|
34
|
+
</tr>
|
35
|
+
</table>
|
36
|
+
<% end -%>
|
37
|
+
</li>
|
38
|
+
<% end -%>
|
39
|
+
</ul>
|
40
|
+
|
41
|
+
<% elsif AeUsers.js_framework == "jquery" -%>
|
42
|
+
|
43
|
+
<% for grantee in @grantees do -%>
|
44
|
+
<%=grantee.name %><% if grantee.kind_of? Role %> (<%= pluralize(grantee.people.count, "person") %>)<% end %>|<%=grantee.class.name %>:<%= grantee.id %>
|
45
|
+
<% end -%>
|
46
|
+
|
47
|
+
<% end -%>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<li id="person_<%=person.id%>"><%= image_tag "ae_users/user.png" %>
|
2
|
+
<%=h person.name %>
|
3
|
+
<%= link_to_remote "Remove",
|
4
|
+
{ :url => { :controller => "permission", :action => "remove_role_member", :id => person.id, :role => @role.id },
|
5
|
+
:success => "$('person_#{person.id}').remove();",
|
6
|
+
:confirm => "Are you sure you want to remove that member from this role?" },
|
7
|
+
{ :class => "permission_action" } %>
|
8
|
+
</li>
|
@@ -0,0 +1,81 @@
|
|
1
|
+
<style type="text/css">
|
2
|
+
div.auto_complete {
|
3
|
+
z-index: 1000;
|
4
|
+
}
|
5
|
+
|
6
|
+
.permission_action {
|
7
|
+
font-size: 80%;
|
8
|
+
text-transform: uppercase;
|
9
|
+
text-decoration: none;
|
10
|
+
color: #444;
|
11
|
+
background-color: #ffc;
|
12
|
+
}
|
13
|
+
</style>
|
14
|
+
<%= auto_complete_stylesheet %>
|
15
|
+
|
16
|
+
<% div_for item, :permissions do %>
|
17
|
+
<ul>
|
18
|
+
<% permission_names(item).each do |perm| -%>
|
19
|
+
<li><b><%=h(perm.to_s.humanize)%></b>:
|
20
|
+
<% grants = permission_grants(item, perm) -%>
|
21
|
+
<% if grants.length == 0 -%>
|
22
|
+
<% if all_permitted?(item, perm) -%>
|
23
|
+
everybody
|
24
|
+
<% elsif grants.length == 0 -%>
|
25
|
+
<span id="<%= perm %>_nobody">nobody</span>
|
26
|
+
<% end -%>
|
27
|
+
<% else -%>
|
28
|
+
<% grants.each_index do |i| -%>
|
29
|
+
<% grant = grants[i] -%>
|
30
|
+
<span id="grant_<%=grant.id%>">
|
31
|
+
<% if grant.grantee.kind_of? Role -%>
|
32
|
+
<%= image_tag "ae_users/group.png" %>
|
33
|
+
<% elsif grant.grantee.kind_of? Person -%>
|
34
|
+
<%= image_tag "ae_users/user.png" %>
|
35
|
+
<% end -%>
|
36
|
+
<% if grant.grantee -%>
|
37
|
+
<%= h(grant.grantee.name) %>
|
38
|
+
<% else -%>
|
39
|
+
Unknown entity
|
40
|
+
<% end -%>
|
41
|
+
<% if logged_in? and logged_in_person.permitted?(item, "change_permissions") and not (grant.grantee == logged_in_person) -%>
|
42
|
+
<%= link_to_remote "Remove",
|
43
|
+
{ :url => { :controller => "permission", :action => "revoke", :id => grant.id, :format => "js" },
|
44
|
+
:success => "$('grant_#{grant.id}').remove();",
|
45
|
+
:confirm => "Are you sure you want to revoke that permission?",
|
46
|
+
:failure => "alert(request.responseText)" },
|
47
|
+
{ :class => "permission_action" } %>
|
48
|
+
<% end -%>
|
49
|
+
|
50
|
+
<% if i < grants.length - 1 %>, <% end %>
|
51
|
+
</span>
|
52
|
+
<% end -%>
|
53
|
+
<% end -%>
|
54
|
+
<% if logged_in? and logged_in_person.permitted?(item, "change_permissions") -%>
|
55
|
+
<div id="<%= perm %>_insert_grants_here" style="display: inline;"></div>
|
56
|
+
| <span id="grant_open_<%=perm%>">
|
57
|
+
<%= link_to_function "Add", "$('grant_open_#{perm}').toggle(); $('grant_#{perm}').toggle(); $('#{perm}_grantee_shim').focus();",
|
58
|
+
:class => "permission_action" %>
|
59
|
+
</span>
|
60
|
+
<span id="grant_<%=perm %>" style="display: none;">
|
61
|
+
<%= link_to_function "«", "$('grant_open_#{perm}').toggle(); $('grant_#{perm}').toggle();",
|
62
|
+
:class => "permission_action" %>
|
63
|
+
<%= user_picker "#{perm}_grantee", :roles => true,
|
64
|
+
:callback => "nobody = $('#{perm}_nobody');
|
65
|
+
if (nobody) {
|
66
|
+
nobody.remove();
|
67
|
+
}
|
68
|
+
new Ajax.Updater('#{perm}_insert_grants_here', '#{url_for :controller => 'permission', :action => 'grant', :perm => full_permission_name(item, perm),
|
69
|
+
:item_klass => item.class.name, :item_id => item.id, :escape => false}',
|
70
|
+
{
|
71
|
+
parameters: { 'klass': klass, 'id': id },
|
72
|
+
insertion: Insertion.Bottom,
|
73
|
+
}
|
74
|
+
);" %>
|
75
|
+
</span>
|
76
|
+
<% end -%>
|
77
|
+
</li>
|
78
|
+
<% end -%>
|
79
|
+
</ul>
|
80
|
+
<% end %>
|
81
|
+
|
File without changes
|
@@ -0,0 +1,45 @@
|
|
1
|
+
<h1>Administration</h1>
|
2
|
+
|
3
|
+
<style type="text/css">
|
4
|
+
.permission_action {
|
5
|
+
font-size: 80%;
|
6
|
+
text-transform: uppercase;
|
7
|
+
text-decoration: none;
|
8
|
+
color: #444;
|
9
|
+
background-color: #ffc;
|
10
|
+
}
|
11
|
+
</style>
|
12
|
+
|
13
|
+
<h2>Base permissions</h2>
|
14
|
+
|
15
|
+
<blockquote>Base permissions apply to all objects of a particular type. If you grant someone base permissions on a type of object, they will be able to perform that action on any object of that type. Please choose the type of object you want to change the permissions for:</blockquote>
|
16
|
+
|
17
|
+
<ul>
|
18
|
+
<% @pclasses.each do |pc| -%>
|
19
|
+
<li>
|
20
|
+
<%= link_to pc.name.pluralize.humanize, :action => "edit", :klass => pc.name %>
|
21
|
+
</li>
|
22
|
+
<% end -%>
|
23
|
+
</ul>
|
24
|
+
|
25
|
+
<h2>Roles</h2>
|
26
|
+
|
27
|
+
<blockquote>Roles are groups of people. Roles can be given permissions just as if they were people. This can be convenient for assigning permissions to large groups of people at once. Please choose the role you want to edit:</blockquote>
|
28
|
+
|
29
|
+
<ul>
|
30
|
+
<% @roles.each do |role| -%>
|
31
|
+
<li id="role_<%= role.id%>">
|
32
|
+
<%= link_to role.name, :action => "edit_role", :id => role.id %>
|
33
|
+
<%= link_to_remote "Delete",
|
34
|
+
{ :url => { :controller => "permission", :action => "delete_role", :id => role.id },
|
35
|
+
:success => "$('role_#{role.id}').remove();",
|
36
|
+
:confirm => "Are you sure you want to delete that role?" },
|
37
|
+
{ :class => "permission_action" } %>
|
38
|
+
</li>
|
39
|
+
<% end -%>
|
40
|
+
</ul>
|
41
|
+
|
42
|
+
<% form_for :role, @role, :url => {:action => "create_role"} do |f| %>
|
43
|
+
New role: <%= f.text_field "name" %>
|
44
|
+
<%= submit_tag "Create" %>
|
45
|
+
<% end %>
|
@@ -0,0 +1,63 @@
|
|
1
|
+
<h1>Editing role <%= @role.name %></h1>
|
2
|
+
|
3
|
+
<h2>Members</h2>
|
4
|
+
|
5
|
+
<style type="text/css">
|
6
|
+
div.auto_complete {
|
7
|
+
z-index: 1000;
|
8
|
+
}
|
9
|
+
|
10
|
+
.permission_action {
|
11
|
+
font-size: 80%;
|
12
|
+
text-transform: uppercase;
|
13
|
+
text-decoration: none;
|
14
|
+
color: #444;
|
15
|
+
background-color: #ffc;
|
16
|
+
}
|
17
|
+
</style>
|
18
|
+
<%= auto_complete_stylesheet %>
|
19
|
+
|
20
|
+
<ul style="list-style-type: none;" id="members_list">
|
21
|
+
<% @role.people.each do |person| -%>
|
22
|
+
<%= render :partial => "role_member", :locals => {:person => person} %>
|
23
|
+
<% end -%>
|
24
|
+
<span id="add_member_open">
|
25
|
+
<%= link_to_function "Add member", "$('add_member_open').toggle(); $('add_member').toggle();",
|
26
|
+
:class => "permission_action" %>
|
27
|
+
</span>
|
28
|
+
<span id="add_member" style="display: none;">
|
29
|
+
<%= link_to_function "«", "$('add_member_open').toggle(); $('add_member').toggle();",
|
30
|
+
:class => "permission_action" %>
|
31
|
+
<%= user_picker "member_to_add",
|
32
|
+
:callback => "new Ajax.Updater('members_list', '#{url_for :controller => 'permission', :action => 'add_role_member',
|
33
|
+
:role => @role.id, :escape => false}',
|
34
|
+
{
|
35
|
+
parameters: { 'klass': klass, 'id': id },
|
36
|
+
insertion: Insertion.Top,
|
37
|
+
}
|
38
|
+
);" %>
|
39
|
+
</ul>
|
40
|
+
|
41
|
+
<h2>Permissions</h2>
|
42
|
+
|
43
|
+
<ul>
|
44
|
+
<% @role.permissions.each do |perm| -%>
|
45
|
+
<li>
|
46
|
+
<% if perm.permission.nil? -%>
|
47
|
+
Global superadmin
|
48
|
+
<% else -%>
|
49
|
+
<%=h perm.permission.humanize %>
|
50
|
+
<% if not perm.permissioned.nil? -%>
|
51
|
+
<%=h perm.permissioned.class %>
|
52
|
+
<% if perm.permissioned.respond_to? "name" %>
|
53
|
+
"<%=h perm.permissioned.name %>"
|
54
|
+
<% elsif perm.permissioned.respond_to? "title" %>
|
55
|
+
"<%=h perm.permissioned.title %>"
|
56
|
+
<% else -%>
|
57
|
+
#<%= perm.permissioned.id %>
|
58
|
+
<% end -%>
|
59
|
+
<% end -%>
|
60
|
+
<% end -%>
|
61
|
+
</li>
|
62
|
+
<% end -%>
|
63
|
+
</ul>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<% if @perm.grantee.kind_of? Role -%>
|
2
|
+
<%= image_tag "ae_users/group.png" %>
|
3
|
+
<% elsif @perm.grantee.kind_of? Person -%>
|
4
|
+
<%= image_tag "ae_users/user.png" %>
|
5
|
+
<% end -%>
|
6
|
+
<%= h(@perm.grantee.name) %>
|
7
|
+
<%= link_to_remote "Remove",
|
8
|
+
{ :url => { :controller => "permission", :action => "revoke", :id => @perm.id },
|
9
|
+
:success => "$('grant_#{@perm.id}').remove();" },
|
10
|
+
{ :class => "permission_action" } %>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class CreateAccounts < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
ActiveRecord::Base.establish_connection :users
|
4
|
+
create_table :accounts do |t|
|
5
|
+
t.column :password, :string, :null => false
|
6
|
+
t.column :active, :boolean
|
7
|
+
t.column :activation_key, :string
|
8
|
+
t.column :created_at, :datetime
|
9
|
+
t.column :updated_at, :datetime
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.down
|
14
|
+
ActiveRecord::Base.establish_connection :users
|
15
|
+
drop_table :accounts
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class CreateEmailAddresses < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
ActiveRecord::Base.establish_connection :users
|
4
|
+
create_table :email_addresses do |t|
|
5
|
+
t.column :address, :string, :null => false
|
6
|
+
t.column :primary, :boolean
|
7
|
+
t.column :account_id, :integer, :null => false
|
8
|
+
t.column :created_at, :datetime
|
9
|
+
t.column :updated_at, :datetime
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.down
|
14
|
+
ActiveRecord::Base.establish_connection :users
|
15
|
+
drop_table :email_addresses
|
16
|
+
end
|
17
|
+
end
|