rughetto-merb-auth-remember-me 0.0.1
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.
- data/LICENSE +20 -0
 - data/Rakefile +57 -0
 - data/TODO +5 -0
 - data/lib/merb-auth-remember-me.rb +27 -0
 - data/lib/merb-auth-remember-me/mixins/authenticated_user.rb +97 -0
 - data/lib/merb-auth-remember-me/mixins/authenticated_user/ar_authenticated_user.rb +14 -0
 - data/lib/merb-auth-remember-me/mixins/authenticated_user/dm_authenticated_user.rb +17 -0
 - data/lib/merb-auth-remember-me/mixins/authenticated_user/sq_authenticated_user.rb +19 -0
 - data/lib/merb-auth-remember-me/strategies/remember_me.rb +56 -0
 - data/spec/merb-auth-remember-me_spec.rb +2 -0
 - data/spec/mixins/authenticated_user_spec.rb +34 -0
 - data/spec/spec_helper.rb +101 -0
 - data/spec/strategies/remember_me_spec.rb +63 -0
 - metadata +84 -0
 
    
        data/LICENSE
    ADDED
    
    | 
         @@ -0,0 +1,20 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            Copyright (c) 2008 Surasit Liangpornrattana
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            Permission is hereby granted, free of charge, to any person obtaining
         
     | 
| 
      
 4 
     | 
    
         
            +
            a copy of this software and associated documentation files (the
         
     | 
| 
      
 5 
     | 
    
         
            +
            "Software"), to deal in the Software without restriction, including
         
     | 
| 
      
 6 
     | 
    
         
            +
            without limitation the rights to use, copy, modify, merge, publish,
         
     | 
| 
      
 7 
     | 
    
         
            +
            distribute, sublicense, and/or sell copies of the Software, and to
         
     | 
| 
      
 8 
     | 
    
         
            +
            permit persons to whom the Software is furnished to do so, subject to
         
     | 
| 
      
 9 
     | 
    
         
            +
            the following conditions:
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            The above copyright notice and this permission notice shall be
         
     | 
| 
      
 12 
     | 
    
         
            +
            included in all copies or substantial portions of the Software.
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
         
     | 
| 
      
 15 
     | 
    
         
            +
            EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
         
     | 
| 
      
 16 
     | 
    
         
            +
            MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
         
     | 
| 
      
 17 
     | 
    
         
            +
            NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
         
     | 
| 
      
 18 
     | 
    
         
            +
            LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
         
     | 
| 
      
 19 
     | 
    
         
            +
            OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
         
     | 
| 
      
 20 
     | 
    
         
            +
            WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
         
     | 
    
        data/Rakefile
    ADDED
    
    | 
         @@ -0,0 +1,57 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'rubygems'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'rake/gempackagetask'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'spec/rake/spectask'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            require 'merb-core'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'merb-core/tasks/merb'
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            GEM_NAME = "merb-auth-remember-me"
         
     | 
| 
      
 9 
     | 
    
         
            +
            GEM_VERSION = "0.0.1"
         
     | 
| 
      
 10 
     | 
    
         
            +
            AUTHOR = "Surasit Liangpornrattana"
         
     | 
| 
      
 11 
     | 
    
         
            +
            EMAIL = "punneng@gmail.com"
         
     | 
| 
      
 12 
     | 
    
         
            +
            HOMEPAGE = "https://github.com/PunNeng/pn-merb-auth-remember-me"
         
     | 
| 
      
 13 
     | 
    
         
            +
            SUMMARY = "Merb plugin that provides remember me for merb-auth-slice-password"
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            spec = Gem::Specification.new do |s|
         
     | 
| 
      
 16 
     | 
    
         
            +
              s.rubyforge_project = 'merb'
         
     | 
| 
      
 17 
     | 
    
         
            +
              s.name = GEM_NAME
         
     | 
| 
      
 18 
     | 
    
         
            +
              s.version = GEM_VERSION
         
     | 
| 
      
 19 
     | 
    
         
            +
              s.platform = Gem::Platform::RUBY
         
     | 
| 
      
 20 
     | 
    
         
            +
              s.has_rdoc = true
         
     | 
| 
      
 21 
     | 
    
         
            +
              s.extra_rdoc_files = ["README", "LICENSE", 'TODO']
         
     | 
| 
      
 22 
     | 
    
         
            +
              s.summary = SUMMARY
         
     | 
| 
      
 23 
     | 
    
         
            +
              s.description = s.summary
         
     | 
| 
      
 24 
     | 
    
         
            +
              s.author = AUTHOR
         
     | 
| 
      
 25 
     | 
    
         
            +
              s.email = EMAIL
         
     | 
| 
      
 26 
     | 
    
         
            +
              s.homepage = HOMEPAGE
         
     | 
| 
      
 27 
     | 
    
         
            +
              s.add_dependency('merb-core', '>= 1.0')
         
     | 
| 
      
 28 
     | 
    
         
            +
              s.require_path = 'lib'
         
     | 
| 
      
 29 
     | 
    
         
            +
              s.files = %w(LICENSE README Rakefile TODO) + Dir.glob("{lib,spec}/**/*")
         
     | 
| 
      
 30 
     | 
    
         
            +
            end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
            Rake::GemPackageTask.new(spec) do |pkg|
         
     | 
| 
      
 33 
     | 
    
         
            +
              pkg.gem_spec = spec
         
     | 
| 
      
 34 
     | 
    
         
            +
            end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
            desc "install the plugin as a gem"
         
     | 
| 
      
 37 
     | 
    
         
            +
            task :install do
         
     | 
| 
      
 38 
     | 
    
         
            +
              Merb::RakeHelper.install(GEM_NAME, :version => GEM_VERSION)
         
     | 
| 
      
 39 
     | 
    
         
            +
            end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
            desc "Uninstall the gem"
         
     | 
| 
      
 42 
     | 
    
         
            +
            task :uninstall do
         
     | 
