remotty-rails 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +24 -0
- data/Gemfile +18 -0
- data/LICENSE.txt +22 -0
- data/README.md +234 -0
- data/Rakefile +2 -0
- data/app/controllers/remotty/base_application_controller.rb +36 -0
- data/app/controllers/remotty/users/base_controller.rb +16 -0
- data/app/controllers/remotty/users/confirmations_controller.rb +25 -0
- data/app/controllers/remotty/users/omniauth_callbacks_controller.rb +102 -0
- data/app/controllers/remotty/users/passwords_controller.rb +47 -0
- data/app/controllers/remotty/users/registrations_controller.rb +132 -0
- data/app/controllers/remotty/users/sessions_controller.rb +48 -0
- data/app/models/remotty/base_user.rb +83 -0
- data/app/serializers/remotty/user_serializer.rb +30 -0
- data/config/locales/ko.yml +58 -0
- data/lib/generators/remotty/rails/install_generator.rb +68 -0
- data/lib/generators/remotty/rails/templates/add_column_to_users.rb +42 -0
- data/lib/generators/remotty/rails/templates/auth_token.rb +22 -0
- data/lib/generators/remotty/rails/templates/create_auth_tokens.rb +28 -0
- data/lib/generators/remotty/rails/templates/create_oauth_authentications.rb +28 -0
- data/lib/generators/remotty/rails/templates/oauth_authentication.rb +18 -0
- data/lib/generators/remotty/rails/templates/paperclip_hash.rb +1 -0
- data/lib/generators/remotty/rails/templates/user_serializer.rb +3 -0
- data/lib/remotty/rails.rb +8 -0
- data/lib/remotty/rails/authentication.rb +6 -0
- data/lib/remotty/rails/authentication/json_auth_failure.rb +29 -0
- data/lib/remotty/rails/authentication/strategies/token_header_authenticable.rb +71 -0
- data/lib/remotty/rails/engine.rb +72 -0
- data/lib/remotty/rails/version.rb +5 -0
- data/rdoc.sh +3 -0
- data/remotty-rails.gemspec +35 -0
- metadata +231 -0
@@ -0,0 +1,47 @@
|
|
1
|
+
class Users::PasswordsController < Devise::PasswordsController
|
2
|
+
include Remotty::Users::BaseController
|
3
|
+
|
4
|
+
# POST /resource/password
|
5
|
+
# email주소를 이용해서 패스워드 변경 요청 메일을 발송함
|
6
|
+
#
|
7
|
+
# ==== return
|
8
|
+
# * +success+ - no_content
|
9
|
+
# * +failure+ - validation error message
|
10
|
+
#
|
11
|
+
def create
|
12
|
+
self.resource = resource_class.send_reset_password_instructions(resource_params)
|
13
|
+
yield resource if block_given?
|
14
|
+
|
15
|
+
if successfully_sent?(resource)
|
16
|
+
render nothing: true, status: :no_content
|
17
|
+
else
|
18
|
+
render_error 'VALIDATION_ERROR', resource.errors.full_messages.first
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# PUT /resource/password
|
23
|
+
# 토큰을 이용한 패스워드 변경
|
24
|
+
# 성공시 자동으로 로그인을 시도하고 토큰을 생성함
|
25
|
+
#
|
26
|
+
# ==== return
|
27
|
+
# * +success+ - 로그인 후 user with token json return
|
28
|
+
# * +failure+ - unauthorized with error message
|
29
|
+
#
|
30
|
+
def update
|
31
|
+
self.resource = resource_class.reset_password_by_token(resource_params)
|
32
|
+
yield resource if block_given?
|
33
|
+
|
34
|
+
if resource.errors.empty?
|
35
|
+
resource.unlock_access! if unlockable?(resource)
|
36
|
+
sign_in resource_name, resource, :store => false
|
37
|
+
|
38
|
+
token = resource.generate_auth_token!(auth_source)
|
39
|
+
render json: resource.with_token(token)
|
40
|
+
else
|
41
|
+
render_error 'UNAUTHORIZED',
|
42
|
+
resource.errors.full_messages.first,
|
43
|
+
:unauthorized
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
class Remotty::Users::RegistrationsController < Devise::RegistrationsController
|
2
|
+
include Remotty::Users::BaseController
|
3
|
+
|
4
|
+
wrap_parameters :user, include: [:email, :name, :password, :password_confirmation, :current_password]
|
5
|
+
|
6
|
+
# POST /resource
|
7
|
+
# 회원가입
|
8
|
+
def create
|
9
|
+
build_resource(sign_up_params)
|
10
|
+
resource.use_password = true
|
11
|
+
|
12
|
+
# oauth정보가 있으면 validation 체크
|
13
|
+
if params[:oauth]
|
14
|
+
unless valid_credential?(oauth_params)
|
15
|
+
render_error 'UNAUTHORIZED', 'Oauth credentials information is invalid', :unauthorized and return
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
if resource.save
|
20
|
+
yield resource if block_given?
|
21
|
+
|
22
|
+
resource.add_oauth_info(oauth_params) if params[:oauth]
|
23
|
+
|
24
|
+
if resource.active_for_authentication?
|
25
|
+
sign_up(resource_name, resource)
|
26
|
+
|
27
|
+
token = resource.generate_auth_token!(auth_source)
|
28
|
+
|
29
|
+
render json: resource.with_token(token)
|
30
|
+
else
|
31
|
+
expire_data_after_sign_in!
|
32
|
+
|
33
|
+
render_error 'UNAUTHORIZED',
|
34
|
+
find_message("signed_up_but_#{resource.inactive_message}"),
|
35
|
+
:unauthorized
|
36
|
+
end
|
37
|
+
else
|
38
|
+
clean_up_passwords resource
|
39
|
+
|
40
|
+
render_error 'VALIDATION_ERROR',
|
41
|
+
resource.errors.full_messages.first
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# PUT /resource
|
46
|
+
# 회원정보 수정 (password 제외한 일반 정보)
|
47
|
+
def update
|
48
|
+
self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key)
|
49
|
+
prev_unconfirmed_email = resource.unconfirmed_email if resource.respond_to?(:unconfirmed_email)
|
50
|
+
|
51
|
+
if account_update_params[:password].blank? # password 수정이 아니면
|
52
|
+
account_update_params.delete("password")
|
53
|
+
account_update_params.delete("password_confirmation")
|
54
|
+
|
55
|
+
if resource.update_without_password(account_update_params)
|
56
|
+
yield resource if block_given?
|
57
|
+
|
58
|
+
message_key = update_needs_confirmation?(resource, prev_unconfirmed_email) ?
|
59
|
+
:update_needs_confirmation : :updated
|
60
|
+
|
61
|
+
sign_in resource_name, resource, :bypass => true, :store => false
|
62
|
+
|
63
|
+
if message_key == :updated
|
64
|
+
render json: resource
|
65
|
+
else
|
66
|
+
render_error 'UNAUTHORIZED',
|
67
|
+
find_message(message_key),
|
68
|
+
:unauthorized
|
69
|
+
end
|
70
|
+
else
|
71
|
+
clean_up_passwords resource
|
72
|
+
|
73
|
+
render_error 'VALIDATION_ERROR',
|
74
|
+
resource.errors.full_messages.first
|
75
|
+
end
|
76
|
+
else # password 수정이면
|
77
|
+
if resource.use_password
|
78
|
+
resource.update_with_password(account_update_params)
|
79
|
+
else
|
80
|
+
resource.use_password = true
|
81
|
+
resource.update_attributes(account_update_params)
|
82
|
+
clean_up_passwords resource
|
83
|
+
end
|
84
|
+
|
85
|
+
if resource.errors.blank?
|
86
|
+
render json: resource
|
87
|
+
else
|
88
|
+
render_error 'VALIDATION_ERROR',
|
89
|
+
resource.errors.full_messages.first
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# DELETE /resource
|
95
|
+
# 회원탈퇴
|
96
|
+
def destroy
|
97
|
+
resource.destroy
|
98
|
+
Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name)
|
99
|
+
set_flash_message :notice, :destroyed if is_flashing_format?
|
100
|
+
yield resource if block_given?
|
101
|
+
render nothing: true, status: :no_content
|
102
|
+
end
|
103
|
+
|
104
|
+
private
|
105
|
+
|
106
|
+
def oauth_params
|
107
|
+
params.require(:oauth).permit :provider, :uid, info: [:name, :image], credentials: [:token, :secret, :expires_at]
|
108
|
+
end
|
109
|
+
|
110
|
+
# credential 체크
|
111
|
+
def valid_credential?(oauth_params)
|
112
|
+
if oauth_params['provider'] == 'twitter'
|
113
|
+
client = Twitter::REST::Client.new do |config|
|
114
|
+
config.consumer_key = Settings.omniauth.twitter.consumer_key
|
115
|
+
config.consumer_secret = Settings.omniauth.twitter.consumer_secret
|
116
|
+
config.access_token = oauth_params['credentials']['token']
|
117
|
+
config.access_token_secret = oauth_params['credentials']['secret']
|
118
|
+
end
|
119
|
+
|
120
|
+
begin
|
121
|
+
twitter_user = client.user
|
122
|
+
if twitter_user.id == oauth_params['uid'].to_i
|
123
|
+
return true
|
124
|
+
end
|
125
|
+
rescue Twitter::Error
|
126
|
+
return false
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
false
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
class Remotty::Users::SessionsController < Devise::SessionsController
|
2
|
+
include Remotty::Users::BaseController
|
3
|
+
include ActionController::Flash
|
4
|
+
wrap_parameters :user, include: [:email, :password]
|
5
|
+
|
6
|
+
# POST /resource/sign_in
|
7
|
+
# email과 password로 로그인
|
8
|
+
# 새로운 토큰 생성
|
9
|
+
#
|
10
|
+
# ==== return
|
11
|
+
# * +success+ - 로그인 후 user with token json return
|
12
|
+
# * +failure+ - unauthorized with error message
|
13
|
+
#
|
14
|
+
def create
|
15
|
+
self.resource = warden.authenticate!(:scope => resource_name)
|
16
|
+
sign_in(resource_name, resource, store: false)
|
17
|
+
yield resource if block_given?
|
18
|
+
token = resource.generate_auth_token!(auth_source)
|
19
|
+
render json: resource.with_token(token)
|
20
|
+
end
|
21
|
+
|
22
|
+
# DELETE /resource/sign_out
|
23
|
+
# 로그아웃. 로그인이 되어 있지 않아도 에러를 발생하지는 않음
|
24
|
+
# 토큰이용시 토큰을 삭제함
|
25
|
+
#
|
26
|
+
# ==== return
|
27
|
+
# * +success+ - no_content
|
28
|
+
# * +failure+ - no_content
|
29
|
+
#
|
30
|
+
def destroy
|
31
|
+
user = current_user
|
32
|
+
|
33
|
+
signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name))
|
34
|
+
if signed_out
|
35
|
+
if user && request.headers["X-Auth-Token"].present?
|
36
|
+
auth_token = user.auth_tokens.where(token: Digest::SHA512.hexdigest(request.headers["X-Auth-Token"])).first
|
37
|
+
auth_token.destroy if auth_token
|
38
|
+
end
|
39
|
+
|
40
|
+
session.options[:skip] = true
|
41
|
+
response.headers['Set-Cookie'] = 'rack.session=; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMT'
|
42
|
+
end
|
43
|
+
yield resource if block_given?
|
44
|
+
|
45
|
+
render nothing: true, status: :no_content
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
module Remotty::BaseUser
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
|
4
|
+
included do
|
5
|
+
has_many :auth_tokens, dependent: :destroy
|
6
|
+
has_many :oauth_authentications, dependent: :destroy
|
7
|
+
|
8
|
+
validates :name, presence: true
|
9
|
+
|
10
|
+
has_attached_file :avatar, :styles => { :original => "512x512#", :small => "200x200#", :thumb => "64x64#" }
|
11
|
+
validates_attachment_content_type :avatar, :content_type => /\Aimage\/.*\Z/
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_accessor :auth_token
|
15
|
+
|
16
|
+
def generate_auth_token!(auth_source)
|
17
|
+
token = nil
|
18
|
+
|
19
|
+
loop do
|
20
|
+
token = Devise.friendly_token
|
21
|
+
break token unless self.auth_tokens.where(token: Digest::SHA512.hexdigest(token)).first
|
22
|
+
end
|
23
|
+
|
24
|
+
auth_token = AuthToken.create({user_id:self.id, token: Digest::SHA512.hexdigest(token)})
|
25
|
+
auth_token.update_source(auth_source[:source], auth_source[:info])
|
26
|
+
|
27
|
+
token
|
28
|
+
end
|
29
|
+
|
30
|
+
def with_token(token)
|
31
|
+
self.auth_token = token;
|
32
|
+
::UserSerializer.new(self)
|
33
|
+
end
|
34
|
+
|
35
|
+
# oauth authentication 추가
|
36
|
+
#
|
37
|
+
# * +auth+ : auth 정보
|
38
|
+
# * provider, uid, info(name, image), credentials(token, secret, expires_at)
|
39
|
+
#
|
40
|
+
def add_oauth_info(auth)
|
41
|
+
oauth = OauthAuthentication.find_or_create_by(provider: auth[:provider], uid: auth[:uid])
|
42
|
+
if oauth
|
43
|
+
oauth.update_with_credential(auth[:credentials])
|
44
|
+
oauth.user = self
|
45
|
+
oauth.save
|
46
|
+
end
|
47
|
+
|
48
|
+
if auth[:info][:image]
|
49
|
+
self.avatar_remote_url = auth[:info][:image]
|
50
|
+
self.save
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# remote url attachment helper
|
55
|
+
#
|
56
|
+
def avatar_remote_url=(url)
|
57
|
+
avatar_url = process_uri(url)
|
58
|
+
self.avatar = URI.parse(avatar_url)
|
59
|
+
# Assuming url_value is http://example.com/photos/face.png
|
60
|
+
# avatar_file_name == "face.png"
|
61
|
+
# avatar_content_type == "image/png"
|
62
|
+
@avatar_remote_url = avatar_url
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
# fix uri redirection (http -> https)
|
68
|
+
def process_uri(uri)
|
69
|
+
ret = uri
|
70
|
+
|
71
|
+
require 'open-uri'
|
72
|
+
require 'open_uri_redirections'
|
73
|
+
begin
|
74
|
+
open(uri, :allow_redirections => :safe) do |r|
|
75
|
+
ret = r.base_uri.to_s
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
ret
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# user serializer
|
2
|
+
#
|
3
|
+
# ==== column
|
4
|
+
# * +id+
|
5
|
+
# * +name+
|
6
|
+
# * +email+
|
7
|
+
# * +use_password+
|
8
|
+
# * +avatar+
|
9
|
+
# * +original+
|
10
|
+
# * +small+
|
11
|
+
# * +thumb+
|
12
|
+
# * +auth_token+
|
13
|
+
#
|
14
|
+
class Remotty::UserSerializer < ActiveModel::Serializer
|
15
|
+
attributes :id, :name, :email, :use_password, :avatar, :auth_token
|
16
|
+
|
17
|
+
def avatar
|
18
|
+
{
|
19
|
+
original:object.avatar.url,
|
20
|
+
small:object.avatar.url(:small),
|
21
|
+
thumb:object.avatar.url(:thumb)
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
def include_auth_token?
|
26
|
+
object.auth_token
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
2
|
+
|
3
|
+
ko:
|
4
|
+
errors:
|
5
|
+
messages:
|
6
|
+
expired: "가(이) 만료되었습니다. 새로 요청해 주십시오"
|
7
|
+
not_found: "를(을) 찾을 수 없습니다"
|
8
|
+
already_confirmed: "이미 확인되었습니다, 다시 로그인 해 주십시오"
|
9
|
+
not_locked: "가(이) 잠기지 않았습니다"
|
10
|
+
not_saved:
|
11
|
+
one: "1개의 에러가 발생해서 %{resource}를(을) 저장할 수 없습니다:"
|
12
|
+
other: "%{count}개의 에러가 발생해서 %{resource}를(을) 저장할 수 없습니다:"
|
13
|
+
|
14
|
+
devise:
|
15
|
+
failure:
|
16
|
+
already_authenticated: '이미 로그인하셨습니다.'
|
17
|
+
unauthenticated: '이용하시려면 로그인하거나 가입하셔야 합니다.'
|
18
|
+
unconfirmed: '계정 확인 하셔야 이용하실 수 있습니다.'
|
19
|
+
locked: '계정이 잠겼습니다.'
|
20
|
+
invalid: '이메일이나 패스워드가 다릅니다.'
|
21
|
+
invalid_token: '잘못된 인증 토큰 입니다.'
|
22
|
+
timeout: '세션이 만료되어습니다, 계속하시려면 로그인해주세요.'
|
23
|
+
inactive: '계정이 아직 활성화 되지 않았습니다. '
|
24
|
+
not_found_in_database: '이메일이나 패스워드가 다릅니다.'
|
25
|
+
sessions:
|
26
|
+
signed_in: '성공적으로 로그인 하셨습니다.'
|
27
|
+
signed_out: '성공적으로 로그아웃 하셨습니다.'
|
28
|
+
passwords:
|
29
|
+
send_instructions: '어떻게 비밀번호를 재설정하는지 안내하는 메일을 발송하였습니다. 잠시후 확인해 보세요.'
|
30
|
+
updated: '비밀번호를 성공적으로 변경했습니다. 이제 로그인된 상태입니다.'
|
31
|
+
updated_not_active: '비밀번호를 성공적으로 변경했습니다.'
|
32
|
+
send_paranoid_instructions: "데이터베이스에 고객님의 이메일 주소가 존재하면, 비밀번호 복구 링크가 담긴 이메일을 곧 받으실 수 있습니다."
|
33
|
+
confirmations:
|
34
|
+
send_instructions: '이메일 주소를 확인하는 메일을 발송하였습니다. 잠시후에 메일을 확인해보세요.'
|
35
|
+
send_paranoid_instructions: '데이터베이스에 고객님의 이메일 주소가 존재하면, 이메일 주소를 확인하는 방법이 담긴 이메일을 곧 받으실 수 있습니다.'
|
36
|
+
confirmed: '성공적으로 이메일 주소를 확인하였습니다. 이제 로그인된 상태입니다.'
|
37
|
+
registrations:
|
38
|
+
signed_up: '환영합니다! 성공적으로 가입하셨습니다.'
|
39
|
+
signed_up_but_unconfirmed: '이메일 주소 확인 링크가 담긴 메일을 발송하였습니다. 계정을 활성화 하기 위해서 그 링크를 방문해주세요.'
|
40
|
+
signed_up_but_inactive: '고객님은 성공적으로 가입하셨습니다. 그러나 아직 계정이 활성화되지 않아 지금 로그인하실 수 없습니다.'
|
41
|
+
signed_up_but_locked: '고객님은 성공적으로 가입하셨습니다. 그러나 계정이 잠겨 있어 지금 로그인하실 수 없습니다.'
|
42
|
+
updated: '성공적으로 계정이 수정되었습니다.'
|
43
|
+
update_needs_confirmation: "성공적으로 계정이 수정되었습니다, 하지만 저희가 이메일주소를 확인해야 합니다. 이메일을 확인하시고 새로 바뀐 이메일 주소를 확인하는 링크를 방문해주세요."
|
44
|
+
destroyed: '안녕히가세요! 계정이 성공적으로 삭제되었습니다. 다시 뵙기를 고대합니다.'
|
45
|
+
unlocks:
|
46
|
+
send_instructions: '계정 잠금을 푸는 링크가 담긴 메일을 발송하있습니다. 잠시후에 확인해 보세요.'
|
47
|
+
unlocked: '성공적으로 계정 잠금을 풀었습니다. 계속 이용하시려면 로그인하세요.'
|
48
|
+
send_paranoid_instructions: '고객님의 계정이 존재하면, 곧 계정 잠금을 푸는 방법이 담긴 이메일을 받으실 수 있습니다.'
|
49
|
+
omniauth_callbacks:
|
50
|
+
success: '%{kind} 계정으로 성공적으로 인증되었습니다.'
|
51
|
+
failure: '다음과 같은 이유로 %{kind}에서 인증에 실패하였습니다. "%{reason}"'
|
52
|
+
mailer:
|
53
|
+
confirmation_instructions:
|
54
|
+
subject: '이메일 주소 확인 메일'
|
55
|
+
reset_password_instructions:
|
56
|
+
subject: '비밀번호 변경 확인 메일'
|
57
|
+
unlock_instructions:
|
58
|
+
subject: '계정 Unlock 메일'
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
require 'rails/generators/migration'
|
3
|
+
|
4
|
+
module Remotty::Rails
|
5
|
+
module Generators
|
6
|
+
# 마이그레이션 생성 및 각종 클래스&설정 추가 및 변경
|
7
|
+
#
|
8
|
+
# ==== migration
|
9
|
+
# * +add_column_to_users.rb+ - user
|
10
|
+
# * +create_auth_tokens.rb+ - auth token
|
11
|
+
# * +create_oauth_authentications.rb+ - oauth authentication
|
12
|
+
#
|
13
|
+
# ==== model
|
14
|
+
# * +auth_token.rb+ - auth token
|
15
|
+
# * +oauth_authentication.rb+ - oauth_authentication
|
16
|
+
# * +user.rb+ - user model에 base include
|
17
|
+
#
|
18
|
+
# ==== configuration
|
19
|
+
# * +paperclip_hash.rb+ - paperclip hash
|
20
|
+
#
|
21
|
+
# ==== serializer
|
22
|
+
# * +user_serializer.rb+ - user model serializer
|
23
|
+
#
|
24
|
+
# ==== controller
|
25
|
+
# * +application_controller.rb+ - application controller에 base include
|
26
|
+
#
|
27
|
+
class InstallGenerator < ::Rails::Generators::Base
|
28
|
+
include ::Rails::Generators::Migration
|
29
|
+
|
30
|
+
desc "Creates a Remotty Rails model initializer and copy files to your application."
|
31
|
+
|
32
|
+
source_root File.expand_path("../templates", __FILE__)
|
33
|
+
|
34
|
+
# migration number 생성용 변수
|
35
|
+
@migration_index = 0
|
36
|
+
|
37
|
+
# migration number는 현재날짜시간 + index(1,2,...) 형식으로 생성함
|
38
|
+
def self.next_migration_number(path)
|
39
|
+
@migration_index += 1
|
40
|
+
(Time.now.utc.strftime("%Y%m%d%H%M%S").to_i + @migration_index).to_s
|
41
|
+
end
|
42
|
+
|
43
|
+
# add & update files
|
44
|
+
def copy_purple_attachment
|
45
|
+
template 'auth_token.rb', 'app/models/auth_token.rb'
|
46
|
+
template 'oauth_authentication.rb', 'app/models/oauth_authentication.rb'
|
47
|
+
template 'user_serializer.rb', 'app/serializers/user_serializer.rb'
|
48
|
+
template 'paperclip_hash.rb', 'config/initializers/paperclip_hash.rb'
|
49
|
+
append_to_file 'config/initializers/paperclip_hash.rb' do
|
50
|
+
secret = SecureRandom.hex(40)
|
51
|
+
"Paperclip::Attachment.default_options.update({ :hash_secret => '#{secret}' })"
|
52
|
+
end
|
53
|
+
inject_into_class 'app/controllers/application_controller.rb', ApplicationController do
|
54
|
+
" include Remotty::BaseApplicationController\n"
|
55
|
+
end
|
56
|
+
inject_into_class 'app/models/user.rb', User do
|
57
|
+
" include Remotty::BaseUser\n"
|
58
|
+
end
|
59
|
+
gsub_file 'app/models/user.rb', 'registerable', 'registerable, :confirmable, :omniauthable'
|
60
|
+
|
61
|
+
migration_template 'add_column_to_users.rb', 'db/migrate/add_column_to_users.rb'
|
62
|
+
migration_template 'create_auth_tokens.rb', 'db/migrate/create_auth_tokens.rb'
|
63
|
+
migration_template 'create_oauth_authentications.rb', 'db/migrate/create_oauth_authentications.rb'
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|