tiny_captcha 0.0.1 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/app/controllers/tiny_captcha/application_controller.rb +1 -0
  3. data/app/controllers/tiny_captcha/images_controller.rb +21 -0
  4. data/app/helpers/tiny_captcha/application_helper.rb +1 -0
  5. data/config/locales/en/tiny_captcha.en.yml +9 -0
  6. data/config/locales/zh-CN/tiny_captcha.zh-CN.yml +8 -0
  7. data/config/routes.rb +4 -0
  8. data/lib/generators/USAGE +4 -0
  9. data/lib/generators/templates/migration.rb +16 -0
  10. data/lib/generators/templates/partial.erb +37 -0
  11. data/lib/generators/tiny_captcha_generator.rb +22 -0
  12. data/lib/tiny_captcha.rb +64 -1
  13. data/lib/tiny_captcha/active_record.rb +93 -0
  14. data/lib/tiny_captcha/controller.rb +58 -0
  15. data/lib/tiny_captcha/engine.rb +28 -1
  16. data/lib/tiny_captcha/form_builder.rb +43 -0
  17. data/lib/tiny_captcha/formtastic.rb +12 -0
  18. data/lib/tiny_captcha/image.rb +85 -0
  19. data/lib/tiny_captcha/middleware.rb +70 -0
  20. data/lib/tiny_captcha/tiny_captcha_data.rb +36 -0
  21. data/lib/tiny_captcha/tiny_captcha_data_mongoid.rb +26 -0
  22. data/lib/tiny_captcha/utils.rb +80 -0
  23. data/lib/tiny_captcha/version.rb +2 -1
  24. data/lib/tiny_captcha/view.rb +99 -0
  25. data/test/dummy/app/controllers/application_controller.rb +1 -0
  26. data/test/dummy/app/helpers/application_helper.rb +1 -0
  27. data/test/dummy/config/application.rb +1 -0
  28. data/test/dummy/config/boot.rb +1 -0
  29. data/test/dummy/config/environment.rb +1 -0
  30. data/test/dummy/config/environments/development.rb +1 -0
  31. data/test/dummy/config/environments/production.rb +1 -0
  32. data/test/dummy/config/environments/test.rb +1 -0
  33. data/test/dummy/config/initializers/backtrace_silencers.rb +1 -0
  34. data/test/dummy/config/initializers/filter_parameter_logging.rb +1 -0
  35. data/test/dummy/config/initializers/inflections.rb +1 -0
  36. data/test/dummy/config/initializers/mime_types.rb +1 -0
  37. data/test/dummy/config/initializers/secret_token.rb +1 -0
  38. data/test/dummy/config/initializers/session_store.rb +1 -0
  39. data/test/dummy/config/initializers/wrap_parameters.rb +1 -0
  40. data/test/dummy/config/routes.rb +1 -0
  41. data/test/integration/navigation_test.rb +1 -0
  42. data/test/test_helper.rb +1 -0
  43. data/test/tiny_captcha_test.rb +1 -0
  44. metadata +85 -82
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a7470acbf45a2f9152ed8f19180067c67714090e
4
+ data.tar.gz: 6a9fb11adfc2d802b7a2579be6d279d48e83ec6b
5
+ SHA512:
6
+ metadata.gz: e4590af09ba5857c23fe31f597afeef564b461f90dcacfd3f93fa24f62acbaf99f08f1a28878f7760f8eb60b55e15b903885dfd84cb08805f5ecac018c376a7e
7
+ data.tar.gz: e88bfba0336b263b24f8f3b041b258e16e11e2897cfd334a23bca7565f7bd9e144b86aa1542a7cf91f42e873e08f5fef3759be525f3cf0ae157239f185f8b466
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  module TinyCaptcha
2
3
  class ApplicationController < ActionController::Base
3
4
  end
@@ -0,0 +1,21 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module TinyCaptcha
3
+ class ImagesController < ::ActionController::Base
4
+ #
5
+ # params:
6
+ # - object
7
+ #
8
+ def new
9
+ @tiny_captcha_options = generate_tiny_captcha_options(:object => params[:object])
10
+
11
+ respond_to do |format|
12
+ format.json {
13
+ render :json => {
14
+ :tiny_captcha_options => @tiny_captcha_options
15
+ }
16
+ }
17
+ end
18
+ end
19
+ end
20
+ end
21
+
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  module TinyCaptcha
2
3
  module ApplicationHelper
3
4
  end
@@ -0,0 +1,9 @@
1
+ en:
2
+ tiny_captcha:
3
+ label: 'Please input captcha'
4
+ placeholder: 'Captcha'
5
+ retry: 'Change'
6
+ message:
7
+ default: "Secret Code did not match with the Image"
8
+ user: "The secret Image and code were different"
9
+
@@ -0,0 +1,8 @@
1
+ zh-CN:
2
+ tiny_captcha:
3
+ label: '请输验证码'
4
+ placeholder: '请输验证码'
5
+ retry: '看不清? 重新获取'
6
+ message:
7
+ default: "不正确"
8
+
@@ -1,2 +1,6 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  TinyCaptcha::Engine.routes.draw do
3
+ namespace :tiny_captcha do
4
+ resources :images, :only => [:new]
5
+ end
2
6
  end