| 
      
 43 
     | 
    
         
            +
              Merb::RakeHelper.uninstall(GEM_NAME, :version => GEM_VERSION)
         
     | 
| 
      
 44 
     | 
    
         
            +
            end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
            desc "Create a gemspec file"
         
     | 
| 
      
 47 
     | 
    
         
            +
            task :gemspec do
         
     | 
| 
      
 48 
     | 
    
         
            +
              File.open("#{GEM_NAME}.gemspec", "w") do |file|
         
     | 
| 
      
 49 
     | 
    
         
            +
                file.puts spec.to_ruby
         
     | 
| 
      
 50 
     | 
    
         
            +
              end
         
     | 
| 
      
 51 
     | 
    
         
            +
            end
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
            Spec::Rake::SpecTask.new do |t|
         
     | 
| 
      
 54 
     | 
    
         
            +
               t.warning = true
         
     | 
| 
      
 55 
     | 
    
         
            +
               t.spec_opts = ["--format", "specdoc", "--colour"]
         
     | 
| 
      
 56 
     | 
    
         
            +
               t.spec_files = Dir['spec/**/*_spec.rb'].sort   
         
     | 
| 
      
 57 
     | 
    
         
            +
            end
         
     | 
    
        data/TODO
    ADDED
    
    
| 
         @@ -0,0 +1,27 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # make sure we're running inside Merb
         
     | 
| 
      
 2 
     | 
    
         
            +
            if defined?(Merb::Plugins)
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
              $:.unshift File.dirname(__FILE__)
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              # register the authentication strategy
         
     | 
| 
      
 7 
     | 
    
         
            +
              require(File.expand_path(File.dirname(__FILE__) / "merb-auth-remember-me" / "mixins") / "authenticated_user")
         
     | 
| 
      
 8 
     | 
    
         
            +
              strategy_path = File.expand_path(File.dirname(__FILE__)) / "merb-auth-remember-me" / "strategies"
         
     | 
| 
      
 9 
     | 
    
         
            +
              Merb::Authentication.register(:remember_me, strategy_path / "remember_me.rb")
         
     | 
| 
      
 10 
     | 
    
         
            +
              
         
     | 
| 
      
 11 
     | 
    
         
            +
              # Plugin configurations
         
     | 
| 
      
 12 
     | 
    
         
            +
              Merb::Plugins.config[:merb_auth_remember_me] = { }
         
     | 
| 
      
 13 
     | 
    
         
            +
              
         
     | 
| 
      
 14 
     | 
    
         
            +
              Merb::BootLoader.before_app_loads do
         
     | 
| 
      
 15 
     | 
    
         
            +
              end
         
     | 
| 
      
 16 
     | 
    
         
            +
              
         
     | 
| 
      
 17 
     | 
    
         
            +
              Merb::BootLoader.after_app_loads do
         
     | 
| 
      
 18 
     | 
    
         
            +
                Merb::Authentication.after_authentication do |user,request,params|
         
     | 
| 
      
 19 
     | 
    
         
            +
                  if params[:remember_me] == "1" 
         
     | 
| 
      
 20 
     | 
    
         
            +
                    user.remember_me
         
     | 
| 
      
 21 
     | 
    
         
            +
                    request.cookies.set_cookie(:auth_token, user.remember_token, :expires => user.remember_token_expires_at.to_time)
         
     | 
| 
      
 22 
     | 
    
         
            +
                  end
         
     | 
| 
      
 23 
     | 
    
         
            +
                  true if user 
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
              end
         
     | 
| 
      
 26 
     | 
    
         
            +
              
         
     | 
| 
      
 27 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,97 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "digest/sha1"
         
     | 
| 
      
 2 
     | 
    
         
            +
            module Merb
         
     | 
| 
      
 3 
     | 
    
         
            +
              class Authentication
         
     | 
| 
      
 4 
     | 
    
         
            +
                module Mixins
         
     | 
| 
      
 5 
     | 
    
         
            +
                  # This mixin provides basic user remember token.
         
     | 
| 
      
 6 
     | 
    
         
            +
                  #
         
     | 
| 
      
 7 
     | 
    
         
            +
                  # Added properties:
         
     | 
| 
      
 8 
     | 
    
         
            +
                  #  :remember_token_expires_at, DateTime
         
     | 
| 
      
 9 
     | 
    
         
            +
                  #  :remember_token, String
         
     | 
| 
      
 10 
     | 
    
         
            +
                  #
         
     | 
| 
      
 11 
     | 
    
         
            +
                  # To use it simply require it and include it into your user class.
         
     | 
| 
      
 12 
     | 
    
         
            +
                  #
         
     | 
| 
      
 13 
     | 
    
         
            +
                  # class User
         
     | 
| 
      
 14 
     | 
    
         
            +
                  #   include Merb::Authentication::Mixins::AuthenticatedUser
         
     | 
| 
      
 15 
     | 
    
         
            +
                  #
         
     | 
| 
      
 16 
     | 
    
         
            +
                  # end
         
     | 
| 
      
 17 
     | 
    
         
            +
                  #
         
     | 
| 
      
 18 
     | 
    
         
            +
                  module AuthenticatedUser
         
     | 
| 
      
 19 
     | 
    
         
            +
                    def self.included(base)
         
     | 
| 
      
 20 
     | 
    
         
            +
                      base.class_eval do
         
     | 
| 
      
 21 
     | 
    
         
            +
                        include Merb::Authentication::Mixins::AuthenticatedUser::InstanceMethods
         
     | 
| 
      
 22 
     | 
    
         
            +
                        extend  Merb::Authentication::Mixins::AuthenticatedUser::ClassMethods
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                        path = File.expand_path(File.dirname(__FILE__)) / "authenticated_user"
         
     | 
| 
      
 25 
     | 
    
         
            +
                        if defined?(DataMapper) && DataMapper::Resource > self
         
     | 
| 
      
 26 
     | 
    
         
            +
                          require path / "dm_authenticated_user"
         
     | 
