pwpush 0.1.0

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.
Files changed (139) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/Capfile +8 -0
  4. data/Gemfile +51 -0
  5. data/Gemfile.lock +224 -0
  6. data/LICENSE.txt +674 -0
  7. data/Procfile +3 -0
  8. data/README.md +91 -0
  9. data/Rakefile +8 -0
  10. data/TODO +21 -0
  11. data/app.json +21 -0
  12. data/app/assets/flash/clippy.swf +0 -0
  13. data/app/assets/flash/github-clippy.swf +0 -0
  14. data/app/assets/images/apple-touch-icon-ipad.png +0 -0
  15. data/app/assets/images/apple-touch-icon-ipad3.png +0 -0
  16. data/app/assets/images/apple-touch-icon-iphone.png +0 -0
  17. data/app/assets/images/apple-touch-icon-iphone4.png +0 -0
  18. data/app/assets/images/black_wood.jpg +0 -0
  19. data/app/assets/images/broken_noise.png +0 -0
  20. data/app/assets/images/button_down.png +0 -0
  21. data/app/assets/images/button_over.png +0 -0
  22. data/app/assets/images/button_up.png +0 -0
  23. data/app/assets/images/concrete_wall_3.png +0 -0
  24. data/app/assets/images/favicon.ico +0 -0
  25. data/app/assets/images/forkme.png +0 -0
  26. data/app/assets/images/outlets.png +0 -0
  27. data/app/assets/images/pwpush_favicon.jpg +0 -0
  28. data/app/assets/images/pwpush_logo.png +0 -0
  29. data/app/assets/images/rails.png +0 -0
  30. data/app/assets/javascripts/api.js.coffee +4 -0
  31. data/app/assets/javascripts/application.js +52 -0
  32. data/app/assets/javascripts/errors.js.coffee +3 -0
  33. data/app/assets/javascripts/fd-slider.js +1299 -0
  34. data/app/assets/javascripts/jquery-cookie.js +117 -0
  35. data/app/assets/javascripts/jquery.noty.js +520 -0
  36. data/app/assets/javascripts/layouts/top.js +34 -0
  37. data/app/assets/javascripts/passwords.js +62 -0
  38. data/app/assets/javascripts/spoiler.js +101 -0
  39. data/app/assets/javascripts/themes/default.js +156 -0
  40. data/app/assets/stylesheets/api.css.scss +3 -0
  41. data/app/assets/stylesheets/application.css +7 -0
  42. data/app/assets/stylesheets/errors.css.scss +3 -0
  43. data/app/assets/stylesheets/fd-slider.css +650 -0
  44. data/app/assets/stylesheets/global.css.scss +52 -0
  45. data/app/assets/stylesheets/passwords.css.scss +114 -0
  46. data/app/assets/stylesheets/users.css.scss +11 -0
  47. data/app/controllers/api_controller.rb +30 -0
  48. data/app/controllers/application_controller.rb +23 -0
  49. data/app/controllers/errors_controller.rb +7 -0
  50. data/app/controllers/passwords_controller.rb +153 -0
  51. data/app/controllers/users/omniauth_callbacks_controller.rb +71 -0
  52. data/app/controllers/views_controller.rb +11 -0
  53. data/app/helpers/api_helper.rb +2 -0
  54. data/app/helpers/application_helper.rb +31 -0
  55. data/app/helpers/errors_helper.rb +2 -0
  56. data/app/helpers/passwords_helper.rb +2 -0
  57. data/app/helpers/views_helper.rb +2 -0
  58. data/app/mailers/.gitkeep +0 -0
  59. data/app/models/.gitkeep +0 -0
  60. data/app/models/password.rb +51 -0
  61. data/app/models/user.rb +20 -0
  62. data/app/models/view.rb +4 -0
  63. data/app/views/api/config.html.haml +2 -0
  64. data/app/views/api/create.html.haml +2 -0
  65. data/app/views/api/generate.html.haml +2 -0
  66. data/app/views/api/list.html.haml +2 -0
  67. data/app/views/devise/confirmations/new.html.erb +12 -0
  68. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  69. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  70. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  71. data/app/views/devise/passwords/edit.html.erb +16 -0
  72. data/app/views/devise/passwords/new.html.erb +12 -0
  73. data/app/views/devise/registrations/edit.html.erb +25 -0
  74. data/app/views/devise/registrations/new.html.haml +50 -0
  75. data/app/views/devise/sessions/new.html.haml +51 -0
  76. data/app/views/devise/shared/_links.erb +25 -0
  77. data/app/views/devise/unlocks/new.html.erb +12 -0
  78. data/app/views/errors/error_404.html.haml +21 -0
  79. data/app/views/errors/error_500.html.haml +21 -0
  80. data/app/views/layouts/_ga.html.erb +14 -0
  81. data/app/views/layouts/application.html.haml +41 -0
  82. data/app/views/pages/about.html.haml +159 -0
  83. data/app/views/passwords/edit.html.haml +7 -0
  84. data/app/views/passwords/index.html.haml +17 -0
  85. data/app/views/passwords/new.html.haml +68 -0
  86. data/app/views/passwords/show.html.haml +58 -0
  87. data/app/views/shared/_auth_providers.html.haml +9 -0
  88. data/app/views/shared/_messages.html.haml +4 -0
  89. data/app/views/views/_form.html.erb +16 -0
  90. data/app/views/views/edit.html.erb +8 -0
  91. data/app/views/views/index.html.erb +21 -0
  92. data/app/views/views/new.html.erb +5 -0
  93. data/app/views/views/show.html.erb +20 -0
  94. data/bin/bundle +13 -0
  95. data/config.ru +4 -0
  96. data/config/application.rb +51 -0
  97. data/config/boot.rb +6 -0
  98. data/config/capistrano_database_yml.rb +158 -0
  99. data/config/database.yml +19 -0
  100. data/config/deploy.rb +140 -0
  101. data/config/deploy/database.yml.erb +52 -0
  102. data/config/deploy/local_cap_config.rb.example +54 -0
  103. data/config/environment.rb +42 -0
  104. data/config/environments/development.rb +30 -0
  105. data/config/environments/engineyard.rb +60 -0
  106. data/config/environments/private.rb +60 -0
  107. data/config/environments/production.rb +60 -0
  108. data/config/environments/test.rb +39 -0
  109. data/config/initializers/backtrace_silencers.rb +7 -0
  110. data/config/initializers/devise.rb +211 -0
  111. data/config/initializers/inflections.rb +10 -0
  112. data/config/initializers/mime_types.rb +5 -0
  113. data/config/initializers/secret_token.rb +7 -0
  114. data/config/initializers/session_store.rb +8 -0
  115. data/config/initializers/wrap_parameters.rb +14 -0
  116. data/config/locales/devise.en.yml +58 -0
  117. data/config/locales/en.yml +5 -0
  118. data/config/routes.rb +16 -0
  119. data/config/unicorn.rb +22 -0
  120. data/db/migrate/20111128183630_create_passwords.rb +12 -0
  121. data/db/migrate/20111228183300_create_views.rb +16 -0
  122. data/db/migrate/20120102210558_devise_create_users.rb +54 -0
  123. data/db/migrate/20120102210559_create_rails_admin_histories_table.rb +18 -0
  124. data/db/migrate/20120102220933_add_admin_to_user.rb +9 -0
  125. data/db/migrate/20120129211750_add_lockable_to_users.rb +10 -0
  126. data/db/migrate/20120220172426_add_user_to_password.rb +11 -0
  127. data/db/migrate/20121105144421_add_deleted_to_password.rb +5 -0
  128. data/db/migrate/20150323145847_add_first_view_flag.rb +9 -0
  129. data/db/migrate/20160214205926_add_deletable_to_password.rb +5 -0
  130. data/db/schema.rb +78 -0
  131. data/db/seeds.rb +7 -0
  132. data/log/.gitkeep +0 -0
  133. data/public/404.html +26 -0
  134. data/public/422.html +26 -0
  135. data/public/500.html +26 -0
  136. data/public/favicon.ico +0 -0
  137. data/public/robots.txt +3 -0
  138. data/script/rails +6 -0
  139. metadata +226 -0
