proxes 0.4.3 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 39914b3404c6fb1f55236a2c339acf423f0e2ddf
4
- data.tar.gz: 208aa9c4a994aec8a1683217ddad8ae540865bd7
3
+ metadata.gz: 20d593cfefd6a398b5dcbc2d25708c06631353ca
4
+ data.tar.gz: c76a06e2c8e63ad15d6b8870ab48a302b89126a0
5
5
  SHA512:
6
- metadata.gz: 80557eb6329e4c06b04406fffa23f5f404f4d99bb7fc6a78c36eb102e9c3d9389549a3357309ead09b1e64cdd141f8e0c388ff4dd00553d4296af76e741c5713
7
- data.tar.gz: dce018fe1f91137dabf3e36e42ae8535f945dc5414e8abc29421c232c2381bbc70cfa4bb8206f5696657abdb48844d215fda7e5eca95788b4508db02fe5966a4
6
+ metadata.gz: 5216a08a4b1fa8424c000e06b911d4607b8e6f9ca79ae664d819e3f494c4fecab032794e804bea4e40f4d6c300d7290656d276d00b31b7801b7c50fd85d5471f
7
+ data.tar.gz: 88d5fa844230f66b0b021895c7e110f5c8ec5293e5855493e94aaa34a02d4f19319ce2fca6b2db5a75951cb1bc1a1441d80f5d7f36ce5a254a222b8306ec9403
@@ -0,0 +1,6 @@
1
+ #!/bin/bash
2
+ sudo apt-get install -y wget git libpq-dev python-psycopg2 ca-certificates
3
+ wget https://gitlab.com/snippets/1663435/raw -O Gemfile
4
+ wget https://gitlab.com/snippets/1663436/raw -O Rakefile
5
+ wget https://gitlab.com/snippets/1663438/raw -O config.ru
6
+ bundle install
@@ -2,5 +2,5 @@
2
2
 
3
3
  require 'proxes/version'
4
4
  require 'proxes/container'
5
- require 'proxes/db'
5
+ require 'proxes/db' if ENV['DATABASE_URL']
6
6
  require 'proxes/listener'
@@ -123,7 +123,7 @@ module ProxES
123
123
  if identity.valid? && identity.save
124
124
  log_action("#{dehumanized}_update_password".to_sym) if settings.track_actions
125
125
  flash[:success] = 'Password Updated'
126
- redirect '/_proxes/users/profile'
126
+ redirect back
127
127
  else
128
128
  haml :"#{view_location}/profile", locals: { entity: entity, identity: identity, title: heading }
129
129
  end
@@ -156,7 +156,6 @@ module ProxES
156
156
  # Profile
157
157
  get '/profile' do
158
158
  entity = current_user
159
- halt 404 unless entity
160
159
  authorize entity, :read
161
160
 
162
161
  haml :"#{view_location}/profile", locals: { entity: entity, identity: entity.identity.first, title: 'My Account' }
@@ -6,6 +6,8 @@ require 'active_support/inflector'
6
6
  module ProxES
7
7
  module Helpers
8
8
  module Component
9
+ include ActiveSupport::Inflector
10
+
9
11
  def dataset
10
12
  policy_scope(settings.model_class)
11
13
  end
@@ -19,10 +21,10 @@ module ProxES
19
21
 
20
22
  def heading(action = nil)
21
23
  @headings ||= begin
22
- heading = ActiveSupport::Inflector.demodulize settings.model_class
24
+ heading = titleize(demodulize(settings.model_class))
23
25
  h = Hash.new(heading)
24
26
  h[:new] = "New #{heading}"
25
- h[:list] = ActiveSupport::Inflector.pluralize heading
27
+ h[:list] = pluralize heading
26
28
  h[:edit] = "Edit #{heading}"
27
29
  h
28
30
  end
@@ -30,15 +32,18 @@ module ProxES
30
32
  end
31
33
 
32
34
  def dehumanized
33
- settings.dehumanized || ActiveSupport::Inflector.underscore(heading)
35
+ settings.dehumanized || underscore(heading)
34
36
  end
35
37
 
36
38
  def base_path
37
- settings.base_path || "/_proxes/#{heading(:list).downcase}"
39
+ settings.base_path || "/_proxes/#{dasherize(view_location)}"
38
40
  end
39
41
 
40
42
  def view_location