| 
      
 27 
     | 
    
         
            +
                          extend(Merb::Authentication::Mixins::AuthenticatedUser::DMClassMethods)
         
     | 
| 
      
 28 
     | 
    
         
            +
                        elsif defined?(ActiveRecord) && ancestors.include?(ActiveRecord::Base)
         
     | 
| 
      
 29 
     | 
    
         
            +
                          require path / "ar_authenticated_user"
         
     | 
| 
      
 30 
     | 
    
         
            +
                          extend(Merb::Authentication::Mixins::AuthenticatedUser::ARClassMethods)
         
     | 
| 
      
 31 
     | 
    
         
            +
                        elsif defined?(Sequel) && ancestors.include?(Sequel::Model)
         
     | 
| 
      
 32 
     | 
    
         
            +
                          require path / "sq_authenticated_user"
         
     | 
| 
      
 33 
     | 
    
         
            +
                          extend(Merb::Authentication::Mixins::AuthenticatedUser::SQClassMethods)
         
     | 
| 
      
 34 
     | 
    
         
            +
                        end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                      end # base.class_eval
         
     | 
| 
      
 37 
     | 
    
         
            +
                    end # self.included
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                    module ClassMethods
         
     | 
| 
      
 41 
     | 
    
         
            +
                      def secure_digest(*args)
         
     | 
| 
      
 42 
     | 
    
         
            +
                        Digest::SHA1.hexdigest(args.flatten.join('--'))
         
     | 
| 
      
 43 
     | 
    
         
            +
                      end
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                      # Create random key.
         
     | 
| 
      
 46 
     | 
    
         
            +
                      #
         
     | 
| 
      
 47 
     | 
    
         
            +
                      # ==== Returns
         
     | 
| 
      
 48 
     | 
    
         
            +
                      # String:: The generated key
         
     | 
| 
      
 49 
     | 
    
         
            +
                      def make_token
         
     | 
| 
      
 50 
     | 
    
         
            +
                        secure_digest(Time.now, (1..10).map{ rand.to_s })
         
     | 
| 
      
 51 
     | 
    
         
            +
                      end 
         
     | 
| 
      
 52 
     | 
    
         
            +
                    end # ClassMethods
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                    module InstanceMethods
         
     | 
| 
      
 55 
     | 
    
         
            +
                      def remember_token?
         
     | 
| 
      
 56 
     | 
    
         
            +
                        (!remember_token.blank?) && 
         
     | 
| 
      
 57 
     | 
    
         
            +
                          remember_token_expires_at && (Time.now.utc < remember_token_expires_at.utc)
         
     | 
| 
      
 58 
     | 
    
         
            +
                      end
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
                      # These create and unset the fields required for remembering users between browser closes
         
     | 
| 
      
 61 
     | 
    
         
            +
                      def remember_me(time = 2.weeks)
         
     | 
| 
      
 62 
     | 
    
         
            +
                        remember_me_for time
         
     | 
| 
      
 63 
     | 
    
         
            +
                      end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
                      def remember_me_for(time)
         
     | 
| 
      
 66 
     | 
    
         
            +
                        remember_me_until time.from_now.utc
         
     | 
| 
      
 67 
     | 
    
         
            +
                      end
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                      def remember_me_until(time)
         
     | 
| 
      
 70 
     | 
    
         
            +
                        self.remember_token_expires_at = time
         
     | 
| 
      
 71 
     | 
    
         
            +
                        self.remember_token            = self.class.make_token
         
     | 
| 
      
 72 
     | 
    
         
            +
                        save
         
     | 
| 
      
 73 
     | 
    
         
            +
                      end
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
                      # refresh token (keeping same expires_at) if it exists
         
     | 
| 
      
 76 
     | 
    
         
            +
                      def refresh_token
         
     | 
| 
      
 77 
     | 
    
         
            +
                        if remember_token?
         
     | 
| 
      
 78 
     | 
    
         
            +
                          self.remember_token = self.class.make_token 
         
     | 
| 
      
 79 
     | 
    
         
            +
                          save
         
     | 
| 
      
 80 
     | 
    
         
            +
                        end
         
     | 
| 
      
 81 
     | 
    
         
            +
                      end
         
     | 
| 
      
 82 
     | 
    
         
            +
             
     | 
| 
      
 83 
     | 
    
         
            +
                      # 
         
     | 
| 
      
 84 
     | 
    
         
            +
                      # Deletes the server-side record of the authentication token.  The
         
     | 
| 
      
 85 
     | 
    
         
            +
                      # client-side (browser cookie) and server-side (this remember_token) must
         
     | 
| 
      
 86 
     | 
    
         
            +
                      # always be deleted together.
         
     | 
| 
      
 87 
     | 
    
         
            +
                      #
         
     | 
| 
      
 88 
     | 
    
         
            +
                      def forget_me
         
     | 
| 
      
 89 
     | 
    
         
            +
                        self.remember_token_expires_at = nil
         
     | 
| 
      
 90 
     | 
    
         
            +
                        self.remember_token            = nil
         
     | 
| 
      
 91 
     | 
    
         
            +
                        save
         
     | 
| 
      
 92 
     | 
    
         
            +
                      end
         
     | 
| 
      
 93 
     | 
    
         
            +
                    end # InstanceMethods
         
     | 
| 
      
 94 
     | 
    
         
            +
                  end # AuthenticatedUser
         
     | 
| 
      
 95 
     | 
    
         
            +
                end # Mixins
         
     | 
| 
      
 96 
     | 
    
         
            +
              end # Authentication
         
     | 
| 
      
 97 
     | 
    
         
            +
            end # Merb
         
     | 
| 
         @@ -0,0 +1,14 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Merb
         
     | 
| 
      
 2 
     | 
    
         
            +
              class Authentication
         
     | 
| 
      
 3 
     | 
    
         
            +
                module Mixins
         
     | 
| 
      
 4 
     | 
    
         
            +
                  module AuthenticatedUser
         
     | 
