Page Menu
Home
GRNET
Search
Configure Global Search
Log In
Files
F324382
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Mon, Nov 25, 7:39 PM
Size
6 KB
Mime Type
text/x-diff
Expires
Wed, Nov 27, 7:39 PM (1 d, 21 h)
Engine
blob
Format
Raw Data
Handle
156201
Attached To
rWEBDNS WebDNS (edet4)
View Options
diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb
index ddb7820..6037a40 100644
--- a/app/controllers/admin/users_controller.rb
+++ b/app/controllers/admin/users_controller.rb
@@ -1,44 +1,52 @@
module Admin
class UsersController < ApplicationController
before_action :authenticate_user!
before_action :admin_only!
# GET /users
def index
@users = User.all
end
# GET /users/orphans
def orphans
@users = User.orphans
end
# DELETE /users/:id
def destroy
@user = User.find(params[:id])
@user.destroy
redirect_to orphans_admin_users_path, notice: "#{@user.email} was deleted."
end
+ def edit
+ @user = User.find(params[:id])
+ @user.toggle_admin
+ @user.save
+
+ redirect_to admin_users_path, notice: "#{@user.email} admin privileges were changed."
+ end
+
def update
additions = 0
params.each_pair { |k, group_id|
next if !k.start_with?('orphan-')
_, id = k.split('-', 2)
user = User.orphans.find_by_id(id)
next if !user
group = Group.find_by_id(group_id)
next if !group
user.groups << group
additions += 1
}
redirect_to :back, notice: "#{additions} users were assigned to groups"
end
end
end
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 13df1b8..28bfe6d 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -1,70 +1,64 @@
class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
attr_writer :breadcrumb
helper_method :admin?
helper_method :dnssec?
def admin?
return false if params.key?('user')
return false if current_user.nil?
- @admin_count ||= begin
- current_user
- .groups
- .where(name: WebDNS.settings[:admin_group]).count
- end
-
- @admin_count != 0
+ current_user.admin
end
def admin_only!
return if admin?
redirect_to root_path, alert: 'Admin only area!'
end
def dnssec?
WebDNS.settings[:dnssec]
end
private
def group
@group ||= edit_group_scope.find(params[:group_id] || params[:id])
end
def domain
@domain ||= edit_domain_scope.find(params[:domain_id] || params[:id])
end
def record
@record ||= record_scope.find(params[:record_id] || params[:id] || params[:pk])
end
def show_group_scope
@show_group_scope ||= current_user.groups
end
def edit_group_scope
@edit_group_scope ||= admin? ? Group.all : show_group_scope
end
def show_domain_scope
@show_domain_scope ||= Domain.where(group: show_group_scope)
end
def edit_domain_scope
@edit_domain_scope ||= admin? ? Domain.all : Domain.where(group: show_group_scope)
end
def record_scope
@record_scope ||= domain.records
end
def notification
Notification.instance if WebDNS.settings[:notifications]
end
end
diff --git a/app/models/user.rb b/app/models/user.rb
index 66f7508..c2e1873 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -1,48 +1,52 @@
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :memberships
has_many :groups, through: :memberships
has_many :subscriptions, dependent: :delete_all
scope :orphans, -> { includes(:memberships).where(:memberships => { user_id: nil }) }
# Check if the user can change his password
#
# Remote users are not able to change their password
def can_change_password?
!identifier?
end
+ def toggle_admin
+ self.admin = !self.admin
+ end
+
def to_api
Hash[
:id, id,
:email, email
].with_indifferent_access
end
def self.find_for_database_authentication(conditions)
# Override devise method for database auth
# We only want to auth local user via the database.
find_first_by_auth_conditions(conditions, identifier: '')
end
def mute_all_domains
ActiveRecord::Base.transaction do
domain_ids = Domain.where(group: groups).pluck(:id)
domain_ids.each { |did|
sub = self.subscriptions.create(domain_id: did)
if !sub.valid?
# Allow only domain_id (uniqueness) errors
raise x.errors.full_messages.join(', ') if sub.errors.size > 1
raise x.errors.full_messages.join(', ') if !sub.errors[:domain_id]
end
}
end
end
end
diff --git a/app/views/admin/users/index.html.erb b/app/views/admin/users/index.html.erb
index 60156a0..c60b1de 100644
--- a/app/views/admin/users/index.html.erb
+++ b/app/views/admin/users/index.html.erb
@@ -1,23 +1,32 @@
<div>
<%= bootstrap_form_tag(url: update_groups_admin_users_path, method: 'PUT', layout: :horizontal, label_col: 'col-sm-2', control_col: 'col-sm-4') do |f| %>
<table id=user-list" class="table table-striped table-bordered">
<thead>
<tr>
<th>Username</th>
<th>Groups</th>
<th>Controls</th>
+ <th>Admin</th>
</tr>
</thead>
<tbody>
<% @users.each do |u| %>
<tr>
<td><%= u.email %></td>
<td><%= f.collection_select "orphan-#{u.id}", Group.all, :id, :name, hide_label: true, prompt: 'Group' %></td>
<td><%= link_to 'Delete', admin_user_path(u), method: :delete, data: { confirm: "Are sure you want to delete #{u.email}?"} %></td>
+ <% if u.admin %>
+ <% content = "Are you sure you want to remove admin priviledges from #{u.email}?" %>
+ <% prefix = "Remove" %>
+ <% else %>
+ <% content = "Are you sure you want to make #{u.email} an admin?" %>
+ <% prefix = "Make" %>
+ <% end %>
+ <td><%= link_to "#{prefix} admin", edit_admin_user_path(u), data: { confirm: content} %></td>
<% end %>
</tr>
<tbody>
</table>
<%= f.submit 'Apply', class: 'btn btn-primary' %>
<% end %>
</div>
diff --git a/db/migrate/20180726141603_add_admin_to_users.rb b/db/migrate/20180726141603_add_admin_to_users.rb
new file mode 100644
index 0000000..8cc65cc
--- /dev/null
+++ b/db/migrate/20180726141603_add_admin_to_users.rb
@@ -0,0 +1,9 @@
+class AddAdminToUsers < ActiveRecord::Migration
+ def change
+ add_column :users, :admin, :boolean
+ User.find_each do |u|
+ u.admin = u.groups.where(name: WebDNS.settings[:admin_group]).exists?
+ u.save
+ end
+ end
+end
Event Timeline
Log In to Comment