pwpush 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +20 -0
- data/Capfile +8 -0
- data/Gemfile +51 -0
- data/Gemfile.lock +224 -0
- data/LICENSE.txt +674 -0
- data/Procfile +3 -0
- data/README.md +91 -0
- data/Rakefile +8 -0
- data/TODO +21 -0
- data/app.json +21 -0
- data/app/assets/flash/clippy.swf +0 -0
- data/app/assets/flash/github-clippy.swf +0 -0
- data/app/assets/images/apple-touch-icon-ipad.png +0 -0
- data/app/assets/images/apple-touch-icon-ipad3.png +0 -0
- data/app/assets/images/apple-touch-icon-iphone.png +0 -0
- data/app/assets/images/apple-touch-icon-iphone4.png +0 -0
- data/app/assets/images/black_wood.jpg +0 -0
- data/app/assets/images/broken_noise.png +0 -0
- data/app/assets/images/button_down.png +0 -0
- data/app/assets/images/button_over.png +0 -0
- data/app/assets/images/button_up.png +0 -0
- data/app/assets/images/concrete_wall_3.png +0 -0
- data/app/assets/images/favicon.ico +0 -0
- data/app/assets/images/forkme.png +0 -0
- data/app/assets/images/outlets.png +0 -0
- data/app/assets/images/pwpush_favicon.jpg +0 -0
- data/app/assets/images/pwpush_logo.png +0 -0
- data/app/assets/images/rails.png +0 -0
- data/app/assets/javascripts/api.js.coffee +4 -0
- data/app/assets/javascripts/application.js +52 -0
- data/app/assets/javascripts/errors.js.coffee +3 -0
- data/app/assets/javascripts/fd-slider.js +1299 -0
- data/app/assets/javascripts/jquery-cookie.js +117 -0
- data/app/assets/javascripts/jquery.noty.js +520 -0
- data/app/assets/javascripts/layouts/top.js +34 -0
- data/app/assets/javascripts/passwords.js +62 -0
- data/app/assets/javascripts/spoiler.js +101 -0
- data/app/assets/javascripts/themes/default.js +156 -0
- data/app/assets/stylesheets/api.css.scss +3 -0
- data/app/assets/stylesheets/application.css +7 -0
- data/app/assets/stylesheets/errors.css.scss +3 -0
- data/app/assets/stylesheets/fd-slider.css +650 -0
- data/app/assets/stylesheets/global.css.scss +52 -0
- data/app/assets/stylesheets/passwords.css.scss +114 -0
- data/app/assets/stylesheets/users.css.scss +11 -0
- data/app/controllers/api_controller.rb +30 -0
- data/app/controllers/application_controller.rb +23 -0
- data/app/controllers/errors_controller.rb +7 -0
- data/app/controllers/passwords_controller.rb +153 -0
- data/app/controllers/users/omniauth_callbacks_controller.rb +71 -0
- data/app/controllers/views_controller.rb +11 -0
- data/app/helpers/api_helper.rb +2 -0
- data/app/helpers/application_helper.rb +31 -0
- data/app/helpers/errors_helper.rb +2 -0
- data/app/helpers/passwords_helper.rb +2 -0
- data/app/helpers/views_helper.rb +2 -0
- data/app/mailers/.gitkeep +0 -0
- data/app/models/.gitkeep +0 -0
- data/app/models/password.rb +51 -0
- data/app/models/user.rb +20 -0
- data/app/models/view.rb +4 -0
- data/app/views/api/config.html.haml +2 -0
- data/app/views/api/create.html.haml +2 -0
- data/app/views/api/generate.html.haml +2 -0
- data/app/views/api/list.html.haml +2 -0
- data/app/views/devise/confirmations/new.html.erb +12 -0
- data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
- data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/devise/passwords/edit.html.erb +16 -0
- data/app/views/devise/passwords/new.html.erb +12 -0
- data/app/views/devise/registrations/edit.html.erb +25 -0
- data/app/views/devise/registrations/new.html.haml +50 -0
- data/app/views/devise/sessions/new.html.haml +51 -0
- data/app/views/devise/shared/_links.erb +25 -0
- data/app/views/devise/unlocks/new.html.erb +12 -0
- data/app/views/errors/error_404.html.haml +21 -0
- data/app/views/errors/error_500.html.haml +21 -0
- data/app/views/layouts/_ga.html.erb +14 -0
- data/app/views/layouts/application.html.haml +41 -0
- data/app/views/pages/about.html.haml +159 -0
- data/app/views/passwords/edit.html.haml +7 -0
- data/app/views/passwords/index.html.haml +17 -0
- data/app/views/passwords/new.html.haml +68 -0
- data/app/views/passwords/show.html.haml +58 -0
- data/app/views/shared/_auth_providers.html.haml +9 -0
- data/app/views/shared/_messages.html.haml +4 -0
- data/app/views/views/_form.html.erb +16 -0
- data/app/views/views/edit.html.erb +8 -0
- data/app/views/views/index.html.erb +21 -0
- data/app/views/views/new.html.erb +5 -0
- data/app/views/views/show.html.erb +20 -0
- data/bin/bundle +13 -0
- data/config.ru +4 -0
- data/config/application.rb +51 -0
- data/config/boot.rb +6 -0
- data/config/capistrano_database_yml.rb +158 -0
- data/config/database.yml +19 -0
- data/config/deploy.rb +140 -0
- data/config/deploy/database.yml.erb +52 -0
- data/config/deploy/local_cap_config.rb.example +54 -0
- data/config/environment.rb +42 -0
- data/config/environments/development.rb +30 -0
- data/config/environments/engineyard.rb +60 -0
- data/config/environments/private.rb +60 -0
- data/config/environments/production.rb +60 -0
- data/config/environments/test.rb +39 -0
- data/config/initializers/backtrace_silencers.rb +7 -0
- data/config/initializers/devise.rb +211 -0
- data/config/initializers/inflections.rb +10 -0
- data/config/initializers/mime_types.rb +5 -0
- data/config/initializers/secret_token.rb +7 -0
- data/config/initializers/session_store.rb +8 -0
- data/config/initializers/wrap_parameters.rb +14 -0
- data/config/locales/devise.en.yml +58 -0
- data/config/locales/en.yml +5 -0
- data/config/routes.rb +16 -0
- data/config/unicorn.rb +22 -0
- data/db/migrate/20111128183630_create_passwords.rb +12 -0
- data/db/migrate/20111228183300_create_views.rb +16 -0
- data/db/migrate/20120102210558_devise_create_users.rb +54 -0
- data/db/migrate/20120102210559_create_rails_admin_histories_table.rb +18 -0
- data/db/migrate/20120102220933_add_admin_to_user.rb +9 -0
- data/db/migrate/20120129211750_add_lockable_to_users.rb +10 -0
- data/db/migrate/20120220172426_add_user_to_password.rb +11 -0
- data/db/migrate/20121105144421_add_deleted_to_password.rb +5 -0
- data/db/migrate/20150323145847_add_first_view_flag.rb +9 -0
- data/db/migrate/20160214205926_add_deletable_to_password.rb +5 -0
- data/db/schema.rb +78 -0
- data/db/seeds.rb +7 -0
- data/log/.gitkeep +0 -0
- data/public/404.html +26 -0
- data/public/422.html +26 -0
- data/public/500.html +26 -0
- data/public/favicon.ico +0 -0
- data/public/robots.txt +3 -0
- data/script/rails +6 -0
- metadata +226 -0
@@ -0,0 +1,52 @@
|
|
1
|
+
|
2
|
+
@import url("https://fonts.googleapis.com/css?family=Crete+Round:400,400italic");
|
3
|
+
|
4
|
+
body {
|
5
|
+
margin: 0em 0em 3em 0em;
|
6
|
+
text-align: center;
|
7
|
+
background: #000000 image-url('outlets.png') repeat;
|
8
|
+
font-family: 'Crete Round', serif;
|
9
|
+
color: #ddd;
|
10
|
+
}
|
11
|
+
|
12
|
+
a:link, a:visited, a:active {
|
13
|
+
color: yellow;
|
14
|
+
text-decoration: none;
|
15
|
+
}
|
16
|
+
|
17
|
+
a:hover {
|
18
|
+
color: #00CC00;
|
19
|
+
text-decoration: none;
|
20
|
+
}
|
21
|
+
|
22
|
+
div.content {
|
23
|
+
margin-top: 50px;
|
24
|
+
}
|
25
|
+
|
26
|
+
.auth_providers_area {
|
27
|
+
width: 600px;
|
28
|
+
margin-left: auto;
|
29
|
+
margin-right: auto;
|
30
|
+
}
|
31
|
+
|
32
|
+
.auth_provider img {
|
33
|
+
display: block;
|
34
|
+
}
|
35
|
+
|
36
|
+
.auth_provider {
|
37
|
+
display: inline-block;
|
38
|
+
text-decoration: none;
|
39
|
+
margin-right: 20px;
|
40
|
+
text-align: center;
|
41
|
+
margin-bottom: 10px;
|
42
|
+
}
|
43
|
+
|
44
|
+
.footer {
|
45
|
+
font-size: 80%;
|
46
|
+
}
|
47
|
+
|
48
|
+
.about_content {
|
49
|
+
text-align: left;
|
50
|
+
width: 800px;
|
51
|
+
margin: 50px auto 50px auto;
|
52
|
+
}
|
@@ -0,0 +1,114 @@
|
|
1
|
+
// Place all the styles related to the passwords controller here.
|
2
|
+
// They will automatically be included in application.css.
|
3
|
+
// You can use Sass (SCSS) here: http://sass-lang.com/
|
4
|
+
|
5
|
+
input.password {
|
6
|
+
border: 1px solid #bbb;
|
7
|
+
width: 500px;
|
8
|
+
height: 25px;
|
9
|
+
text-align: center;
|
10
|
+
color: #808080;
|
11
|
+
font-size: 1.5em;
|
12
|
+
}
|
13
|
+
|
14
|
+
input.slider {
|
15
|
+
width: 400px;
|
16
|
+
}
|
17
|
+
|
18
|
+
p.slider_box, span#daysrange, span#viewsrange { vertical-align: top; }
|
19
|
+
p.slider_box { margin: .5em; }
|
20
|
+
span#daysrange, span#viewsrange { display: inline-block; width: 80px; text-align: left; }
|
21
|
+
|
22
|
+
div.title {
|
23
|
+
margin: 3em;
|
24
|
+
}
|
25
|
+
|
26
|
+
span.title {
|
27
|
+
font-size: 4em;
|
28
|
+
color: yellow;
|
29
|
+
}
|
30
|
+
span.tagline {
|
31
|
+
font-size: 1.5em;
|
32
|
+
}
|
33
|
+
|
34
|
+
p.payload { margin: 1em; }
|
35
|
+
|
36
|
+
p.notes { margin-top: 50px; font-size: .9em; }
|
37
|
+
span.note, span.tip { font-size: .9em; }
|
38
|
+
span.note { color: #808080; }
|
39
|
+
span.tip { font-style: italic; }
|
40
|
+
p.notes a:link, p.notes a:visited, p.notes a:hover, p.notes a:active { font-size: .9em; }
|
41
|
+
|
42
|
+
p.url { vertical-align: top; margin: 0;}
|
43
|
+
|
44
|
+
p.url input {
|
45
|
+
border: 1px solid #808080;
|
46
|
+
text-align: center;
|
47
|
+
width: 400px;
|
48
|
+
font-size: .8em;
|
49
|
+
}
|
50
|
+
|
51
|
+
p.url span.clippy {}
|
52
|
+
|
53
|
+
/* This is a decent font to display passwords as L, l, 0, o, i, I are fairly distinguishable */
|
54
|
+
@import url(https://fonts.googleapis.com/css?family=PT+Mono);
|
55
|
+
|
56
|
+
div.payload {
|
57
|
+
font-family: 'PT Mono', sans-serif;
|
58
|
+
font-size: 4em;
|
59
|
+
line-height: 4em;
|
60
|
+
border-top: 3px solid #eee;
|
61
|
+
border-bottom: 3px solid #eee;
|
62
|
+
background: #000;
|
63
|
+
opacity: 0.5;
|
64
|
+
-khtml-opacity: 0.5;
|
65
|
+
-moz-opacity: 0.5;
|
66
|
+
filter: alpha(opacity = 50);
|
67
|
+
}
|
68
|
+
|
69
|
+
.cookie-save { font-size: .9em; }
|
70
|
+
|
71
|
+
.share_note {
|
72
|
+
padding: 1em;
|
73
|
+
border: 2px solid yellow;
|
74
|
+
width: 600px;
|
75
|
+
margin-left: auto;
|
76
|
+
margin-right: auto;
|
77
|
+
margin-top: 0;
|
78
|
+
background: #000;
|
79
|
+
filter: alpha(opacity = 90);
|
80
|
+
-khtml-opacity: 0.90;
|
81
|
+
-moz-opacity: 0.90;
|
82
|
+
opacity: 0.9;
|
83
|
+
color: #fff;
|
84
|
+
}
|
85
|
+
|
86
|
+
#clippy { display: inline-block; }
|
87
|
+
|
88
|
+
#clippy span{ display: none; }
|
89
|
+
|
90
|
+
#clippy:hover span{
|
91
|
+
display: block;
|
92
|
+
position:absolute;
|
93
|
+
top: 5em;
|
94
|
+
color: #fff;
|
95
|
+
text-align: center;
|
96
|
+
padding: 1px;
|
97
|
+
font-size: .8em;
|
98
|
+
background: #808080;
|
99
|
+
border: 1px solid yellow;
|
100
|
+
z-index: 1;
|
101
|
+
filter: alpha(opacity = 90);
|
102
|
+
-khtml-opacity: 0.90;
|
103
|
+
-moz-opacity: 0.90;
|
104
|
+
opacity: 0.90;
|
105
|
+
}
|
106
|
+
|
107
|
+
div.footer_note {
|
108
|
+
clear: both;
|
109
|
+
color: #bebebe;
|
110
|
+
margin-top: 100px;
|
111
|
+
text-align: center;
|
112
|
+
font-size: .85em;
|
113
|
+
}
|
114
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class ApiController < ApplicationController
|
2
|
+
def create
|
3
|
+
# Required Parameters
|
4
|
+
# api_key=string
|
5
|
+
# password=string
|
6
|
+
|
7
|
+
# Optional 1 time parameters
|
8
|
+
# expire_days=number
|
9
|
+
# expire_views=number
|
10
|
+
|
11
|
+
unless params.has_key?(:api_key)
|
12
|
+
respond_to do |format|
|
13
|
+
format.text { render :text => "Please provide your API key available at https://pwpush.com/api" }
|
14
|
+
end
|
15
|
+
return
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
def generate
|
22
|
+
end
|
23
|
+
|
24
|
+
def list
|
25
|
+
end
|
26
|
+
|
27
|
+
def config
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class ApplicationController < ActionController::Base
|
2
|
+
protect_from_forgery
|
3
|
+
|
4
|
+
def not_found
|
5
|
+
raise ActionController::RoutingError.new('Not Found')
|
6
|
+
end
|
7
|
+
|
8
|
+
# unless Rails.application.config.consider_all_requests_local
|
9
|
+
rescue_from Exception, with: lambda { |exception| render_error 500, exception }
|
10
|
+
rescue_from ActionController::RoutingError, ActionController::UnknownController,
|
11
|
+
::AbstractController::ActionNotFound, ActiveRecord::RecordNotFound,
|
12
|
+
with: lambda { |exception| render_error 404, exception }
|
13
|
+
# end
|
14
|
+
|
15
|
+
private
|
16
|
+
def render_error(status, exception)
|
17
|
+
respond_to do |format|
|
18
|
+
format.html { render template: "errors/error_#{status}", layout: 'layouts/application', status: status }
|
19
|
+
format.all { render nothing: true, status: status }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
class PasswordsController < ApplicationController
|
2
|
+
# GET /passwords/1
|
3
|
+
# GET /passwords/1.json
|
4
|
+
def show
|
5
|
+
if params.has_key?(:id)
|
6
|
+
@password = Password.find_by_url_token!(params[:id])
|
7
|
+
|
8
|
+
# If this is the first view, update record. Otherwise, record
|
9
|
+
# a view.
|
10
|
+
@first_view = @password.first_view
|
11
|
+
|
12
|
+
if @first_view
|
13
|
+
@password.update_attribute(:first_view, false)
|
14
|
+
else
|
15
|
+
@password.views = View.where(:password_id => @password.id, :successful => true)
|
16
|
+
end
|
17
|
+
else
|
18
|
+
redirect_to :root
|
19
|
+
return
|
20
|
+
end
|
21
|
+
|
22
|
+
# This password may have expired since the last view. Validate the password
|
23
|
+
# expiration before doing anything.
|
24
|
+
@password.validate!
|
25
|
+
|
26
|
+
unless @password.expired
|
27
|
+
# Decrypt the passwords
|
28
|
+
@key = EzCrypto::Key.with_password CRYPT_KEY, CRYPT_SALT
|
29
|
+
@payload = @key.decrypt64(@password.payload)
|
30
|
+
end
|
31
|
+
|
32
|
+
log_view(@password) unless @first_view
|
33
|
+
|
34
|
+
expires_now()
|
35
|
+
|
36
|
+
respond_to do |format|
|
37
|
+
format.html # show.html.erb
|
38
|
+
format.json { render :json => @password }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# GET /passwords/new
|
43
|
+
# GET /passwords/new.json
|
44
|
+
def new
|
45
|
+
@password = Password.new
|
46
|
+
|
47
|
+
expires_in 3.hours, :public => true, 'max-stale' => 0
|
48
|
+
|
49
|
+
respond_to do |format|
|
50
|
+
format.html # new.html.erb
|
51
|
+
format.json { render :json => @password }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# POST /passwords
|
56
|
+
# POST /passwords.json
|
57
|
+
def create
|
58
|
+
if params[:password][:payload].blank? or params[:password][:payload] == PAYLOAD_INITIAL_TEXT
|
59
|
+
redirect_to '/'
|
60
|
+
return
|
61
|
+
end
|
62
|
+
|
63
|
+
if params[:password][:payload].length > 250
|
64
|
+
redirect_to '/', :error => "That password is too long."
|
65
|
+
return
|
66
|
+
end
|
67
|
+
|
68
|
+
@password = Password.new()
|
69
|
+
|
70
|
+
@password.expire_after_days = params[:password][:expire_after_days]
|
71
|
+
@password.expire_after_views = params[:password][:expire_after_views]
|
72
|
+
|
73
|
+
if DELETABLE_BY_VIEWER_PASSWORDS && params[:password].key?(:deletable_by_viewer)
|
74
|
+
@password.deletable_by_viewer = true
|
75
|
+
else
|
76
|
+
@password.deletable_by_viewer = false
|
77
|
+
end
|
78
|
+
|
79
|
+
@password.url_token = rand(36**16).to_s(36)
|
80
|
+
@password.user_id = current_user.id if current_user
|
81
|
+
|
82
|
+
# The first view on new passwords are free since we redirect
|
83
|
+
# the passwd creator to the password itself (and don't burn up
|
84
|
+
# a view).
|
85
|
+
@password.first_view = true
|
86
|
+
|
87
|
+
# Encrypt the passwords
|
88
|
+
@key = EzCrypto::Key.with_password CRYPT_KEY, CRYPT_SALT
|
89
|
+
@password.payload = @key.encrypt64(params[:password][:payload])
|
90
|
+
|
91
|
+
@password.validate!
|
92
|
+
|
93
|
+
respond_to do |format|
|
94
|
+
if @password.save
|
95
|
+
format.html { redirect_to @password, :notice => "The password has been pushed." }
|
96
|
+
format.json { render :json => @password, :status => :created }
|
97
|
+
else
|
98
|
+
format.html { render :action => "new" }
|
99
|
+
format.json { render :json => @password.errors, :status => :unprocessable_entity }
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def destroy
|
105
|
+
if params.has_key?(:id)
|
106
|
+
@password = Password.find_by_url_token!(params[:id])
|
107
|
+
end
|
108
|
+
|
109
|
+
# Redirect to root if we couldn't find password or
|
110
|
+
# the found password wasn't market as deletable
|
111
|
+
unless @password || @password.deletable_by_viewer
|
112
|
+
redirect_to :root
|
113
|
+
return
|
114
|
+
end
|
115
|
+
|
116
|
+
@password.expired = true
|
117
|
+
@password.payload = nil
|
118
|
+
@password.deleted = true
|
119
|
+
|
120
|
+
respond_to do |format|
|
121
|
+
if @password.save
|
122
|
+
format.html { redirect_to @password, :notice => "The password has been deleted." }
|
123
|
+
format.json { render :json => @password, :status => :destroyed }
|
124
|
+
else
|
125
|
+
format.html { render :action => "new" }
|
126
|
+
format.json { render :json => @password.errors, :status => :unprocessable_entity }
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
private
|
132
|
+
|
133
|
+
##
|
134
|
+
# log_view
|
135
|
+
#
|
136
|
+
# Record that a view is being made for a password
|
137
|
+
#
|
138
|
+
def log_view(password)
|
139
|
+
view = View.new
|
140
|
+
view.password_id = password.id
|
141
|
+
view.ip = request.env["HTTP_X_FORWARDED_FOR"].nil? ? request.env["REMOTE_ADDR"] : request.env["HTTP_X_FORWARDED_FOR"]
|
142
|
+
|
143
|
+
# Limit retrieved values to 256 characters
|
144
|
+
view.user_agent = request.env["HTTP_USER_AGENT"].to_s[0,255]
|
145
|
+
view.referrer = request.env["HTTP_REFERER"].to_s[0,255]
|
146
|
+
|
147
|
+
view.successful = password.expired ? false : true
|
148
|
+
view.save
|
149
|
+
|
150
|
+
password.views << view
|
151
|
+
password
|
152
|
+
end
|
153
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
|
2
|
+
def google
|
3
|
+
@user = User.find_for_open_id(request.env["omniauth.auth"], current_user)
|
4
|
+
|
5
|
+
if @user.persisted?
|
6
|
+
flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Google"
|
7
|
+
sign_in_and_redirect @user, :event => :authentication
|
8
|
+
else
|
9
|
+
session["devise.google_data"] = request.env["omniauth.auth"]
|
10
|
+
redirect_to new_user_registration_url
|
11
|
+
end
|
12
|
+
end
|
13
|
+
def yahoo
|
14
|
+
@user = User.find_for_open_id(request.env["omniauth.auth"], current_user)
|
15
|
+
|
16
|
+
if @user.persisted?
|
17
|
+
flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Yahoo"
|
18
|
+
sign_in_and_redirect @user, :event => :authentication
|
19
|
+
else
|
20
|
+
session["devise.yahoo_data"] = request.env["omniauth.auth"]
|
21
|
+
redirect_to new_user_registration_url
|
22
|
+
end
|
23
|
+
end
|
24
|
+
def twitter
|
25
|
+
@user = User.find_for_open_id(request.env["omniauth.auth"], current_user)
|
26
|
+
|
27
|
+
if @user.persisted?
|
28
|
+
flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Twitter"
|
29
|
+
sign_in_and_redirect @user, :event => :authentication
|
30
|
+
else
|
31
|
+
session["devise.twitter_data"] = request.env["omniauth.auth"]
|
32
|
+
redirect_to new_user_registration_url
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def create
|
37
|
+
unless params.has_key?(:confirm)
|
38
|
+
omniauth = request.env["omniauth.auth"]
|
39
|
+
authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid'])
|
40
|
+
if authentication
|
41
|
+
flash[:success] = "Welcome back!"
|
42
|
+
sign_in_and_redirect(:user, authentication.user)
|
43
|
+
return
|
44
|
+
|
45
|
+
elsif user_signed_in?
|
46
|
+
current_user.authentications.create!(:provider => omniauth['provider'], :uid => omniauth['uid'])
|
47
|
+
flash[:success] = "Successfully linked account. You can now use this account to log into Gameface."
|
48
|
+
redirect_to authentications_url and return
|
49
|
+
|
50
|
+
else
|
51
|
+
session[:omniauth] = omniauth.except('extra')
|
52
|
+
redirect_to auth_confirm_path and return
|
53
|
+
end
|
54
|
+
else
|
55
|
+
omniauth = session[:omniauth]
|
56
|
+
user = User.new
|
57
|
+
user.apply_omniauth(omniauth)
|
58
|
+
if params.has_key?(:email)
|
59
|
+
user.email = params[:email]
|
60
|
+
end
|
61
|
+
if user.save
|
62
|
+
flash[:success] = "Welcome to Gameface! We're excited to have you!"
|
63
|
+
sign_in_and_redirect(:user, user) and return
|
64
|
+
else
|
65
|
+
session[:omniauth] = omniauth.except('extra')
|
66
|
+
raise "failed to save user record"
|
67
|
+
redirect_to auth_finalize_path and return
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|