rokku 0.5.0 → 0.7.0

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
  SHA256:
3
- metadata.gz: e35f55f5d2b9be912f462bbd1abda316f5abe55c9e58d5dc27e99c7933004427
4
- data.tar.gz: 1f16e58528cec63db8e6903761256df1ae19149a96610ea49cb201e5d4605dcd
3
+ metadata.gz: de9fd9e92bfea55153e2a5cc08a19f6c9f1e6a6e8955ff5f6949cbe3bf689bb2
4
+ data.tar.gz: be746224f675cdbe8bbc2058ab7d1fcf1c18c9d04a9a5ef2557060ed3fdfcad5
5
5
  SHA512:
6
- metadata.gz: 6dbd48399c45dc6dd02c679a3f3a529bcd1ac84e165efb2379397646c92e4b30c8091ae8dd7ed2c03bd29c73377b4b6a5587ebef1b12950a6893dbe23e54f7da
7
- data.tar.gz: 5c898ad4c83a58a253056f3612c041c45b3ab9f6242c2e5da144602ef6ff3536487ef5b09997db7fcd0d8afa597112723b08ef1c0c1b2d3361ac835c34d8177f
6
+ metadata.gz: f1f9f9c33fa1b2c888380a4034eaa3473d25d7b30cbc55c9bbd627bcbcedbdb8af5d7ae63e6fa4e4429f6854cd22315eedff9dce7ff7b5f5caee910c5846ae8f
7
+ data.tar.gz: 0ad532c9440192d8a6a804a6a9d367674a85770cb286a3d343f09fa84f84747396a95c1f92d5cb9a663db3c8d1187cd15b1100ffb85a150340f93ee588a63de3
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rokku (0.5.0)
4
+ rokku (0.7.0)
5
5
  hanami-controller (~> 1.0)
6
6
  hanami-router (~> 1.0)
7
7
 
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Rokku
2
2
 