| 
      
 5 
     | 
    
         
            +
                    module ARClassMethods
         
     | 
| 
      
 6 
     | 
    
         
            +
                      def self.extended(base)
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                      
         
     | 
| 
      
 9 
     | 
    
         
            +
                      end # self.extended
         
     | 
| 
      
 10 
     | 
    
         
            +
                    end # ARClassMethods
         
     | 
| 
      
 11 
     | 
    
         
            +
                  end # ActivatedUser
         
     | 
| 
      
 12 
     | 
    
         
            +
                end # Mixins
         
     | 
| 
      
 13 
     | 
    
         
            +
              end # Authentication
         
     | 
| 
      
 14 
     | 
    
         
            +
            end # Merb
         
     | 
| 
         @@ -0,0 +1,17 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Merb
         
     | 
| 
      
 2 
     | 
    
         
            +
              class Authentication
         
     | 
| 
      
 3 
     | 
    
         
            +
                module Mixins
         
     | 
| 
      
 4 
     | 
    
         
            +
                  module AuthenticatedUser
         
     | 
| 
      
 5 
     | 
    
         
            +
                    module DMClassMethods
         
     | 
| 
      
 6 
     | 
    
         
            +
                      def self.extended(base)
         
     | 
| 
      
 7 
     | 
    
         
            +
                        base.class_eval do
         
     | 
| 
      
 8 
     | 
    
         
            +
                          property :remember_token_expires_at, DateTime
         
     | 
| 
      
 9 
     | 
    
         
            +
                          property :remember_token, String
         
     | 
| 
      
 10 
     | 
    
         
            +
                        end # base.class_eval
         
     | 
| 
      
 11 
     | 
    
         
            +
                      
         
     | 
| 
      
 12 
     | 
    
         
            +
                      end # self.extended
         
     | 
| 
      
 13 
     | 
    
         
            +
                    end # DMClassMethods
         
     | 
| 
      
 14 
     | 
    
         
            +
                  end # AuthenticatedUser
         
     | 
| 
      
 15 
     | 
    
         
            +
                end # Mixins
         
     | 
| 
      
 16 
     | 
    
         
            +
              end # Authentication
         
     | 
| 
      
 17 
     | 
    
         
            +
            end #Merb
         
     | 
| 
         @@ -0,0 +1,19 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Merb
         
     | 
| 
      
 2 
     | 
    
         
            +
              class Authentication
         
     | 
| 
      
 3 
     | 
    
         
            +
                module Mixins
         
     | 
| 
      
 4 
     | 
    
         
            +
                  module AuthenticatedUser
         
     | 
| 
      
 5 
     | 
    
         
            +
                    module SQClassMethods
         
     | 
| 
      
 6 
     | 
    
         
            +
                      def self.extended(base)
         
     | 
| 
      
 7 
     | 
    
         
            +
                        base.class_eval do
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                        end # base.class_eval
         
     | 
| 
      
 10 
     | 
    
         
            +
                      
         
     | 
| 
      
 11 
     | 
    
         
            +
                      end # self.extended
         
     | 
| 
      
 12 
     | 
    
         
            +
                    end # SQClassMethods
         
     | 
| 
      
 13 
     | 
    
         
            +
                    module SQInstanceMethods
         
     | 
| 
      
 14 
     | 
    
         
            +
                    end # SQInstanceMethods
         
     | 
| 
      
 15 
     | 
    
         
            +
                  
         
     | 
| 
      
 16 
     | 
    
         
            +
                  end # AuthenticatedUser
         
     | 
| 
      
 17 
     | 
    
         
            +
                end # Mixins
         
     | 
| 
      
 18 
     | 
    
         
            +
              end # Authentication
         
     | 
| 
      
 19 
     | 
    
         
            +
            end # Merb
         
     | 
| 
         @@ -0,0 +1,56 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class RememberMe < Merb::Authentication::Strategy
         
     | 
| 
      
 2 
     | 
    
         
            +
              def run!
         
     | 
| 
      
 3 
     | 
    
         
            +
                login_from_cookie
         
     | 
| 
      
 4 
     | 
    
         
            +
              end
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              def current_user
         
     | 
| 
      
 7 
     | 
    
         
            +
                @current_user
         
     | 
| 
      
 8 
     | 
    
         
            +
              end
         
     | 
| 
      
 9 
     | 
    
         
            +
              
         
     | 
| 
      
 10 
     | 
    
         
            +
              def current_user=(new_user)
         
     | 
| 
      
 11 
     | 
    
         
            +
                @current_user = new_user
         
     | 
| 
      
 12 
     | 
    
         
            +
              end
         
     | 
| 
      
 13 
     | 
    
         
            +
              
         
     | 
| 
      
 14 
     | 
    
         
            +
              # Called from #current_user.  Finaly, attempt to login by an expiring token in the cookie.
         
     | 
| 
      
 15 
     | 
    
         
            +
              # for the paranoid: we _should_ be storing user_token = hash(cookie_token, request IP)
         
     | 
| 
      
 16 
     | 
    
         
            +
              def login_from_cookie
         
     | 
| 
      
 17 
     | 
    
         
            +
                current_user = cookies[:auth_token] && Merb::Authentication.user_class.first(:conditions => ["remember_token = ?", cookies[:auth_token]])
         
     | 
| 
      
 18 
     | 
    
         
            +
                if current_user && current_user.remember_token?
         
     | 
| 
      
 19 
     | 
    
         
            +
                  handle_remember_cookie! false # freshen cookie token (keeping date)
         
     | 
| 
      
 20 
     | 
    
         
            +
                  current_user
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
              end
         
     | 
| 
      
 23 
     | 
    
         
            +
              
         
     | 
| 
      
 24 
     | 
    
         
            +
              #
         
     | 
| 
      
 25 
     | 
    
         
            +
              # Remember_me Tokens
         
     | 
| 
      
 26 
     | 
    
         
            +
              #
         
     | 
