caboose-cms 0.3.32 → 0.3.33

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MGE4OWQ5MjhhZTk1ZDM2MTBhNjU0MzQyNjc0ZjExNDcwMGE5ZmMxYw==
4
+ N2U2MzU1ZGVlMDI2MjBmNzdkYjhkNjcxYWI5YzY4ZTNiNTEyYjkwNA==
5
5
  data.tar.gz: !binary |-
6
- Y2Q1YjRkYzUwY2EzNzIyMzRhY2U2NWZkM2ExN2VmOGM0YjExM2MyYw==
6
+ ZTczYjRkOTRhZWFjYmNkYmEzM2Y2MWIyZDkwZmM1ZTFlYWFkNGI0NQ==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- OTZlMTgxNzY0MjgwNjEzNDVhMGU2ZGM1YWI2YWYxY2FmYzhmZTUzNzVkNWU3
10
- ODA4MzE3YTI0YWRkNzgzOGFhNGUzY2MxZDA2MTliYjMxMjVmYmJhMzRjYTI4
11
- NTg5MzYyN2NmZWI0YWY5ZmNlN2NmYzJjYzg5YzlkNzkxYTUwMzI=
9
+ ODYyZjU0Y2IzZWE2YmZhNTYxNmQ2ZWM4OTZlNjc4ZDIyMzA5NmIwZWJiZDQ5
10
+ NzgxYjU0YzgxZmM5MTZiNTgzMWY0OWVkZjYyOTVkN2Y5ZTJmNGVlNzM2YmUx
11
+ ZGY1MDJkZDE4OGQzZGI3ODQyZGZmMTIwMDdjYjE4MzEyNGZiMzk=
12
12
  data.tar.gz: !binary |-
13
- MzMyZTk4MTc3ZjQ2MzQ2N2E5ZjIzZDU4YzYxYTgxMTI1MDM4OGY4MzdmMGIy
14
- NzBkZWYwZWZmMTI1MmU1MTdkNmI3M2UzN2NlMWM4MWZlMThkMzY0MjdjNGFm
15
- YjhlMDBiNWYxMzYxMmQyNzY3YTViY2YxNmFmOTFlZjkyOGZkNzk=
13
+ NDEwNTIzNDk0MTRjOTVlZTA1NWE0ZjE1YTU0MzU3NzRlODMwN2ZlNGMxNzBm
14
+ ZDEwMjk1Mjc5OWQxZWQ2OTI0Y2FiYzljYzlmNzVhMjQ1NWQ4YzkxMzZlNjYw
15
+ N2U1MThhNWJhMzBhNGEwNzRmODg4NTBmNDE1ZDQzZmU4NjU4YmE=
@@ -84,14 +84,18 @@ function caboose_modal_url(url)
84
84
  }
85
85
 
86
86
  function caboose_fix_colorbox() {
87
+ var color = '#111';
88
+ if (typeof COLORBOX_COLOR !== 'undefined')
89
+ color = COLORBOX_COLOR;
90
+
87
91
  var padding = 21; // 21 is default
88
- $("#cboxTopLeft" ).css('background', '#111');
89
- $("#cboxTopRight" ).css('background', '#111');
90
- $("#cboxBottomLeft" ).css('background', '#111');
91
- $("#cboxBottomRight" ).css('background', '#111');
92
- $("#cboxMiddleLeft" ).css('background', '#111');
93
- $("#cboxMiddleRight" ).css('background', '#111');
94
- $("#cboxTopCenter" ).css('background', '#111');
95
- $("#cboxBottomCenter" ).css('background', '#111');
92
+ $("#cboxTopLeft" ).css('background', color);
93
+ $("#cboxTopRight" ).css('background', color);
94
+ $("#cboxBottomLeft" ).css('background', color);
95
+ $("#cboxBottomRight" ).css('background', color);
96
+ $("#cboxMiddleLeft" ).css('background', color);
97
+ $("#cboxMiddleRight" ).css('background', color);
98
+ $("#cboxTopCenter" ).css('background', color);
99
+ $("#cboxBottomCenter" ).css('background', color);
96
100
  $("#cboxClose" ).hide();
97
101
  }
