mtwarden 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +9 -0
  3. data/Rakefile +23 -0
  4. data/app/assets/javascripts/mtwarden/account/accounts.js +2 -0
  5. data/app/assets/javascripts/mtwarden/account/dashboard.js +2 -0
  6. data/app/assets/javascripts/mtwarden/account/sessions.js +2 -0
  7. data/app/assets/javascripts/mtwarden/account/users.js +2 -0
  8. data/app/assets/javascripts/mtwarden/accounts.js +2 -0
  9. data/app/assets/javascripts/mtwarden/application.js +13 -0
  10. data/app/assets/javascripts/mtwarden/dashboard.js +2 -0
  11. data/app/assets/stylesheets/mtwarden/account/accounts.css +4 -0
  12. data/app/assets/stylesheets/mtwarden/account/dashboard.css +4 -0
  13. data/app/assets/stylesheets/mtwarden/account/sessions.css +4 -0
  14. data/app/assets/stylesheets/mtwarden/account/users.css +4 -0
  15. data/app/assets/stylesheets/mtwarden/accounts.css +4 -0
  16. data/app/assets/stylesheets/mtwarden/application.css +15 -0
  17. data/app/assets/stylesheets/mtwarden/dashboard.css +4 -0
  18. data/app/controllers/mtwarden/account/accounts_controller.rb +67 -0
  19. data/app/controllers/mtwarden/account/dashboard_controller.rb +7 -0
  20. data/app/controllers/mtwarden/account/sessions_controller.rb +20 -0
  21. data/app/controllers/mtwarden/account/users_controller.rb +23 -0
  22. data/app/controllers/mtwarden/accounts_controller.rb +32 -0
  23. data/app/controllers/mtwarden/application_controller.rb +12 -0
  24. data/app/controllers/mtwarden/dashboard_controller.rb +6 -0
  25. data/app/extenders/controllers/application_controller_extender.rb +38 -0
  26. data/app/helpers/mtwarden/account/accounts_helper.rb +4 -0
  27. data/app/helpers/mtwarden/account/dashboard_helper.rb +4 -0
  28. data/app/helpers/mtwarden/account/sessions_helper.rb +4 -0
  29. data/app/helpers/mtwarden/account/users_helper.rb +4 -0
  30. data/app/helpers/mtwarden/accounts_helper.rb +4 -0
  31. data/app/helpers/mtwarden/application_helper.rb +4 -0
  32. data/app/helpers/mtwarden/dashboard_helper.rb +4 -0
  33. data/app/models/mtwarden/account.rb +39 -0
  34. data/app/models/mtwarden/member.rb +8 -0
  35. data/app/models/mtwarden/plan.rb +6 -0
  36. data/app/models/mtwarden/user.rb +7 -0
  37. data/app/views/layouts/mtwarden/application.html.erb +16 -0
  38. data/app/views/mtwarden/account/accounts/_existing_subscription.html.erb +3 -0
  39. data/app/views/mtwarden/account/accounts/_new_subscription.html.erb +38 -0
  40. data/app/views/mtwarden/account/accounts/edit.html.erb +17 -0
  41. data/app/views/mtwarden/account/accounts/plan.html.erb +15 -0
  42. data/app/views/mtwarden/account/dashboard/index.html.erb +1 -0
  43. data/app/views/mtwarden/account/sessions/new.html.erb +19 -0
  44. data/app/views/mtwarden/account/users/_form.html.erb +14 -0
  45. data/app/views/mtwarden/account/users/new.html.erb +6 -0
  46. data/app/views/mtwarden/accounts/new.html.erb +20 -0
  47. data/app/views/mtwarden/dashboard/index.html.erb +1 -0
  48. data/app/views/mtwarden/shared/_login.html.erb +7 -0
  49. data/config/initializers/braintree.rb +4 -0
  50. data/config/initializers/warden/strategies/password.rb +16 -0
  51. data/config/routes.rb +29 -0
  52. data/db/migrate/20140621030847_create_mtwarden_accounts.rb +9 -0
  53. data/db/migrate/20140621114149_add_owner_id_to_mtwarden_accounts.rb +5 -0
  54. data/db/migrate/20140621114231_create_mtwarden_users.rb +10 -0
  55. data/db/migrate/20140621114308_create_mtwarden_members.rb +10 -0
  56. data/db/migrate/20140621114417_add_subdomain_to_mtwarden_accounts.rb +6 -0
  57. data/db/migrate/20140829231923_create_mtwarden_plans.rb +11 -0
  58. data/db/migrate/20140830011033_add_plan_id_to_mtwarden_accounts.rb +5 -0
  59. data/db/migrate/20140830020346_add_braintree_subscription_id_to_mtwarden_accounts.rb +5 -0
  60. data/lib/mtwarden.rb +5 -0
  61. data/lib/mtwarden/braintree_plan_fetcher.rb +20 -0
  62. data/lib/mtwarden/constraints/subdomain_required.rb +9 -0
  63. data/lib/mtwarden/engine.rb +51 -0
  64. data/lib/mtwarden/scoped_to.rb +7 -0
  65. data/lib/mtwarden/testing_support/authentication_helpers.rb +17 -0
  66. data/lib/mtwarden/testing_support/factories/account_factory.rb +13 -0
  67. data/lib/mtwarden/testing_support/factories/user_factory.rb +7 -0
  68. data/lib/mtwarden/testing_support/subdomain_helpers.rb +14 -0
  69. data/lib/mtwarden/version.rb +3 -0
  70. data/lib/tasks/mtwarden_tasks.rake +7 -0
  71. metadata +297 -0