| 
      
 27 
     | 
    
         
            +
              # Cookies shouldn't be allowed to persist past their freshness date,
         
     | 
| 
      
 28 
     | 
    
         
            +
              # and they should be changed at each login
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
              # Cookies shouldn't be allowed to persist past their freshness date,
         
     | 
| 
      
 31 
     | 
    
         
            +
              # and they should be changed at each login
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
              def valid_remember_cookie?
         
     | 
| 
      
 34 
     | 
    
         
            +
                return nil unless current_user
         
     | 
| 
      
 35 
     | 
    
         
            +
                (current_user.remember_token?) && 
         
     | 
| 
      
 36 
     | 
    
         
            +
                  (cookies[:auth_token] == current_user.remember_token)
         
     | 
| 
      
 37 
     | 
    
         
            +
              end
         
     | 
| 
      
 38 
     | 
    
         
            +
              
         
     | 
| 
      
 39 
     | 
    
         
            +
              # Refresh the cookie auth token if it exists, create it otherwise
         
     | 
| 
      
 40 
     | 
    
         
            +
              def handle_remember_cookie! new_cookie_flag
         
     | 
| 
      
 41 
     | 
    
         
            +
                return unless current_user
         
     | 
| 
      
 42 
     | 
    
         
            +
                case
         
     | 
| 
      
 43 
     | 
    
         
            +
                when valid_remember_cookie? then current_user.refresh_token # keeping same expiry date
         
     | 
| 
      
 44 
     | 
    
         
            +
                when new_cookie_flag        then current_user.remember_me 
         
     | 
| 
      
 45 
     | 
    
         
            +
                else                             current_user.forget_me
         
     | 
| 
      
 46 
     | 
    
         
            +
                end
         
     | 
| 
      
 47 
     | 
    
         
            +
                send_remember_cookie!
         
     | 
| 
      
 48 
     | 
    
         
            +
              end
         
     | 
| 
      
 49 
     | 
    
         
            +
              
         
     | 
| 
      
 50 
     | 
    
         
            +
              def send_remember_cookie!
         
     | 
| 
      
 51 
     | 
    
         
            +
                cookies.set_cookie(:auth_token, current_user.remember_token, :expires => current_user.remember_token_expires_at.to_time)
         
     | 
| 
      
 52 
     | 
    
         
            +
              end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
            end
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
         @@ -0,0 +1,34 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require File.dirname(__FILE__) + '/../spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe "Authenticated user" do
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              before :all do
         
     | 
| 
      
 6 
     | 
    
         
            +
                @user = user.new
         
     | 
| 
      
 7 
     | 
    
         
            +
                @user.remember_token_expires_at.should be_nil
         
     | 
| 
      
 8 
     | 
    
         
            +
                @user.remember_token.should be_nil
         
     | 
| 
      
 9 
     | 
    
         
            +
              end
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
              it "should add the 'remember_token_expires_at' property to the user model" do
         
     | 
| 
      
 12 
     | 
    
         
            +
                @user.should respond_to(:remember_token_expires_at)
         
     | 
| 
      
 13 
     | 
    
         
            +
                @user.should respond_to(:remember_token_expires_at=)
         
     | 
| 
      
 14 
     | 
    
         
            +
              end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
              it "should add the 'remember_token' property to the user model" do
         
     | 
| 
      
 17 
     | 
    
         
            +
                @user.should respond_to(:remember_token)
         
     | 
| 
      
 18 
     | 
    
         
            +
                @user.should respond_to(:remember_token=)
         
     | 
| 
      
 19 
     | 
    
         
            +
              end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
              it "should save token and expires_at" do
         
     | 
| 
      
 22 
     | 
    
         
            +
                @user.remember_me
         
     | 
| 
      
 23 
     | 
    
         
            +
                @user.remember_token_expires_at.should_not be_nil
         
     | 
| 
      
 24 
     | 
    
         
            +
                @user.remember_token.should_not be_nil
         
     | 
| 
      
 25 
     | 
    
         
            +
              end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
              it "should save expires_at as 2 weeks later" do
         
     | 
| 
      
 28 
     | 
    
         
            +
                @user.remember_me
         
     | 
| 
      
 29 
     | 
    
         
            +
                @user.remember_token_expires_at.should eql((Time.now+2.weeks).to_datetime)
         
     | 
| 
      
 30 
     | 
    
         
            +
              end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
            end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
    
        data/spec/spec_helper.rb
    ADDED
    
    | 
         @@ -0,0 +1,101 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            $:.push File.join(File.dirname(__FILE__), '..', 'lib')
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'rubygems'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'activesupport'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'merb-core'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'dm-core'
         
     | 
| 
      
 7 
     | 
    
         
            +
            require 'do_sqlite3'
         
     | 
| 
      
 8 
     | 
    
         
            +
            require 'merb-auth-core'
         
     | 
| 
      
 9 
     | 
    
         
            +
            require 'merb-auth-more'
         
     | 
| 
      
 10 
     | 
    
         
            +
            require 'merb-auth-more/mixins/redirect_back'
         
     | 
| 
      
 11 
     | 
    
         
            +
            require 'spec'
         
     | 
| 
      
 12 
     | 
    
         
            +
            require 'merb-auth-remember-me'
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            Merb.start_environment(
         
     | 
| 
      
 15 
     | 
    
         
            +
              :testing => true, 
         
     | 
| 
      
 16 
     | 
    
         
            +
              :adapter => 'runner', 
         
     | 
| 
      
 17 
     | 
    
         
            +
              :environment => ENV['MERB_ENV'] || 'test',
         
     | 
| 
      
 18 
     | 
    
         
            +
            #  :merb_root => Merb.root,
         
     | 
| 
      
 19 
     | 
    
         
            +
              :session_store => :cookie,
         
     | 
| 
      
 20 
     | 
    
         
            +
              :exception_details => true,
         
     | 
| 
      
 21 
     | 
    
         
            +
              :session_secret_key => "d3a6d6f99a25004dd82b71af8bded0ab71d3ea21"
         
     | 
| 
      
 22 
     | 
    
         
            +
              
         
     | 
| 
      
 23 
     | 
    
         
            +
            )
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            DataMapper.setup(:default, "sqlite3::memory:")
         
     | 