@@ -83,7 +83,7 @@ BoundImage = BoundControl.extend({
83
83
  if (resp.error)
84
84
  this.error(resp.error);
85
85
  else
86
- $('#'+this.el+'_container img').attr('src', this.attribute.value);
86
+ $('#'+this.el+'_container img').attr('src', this.attribute.value + '?' + Math.random());
87
87
  },
88
88
 
89
89
  error: function(str) {
@@ -25,7 +25,7 @@ module Caboose
25
25
  @is_real_page = false
26
26
 
27
27
  # Sets an instance variable of the logged in user
28
- @logged_in_user = logged_in_user
28
+ @logged_in_user = logged_in_user
29
29
 
30
30
  before_action
31
31
  end
@@ -39,5 +39,91 @@ module Caboose
39
39
  end
40
40
  render :json => resp
41
41
  end
42
- end
42
+
43
+ # GET /login/forgot-password
44
+ def forgot_password_form
45
+ @return_url = params[:return_url].nil? ? "/" : params[:return_url]
46
+ @modal = params[:modal].nil? ? false : params[:modal]
47
+ redirect_to @return_url if logged_in?
48
+ end
49
+
50
+ # POST /login/forgot-password
51
+ def send_reset_email
52
+ @return_url = params[:return_url].nil? ? "/" : params[:return_url]
53
+ redirect_to @return_url if logged_in?
54
+
55
+ resp = Caboose::StdClass.new
56
+ username = params[:username]
57
+
58
+ if username.nil? || username.strip.length == 0
59
+ resp.error = "You must enter a username."
60
+ render :json => resp
61
+ return
62
+ end
63
+
64
+ bob = nil
65
+ bob = Caboose::User.where(:username => username).first if Caboose::User.where(:username => username).exists?
66
+ bob = Caboose::User.where(:email => username).first if bob.nil? && bob = Caboose::User.where(:email => username)
67
+
68
+ if bob.nil?
69
+ resp.error = "The given username is not in our system."
70
+ render :json => resp
71
+ return
72
+ end
73
+
74
+ rand = Array.new(20){rand(36).to_s(36)}.join
75
+ bob.password_reset_id = rand
76
+ bob.password_reset_sent = DateTime.now
77
+ bob.save
78
+
79
+ LoginMailer.forgot_password_email(bob).deliver
80
+
81
+ resp.success = "We just sent you an email. The reset link inside is good for 3 days."
82
+ render :json => resp
83
+ end
84
+
85
+ # GET /login/reset-password/:reset_id
86
+ def reset_password_form
87
+ @return_url = params[:return_url].nil? ? "/" : params[:return_url]
88
+ redirect_to @return_url if logged_in?
89
+
90
+ @reset_id = params[:reset_id]
91
+ @user = Caboose::User.user_for_reset_id(@reset_id)
92
+ end
93
+
94
+ # POST /login/reset-password
95
+ def reset_password
96
+ @return_url = params[:return_url].nil? ? "/" : params[:return_url]
97
+ redirect_to @return_url if logged_in?
98
+
99
+ resp = Caboose::StdClass.new
100
+
101
+ reset_id = params[:id]
102
+ pass1 = params[:pass1]
103
+ pass2 = params[:pass2]
104
+
105
+ if reset_id.nil? || reset_id.strip.length == 0
106
+ resp.error = "No reset ID was given."
107
+ else
108
+ user = Caboose::User.user_for_reset_id(reset_id)
109
+
110
+ if user.nil?
111
+ resp.error = "The given reset ID is invalid."
112
+ elsif pass1 != pass2
113
+ resp.error = "Passwords don't match."
114
+ elsif pass1.length < 8
115
+ resp.error = "Passwords must be at least 8 characters"
116
+ else
117
+ user.password = Digest::SHA1.hexdigest(Caboose::salt + pass1)
118
+ user.password_reset_id = ''
119
+ user.password_reset_sent = ''
120
+ user.save
121
+ resp.redirect = '/login'
122
+ end
123
+
124
+ end
125
+ render :json => resp
126
+ end
127
+
128
+ end
43
129
  end
@@ -0,0 +1,10 @@
1
+ module Caboose
2
+ class ModalController < Caboose::ApplicationController
3
+ layout 'caboose/application'
4
+
5
+ # GET /modal/:url
6
+ def index
7
+ @url = "/#{params[:url]}"
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module Caboose
2
+ class LoginMailer < ActionMailer::Base
3
+ default :from => Caboose::email_from
4
+
5
+ def forgot_password_email(user)
6
+ @user = user
7
+ mail(:to => user.email, :subject => "#{Caboose::website_name} Forgot Password")
8
+ end
9
+ end
10
+ end
@@ -54,4 +54,13 @@ class Caboose::User < ActiveRecord::Base
54
54
  end
55
55
  return false
56
56
  end
57
+
58
+ def self.user_for_reset_id(reset_id)
59
+ return nil if reset_id.nil?
60
+ d = DateTime.now - 3.days
61
+ if self.where("password_reset_id = ? and password_reset_sent > ?", reset_id, d).exists?
62
+ return self.where("password_reset_id = ? and password_reset_sent > ?", reset_id, d).first
63
+ end
64
+ return nil
65
+ end
57
66
  end
@@ -0,0 +1,59 @@
1
+
2
+ <form action='/login/forgot-password' method='post' id='forgot_form'>
3
+ <h1>Forgot Password</h1>
4
+ <div id='content3'>
5
+ <p>Enter your username or email address and we'll send you a link that lets you reset your password.</p>
6
+ <input type='hidden' name='return_url' value='<%= @return_url %>' />
7
+ <input type='text' name='username' id='username' placeholder='Login or email' />
8
+ <div id='message'></div>
9
+ <p>
10
+ <input type='button' id='btn_cancel' value='Cancel' onclick="parent.$.fn.colorbox.close();" />
11
+ <input type='submit' id='btn_login' value='Help Me Remember' onclick='send_forgot_password_link(); return false;' />
12
+ </p>
13
+ </div>
14
+ </form>
15
+
16
+ <% content_for :caboose_css do %>
17
+ <style type="text/css">
18
+ #modal_content input[type="checkbox"] { position: relative; }
19
+ </style>
20
+ <% end %>
21
+ <% content_for :caboose_js do %>
22
+ <script type='text/javascript'>
23
+
24
+ var modal = false;
25
+ $(window).load(function() {
26
+ modal = new CabooseModal(400);
27
+ });
28
+
29
+ function send_forgot_password_link()
30
+ {
31
+ modal.autosize("<p class='loading'>Retrieving info...</p>");
32
+ $.ajax({
33
+ url: '/login/forgot-password',
34
+ type: 'post',
35
+ data: $('#forgot_form').serialize(),
36
+ success: function(resp) {
37
+ if (resp.error) modal.autosize("<p class='note error'>" + resp.error + "</p>");
38
+ if (resp.success)
39
+ {
40
+ //modal.autosize("<p class='note success'>" + resp.success + "</p>");
41
+ var div = $('<div/>')
42
+ .append($('<p/>').addClass('note success').html(resp.success))
43
+ .append($('<p/>').append($('<input/>').attr('type', 'button').val('Close').click(function() { modal.close(); })));
44
+ $('#content3').empty().append(div);
45
+ modal.autosize();
46
+ }
47
+ //if (resp.redirect != false) <%= @modal ? "" : "parent." %>window.location = resp.redirect;
48
+ //else parent.location.reload(true);
49
+ },
50
+ error: function() {
51
+ modal.autosize("<p class='note error'>Error</p>");
52
+ }
53
+ });
54
+ }
55
+ </script>
56
+ <% end %>
57
+ <%= content_for :caboose_css do %>
58
+ <%= stylesheet_link_tag "caboose/login", :media => "all" %>
59
+ <% end %>
@@ -1,15 +1,16 @@
1
1
 
2
2
  <form action='/login' method='post' id='login_form'>
3
- <p class='other_options'>
4
- <a href='/register?return_url=<%= @return_url %>'>Need to register?</a>
5
- </p>
6
3
  <h1>Login</h1>
7
4
  <input type='hidden' name='return_url' value='<%= @return_url %>' />
8
5
  <input type='text' name='username' id='username' placeholder='Login or email' />
9
6
  <input type='password' name='password' id='password' placeholder='Password' />
10
7
  <input type='checkbox' name='remember' id='remember' value='1' checked='true' /> Remember me
8
+ <ul class='other_options'>
9
+ <li><a href='/register?return_url=<%= @return_url %>'>Need to register?</a></li>
10
+ <li><a href='/login/forgot-password?return_url=<%= @return_url %>'>Forgot your password?</a></li>
11
+ </ul>
11
12
  <div id='message'></div>
12
- <p>
13
+ <p class='buttons'>
13
14
  <input type='button' id='btn_cancel' value='Cancel' onclick="parent.$.fn.colorbox.close();" />
14
15
  <input type='submit' id='btn_login' value='Login' onclick='login(); return false;' />
15
16
  </p>
@@ -22,7 +23,12 @@
22
23
  <% end %>
23
24
  <% content_for :caboose_js do %>
24
25
  <script type='text/javascript'>
25
- var modal = new CabooseModal(400);
26
+
27
+ var modal = false;
28
+ $(window).load(function() {
29
+ modal = new CabooseModal(400);
30
+ });
31
+
26
32
  function login()
27
33
  {
28
34
  modal.autosize("<p class='loading'>Logging in...</p>");
@@ -43,6 +49,7 @@ function login()
43
49
  }
44
50
  });