@@ -0,0 +1,8 @@
1
+ module Mtwarden
2
+
3
+ class Member < ActiveRecord::Base
4
+ belongs_to :account, :class_name => "Mtwarden::Account"
5
+ belongs_to :user, :class_name => "Mtwarden::User"
6
+ end
7
+
8
+ end
@@ -0,0 +1,6 @@
1
+ module Mtwarden
2
+
3
+ class Plan < ActiveRecord::Base
4
+ end
5
+
6
+ end
@@ -0,0 +1,7 @@
1
+ module Mtwarden
2
+ class User < ActiveRecord::Base
3
+ include Gravtastic
4
+ gravtastic
5
+ has_secure_password
6
+ end
7
+ end
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>CoastDigitalGroup Mtwarden Warden Edition</title>
5
+ <%= stylesheet_link_tag "mtwarden/application", media: "all" %>
6
+ <%= javascript_include_tag "mtwarden/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+ <% flash.each do |k,v| %>
11
+ <div class='flash <%= k %>'><%= v %></div>
12
+ <% end %>
13
+ <%= render "mtwarden/shared/login" %>
14
+ <%= yield %>
15
+ </body>
16
+ </html>
@@ -0,0 +1,3 @@
1
+ <%= form_tag confirm_plan_account_path(:plan_id => params[:plan_id]) do %>
2
+ <%= submit_tag "Change plan" %>
3
+ <% end %>
@@ -0,0 +1,38 @@
1
+ <% if @result && @result.message %>
2
+ <ul class="gateway_messages">
3
+ <% @result.message.split("\n").each do |message| %>
4
+ <li><%= message %></li>
5
+ <% end %>
6
+ </ul>
7
+ <% end %>
8
+
9
+ <%= form_for :customer,
10
+ :url => Braintree::TransparentRedirect.url,
11
+ :html => {:autocomplete => "off"} do |customer| -%>
12
+ <% tr_data = Braintree::TransparentRedirect.create_customer_data(
13
+ :redirect_url => mtwarden.subscribe_account_url(:plan_id => params[:plan_id]),
14
+ ) %>
15
+ <%= hidden_field_tag "tr_data", tr_data %>
16
+ <%= customer.fields_for :credit_card do |cc| -%>
17
+ <p>
18
+ <%= cc.label :number, "Credit card number" %><br>
19
+ <%= cc.text_field :number %>
20
+ </p>
21
+
22
+ <p>
23
+ <%= cc.label :cardholder_name, "Name on card" %><br>
24
+ <%= cc.text_field :cardholder_name %>
25
+ </p>
26
+
27
+ <p>
28
+ <%= cc.label :expiration_date, "Expiration date" %><br>
29
+ <%= cc.text_field :expiration_date %>
30
+ </p>
31
+
32
+ <p>
33
+ <%= cc.label :cvv, "CVV" %><br>
34
+ <%= cc.text_field :cvv %>
35
+ </p>
36
+ <%= customer.submit "Change plan" %>
37
+ <% end %>
38
+ <% end %>
@@ -0,0 +1,17 @@
1
+ <h2>Edit Account</h2>
2
+
3
+ <%= form_for(current_account, :url => account_path) do |account| %>
4
+ <%= account.error_messages %>
5
+ <p>
6
+ <%= account.label :name %>
7
+ <%= account.text_field :name %>
8
+ </p>
9
+
10
+ <p>
11
+ <%= account.label :plan_id %>
12
+ <% plans = Mtwarden::Plan.all.map { |p| [p.name, p.id] } %>
13
+ <%= account.select :plan_id, plans %>
14
+ </p>
15
+
16
+ <%= account.submit "Update Account" %>
17
+ <% end %>
@@ -0,0 +1,15 @@
1
+ <div class='plan-info'>
2
+ <p>
3
+ You are changing to the '<%= @plan.name %>' plan.
4
+ </p>
5
+
6
+ <p>
7
+ This plan costs <strong>$<%= @plan.price %></strong> per month.
8
+ </p>
9
+ </div>
10
+
11
+ <% if current_account.braintree_subscription_id.present? %>
12
+ <%= render "existing_subscription" %>
13
+ <% else %>
14
+ <%= render "new_subscription" %>
15
+ <% end %>
@@ -0,0 +1 @@
1
+ Your account's dashboard. Coming soon.
@@ -0,0 +1,19 @@
1
+ <h2>Sign in</h2>
2
+
3
+ <%= form_for @user, :url => sessions_url do |f| %>
4
+ <p>
5
+ <%= f.label :email %><br>
6
+ <%= f.email_field :email %>
7
+ </p>
8
+
9
+ <p>
10
+ <%= f.label :password %><br>
11
+ <%= f.password_field :password %>
12
+ </p>
13
+
14
+ <p>
15
+ <%= f.submit "Sign in" %>
16
+ </p>
17
+ <% end %>
18
+
19
+ <%= link_to "New User?", user_sign_up_url %>
@@ -0,0 +1,14 @@
1
+ <p>
2
+ <%= user.label :email %><br>
3
+ <%= user.email_field :email %>
4
+ </p>
5
+
6
+ <p>
7
+ <%= user.label :password %><br>
8
+ <%= user.password_field :password %>
9
+ </p>
10
+
11
+ <p>
12
+ <%= user.label :password_confirmation %><br>
13
+ <%= user.password_field :password_confirmation %>
14
+ </p>
@@ -0,0 +1,6 @@
1
+ <h2>Sign Up</h2>
2
+
3
+ <%= form_for(@user, :url => do_user_sign_up_url) do |user| %>
4
+ <%= render "mtwarden/account/users/form", :user => user %>
5
+ <%= user.submit "Sign up" %>
6
+ <% end %>
@@ -0,0 +1,20 @@
1
+ <h2>Sign Up</h2>
2
+
3
+ <%= form_for(@account) do |account| %>
4
+ <%= account.error_messages %>
5
+ <p>
6
+ <%= account.label :name %><br>
7
+ <%= account.text_field :name %>
8
+ </p>
9
+
10
+ <p>
11
+ <%= account.label :subdomain %><br>
12
+ <%= account.text_field :subdomain %>
13
+ </p>
14
+
15
+ <%= account.fields_for :owner do |owner| %>
16
+ <%= render "mtwarden/account/users/form", :user => owner %>
17
+ <% end %>
18
+
19
+ <%= account.submit %>
20
+ <% end %>
@@ -0,0 +1 @@
1
+ <%= link_to "Account Sign Up", sign_up_path %>
@@ -0,0 +1,7 @@
1
+ <% if user_signed_in? %>
2
+ Signed in as <%= current_user.email %>
3
+ <% if owner? %>
4
+ &middot;
5
+ <%= link_to "Edit Account", account_path %>
6
+ <% end %>
7
+ <% end %>
@@ -0,0 +1,4 @@
1
+ Braintree::Configuration.environment = :sandbox
2
+ Braintree::Configuration.merchant_id = "rjyzvq7k53n45sph"
3
+ Braintree::Configuration.public_key = "4dhtq8cmjvsnzvjv"
4
+ Braintree::Configuration.private_key = "d76f2378fa72b6f3a7af797ce6f6222f"
@@ -0,0 +1,16 @@
1
+ Warden::Strategies.add(:password) do
2
+ def subdomain
3
+ ActionDispatch::Http::URL.extract_subdomains(request.host, 1)
4
+ end
5
+
6
+ def valid?
7
+ subdomain.present? && params["user"]
8
+ end
9
+
10
+ def authenticate!
11
+ return fail! unless account = Mtwarden::Account.find_by(subdomain: subdomain)
12
+ return fail! unless user = account.users.find_by(email: params["user"]["email"])
13
+ return fail! unless user.authenticate(params["user"]["password"])
14
+ success! user
15
+ end
16
+ end
data/config/routes.rb ADDED
@@ -0,0 +1,29 @@
1
+ require "mtwarden/constraints/subdomain_required"
2
+
3
+ Mtwarden::Engine.routes.draw do
4
+ constraints(Mtwarden::Constraints::SubdomainRequired) do
5
+ scope :module => "account" do
6
+ root :to => "dashboard#index", :as => :account_root
7
+ get "/sign_in", :to => "sessions#new", :as => :sign_in
8
+ post "/sign_in", :to => "sessions#create", :as => :sessions
9
+ get "/sign_up", :to => "users#new", :as => :user_sign_up
10
+ post "/sign_up", :to => "users#create", :as => :do_user_sign_up
11
+ get "/account", :to => "accounts#edit", :as => :edit_account
12
+ patch "/account", :to => "accounts#update"
13
+ get "/account/plan/:plan_id",
14
+ :to => "accounts#plan",
15
+ :as => :plan_account
16
+ get "/account/subscribe",
17
+ :to => "accounts#subscribe",
18
+ :as => :subscribe_account
19
+ post "/account/confirm_plan",
20
+ :to => "accounts#confirm_plan",
21
+ :as => :confirm_plan_account
22
+ end
23
+ end
24
+
25
+ root "dashboard#index"
26
+ get "/sign_up", :to => "accounts#new", :as => :sign_up
27
+ post "/accounts", :to => "accounts#create", :as => :accounts
28
+
29
+ end
@@ -0,0 +1,9 @@
1
+ class CreateMtwardenAccounts < ActiveRecord::Migration
2
+ def change
3
+ create_table :mtwarden_accounts do |t|
4
+ t.string :name
5
+
6
+ t.timestamps
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ class AddOwnerIdToMtwardenAccounts < ActiveRecord::Migration
2
+ def change
3
+ add_column :mtwarden_accounts, :owner_id, :integer
4
+ end
5
+ end
@@ -0,0 +1,10 @@
1
+ class CreateMtwardenUsers < ActiveRecord::Migration
2
+ def change
3
+ create_table :mtwarden_users do |t|
4
+ t.string :email
5
+ t.string :password_digest
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ class CreateMtwardenMembers < ActiveRecord::Migration
2
+ def change
3
+ create_table :mtwarden_members do |t|
4
+ t.integer :account_id
5
+ t.integer :user_id
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,6 @@
1
+ class AddSubdomainToMtwardenAccounts < ActiveRecord::Migration
2
+ def change
3
+ add_column :mtwarden_accounts, :subdomain, :string
4
+ add_index :mtwarden_accounts, :subdomain
5
+ end
6
+ end
@@ -0,0 +1,11 @@
1
+ class CreateMtwardenPlans < ActiveRecord::Migration
2
+ def change
3
+ create_table :mtwarden_plans do |t|
4
+ t.string :name
5
+ t.float :price
6
+ t.string :braintree_id
7
+
8
+ t.timestamps
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ class AddPlanIdToMtwardenAccounts < ActiveRecord::Migration
2
+ def change
3
+ add_column :mtwarden_accounts, :plan_id, :integer
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddBraintreeSubscriptionIdToMtwardenAccounts < ActiveRecord::Migration
2
+ def change
3
+ add_column :mtwarden_accounts, :braintree_subscription_id, :string
4
+ end
5
+ end
data/lib/mtwarden.rb ADDED
@@ -0,0 +1,5 @@
1
+ require "mtwarden/engine"
2
+ require "mtwarden/scoped_to"
3
+
4
+ module Mtwarden
5
+ end
@@ -0,0 +1,20 @@
1
+ module Mtwarden
2
+ class BraintreePlanFetcher
3
+ def self.store_locally
4
+ Braintree::Plan.all.each do |plan|
5
+ if local_plan = Mtwarden::Plan.find_by(braintree_id: plan.id)
6
+ local_plan.update_attributes({
7
+ :name => plan.name,
8
+ :price => plan.price
9
+ })
10
+ else
11
+ Mtwarden::Plan.create({
12
+ :name => plan.name,
13
+ :price => plan.price,
14
+ :braintree_id => plan.id
15
+ })
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,9 @@
1
+ module Mtwarden
2
+ module Constraints
3
+ class SubdomainRequired
4
+ def self.matches?(request)
5
+ request.subdomain.present? && request.subdomain != "www"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,51 @@
1
+ require "warden"
2
+ require "houser"
3
+ require 'gravtastic'
4
+
5
+ require "dynamic_form"
6
+ require "braintree"
7
+
8
+ module Mtwarden
9
+ class Engine < ::Rails::Engine
10
+ isolate_namespace Mtwarden
11
+
12
+ config.generators do |g|
13
+ g.test_framework :rspec, :view_specs => false
14
+ end
15
+
16
+ initializer "mtwarden.middleware.warden" do
17
+ Rails.application.config.middleware.use Warden::Manager do |manager|
18
+ manager.default_strategies :password
19
+ manager.serialize_into_session do |user|
20
+ user.id
21
+ end
22
+
23
+ manager.serialize_from_session do |id|
24
+ Mtwarden::User.find(id)
25
+ end
26
+ end
27
+ end
28
+
29
+ initializer "mtwarden.middleware.fake_braintree_redirect" do
30
+ if Rails.env.test?
31
+ require "fake_braintree_redirect"
32
+ Rails.application.config.middleware.insert_before \
33
+ Warden::Manager,
34
+ FakeBraintreeRedirect
35
+ end
36
+ end
37
+
38
+ config.to_prepare do
39
+ root = Mtwarden::Engine.root
40
+ extenders_path = root + "app/extenders/**/*.rb"
41
+ Dir.glob(extenders_path) do |file|
42
+ Rails.configuration.cache_classes ? require(file) : load(file)
43
+ end
44
+ end
45
+
46
+ initializer 'mtwarden.middleware.houser' do
47
+ Rails.application.config.middleware.use Houser::Middleware,
48
+ :class_name => 'Mtwarden::Account'
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,7 @@
1
+ module Mtwarden
2
+ module ScopedTo
3
+ def scoped_to(account)
4
+ where(:account_id => account.id)
5
+ end
6
+ end
7
+ end