| 
      
 26 
     | 
    
         
            +
                
         
     | 
| 
      
 27 
     | 
    
         
            +
            class User
         
     | 
| 
      
 28 
     | 
    
         
            +
              include DataMapper::Resource
         
     | 
| 
      
 29 
     | 
    
         
            +
              include Merb::Authentication::Mixins::AuthenticatedUser
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
              property :id, Serial
         
     | 
| 
      
 32 
     | 
    
         
            +
              property :email, String
         
     | 
| 
      
 33 
     | 
    
         
            +
              property :login, String
         
     | 
| 
      
 34 
     | 
    
         
            +
            end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
            Merb::Authentication.user_class = User
         
     | 
| 
      
 37 
     | 
    
         
            +
            def user
         
     | 
| 
      
 38 
     | 
    
         
            +
              Merb::Authentication.user_class
         
     | 
| 
      
 39 
     | 
    
         
            +
            end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
            # for strategy 
         
     | 
| 
      
 43 
     | 
    
         
            +
            Merb::Config[:exception_details] = true
         
     | 
| 
      
 44 
     | 
    
         
            +
            Merb::Router.reset!
         
     | 
| 
      
 45 
     | 
    
         
            +
            Merb::Router.prepare do
         
     | 
| 
      
 46 
     | 
    
         
            +
              match("/login", :method => :get).to(:controller => "exceptions", :action => "unauthenticated").name(:login)
         
     | 
| 
      
 47 
     | 
    
         
            +
              match("/login", :method => :put).to(:controller => "sessions", :action => "update")
         
     | 
| 
      
 48 
     | 
    
         
            +
              
         
     | 
| 
      
 49 
     | 
    
         
            +
              authenticate do
         
     | 
| 
      
 50 
     | 
    
         
            +
                match("/").to(:controller => "my_controller")
         
     | 
| 
      
 51 
     | 
    
         
            +
              end
         
     | 
| 
      
 52 
     | 
    
         
            +
              match("/logout", :method => :delete).to(:controller => "sessions", :action => "destroy")
         
     | 
| 
      
 53 
     | 
    
         
            +
            end
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
            class Merb::Authentication
         
     | 
| 
      
 56 
     | 
    
         
            +
              def store_user(user); user; end
         
     | 
| 
      
 57 
     | 
    
         
            +
              def fetch_user(session_info); session_info; end
         
     | 
| 
      
 58 
     | 
    
         
            +
            end
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
            Merb::Authentication.activate!(:remember_me)
         
     | 
| 
      
 61 
     | 
    
         
            +
            Merb::Authentication.activate!(:default_password_form)
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
            class MockUserStrategy < Merb::Authentication::Strategy
         
     | 
| 
      
 64 
     | 
    
         
            +
              def run!
         
     | 
| 
      
 65 
     | 
    
         
            +
                params[:pass_auth] = if params[:pass_auth] == "false"
         
     | 
| 
      
 66 
     | 
    
         
            +
                  false 
         
     | 
| 
      
 67 
     | 
    
         
            +
                else
         
     | 
| 
      
 68 
     | 
    
         
            +
                  Merb::Authentication.user_class.first
         
     | 
| 
      
 69 
     | 
    
         
            +
                end
         
     | 
| 
      
 70 
     | 
    
         
            +
                params[:pass_auth]
         
     | 
| 
      
 71 
     | 
    
         
            +
              end
         
     | 
| 
      
 72 
     | 
    
         
            +
            end
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
            class Application < Merb::Controller; end
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
            class Sessions < Merb::Controller
         
     | 
| 
      
 77 
     | 
    
         
            +
              before :ensure_authenticated
         
     | 
| 
      
 78 
     | 
    
         
            +
              def update
         
     | 
| 
      
 79 
     | 
    
         
            +
                redirect "/"
         
     | 
| 
      
 80 
     | 
    
         
            +
              end
         
     | 
| 
      
 81 
     | 
    
         
            +
              
         
     | 
| 
      
 82 
     | 
    
         
            +
              def destroy
         
     | 
| 
      
 83 
     | 
    
         
            +
                cookies.delete :auth_token
         
     | 
| 
      
 84 
     | 
    
         
            +
                session.abandon!
         
     | 
| 
      
 85 
     | 
    
         
            +
              end      
         
     | 
| 
      
 86 
     | 
    
         
            +
            end
         
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
      
 88 
     | 
    
         
            +
            class MyController < Application
         
     | 
| 
      
 89 
     | 
    
         
            +
              def index
         
     | 
| 
      
 90 
     | 
    
         
            +
                "IN MY CONTROLLER"
         
     | 
| 
      
 91 
     | 
    
         
            +
              end
         
     | 
| 
      
 92 
     | 
    
         
            +
            end
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
      
 94 
     | 
    
         
            +
            Spec::Runner.configure do |config|
         
     | 
| 
      
 95 
     | 
    
         
            +
              config.include(Merb::Test::ViewHelper)
         
     | 
| 
      
 96 
     | 
    
         
            +
              config.include(Merb::Test::RouteHelper)
         
     | 
| 
      
 97 
     | 
    
         
            +
              config.include(Merb::Test::ControllerHelper)
         
     | 
| 
      
 98 
     | 
    
         
            +
              config.before(:all){ User.auto_migrate! }
         
     | 
| 
      
 99 
     | 
    
         
            +
              config.after(:all){ User.all.destroy! }
         
     | 
| 
      
 100 
     | 
    
         
            +
            end
         
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
         @@ -0,0 +1,63 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require File.dirname(__FILE__) + '/../spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe "Remember me strategy" do
         
     | 