45
51
  }
52
+
46
53
  </script>
47
54
  <% end %>
48
55
  <%= content_for :caboose_css do %>
@@ -0,0 +1,46 @@
1
+ <h1>Reset Password</h1>
2
+
3
+ <% if @user.nil? %>
4
+ <p class='note error'>The given reset ID is invalid.</p>
5
+ <p class='buttons'><input type='button' value='Close' onclick="parent.window.location='/';" /></p>
6
+ <% else %>
7
+ <form action='/login/reset-password' method='post' id='reset_password_form'>
8
+ <input type='hidden' name='id' id='id' value='<%= @reset_id %>' />
9
+ <table cellpadding='4' cellspacing='0' border='0'>
10
+ <tr><td>New Password: </td><td><input type='password' name='pass1' id='pass1' style='width: 250px;' /></td></tr>
11
+ <tr><td>Confirm: </td><td><input type='password' name='pass2' id='pass2' style='width: 250px;' /></td></tr>
12
+ </table><br />
13
+ <div id='message'></div>
14
+ <p class='buttons'>
15
+ <input type='submit' value='Reset Password' onclick='reset_password(); return false;' />
16
+ <input type='button' value='Cancel' onclick="window.location='/';" />
17
+ </p>
18
+ </form>
19
+ <% end %>
20
+
21
+ <%= content_for :caboose_js do %>
22
+ <script type='text/javascript'>
23
+
24
+ var modal = false;
25
+ $(window).load(function() {
26
+ modal = new CabooseModal(400);
27
+ });
28
+
29
+ <% if !@user.nil? %>
30
+ function reset_password()
31
+ {
32
+ $.ajax({
33
+ url: '/login/reset-password',
34
+ type: 'post',
35
+ data: $('#reset_password_form').serialize(),
36
+ success: function(resp) {
37
+ if (resp.error) modal.autosize("<p class='note error'>" + resp.error + "</p>");
38
+ if (resp.redirect) window.location = resp.redirect;
39
+ }
40
+ });
41
+ }
42
+ <% end %>
43
+
44
+ </script>
45
+ <% end %>
46
+
@@ -0,0 +1,8 @@
1
+ <% if @user %>
2
+ <%
3
+ url = "#{Caboose::website_domain}/modal/login/reset-password/#{@user.password_reset_id}"
4
+ %>
5
+ <p>To reset your <%= Caboose::website_name %> website password, click the link below:</p>
6
+ <p><a href='<%= url %>'><%= url %></p>
7
+ <% end %>
8
+
@@ -0,0 +1,9 @@
1
+ <%= content_for :caboose_js do %>
2
+ <script type='text/javascript'>
3
+
4
+ $(document).ready(function() {
5
+ caboose_modal_url(<%= raw Caboose.json(@url) %>);
6
+ });
7
+
8
+ </script>
9
+ <% end %>
@@ -19,6 +19,9 @@
19
19
  </div>
