conjur-asset-key-pair 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +8 -0
  3. data/.project +18 -0
  4. data/.rvmrc +1 -0
  5. data/Gemfile +16 -0
  6. data/Gemfile.lock +214 -0
  7. data/MIT-LICENSE +20 -0
  8. data/README.rdoc +3 -0
  9. data/Rakefile +27 -0
  10. data/app/controllers/key_pairs_controller.rb +30 -0
  11. data/app/models/key_pair.rb +55 -0
  12. data/config/routes.rb +8 -0
  13. data/conjur-asset-key-pair.gemspec +48 -0
  14. data/db/migrate/20121219081344_slosilo_keystore.rb +1 -0
  15. data/db/migrate/20130206195553_create_random_id_functions.rb +9 -0
  16. data/db/migrate/20130513145031_create_key_pairs.rb +18 -0
  17. data/features/key_pair_create.feature +21 -0
  18. data/features/key_pair_roles.feature +46 -0
  19. data/features/support/env.rb +87 -0
  20. data/features/support/hooks.rb +22 -0
  21. data/lib/conjur-asset-key-pair-version.rb +7 -0
  22. data/lib/conjur-asset-key-pair.rb +5 -0
  23. data/lib/conjur/api/key_pairs.rb +13 -0
  24. data/lib/conjur/asset/key-pair/cucumber/key_pair_steps.rb +24 -0
  25. data/lib/conjur/asset/key-pair/cucumber/steps.rb +1 -0
  26. data/lib/conjur/asset/key-pair/engine.rb +8 -0
  27. data/lib/conjur/command/key_pairs.rb +28 -0
  28. data/lib/conjur/key-pair-api.rb +13 -0
  29. data/lib/conjur/key_pair.rb +15 -0
  30. data/spec/dummy/README.rdoc +261 -0
  31. data/spec/dummy/Rakefile +7 -0
  32. data/spec/dummy/app/controllers/application_controller.rb +2 -0
  33. data/spec/dummy/config.ru +4 -0
  34. data/spec/dummy/config/application.rb +64 -0
  35. data/spec/dummy/config/boot.rb +10 -0
  36. data/spec/dummy/config/database.yml +19 -0
  37. data/spec/dummy/config/environment.rb +5 -0
  38. data/spec/dummy/config/environments/cucumber.rb +40 -0
  39. data/spec/dummy/config/environments/development.rb +37 -0
  40. data/spec/dummy/config/environments/test.rb +38 -0
  41. data/spec/dummy/config/initializers/authenticator.rb +5 -0
  42. data/spec/dummy/config/initializers/conjur.rb +6 -0
  43. data/spec/dummy/config/locales/en.yml +5 -0
  44. data/spec/dummy/config/routes.rb +58 -0
  45. data/spec/dummy/db/schema.rb +24 -0
  46. data/spec/dummy/log/.gitkeep +0 -0
  47. data/spec/dummy/script/rails +6 -0
  48. data/spec/models/key_pair_spec.rb +117 -0
  49. data/spec/spec_helper.rb +54 -0
  50. metadata +273 -0