@@ -0,0 +1,11 @@
1
+ class ViewsController < ApplicationController
2
+ before_filter :authenticate_user!
3
+
4
+ def index
5
+ @views = View.all
6
+ end
7
+
8
+ def show
9
+ @view = View.find(params[:id])
10
+ end
11
+ end
@@ -0,0 +1,2 @@
1
+ module ApiHelper
2
+ end
@@ -0,0 +1,31 @@
1
+ module ApplicationHelper
2
+ def clippy(text, bgcolor='#cccccc')
3
+ html = <<-EOF
4
+ <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
5
+ width="14"
6
+ height="14"
7
+ class="clippy"
8
+ id="clippy" >
9
+ <param name="movie" value="#{asset_path('github-clippy.swf')}"/>
10
+ <param name="allowScriptAccess" value="always" />
11
+ <param name="quality" value="high" />
12
+ <param name="scale" value="noscale" />
13
+ <param NAME="FlashVars" value="id=clip_data&amp;copied=copied!&amp;copyto=copy to clipboard">
14
+ <param name="bgcolor" value="#000000">
15
+ <param name="wmode" value="opaque">
16
+ <embed src="#{asset_path('github-clippy.swf')}"
17
+ width="14"
18
+ height="14"
19
+ name="clippy"
20
+ quality="high"
21
+ allowScriptAccess="always"
22
+ type="application/x-shockwave-flash"
23
+ pluginspage="http://www.macromedia.com/go/getflashplayer"
24
+ FlashVars="id=clip_data&amp;copied=copied!&amp;copyto=copy to clipboard"
25
+ bgcolor="#000000"
26
+ wmode="opaque"
27
+ />
28
+ </object>
29
+ EOF
30
+ end
31
+ end
@@ -0,0 +1,2 @@
1
+ module ErrorsHelper
2
+ end
@@ -0,0 +1,2 @@
1
+ module PasswordsHelper
2
+ end
@@ -0,0 +1,2 @@
1
+ module ViewsHelper
2
+ end
File without changes
File without changes
@@ -0,0 +1,51 @@
1
+ class Password < ActiveRecord::Base
2
+ attr_accessible :payload, :expire_after_days, :expire_after_views, :deletable_by_viewer
3
+ has_many :views, :dependent => :destroy
4
+
5
+ def to_param
6
+ self.url_token.to_s
7
+ end
8
+
9
+ def days_old
10
+ (Time.now.to_datetime - self.created_at.to_datetime).to_i
11
+ end
12
+
13
+ def days_remaining
14
+ [(self.expire_after_days - self.days_old), 0].max
15
+ end
16
+
17
+ def views_remaining
18
+ [(self.expire_after_views - self.views.count), 0].max
19
+ end
20
+
21
+ ##
22
+ # validate!
23
+ #
24
+ # Run basic validations on the password. Expire the password
25
+ # if it's limits have been reached (time or views)
26
+ #
27
+ def validate!
28
+ return if expired
29
+
30
+ # Range checking
31
+ self.expire_after_days ||= EXPIRE_AFTER_DAYS_DEFAULT
32
+ self.expire_after_views ||= EXPIRE_AFTER_VIEWS_DEFAULT
33
+
34
+ unless self.expire_after_days.between?(EXPIRE_AFTER_DAYS_MIN, EXPIRE_AFTER_DAYS_MAX)
35
+ self.expire_after_days = EXPIRE_AFTER_DAYS_DEFAULT
36
+ end
37
+
38
+ unless self.expire_after_views.between?(EXPIRE_AFTER_VIEWS_MIN, EXPIRE_AFTER_VIEWS_MAX)
39
+ self.expire_after_views = EXPIRE_AFTER_VIEWS_DEFAULT
40
+ end
41
+
42
+ unless self.new_record?
43
+ if (self.days_old >= self.expire_after_days) or (self.views.count >= self.expire_after_views)
44
+ # This password has hit max age or max views - expire it
45
+ self.expired = true
46
+ self.payload = nil
47
+ self.save
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,20 @@
1
+ class User < ActiveRecord::Base
2
+ # Include default devise modules. Others available are:
3
+ # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
4
+ # devise :database_authenticatable, :registerable,
5
+ # :recoverable, :rememberable, :trackable, :validatable
6
+ devise :database_authenticatable, :omniauthable, :lockable,
7
+ :recoverable, :rememberable, :trackable, :validatable, :registerable
8
+
9
+ # Setup accessible (or protected) attributes for your model
10
+ attr_accessible :email, :password, :password_confirmation, :remember_me
11
+
12
+ def self.find_for_open_id(access_token, signed_in_resource=nil)
13
+ data = access_token.info
14
+ if user = User.where(:email => data["email"]).first
15
+ user
16
+ else
17
+ User.create!(:email => data["email"], :password => Devise.friendly_token[0,20])
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,4 @@
1
+ class View < ActiveRecord::Base
2
+ belongs_to :password
3
+ attr_accessible :password_id, :ip, :user_agent
4
+ end
@@ -0,0 +1,2 @@
1
+ %h1 Api#config
2
+ %p Find me in app/views/api/config.html.haml
@@ -0,0 +1,2 @@
1
+ %h1 Api#create
2
+ %p Find me in app/views/api/create.html.haml
@@ -0,0 +1,2 @@
1
+ %h1 Api#generate
2
+ %p Find me in app/views/api/generate.html.haml
@@ -0,0 +1,2 @@
1
+ %h1 Api#list
2
+ %p Find me in app/views/api/list.html.haml
@@ -0,0 +1,12 @@
1
+ <h2>Resend confirmation instructions</h2>
2
+
3
+ <%= form_for(resource, :as => resource_name, :url => confirmation_path(resource_name), :html => { :method => :post }) do |f| %>
4
+ <%= devise_error_messages! %>
5
+
6
+ <div><%= f.label :email %><br />
7
+ <%= f.email_field :email %></div>
8
+
9
+ <div><%= f.submit "Resend confirmation instructions" %></div>
10
+ <% end %>
11
+
12
+ <%= render :partial => "devise/shared/links" %>
@@ -0,0 +1,5 @@
1
+ <p>Welcome <%= @resource.email %>!</p>
2
+
3
+ <p>You can confirm your account through the link below:</p>
4
+
5
+ <p><%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @resource.confirmation_token) %></p>
@@ -0,0 +1,8 @@
1
+ <p>Hello <%= @resource.email %>!</p>
2
+
3
+ <p>Someone has requested a link to change your password, and you can do this through the link below.</p>
4
+
5
+ <p><%= link_to 'Change my password', edit_password_url(@resource, :reset_password_token => @resource.reset_password_token) %></p>
6
+
7
+ <p>If you didn't request this, please ignore this email.</p>
8
+ <p>Your password won't change until you access the link above and create a new one.</p>
@@ -0,0 +1,7 @@
1
+ <p>Hello <%= @resource.email %>!</p>
2
+
3
+ <p>Your account has been locked due to an excessive amount of unsuccessful sign in attempts.</p>
4
+
5
+ <p>Click the link below to unlock your account:</p>
6
+
7
+ <p><%= link_to 'Unlock my account', unlock_url(@resource, :unlock_token => @resource.unlock_token) %></p>
@@ -0,0 +1,16 @@
1
+ <h2>Change your password</h2>
2
+
3
+ <%= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :put }) do |f| %>
4
+ <%= devise_error_messages! %>
5
+ <%= f.hidden_field :reset_password_token %>
6
+
7
+ <div><%= f.label :password, "New password" %><br />
8
+ <%= f.password_field :password %></div>
9
+
10
+ <div><%= f.label :password_confirmation, "Confirm new password" %><br />
11
+ <%= f.password_field :password_confirmation %></div>
12
+
13
+ <div><%= f.submit "Change my password" %></div>
14
+ <% end %>
15
+
16
+ <%= render :partial => "devise/shared/links" %>
@@ -0,0 +1,12 @@
1
+ <h2>Forgot your password?</h2>
2
+
3
+ <%= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :post }) do |f| %>
4
+ <%= devise_error_messages! %>
5
+
6
+ <div><%= f.label :email %><br />
7
+ <%= f.email_field :email %></div>
8
+
9
+ <div><%= f.submit "Send me reset password instructions" %></div>
10
+ <% end %>
11
+
12
+ <%= render :partial => "devise/shared/links" %>
@@ -0,0 +1,25 @@
1
+ <h2>Edit <%= resource_name.to_s.humanize %></h2>
2
+
3
+ <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %>
4
+ <%= devise_error_messages! %>
5
+
6
+ <div><%= f.label :email %><br />
7
+ <%= f.email_field :email %></div>
8
+
9
+ <div><%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br />
10
+ <%= f.password_field :password %></div>
11
+
12
+ <div><%= f.label :password_confirmation %><br />
13
+ <%= f.password_field :password_confirmation %></div>
14
+
15
+ <div><%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
16
+ <%= f.password_field :current_password %></div>
17
+
18
+ <div><%= f.submit "Update" %></div>
19
+ <% end %>
20
+
21
+ <h3>Cancel my account</h3>
22
+
23
+ <p>Unhappy? <%= link_to "Cancel my account", registration_path(resource_name), :confirm => "Are you sure?", :method => :delete %>.</p>
24
+
25
+ <%= link_to "Back", :back %>
@@ -0,0 +1,50 @@
1
+
2
+ .login_box
3
+ = render :partial => 'shared/messages'
4
+ - if params.has_key?(:message)
5
+ - if params[:message] == 'invalid_credentials'
6
+ %p{ :class => "flash error" }== Invalid credentials provided. Try again?
7
+ - else
8
+ %p{ :class => "flash error" }= params[:message]
9
+
10
+
11
+ %p{ :style => "font-family: 'Didact Gothic', sans-serif; font-size: 1.5em; clear: both;" }
12
+ One-click Sign Up with these services...
13
+
14
+ %div{ :style => 'auth_providers_area' }
15
+ %p
16
+ = render :partial => 'shared/auth_providers'
17
+
18
+ %p{ :style => "font-family: 'Didact Gothic', sans-serif; font-size: 1.5em; clear: both;" }
19
+ or do it old school...
20
+
21
+ = form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f|
22
+ %table.sign_up
23
+ %tr
24
+ %td
25
+ %p
26
+ = f.label :email
27
+ %br/
28
+ = f.text_field :email
29
+ %td
30
+ %p
31
+ = f.label :password
32
+ %br/
33
+ = f.password_field :password
34
+ %tr
35
+ %td.full_row{ :colspan => 2 }
36
+ - if devise_mapping.rememberable?
37
+ = f.check_box :remember_me
38
+ = f.label :remember_me
39
+ %tr
40
+ %td.full_row{ :colspan => 2 }
41
+ %p= submit_tag "Sign Up", :disable_with => "Please wait..."
42
+
43
+ %div{ :style => 'clear: both;' }
44
+
45
+ %p{ :style => "font-family: 'Didact Gothic', sans-serif; font-size: 90%; clear: both;" }
46
+ = link_to "Forgot your password?", new_user_password_path()
47
+ \|
48
+ = link_to "Already have an account?", new_user_session_path()
49
+
50
+
@@ -0,0 +1,51 @@
1
+
2
+ .login_box
3
+ = render :partial => 'shared/messages'
4
+ - if params.has_key?(:message)
5
+ - if params[:message] == 'invalid_credentials'
6
+ %p{ :class => "flash error" }== Invalid credentials provided. Try again?
7
+ - else
8
+ %p{ :class => "flash error" }= params[:message]
9
+
10
+
11
+ %p{ :style => "font-family: 'Didact Gothic', sans-serif; font-size: 1.5em; clear: both;" }
12
+ Login with one of these services...
13
+
14
+ %div{ :style => '' }
15
+ %p
16
+ = render :partial => 'shared/auth_providers'
17
+
18
+
19
+ %p{ :style => "font-family: 'Didact Gothic', sans-serif; font-size: 1.5em; clear: both;" }
20
+ or do it old school..
21
+
22
+ = form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f|
23
+ %table.sign_up
24
+ %tr
25
+ %td
26
+ %p
27
+ = f.label :email
28
+ %br/
29
+ = f.text_field :email
30
+ %td
31
+ %p
32
+ = f.label :password
33
+ %br/
34
+ = f.password_field :password
35
+ %tr
36
+ %td.full_row{ :colspan => 2 }
37
+ - if devise_mapping.rememberable?
38
+ = f.check_box :remember_me
39
+ = f.label :remember_me
40
+ %tr
41
+ %td.full_row{ :colspan => 2 }
42
+ %p= submit_tag "Sign In", :disable_with => "Please wait..."
43
+
44
+ %div{ :style => 'clear: both;' }
45
+
46
+ %p{ :style => "font-family: 'Didact Gothic', sans-serif; font-size: 90%; clear: both;" }
47
+ = link_to "Forgot your password?", new_user_password_path()
48
+ \|
49
+ = link_to "Need to create an account?", new_user_registration_path()
50
+
51
+
@@ -0,0 +1,25 @@
1
+ <%- if controller_name != 'sessions' %>
2
+ <%= link_to "Login", new_session_path(resource_name) %><br />
3
+ <% end -%>
4
+
5
+ <%- if devise_mapping.registerable? && controller_name != 'registrations' %>
6
+ <%= link_to "Register", new_registration_path(resource_name) %><br />
7
+ <% end -%>
8
+
9
+ <%- if devise_mapping.recoverable? && controller_name != 'passwords' %>
10
+ <%= link_to "Forgot your password?", new_password_path(resource_name) %><br />
11
+ <% end -%>
12
+
13
+ <%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>
14
+ <%= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name) %><br />
15
+ <% end -%>
16
+
17
+ <%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %>
18
+ <%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name) %><br />
19
+ <% end -%>
20
+
21
+ <%- if devise_mapping.omniauthable? %>
22
+ <%- resource_class.omniauth_providers.each do |provider| %>
23
+ <%= link_to "Sign in with #{provider.to_s.titleize}", omniauth_authorize_path(resource_name, provider) %><br />
24
+ <% end -%>
25
+ <% end -%>
@@ -0,0 +1,12 @@
1
+ <h2>Resend unlock instructions</h2>
2
+
3
+ <%= form_for(resource, :as => resource_name, :url => unlock_path(resource_name), :html => { :method => :post }) do |f| %>
4
+ <%= devise_error_messages! %>
5
+
6
+ <div><%= f.label :email %><br />
7
+ <%= f.email_field :email %></div>
8
+
9
+ <div><%= f.submit "Resend unlock instructions" %></div>
10
+ <% end %>
11
+
12
+ <%= render :partial => "devise/shared/links" %>
@@ -0,0 +1,21 @@
1
+ %p
2
+ .spacer{ :style => 'height: 100px;' }
3
+
4
+ %h1 #404
5
+
6
+ %p
7
+ Unfortunately we couldn't find that password. The link you followed may be bad
8
+ %br/
9
+ or we just screwed up.
10
+
11
+ %p
12
+ Double check that the link you followed is correct and is what appears in your URL bar.
13
+
14
+ .spacer{ :style => 'height: 100px;' }
15
+
16
+ - if Rails.env == "production" or Rails.env == "development"
17
+ %p.notes
18
+ %p= link_to "Back to the front page.", "/"
19
+ %p
20
+ == ...or if you think this page is in error, you could always log
21
+ = link_to "an issue on Github.", "https://github.com/pglombardo/PasswordPusher/issues?state=open", :target => "_blank"
@@ -0,0 +1,21 @@
1
+ .spacer{ :style => 'height: 100px;' }
2
+
3
+ %h1 #500
4
+
5
+ %p
6
+ Something went bad. That thing you did...it's broken.
7
+
8
+ %p
9
+ Try again if you like but I have my doubts.
10
+
11
+ %p
12
+ I'll get an email about this and take a look soon...
13
+
14
+ .spacer{ :style => 'height: 100px;' }
15
+
16
+ - if Rails.env == "production" or Rails.env == "development"
17
+ %p.notes
18
+ %p= link_to "Back to the front page.", "/"
19
+ %p
20
+ == ...or if this is driving you nuts, you could always log
21
+ = link_to "an issue on Github.", "https://github.com/pglombardo/PasswordPusher/issues?state=open", :target => "_blank"