20
20
  </div>
21
21
  <%= javascript_include_tag "caboose/modal" %>
22
+ <% if File.exists?("#{Rails.root}/app/assets/javascripts/modal.js") %>
23
+ <%= javascript_include_tag "modal" %>
24
+ <% end %>
22
25
  <%= yield :caboose_js %>
23
26
  </body>
24
27
  </html>
@@ -5,11 +5,17 @@ Caboose::Engine.routes.draw do
5
5
  get "station" => "station#index"
6
6
  get "station/plugin-count" => "station#plugin_count"
7
7
 
8
- get "login" => "login#index"
9
- post "login" => "login#login"
10
- get "logout" => "logout#index"
11
- get "register" => "register#index"
12
- post "register" => "register#register"
8
+ get "modal/:url" => "modal#index", :constraints => {:url => /.*/}
9
+
10
+ get "login/forgot-password" => "login#forgot_password_form"
11
+ post "login/forgot-password" => "login#send_reset_email"
12
+ get "login/reset-password/:reset_id" => "login#reset_password_form"
13
+ post "login/reset-password" => "login#reset_password"
14
+ get "login" => "login#index"
15
+ post "login" => "login#login"
16
+ get "logout" => "logout#index"
17
+ get "register" => "register#index"
18
+ post "register" => "register#register"
13
19
 