@@ -0,0 +1 @@
1
+ require 'slosilo/adapters/sequel_adapter/migration'
@@ -0,0 +1,9 @@
1
+ Sequel.migration do
2
+ up do
3
+ create_random_id_functions
4
+ end
5
+
6
+ down do
7
+ drop_random_id_functions
8
+ end
9
+ end
@@ -0,0 +1,18 @@
1
+ Sequel.migration do
2
+ up do
3
+ create_table :key_pairs do
4
+ primary_key :id
5
+ String :userid, null: false
6
+ String :ownerid, null: false
7
+
8
+ String :public_keyid, null: false
9
+ String :private_keyid, null: false
10
+ end
11
+
12
+ random_str_id :key_pairs
13
+ end
14
+
15
+ down do
16
+ drop_table :key_pairs
17
+ end
18
+ end
@@ -0,0 +1,21 @@
1
+ Feature: Creating a key pair
2
+
3
+ Background:
4
+ Given admin user
5
+
6
+ Scenario: I can create a key pair with a group owner
7
+ Given I create a "group"
8
+ When I create a key pair owned by "@group.roleid"
9
+ And I find a "key_pair" resource named "@key_pair.id"
10
+ Then the resource owner is "@group.roleid"
11
+
12
+ Scenario: I can encrypt data
13
+ When I create a key pair
14
+ Then I can encrypt with the key pair
15
+
16
+ Scenario: I can decrypt data
17
+ When I create a key pair
18
+ And I can encrypt with the key pair
19
+ Then I can decrypt with the key pair
20
+ And the decrypted data is round-tripped
21
+
@@ -0,0 +1,46 @@
1
+ Feature: Working with key pair roles
2
+
3
+ Background:
4
+ Given admin user
5
+ And I create a key pair
6
+ And I create a new user
7
+
8
+ Scenario: Random users cannot encrypt data
9
+ And I log in as the new user
10
+ And I anticipate a request failure
11
+ And I encrypt with the key pair
12
+ Then the request fails
13
+
14
+ Scenario: Random users cannot decrypt data
15
+ When I encrypt with the key pair
16
+ And I log in as the new user
17
+ And I anticipate a request failure
18
+ And I decrypt with the key pair
19
+ Then the request fails
20
+
21
+ Scenario: Encrypt role does not grant permission to decrypt
22
+ When I encrypt with the key pair
23
+ And I grant "key_pair" role "encrypt" to "user" "@new_user.username"
24
+ And I log in as the new user
25
+ And I anticipate a request failure
26
+ And I decrypt with the key pair
27
+ Then the request fails
28
+
29
+ Scenario: Decrypt role does not grant permission to encrypt
30
+ And I grant "key_pair" role "decrypt" to "user" "@new_user.username"
31
+ And I log in as the new user
32
+ And I anticipate a request failure
33
+ And I encrypt with the key pair
34
+ Then the request fails
35
+
36
+ Scenario: I can encrypt data when granted the role
37
+ And I grant "key_pair" role "encrypt" to "user" "@new_user.username"
38
+ And I log in as the new user
39
+ Then I can encrypt with the key pair
40
+
41
+ Scenario: I can decrypt data when granted the role
42
+ When I encrypt with the key pair
43
+ And I grant "key_pair" role "decrypt" to "user" "@new_user.username"
44
+ And I log in as the new user
45
+ Then I can decrypt with the key pair
46
+
@@ -0,0 +1,87 @@
1
+ require 'rubygems'
2
+ require 'spork'
3
+
4
+ Spork.prefork do
5
+ # Loading more in this block will cause your tests to run faster. However,
6
+ # if you change any configuration or code from libraries loaded here, you'll
7
+ # need to restart spork for it take effect.
8
+
9
+ # --- Instructions ---
10
+ # - Sort through your spec_helper file. Place as much environment loading
11
+ # code that you don't normally modify during development in the
12
+ # Spork.prefork block.
13
+ # - Place the rest under Spork.each_run block
14
+ # - Any code that is left outside of the blocks will be ran during preforking
15
+ # and during each_run!
16
+ # - These instructions should self-destruct in 10 seconds. If they don't,
17
+ # feel free to delete them.
18
+ #
19
+
20
+ # IMPORTANT: This file is generated by cucumber-rails - edit at your own peril.
21
+ # It is recommended to regenerate this file in the future when you upgrade to a
22
+ # newer version of cucumber-rails. Consider adding your own code to a new file
23
+ # instead of editing this one. Cucumber will automatically load all features/**/*.rb
24
+ # files.
25
+
26
+ ENV["RAILS_ENV"] = "cucumber"
27
+ ENV["CONJUR_ENV"] = "test"
28
+ ENV["RAILS_ROOT"] ||= File.dirname(__FILE__) + "../../../spec/dummy"
29
+
30
+ require File.expand_path("../../../spec/dummy/config/environment", __FILE__)
31
+
32
+ # require 'cucumber/formatter/unicode' # Remove this line if you don't want Cucumber Unicode support
33
+ # require 'cucumber/rails/rspec'
34
+ # require 'cucumber/rails/world'
35
+ # require 'cucumber/rails/active_record'
36
+ # require 'cucumber/web/tableish'
37
+
38
+ require 'cucumber/rails'
39
+ require 'capybara/rails'
40
+ require 'capybara/cucumber'
41
+ require 'capybara/session'
42
+ require 'json_spec/cucumber'
43
+ require 'authable/cucumber/steps'
44
+ require 'conjur/asset/key-pair/cucumber/steps'
45
+
46
+ # Display exception reports in HTTP response
47
+ ActionController::Base.allow_rescue = true
48
+
49
+ # Lets you click links with onclick javascript handlers without using @culerity or @javascript
50
+ # Capybara defaults to XPath selectors rather than Webrat's default of CSS3. In
51
+ # order to ease the transition to Capybara we set the default here. If you'd
52
+ # prefer to use XPath just remove this line and adjust any selectors in your
53
+ # steps to use the XPath syntax.
54
+ Capybara.default_selector = :css
55
+
56
+ Capybara.default_driver = :selenium
57
+
58
+ # If you set this to false, any error raised from within your app will bubble
59
+ # up to your step definition and out to cucumber unless you catch it somewhere
60
+ # on the way. You can make Rails rescue errors and render error pages on a
61
+ # per-scenario basis by tagging a scenario or feature with the @allow-rescue tag.
62
+ #
63
+ # If you set this to true, Rails will rescue all errors and render error
64
+ # pages, more or less in the same way your application would behave in the
65
+ # default production environment. It's not recommended to do this for all
66
+ # of your scenarios, as this makes it hard to discover errors in your application.
67
+ # ActionController::Base.allow_rescue = false
68
+
69
+ # If you set this to true, each scenario will run in a database transaction.
70
+ # You can still turn off transactions on a per-scenario basis, simply tagging
71
+ # a feature or scenario with the @no-txn tag. If you are using Capybara,
72
+ # tagging with @culerity or @javascript will also turn transactions off.
73
+ #
74
+ # If you set this to false, transactions will be off for all scenarios,
75
+ # regardless of whether you use @no-txn or not.
76
+ #
77
+ # Beware that turning transactions off will leave data in your database
78
+ # after each scenario, which can lead to hard-to-debug failures in
79
+ # subsequent scenarios. If you do this, we recommend you create a Before
80
+ # block that will explicitly put your database in a known state.
81
+ # Cucumber::Rails::World.use_transactional_fixtures = true
82
+
83
+ WebMock.allow_net_connect!
84
+ end
85
+
86
+ Spork.each_run do
87
+ end
@@ -0,0 +1,22 @@
1
+ Before do
2
+ ENV['CONJUR_KEY_PAIR_URL'] ||= "http://#{Capybara.current_session.server.host}:#{Capybara.current_session.server.port}"
3
+ end
4
+
5
+ Before do
6
+ unless Slosilo[:"authn:#{ENV['CONJUR_ACCOUNT']}"]
7
+ default_key = <<-KEY
8
+ -----BEGIN PUBLIC KEY-----
9
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvqNru+LycLSew3FTa+To
10
+ QQCVTui+Ccyj8X5vtFhCB1i4KLg2ShGlyt8Yh1dX2Gl2ckugv4JfRSntmRFXCyCw
11
+ stXe5U0p+4/WpzyjZ9t38emlRU3s9e6N2f4U+xSpR1CvemA5hZq11yNMTSKw2FCi
12
+ MSqxzpvXc7uae+6kEMgxoQ7njATCPyeZW6QV920jInuvlWQDdSKZA7QQ0q7HcKSD
13
+ PntKxuUBzioyurgr+HWznK1oCltYJlGMOca9CiQqvtUxAFiz0OppV+21Qeu/1ZwB
14
+ CCxk2aZ3vy7kQ2gDKRsNXEkH4krQsBNoc7U+Tj4F24qx32DfWCiwaIk/M+Vfsx8n
15
+ hwIDAQAB
16
+ -----END PUBLIC KEY-----
17
+ KEY
18
+ key_str = ENV['CONJUR_AUTHN_PRIVATE_KEY'] || default_key
19
+ key = Slosilo::Key.new key_str
20
+ Slosilo[:"authn:#{ENV['CONJUR_ACCOUNT']}"] = key
21
+ end
22
+ end
@@ -0,0 +1,7 @@
1
+ module Conjur
2
+ module Asset
3
+ module KeyPair
4
+ VERSION = "0.2.1"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ require "conjur-asset-key-pair-version"
2
+ require "conjur/api"
3
+ require "conjur/key-pair-api"
4
+
5
+ require "conjur/asset/key-pair/engine" if defined?(Rails) && ENV['CONJUR_ASSET_SERVICE']
@@ -0,0 +1,13 @@
1
+ require 'conjur/key_pair'
2
+
3
+ module Conjur
4
+ class API
5
+ def create_key_pair(options = {})
6
+ standard_create Conjur::KeyPairs::API.host, :key_pair, nil, options
7
+ end
8
+
9
+ def key_pair id
10
+ standard_show Conjur::KeyPairs::API.host, :key_pair, id
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,24 @@
1
+ When /^I create a key pair(?: owned by "(.*?)")?$/ do |owner|
2
+ options = {}
3
+ if owner
4
+ options[:ownerid] = interpret_value(owner)
5
+ end
6
+ create_variable :key_pair, options
7
+ end
8
+
9
+ When /^I(?: can)? decrypt with the key pair$/ do
10
+ attempt do
11
+ @plaintext_output = variable(:key_pair).decrypt @encrypted_data
12
+ end
13
+ end
14
+
15
+ When /^I(?: can)? encrypt with the key pair$/ do
16
+ attempt do
17
+ @plaintext_input = SecureRandom.uuid
18
+ @encrypted_data = variable(:key_pair).encrypt(@plaintext_input)
19
+ end
20
+ end
21
+
22
+ Then /^the decrypted data is round-tripped$/ do
23
+ @plaintext_input.should == @plaintext_output
24
+ end
@@ -0,0 +1 @@
1
+ require 'conjur/asset/key-pair/cucumber/key_pair_steps.rb'
@@ -0,0 +1,8 @@
1
+ module Conjur
2
+ module Asset
3
+ module KeyPair
4
+ class Engine < ::Rails::Engine
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,28 @@
1
+ require 'conjur/authn'
2
+ require 'conjur/command'
3
+
4
+ class Conjur::Command::KeyPairs < Conjur::Command
5
+ self.prefix = :"key-pair"
6
+
7
+ desc "Encrypt with a key pair"
8
+ arg_name "key-pair (value | STDIN)"
9
+ command :"encrypt" do |c|
10
+ c.action do |global_options, options, args|
11
+ id = require_arg(args, 'key-pair')
12
+ value = args.shift || STDIN.read
13
+
14
+ $stdout.write api.key_pair(id).encrypt value
15
+ end
16
+ end
17
+
18
+ desc "Decrypt with a key pair"
19
+ arg_name "key-pair (value | STDIN)"
20
+ command :"decrypt" do |c|
21
+ c.action do |global_options, options, args|
22
+ id = require_arg(args, 'key-pair')
23
+ value = args.shift || STDIN.read
24
+
25
+ $stdout.write api.key_pair(id).decrypt value
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,13 @@
1
+ module Conjur
2
+ module KeyPairs
3
+ class API < Conjur::API
4
+ class << self
5
+ def host
6
+ ENV['CONJUR_KEY_PAIR_URL'] || Conjur::Core::API.host
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
12
+
13
+ require 'conjur/api/key_pairs'
@@ -0,0 +1,15 @@
1
+ module Conjur
2
+ class KeyPair < RestClient::Resource
3
+ include ActsAsAsset
4
+
5
+ def encrypt(data)
6
+ raise ArgumentError.new("data must not be nil") unless data
7
+ self["encrypt"].post(data, content_type: 'application/octet-stream').body
8
+ end
9
+
10
+ def decrypt(data)
11
+ raise ArgumentError.new("data must not be nil") unless data
12
+ self["decrypt"].post(data, content_type: 'application/octet-stream').body
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,261 @@
1
+ == Welcome to Rails
2
+
3
+ Rails is a web-application framework that includes everything needed to create
4
+ database-backed web applications according to the Model-View-Control pattern.
5
+
6
+ This pattern splits the view (also called the presentation) into "dumb"
7
+ templates that are primarily responsible for inserting pre-built data in between
8
+ HTML tags. The model contains the "smart" domain objects (such as Account,
9
+ Product, Person, Post) that holds all the business logic and knows how to
10
+ persist themselves to a database. The controller handles the incoming requests
11
+ (such as Save New Account, Update Product, Show Post) by manipulating the model
12
+ and directing data to the view.
13
+
14
+ In Rails, the model is handled by what's called an object-relational mapping
15
+ layer entitled Active Record. This layer allows you to present the data from
16
+ database rows as objects and embellish these data objects with business logic
17
+ methods. You can read more about Active Record in
18
+ link:files/vendor/rails/activerecord/README.html.
19
+
20
+ The controller and view are handled by the Action Pack, which handles both
21
+ layers by its two parts: Action View and Action Controller. These two layers
22
+ are bundled in a single package due to their heavy interdependence. This is
23
+ unlike the relationship between the Active Record and Action Pack that is much
24
+ more separate. Each of these packages can be used independently outside of
25
+ Rails. You can read more about Action Pack in
26
+ link:files/vendor/rails/actionpack/README.html.
27
+
28
+
29
+ == Getting Started
30
+
31
+ 1. At the command prompt, create a new Rails application:
32
+ <tt>rails new myapp</tt> (where <tt>myapp</tt> is the application name)
33
+
34
+ 2. Change directory to <tt>myapp</tt> and start the web server:
35
+ <tt>cd myapp; rails server</tt> (run with --help for options)
36
+
37
+ 3. Go to http://localhost:3000/ and you'll see:
38
+ "Welcome aboard: You're riding Ruby on Rails!"
39
+
40
+ 4. Follow the guidelines to start developing your application. You can find
41
+ the following resources handy:
42
+
43
+ * The Getting Started Guide: http://guides.rubyonrails.org/getting_started.html
44
+ * Ruby on Rails Tutorial Book: http://www.railstutorial.org/
45
+
46
+
47
+ == Debugging Rails
48
+
49
+ Sometimes your application goes wrong. Fortunately there are a lot of tools that
50
+ will help you debug it and get it back on the rails.
51
+
52
+ First area to check is the application log files. Have "tail -f" commands
53
+ running on the server.log and development.log. Rails will automatically display
54
+ debugging and runtime information to these files. Debugging info will also be
55
+ shown in the browser on requests from 127.0.0.1.
56
+
57
+ You can also log your own messages directly into the log file from your code
58
+ using the Ruby logger class from inside your controllers. Example:
59
+
60
+ class WeblogController < ActionController::Base
61
+ def destroy
62
+ @weblog = Weblog.find(params[:id])
63
+ @weblog.destroy
64
+ logger.info("#{Time.now} Destroyed Weblog ID ##{@weblog.id}!")
65
+ end
66
+ end
67
+
68
+ The result will be a message in your log file along the lines of:
69
+
70
+ Mon Oct 08 14:22:29 +1000 2007 Destroyed Weblog ID #1!
71
+
72
+ More information on how to use the logger is at http://www.ruby-doc.org/core/
73
+
74
+ Also, Ruby documentation can be found at http://www.ruby-lang.org/. There are
75
+ several books available online as well:
76
+
77
+ * Programming Ruby: http://www.ruby-doc.org/docs/ProgrammingRuby/ (Pickaxe)
78
+ * Learn to Program: http://pine.fm/LearnToProgram/ (a beginners guide)
79
+
80
+ These two books will bring you up to speed on the Ruby language and also on
81
+ programming in general.
82
+
83
+
84
+ == Debugger
85
+
86
+ Debugger support is available through the debugger command when you start your
87
+ Mongrel or WEBrick server with --debugger. This means that you can break out of
88
+ execution at any point in the code, investigate and change the model, and then,
89
+ resume execution! You need to install ruby-debug to run the server in debugging
90
+ mode. With gems, use <tt>sudo gem install ruby-debug</tt>. Example:
91
+
92
+ class WeblogController < ActionController::Base
93
+ def index
94
+ @posts = Post.all
95
+ debugger
96
+ end
97
+ end
98
+
99
+ So the controller will accept the action, run the first line, then present you
100
+ with a IRB prompt in the server window. Here you can do things like:
101
+
102
+ >> @posts.inspect
103
+ => "[#<Post:0x14a6be8
104
+ @attributes={"title"=>nil, "body"=>nil, "id"=>"1"}>,
105
+ #<Post:0x14a6620
106
+ @attributes={"title"=>"Rails", "body"=>"Only ten..", "id"=>"2"}>]"
107
+ >> @posts.first.title = "hello from a debugger"
108
+ => "hello from a debugger"
109
+
110
+ ...and even better, you can examine how your runtime objects actually work:
111
+
112
+ >> f = @posts.first
113
+ => #<Post:0x13630c4 @attributes={"title"=>nil, "body"=>nil, "id"=>"1"}>
114
+ >> f.
115
+ Display all 152 possibilities? (y or n)
116
+
117
+ Finally, when you're ready to resume execution, you can enter "cont".
118
+
119
+
120
+ == Console
121
+
122
+ The console is a Ruby shell, which allows you to interact with your
123
+ application's domain model. Here you'll have all parts of the application
124
+ configured, just like it is when the application is running. You can inspect
125
+ domain models, change values, and save to the database. Starting the script
126
+ without arguments will launch it in the development environment.
127
+
128
+ To start the console, run <tt>rails console</tt> from the application
129
+ directory.
130
+
131
+ Options:
132
+
133
+ * Passing the <tt>-s, --sandbox</tt> argument will rollback any modifications
134
+ made to the database.
135
+ * Passing an environment name as an argument will load the corresponding
136
+ environment. Example: <tt>rails console production</tt>.
137
+
138
+ To reload your controllers and models after launching the console run
139
+ <tt>reload!</tt>
140
+
141
+ More information about irb can be found at:
142
+ link:http://www.rubycentral.org/pickaxe/irb.html
143
+
144
+
145
+ == dbconsole
146
+
147
+ You can go to the command line of your database directly through <tt>rails
148
+ dbconsole</tt>. You would be connected to the database with the credentials
149
+ defined in database.yml. Starting the script without arguments will connect you
150
+ to the development database. Passing an argument will connect you to a different
151
+ database, like <tt>rails dbconsole production</tt>. Currently works for MySQL,
152
+ PostgreSQL and SQLite 3.
153
+
154
+ == Description of Contents
155
+
156
+ The default directory structure of a generated Ruby on Rails application:
157
+
158
+ |-- app
159
+ | |-- assets
160
+ | |-- images
161
+ | |-- javascripts
162
+ | `-- stylesheets
163
+ | |-- controllers
164
+ | |-- helpers
165
+ | |-- mailers
166
+ | |-- models
167
+ | `-- views
168
+ | `-- layouts
169
+ |-- config
170
+ | |-- environments
171
+ | |-- initializers
172
+ | `-- locales
173
+ |-- db
174
+ |-- doc
175
+ |-- lib
176
+ | `-- tasks
177
+ |-- log
178
+ |-- public
179
+ |-- script
180
+ |-- test
181
+ | |-- fixtures
182
+ | |-- functional
183
+ | |-- integration
184
+ | |-- performance
185
+ | `-- unit
186
+ |-- tmp
187
+ | |-- cache
188
+ | |-- pids
189
+ | |-- sessions
190
+ | `-- sockets
191
+ `-- vendor
192
+ |-- assets
193
+ `-- stylesheets
194
+ `-- plugins
195
+
196
+ app
197
+ Holds all the code that's specific to this particular application.
198
+
199
+ app/assets
200
+ Contains subdirectories for images, stylesheets, and JavaScript files.
201
+
202
+ app/controllers
203
+ Holds controllers that should be named like weblogs_controller.rb for
204
+ automated URL mapping. All controllers should descend from
205
+ ApplicationController which itself descends from ActionController::Base.
206
+
207
+ app/models
208
+ Holds models that should be named like post.rb. Models descend from
209
+ ActiveRecord::Base by default.
210
+
211
+ app/views
212
+ Holds the template files for the view that should be named like
213
+ weblogs/index.html.erb for the WeblogsController#index action. All views use
214
+ eRuby syntax by default.
215
+
216
+ app/views/layouts
217
+ Holds the template files for layouts to be used with views. This models the
218
+ common header/footer method of wrapping views. In your views, define a layout
219
+ using the <tt>layout :default</tt> and create a file named default.html.erb.
220
+ Inside default.html.erb, call <% yield %> to render the view using this
221
+ layout.
222
+
223
+ app/helpers
224
+ Holds view helpers that should be named like weblogs_helper.rb. These are
225
+ generated for you automatically when using generators for controllers.
226
+ Helpers can be used to wrap functionality for your views into methods.
227
+
228
+ config
229
+ Configuration files for the Rails environment, the routing map, the database,
230
+ and other dependencies.
231
+
232
+ db
233
+ Contains the database schema in schema.rb. db/migrate contains all the
234
+ sequence of Migrations for your schema.
235
+
236
+ doc
237
+ This directory is where your application documentation will be stored when
238
+ generated using <tt>rake doc:app</tt>
239
+
240
+ lib
241
+ Application specific libraries. Basically, any kind of custom code that
242
+ doesn't belong under controllers, models, or helpers. This directory is in
243
+ the load path.
244
+
245
+ public
246
+ The directory available for the web server. Also contains the dispatchers and the
247
+ default HTML files. This should be set as the DOCUMENT_ROOT of your web
248
+ server.
249
+
250
+ script
251
+ Helper scripts for automation and generation.
252
+
253
+ test
254
+ Unit and functional tests along with fixtures. When using the rails generate
255
+ command, template test files will be generated for you and placed in this
256
+ directory.
257
+
258
+ vendor
259
+ External libraries that the application depends on. Also includes the plugins
260
+ subdirectory. If the app has frozen rails, those gems also go here, under
261
+ vendor/rails/. This directory is in the load path.