3
- [![Join the chat at https://gitter.im/sebastjan-hribar/rokku](https://badges.gitter.im/sebastjan-hribar/rokku.svg)](https://gitter.im/sebastjan-hribar/rokku?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Gem Version](https://badge.fury.io/rb/rokku.svg)](https://badge.fury.io/rb/rokku) [![Build Status](https://travis-ci.org/sebastjan-hribar/rokku.svg?branch=master)](https://travis-ci.org/sebastjan-hribar/rokku)
3
+ [![Join the chat at https://gitter.im/sebastjan-hribar/rokku](https://badges.gitter.im/sebastjan-hribar/rokku.svg)](https://gitter.im/sebastjan-hribar/rokku?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Gem Version](https://badge.fury.io/rb/rokku.svg)](https://badge.fury.io/rb/rokku)
4
4
 
5
5
  Rokku (ロック - lock) offers authorization for [Hanami web applications](http://hanamirb.org/).
6
6
 
@@ -36,6 +36,12 @@ end
36
36
 
37
37
  ## Usage
38
38
 
39
+ ### Role based authorization
40
+
41
+ #### Prerequisites
42
+ The current user must be stored in the `@user` variable and must have the attribute of `roles`. Rokku supports `roles` both as a type of `Array` and `String`.
43
+ For example, the `@user.roles` could either be a simple string like 'admin' or an array of roles like `['level_1', 'level_2', 'level_3']`.
44
+
39
45
  ```ruby
40
46
  rokku -n mightyPoster -p post
41
47
  ```
@@ -46,25 +52,46 @@ Each application will have its own `app/policies` folders.
46
52
  **The command must be run in the project root folder.**
47
53
 
48
54
  Once the file is generated, the authorized roles variables in the initialize block for required actions need to be uncommented and supplied with specific roles.
49
-
50
- Then we can check if a user is authorized:
55
+ For example:
51
56
 
52
57
  ```ruby
53
- authorized?(controller, role, action)
58
+ # @authorized_roles_for_show = []
59
+ # @authorized_roles_for_index = []
60
+ # @authorized_roles_for_edit = []
61
+ @authorized_roles_for_update = ['admin']
54
62
  ```
55
63
 
64
+ Then we can check if a user is authorized for the `mightyPoster` application, `Post` controller and `Update`action.
56
65
 
57
- ### ToDo
66
+ ```ruby
67
+ authorized?("mightyposter", "post", "update")
68
+ ```
58
69
 
59
- - Add support for author/owner authorizations.
60
- - Add generators for adding authorization rules to existing policies.
70
+ A complete example of using Rokku in a Hanami 1.3 applications is available [here](https://sebastjan-hribar.github.io/programming/2022/01/08/rokku-with-hanami.html).
61
71
 
62
72
 
63
73
  ### Changelog
64
74
 
75
+ #### 0.7.0
76
+
77
+ * Policies are now scoped under application module so it is possible to have two `Dashboard` policies for two different applications.
78
+ * Readme update.
79
+
80
+ #### 0.6.0
81
+
82
+ * Change to accept a string or an array as roles.
83
+ * Refactored tests.
84
+ * Added `commands.rb`to `bin/rokku`.
85
+ * Small style changes.
86
+
87
+ #### 0.5.1
88
+
89
+ * Readme update
90
+ * Refactored tests
91
+
65
92
  #### 0.5.0
66
93
 
67
- Move from Tachiban
94
+ * Move from Tachiban
68
95
 
69
96
 
70
97
  ## Development
data/bin/rokku ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative "../lib/rokku/commands/commands.rb"
3
+
4
+ Commands.run
@@ -1,41 +1,107 @@
1
- #!/usr/bin/env ruby
2
1
  require 'optparse'
3
- require_relative "../policy_generator/policy_generator.rb"
2
+ require 'fileutils'
4
3
 
5
- options = {}
6
- optparse = OptionParser.new do |opts|
7
- opts.banner = "\nHanami authorization policy generator
8
- Usage: rokku -n myapp -p user
9
- Flags:
10
- \n"
4
+ module Commands
5
+ def self.run
6
+ options = {}
7
+ optparse = OptionParser.new do |opts|
8
+ opts.banner = "\nHanami authorization policy generator
9
+ Usage: rokku -n myapp -p user
10
+ Flags:
11
+ \n"
11
12
 
12
- opts.on("-n", "--app_name APP", "Specify the application name for the policy") do |app_name|
13
- options[:app_name] = app_name
14
- end
13
+ opts.on("-n", "--app_name APP", "Specify the application name for the policy") do |app_name|
14
+ options[:app_name] = app_name
15
+ end
15
16
 
16
- opts.on("-p", "--policy POLICY", "Specify the policy name") do |policy|
17
- options[:policy] = policy
18
- end
17
+ opts.on("-p", "--policy POLICY", "Specify the policy name") do |policy|
18
+ options[:policy] = policy
19
+ end
20
+
21
+ opts.on("-h", "--help", "Displays help") do
22
+ puts opts
23
+ exit
24
+ end
25
+ end
26
+
27
+ begin
28
+ optparse.parse!
29
+ puts "Add flag -h or --help to see usage instructions." if options.empty?
30
+ mandatory = [:app_name, :policy]
31
+ missing = mandatory.select{ |arg| options[arg].nil? }
32
+ unless missing.empty?
33
+ raise OptionParser::MissingArgument.new(missing.join(', '))
34
+ end
35
+ rescue OptionParser::InvalidOption, OptionParser::MissingArgument
36
+ puts $!.to_s
37
+ puts optparse
38
+ exit
39
+ end
19
40
 
20
- opts.on("-h", "--help", "Displays help") do
21
- puts opts
22
- exit
41
+ puts "Performing task with options: #{options.inspect}"
42
+ generate_policy("#{options[:app_name]}", "#{options[:policy]}") if options[:policy]
23
43
  end
24
- end
25
44
 
26
- begin
27
- optparse.parse!
28
- puts "Add flag -h or --help to see usage instructions." if options.empty?
29
- mandatory = [:app_name, :policy]
30
- missing = mandatory.select{ |arg| options[arg].nil? }
31
- unless missing.empty?
32
- raise OptionParser::MissingArgument.new(missing.join(', '))
45
+ private
46
+ # The generate_policy method creates the policy file for specified
47
+ # application and controller. By default all actions to check against
48
+ # are commented out.
49
+ # Uncomment the needed actions and define appropriate user roles.
50
+
51
+ def self.generate_policy(app_name, controller_name)
52
+ app_name = app_name.downcase.capitalize
53
+ controller = controller_name.downcase.capitalize
54
+ policy_txt = <<-TXT
55
+ module #{app_name}
56
+ class #{controller}Policy
57
+ def initialize(roles)
58
+ @user_roles = roles
59
+ # Uncomment the required roles and add the
60
+ # appropriate user role to the @authorized_roles* array.
61
+ # @authorized_roles_for_new = []
62
+ # @authorized_roles_for_create = []
63
+ # @authorized_roles_for_show = []
64
+ # @authorized_roles_for_index = []
65
+ # @authorized_roles_for_edit = []
66
+ # @authorized_roles_for_update = []
67
+ # @authorized_roles_for_destroy = []
68
+ end
69
+
70
+ def new?
71
+ (@authorized_roles_for_new & @user_roles).any?
72
+ end
73
+
74
+ def create?
75
+ (@authorized_roles_for_create & @user_roles).any?
76
+ end
77
+
78
+ def show?
79
+ (@authorized_roles_for_show & @user_roles).any?
80
+ end
81
+
82
+ def index?
83
+ (@authorized_roles_for_index & @user_roles).any?
84
+ end
85
+
86
+ def edit?
87
+ (@authorized_roles_for_edit & @user_roles).any?
88
+ end
89
+
90
+ def update?
91
+ (@authorized_roles_for_update & @user_roles).any?
92
+ end
93
+
94
+ def destroy?
95
+ (@authorized_roles_for_destroy & @user_roles).any?
96
+ end
97
+ end
98
+ end
99
+ TXT
100
+
101
+ FileUtils.mkdir_p "lib/#{app_name.downcase}/policies" unless File.directory?("lib/#{app_name.downcase}/policies")
102
+ unless File.file?("lib/#{app_name.downcase}/policies/#{controller}Policy.rb")
103
+ File.open("lib/#{app_name.downcase}/policies/#{controller}Policy.rb", 'w') { |file| file.write(policy_txt) }
104
+ end
105
+ puts("Generated policy: lib/#{app_name.downcase}/policies/#{controller}Policy.rb") if File.file?("lib/#{app_name.downcase}/policies/#{controller}Policy.rb")
33
106
  end
34
- rescue OptionParser::InvalidOption, OptionParser::MissingArgument
35
- puts $!.to_s
36
- puts optparse
37
- exit
38
107
  end
39
-
40
- puts "Performing task with options: #{options.inspect}"
41
- generate_policy("#{options[:app_name]}", "#{options[:policy]}") if options[:policy]
data/lib/rokku/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rokku
2
- VERSION = "0.5.0"
2
+ VERSION = "0.7.0"
3
3
  end
data/lib/rokku.rb CHANGED
@@ -10,10 +10,17 @@ module Hanami
10
10
  # and permission to access the action. It returns true or false and
11
11
  # provides the basis for further actions in either case.
12
12
  #
13
- # Example: redirect_to "/" unless authorized?("PostController", "admin", "create")
13
+ # Example: redirect_to "/" unless authorized?("post", create")
14
14
 
15
- def authorized?(controller, role, action)
16
- Object.const_get(controller.downcase.capitalize + "Policy").new(role).send("#{action.downcase}?")
15
+ def authorized?(application, controller, action)
16
+ input_roles = @user.roles
17
+ roles = []
18
+ if input_roles.class == String
19
+ roles << input_roles
20
+ else
21
+ roles = input_roles
22
+ end
23
+ Object.const_get("#{application}::#{controller.downcase.capitalize}Policy").new(roles).send("#{action.downcase}?")
17
24
  end
18
25
  end
19
26
  end
data/rokku.gemspec CHANGED
@@ -20,8 +20,8 @@ Gem::Specification.new do |spec|
20
20
  spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
21
21
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
22
22
  end
23
- spec.bindir = "exe"
24
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
+ spec.bindir = "bin"
24
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
25
25
  spec.require_paths = ["lib"]
26
26
 
27
27
  spec.add_development_dependency "bundler", "~> 2.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rokku
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sebastjan Hribar
8
8
  autorequire:
9
- bindir: exe
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-22 00:00:00.000000000 Z
11
+ date: 2022-01-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -125,7 +125,10 @@ dependencies:
125
125
  description:
126
126
  email:
127
127
  - sebastjan.hribar@gmail.com
128
- executables: []
128
+ executables:
129
+ - console
130
+ - rokku
131
+ - setup
129
132
  extensions: []
130
133
  extra_rdoc_files: []
131
134
  files:
@@ -138,10 +141,10 @@ files:
138
141
  - README.md
139
142
  - Rakefile
140
143
  - bin/console
144
+ - bin/rokku
141
145
  - bin/setup
142
146
  - lib/rokku.rb
143
147
  - lib/rokku/commands/commands.rb
144
- - lib/rokku/policy_generator/policy_generator.rb
145
148
  - lib/rokku/version.rb
146
149
  - rokku.gemspec
147
150
  homepage: https://github.com/sebastjan-hribar/rokku
@@ -1,62 +0,0 @@
1
- require 'fileutils'
2
-
3
- require 'hanami/controller'
4
- require 'hanami/action/session'
5
-
6
- module Hanami
7
- module Rokku
8
- private
9
- # The generate_policy method creates the policy file for specified
10
- # application and controller. By default all actions to check against
11
- # are commented out.
12
- # Uncomment the needed actions and define appropriate user role.
13
-
14
- def generate_policy(app_name, controller_name)
15
- app_name = app_name
16
- controller = controller_name.downcase.capitalize
17
- policy_txt = <<-TXT
18
- class #{controller}Policy
19
- def initialize(role)
20
- @user_role = role
21
- # Uncomment the required roles and add the
22
- # appropriate user role to the @authorized_roles* array.
23
- # @authorized_roles_for_new = []
24
- # @authorized_roles_for_create = []
25
- # @authorized_roles_for_show = []
26
- # @authorized_roles_for_index = []
27
- # @authorized_roles_for_edit = []
28
- # @authorized_roles_for_update = []
29
- # @authorized_roles_for_destroy = []
30
- end
31
- def new?
32
- @authorized_roles_for_new.include? @user_role
33
- end
34
- def create?
35
- @authorized_roles_for_create.include? @user_role
36
- end
37
- def show?
38
- @authorized_roles_for_show.include? @user_role
39
- end
40
- def index?
41
- @authorized_roles_for_index.include? @user_role
42
- end
43
- def edit?
44
- @authorized_roles_for_edit.include? @user_role
45
- end
46
- def update?
47
- @authorized_roles_for_update.include? @user_role
48
- end
49
- def destroy?
50
- @authorized_roles_for_destroy.include? @user_role
51
- end
52
- end
53
- TXT
54
-
55
- FileUtils.mkdir_p "lib/#{app_name}/policies" unless File.directory?("lib/#{app_name}/policies")
56
- unless File.file?("lib/#{app_name}/policies/#{controller}Policy.rb")
57
- File.open("lib/#{app_name}/policies/#{controller}Policy.rb", 'w') { |file| file.write(policy_txt) }
58
- end
59
- puts("Generated policy: lib/#{app_name}/policies/#{controller}Policy.rb") if File.file?("lib/#{app_name}/policies/#{controller}Policy.rb")
60
- end
61
- end
62
- end