14
20
  get "my-account" => "users#my_account"
15
21
  put "my-account" => "users#update_my_account"
@@ -29,5 +29,17 @@ module Caboose
29
29
  # Whether or not to use URL parameters (parameters embedded in the URL before the querystring)
30
30
  mattr_accessor :use_url_params
31
31
  @@use_url_params = true
32
+
33
+ # Website name
34
+ mattr_accessor :website_name
35
+ @@website_name = "Website"
36
+
37
+ # Website domain name (with the protocol)
38
+ mattr_accessor :website_domain
39
+ @@website_domain = "http://www.google.com"
40
+
41
+ # Email settings
42
+ mattr_accessor :email_from
43
+ @@email_from = "webmaster@caboosecms.com"
32
44
 
33
45
  end
@@ -1,3 +1,3 @@
1
1
  module Caboose
2
- VERSION = '0.3.32'
2
+ VERSION = '0.3.33'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: caboose-cms
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.32
4
+ version: 0.3.33
5
5
  platform: ruby
6
6
  authors:
7
7
  - William Barry
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-11 00:00:00.000000000 Z
11
+ date: 2014-02-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -173,6 +173,7 @@ files:
173
173
  - app/controllers/caboose/application_controller.rb
174
174
  - app/controllers/caboose/login_controller.rb
175
175
  - app/controllers/caboose/logout_controller.rb
176
+ - app/controllers/caboose/modal_controller.rb
176
177
  - app/controllers/caboose/page_block_field_values_controller.rb
177
178
  - app/controllers/caboose/page_block_fields_controller.rb
178
179
  - app/controllers/caboose/page_block_types_controller.rb
@@ -189,6 +190,7 @@ files:
189
190
  - app/helpers/caboose/pages_helper.rb
190
191
  - app/helpers/caboose/permissions_helper.rb
191
192
  - app/helpers/caboose/products_helper.rb
193
+ - app/mailers/caboose/login_mailer.rb
192
194
  - app/models/caboose/ab_option.rb
193
195
  - app/models/caboose/ab_testing.rb
194
196
  - app/models/caboose/ab_value.rb
@@ -235,7 +237,11 @@ files:
235
237
  - app/views/caboose/application/show.html.erb
236
238
  - app/views/caboose/extras/error.html.erb
237
239
  - app/views/caboose/extras/error404.html.erb
240
+ - app/views/caboose/login/forgot_password_form.html.erb
238
241
  - app/views/caboose/login/index.html.erb
242
+ - app/views/caboose/login/reset_password_form.html.erb
243
+ - app/views/caboose/login_mailer/forgot_password_email.html.erb
244
+ - app/views/caboose/modal/index.html.erb
239
245
  - app/views/caboose/page_block_fields/admin_edit.html.erb
240
246
  - app/views/caboose/page_block_fields/admin_new.html.erb
241
247
  - app/views/caboose/page_block_types/admin_edit.html.erb