Browse Source

Improve Token

Maarten van den Berg 8 years ago
parent
commit
a6c39c54f3
1 changed files with 27 additions and 1 deletions
  1. 27 1
      app/models/token.rb

+ 27 - 1
app/models/token.rb

@@ -14,7 +14,8 @@ class Token < ApplicationRecord
14 14
   #
15 15
   # @!attribute expires
16 16
   #   @return [DateTime]
17
-  #     when the token will expire (and will no longer be usable).
17
+  #     when the token will expire (and will no longer be usable). May be nil
18
+  #     for no expiry.
18 19
   #
19 20
   # @!attribute tokentype
20 21
   #   @return [String]
@@ -35,4 +36,29 @@ class Token < ApplicationRecord
35 36
   validates :user, presence: true
36 37
 
37 38
   belongs_to :user
39
+
40
+  before_validation :generate_token, if: "self.token.blank?"
41
+  before_validation :generate_expiry, on: :create
42
+
43
+  private
44
+  def generate_token
45
+    candidate = nil
46
+    loop do
47
+      candidate = SecureRandom::urlsafe_base64 32
48
+      break candidate unless Token.exists?(token: candidate)
49
+    end
50
+    self.token = candidate
51
+  end
52
+
53
+  # Defines the default expiry for the expiring tokens.
54
+  def generate_expiry
55
+    case self.tokentype
56
+    when TYPES[:password_reset]
57
+      1.days.since
58
+    when TYPES[:account_confirmation]
59
+      7.days.since
60
+    else
61
+      nil
62
+    end
63
+  end
38 64
 end