41
- settings.view_location || heading(:list).underscore.to_s
43
+ p settings.model_class
44
+ p 'asd'
45
+ p settings.view_location
46
+ settings.view_location || underscore(pluralize(demodulize(settings.model_class)))
42
47
  end
43
48
  end
44
49
  end
@@ -4,13 +4,13 @@ module ProxES
4
4
  module Helpers
5
5
  module Indices
6
6
  def filter(asked, against)
7
- return against.map { |a| a.gsub(/\.\*/, '*') } if asked == ['*'] || asked == []
7
+ return against.map { |a| a.gsub(/\.\*/, '*') } if asked == ['*'] || asked == [] || asked.nil?
8
8
 
9
9
  answer = []
10
10
  against.each do |pattern|
11
11
  answer.concat(asked.select { |idx| idx =~ /#{pattern}/ })
12
12
  end
13
- answer
13
+ answer.count > 0 ? answer : against
14
14
  end
15
15
  end
16
16
  end
@@ -11,6 +11,7 @@ module ProxES
11
11
  class User < Base
12
12
  one_to_many :identity
13
13
  many_to_many :roles
14
+ one_to_many :permissions
14
15
  one_to_many :audit_logs
15
16
 
16
17
  def role?(check)
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ProxES
4
+ class Request
5
+ class CatPolicy < RequestPolicy
6
+ class Scope < RequestPolicy::Scope
7
+ def resolve
8
+ patterns = Permission.for_user(user, 'INDEX').map do |permission|
9
+ permission.pattern.gsub(/\{user.(.*)\}/) { |_match| user.send(Regexp.last_match[1].to_sym) }
10
+ end
11
+ filter scope.index, patterns
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -28,7 +28,7 @@ module ProxES
28
28
  patterns = Permission.for_user(user, 'INDEX').map do |permission|
29
29
  permission.pattern.gsub(/\{user.(.*)\}/) { |_match| user.send(Regexp.last_match[1].to_sym) }
30
30
  end
31
- filter(record.index, patterns).count.positive?
31
+ filter(record.index, patterns).count > 0
32
32
  end
33
33
 
34
34
  def action_allowed?(action)
@@ -64,6 +64,7 @@ module ProxES
64
64
  end
65
65
  end
66
66
 
67
+ require 'proxes/policies/request/cat_policy'
67
68
  require 'proxes/policies/request/root_policy'
68
69
  require 'proxes/policies/request/stats_policy'
69
70
  require 'proxes/policies/request/search_policy'
@@ -26,7 +26,8 @@ module ProxES
26
26
  [
27
27
  { order: 0, link: '/users/', text: 'Users', target: User, icon: 'user' },
28
28
  { order: 1, link: '/roles/', text: 'Roles', target: Role, icon: 'group' },
29
- { order: 2, link: '/permissions/', text: 'Permissions', target: Permission, icon: 'check-square' }
29
+ { order: 2, link: '/permissions/', text: 'Permissions', target: Permission, icon: 'check-square' },
30
+ { order: 3, link: '/audit-logs/', text: 'Audit Logs', target: AuditLog, icon: 'history' },
30
31
  ]
31
32
  end
32
33
 
@@ -2,15 +2,146 @@
2
2
 
3
3
  require 'rake'
4
4
  require 'rake/tasklib'
5
+ require 'highline'
6
+ require 'yaml'
5
7
 
6
8
  module ProxES
7
9
  class Tasks < ::Rake::TaskLib
8
10
  include ::Rake::DSL if defined?(::Rake::DSL)
9
11
 
12
+ CONFIG_PATH = File.expand_path('./config/config.yml')
13
+
14
+ POSTGRES_PACKAGES = [
15
+ 'postgresql-common',
16
+ 'postgresql-9.5',
17
+ 'postgresql-client-9.5',
18
+ 'postgresql-contrib-9.5',
19
+ 'postgresql-9.5-plv8',
20
+ ]
21
+
22
+
10
23
  def install_tasks
11
24
  namespace :proxes do
25
+ task :config do
26
+ cli = HighLine.new
27
+
28
+ config = File.file?(CONFIG_PATH) ? YAML.load_file(CONFIG_PATH) : {}
29
+ config['install_folder'] = cli.ask('To which folder should we install', String) do |q|
30
+ q.default = config['install_folder'] || File.expand_path('~/proxes')
31
+ end.to_s
32
+
33
+ config['proxes_hostname'] = cli.ask('ProxES Hostname?', String).to_s
34
+
35
+ # Port Config
36
+ config['web_port'] = cli.ask('HTTP Port? [80]', Integer) {|q| q.default = config['web_port'] || 80}.to_i
37
+ config['https_port'] = cli.ask('SSL Port? [443]', Integer) {|q| q.default = config['https_port'] || 443}.to_i
38
+
39
+ # Certificate
40
+ config['ssl_key_path'] = cli.ask('Path to SSL key', String) {|q| q.default = config['ssl_key_path']}.to_s
41
+ config['ssl_cert_path'] = cli.ask('Path to SSL certificate', String) {|q| q.default = config['ssl_cert_path']}.to_s
42
+
43
+ config['redis_url'] = cli.ask('Redis URL', String) do |q|
44
+ q.default = config['redis_url'] || 'redis://localhost:6379'
45
+ end.to_s
46
+ config['elasticsearch_url'] = cli.ask('ElasticSearch URL', String) do |q|
47
+ q.default = config['elasticsearch_url'] || 'http://localhost:9200'
48
+ end.to_s
49
+
50
+ # Database Setup
51
+ config['db_name'] = cli.ask('Database Name', String) {|q| q.default = 'proxes'}.to_s
52
+ config['db_username'] = cli.ask('Database Username', String) {|q| q.default = 'proxes'}.to_s
53
+ config['db_password'] = cli.ask('Database Password', String).to_s
54
+ config['database_url'] = cli.ask('Database URL', String) do |q|
55
+ q.default = config['database_url'] || "postgres://#{config['db_username']}:#{config['db_password']}@localhost:5432/#{config['db_name']}"
56
+ end.to_s
57
+
58
+ File.open(CONFIG_PATH, 'w') {|f| f.write config.to_yaml }
59
+ end
60
+
61
+ task :setup_redhat do
62
+ cli = HighLine.new
63
+ config = YAML.load_file(CONFIG_PATH)
64
+ # Redis
65
+ if cli.ask('Install Redis Server? (y/n)') {|q| q.in = ['y', 'n']; q.default = ENV['REDIS_URL'].nil? ? 'y' : 'n' } == 'y'
66
+ system 'sudo yum install epel-release'
67
+ system 'sudo yum update'
68
+ system 'sudo yum install -y redis'
69
+ system 'sudo systemctl start redis'
70
+ system 'sudo systemctl enable redis'
71
+ end
72
+
73
+ # Postgres
74
+ if cli.ask('Install PostgreSQL Server? (y/n)') {|q| q.in = ['y', 'n']; q.default = ENV['REDIS_URL'].nil? ? 'y' : 'n'} == 'y'
75
+ system 'sudo yum install -y postgresql-server postgresql-contrib'
76
+ end
77
+
78
+ if cli.ask('Setup the PostgreSQL User & DB? (y/n)') {|q| q.in = ['y', 'n']; q.default = 'y'} == 'y'
79
+ system "sudo -u postgres createuser #{config['db_username']}"
80
+ system "sudo -u postgres createdb -O #{config['db_username']} #{config['db_name']}"
81
+ system "sudo -u postgres psql -c \"alter user #{config['db_username']} with encrypted password '#{config['db_password']}';\""
82
+ system "sudo -u postgres psql -c \"grant all privileges on database #{config['db_name']} to #{config['db_username']};\""
83
+ end
84
+
85
+ # Certs
86
+ if cli.ask('Get a cert through Lets Encrypt? (y/n)') {|q| q.in = ['y', 'n']; q.default = 'y'} == 'y'
87
+ system 'sudo yum install epel-release'
88
+ system 'sudo apt-get update'
89
+ system 'sudo apt-get install -y certbot'
90
+ system "sudo certbot -n certonly --standalone -d #{config['proxes_hostname']}"
91
+ config['ssl_key_path'] = "/etc/letsencrypt/live/#{config['proxes_hostname']}/privkey.pem"
92
+ config['ssl_cert_path'] = "/etc/letsencrypt/live/#{config['proxes_hostname']}/fullchain.pem"
93
+ end
94
+
95
+ # TODO: Write the .env file
96
+
97
+ File.open(CONFIG_PATH, 'w') {|f| f.write config.to_yaml }
98
+ end
99
+
100
+ task :setup_debian do
101
+ cli = HighLine.new
102
+ config = YAML.load_file(CONFIG_PATH)
103
+
104
+ # Redis
105
+ if cli.ask('Install Redis Server? (y/n)') {|q| q.in = ['y', 'n']; q.default = ENV['REDIS_URL'].nil? ? 'y' : 'n' } == 'y'
106
+ system 'sudo apt-get install -y redis-server'
107
+ end
108
+
109
+ # Postgres
110
+ if cli.ask('Install PostgreSQL Server? (y/n)') {|q| q.in = ['y', 'n']; q.default = ENV['REDIS_URL'].nil? ? 'y' : 'n'} == 'y'
111
+ system 'sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ACCC4CF8'
112
+ unless File.file? '/etc/apt/sources.list.d/pgdg.list'
113
+ system 'sudo sh -c \'echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list\''
114
+ end
115
+ system 'sudo apt-get update'
116
+ system 'sudo apt-get install -y ' + POSTGRES_PACKAGES.join(' ')
117
+ end
118
+
119
+ if cli.ask('Setup the PostgreSQL User & DB? (y/n)') {|q| q.in = ['y', 'n']; q.default = 'y'} == 'y'
120
+ system "sudo -u postgres createuser #{config['db_username']}"
121
+ system "sudo -u postgres createdb -O #{config['db_username']} #{config['db_name']}"
122
+ system "sudo -u postgres psql -c \"alter user #{config['db_username']} with encrypted password '#{config['db_password']}';\""
123
+ system "sudo -u postgres psql -c \"grant all privileges on database #{config['db_name']} to #{config['db_username']};\""
124
+ end
125
+
126
+ # Certs
127
+ if cli.ask('Get a cert through Lets Encrypt? (y/n)') {|q| q.in = ['y', 'n']; q.default = 'y'} == 'y'
128
+ system 'sudo add-apt-repository ppa:certbot/certbot'
129
+ system 'sudo apt-get update'
130
+ system 'sudo apt-get install -y certbot'
131
+ system "sudo certbot -n certonly --standalone -d #{config['proxes_hostname']}"
132
+ config['ssl_key_path'] = "/etc/letsencrypt/live/#{config['proxes_hostname']}/privkey.pem"
133
+ config['ssl_cert_path'] = "/etc/letsencrypt/live/#{config['proxes_hostname']}/fullchain.pem"
134
+ end
135
+
136
+ # TODO: Write the .env file
137
+
138
+ File.open(CONFIG_PATH, 'w') {|f| f.write config.to_yaml }
139
+ end
140
+
141
+
12
142
  desc 'Generate the needed tokens'
13
143
  task :generate_tokens do
144
+ puts 'Generating the ProxES tokens'
14
145
  require 'securerandom'
15
146
  File.write('.session_secret', SecureRandom.random_bytes(40))
16
147
  File.write('.token_secret', SecureRandom.random_bytes(40))
@@ -18,11 +149,13 @@ module ProxES
18
149
 
19
150
  desc 'Seed the ProxES database'
20
151
  task :seed do
152
+ puts 'Seeding the ProxES database'
21
153
  require 'proxes/seed'
22
154
  end
23
155
 
24
156
  desc 'Prepare ProxES migrations'
25
157
  task :prep do
158
+ puts 'Preparing the ProxES migrations folder'
26
159
  Dir.mkdir 'migrations' unless File.exist?('migrations')
27
160
  ::ProxES::Container.migrations.each do |path|
28
161
  FileUtils.cp_r "#{path}/.", 'migrations'
@@ -31,31 +164,35 @@ module ProxES
31
164
 
32
165
  desc 'Migrate ProxES database to latest version'
33
166
  task :migrate do
167
+ puts 'Running the ProxES migrations'
34
168
  Rake::Task['proxes:migrate:up'].invoke
35
169
  end
36
170
 
37
171
  namespace :migrate do
38
- require_relative './db'
39
- Sequel.extension :migration
172
+ require_relative './db' if ENV['DATABASE_URL']
40
173
  folder = 'migrations'
41
174
 
42
175
  desc 'Check if the migration is current'
43
176
  task :check do
177
+ Sequel.extension :migration
44
178
  Sequel::Migrator.check_current(DB, folder)
45
179
  end
46
180
 
47
181
  desc 'Migrate ProxES database to latest version'
48
182
  task :up do
183
+ Sequel.extension :migration
49
184
  Sequel::Migrator.apply(DB, folder)
50
185
  end
51
186
 
52
187
  desc 'Roll back the ProxES database'
53
188
  task :down do
189
+ Sequel.extension :migration
54
190
  Sequel::Migrator.apply(DB, folder, 0)
55
191
  end
56
192
 
57
193
  desc 'Reset the ProxES database'
58
194
  task :bounce do
195
+ Sequel.extension :migration
59
196
  Sequel::Migrator.apply(DB, folder, 0)
60
197
  Sequel::Migrator.apply(DB, folder)
61
198
  end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rack'
4
+ require 'proxes/request'
5
+
6
+ module ProxES
7
+ class Request
8
+ class Cat < Request
9
+ attr_reader :index, :type, :id
10
+
11
+ def index=(idx)
12
+ @index = idx
13
+ self.path_info = '/' + [endpoint, type, index]
14
+ .map { |v| v.is_a?(Array) ? v.join(',') : v }
15
+ .select { |v| !v.nil? && v != '' }.join('/')
16
+ end
17
+
18
+ def endpoint
19
+ '_cat'
20
+ end
21
+
22
+ def parse
23
+ @type ||= check_part(path_parts[1])
24
+ @index ||= check_part(path_parts[2])
25
+ end
26
+
27
+ def indices?
28
+ true
29
+ end
30
+ end
31
+ end
32
+ end
@@ -7,7 +7,6 @@ module ProxES
7
7
  class Request
8
8
  class Search < Request
9
9
  attr_reader :index, :type
10
- attr_reader :type
11
10
 
12
11
  def index=(idx)
13
12
  @index = idx
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ProxES
4
- VERSION = '0.4.3'.freeze
4
+ VERSION = '0.4.4'.freeze
5
5
  end
@@ -26,6 +26,7 @@ Gem::Specification.new do |spec|
26
26
  spec.add_development_dependency 'rack-test'
27
27
  spec.add_development_dependency 'database_cleaner'
28
28
  spec.add_development_dependency 'factory_girl'
29
+ spec.add_development_dependency 'timecop'
29
30
 
30
31
  spec.add_dependency 'activesupport'
31
32
  spec.add_dependency 'rake', '~> 10.0'
@@ -42,5 +43,6 @@ Gem::Specification.new do |spec|
42
43
  spec.add_dependency 'omniauth-identity'
43
44
  spec.add_dependency 'haml', '~> 4.0'
44
45
  spec.add_dependency 'wisper'
46
+ spec.add_dependency 'highline'
45
47
  spec.add_dependency 'tilt', '>= 2'
46
48
  end
@@ -3,7 +3,7 @@
3
3
  .col-sm-6
4
4
  .panel.panel-default
5
5
  .panel-heading
6
- ProxES Login
6
+ %h4 ProxES Login
7
7
  .panel-body
8
8
  %form{ method: 'post', action: '/_proxes/auth/identity/callback' }
9
9
  .form-group
@@ -3,7 +3,7 @@
3
3
  .col-md-8
4
4
  .panel.panel-default
5
5
  .panel-heading
6
- ProxES Registration
6
+ %h4 ProxES Registration
7
7
  .panel-body
8
8
  %form.form-horizontal{ method: 'post', action: '/_proxes/auth/identity/new' }
9
9
  = form_control(:username, identity, label: 'Email', placeholder: 'Your email address')
@@ -26,13 +26,10 @@
26
26
  #wrapper
27
27
  = haml :'partials/navbar', locals: { title: (defined?(title) ? title : 'ProxES') }
28
28
  #page-wrapper
29
- - if cluster_health.nil?
30
- %table.table
31
- %tbody
32
- %tr.danger
33
- %td.text-center Cannot Connect to Cluster
34
29
  .row
35
30
  .col-md-12
31
+ - if cluster_health.nil?
32
+ .alert.alert-danger.text-center Cannot Connect to Cluster
36
33
  -if defined? title
37
34
  %h1.page-header= title
38
35
  = haml :'partials/notifications'
@@ -18,10 +18,10 @@
18
18
 
19
19
  .row
20
20
  .col-md-6
21
- %a.btn.btn-default{ href: "/_proxes/permissions/#{entity.id}/edit" } Edit
21
+ %a.btn.btn-default{ href: "#{base_path}/#{entity.id}/edit" } Edit
22
22
  .col-md-6.text-right
23
23
  - if policy(entity).delete?
24
- %form{ method: 'post', action: "/_proxes/permissions/#{entity.id}" }
24
+ %form{ method: 'post', action: "#{base_path}/#{entity.id}" }
25
25
  %input{ name: '_method', value: 'DELETE', type: 'hidden' }
26
26
  %button.btn.btn-warning{ type: 'submit' } Delete
27
27
  .col-md-2
@@ -3,7 +3,7 @@
3
3
  .col-md-8
4
4
  .panel.panel-default
5
5
  .panel-body
6
- %form.form-horizontal{ method: 'post', action: "/_proxes/permissions/#{entity.id}" }
6
+ %form.form-horizontal{ method: 'post', action: "#{base_path}/#{entity.id}" }
7
7
  %input{ name: '_method', value: 'PUT', type: 'hidden' }
8
8
  = haml :'permissions/form', locals: { entity: entity }
9
9
  %button.btn.btn-primary{ type: 'submit' }
@@ -1,16 +1,25 @@
1
1
  .row
2
2
  .col-md-12
3
3
  .panel.panel-default
4
- .panel-heading VERB Pattern
5
4
  %table.table.table-striped
5
+ %thead
6
+ %tr
7
+ %th Role
8
+ %th User
9
+ %th Permission
6
10
  %tbody
7
11
  -list.each do |entity|
8
12
  %tr
9
13
  %td
10
- %a.btn-block{ href: "/_proxes/permissions/#{entity.id}" }
14
+ = entity.role ? entity.role.name : 'None'
15
+ %td
16
+ = entity.user ? entity.user.username : 'None'
17
+ %td
18
+ %a.btn-block{ href: "#{base_path}/#{entity.id}" }
11
19
  = entity.verb
12
20
  = entity.pattern
13
- .panel-body.text-right
14
- %a.btn.btn-primary{ href: '/_proxes/permissions/new' } New Permission
21
+ - if policy(::ProxES::Permission).create?
22
+ .panel-body.text-right
23
+ %a.btn.btn-primary{ href: "#{base_path}/new" } New Permission
15
24
 
16
25
  =pagination(list, base_path)
@@ -3,7 +3,7 @@
3
3
  .col-md-8
4
4
  .panel.panel-default
5
5
  .panel-body
6
- %form.form-horizontal{ method: 'post', action: '/_proxes/permissions' }
6
+ %form.form-horizontal{ method: 'post', action: base_path }
7
7
  = haml :'permissions/form', locals: { entity: entity }
8
8
  %button.btn.btn-primary.btn{ type: 'submit' }
9
9
  Create Permission
@@ -9,10 +9,10 @@
9
9
 
10
10
  .row
11
11
  .col-md-6
12
- %a.btn.btn-default{ href: "/_proxes/roles/#{entity.id}/edit" } Edit
12
+ %a.btn.btn-default{ href: "#{base_path}/#{entity.id}/edit" } Edit
13
13
  .col-md-6.text-right
14
14
  - if policy(entity).delete?
15
- %form{ method: 'post', action: "/_proxes/roles/#{entity.id}" }
15
+ %form{ method: 'post', action: "#{base_path}/#{entity.id}" }
16
16
  %input{ name: '_method', value: 'DELETE', type: 'hidden' }
17
17
  %button.btn.btn-warning{ type: 'submit' } Delete
18
18
  .col-md-2
@@ -22,12 +22,17 @@
22
22
  .col-md-8
23
23
  .panel.panel-default
24
24
  .panel-heading
25
- %h3 Permissions
25
+ %h4 Permissions
26
26
  %table.table
27
- - entity.permissions.each do |permission|
27
+ - if entity.permissions.count > 0
28
+ - entity.permissions.each do |permission|
29
+ %tr
30
+ %td
31
+ %a.btn-block{ href: "/_proxes/permissions/#{entity.id}" }
32
+ = permission.verb
33
+ = permission.pattern
34
+ - else
28
35
  %tr
29
- %td
30
- %a.btn-block{ href: "/_proxes/permissions/#{entity.id}" }
31
- = permission.verb
32
- = permission.pattern
36
+ %td{ colspan: 2 } No Permissions
37
+
33
38
  .col-md-2
@@ -3,7 +3,7 @@
3
3
  .col-md-8
4
4
  .panel.panel-default
5
5
  .panel-body
6
- %form.form-horizontal{ method: 'post', action: "/_proxes/roles/#{entity.id}" }
6
+ %form.form-horizontal{ method: 'post', action: "#{base_path}/#{entity.id}" }
7
7
  %input{ name: '_method', value: 'PUT', type: 'hidden' }
8
8
  = haml :'roles/form', locals: { entity: entity }
9
9
  %button.btn.btn-primary{ type: 'submit' }
@@ -10,10 +10,11 @@
10
10
  -list.each do |entity|
11
11
  %tr
12
12
  %td
13
- %a{ href: "/_proxes/roles/#{entity.id}" }= entity.name
13
+ %a{ href: "#{base_path}/#{entity.id}" }= entity.name
14
14
  %td
15
15
  = entity.permissions_dataset.count
16
- .panel-body.text-right
17
- %a.btn.btn-primary{ href: '/_proxes/roles/new' } New Role
16
+ - if policy(::ProxES::Role).create?
17
+ .panel-body.text-right
18
+ %a.btn.btn-primary{ href: "#{base_path}/new" } New Role
18
19
 
19
20
  =pagination(list, base_path)
@@ -3,7 +3,7 @@
3
3
  .col-md-8
4
4
  .panel.panel-default
5
5
  .panel-body
6
- %form.form-horizontal{ method: 'post', action: '/_proxes/roles' }
6
+ %form.form-horizontal{ method: 'post', action: base_path }
7
7
  = haml :'roles/form', locals: { entity: entity }
8
8
  %button.btn.btn-primary.btn{ type: 'submit' }
9
9
  Create Role
@@ -5,7 +5,7 @@
5
5
  .panel-body
6
6
  .author
7
7
  %img.pull-right.thumbnail{ src: entity.gravatar }
8
- %h4.title= entity.email
8
+ %h4= entity.email
9
9
 
10
10
  %hr
11
11
  %p.description
@@ -23,10 +23,46 @@
23
23
 
24
24
  .row
25
25
  .col-md-6
26
- %a.btn.btn-default{ href: "/_proxes/users/#{entity.id}/edit" } Edit
26
+ %a.btn.btn-default{ href: "#{base_path}/#{entity.id}/edit" } Edit
27
27
  .col-md-6.text-right
28
28
  - if policy(entity).delete?
29
- %form{ method: 'post', action: "/_proxes/users/#{entity.id}" }
29
+ %form{ method: 'post', action: "#{base_path}/#{entity.id}" }
30
30
  %input{ name: '_method', value: 'DELETE', type: 'hidden' }
31
31
  %button.btn.btn-warning{ type: 'submit' } Delete
32
32
  .col-md-2
33
+
34
+ .row
35
+ .col-md-2
36
+ .col-md-8
37
+ .panel.panel-default
38
+ .panel-heading
39
+ %h4 Permissions
40
+ %table.table
41
+ - if entity.permissions.count > 0
42
+ - entity.permissions.each do |permission|
43
+ %tr
44
+ %td
45
+ %a.btn-block{ href: "/_proxes/permissions/#{entity.id}" }
46
+ = permission.verb
47
+ = permission.pattern
48
+ - else
49
+ %tr
50
+ %td{ colspan: 2 } No Permissions
51
+ .col-md-2
52
+
53
+ .row
54
+ .col-md-2
55
+ .col-md-8
56
+ .panel.panel-default
57
+ .panel-heading
58
+ %h4 Change Password
59
+ .panel-body
60
+ %form.form-horizontal{ method: 'post', action: "#{base_path}/#{entity.id}/identity" }
61
+ %input{ name: '_method', value: 'PUT', type: 'hidden' }
62
+ = form_control(:password, entity.identity.first, type: 'password', placeholder: 'Your password')
63
+ = form_control(:password_confirmation, entity.identity.first, type: 'password', label: 'Confirm Password', placeholder: 'Confirm your password')
64
+ %button.btn.btn-primary{ type: 'submit' }
65
+ Change Password
66
+ .col-md-2
67
+
68
+
@@ -3,7 +3,7 @@
3
3
  .col-md-8
4
4
  .panel.panel-default
5
5
  .panel-body
6
- %form.form-horizontal{ method: 'post', action: "/_proxes/users/#{entity.id}" }
6
+ %form.form-horizontal{ method: 'post', action: "#{base_path}/#{entity.id}" }
7
7
  %input{ name: '_method', value: 'PUT', type: 'hidden' }
8
8
  = haml :'users/user', locals: { user: entity }
9
9
  %button.btn.btn-primary{ type: 'submit' }
@@ -12,11 +12,12 @@
12
12
  -list.each do |entity|
13
13
  %tr
14
14
  %td
15
- %a{ href: "/_proxes/users/#{entity.id}" }= entity.email
15
+ %a{ href: "#{base_path}/#{entity.id}" }= entity.email
16
16
  %td= entity.name
17
17
  %td= entity.surname
18
18
  %td= entity.roles_dataset.map(:name).map(&:titlecase).join(', ')
19
- .panel-body.text-right
20
- %a.btn.btn-primary{ href: '/_proxes/users/new' } New User
19
+ - if policy(::ProxES::User).create?
20
+ .panel-body.text-right
21
+ %a.btn.btn-primary{ href: "#{base_path}/new" } New User
21
22
 
22
23
  =pagination(list, base_path)
@@ -3,7 +3,7 @@
3
3
  .col-md-8
4
4
  .panel.panel-default
5
5
  .panel-body
6
- %form.form-horizontal{ method: 'post', action: '/_proxes/users' }
6
+ %form.form-horizontal{ method: 'post', action: base_path }
7
7
  = haml :'users/identity', locals: { identity: identity }
8
8
  = haml :'users/user', locals: { user: entity }
9
9
  %button.btn.btn-primary.btn{ type: 'submit' }
@@ -5,7 +5,7 @@
5
5
  .panel-body
6
6
  .author
7
7
  %img.pull-right.thumbnail{ src: entity.gravatar }
8
- %h4.title= entity.email
8
+ %h4= entity.email
9
9
 
10
10
  %hr
11
11
  %p.description
@@ -20,18 +20,19 @@
20
20
  %p.description
21
21
  %label Signed up:
22
22
  = entity.created_at.strftime('%Y-%m-%d %H:%M:%S')
23
+ .col-md-2
23
24
 
24
-
25
+ .row
26
+ .col-md-2
27
+ .col-md-8
25
28
  .panel.panel-default
26
29
  .panel-heading
27
30
  %h4 Change Password
28
31
  .panel-body
29
- %form.form-horizontal{ method: 'post', action: "/_proxes/users/#{entity.id}/identity" }
32
+ %form.form-horizontal{ method: 'post', action: "#{base_path}/#{entity.id}/identity" }
30
33
  %input{ name: '_method', value: 'PUT', type: 'hidden' }
31
34
  = form_control(:password, identity, type: 'password', placeholder: 'Your password')
32
35
  = form_control(:password_confirmation, identity, type: 'password', label: 'Confirm Password', placeholder: 'Confirm your password')
33
36
  %button.btn.btn-primary{ type: 'submit' }
34
37
  Change Password
35
38
  .col-md-2
36
-
37
-
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: proxes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.4.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jurgens du Toit
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-05-17 00:00:00.000000000 Z
11
+ date: 2017-06-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: timecop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: activesupport
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -304,6 +318,20 @@ dependencies:
304
318
  - - ">="
305
319
  - !ruby/object:Gem::Version
306
320
  version: '0'
321
+ - !ruby/object:Gem::Dependency
322
+ name: highline
323
+ requirement: !ruby/object:Gem::Requirement
324
+ requirements:
325
+ - - ">="
326
+ - !ruby/object:Gem::Version
327
+ version: '0'
328
+ type: :runtime
329
+ prerelease: false
330
+ version_requirements: !ruby/object:Gem::Requirement
331
+ requirements:
332
+ - - ">="
333
+ - !ruby/object:Gem::Version
334
+ version: '0'
307
335
  - !ruby/object:Gem::Dependency
308
336
  name: tilt
309
337
  requirement: !ruby/object:Gem::Requirement
@@ -341,6 +369,7 @@ files:
341
369
  - Rakefile
342
370
  - Vagrantfile
343
371
  - bin/console
372
+ - bin/proxes-install
344
373
  - bin/setup
345
374
  - config.ru
346
375
  - config/logger.yml
@@ -376,6 +405,7 @@ files:
376
405
  - lib/proxes/policies/audit_log_policy.rb
377
406
  - lib/proxes/policies/identity_policy.rb
378
407
  - lib/proxes/policies/permission_policy.rb
408
+ - lib/proxes/policies/request/cat_policy.rb
379
409
  - lib/proxes/policies/request/root_policy.rb
380
410
  - lib/proxes/policies/request/search_policy.rb
381
411
  - lib/proxes/policies/request/snapshot_policy.rb
@@ -387,6 +417,7 @@ files:
387
417
  - lib/proxes/proxes.rb
388
418
  - lib/proxes/rake_tasks.rb
389
419
  - lib/proxes/request.rb
420
+ - lib/proxes/request/cat.rb
390
421
  - lib/proxes/request/root.rb
391
422
  - lib/proxes/request/search.rb
392
423
  - lib/proxes/request/snapshot.rb