toodledo 1.3.3 → 1.3.4
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +8 -0
- data/lib/toodledo/server_error.rb +7 -0
- data/lib/toodledo/session.rb +49 -25
- data/lib/toodledo.rb +1 -1
- metadata +3 -3
data/History.txt
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
== 1.3.4 / 2010-10-08
|
2
|
+
|
3
|
+
* More patches for reestablishing connection, based off file modification time as well as :tokenexpires
|
4
|
+
|
5
|
+
== 1.3.3 / 2010-10-05
|
6
|
+
|
7
|
+
* Patches for reestablishing connection when the token is too old.
|
8
|
+
|
1
9
|
== 1.3.2 / 2010-02-16
|
2
10
|
|
3
11
|
* Added file caching for token (will write to $HOME/.toodledo/tokens/<user_id> file)
|
data/lib/toodledo/session.rb
CHANGED
@@ -26,10 +26,10 @@ module Toodledo
|
|
26
26
|
'Connection' => 'keep-alive',
|
27
27
|
'Keep-Alive' => '300'
|
28
28
|
}
|
29
|
-
|
30
|
-
# The key should be good for four hours.
|
31
|
-
EXPIRATION_TIME_IN_SECS = 60 * 60 * 4
|
32
29
|
|
30
|
+
# Make it a little less than 4 hours, so the file should always be fresher.
|
31
|
+
FILE_EXPIRATION_TIME_IN_SECS = (60 * 60 * 4) - 300
|
32
|
+
|
33
33
|
DATE_FORMAT = '%Y-%m-%d'
|
34
34
|
|
35
35
|
DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S'
|
@@ -57,6 +57,7 @@ module Toodledo
|
|
57
57
|
@folders_by_id = nil
|
58
58
|
@goals_by_id = nil
|
59
59
|
@contexts_by_id = nil
|
60
|
+
@expiration_time = nil
|
60
61
|
|
61
62
|
@logger = logger
|
62
63
|
end
|
@@ -65,7 +66,7 @@ module Toodledo
|
|
65
66
|
def md5(input_string)
|
66
67
|
return Digest::MD5.hexdigest(input_string)
|
67
68
|
end
|
68
|
-
|
69
|
+
|
69
70
|
# Connects to the server, asking for a new key that's good for an hour.
|
70
71
|
# Optionally takes a base URL as a parameter. Defaults to DEFAULT_API_URL.
|
71
72
|
def connect(base_url = DEFAULT_API_URL, proxy = nil)
|
@@ -94,27 +95,43 @@ module Toodledo
|
|
94
95
|
key = md5(md5(@password).to_s + session_token + @user_id);
|
95
96
|
|
96
97
|
@key = key
|
97
|
-
@start_time = Time.now
|
98
|
+
@start_time = Time.now
|
99
|
+
|
100
|
+
server_info = get_server_info()
|
101
|
+
@expiration_time = find_expiration_time(server_info[:tokenexpires])
|
98
102
|
end
|
99
103
|
|
100
104
|
# Disconnects from the server.
|
101
105
|
def disconnect()
|
102
106
|
logger.debug("disconnect()") if logger
|
107
|
+
|
108
|
+
token_path = get_token_file(user_id)
|
109
|
+
if token_path
|
110
|
+
logger.debug("deleting token path()") if logger
|
111
|
+
File.delete(token_path)
|
112
|
+
end
|
113
|
+
|
103
114
|
@key = nil
|
104
115
|
@start_time = nil
|
116
|
+
@expiration_time = nil
|
105
117
|
@base_url = nil
|
106
118
|
@proxy = nil
|
107
119
|
end
|
108
120
|
|
121
|
+
def find_expiration_time(expiration_in_mins)
|
122
|
+
# Expiration time is measured in minutes, i.e. 49.4
|
123
|
+
exp_mins = expiration_in_mins.to_i # drop the fractional bit
|
124
|
+
@start_time + (exp_mins * 60)
|
125
|
+
end
|
126
|
+
|
109
127
|
# Returns true if the session has expired.
|
110
128
|
def expired?
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
#return (Time.now - @start_time > EXPIRATION_TIME_IN_SECS)
|
129
|
+
current_time = Time.now
|
130
|
+
has_expired = (@expiration_time != nil) && (current_time > @expiration_time)
|
131
|
+
if (has_expired)
|
132
|
+
logger.debug("#{@expiration_time} > #{current_time}, expired == true") if logger
|
133
|
+
end
|
134
|
+
has_expired
|
118
135
|
end
|
119
136
|
|
120
137
|
# Returns a parsable URI object from the base API URL and the parameters.
|
@@ -134,6 +151,11 @@ module Toodledo
|
|
134
151
|
return output_string
|
135
152
|
end
|
136
153
|
|
154
|
+
def reconnect(base_url, proxy)
|
155
|
+
disconnect()
|
156
|
+
connect(base_url, proxy)
|
157
|
+
end
|
158
|
+
|
137
159
|
# Calls Toodledo with the method name, the parameters and the session key.
|
138
160
|
# Returns the text inside the document root, if any.
|
139
161
|
def call(method, params, key = nil)
|
@@ -147,17 +169,16 @@ module Toodledo
|
|
147
169
|
end
|
148
170
|
|
149
171
|
# If it's been more than an hour, then ask for a new key.
|
150
|
-
if (@key
|
151
|
-
logger.
|
172
|
+
if (@key && expired? && method != "getServerInfo")
|
173
|
+
logger.info("call(#{method}) connection expired, reconnecting...") if logger
|
152
174
|
|
153
175
|
# Save the connection information (we'll need it)
|
154
176
|
base_url = @base_url
|
155
177
|
proxy = @proxy
|
156
|
-
|
157
|
-
|
158
|
-
|
178
|
+
reconnect(base_url, proxy)
|
179
|
+
|
159
180
|
# swap out the key (if any) before we start assembling the request
|
160
|
-
if (key
|
181
|
+
if (key)
|
161
182
|
key = @key
|
162
183
|
end
|
163
184
|
end
|
@@ -213,9 +234,12 @@ module Toodledo
|
|
213
234
|
|
214
235
|
root_node = doc.root
|
215
236
|
if (root_node.name == 'error')
|
216
|
-
error_text = root_node.text
|
237
|
+
error_text = root_node.text
|
217
238
|
if (error_text == 'Invalid ID number')
|
218
239
|
raise Toodledo::ItemNotFoundError.new(error_text)
|
240
|
+
elsif (error_text == 'key did not validate')
|
241
|
+
raise Toodledo::InvalidKeyError.new(error_text)
|
242
|
+
# May want to get uncached token here as a recovery mechanism?
|
219
243
|
else
|
220
244
|
raise Toodledo::ServerError.new(error_text)
|
221
245
|
end
|
@@ -259,13 +283,13 @@ module Toodledo
|
|
259
283
|
|
260
284
|
# Returns true if the file is more than an hour old, false otherwise.
|
261
285
|
def is_too_old(token_path)
|
262
|
-
last_modified_time = File.new(token_path).mtime
|
263
|
-
expiration_time = Time.now -
|
264
|
-
|
265
|
-
|
266
|
-
logger.debug "is_too_old:
|
286
|
+
last_modified_time = File.new(token_path).mtime.to_i
|
287
|
+
expiration_time = Time.now.to_i - FILE_EXPIRATION_TIME_IN_SECS
|
288
|
+
too_old_by = last_modified_time - expiration_time
|
289
|
+
|
290
|
+
logger.debug "is_too_old: expires in #{too_old_by} seconds" if logger
|
267
291
|
|
268
|
-
return
|
292
|
+
return too_old_by < 0
|
269
293
|
end
|
270
294
|
|
271
295
|
# Gets there full path of the token file.
|
data/lib/toodledo.rb
CHANGED
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 1
|
7
7
|
- 3
|
8
|
-
-
|
9
|
-
version: 1.3.
|
8
|
+
- 4
|
9
|
+
version: 1.3.4
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Will Sargent
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-10-
|
17
|
+
date: 2010-10-08 00:00:00 -07:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|