ixtlan-generators 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. data/README.md +64 -0
  2. data/features/generators.feature +6 -0
  3. data/features/step_definitions/simple_steps.rb +1 -0
  4. data/lib/generators/ixtlan/base.rb~ +44 -0
  5. data/lib/generators/ixtlan/base_configuration.rb~ +40 -0
  6. data/lib/generators/ixtlan/configuration_base.rb~ +44 -0
  7. data/lib/generators/ixtlan/configuration_model/configuration_generator.rb~ +40 -0
  8. data/lib/generators/ixtlan/configuration_model/configuration_model_generator.rb~ +10 -0
  9. data/lib/generators/ixtlan/configuration_model/setup_controller.rb~ +5 -0
  10. data/lib/generators/ixtlan/configuration_model/setup_generator.rb~ +15 -0
  11. data/lib/generators/ixtlan/configuration_scaffold/configuration_generator.rb~ +40 -0
  12. data/lib/generators/ixtlan/configuration_scaffold/configuration_model_generator.rb~ +40 -0
  13. data/lib/generators/ixtlan/configuration_scaffold/configuration_scaffold_generator.rb~ +13 -0
  14. data/lib/generators/ixtlan/configuration_scaffold/setup_controller.rb~ +5 -0
  15. data/lib/generators/ixtlan/configuration_scaffold/setup_generator.rb~ +15 -0
  16. data/lib/generators/ixtlan/setup/setup_controller.rb~ +5 -0
  17. data/lib/generators/ixtlan/setup/setup_generator.rb~ +25 -0
  18. data/lib/generators/ixtlan/setup/templates/error.html.erb~ +1 -0
  19. data/lib/generators/ixtlan/setup/templates/error_with_session.html.erb~ +1 -0
  20. data/lib/generators/ixtlan/setup/templates/initializer.rb~ +54 -0
  21. data/lib/generators/model/model_generator.rb~ +12 -0
  22. data/lib/generators/rails/active_record/active_record_generator.rb +42 -34
  23. data/lib/generators/rails/active_record/active_record_generator.rb~ +43 -0
  24. data/lib/generators/rails/active_record/active_record_generatorr.rb~ +51 -0
  25. data/lib/generators/rails/active_record/model/model.rb +32 -1
  26. data/lib/generators/rails/active_record/model/model.rb~ +16 -0
  27. data/lib/generators/rails/erb/erb_generator.rb~ +32 -0
  28. data/lib/generators/rails/erb/scaffold/_form.html.erb~ +25 -0
  29. data/lib/generators/rails/erb/scaffold/index.html.erb~ +47 -0
  30. data/lib/generators/rails/erb_generator.rb~ +32 -0
  31. data/lib/generators/rails/scaffold_controller/scaffold_controller/controller.rb +47 -35
  32. data/lib/generators/rails/scaffold_controller/scaffold_controller/controller.rb~ +148 -0
  33. data/lib/generators/rails/scaffold_controller/scaffold_controller/singleton_controller.rb +43 -7
  34. data/lib/generators/rails/scaffold_controller/scaffold_controller/singleton_controller.rb~ +60 -0
  35. data/lib/generators/scaffold/scaffold_generator.rb~ +31 -0
  36. data/lib/generators/scaffold_controller/scaffold_controller_generator.rb +3 -0
  37. data/lib/generators/scaffold_controller/scaffold_controller_generator.rb-~ +48 -0
  38. data/lib/generators/scaffold_controller/scaffold_controller_generator.rb~ +46 -0
  39. data/lib/ixtlan/railtie.rb~ +81 -0
  40. data/lib/ixtlan-generators.rb~ +3 -0
  41. metadata +43 -10
