proxes 0.4.3 → 0.4.4

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.
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