google-authsub 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. data/.gitignore +1 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README +98 -0
  4. data/Rakefile +19 -0
  5. data/VERSION +1 -0
  6. data/coverage/-Library-Ruby-Gems-1_8-gems-FakeWeb-1_1_2-lib-fake_net_http_rb.html +679 -0
  7. data/coverage/-Library-Ruby-Gems-1_8-gems-FakeWeb-1_1_2-lib-fake_web_rb.html +843 -0
  8. data/coverage/-Library-Ruby-Gems-1_8-gems-rcov-0_8_1_2_0-lib-rcov_rb.html +1598 -0
  9. data/coverage/index.html +360 -0
  10. data/coverage/lib-googleauthsub_rb.html +877 -0
  11. data/coverage/spec-googleauthsub_spec_rb.html +950 -0
  12. data/coverage/spec-spec_helper_rb.html +640 -0
  13. data/doc/classes/AuthEchoServlet.html +152 -0
  14. data/doc/classes/AuthEchoServlet.src/M000001.html +20 -0
  15. data/doc/classes/AuthEchoServlet.src/M000002.html +18 -0
  16. data/doc/classes/GData/AuthSubError.html +139 -0
  17. data/doc/classes/GData/AuthSubError.src/M000019.html +18 -0
  18. data/doc/classes/GData/Error.html +111 -0
  19. data/doc/classes/GData/GoogleAuthSub.html +521 -0
  20. data/doc/classes/GData/GoogleAuthSub.src/M000001.html +29 -0
  21. data/doc/classes/GData/GoogleAuthSub.src/M000002.html +22 -0
  22. data/doc/classes/GData/GoogleAuthSub.src/M000003.html +29 -0
  23. data/doc/classes/GData/GoogleAuthSub.src/M000004.html +22 -0
  24. data/doc/classes/GData/GoogleAuthSub.src/M000005.html +24 -0
  25. data/doc/classes/GData/GoogleAuthSub.src/M000006.html +19 -0
  26. data/doc/classes/GData/GoogleAuthSub.src/M000007.html +18 -0
  27. data/doc/classes/GData/GoogleAuthSub.src/M000008.html +18 -0
  28. data/doc/classes/GData/GoogleAuthSub.src/M000009.html +24 -0
  29. data/doc/classes/GData/GoogleAuthSub.src/M000010.html +25 -0
  30. data/doc/classes/GData/GoogleAuthSub.src/M000011.html +30 -0
  31. data/doc/classes/GData/GoogleAuthSub.src/M000012.html +18 -0
  32. data/doc/classes/GData/GoogleAuthSub.src/M000013.html +18 -0
  33. data/doc/classes/GData/GoogleAuthSub.src/M000014.html +18 -0
  34. data/doc/classes/GData/GoogleAuthSub.src/M000015.html +18 -0
  35. data/doc/classes/GData/GoogleAuthSub.src/M000016.html +20 -0
  36. data/doc/classes/GData/GoogleAuthSub.src/M000017.html +20 -0
  37. data/doc/classes/GData/GoogleAuthSub.src/M000018.html +19 -0
  38. data/doc/classes/GData.html +162 -0
  39. data/doc/created.rid +1 -0
  40. data/doc/files/googleauthsub_rb.html +140 -0
  41. data/doc/files/lib/googleauthsub_rb.html +140 -0
  42. data/doc/files/spec/googleauthsub_spec_rb.html +146 -0
  43. data/doc/files/spec/googleresponder_rb.html +121 -0
  44. data/doc/files/spec/spec_helper_rb.html +149 -0
  45. data/doc/fr_class_index.html +31 -0
  46. data/doc/fr_file_index.html +30 -0
  47. data/doc/fr_method_index.html +45 -0
  48. data/doc/index.html +24 -0
  49. data/doc/rdoc-style.css +208 -0
  50. data/google-authsub-0.0.2.gem +0 -0
  51. data/google-authsub-0.0.3.gem +0 -0
  52. data/google-authsub.gemspec +109 -0
  53. data/lib/googleauthsub.rb +271 -0
  54. data/live test/authsub_test.html +40 -0
  55. data/live test/gastest.rb +90 -0
  56. data/spec/googleauthsub_spec.rb +350 -0
  57. data/spec/googleresponder.rb +26 -0
  58. data/spec/mock responses/bad_token_info.txt +11 -0
  59. data/spec/mock responses/calendar.txt +11 -0
  60. data/spec/mock responses/revoke_token.txt +7 -0
  61. data/spec/mock responses/revoked_token.txt +17 -0
  62. data/spec/mock responses/session_token.txt +9 -0
  63. data/spec/mock responses/token_info.txt +11 -0
  64. data/spec/mock responses/unauthorized.txt +18 -0
  65. data/spec/mock_certs/test_private_key.pem +15 -0
  66. data/spec/mock_certs/test_public_key.pem +6 -0
  67. data/spec/spec_helper.rb +30 -0
  68. data/spec/spec_opts +7 -0
  69. metadata +125 -0