data/README.md ADDED
@@ -0,0 +1,64 @@
1
+ # Ixtlan #
2
+
3
+ this gem adds more security related headers to the response for a rails3 application. mainly inspired by
4
+ [google-gets-a-1-for-browser-security](http://www.barracudalabs.com/wordpress/index.php/2011/07/21/google-gets-a-1-for-browser-security-3/)
5
+ and
6
+ [HttpCaching](http://code.google.com/p/doctype/wiki/ArticleHttpCaching).
7
+ and
8
+ [Clickjacking](http://www.owasp.org/index.php/Clickjacking)
9
+
10
+ the extra headers are
11
+
12
+ * x-frame headers
13
+ * x-content-type headers
14
+ * x-xss-protection headers
15
+ * caching headers
16
+
17
+ the main idea is to set the default as strict as possible and the application might relax the setup here and there.
18
+
19
+ ## rails configuration ##
20
+
21
+ in _config/application.rb_ or in one of the _config/environments/*rb_ files or in an initializer. all three x-headers can be configured here, for example
22
+
23
+ config.x_content_type_headers = :nosniff
24
+
25
+ ## controller configuration ##
26
+
27
+ just add in your controller something like
28
+
29
+ x_xss_protection :block
30
+
31
+ ## option for each *render*, *send\_file*, *send\_data* methods
32
+
33
+ an example for an inline render
34
+
35
+ render :inline => 'behappy', :x_frame_headers => :deny
36
+
37
+ ## possible values ##
38
+
39
+ * x\_frame\_headers : `:deny, :sameorigin, :off` default `:deny`
40
+
41
+ * x\_content\_type\_headers : `:nosniff, :off` default `:nosniff`
42
+
43
+ * x\_xss\_protection\_headers : `:block, :disabled, :off` default `:block`
44
+
45
+ ## cache headers
46
+
47
+ the cache headers needs to have a **current\_user**, i.e. the current\_user method of the controller needs to return a non-nil value. further the the method needs to `:get` and the response status an "ok" status,
48
+
49
+ then you can use the controller configuration or the options with *render*, *send\_file* and *send\_data*.
50
+
51
+ ## possible values ##
52
+
53
+ * `:private` : which tells not to cache or store any data except the browser memory: [no caching](http://code.google.com/p/doctype/wiki/ArticleHttpCaching#No_caching)
54
+
55
+ * `:protected` : no caching but the browser: [Only the end user's browser is allowed to cache](http://code.google.com/p/doctype/wiki/ArticleHttpCaching#Only_the_end_user%27s_browser_is_allowed_to_cache)
56
+
57
+ * `:public` : caching is allowed: [Both browser and proxy allowed to cache](http://code.google.com/p/doctype/wiki/ArticleHttpCaching#Both_browser_and_proxy_allowed_to_cache)
58
+
59
+ * `:my_headers` : custom header method like
60
+
61
+ > def my_headers
62
+ no_store = false
63
+ no_caching(no_store)
64
+ end
@@ -0,0 +1,6 @@
1
+ Feature: Generators for Ixtlan
2
+
3
+ Scenario: Create a rails application and adding 'ixtlan-generators' gem will provide the ixtlan generators
4
+ Given I create new rails application with template "generators.template"
5
+ And I execute "rails generate"
6
+ Then the output should contain "ixtlan:setup" and "ixtlan:configuration_model" and "ixtlan:configuration_scaffold"
@@ -0,0 +1 @@
1
+ require 'maven/cucumber_steps'
@@ -0,0 +1,44 @@
1
+ require 'rails/generators/named_base'
2
+ module Ixtlan
3
+ module Generators
4
+ class Base < Rails::Generators::Base
5
+
6
+ argument :name, :type => :string, :required => false
7
+
8
+ protected
9
+ def generator_name
10
+ raise "please overwrite generator_name"
11
+ end
12
+
13
+ public
14
+ def create
15
+ args = []
16
+ if name
17
+ args << ARGV.shift
18
+ else
19
+ args << "configuration"
20
+ end
21
+
22
+ if defined? ::Ixtlan::Errors
23
+ args << "errors_dir:string"
24
+ args << "errors_from:string"
25
+ args << "errors_to:string"
26
+ end
27
+
28
+ if defined? ::Ixtlan::Sessions
29
+ args << "idle_session_timeout:integer"
30
+ end
31
+
32
+ if defined? ::Ixtlan::Audit
33
+ args << "audit_keep_log:integer"
34
+ end
35
+
36
+ args << "--singleton"
37
+
38
+ args += ARGV[0, 10000] || []
39
+
40
+ generate generator_name, *args
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,40 @@
1
+ require 'rails/generators/named_base'
2
+ module Ixtlan
3
+ class ConfigurationModelGenerator < Rails::Generators::Base
4
+
5
+ source_root File.expand_path('../../templates', __FILE__)
6
+
7
+ argument :name, :type => :string, :required => false
8
+
9
+ def create
10
+ args = []
11
+ if name
12
+ args << ARGV.shift
13
+ else
14
+ args << "configuration"
15
+ end
16
+
17
+ if defined? Ixtlan::Errors
18
+ args << "errors_dir:string"
19
+ args << "errors_from:string"
20
+ args << "errors_to:string"
21
+ end
22
+
23
+ if defined? Ixtlan::Sessions
24
+ args << "idle_session_timeout:integer"
25
+ end
26
+
27
+ if defined? Ixtlan::Audit
28
+ args << "audit_keep_log:integer"
29
+ end
30
+
31
+ args += ARGV[0, 10000] || []
32
+
33
+ generate "model", *args
34
+
35
+ log "\n"
36
+ log "please make sure '#{args[0]}' becomes a singleton resource"
37
+ log "\n"
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,44 @@
1
+ require 'rails/generators/named_base'
2
+ module Ixtlan
3
+ class ConfigurationBase < Rails::Generators::Base
4
+
5
+ argument :name, :type => :string, :required => false
6
+
7
+ protected
8
+ def generator_name
9
+ raise "please overwrite generator_name"
10
+ end
11
+
12
+ public
13
+ def create
14
+ args = []
15
+ if name
16
+ args << ARGV.shift
17
+ else
18
+ args << "configuration"
19
+ end
20
+
21
+ if defined? ::Ixtlan::Errors
22
+ args << "errors_dir:string"
23
+ args << "errors_from:string"
24
+ args << "errors_to:string"
25
+ end
26
+
27
+ if defined? ::Ixtlan::Sessions
28
+ args << "idle_session_timeout:integer"
29
+ end
30
+
31
+ if defined? ::Ixtlan::Audit
32
+ args << "audit_keep_log:integer"
33
+ end
34
+
35
+ args += ARGV[0, 10000] || []
36
+
37
+ generate generator_name, *args
38
+
39
+ log "\n"
40
+ log "please make sure '#{args[0]}' becomes a singleton resource"
41
+ log "\n"
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,40 @@
1
+ require 'rails/generators/named_base'
2
+ module Ixtlan
3
+ class ConfigurationGenerator < Rails::Generators::Base
4
+
5
+ source_root File.expand_path('../../templates', __FILE__)
6
+
7
+ argument :name, :type => :string, :required => false
8
+
9
+ def create
10
+ args = []
11
+ if name
12
+ args << ARGV.shift
13
+ else
14
+ args << "configuration"
15
+ end
16
+
17
+ if defined? Ixtlan::Errors
18
+ args << "errors_dir:string"
19
+ args << "errors_from:string"
20
+ args << "errors_to:string"
21
+ end
22
+
23
+ if defined? Ixtlan::Sessions
24
+ args << "idle_session_timeout:integer"
25
+ end
26
+
27
+ if defined? Ixtlan::Audit
28
+ args << "audit_keep_log:integer"
29
+ end
30
+
31
+ args += ARGV[0, 10000] || []
32
+
33
+ generate "scaffold", *args
34
+
35
+ log "\n"
36
+ log "please make sure '#{args[0]}' becomes a singleton resource"
37
+ log "\n"
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,10 @@
1
+ require 'generators/ixtlan/configuration_base'
2
+ module Ixtlan
3
+ class ConfigurationModelGenerator < ConfigurationBase
4
+
5
+ protected
6
+ def generator_name
7
+ "model"
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ module Ixtlan
2
+ class SetupGenerator < Rails::Generators::NamedBase
3
+
4
+ end
5
+ end
@@ -0,0 +1,15 @@
1
+ require 'rails/generators/named_base'
2
+ module Ixtlan
3
+ class SetupGenerator < Rails::Generators::NamedBase
4
+
5
+
6
+ def create_preinitializer_file
7
+ template 'preinitializer.rb', File.join('config', "preinitializer.rb")
8
+ end
9
+
10
+ def create_initializer_file
11
+ template 'initializer.rb', File.join('config', "initializers", "ixtlan.rb")
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,40 @@
1
+ require 'rails/generators/named_base'
2
+ module Ixtlan
3
+ class ConfigurationGenerator < Rails::Generators::Base
4
+
5
+ source_root File.expand_path('../../templates', __FILE__)
6
+
7
+ argument :name, :type => :string, :required => false
8
+
9
+ def create
10
+ args = []
11
+ if name
12
+ args << ARGV.shift
13
+ else
14
+ args << "configuration"
15
+ end
16
+
17
+ if defined? Ixtlan::Errors
18
+ args << "errors_dir:string"
19
+ args << "errors_from:string"
20
+ args << "errors_to:string"
21
+ end
22
+
23
+ if defined? Ixtlan::Sessions
24
+ args << "idle_session_timeout:integer"
25
+ end
26
+
27
+ if defined? Ixtlan::Audit
28
+ args << "audit_keep_log:integer"
29
+ end
30
+
31
+ args += ARGV[0, 10000] || []
32
+
33
+ generate "scaffold", *args
34
+
35
+ log "\n"
36
+ log "please make sure '#{args[0]}' becomes a singleton resource"
37
+ log "\n"
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ require 'rails/generators/named_base'
2
+ module Ixtlan
3
+ class ConfigurationModelGenerator < Rails::Generators::Base
4
+
5
+ source_root File.expand_path('../../templates', __FILE__)
6
+
7
+ argument :name, :type => :string, :required => false
8
+
9
+ def create
10
+ args = []
11
+ if name
12
+ args << ARGV.shift
13
+ else
14
+ args << "configuration"
15
+ end
16
+
17
+ if defined? Ixtlan::Errors
18
+ args << "errors_dir:string"
19
+ args << "errors_from:string"
20
+ args << "errors_to:string"
21
+ end
22
+
23
+ if defined? Ixtlan::Sessions
24
+ args << "idle_session_timeout:integer"
25
+ end
26
+
27
+ if defined? Ixtlan::Audit
28
+ args << "audit_keep_log:integer"
29
+ end
30
+
31
+ args += ARGV[0, 10000] || []
32
+
33
+ generate "model", *args
34
+
35
+ log "\n"
36
+ log "please make sure '#{args[0]}' becomes a singleton resource"
37
+ log "\n"
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,13 @@
1
+ require 'generators/ixtlan/configuration_base'
2
+ module Ixtlan
3
+ class ConfigurationModelGenerator < ConfigurationBase
4
+
5
+ protected
6
+ def generator_name
7
+ "scaffold"
8
+ end
9
+
10
+ public
11
+
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ module Ixtlan
2
+ class SetupGenerator < Rails::Generators::NamedBase
3
+
4
+ end
5
+ end
@@ -0,0 +1,15 @@
1
+ require 'rails/generators/named_base'
2
+ module Ixtlan
3
+ class SetupGenerator < Rails::Generators::NamedBase
4
+
5
+
6
+ def create_preinitializer_file
7
+ template 'preinitializer.rb', File.join('config', "preinitializer.rb")
8
+ end
9
+
10
+ def create_initializer_file
11
+ template 'initializer.rb', File.join('config', "initializers", "ixtlan.rb")
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ module Ixtlan
2
+ class SetupGenerator < Rails::Generators::NamedBase
3
+
4
+ end
5
+ end
@@ -0,0 +1,25 @@
1
+ require 'rails/generators/base'
2
+ module Ixtlan
3
+ module Generators
4
+ class SetupGenerator < Rails::Generators::Base
5
+
6
+ def create_preinitializer_files
7
+ template 'preinitializer.rb', File.join('config', "preinitializer.rb")
8
+ template 'gitignore', File.join('config', ".gitignore")
9
+ template 'production.yml.example', File.join('config', "production.yml.example")
10
+ template 'database.yml.example', File.join('config', "database.yml.example")
11
+ end
12
+
13
+ def create_initializer_file
14
+ template 'initializer.rb', File.join('config', "initializers", "ixtlan.rb")
15
+ end
16
+
17
+ def create_application_layout_file
18
+ if defined? Ixtlan::Sessions
19
+ layout = File.join('app', 'views', 'layouts', 'application.html.erb')
20
+ template 'application_layout.html.erb', layout
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1 @@
1
+ <h1><%= @notice %></h1>
@@ -0,0 +1 @@
1
+ <h1><%= @notice %></h1>
@@ -0,0 +1,54 @@
1
+ # dynamic configuration through a Configuration singleton model
2
+
3
+ # configuration model
4
+ # -------------------
5
+ # CONFIGURATION = Configuration
6
+ # config.configuration_model = CONFIGURATION
7
+ <% if defined? DataMapper -%>
8
+ # config_instance = CONFIGURATION.get(1) || CONFIGURATION.new
9
+ <% else -%>
10
+ # config_instance = CONFIGURATION.find(1) || CONFIGURATION.new
11
+ <%end -%>
12
+
13
+ # notification email on errors and dump directory for the system dump
14
+ # -------------------------------------------------------------------
15
+ # config_instance.register("error_dumper") do |config|
16
+ # Rails.configuration.error_dumper.errors_dir = config.errors_dir
17
+ # Rails.configuration.error_dumper.notifications = config.errors_from, config.errors_to
18
+ # end
19
+
20
+ # idle session timeout configuration (in minutes)
21
+ # -----------------------------------------------
22
+ # config_instance.register("idle_session_timeout") do |config|
23
+ # Rails.configuration.idle_session_timeout = config.idle_session_timeout
24
+ # end
25
+
26
+ # audit log manager
27
+ # -----------------
28
+
29
+ # config.audit_manager.model = MyAudit # default: Audit
30
+ # config.audit_manager.username_method = :username # default: :login
31
+
32
+ # config_instance.register("audit_manager") do |config|
33
+ # Rails.configuration.audit_manager.keep_log = config.keep_log # days
34
+ # end
35
+
36
+ # --------------------
37
+ # static configuration
38
+ # --------------------
39
+
40
+ # error dumper
41
+ # ------------
42
+ # notification email on errors and dump directory for the system dump
43
+ # config.error_dumper.errors_dir = Rails.root + "/errors" # default: logs/errors
44
+ # config.error_dumper.notifications = "no-reply@example.com", "developer1@example.com,developer2@example.com" # default: none - i.e. no email notifications
45
+
46
+ # idle session timeout configuration
47
+ # ----------------------------------
48
+ # config.idle_session_timeout = 30 #minutes
49
+
50
+ # audit log manager
51
+ # -----------------
52
+ # config.audit_manager.model = MyAudit # default: Audit
53
+ # config.audit_manager.username_method = :username # default: :login
54
+ # config.audit_manager.keep_log = 30 # days
@@ -0,0 +1,12 @@
1
+ module RRails
2
+ module Generators
3
+ class ModelGenerator < NamedBase #metagenerator
4
+ argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
5
+ hook_for :orm, :required => true
6
+
7
+ if defined? Resty
8
+ hook_for :resty, :type => :boolean, :default => true
9
+ end
10
+ end
11
+ end
12
+ end
@@ -1,40 +1,48 @@
1
- require 'rails/generators/active_record'
2
-
3
- module ActiveRecord
4
- module Generators
5
- class ModelGenerator < Base
6
- include ::Ixtlan::Generators::Singleton
7
-
8
- argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
9
-
10
- check_class_collision
11
-
12
- class_option :migration, :type => :boolean
13
- class_option :timestamps, :type => :boolean
14
- class_option :parent, :type => :string, :desc => "The parent class for the generated model"
15
-
16
- def create_migration_file
17
- return unless options[:migration] && options[:parent].nil?
18
- migration_template "migration.rb", "db/migrate/create_#{table_name}.rb"
19
- end
20
-
21
- def create_model_file
22
- template 'model.rb', File.join('app/models', class_path, "#{file_name}.rb")
23
- end
24
-
25
- def create_module_file
26
- return if class_path.empty?
27
- template 'module.rb', File.join('app/models', "#{class_path.join('/')}.rb") if behavior == :invoke
28
- end
29
-
30
- hook_for :test_framework
31
-
32
- protected
33
-
1
+ # just definde the class if it comes from the rails model generator
2
+ if defined?(Rails::Generators::ModelGenerator) && defined?(ActiveRecord)
3
+ require 'rails/generators/active_record/model/model_generator'
4
+
5
+ module ActiveRecord
6
+ module Generators
7
+ class ModelGenerator < Base
8
+ include ::Ixtlan::Generators::Singleton
9
+
10
+ argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
11
+
12
+ check_class_collision
13
+
14
+ class_option :migration, :type => :boolean
15
+ class_option :timestamps, :type => :boolean
16
+ class_option :modified_by, :type => :boolean, :default => false
17
+ class_option :singleton, :type => :boolean, :default => false
18
+ class_option :parent, :type => :string, :desc => "The parent class for the generated model"
19
+
20
+ def create_migration_file
21
+ return unless options[:migration] && options[:parent].nil?
22
+ migration_template "migration.rb", "db/migrate/create_#{table_name}.rb"
23
+ end
24
+
25
+ def create_model_file
26
+ template 'model.rb', File.join('app/models', class_path, "#{file_name}.rb")
27
+ end
28
+
29
+ def create_module_file
30
+ return if class_path.empty?
31
+ template 'module.rb', File.join('app/models', "#{class_path.join('/')}.rb") if behavior == :invoke
32
+ end
33
+
34
+ hook_for :test_framework
35
+
36
+ protected
37
+
34
38
  def parent_class_name
35
39
  options[:parent] || "ActiveRecord::Base"
36
40
  end
37
-
41
+
42
+ end
38
43
  end
39
44
  end
45
+
46
+ else
47
+ raise LoadError.new "ignore this file #{__FILE__.sub(/.rb$/, '')}"
40
48
  end
@@ -0,0 +1,43 @@
1
+ if defined? ActiveRecord && !defined? Rake
2
+ require 'rails/generators/active_record'
3
+
4
+ module ActiveRecord
5
+ module Generators
6
+ class ModelGenerator < Base
7
+ include ::Ixtlan::Generators::Singleton
8
+
9
+ argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
10
+
11
+ check_class_collision
12
+
13
+ class_option :migration, :type => :boolean
14
+ class_option :timestamps, :type => :boolean
15
+ class_option :parent, :type => :string, :desc => "The parent class for the generated model"
16
+
17
+ def create_migration_file
18
+ return unless options[:migration] && options[:parent].nil?
19
+ migration_template "migration.rb", "db/migrate/create_#{table_name}.rb"
20
+ end
21
+
22
+ def create_model_file
23
+ template 'model.rb', File.join('app/models', class_path, "#{file_name}.rb")
24
+ end
25
+
26
+ def create_module_file
27
+ return if class_path.empty?
28
+ template 'module.rb', File.join('app/models', "#{class_path.join('/')}.rb") if behavior == :invoke
29
+ end
30
+
31
+ hook_for :test_framework
32
+
33
+ protected
34
+
35
+ def parent_class_name
36
+ options[:parent] || "ActiveRecord::Base"
37
+ end
38
+
39
+ end
40
+ end
41
+ end
42
+
43
+ end