diff --git a/Gemfile b/Gemfile index bd5370c..6d46dde 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,12 @@ source 'http://rubygems.org' +# alternative servers (because openID URIs are too long for WEBRick) +gem 'mongrel', '1.2.0.pre2' +# gem 'thin' + + +gem 'rake', '0.8.7' + gem 'rails', '3.0.5' gem 'jquery-rails', '>= 0.2.6' @@ -13,7 +20,13 @@ gem 'httparty' gem 'hashie' # authentication, authorization, roles -#gem 'cream' +gem 'devise' +gem 'oa-oauth', :require => 'omniauth/oauth' +gem 'oa-openid', :require => 'omniauth/openid' +# gem 'cream' + +# for file upload ( -> avatar ) +gem 'paperclip', '~> 2.3' # youtube search gem 'youtube_it' diff --git a/Gemfile.lock b/Gemfile.lock index cae9efb..a10482e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -28,11 +28,24 @@ GEM activemodel (= 3.0.5) activesupport (= 3.0.5) activesupport (3.0.5) - arel (2.0.9) + addressable (2.2.6) + arel (2.0.10) + bcrypt-ruby (2.1.4) + bcrypt-ruby (2.1.4-x86-mingw32) builder (2.1.2) crack (0.1.8) + daemons (1.0.10) + devise (1.3.4) + bcrypt-ruby (~> 2.1.2) + orm_adapter (~> 0.0.3) + warden (~> 1.0.3) erubis (2.6.6) abstract (>= 1.0.0) + faraday (0.6.1) + addressable (~> 2.2.4) + multipart-post (~> 1.1.0) + rack (< 2, >= 1.1.0) + gem_plugin (0.2.3) haml (3.1.1) haml-rails (0.3.4) actionpack (~> 3.0) @@ -42,9 +55,9 @@ GEM hashie (1.0.0) httparty (0.7.7) crack (= 0.1.8) - i18n (0.5.0) - jquery-rails (1.0) - rails (~> 3.0) + i18n (0.6.0) + jquery-rails (1.0.9) + railties (~> 3.0) thor (~> 0.14) mail (2.2.19) activesupport (>= 2.3.6) @@ -52,11 +65,41 @@ GEM mime-types (~> 1.16) treetop (~> 1.4.8) mime-types (1.16) + mongrel (1.2.0.pre2) + daemons (~> 1.0.10) + gem_plugin (~> 0.2.3) + mongrel (1.2.0.pre2-x86-mingw32) + gem_plugin (~> 0.2.3) + multi_json (1.0.3) + multi_xml (0.2.2) + multipart-post (1.1.2) + oa-core (0.2.6) + oa-oauth (0.2.6) + faraday (~> 0.6.1) + multi_json (~> 1.0.0) + multi_xml (~> 0.2.2) + oa-core (= 0.2.6) + oauth (~> 0.4.0) + oauth2 (~> 0.4.1) + oa-openid (0.2.6) + oa-core (= 0.2.6) + rack-openid (~> 1.3.1) + ruby-openid-apps-discovery (~> 1.2.0) oauth (0.4.4) + oauth2 (0.4.1) + faraday (~> 0.6.1) + multi_json (>= 0.0.5) + orm_adapter (0.0.5) + paperclip (2.3.11) + activerecord (>= 2.3.0) + activesupport (>= 2.3.2) polyglot (0.3.1) - rack (1.2.2) + rack (1.2.3) rack-mount (0.6.14) rack (>= 1.0.0) + rack-openid (1.3.1) + rack (>= 1.1.0) + ruby-openid (>= 2.1.8) rack-test (0.5.7) rack (>= 1.0) rails (3.0.5) @@ -73,6 +116,9 @@ GEM rake (>= 0.8.7) thor (~> 0.14.4) rake (0.8.7) + ruby-openid (2.1.8) + ruby-openid-apps-discovery (1.2.0) + ruby-openid (>= 2.1.7) ruby_parser (2.0.6) sexp_processor (~> 3.0) sexp_processor (3.0.5) @@ -84,7 +130,9 @@ GEM treetop (1.4.9) polyglot (>= 0.3.1) tzinfo (0.3.27) - youtube_it (1.4.2) + warden (1.0.4) + rack (>= 1.0) + youtube_it (1.4.3) builder oauth (>= 0.4.4) @@ -93,11 +141,17 @@ PLATFORMS x86-mingw32 DEPENDENCIES + devise haml-rails hashie httparty jquery-rails (>= 0.2.6) + mongrel (= 1.2.0.pre2) + oa-oauth + oa-openid + paperclip (~> 2.3) rails (= 3.0.5) + rake (= 0.8.7) ruby_parser sqlite3 sqlite3-ruby diff --git a/app/controllers/users/omniauth_callbacks_controller.rb b/app/controllers/users/omniauth_callbacks_controller.rb new file mode 100644 index 0000000..c26a7a9 --- /dev/null +++ b/app/controllers/users/omniauth_callbacks_controller.rb @@ -0,0 +1,32 @@ +class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController + + def facebook + # You need to implement the method below in your model + @user = User.find_for_facebook_oauth(env["omniauth.auth"], current_user) + + if @user.persisted? + flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Facebook" + sign_in_and_redirect @user, :event => :authentication + else + session["devise.facebook_data"] = env["omniauth.auth"] + redirect_to new_user_registration_url + end + end + + def open_id + # You need to implement the method below in your model + @user = User.find_for_open_id(env["omniauth.auth"], current_user) + if @user.persisted? + flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Google" + sign_in_and_redirect @user, :event => :authentication + else + session["devise.open:id_data"] = env["openid.ext1"] + redirect_to new_user_registration_url + end + end + + def passthru + render :file => "#{Rails.root}/public/404.html", :status => 404, :layout => false + end + +end \ No newline at end of file diff --git a/app/models/user.rb b/app/models/user.rb new file mode 100644 index 0000000..547ba6f --- /dev/null +++ b/app/models/user.rb @@ -0,0 +1,37 @@ +class User < ActiveRecord::Base + # Include default devise modules. Others available are: + # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable + devise :database_authenticatable, :registerable, :omniauthable, + :recoverable, :rememberable, :trackable, :validatable + + # Setup accessible (or protected) attributes for your model + attr_accessible :username, :email, :password, :password_confirmation, :remember_me + has_attached_file :avatar, :styles => { :original => "200x200>", :thumb => "60x60>" } + + def self.new_with_session(params, session) + super.tap do |user| + if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["user_hash"] + user.email = data["email"] + end + end + end + + def self.find_for_facebook_oauth(access_token, signed_in_resource=nil) + data = access_token['extra']['user_hash'] + if user = User.find_by_email(data["email"]) + user + else # Create a user with a stub password. + User.create!(:email => data["email"], :password => Devise.friendly_token[0,20]) + end + end + + def self.find_for_open_id(access_token, signed_in_resource=nil) + data = access_token['user_info'] + if user = User.find_by_email(data["email"]) + user + else # Create a user with a stub password. + User.create!(:email => data["email"], :password => Devise.friendly_token[0,20]) + end + end + +end diff --git a/app/views/devise/confirmations/new.html.erb b/app/views/devise/confirmations/new.html.erb new file mode 100644 index 0000000..da93af2 --- /dev/null +++ b/app/views/devise/confirmations/new.html.erb @@ -0,0 +1,12 @@ +
<%= f.label :email %>
+ <%= f.email_field :email %>
<%= f.submit "Resend confirmation instructions" %>
+<% end %> + +<%= render :partial => "devise/shared/links" %> \ No newline at end of file diff --git a/app/views/devise/mailer/confirmation_instructions.html.erb b/app/views/devise/mailer/confirmation_instructions.html.erb new file mode 100644 index 0000000..a6ea8ca --- /dev/null +++ b/app/views/devise/mailer/confirmation_instructions.html.erb @@ -0,0 +1,5 @@ +Welcome <%= @resource.email %>!
+ +You can confirm your account through the link below:
+ +<%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @resource.confirmation_token) %>
diff --git a/app/views/devise/mailer/reset_password_instructions.html.erb b/app/views/devise/mailer/reset_password_instructions.html.erb new file mode 100644 index 0000000..ae9e888 --- /dev/null +++ b/app/views/devise/mailer/reset_password_instructions.html.erb @@ -0,0 +1,8 @@ +Hello <%= @resource.email %>!
+ +Someone has requested a link to change your password, and you can do this through the link below.
+ +<%= link_to 'Change my password', edit_password_url(@resource, :reset_password_token => @resource.reset_password_token) %>
+ +If you didn't request this, please ignore this email.
+Your password won't change until you access the link above and create a new one.
diff --git a/app/views/devise/mailer/unlock_instructions.html.erb b/app/views/devise/mailer/unlock_instructions.html.erb new file mode 100644 index 0000000..2263c21 --- /dev/null +++ b/app/views/devise/mailer/unlock_instructions.html.erb @@ -0,0 +1,7 @@ +Hello <%= @resource.email %>!
+ +Your account has been locked due to an excessive amount of unsuccessful sign in attempts.
+ +Click the link below to unlock your account:
+ +<%= link_to 'Unlock my account', unlock_url(@resource, :unlock_token => @resource.unlock_token) %>
diff --git a/app/views/devise/passwords/edit.html.erb b/app/views/devise/passwords/edit.html.erb new file mode 100644 index 0000000..2b71f9c --- /dev/null +++ b/app/views/devise/passwords/edit.html.erb @@ -0,0 +1,16 @@ +<%= f.label :password, "New password" %>
+ <%= f.password_field :password %>
<%= f.label :password_confirmation, "Confirm new password" %>
+ <%= f.password_field :password_confirmation %>
<%= f.submit "Change my password" %>
+<% end %> + +<%= render :partial => "devise/shared/links" %> \ No newline at end of file diff --git a/app/views/devise/passwords/new.html.erb b/app/views/devise/passwords/new.html.erb new file mode 100644 index 0000000..42f3e64 --- /dev/null +++ b/app/views/devise/passwords/new.html.erb @@ -0,0 +1,12 @@ +<%= f.label :email %>
+ <%= f.email_field :email %>
<%= f.submit "Send me reset password instructions" %>
+<% end %> + +<%= render :partial => "devise/shared/links" %> \ No newline at end of file diff --git a/app/views/devise/registrations/edit.html.erb b/app/views/devise/registrations/edit.html.erb new file mode 100644 index 0000000..7e19228 --- /dev/null +++ b/app/views/devise/registrations/edit.html.erb @@ -0,0 +1,25 @@ +<%= f.label :email %>
+ <%= f.email_field :email %>
<%= f.label :password %> (leave blank if you don't want to change it)
+ <%= f.password_field :password %>
<%= f.label :password_confirmation %>
+ <%= f.password_field :password_confirmation %>
<%= f.label :current_password %> (we need your current password to confirm your changes)
+ <%= f.password_field :current_password %>
<%= f.submit "Update" %>
+<% end %> + +Unhappy? <%= link_to "Cancel my account", registration_path(resource_name), :confirm => "Are you sure?", :method => :delete %>.
+ +<%= link_to "Back", :back %> diff --git a/app/views/devise/registrations/new.html.erb b/app/views/devise/registrations/new.html.erb new file mode 100644 index 0000000..46516e5 --- /dev/null +++ b/app/views/devise/registrations/new.html.erb @@ -0,0 +1,18 @@ +<%= f.label :email %>
+ <%= f.email_field :email %>
<%= f.label :password %>
+ <%= f.password_field :password %>
<%= f.label :password_confirmation %>
+ <%= f.password_field :password_confirmation %>
<%= f.submit "Sign up" %>
+<% end %> + +<%= render :partial => "devise/shared/links" %> diff --git a/app/views/devise/sessions/new.html.erb b/app/views/devise/sessions/new.html.erb new file mode 100644 index 0000000..d03def8 --- /dev/null +++ b/app/views/devise/sessions/new.html.erb @@ -0,0 +1,17 @@ +<%= f.label :email %>
+ <%= f.email_field :email %>
<%= f.label :password %>
+ <%= f.password_field :password %>
<%= f.check_box :remember_me %> <%= f.label :remember_me %>
+ <% end -%> + +<%= f.submit "Sign in" %>
+<% end %> + +<%= render :partial => "devise/shared/links" %> \ No newline at end of file diff --git a/app/views/devise/shared/_links.erb b/app/views/devise/shared/_links.erb new file mode 100644 index 0000000..acc90fd --- /dev/null +++ b/app/views/devise/shared/_links.erb @@ -0,0 +1,24 @@ +<%- if controller_name != 'sessions' %> + <%= link_to "Sign in", new_session_path(resource_name) %><%= f.label :email %>
+ <%= f.email_field :email %>
<%= f.submit "Resend unlock instructions" %>
+<% end %> + +<%= render :partial => "devise/shared/links" %> \ No newline at end of file diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index a68fac0..c784495 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -11,6 +11,12 @@ = csrf_meta_tag %body #site + - if user_signed_in? + %span.bold= "YEAH! ICH BIN DRIN!" + - else + =link_to "Sign In", new_user_session_path + =link_to "Sign Up", new_user_registration_path + =link_to "Sign Out", destroy_user_session_path #head %h1 = link_to image_tag("9minutes.png"), "/" diff --git a/config/environments/development.rb b/config/environments/development.rb index 7797bdd..5f31963 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -20,7 +20,8 @@ Nineminutes::Application.configure do config.action_controller.perform_caching = false # Don't care if the mailer can't send - config.action_mailer.raise_delivery_errors = false + config.action_mailer.raise_delivery_errors = true + config.action_mailer.default_url_options = { :host => 'localhost:3000'} # Print deprecation notices to the Rails logger config.active_support.deprecation = :log diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb new file mode 100644 index 0000000..be8e594 --- /dev/null +++ b/config/initializers/devise.rb @@ -0,0 +1,208 @@ +# Use this hook to configure devise mailer, warden hooks and so forth. The first +# four configuration values can also be set straight in your models. +Devise.setup do |config| + # ==> Mailer Configuration + # Configure the e-mail address which will be shown in DeviseMailer. + config.mailer_sender = "please-change-me-at-config-initializers-devise@example.com" + + # Configure the class responsible to send e-mails. + # config.mailer = "Devise::Mailer" + + # ==> ORM configuration + # Load and configure the ORM. Supports :active_record (default) and + # :mongoid (bson_ext recommended) by default. Other ORMs may be + # available as additional gems. + require 'devise/orm/active_record' + + # ==> Configuration for any authentication mechanism + # Configure which keys are used when authenticating a user. The default is + # just :email. You can configure it to use [:username, :subdomain], so for + # authenticating a user, both parameters are required. Remember that those + # parameters are used only when authenticating and not when retrieving from + # session. If you need permissions, you should implement that in a before filter. + # You can also supply a hash where the value is a boolean determining whether + # or not authentication should be aborted when the value is not present. + # config.authentication_keys = [ :email ] + + # Configure parameters from the request object used for authentication. Each entry + # given should be a request method and it will automatically be passed to the + # find_for_authentication method and considered in your model lookup. For instance, + # if you set :request_keys to [:subdomain], :subdomain will be used on authentication. + # The same considerations mentioned for authentication_keys also apply to request_keys. + # config.request_keys = [] + + # Configure which authentication keys should be case-insensitive. + # These keys will be downcased upon creating or modifying a user and when used + # to authenticate or find a user. Default is :email. + config.case_insensitive_keys = [ :email ] + + # Tell if authentication through request.params is enabled. True by default. + # config.params_authenticatable = true + + # Tell if authentication through HTTP Basic Auth is enabled. False by default. + # config.http_authenticatable = false + + # If http headers should be returned for AJAX requests. True by default. + # config.http_authenticatable_on_xhr = true + + # The realm used in Http Basic Authentication. "Application" by default. + # config.http_authentication_realm = "Application" + + # ==> Configuration for :database_authenticatable + # For bcrypt, this is the cost for hashing the password and defaults to 10. If + # using other encryptors, it sets how many times you want the password re-encrypted. + config.stretches = 10 + + # Setup a pepper to generate the encrypted password. + # config.pepper = "95aa7b12f7af01bb89a7c1f15d90223f92031c5f55338d172cd6bcf278d47f28d904395bd4aa092fde5bdf14477b9cc97e0b10d2bd99636716fd9c5df18a916f" + + # ==> Configuration for :confirmable + # The time you want to give your user to confirm his account. During this time + # he will be able to access your application without confirming. Default is 0.days + # When confirm_within is zero, the user won't be able to sign in without confirming. + # You can use this to let your user access some features of your application + # without confirming the account, but blocking it after a certain period + # (ie 2 days). + # config.confirm_within = 2.days + + # Defines which key will be used when confirming an account + # config.confirmation_keys = [ :email ] + + # ==> Configuration for :rememberable + # The time the user will be remembered without asking for credentials again. + # config.remember_for = 2.weeks + + # If true, a valid remember token can be re-used between multiple browsers. + # config.remember_across_browsers = true + + # If true, extends the user's remember period when remembered via cookie. + # config.extend_remember_period = false + + # If true, uses the password salt as remember token. This should be turned + # to false if you are not using database authenticatable. + config.use_salt_as_remember_token = true + + # Options to be passed to the created cookie. For instance, you can set + # :secure => true in order to force SSL only cookies. + # config.cookie_options = {} + + # ==> Configuration for :validatable + # Range for password length. Default is 6..128. + config.password_length = 4..32 + + # Regex to use to validate the email address + # config.email_regexp = /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\z/i + + # ==> Configuration for :timeoutable + # The time you want to timeout the user session without activity. After this + # time the user will be asked for credentials again. Default is 30 minutes. + # config.timeout_in = 30.minutes + + # ==> Configuration for :lockable + # Defines which strategy will be used to lock an account. + # :failed_attempts = Locks an account after a number of failed attempts to sign in. + # :none = No lock strategy. You should handle locking by yourself. + # config.lock_strategy = :failed_attempts + + # Defines which key will be used when locking and unlocking an account + # config.unlock_keys = [ :email ] + + # Defines which strategy will be used to unlock an account. + # :email = Sends an unlock link to the user email + # :time = Re-enables login after a certain amount of time (see :unlock_in below) + # :both = Enables both strategies + # :none = No unlock strategy. You should handle unlocking by yourself. + # config.unlock_strategy = :both + + # Number of authentication tries before locking an account if lock_strategy + # is failed attempts. + # config.maximum_attempts = 20 + + # Time interval to unlock the account if :time is enabled as unlock_strategy. + # config.unlock_in = 1.hour + + # ==> Configuration for :recoverable + # + # Defines which key will be used when recovering the password for an account + # config.reset_password_keys = [ :email ] + + # Time interval you can reset your password with a reset password key. + # Don't put a too small interval or your users won't have the time to + # change their passwords. + config.reset_password_within = 2.hours + + # ==> Configuration for :encryptable + # Allow you to use another encryption algorithm besides bcrypt (default). You can use + # :sha1, :sha512 or encryptors from others authentication tools as :clearance_sha1, + # :authlogic_sha512 (then you should set stretches above to 20 for default behavior) + # and :restful_authentication_sha1 (then you should set stretches to 10, and copy + # REST_AUTH_SITE_KEY to pepper) + # config.encryptor = :sha512 + + # ==> Configuration for :token_authenticatable + # Defines name of the authentication token params key + # config.token_authentication_key = :auth_token + + # If true, authentication through token does not store user in session and needs + # to be supplied on each request. Useful if you are using the token as API token. + # config.stateless_token = false + + # ==> Scopes configuration + # Turn scoped views on. Before rendering "sessions/new", it will first check for + # "users/sessions/new". It's turned off by default because it's slower if you + # are using only default views. + # config.scoped_views = false + + # Configure the default scope given to Warden. By default it's the first + # devise role declared in your routes (usually :user). + # config.default_scope = :user + + # Configure sign_out behavior. + # Sign_out action can be scoped (i.e. /users/sign_out affects only :user scope). + # The default is true, which means any logout action will sign out all active scopes. + # config.sign_out_all_scopes = true + + # ==> Navigation configuration + # Lists the formats that should be treated as navigational. Formats like + # :html, should redirect to the sign in page when the user does not have + # access, but formats like :xml or :json, should return 401. + # + # If you have any extra navigational formats, like :iphone or :mobile, you + # should add them to the navigational formats lists. + # + # The :"*/*" and "*/*" formats below is required to match Internet + # Explorer requests. + # config.navigational_formats = [:"*/*", "*/*", :html] + + # The default HTTP method used to sign out a resource. Default is :get. + # config.sign_out_via = :get + + # ==> OmniAuth + require 'openid/store/filesystem' + # Add a new OmniAuth provider. Check the wiki for more information on setting + # up on your models and hooks. + # config.omniauth :github, 'APP_ID', 'APP_SECRET', :scope => 'user,public_repo' + + # Facebook-Setting for Heroku + # config.omniauth :facebook, 'APP_ID', 'APP_SECRET', + # {:scope => 'email, offline_access', :client_options => {:ssl => {:ca_file => '/usr/lib/ssl/certs/ca-certificates.crt'}}} + + if Rails.env =~ /development/ + config.omniauth :facebook, 'DEV_APP_ID', 'DEV_APP_SECRET' + else + config.omniauth :facebook, 'APP_ID', 'APP_SECRET' + end + config.omniauth :open_id, OpenID::Store::Filesystem.new('/tmp') + # config.omniauth :open_id, OpenID::Store::Filesystem.new('/tmp'), :name => 'google', :identifier => 'https://www.google.com/accounts/o8/id' + # config.omniauth :twitter, 'CONSUMER_KEY', 'CONSUMER_SECRET' + + # ==> Warden configuration + # If you want to use other strategies, that are not supported by Devise, or + # change the failure app, you can configure them inside the config.warden block. + # + # config.warden do |manager| + # manager.failure_app = AnotherApp + # manager.intercept_401 = false + # manager.default_strategies(:scope => :user).unshift :some_external_strategy + # end +end diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb index 4f46b2e..6c75afb 100644 --- a/config/initializers/session_store.rb +++ b/config/initializers/session_store.rb @@ -5,4 +5,4 @@ Nineminutes::Application.config.session_store :cookie_store, :key => '_nineminut # Use the database for sessions instead of the cookie-based default, # which shouldn't be used to store highly confidential information # (create the session table with "rails generate session_migration") -# Nineminutes::Application.config.session_store :active_record_store +# Nineminutes::Application.config.session_store :active_record_store \ No newline at end of file diff --git a/config/locales/devise.en.yml b/config/locales/devise.en.yml new file mode 100644 index 0000000..25022e1 --- /dev/null +++ b/config/locales/devise.en.yml @@ -0,0 +1,50 @@ +# Additional translations at http://github.com/plataformatec/devise/wiki/I18n + +en: + errors: + messages: + expired: "has expired, please request a new one" + not_found: "not found" + already_confirmed: "was already confirmed, please try signing in" + not_locked: "was not locked" + not_saved: + one: "1 error prohibited this %{resource} from being saved:" + other: "%{count} errors prohibited this %{resource} from being saved:" + + devise: + failure: + already_authenticated: 'You are already signed in.' + unauthenticated: 'You need to sign in or sign up before continuing.' + unconfirmed: 'You have to confirm your account before continuing.' + locked: 'Your account is locked.' + invalid: 'Invalid email or password.' + invalid_token: 'Invalid authentication token.' + timeout: 'Your session expired, please sign in again to continue.' + inactive: 'Your account was not activated yet.' + sessions: + signed_in: 'Signed in successfully.' + signed_out: 'Signed out successfully.' + passwords: + send_instructions: 'You will receive an email with instructions about how to reset your password in a few minutes.' + updated: 'Your password was changed successfully. You are now signed in.' + confirmations: + send_instructions: 'You will receive an email with instructions about how to confirm your account in a few minutes.' + confirmed: 'Your account was successfully confirmed. You are now signed in.' + registrations: + signed_up: 'Welcome! You have signed up successfully.' + inactive_signed_up: 'You have signed up successfully. However, we could not sign you in because your account is %{reason}.' + updated: 'You updated your account successfully.' + destroyed: 'Bye! Your account was successfully cancelled. We hope to see you again soon.' + unlocks: + send_instructions: 'You will receive an email with instructions about how to unlock your account in a few minutes.' + unlocked: 'Your account was successfully unlocked. You are now signed in.' + omniauth_callbacks: + success: 'Successfully authorized from %{kind} account.' + failure: 'Could not authorize you from %{kind} because "%{reason}".' + mailer: + confirmation_instructions: + subject: 'Confirmation instructions' + reset_password_instructions: + subject: 'Reset password instructions' + unlock_instructions: + subject: 'Unlock Instructions' diff --git a/config/routes.rb b/config/routes.rb index 7c9c26e..f3d90ce 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,10 +1,17 @@ Nineminutes::Application.routes.draw do + devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" } + devise_scope :user do + get '/users/auth/:provider' => 'users/omniauth_callbacks#passthru' + end + get "tracks/index" resources :artists, :constraints => { :id => /.*/ } resources :search resources :home + resources :users + # The priority is based upon order of creation: # first created -> highest priority. diff --git a/db/migrate/20110530120922_devise_create_users.rb b/db/migrate/20110530120922_devise_create_users.rb new file mode 100644 index 0000000..78691cc --- /dev/null +++ b/db/migrate/20110530120922_devise_create_users.rb @@ -0,0 +1,31 @@ +class DeviseCreateUsers < ActiveRecord::Migration + def self.up + create_table :users do |t| + t.string :username + t.integer :playcount, :default => 0 + + t.database_authenticatable :null => false + t.recoverable + t.rememberable + t.trackable + + # t.encryptable + # t.confirmable + # t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both + # t.token_authenticatable + + t.timestamps + end + + add_index :users, :username, :unique => true + add_index :users, :email, :unique => true + add_index :users, :reset_password_token, :unique => true + # add_index :users, :confirmation_token, :unique => true + # add_index :users, :unlock_token, :unique => true + # add_index :users, :authentication_token, :unique => true + end + + def self.down + drop_table :users + end +end diff --git a/db/migrate/20110530191034_add_avatar_columns_to_user.rb b/db/migrate/20110530191034_add_avatar_columns_to_user.rb new file mode 100644 index 0000000..d4470e2 --- /dev/null +++ b/db/migrate/20110530191034_add_avatar_columns_to_user.rb @@ -0,0 +1,15 @@ +class AddAvatarColumnsToUser < ActiveRecord::Migration + def self.up + add_column :users, :avatar_file_name, :string + add_column :users, :avatar_content_type, :string + add_column :users, :avatar_file_size, :integer + add_column :users, :avatar_updated_at, :datetime + end + + def self.down + remove_column :users, :avatar_file_name + remove_column :users, :avatar_content_type + remove_column :users, :avatar_file_size + remove_column :users, :avatar_updated_at + end +end diff --git a/db/schema.rb b/db/schema.rb index 671c0da..9ab5bd3 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,6 +10,31 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 0) do +ActiveRecord::Schema.define(:version => 20110530191034) do + + create_table "users", :force => true do |t| + t.string "username" + t.integer "playcount", :default => 0 + t.string "email", :default => "", :null => false + t.string "encrypted_password", :limit => 128, :default => "", :null => false + t.string "reset_password_token" + t.datetime "reset_password_sent_at" + t.datetime "remember_created_at" + t.integer "sign_in_count", :default => 0 + t.datetime "current_sign_in_at" + t.datetime "last_sign_in_at" + t.string "current_sign_in_ip" + t.string "last_sign_in_ip" + t.datetime "created_at" + t.datetime "updated_at" + t.string "avatar_file_name" + t.string "avatar_content_type" + t.integer "avatar_file_size" + t.datetime "avatar_updated_at" + end + + add_index "users", ["email"], :name => "index_users_on_email", :unique => true + add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true + add_index "users", ["username"], :name => "index_users_on_username", :unique => true end diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml new file mode 100644 index 0000000..2893341 --- /dev/null +++ b/test/fixtures/users.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html + +# This model initially had no columns defined. If you add columns to the +# model remove the '{}' from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/unit/user_test.rb b/test/unit/user_test.rb new file mode 100644 index 0000000..a64d2d3 --- /dev/null +++ b/test/unit/user_test.rb @@ -0,0 +1,8 @@ +require 'test_helper' + +class UserTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end