@@ -0,0 +1,4 @@
1
+ TinyCaptcha
2
+ =============
3
+ # Generate migration and copy view partial
4
+ rails generate tiny_captcha
@@ -0,0 +1,16 @@
1
+ # -*- encoding : utf-8 -*-
2
+ class CreateTinyCaptchaData < ActiveRecord::Migration
3
+ def self.up
4
+ create_table :tiny_captcha_data do |t|
5
+ t.string :key, :limit => 40
6
+ t.string :value, :limit => 6
7
+ t.timestamps
8
+ end
9
+
10
+ add_index :tiny_captcha_data, :key
11
+ end
12
+
13
+ def self.down
14
+ drop_table :tiny_captcha_data
15
+ end
16
+ end
@@ -0,0 +1,37 @@
1
+ <style type="text/CSS">
2
+ .tiny_captcha{border: 1px solid #ccc; padding: 5px !important;}
3
+ .tiny_captcha,
4
+ .tiny_captcha div{display: table;}
5
+ .tiny_captcha .tiny_captcha_field,
6
+ .tiny_captcha .tiny_captcha_image{
7
+ border: 1px solid #ccc;
8
+ margin: 0px 0px 2px 0px !important;
9
+ padding: 0px !important;
10
+ }
11
+ .tiny_captcha .tiny_captcha_image img{
12
+ margin: 0px !important;
13
+ padding: 0px !important;
14
+ width: 110px !important;
15
+ }
16
+ .tiny_captcha .tiny_captcha_label{font-size: 12px;}
17
+ .tiny_captcha .tiny_captcha_field input{
18
+ width: 150px !important;
19
+ font-size: 16px;
20
+ border: none;
21
+ background-color: #efefef;
22
+ }
23
+ </style>
24
+
25
+ <div class='tiny_captcha'>
26
+ <div class='tiny_captcha_image'>
27
+ <%%= tiny_captcha_options[:image] %>
28
+ </div>
29
+
30
+ <div class='tiny_captcha_field'>
31
+ <%%= tiny_captcha_options[:field] %>
32
+ </div>
33
+
34
+ <div class='tiny_captcha_label'>
35
+ <%%= tiny_captcha_options[:label] %>
36
+ </div>
37
+ </div>
@@ -0,0 +1,22 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'rails/generators'
3
+
4
+ class TinyCaptchaGenerator < Rails::Generators::Base
5
+ include Rails::Generators::Migration
6
+
7
+ def self.source_root
8
+ @source_root ||= File.expand_path(File.join(File.dirname(__FILE__), 'templates/'))
9
+ end
10
+
11
+ def self.next_migration_number(dirname)
12
+ Time.now.strftime("%Y%m%d%H%M%S")
13
+ end
14
+
15
+ def create_partial
16
+ template "partial.erb", File.join('app/views', 'tiny_captcha', "_tiny_captcha.erb")
17
+ end
18
+
19
+ def create_migration
20
+ migration_template "migration.rb", File.join('db/migrate', "create_tiny_captcha_data.rb")
21
+ end
22
+ end
@@ -1,4 +1,67 @@
1
- require "tiny_captcha/engine"
1
+ # -*- encoding : utf-8 -*-
2
2
 
3
3
  module TinyCaptcha
4
+ autoload :Utils, 'tiny_captcha/utils'
5
+
6
+ autoload :ImageHelpers, 'tiny_captcha/image'
7
+ autoload :ViewHelper, 'tiny_captcha/view'
8
+ autoload :ControllerHelpers, 'tiny_captcha/controller'
9
+
10
+ autoload :FormBuilder, 'tiny_captcha/form_builder'
11
+ autoload :CustomFormBuilder, 'tiny_captcha/formtastic'
12
+
13
+ if defined?(ActiveRecord)
14
+ autoload :ModelHelpers, 'tiny_captcha/active_record'
15
+ autoload :TinyCaptchaData, 'tiny_captcha/tiny_captcha_data'
16
+ else
17
+ autoload :TinyCaptchaData, 'tiny_captcha/tiny_captcha_data_mongoid.rb'
18
+ end
19
+
20
+
21
+ autoload :Middleware, 'tiny_captcha/middleware'
22
+
23
+ mattr_accessor :image_size
24
+ @@image_size = "100x28"
25
+
26
+ mattr_accessor :length
27
+ @@length = 6
28
+
29
+ # 'embosed_silver',
30
+ # 'simply_red',
31
+ # 'simply_green',
32
+ # 'simply_blue',
33
+ # 'distorted_black',
34
+ # 'all_black',
35
+ # 'charcoal_grey',
36
+ # 'almost_invisible'
37
+ # 'random'
38
+ mattr_accessor :image_style
39
+ @@image_style = 'simply_blue'
40
+
41
+ # 'low', 'medium', 'high', 'random'
42
+ mattr_accessor :distortion
43
+ @@distortion = 'low'
44
+
45
+ # command path
46
+ mattr_accessor :image_magick_path
47
+ @@image_magick_path = ''
48
+
49
+ # tmp directory
50
+ mattr_accessor :tmp_path
51
+ @@tmp_path = nil
52
+
53
+ mattr_accessor :image_show_path
54
+ @@image_show_path = '/tiny_captcha/images/show'
55
+
56
+ def self.add_image_style(name, params = [])
57
+ ::TinyCaptcha::ImageHelpers.image_styles.update(name.to_s => params)
58
+ end
59
+
60
+ def self.setup
61
+ yield self
62
+ end
4
63
  end
64
+
65
+ I18n.load_path += Dir[Pathname.new(__FILE__).join('..', '..', 'config', 'locales', '**', '*.{rb,yml}').to_s]
66
+
67
+ require 'tiny_captcha/engine' if defined?(Rails)
@@ -0,0 +1,93 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module TinyCaptcha #:nodoc
3
+ module ModelHelpers #:nodoc
4
+ def self.included(base)
5
+ base.extend(SingletonMethods)
6
+ end
7
+
8
+ # To implement model based simple captcha use this method in the model as...
9
+ #
10
+ # class User < ActiveRecord::Base
11
+ #
12
+ # apply_tiny_captcha :message => "my customized message"
13
+ #
14
+ # end
15
+ #
16
+ # Customize the error message by using :message, the default message is "Captcha did not match".
17
+ # As in the applications captcha is needed with a very few cases like signing up the new user, but
18
+ # not every time you need to authenticate the captcha with @user.save. So as to maintain simplicity
19
+ # here we have the explicit method to save the instace with captcha validation as...
20
+ #
21
+ # * to validate the instance
22
+ #
23
+ # @user.valid_with_captcha? # whene captcha validation is required.
24
+ #
25
+ # @user.valid? # when captcha validation is not required.
26
+ #
27
+ # * to save the instance
28
+ #
29
+ # @user.save_with_captcha # whene captcha validation is required.
30
+ #
31
+ # @user.save # when captcha validation is not required.
32
+ module SingletonMethods
33
+ def apply_tiny_captcha(options = {})
34
+ options = { :add_to_base => false }.merge(options)
35
+
36
+ class_attribute :tiny_captcha_options
37
+ self.tiny_captcha_options = options
38
+
39
+ unless self.is_a?(ClassMethods)
40
+ include InstanceMethods
41
+ extend ClassMethods
42
+
43
+ attr_accessor :captcha, :captcha_key
44
+ end
45
+ end
46
+ end
47
+
48
+ module ClassMethods
49
+ end
50
+
51
+ module InstanceMethods
52
+
53
+ def valid_with_captcha?
54
+ [valid?, is_captcha_valid?].all?
55
+ end
56
+
57
+ def tiny_captcha_valid?
58
+ self.errors[:captcha].empty?
59
+ end
60
+
61
+ def is_captcha_valid?
62
+ return true if Rails.env.test?
63
+
64
+ if captcha && captcha.upcase.delete(" ") == ::TinyCaptcha::Utils::tiny_captcha_value(captcha_key)
65
+ ::TinyCaptcha::Utils::tiny_captcha_passed!(captcha_key)
66
+ return true
67
+ else
68
+ message = tiny_captcha_options[:message] || I18n.t(
69
+ self.class.model_name.to_s.downcase, :scope => [:tiny_captcha, :message], :default => :default
70
+ )
71
+
72
+ # tiny_captcha_options[:add_to_base] ? errors.add(:base, message) : errors.add(:captcha, message)
73
+ errors.add(:captcha, message)
74
+ return false
75
+ end
76
+ end
77
+
78
+ def update_attributes_with_captcha *args
79
+ valid_with_captcha? && update_attributes(*args)
80
+ end
81
+
82
+ def save_with_captcha
83
+ # valid_with_captcha? && save(:validate => false)
84
+ valid_with_captcha? && self.save
85
+ end
86
+
87
+ def save_with_captcha!
88
+ valid_with_captcha? && self.save!
89
+ end
90
+
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,58 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module TinyCaptcha #:nodoc
3
+ module ControllerHelpers #:nodoc
4
+ def self.included base
5
+ base.class_eval do
6
+ include InstanceMethods
7
+ helper_method :generate_tiny_captcha_options
8
+ end
9
+ end
10
+
11
+ module InstanceMethods
12
+ # This method is to validate the simple captcha in controller.
13
+ # It means when the captcha is controller based i.e. :object has not been passed to the method show_tiny_captcha.
14
+ #
15
+ # *Example*
16
+ #
17
+ # If you want to save an object say @user only if the captcha is validated then do like this in action...
18
+ #
19
+ # if tiny_captcha_valid?
20
+ # @user.save
21
+ # else
22
+ # flash[:notice] = "captcha did not match"
23
+ # redirect_to :action => "myaction"
24
+ # end
25
+ def tiny_captcha_valid?
26
+ return true if Rails.env.test?
27
+
28
+ if params[:captcha]
29
+ data = TinyCaptcha::Utils::tiny_captcha_value(params[:captcha_key] || session[:captcha])
30
+ result = data == params[:captcha].delete(" ").upcase
31
+ TinyCaptcha::Utils::tiny_captcha_passed!(session[:captcha]) if result
32
+ return result
33
+ else
34
+ return false
35
+ end
36
+ end
37
+
38
+ # 生成验证的信息
39
+ # options:
40
+ # - object
41
+ def generate_tiny_captcha_options *args
42
+ options = args.extract_options!
43
+
44
+ key = TinyCaptcha::Utils.generate_key_use_session(
45
+ session, options[:object]
46
+ )
47
+
48
+ {
49
+ :image_url => ::TinyCaptcha::Utils.generate_image_url(key, request.base_url, options),
50
+ :label => options[:label] || I18n.t('tiny_captcha.label'),
51
+ :captcha_key => ::TinyCaptcha::Utils.set_tiny_captcha_data(key, options),
52
+ :object => options[:object]
53
+ }
54
+
55
+ end
56
+ end
57
+ end
58
+ end
@@ -1,5 +1,32 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'rails'
3
+ require 'tiny_captcha'
4
+
1
5
  module TinyCaptcha
2
6
  class Engine < ::Rails::Engine
3
- isolate_namespace TinyCaptcha
7
+ config.before_initialize do
8
+ ActiveSupport.on_load :active_record do
9
+ ActiveRecord::Base.send(:include, TinyCaptcha::ModelHelpers)
10
+ end
11
+ end
12
+
13
+ config.after_initialize do
14
+ ActionView::Base.send(:include, TinyCaptcha::ViewHelper)
15
+ ActionView::Helpers::FormBuilder.send(:include, TinyCaptcha::FormBuilder)
16
+
17
+ ActionController::Base.send :include, ::TinyCaptcha::ControllerHelpers
18
+
19
+ if Object.const_defined?("Formtastic")
20
+ if Formtastic.const_defined?("Helpers")
21
+ Formtastic::Helpers::FormHelper.builder = TinyCaptcha::CustomFormBuilder
22
+ else
23
+ Formtastic::SemanticFormHelper.builder = TinyCaptcha::CustomFormBuilder
24
+ end
25
+ end
26
+ end
27
+
28
+ config.app_middleware.use TinyCaptcha::Middleware
4
29
  end
5
30
  end
31
+
32
+
@@ -0,0 +1,43 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module TinyCaptcha
3
+ module FormBuilder
4
+ def self.included(base)
5
+ base.send(:include, TinyCaptcha::ViewHelper)
6
+ base.send(:include, TinyCaptcha::FormBuilder::ClassMethods)
7
+ base.send(:include, ActionView::Helpers)
8
+ # base.send(:include, Sprockets::Helpers::RailsHelper)
9
+ # base.send(:include, Sprockets::Helpers::IsolatedHelper)
10
+
11
+ base.delegate :render, :session, :to => :template
12
+ end
13
+
14
+ module ClassMethods
15
+ # Example:
16
+ # <% form_for :post, :url => posts_path do |form| %>
17
+ # ...
18
+ # <%= form.tiny_captcha :label => "Enter numbers.." %>
19
+ # <% end %>
20
+ #
21
+ def tiny_captcha(options = {})
22
+ options.update :object => @object_name
23
+ show_tiny_captcha(objectify_options(options))
24
+ end
25
+
26
+ private
27
+
28
+ def template
29
+ @template
30
+ end
31
+
32
+ def tiny_captcha_field(options={})
33
+ html = {:autocomplete => 'off', :required => 'required', :value => ''}
34
+ html.merge!(options[:input_html] || {})
35
+ html[:placeholder] = options[:placeholder] || I18n.t('tiny_captcha.placeholder')
36
+
37
+ text_field(:captcha, html) + hidden_field(:captcha_key, {
38
+ :value => options[:captcha_key], :class => 'captcha-key'
39
+ })
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,12 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module TinyCaptcha
3
+ class CustomFormBuilder < Formtastic::FormBuilder
4
+
5
+ private
6
+
7
+ def tiny_captcha_input(method, options)
8
+ options.update :object => sanitized_object_name
9
+ self.send(:show_tiny_captcha, options)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,85 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'tempfile'
3
+ module TinyCaptcha #:nodoc
4
+ module ImageHelpers #:nodoc
5
+
6
+ mattr_accessor :image_styles
7
+ @@image_styles = {
8
+ 'embosed_silver' => ['-fill darkblue', '-shade 20x60', '-background white'],
9
+ 'simply_red' => ['-fill darkred', '-background white'],
10
+ 'simply_green' => ['-fill darkgreen', '-background white'],
11
+ 'simply_blue' => ['-fill darkblue', '-background white'],
12
+ 'distorted_black' => ['-fill darkblue', '-edge 10', '-background white'],
13
+ 'all_black' => ['-fill darkblue', '-edge 2', '-background white'],
14
+ 'charcoal_grey' => ['-fill darkblue', '-charcoal 5', '-background white'],
15
+ 'almost_invisible' => ['-fill red', '-solarize 50', '-background white']
16
+ }
17
+
18
+ DISTORTIONS = ['low', 'medium', 'high']
19
+
20
+ class << self
21
+
22
+ def image_params(key = 'simply_blue')
23
+ image_keys = @@image_styles.keys
24
+
25
+ style = begin
26
+ if key == 'random'
27
+ image_keys[rand(image_keys.length)]
28
+ else
29
+ image_keys.include?(key) ? key : 'simply_blue'
30
+ end
31
+ end
32
+
33
+ @@image_styles[style]
34
+ end
35
+
36
+ def distortion(key='low')
37
+ key =
38
+ key == 'random' ?
39
+ DISTORTIONS[rand(DISTORTIONS.length)] :
40
+ DISTORTIONS.include?(key) ? key : 'low'
41
+ case key.to_s
42
+ when 'low' then return [2 + rand(2), 80 + rand(20)]
43
+ when 'medium' then return [4 + rand(2), 50 + rand(20)]
44
+ when 'high' then return [6 + rand(2), 30 + rand(20)]
45
+ end
46
+ end
47
+ end
48
+
49
+ if RUBY_VERSION < '1.9'
50
+ class Tempfile < ::Tempfile
51
+ # Replaces Tempfile's +make_tmpname+ with one that honors file extensions.
52
+ def make_tmpname(basename, n = 0)
53
+ extension = File.extname(basename)
54
+ sprintf("%s,%d,%d%s", File.basename(basename, extension), $$, n, extension)
55
+ end
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ def generate_tiny_captcha_image(tiny_captcha_key) #:nodoc
62
+ amplitude, frequency = ImageHelpers.distortion(TinyCaptcha.distortion)
63
+ text = Utils::tiny_captcha_value(tiny_captcha_key)
64
+
65
+ params = ImageHelpers.image_params(TinyCaptcha.image_style).dup
66
+ params << "-size #{TinyCaptcha.image_size}"
67
+ params << "-wave #{amplitude}x#{frequency}"
68
+ params << "-gravity \"Center\""
69
+ params << "-pointsize 22"
70
+ params << "-implode 0.2"
71
+
72
+ dst = Tempfile.new(RUBY_VERSION < '1.9' ? 'tiny_captcha.jpg' : ['tiny_captcha', '.jpg'], TinyCaptcha.tmp_path)
73
+ dst.binmode
74
+
75
+ params << "label:#{text} \"#{File.expand_path(dst.path)}\""
76
+
77
+ TinyCaptcha::Utils::run("convert", params.join(' '))
78
+
79
+ dst.close
80
+
81
+ File.expand_path(dst.path)
82
+ #dst
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,70 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module TinyCaptcha
3
+ class Middleware
4
+ include TinyCaptcha::ImageHelpers
5
+
6
+ DEFAULT_SEND_FILE_OPTIONS = {
7
+ :type => 'application/octet-stream'.freeze,
8
+ :disposition => 'attachment'.freeze,
9
+ }.freeze
10
+
11
+ CODE_KEY = 'code'
12
+
13
+ def initialize(app, options={})
14
+ @app = app
15
+ self
16
+ end
17
+
18
+ def call(env) # :nodoc:
19
+ if env["REQUEST_METHOD"] == "GET" && env['PATH_INFO'].start_with?(::TinyCaptcha.image_show_path)
20
+ # /tiny_captcha/images/show?code=abcdefg
21
+ make_image(env)
22
+ else
23
+ @app.call(env)
24
+ end
25
+ end
26
+
27
+ protected
28
+
29
+ def render_json(env, data={}, headers={}, status=404)
30
+ body = []
31
+ body << data.to_json
32
+ headers['Content-Type'] = 'application/json'
33
+ [status, headers, body]
34
+ end
35
+
36
+ def make_image(env, headers = {}, status = 404)
37
+ request = Rack::Request.new(env)
38
+ code = request.params[CODE_KEY]
39
+ body = []
40
+
41
+ if !code.blank? && ::TinyCaptcha::Utils::tiny_captcha_value(code)
42
+ #status, headers, body = @app.call(env)
43
+ #status = 200
44
+ #body = generate_tiny_captcha_image(code)
45
+ #headers['Content-Type'] = 'image/jpeg'
46
+
47
+ return send_file(
48
+ generate_tiny_captcha_image(code),
49
+ :type => 'image/jpeg',
50
+ :disposition => 'inline',
51
+ :filename => 'tiny_captcha.jpg'
52
+ )
53
+ end
54
+
55
+ [status, headers, body]
56
+ end
57
+
58
+ def send_file(path, options = {})
59
+ raise MissingFile, "Cannot read file #{path}" unless File.file?(path) and File.readable?(path)
60
+
61
+ options[:filename] ||= File.basename(path) unless options[:url_based_filename]
62
+
63
+ status = options[:status] || 200
64
+ headers = {"Content-Disposition" => "#{options[:disposition]}; filename='#{options[:filename]}'", "Content-Type" => options[:type], 'Content-Transfer-Encoding' => 'binary', 'Cache-Control' => 'private'}
65
+ response_body = File.open(path, "rb")
66
+
67
+ [status, headers, response_body]
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,36 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module TinyCaptcha
3
+ class TinyCaptchaData < ::ActiveRecord::Base
4
+ def self.rails3?
5
+ ::ActiveRecord::VERSION::MAJOR == 3
6
+ end
7
+
8
+ def self.rails4?
9
+ ::ActiveRecord::VERSION::MAJOR == 4
10
+ end
11
+
12
+ if rails3? || rails4?
13
+ self.table_name = "tiny_captcha_data"
14
+ else
15
+ set_table_name "tiny_captcha_data"
16
+ end
17
+
18
+ attr_accessible :key, :value
19
+
20
+ class << self
21
+ def get_data(key)
22
+ data = find_by_key(key) || new(:key => key)
23
+ end
24
+
25
+ def remove_data(key)
26
+ delete_all(["#{connection.quote_column_name(:key)} = ?", key])
27
+ clear_old_data(1.hour.ago)
28
+ end
29
+
30
+ def clear_old_data(time = 1.hour.ago)
31
+ return unless Time === time
32
+ delete_all(["#{connection.quote_column_name(:updated_at)} < ?", time])
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,26 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module TinyCaptcha
3
+ class TinyCaptchaData
4
+ include Mongoid::Document
5
+ include Mongoid::Timestamps
6
+
7
+ field :key, type: String
8
+ field :value, type: String
9
+
10
+ class << self
11
+ def get_data(key)
12
+ data = where(:key => key).first || new(:key => key)
13
+ end
14
+
15
+ def remove_data(key)
16
+ where(:key => key).delete_all
17
+ clear_old_data(1.hour.ago)
18
+ end
19
+
20
+ def clear_old_data(time = 1.hour.ago)
21
+ return unless Time === time
22
+ where(:updated_at.lte => time).delete_all
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,80 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'digest/sha1'
3
+
4
+ module TinyCaptcha #:nodoc
5
+ module Utils #:nodoc
6
+ # Execute command with params and return output if exit status equal expected_outcodes
7
+ def self.run(cmd, params = "", expected_outcodes = 0)
8
+ command = %Q[#{cmd} #{params}].gsub(/\s+/, " ")
9
+ command = "#{command} 2>&1"
10
+
11
+ unless (image_magick_path = TinyCaptcha.image_magick_path).blank?
12
+ command = File.join(image_magick_path, command)
13
+ end
14
+
15
+ output = `#{command}`
16
+
17
+ unless [expected_outcodes].flatten.include?($?.exitstatus)
18
+ raise ::StandardError, "Error while running #{cmd}: #{output}"
19
+ end
20
+
21
+ output
22
+ end
23
+
24
+ def self.tiny_captcha_value(key) #:nodoc
25
+ TinyCaptchaData.get_data(key).value rescue nil
26
+ end
27
+
28
+ def self.tiny_captcha_passed!(key) #:nodoc
29
+ TinyCaptchaData.remove_data(key)
30
+ end
31
+
32
+ def self.generate_key(*args)
33
+ args << Time.now.to_s
34
+ Digest::SHA1.hexdigest(args.join)
35
+ end
36
+
37
+ def self.set_tiny_captcha_data(key, options={})
38
+ code_type = options[:code_type]
39
+
40
+ data = TinyCaptcha::TinyCaptchaData.get_data(key)
41
+ data.value = generate_tiny_captcha_data(code_type)
42
+ data.save
43
+ key
44
+ end
45
+
46
+ def self.generate_tiny_captcha_data(code)
47
+ value = ''
48
+
49
+ case code
50
+ when 'numeric' then
51
+ ::TinyCaptcha.length.times{value << (48 + rand(10)).chr}
52
+ else
53
+ ::TinyCaptcha.length.times{value << (65 + rand(26)).chr}
54
+ end
55
+
56
+ return value
57
+ end
58
+
59
+ def self.generate_image_url key, *args
60
+ options = args.extract_options!
61
+
62
+ defaults = {}
63
+ defaults[:time] = options[:time] || Time.now.to_i
64
+
65
+ base_url = args.first || ENV['RAILS_RELATIVE_URL_ROOT']
66
+
67
+ "#{base_url}#{::TinyCaptcha.image_show_path}?code=#{key}&#{defaults.to_query}"
68
+ end
69
+
70
+ def self.generate_key_use_session session, *args
71
+ key_name = args.first
72
+
73
+ if key_name.nil?
74
+ session[:captcha] ||= TinyCaptcha::Utils.generate_key(session[:id].to_s, 'captcha')
75
+ else
76
+ TinyCaptcha::Utils.generate_key(session[:id].to_s, key_name)
77
+ end
78
+ end
79
+ end
80
+ end
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  module TinyCaptcha
2
- VERSION = "0.0.1"
3
+ VERSION = "0.0.3"
3
4
  end
@@ -0,0 +1,99 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module TinyCaptcha #:nodoc
3
+ module ViewHelper #:nodoc
4
+
5
+ # Tiny Captcha is a very simplified captcha.
6
+ #
7
+ # It can be used as a *Model* or a *Controller* based Captcha depending on what options
8
+ # we are passing to the method show_tiny_captcha.
9
+ #
10
+ # *show_tiny_captcha* method will return the image, the label and the text box.
11
+ # This method should be called from the view within your form as...
12
+ #
13
+ # <%= show_tiny_captcha %>
14
+ #
15
+ # The available options to pass to this method are
16
+ # * label
17
+ # * object
18
+ #
19
+ # <b>Label:</b>
20
+ #
21
+ # default label is "type the text from the image", it can be modified by passing :label as
22
+ #
23
+ # <%= show_tiny_captcha(:label => "new captcha label") %>.
24
+ #
25
+ # *Object*
26
+ #
27
+ # This option is needed to create a model based captcha.
28
+ # If this option is not provided, the captcha will be controller based and
29
+ # should be checked in controller's action just by calling the method tiny_captcha_valid?
30
+ #
31
+ # To make a model based captcha give this option as...
32
+ #
33
+ # <%= show_tiny_captcha(:object => "user") %>
34
+ # and also call the method apply_tiny_captcha in the model
35
+ # this will consider "user" as the object of the model class.
36
+ #
37
+ # *Examples*
38
+ # * controller based
39
+ # <%= show_tiny_captcha(:label => "Human Authentication: type the text from image above") %>
40
+ # * model based
41
+ # <%= show_tiny_captcha(:object => "person", :label => "Human Authentication: type the text from image above") %>
42
+ #
43
+ # Find more detailed examples with sample images here on my blog http://EXPRESSICA.com
44
+ #
45
+ # All Feedbacks/CommentS/Issues/Queries are welcome.
46
+ #
47
+ #
48
+ # eg. show_tiny_captcha :label => '', :captcha_key => '', :image_url => ''
49
+ def show_tiny_captcha(*args)
50
+ options = args.extract_options!
51
+
52
+ options[:captcha_key] ||= set_tiny_captcha_data(
53
+ (
54
+ args.first || tiny_captcha_key(options[:object])
55
+ ),
56
+ options
57
+ )
58
+
59
+ key = options[:captcha_key]
60
+
61
+ defaults = {
62
+ :image => tiny_captcha_image(key, options),
63
+ :label => options[:label] || I18n.t('tiny_captcha.label'),
64
+ :field => tiny_captcha_field(options)
65
+ }
66
+
67
+ render :partial => 'tiny_captcha/tiny_captcha', :locals => { :tiny_captcha_options => defaults }
68
+ end
69
+
70
+ private
71
+
72
+ def tiny_captcha_image(key, options = {})
73
+ url = options[:image_url] || ::TinyCaptcha::Utils.generate_image_url(key, options)
74
+ tag('img', :src => url, :alt => 'captcha', :class => 'captcha-image')
75
+ end
76
+
77
+ def tiny_captcha_field(options={})
78
+ html = {:autocomplete => 'off', :required => 'required'}
79
+ html.merge!(options[:input_html] || {})
80
+ html[:placeholder] = options[:placeholder] || I18n.t('tiny_captcha.placeholder')
81
+
82
+ if options[:object]
83
+ text_field(options[:object], :captcha, html.merge(:value => '')) +
84
+ hidden_field(options[:object], :captcha_key, {:value => options[:captcha_key], :class => 'captcha-key'})
85
+ else
86
+ text_field_tag(:captcha, nil, html) +
87
+ hidden_field_tag(:captcha_key, options[:captcha_key], :class => 'captcha-key')
88
+ end
89
+ end
90
+
91
+ def set_tiny_captcha_data(key, options={})
92
+ ::TinyCaptcha::Utils.set_tiny_captcha_data key, options
93
+ end
94
+
95
+ def tiny_captcha_key(key_name = nil)
96
+ TinyCaptcha::Utils.generate_key_use_session session, key_name
97
+ end
98
+ end
99
+ end
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  class ApplicationController < ActionController::Base
2
3
  # Prevent CSRF attacks by raising an exception.
3
4
  # For APIs, you may want to use :null_session instead.
@@ -1,2 +1,3 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  module ApplicationHelper
2
3
  end
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  require File.expand_path('../boot', __FILE__)
2
3
 
3
4
  require 'rails/all'
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  # Set up gems listed in the Gemfile.
2
3
  ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../../Gemfile', __FILE__)
3
4
 
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  # Load the Rails application.
2
3
  require File.expand_path('../application', __FILE__)
3
4
 
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  Dummy::Application.configure do
2
3
  # Settings specified here will take precedence over those in config/application.rb.
3
4
 
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  Dummy::Application.configure do
2
3
  # Settings specified here will take precedence over those in config/application.rb.
3
4
 
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  Dummy::Application.configure do
2
3
  # Settings specified here will take precedence over those in config/application.rb.
3
4
 
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  # Be sure to restart your server when you modify this file.
2
3
 
3
4
  # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  # Be sure to restart your server when you modify this file.
2
3
 
3
4
  # Configure sensitive parameters which will be filtered from the log file.
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  # Be sure to restart your server when you modify this file.
2
3
 
3
4
  # Add new inflection rules using the following format. Inflections
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  # Be sure to restart your server when you modify this file.
2
3
 
3
4
  # Add new mime types for use in respond_to blocks:
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  # Be sure to restart your server when you modify this file.
2
3
 
3
4
  # Your secret key is used for verifying the integrity of signed cookies.
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  # Be sure to restart your server when you modify this file.
2
3
 
3
4
  Dummy::Application.config.session_store :cookie_store, key: '_dummy_session'
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  # Be sure to restart your server when you modify this file.
2
3
 
3
4
  # This file contains settings for ActionController::ParamsWrapper which
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  Rails.application.routes.draw do
2
3
 
3
4
  mount TinyCaptcha::Engine => "/tiny_captcha"
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  require 'test_helper'
2
3
 
3
4
  class NavigationTest < ActionDispatch::IntegrationTest
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  # Configure Rails Environment
2
3
  ENV["RAILS_ENV"] = "test"
3
4
 
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  require 'test_helper'
2
3
 
3
4
  class TinyCaptchaTest < ActiveSupport::TestCase
metadata CHANGED
@@ -1,62 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tiny_captcha
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
5
- prerelease:
4
+ version: 0.0.3
6
5
  platform: ruby
7
6
  authors:
8
7
  - happy
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-11-29 00:00:00.000000000 Z
11
+ date: 2014-01-23 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rails
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
19
  version: 4.0.0
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ~>
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
26
  version: 4.0.0
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: tiny_util
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ">="
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - ">="
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: sqlite3
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - ">="
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - ">="
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  description: Description of TinyCaptcha.
@@ -66,115 +59,125 @@ executables: []
66
59
  extensions: []
67
60
  extra_rdoc_files: []
68
61
  files:
69
- - app/views/layouts/tiny_captcha/application.html.erb
70
- - app/controllers/tiny_captcha/application_controller.rb
62
+ - MIT-LICENSE
63
+ - README.rdoc
64
+ - Rakefile
71
65
  - app/assets/javascripts/tiny_captcha/application.js
72
66
  - app/assets/stylesheets/tiny_captcha/application.css
67
+ - app/controllers/tiny_captcha/application_controller.rb
68
+ - app/controllers/tiny_captcha/images_controller.rb
73
69
  - app/helpers/tiny_captcha/application_helper.rb
70
+ - app/views/layouts/tiny_captcha/application.html.erb
71
+ - config/locales/en/tiny_captcha.en.yml
72
+ - config/locales/zh-CN/tiny_captcha.zh-CN.yml
74
73
  - config/routes.rb
75
- - lib/tiny_captcha/engine.rb
76
- - lib/tiny_captcha/version.rb
74
+ - lib/generators/USAGE
75
+ - lib/generators/templates/migration.rb
76
+ - lib/generators/templates/partial.erb
77
+ - lib/generators/tiny_captcha_generator.rb
77
78
  - lib/tasks/tiny_captcha_tasks.rake
78
79
  - lib/tiny_captcha.rb
79
- - MIT-LICENSE
80
- - Rakefile
81
- - README.rdoc
82
- - test/tiny_captcha_test.rb
83
- - test/test_helper.rb
84
- - test/dummy/bin/bundle
85
- - test/dummy/bin/rake
86
- - test/dummy/bin/rails
80
+ - lib/tiny_captcha/active_record.rb
81
+ - lib/tiny_captcha/controller.rb
82
+ - lib/tiny_captcha/engine.rb
83
+ - lib/tiny_captcha/form_builder.rb
84
+ - lib/tiny_captcha/formtastic.rb
85
+ - lib/tiny_captcha/image.rb
86
+ - lib/tiny_captcha/middleware.rb
87
+ - lib/tiny_captcha/tiny_captcha_data.rb
88
+ - lib/tiny_captcha/tiny_captcha_data_mongoid.rb
89
+ - lib/tiny_captcha/utils.rb
90
+ - lib/tiny_captcha/version.rb
91
+ - lib/tiny_captcha/view.rb
87
92
  - test/dummy/README.rdoc
88
- - test/dummy/config.ru
89
93
  - test/dummy/Rakefile
90
- - test/dummy/app/views/layouts/application.html.erb
91
- - test/dummy/app/controllers/application_controller.rb
92
94
  - test/dummy/app/assets/javascripts/application.js
93
95
  - test/dummy/app/assets/stylesheets/application.css
96
+ - test/dummy/app/controllers/application_controller.rb
94
97
  - test/dummy/app/helpers/application_helper.rb
95
- - test/dummy/public/favicon.ico
96
- - test/dummy/public/404.html
97
- - test/dummy/public/422.html
98
- - test/dummy/public/500.html
99
- - test/dummy/config/locales/en.yml
100
- - test/dummy/config/environments/test.rb
101
- - test/dummy/config/environments/production.rb
98
+ - test/dummy/app/views/layouts/application.html.erb
99
+ - test/dummy/bin/bundle
100
+ - test/dummy/bin/rails
101
+ - test/dummy/bin/rake
102
+ - test/dummy/config.ru
103
+ - test/dummy/config/application.rb
104
+ - test/dummy/config/boot.rb
105
+ - test/dummy/config/database.yml
106
+ - test/dummy/config/environment.rb
102
107
  - test/dummy/config/environments/development.rb
103
- - test/dummy/config/initializers/secret_token.rb
108
+ - test/dummy/config/environments/production.rb
109
+ - test/dummy/config/environments/test.rb
104
110
  - test/dummy/config/initializers/backtrace_silencers.rb
105
- - test/dummy/config/initializers/mime_types.rb
106
- - test/dummy/config/initializers/inflections.rb
107
111
  - test/dummy/config/initializers/filter_parameter_logging.rb
108
- - test/dummy/config/initializers/wrap_parameters.rb
112
+ - test/dummy/config/initializers/inflections.rb
113
+ - test/dummy/config/initializers/mime_types.rb
114
+ - test/dummy/config/initializers/secret_token.rb
109
115
  - test/dummy/config/initializers/session_store.rb
116
+ - test/dummy/config/initializers/wrap_parameters.rb
117
+ - test/dummy/config/locales/en.yml
110
118
  - test/dummy/config/routes.rb
111
- - test/dummy/config/application.rb
112
- - test/dummy/config/database.yml
113
- - test/dummy/config/environment.rb
114
- - test/dummy/config/boot.rb
119
+ - test/dummy/public/404.html
120
+ - test/dummy/public/422.html
121
+ - test/dummy/public/500.html
122
+ - test/dummy/public/favicon.ico
115
123
  - test/integration/navigation_test.rb
124
+ - test/test_helper.rb
125
+ - test/tiny_captcha_test.rb
116
126
  homepage: http://github.com/xiuxian123/tiny_passport
117
127
  licenses: []
128
+ metadata: {}
118
129
  post_install_message:
119
130
  rdoc_options: []
120
131
  require_paths:
121
132
  - lib
122
133
  required_ruby_version: !ruby/object:Gem::Requirement
123
- none: false
124
134
  requirements:
125
- - - ! '>='
135
+ - - ">="
126
136
  - !ruby/object:Gem::Version
127
137
  version: '0'
128
- segments:
129
- - 0
130
- hash: 965235565
131
138
  required_rubygems_version: !ruby/object:Gem::Requirement
132
- none: false
133
139
  requirements:
134
- - - ! '>='
140
+ - - ">="
135
141
  - !ruby/object:Gem::Version
136
142
  version: '0'
137
- segments:
138
- - 0
139
- hash: 965235565
140
143
  requirements: []
141
144
  rubyforge_project:
142
- rubygems_version: 1.8.24
145
+ rubygems_version: 2.2.1
143
146
  signing_key:
144
- specification_version: 3
147
+ specification_version: 4
145
148
  summary: Summary of TinyCaptcha.
146
149
  test_files:
147
- - test/tiny_captcha_test.rb
148
- - test/test_helper.rb
149
- - test/dummy/bin/bundle
150
- - test/dummy/bin/rake
151
- - test/dummy/bin/rails
152
- - test/dummy/README.rdoc
153
- - test/dummy/config.ru
154
- - test/dummy/Rakefile
155
- - test/dummy/app/views/layouts/application.html.erb
156
- - test/dummy/app/controllers/application_controller.rb
157
150
  - test/dummy/app/assets/javascripts/application.js
158
151
  - test/dummy/app/assets/stylesheets/application.css
152
+ - test/dummy/app/controllers/application_controller.rb
159
153
  - test/dummy/app/helpers/application_helper.rb
160
- - test/dummy/public/favicon.ico
161
- - test/dummy/public/404.html
162
- - test/dummy/public/422.html
163
- - test/dummy/public/500.html
164
- - test/dummy/config/locales/en.yml
165
- - test/dummy/config/environments/test.rb
166
- - test/dummy/config/environments/production.rb
154
+ - test/dummy/app/views/layouts/application.html.erb
155
+ - test/dummy/bin/bundle
156
+ - test/dummy/bin/rails
157
+ - test/dummy/bin/rake
158
+ - test/dummy/config/application.rb
159
+ - test/dummy/config/boot.rb
160
+ - test/dummy/config/database.yml
161
+ - test/dummy/config/environment.rb
167
162
  - test/dummy/config/environments/development.rb
168
- - test/dummy/config/initializers/secret_token.rb
163
+ - test/dummy/config/environments/production.rb
164
+ - test/dummy/config/environments/test.rb
169
165
  - test/dummy/config/initializers/backtrace_silencers.rb
170
- - test/dummy/config/initializers/mime_types.rb
171
- - test/dummy/config/initializers/inflections.rb
172
166
  - test/dummy/config/initializers/filter_parameter_logging.rb
173
- - test/dummy/config/initializers/wrap_parameters.rb
167
+ - test/dummy/config/initializers/inflections.rb
168
+ - test/dummy/config/initializers/mime_types.rb
169
+ - test/dummy/config/initializers/secret_token.rb
174
170
  - test/dummy/config/initializers/session_store.rb
171
+ - test/dummy/config/initializers/wrap_parameters.rb
172
+ - test/dummy/config/locales/en.yml
175
173
  - test/dummy/config/routes.rb
176
- - test/dummy/config/application.rb
177
- - test/dummy/config/database.yml
178
- - test/dummy/config/environment.rb
179
- - test/dummy/config/boot.rb
174
+ - test/dummy/config.ru
175
+ - test/dummy/public/404.html
176
+ - test/dummy/public/422.html
177
+ - test/dummy/public/500.html
178
+ - test/dummy/public/favicon.ico
179
+ - test/dummy/Rakefile
180
+ - test/dummy/README.rdoc
180
181
  - test/integration/navigation_test.rb
182
+ - test/test_helper.rb
183
+ - test/tiny_captcha_test.rb