| 
      
 4 
     | 
    
         
            +
              def do_valid_login
         
     | 
| 
      
 5 
     | 
    
         
            +
                put("/login", {:remember_me => "1", :pass_auth => true})
         
     | 
| 
      
 6 
     | 
    
         
            +
              end
         
     | 
| 
      
 7 
     | 
    
         
            +
              
         
     | 
| 
      
 8 
     | 
    
         
            +
              def do_valid_login_without_remember_me
         
     | 
| 
      
 9 
     | 
    
         
            +
                put("/login", {:pass_auth => true})
         
     | 
| 
      
 10 
     | 
    
         
            +
              end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
              def do_invalid_login
         
     | 
| 
      
 13 
     | 
    
         
            +
                put("/login", { :pass_auth => false})
         
     | 
| 
      
 14 
     | 
    
         
            +
              end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
              def do_home_with_auth_token
         
     | 
| 
      
 17 
     | 
    
         
            +
                get("/", { :pass_auth => true} ) do |controller|
         
     | 
| 
      
 18 
     | 
    
         
            +
                  controller.request.cookies[:auth_token] = "auth_token_string"
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
      
 20 
     | 
    
         
            +
              end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
              before :each do
         
     | 
| 
      
 23 
     | 
    
         
            +
                @user = mock(Merb::Authentication.user_class, :remember_me => true)
         
     | 
| 
      
 24 
     | 
    
         
            +
                user.stub!(:first).and_return(@user)
         
     | 
| 
      
 25 
     | 
    
         
            +
                @user.stub!(:remember_token?).and_return(true)
         
     | 
| 
      
 26 
     | 
    
         
            +
                @user.stub!(:remember_token).and_return(Time.now + 1.week)
         
     | 
| 
      
 27 
     | 
    
         
            +
                @user.stub!(:remember_token_expires_at).and_return(Time.now)
         
     | 
| 
      
 28 
     | 
    
         
            +
                @user.stub!(:forget_me).and_return(true)
         
     | 
| 
      
 29 
     | 
    
         
            +
              end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
              it "should save remember_token and remember_token_expires_at if remember_me == '1'" do
         
     | 
| 
      
 32 
     | 
    
         
            +
                Merb::Authentication.user_class.should_receive(:first).and_return(@user)
         
     | 
| 
      
 33 
     | 
    
         
            +
                @user.should_receive(:remember_me)
         
     | 
| 
      
 34 
     | 
    
         
            +
                @user.remember_token.should_not be_nil
         
     | 
| 
      
 35 
     | 
    
         
            +
                @user.remember_token_expires_at.should_not be_nil
         
     | 
| 
      
 36 
     | 
    
         
            +
                do_valid_login.should redirect_to('/')
         
     | 
| 
      
 37 
     | 
    
         
            +
              end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
              it "should not remember me unless remember_me == '1'" do 
         
     | 
| 
      
 40 
     | 
    
         
            +
                Merb::Authentication.user_class.should_receive(:first).and_return(true)
         
     | 
| 
      
 41 
     | 
    
         
            +
                @user.should_not_receive(:remember_me)
         
     | 
| 
      
 42 
     | 
    
         
            +
                do_valid_login_without_remember_me.should redirect_to('/')
         
     | 
| 
      
 43 
     | 
    
         
            +
              end
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
              it "should log in automatically if auth_token exists" do
         
     | 
| 
      
 46 
     | 
    
         
            +
                Merb::Authentication.user_class.should_receive(:first).and_return(@user)
         
     | 
| 
      
 47 
     | 
    
         
            +
                do_home_with_auth_token.should be_successful
         
     | 
| 
      
 48 
     | 
    
         
            +
              end
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
              it "should raise unauthenticated if auth_token doesn't exist" do
         
     | 
| 
      
 51 
     | 
    
         
            +
                lambda do
         
     | 
| 
      
 52 
     | 
    
         
            +
                  do_invalid_login
         
     | 
| 
      
 53 
     | 
    
         
            +
                end.should raise_error(Merb::Controller::Unauthenticated, "Could not log in")
         
     | 
| 
      
 54 
     | 
    
         
            +
              end
         
     | 
| 
      
 55 
     | 
    
         
            +
              
         
     | 
| 
      
 56 
     | 
    
         
            +
              it "should clear auth_token after loging out" do
         
     | 
| 
      
 57 
     | 
    
         
            +
                delete('/logout') do |controller|
         
     | 
| 
      
 58 
     | 
    
         
            +
                  controller.cookies.should_receive(:delete).with(:auth_token)
         
     | 
| 
      
 59 
     | 
    
         
            +
                end
         
     | 
| 
      
 60 
     | 
    
         
            +
              end
         
     | 
| 
      
 61 
     | 
    
         
            +
            end
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
    
        metadata
    ADDED
    
    | 
         @@ -0,0 +1,84 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            --- !ruby/object:Gem::Specification 
         
     | 
| 
      
 2 
     | 
    
         
            +
            name: rughetto-merb-auth-remember-me
         
     | 
| 
      
 3 
     | 
    
         
            +
            version: !ruby/object:Gem::Version 
         
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.0.1
         
     | 
| 
      
 5 
     | 
    
         
            +
            platform: ruby
         
     | 
| 
      
 6 
     | 
    
         
            +
            authors: 
         
     | 
| 
      
 7 
     | 
    
         
            +
            - Surasit Liangpornrattana
         
     | 
| 
      
 8 
     | 
    
         
            +
            autorequire: 
         
     | 
| 
      
 9 
     | 
    
         
            +
            bindir: bin
         
     | 
| 
      
 10 
     | 
    
         
            +
            cert_chain: []
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            date: 2009-02-27 00:00:00 -08:00
         
     | 
| 
      
 13 
     | 
    
         
            +
            default_executable: 
         
     | 
| 
      
 14 
     | 
    
         
            +
            dependencies: 
         
     | 
| 
      
 15 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency 
         
     | 