@@ -0,0 +1,521 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>Class: GData::GoogleAuthSub</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td><strong>Class</strong></td>
53
+ <td class="class-name-in-header">GData::GoogleAuthSub</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../../files/lib/googleauthsub_rb.html">
59
+ lib/googleauthsub.rb
60
+ </a>
61
+ <br />
62
+ <a href="../../files/spec/spec_helper_rb.html">
63
+ spec/spec_helper.rb
64
+ </a>
65
+ <br />
66
+ </td>
67
+ </tr>
68
+
69
+ <tr class="top-aligned-row">
70
+ <td><strong>Parent:</strong></td>
71
+ <td>
72
+ Object
73
+ </td>
74
+ </tr>
75
+ </table>
76
+ </div>
77
+ <!-- banner header -->
78
+
79
+ <div id="bodyContent">
80
+
81
+
82
+
83
+ <div id="contextContent">
84
+
85
+ <div id="description">
86
+ <p>
87
+ <a href="GoogleAuthSub.html">GoogleAuthSub</a> This class handles the
88
+ Google Authentication for Web Applications API
89
+ </p>
90
+
91
+ </div>
92
+
93
+
94
+ </div>
95
+
96
+ <div id="method-list">
97
+ <h3 class="section-bar">Methods</h3>
98
+
99
+ <div class="name-list">
100
+ <a href="#M000017">auth_data</a>&nbsp;&nbsp;
101
+ <a href="#M000016">auth_header</a>&nbsp;&nbsp;
102
+ <a href="#M000015">delete</a>&nbsp;&nbsp;
103
+ <a href="#M000012">get</a>&nbsp;&nbsp;
104
+ <a href="#M000004">new</a>&nbsp;&nbsp;
105
+ <a href="#M000013">post</a>&nbsp;&nbsp;
106
+ <a href="#M000014">put</a>&nbsp;&nbsp;
107
+ <a href="#M000006">receive_token</a>&nbsp;&nbsp;
108
+ <a href="#M000005">request_url</a>&nbsp;&nbsp;
109
+ <a href="#M000010">revoke_token</a>&nbsp;&nbsp;
110
+ <a href="#M000008">secure_token?</a>&nbsp;&nbsp;
111
+ <a href="#M000009">session_token</a>&nbsp;&nbsp;
112
+ <a href="#M000007">session_token?</a>&nbsp;&nbsp;
113
+ <a href="#M000003">set_private_key</a>&nbsp;&nbsp;
114
+ <a href="#M000018">sig</a>&nbsp;&nbsp;
115
+ <a href="#M000011">token_info</a>&nbsp;&nbsp;
116
+ </div>
117
+ </div>
118
+
119
+ </div>
120
+
121
+
122
+ <!-- if includes -->
123
+
124
+ <div id="section">
125
+
126
+
127
+
128
+
129
+
130
+ <div id="attribute-list">
131
+ <h3 class="section-bar">Attributes</h3>
132
+
133
+ <div class="name-list">
134
+ <table>
135
+ <tr class="top-aligned-row context-row">
136
+ <td class="context-item-name">next_url</td>
137
+ <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
138
+ <td class="context-item-desc"></td>
139
+ </tr>
140
+ <tr class="top-aligned-row context-row">
141
+ <td class="context-item-name">scope</td>
142
+ <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
143
+ <td class="context-item-desc"></td>
144
+ </tr>
145
+ <tr class="top-aligned-row context-row">
146
+ <td class="context-item-name">secure</td>
147
+ <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
148
+ <td class="context-item-desc"></td>
149
+ </tr>
150
+ <tr class="top-aligned-row context-row">
151
+ <td class="context-item-name">session</td>
152
+ <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
153
+ <td class="context-item-desc"></td>
154
+ </tr>
155
+ <tr class="top-aligned-row context-row">
156
+ <td class="context-item-name">sigalg</td>
157
+ <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
158
+ <td class="context-item-desc"></td>
159
+ </tr>
160
+ <tr class="top-aligned-row context-row">
161
+ <td class="context-item-name">target</td>
162
+ <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
163
+ <td class="context-item-desc"></td>
164
+ </tr>
165
+ <tr class="top-aligned-row context-row">
166
+ <td class="context-item-name">token</td>
167
+ <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
168
+ <td class="context-item-desc"></td>
169
+ </tr>
170
+ </table>
171
+ </div>
172
+ </div>
173
+
174
+
175
+
176
+ <!-- if method_list -->
177
+ <div id="methods">
178
+ <h3 class="section-bar">Public Class methods</h3>
179
+
180
+ <div id="method-M000004" class="method-detail">
181
+ <a name="M000004"></a>
182
+
183
+ <div class="method-heading">
184
+ <a href="GoogleAuthSub.src/M000004.html" target="Code" class="method-signature"
185
+ onclick="popupCode('GoogleAuthSub.src/M000004.html');return false;">
186
+ <span class="method-name">new</span><span class="method-args">(opts = {})</span>
187
+ </a>
188
+ </div>
189
+
190
+ <div class="method-description">
191
+ <p>
192
+ Create a <a href="GoogleAuthSub.html#M000004">new</a> GoogleAuthsub object
193
+ Options specified in <tt>opts</tt> consist of:
194
+ </p>
195
+ <ul>
196
+ <li>:next_url - (String) The url to redirect back to once the user has signed
197
+ in to Google.
198
+
199
+ </li>
200
+ <li>:scope_url - (String) The service from Google that you wish to receive data
201
+ from with this token.
202
+
203
+ </li>
204
+ <li>:session - (boolean) Whether the token is able to be used to <a
205
+ href="GoogleAuthSub.html#M000012">get</a> a session token or is just one
206
+ use.
207
+
208
+ </li>
209
+ <li>:secure - (boolean) Whether the token can be used for sessions.
210
+
211
+ </li>
212
+ <li>:sigalg - (String) Currently not needed, as the Authsub specification only
213
+ has rsa-sha1.
214
+
215
+ </li>
216
+ </ul>
217
+ </div>
218
+ </div>
219
+
220
+ <div id="method-M000003" class="method-detail">
221
+ <a name="M000003"></a>
222
+
223
+ <div class="method-heading">
224
+ <a href="GoogleAuthSub.src/M000003.html" target="Code" class="method-signature"
225
+ onclick="popupCode('GoogleAuthSub.src/M000003.html');return false;">
226
+ <span class="method-name">set_private_key</span><span class="method-args">(key)</span>
227
+ </a>
228
+ </div>
229
+
230
+ <div class="method-description">
231
+ <p>
232
+ <tt>key</tt> can be a File, String or OpenSSL::Pkey::RSA Sets the private
233
+ key to use for secure sessions. This should correspond to the public key
234
+ sent to Google in the registration process. For registration details see:
235
+ </p>
236
+ <pre>
237
+ http://code.google.com/apis/accounts/docs/RegistrationForWebAppsAuto.html
238
+ </pre>
239
+ <p>
240
+ This sets the class variable @@pkey to an OpenSSL::Pkey::RSA object
241
+ </p>
242
+ </div>
243
+ </div>
244
+
245
+ <h3 class="section-bar">Public Instance methods</h3>
246
+
247
+ <div id="method-M000017" class="method-detail">
248
+ <a name="M000017"></a>
249
+
250
+ <div class="method-heading">
251
+ <a href="GoogleAuthSub.src/M000017.html" target="Code" class="method-signature"
252
+ onclick="popupCode('GoogleAuthSub.src/M000017.html');return false;">
253
+ <span class="method-name">auth_data</span><span class="method-args">(method,url)</span>
254
+ </a>
255
+ </div>
256
+
257
+ <div class="method-description">
258
+ <p>
259
+ check the <a href="GoogleAuthSub.html#M000017">auth_data</a> section of the
260
+ header
261
+ </p>
262
+ </div>
263
+ </div>
264
+
265
+ <div id="method-M000016" class="method-detail">
266
+ <a name="M000016"></a>
267
+
268
+ <div class="method-heading">
269
+ <a href="GoogleAuthSub.src/M000016.html" target="Code" class="method-signature"
270
+ onclick="popupCode('GoogleAuthSub.src/M000016.html');return false;">
271
+ <span class="method-name">auth_header</span><span class="method-args">(method, url)</span>
272
+ </a>
273
+ </div>
274
+
275
+ <div class="method-description">
276
+ <p>
277
+ <a href="GoogleAuthSub.html#M000016">auth_header</a> Check what
278
+ authorization header we are sending. method is Net::HTTP::Get or
279
+ Net::HTTP::Post
280
+ </p>
281
+ </div>
282
+ </div>
283
+
284
+ <div id="method-M000015" class="method-detail">
285
+ <a name="M000015"></a>
286
+
287
+ <div class="method-heading">
288
+ <a href="GoogleAuthSub.src/M000015.html" target="Code" class="method-signature"
289
+ onclick="popupCode('GoogleAuthSub.src/M000015.html');return false;">
290
+ <span class="method-name">delete</span><span class="method-args">(url)</span>
291
+ </a>
292
+ </div>
293
+
294
+ <div class="method-description">
295
+ <p>
296
+ <a href="GoogleAuthSub.html#M000015">delete</a> <tt>url</tt> Does a HTTP
297
+ DELETE request to Google using the AuthSub token. This returns a
298
+ Net::HTTPResponse object.
299
+ </p>
300
+ </div>
301
+ </div>
302
+
303
+ <div id="method-M000012" class="method-detail">
304
+ <a name="M000012"></a>
305
+
306
+ <div class="method-heading">
307
+ <a href="GoogleAuthSub.src/M000012.html" target="Code" class="method-signature"
308
+ onclick="popupCode('GoogleAuthSub.src/M000012.html');return false;">
309
+ <span class="method-name">get</span><span class="method-args">(url)</span>
310
+ </a>
311
+ </div>
312
+
313
+ <div class="method-description">
314
+ <p>
315
+ <a href="GoogleAuthSub.html#M000012">get</a> <tt>url</tt> Does a HTTP GET
316
+ request to Google using the AuthSub token. This returns a Net::HTTPResponse
317
+ object.
318
+ </p>
319
+ </div>
320
+ </div>
321
+
322
+ <div id="method-M000013" class="method-detail">
323
+ <a name="M000013"></a>
324
+
325
+ <div class="method-heading">
326
+ <a href="GoogleAuthSub.src/M000013.html" target="Code" class="method-signature"
327
+ onclick="popupCode('GoogleAuthSub.src/M000013.html');return false;">
328
+ <span class="method-name">post</span><span class="method-args">(url)</span>
329
+ </a>
330
+ </div>
331
+
332
+ <div class="method-description">
333
+ <p>
334
+ <a href="GoogleAuthSub.html#M000013">post</a> <tt>url</tt> Does a HTTP POST
335
+ request to Google using the AuthSub token. This returns a Net::HTTPResponse
336
+ object.
337
+ </p>
338
+ </div>
339
+ </div>
340
+
341
+ <div id="method-M000014" class="method-detail">
342
+ <a name="M000014"></a>
343
+
344
+ <div class="method-heading">
345
+ <a href="GoogleAuthSub.src/M000014.html" target="Code" class="method-signature"
346
+ onclick="popupCode('GoogleAuthSub.src/M000014.html');return false;">
347
+ <span class="method-name">put</span><span class="method-args">(url)</span>
348
+ </a>
349
+ </div>
350
+
351
+ <div class="method-description">
352
+ <p>
353
+ <a href="GoogleAuthSub.html#M000014">put</a> <tt>url</tt> Does a HTTP PUT
354
+ request to Google using the AuthSub token. This returns a Net::HTTPResponse
355
+ object.
356
+ </p>
357
+ </div>
358
+ </div>
359
+
360
+ <div id="method-M000006" class="method-detail">
361
+ <a name="M000006"></a>
362
+
363
+ <div class="method-heading">
364
+ <a href="GoogleAuthSub.src/M000006.html" target="Code" class="method-signature"
365
+ onclick="popupCode('GoogleAuthSub.src/M000006.html');return false;">
366
+ <span class="method-name">receive_token</span><span class="method-args">(url)</span>
367
+ </a>
368
+ </div>
369
+
370
+ <div class="method-description">
371
+ <p>
372
+ <tt>url</tt> :the URL received from Google once the user has signed in.
373
+ </p>
374
+ <p>
375
+ This method extracts the token from the request url that Google sends the
376
+ user back to. This url will be like: <a
377
+ href="http://www.example.com/next?Token=CMDshfjfkeodf">www.example.com/next?Token=CMDshfjfkeodf</a>
378
+ In Rails applications you don&#8216;t need this method, just use
379
+ +GoogleAuthsub#token=params[:token]+
380
+ </p>
381
+ </div>
382
+ </div>
383
+
384
+ <div id="method-M000005" class="method-detail">
385
+ <a name="M000005"></a>
386
+
387
+ <div class="method-heading">
388
+ <a href="GoogleAuthSub.src/M000005.html" target="Code" class="method-signature"
389
+ onclick="popupCode('GoogleAuthSub.src/M000005.html');return false;">
390
+ <span class="method-name">request_url</span><span class="method-args">()</span>
391
+ </a>
392
+ </div>
393
+
394
+ <div class="method-description">
395
+ <p>
396
+ This returns a URI::HTTPS object which contains the Google url to request a
397
+ token from.
398
+ </p>
399
+ </div>
400
+ </div>
401
+
402
+ <div id="method-M000010" class="method-detail">
403
+ <a name="M000010"></a>
404
+
405
+ <div class="method-heading">
406
+ <a href="GoogleAuthSub.src/M000010.html" target="Code" class="method-signature"
407
+ onclick="popupCode('GoogleAuthSub.src/M000010.html');return false;">
408
+ <span class="method-name">revoke_token</span><span class="method-args">()</span>
409
+ </a>
410
+ </div>
411
+
412
+ <div class="method-description">
413
+ <p>
414
+ <a href="GoogleAuthSub.html#M000010">revoke_token</a> This revokes either a
415
+ single use or session token The token will not be able to be used again if
416
+ this call is successful. It returns true on sucess, false on failure.
417
+ </p>
418
+ </div>
419
+ </div>
420
+
421
+ <div id="method-M000008" class="method-detail">
422
+ <a name="M000008"></a>
423
+
424
+ <div class="method-heading">
425
+ <a href="GoogleAuthSub.src/M000008.html" target="Code" class="method-signature"
426
+ onclick="popupCode('GoogleAuthSub.src/M000008.html');return false;">
427
+ <span class="method-name">secure_token?</span><span class="method-args">()</span>
428
+ </a>
429
+ </div>
430
+
431
+ <div class="method-description">
432
+ <p>
433
+ Returns true if the token is used for secure sessions
434
+ </p>
435
+ </div>
436
+ </div>
437
+
438
+ <div id="method-M000009" class="method-detail">
439
+ <a name="M000009"></a>
440
+
441
+ <div class="method-heading">
442
+ <a href="GoogleAuthSub.src/M000009.html" target="Code" class="method-signature"
443
+ onclick="popupCode('GoogleAuthSub.src/M000009.html');return false;">
444
+ <span class="method-name">session_token</span><span class="method-args">()</span>
445
+ </a>
446
+ </div>
447
+
448
+ <div class="method-description">
449
+ <p>
450
+ <a href="GoogleAuthSub.html#M000009">session_token</a> This method
451
+ exchanges a previously received single use token with a session token.
452
+ Raises error if an invalid response is received.
453
+ </p>
454
+ </div>
455
+ </div>
456
+
457
+ <div id="method-M000007" class="method-detail">
458
+ <a name="M000007"></a>
459
+
460
+ <div class="method-heading">
461
+ <a href="GoogleAuthSub.src/M000007.html" target="Code" class="method-signature"
462
+ onclick="popupCode('GoogleAuthSub.src/M000007.html');return false;">
463
+ <span class="method-name">session_token?</span><span class="method-args">()</span>
464
+ </a>
465
+ </div>
466
+
467
+ <div class="method-description">
468
+ <p>
469
+ Returns true if this token can be exchanged for a session token
470
+ </p>
471
+ </div>
472
+ </div>
473
+
474
+ <div id="method-M000018" class="method-detail">
475
+ <a name="M000018"></a>
476
+
477
+ <div class="method-heading">
478
+ <a href="GoogleAuthSub.src/M000018.html" target="Code" class="method-signature"
479
+ onclick="popupCode('GoogleAuthSub.src/M000018.html');return false;">
480
+ <span class="method-name">sig</span><span class="method-args">(header)</span>
481
+ </a>
482
+ </div>
483
+
484
+ <div class="method-description">
485
+ <p>
486
+ extract signature from header
487
+ </p>
488
+ </div>
489
+ </div>
490
+
491
+ <div id="method-M000011" class="method-detail">
492
+ <a name="M000011"></a>
493
+
494
+ <div class="method-heading">
495
+ <a href="GoogleAuthSub.src/M000011.html" target="Code" class="method-signature"
496
+ onclick="popupCode('GoogleAuthSub.src/M000011.html');return false;">
497
+ <span class="method-name">token_info</span><span class="method-args">()</span>
498
+ </a>
499
+ </div>
500
+
501
+ <div class="method-description">
502
+ <p>
503
+ <a href="GoogleAuthSub.html#M000011">token_info</a> Returns the information
504
+ for the session token from Google. Returns a map {:target, :scope, :secure}
505
+ </p>
506
+ </div>
507
+ </div>
508
+
509
+
510
+ </div>
511
+
512
+
513
+ </div>
514
+
515
+
516
+ <div id="validator-badges">
517
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
518
+ </div>
519
+
520
+ </body>
521
+ </html>