| 
      
 16 
     | 
    
         
            +
              name: merb-core
         
     | 
| 
      
 17 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 18 
     | 
    
         
            +
              version_requirement: 
         
     | 
| 
      
 19 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement 
         
     | 
| 
      
 20 
     | 
    
         
            +
                requirements: 
         
     | 
| 
      
 21 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 22 
     | 
    
         
            +
                  - !ruby/object:Gem::Version 
         
     | 
| 
      
 23 
     | 
    
         
            +
                    version: "1.0"
         
     | 
| 
      
 24 
     | 
    
         
            +
                version: 
         
     | 
| 
      
 25 
     | 
    
         
            +
            description: Merb plugin that provides remember me for merb-auth-slice-password
         
     | 
| 
      
 26 
     | 
    
         
            +
            email: punneng@gmail.com
         
     | 
| 
      
 27 
     | 
    
         
            +
            executables: []
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
            extensions: []
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
            extra_rdoc_files: 
         
     | 
| 
      
 32 
     | 
    
         
            +
            - README
         
     | 
| 
      
 33 
     | 
    
         
            +
            - LICENSE
         
     | 
| 
      
 34 
     | 
    
         
            +
            - TODO
         
     | 
| 
      
 35 
     | 
    
         
            +
            files: 
         
     | 
| 
      
 36 
     | 
    
         
            +
            - LICENSE
         
     | 
| 
      
 37 
     | 
    
         
            +
            - README
         
     | 
| 
      
 38 
     | 
    
         
            +
            - Rakefile
         
     | 
| 
      
 39 
     | 
    
         
            +
            - TODO
         
     | 
| 
      
 40 
     | 
    
         
            +
            - lib/merb-auth-remember-me
         
     | 
| 
      
 41 
     | 
    
         
            +
            - lib/merb-auth-remember-me/merbtasks.rb
         
     | 
| 
      
 42 
     | 
    
         
            +
            - lib/merb-auth-remember-me/mixins
         
     | 
| 
      
 43 
     | 
    
         
            +
            - lib/merb-auth-remember-me/mixins/authenticated_user
         
     | 
| 
      
 44 
     | 
    
         
            +
            - lib/merb-auth-remember-me/mixins/authenticated_user/ar_authenticated_user.rb
         
     | 
| 
      
 45 
     | 
    
         
            +
            - lib/merb-auth-remember-me/mixins/authenticated_user/dm_authenticated_user.rb
         
     | 
| 
      
 46 
     | 
    
         
            +
            - lib/merb-auth-remember-me/mixins/authenticated_user/sq_authenticated_user.rb
         
     | 
| 
      
 47 
     | 
    
         
            +
            - lib/merb-auth-remember-me/mixins/authenticated_user.rb
         
     | 
| 
      
 48 
     | 
    
         
            +
            - lib/merb-auth-remember-me/strategies
         
     | 
| 
      
 49 
     | 
    
         
            +
            - lib/merb-auth-remember-me/strategies/remember_me.rb
         
     | 
| 
      
 50 
     | 
    
         
            +
            - lib/merb-auth-remember-me.rb
         
     | 
| 
      
 51 
     | 
    
         
            +
            - spec/merb-auth-remember-me_spec.rb
         
     | 
| 
      
 52 
     | 
    
         
            +
            - spec/mixins
         
     | 
| 
      
 53 
     | 
    
         
            +
            - spec/mixins/authenticated_user_spec.rb
         
     | 
| 
      
 54 
     | 
    
         
            +
            - spec/spec_helper.rb
         
     | 
| 
      
 55 
     | 
    
         
            +
            - spec/strategies
         
     | 
| 
      
 56 
     | 
    
         
            +
            - spec/strategies/remember_me_spec.rb
         
     | 
| 
      
 57 
     | 
    
         
            +
            has_rdoc: true
         
     | 
| 
      
 58 
     | 
    
         
            +
            homepage: https://github.com/PunNeng/pn-merb-auth-remember-me
         
     | 
| 
      
 59 
     | 
    
         
            +
            post_install_message: 
         
     | 
| 
      
 60 
     | 
    
         
            +
            rdoc_options: []
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
            require_paths: 
         
     | 
| 
      
 63 
     | 
    
         
            +
            - lib
         
     | 
| 
      
 64 
     | 
    
         
            +
            required_ruby_version: !ruby/object:Gem::Requirement 
         
     | 
| 
      
 65 
     | 
    
         
            +
              requirements: 
         
     | 
| 
      
 66 
     | 
    
         
            +
              - - ">="
         
     | 
| 
      
 67 
     | 
    
         
            +
                - !ruby/object:Gem::Version 
         
     | 
| 
      
 68 
     | 
    
         
            +
                  version: "0"
         
     | 
| 
      
 69 
     | 
    
         
            +
              version: 
         
     | 
| 
      
 70 
     | 
    
         
            +
            required_rubygems_version: !ruby/object:Gem::Requirement 
         
     | 
| 
      
 71 
     | 
    
         
            +
              requirements: 
         
     | 
| 
      
 72 
     | 
    
         
            +
              - - ">="
         
     | 
| 
      
 73 
     | 
    
         
            +
                - !ruby/object:Gem::Version 
         
     | 
| 
      
 74 
     | 
    
         
            +
                  version: "0"
         
     | 
| 
      
 75 
     | 
    
         
            +
              version: 
         
     | 
| 
      
 76 
     | 
    
         
            +
            requirements: []
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
            rubyforge_project: merb
         
     | 
| 
      
 79 
     | 
    
         
            +
            rubygems_version: 1.2.0
         
     | 
| 
      
 80 
     | 
    
         
            +
            signing_key: 
         
     | 
| 
      
 81 
     | 
    
         
            +
            specification_version: 2
         
     | 
| 
      
 82 
     | 
    
         
            +
            summary: Merb plugin that provides remember me for merb-auth-slice-password
         
     | 
| 
      
 83 
     | 
    
         
            +
            test_files: []
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     |