root/trunk/uploadr/MacUploadr.app/Contents/Resources/chrome/content/uploadr/api.js

Revision 492, 12.7 kB (checked in by jdecq, 11 months ago)

fix authentication when token is wrong

Line 
1 /*
2  * Flickr Uploadr
3  *
4  * Copyright (c) 2007-2008 Yahoo! Inc.  All rights reserved.  This library is
5  * free software; you can redistribute it and/or modify it under the terms of
6  * the GNU General Public License (GPL), version 2 only.  This library is
7  * distributed WITHOUT ANY WARRANTY, whether express or implied. See the GNU
8  * GPL for more details (http://www.gnu.org/licenses/gpl.html)
9  */
10
11 // API wrapped up with a bow
12 var wrap = {
13
14         // Authentication - don't use this directly, use users.login()
15         auth: {
16
17                 checkToken: function(token) {
18                         flickr.auth.checkToken(wrap.auth._checkToken, token);
19                 },
20                 _checkToken: function(rsp) {
21                         if ('object' != typeof rsp || 'ok' != rsp.getAttribute('stat')) {
22                         for each (var u in users.list) {
23                                 if (u.current) {
24                                         u.token = null;
25                                         break;
26                                 }
27                         }
28                                 users.logout(false);
29                         } else {
30                                 users.token = rsp.getElementsByTagName('token')[0]
31                                         .firstChild.nodeValue;
32                                 var user = rsp.getElementsByTagName('user')[0];
33                                 users.nsid = user.getAttribute('nsid');
34                                 users.username = user.getAttribute('username');
35
36                                 // Complete the login process
37                                 users._login();
38
39                         }
40                         buttons.login.enable();
41                         buttons.upload.disable();
42                 },
43
44                 getFrob: function(fresh) {
45                         flickr.auth.getFrob(wrap.auth._getFrob, fresh);
46                 },
47                 _getFrob: function(rsp, fresh) {
48                         if ('object' != typeof rsp || 'ok' != rsp.getAttribute('stat')) {
49
50                                 // Explain what's going on
51                                 alert(locale.getString('auth.error.text'),
52                                         locale.getString('auth.error.title'));
53
54                                 users.logout(false);
55                         } else {
56                                 users.frob = rsp.getElementsByTagName('frob')[0]
57                                         .firstChild.nodeValue;
58                                 if (!confirm(locale.getString('auth.prompt.text'),
59                                         locale.getString('auth.prompt.title'),
60                                         locale.getString('auth.prompt.ok'),
61                                         locale.getString('auth.prompt.cancel'))) {
62                                         buttons.login.enable();
63                                         buttons.upload.disable();
64                                         return;
65                                 }
66                                 var url = api.start({
67                                         'perms': 'write',
68                                         'frob': users.frob,
69                                 }, null, 'http://' + SITE_HOST + '/services/auth/' +
70                                         (fresh ? 'fresh/' : ''), true);
71                                 document.getElementById('auth_url').value = url;
72                                 pages.go('auth');
73                         }
74                         buttons.login.enable();
75                         buttons.upload.disable();
76                 },
77
78                 getToken: function(frob) {
79                         flickr.auth.getToken(wrap.auth._getToken, frob);
80                 },
81                 _getToken: function(rsp) {
82                         if ('object' != typeof rsp || 'ok' != rsp.getAttribute('stat')) {
83                                 users.logout(false);
84                         } else {
85                                 users.token = rsp.getElementsByTagName('token')[0]
86                                         .firstChild.nodeValue;
87                                 var user = rsp.getElementsByTagName('user')[0];
88                                 users.nsid = user.getAttribute('nsid');
89                                 users.username = user.getAttribute('username');
90
91                                 // Complete the login process
92                                 users._login();
93
94                         }
95                 }
96
97         },
98
99         // Like the auth section, this is used by users.login() and won't
100         // need to be called
101         people: {
102
103                 // Sets up the photostream header
104                 getInfo: function(token, nsid) {
105                         flickr.people.getInfo(wrap.people._getInfo, token, nsid);
106                 },
107                 _getInfo: function(rsp, nsid) {
108                         if ('object' == typeof rsp && 'ok' == rsp.getAttribute('stat')) {
109                                 var p = rsp.getElementsByTagName('person')[0];
110                                 var s = p.getAttribute('iconserver');
111                                 if (0 != parseInt(s)) {
112                                         document.getElementById('buddyicon').src =
113                                                 'http://farm' + p.getAttribute('iconfarm') +
114                                                 '.static.flickr.com/' + s + '/buddyicons/' +
115                                                 nsid + '.jpg';
116                                 } else {
117                                         document.getElementById('buddyicon').src =
118                                                 'http://flickr.com/images/buddyicon.jpg';
119                                 }
120                                 if (1 == parseInt(p.getAttribute('ispro'))) {
121                                         document.getElementById('photostream_pro')
122                                                 .style.display = 'inline';
123                                 } else {
124                                         document.getElementById('photostream_pro')
125                                                 .style.display = 'none';
126                                 }
127                         }
128                 },
129
130                 getUploadStatus: function(token) {
131                         flickr.people.getUploadStatus(wrap.people._getUploadStatus,
132                                 token);
133                 },
134                 _getUploadStatus: function(rsp) {
135                         if ('object' != typeof rsp || 'ok' != rsp.getAttribute('stat')) {
136
137                                 // This can cause infinite looping, so stoppit
138                                 //wrap.people.getUploadStatus();
139
140                         } else {
141                                 var user = rsp.getElementsByTagName('user')[0];
142                                 users.is_pro = 1 == parseInt(user.getAttribute('ispro'));
143                                 var bw = user.getElementsByTagName('bandwidth')[0];
144                                 if (1 == parseInt(bw.getAttribute('unlimited'))) {
145                                         users.bandwidth = null;
146                                 } else {
147                                         users.bandwidth = {
148                                                 total: parseInt(bw.getAttribute('maxkb')),
149                                                 used: parseInt(bw.getAttribute('usedkb')),
150                                                 remaining: parseInt(bw.getAttribute('remainingkb'))
151                                         };
152                                 }
153                                 users.filesize = parseInt(user.getElementsByTagName(
154                                         'filesize')[0].getAttribute('maxkb'));
155                                 var videosize = user.getElementsByTagName('videosize');
156                                 if (videosize.length) {
157                                         users.videosize = parseInt(videosize[0]
158                                                 .getAttribute('maxkb'));
159                                 } else { users.videosize = conf.videosize; }
160                                 var sets = user.getElementsByTagName('sets')[0].getAttribute('remaining');
161                                 if ('lots' == sets) {
162                                         users.sets = -1;
163                                 } else {
164                                         users.sets = parseInt(sets);
165                                 }
166                                 ui.users_updated();
167                                 users.update();
168                         }
169                         buttons.upload.enable();
170                 }
171
172         },
173
174         photos: {
175
176                 upload: {
177
178                         checkTickets: function(token, tickets) {
179                                 block_exit();
180                                 flickr.photos.upload.checkTickets(
181                                         wrap.photos.upload._checkTickets, token, tickets);
182                         },
183                         _checkTickets: function(rsp) {
184                                 var again = false;
185                                 if ('object' == typeof rsp &&
186                                         'ok' == rsp.getAttribute('stat')) {
187                                         upload.tickets_retry = 0;
188                                         var tickets = rsp.getElementsByTagName('uploader')[0]
189                                                 .getElementsByTagName('ticket');
190                                         var ii = tickets.length;
191                                         for (var i = 0; i < ii; ++i) {
192                                                 var ticket_id = tickets[i].getAttribute('id');
193                                                 var complete = parseInt(tickets[i]
194                                                         .getAttribute('complete'));
195                                                 if ('undefined' != typeof upload.tickets[ticket_id]) {
196
197                                                         // Error'd photo
198                                                         if (2 == complete) {
199                                                                 --upload.tickets_count;
200                                                                 upload._sync(false, upload.tickets[ticket_id].id);
201                                                                 delete upload.tickets[ticket_id];
202                                                         }
203
204                                                         // Completed photo
205                                                         else if (1 == complete) {
206                                                                 --upload.tickets_count;
207
208                                                                 // Check this photo against stored timestamps
209                                                                 var imported = parseInt(tickets[i]
210                                                                         .getAttribute('imported'));
211                                                                 if (0 == upload.timestamps.earliest ||
212                                                                         imported < upload.timestamps.earliest) {
213                                                                         upload.timestamps.earliest = imported;
214                                                                 }
215                                                                 if (0 == upload.timestamps.latest ||
216                                                                         imported > upload.timestamps.latest) {
217                                                                         upload.timestamps.latest = imported;
218                                                                 }
219
220                                                                 upload._sync(parseInt(tickets[i]
221                                                                         .getAttribute('photoid')),
222                                                                         upload.tickets[ticket_id].id);
223                                                                 delete upload.tickets[ticket_id];
224                                                         }
225
226                                                         // Incomplete photos need to keep spinning
227                                                         else {
228                                                                 again = true;
229                                                         }
230
231                                                 }
232                                         }
233                                 }
234
235                                 // Error'd checkTickets need to keep spinning
236                                 else {
237                                         again = true;
238                                 }
239
240                                 if (again) {
241
242                                         // Valid response or still have retries remaining
243                                         if ('object' == typeof rsp) {
244                                                 upload._check_tickets();
245                                         } else if (conf.tickets_retry_count >
246                                                 upload.tickets_retry_count) {
247                                                 ++upload.tickets_retry_count;
248                                                 upload._check_tickets();
249                                         }
250
251                                         // Need to call it quits
252                                         else {
253                                                 upload.cancel = true;
254                                                 upload.tickets_count = 0;
255                                                 upload.tickets = {};
256                                                 upload.done();
257                                         }
258
259                                 }
260                                 unblock_exit();
261                         }
262
263                 }
264
265         },
266
267         photosets: {
268
269                 addPhoto: function(token, photoset_id, photo_id){
270                         ++photos.sets_out;
271                         flickr.photosets.addPhoto(wrap.photosets._addPhoto,
272                                 token, photoset_id, photo_id);
273                 },
274                 _addPhoto: function(rsp) {
275                         if ('object' != typeof rsp || 'ok' != rsp.getAttribute('stat')) {
276                                 photos.sets_fail = true;
277                         }
278                         --photos.sets_out;
279                         upload.finalize();
280                 },
281
282                 getList: function(token, nsid) {
283                         flickr.photosets.getList(wrap.photosets._getList, token, nsid);
284                 },
285                 _getList: function(rsp) {
286                         if ('object' == typeof rsp && 'ok' == rsp.getAttribute('stat')) {
287                                 var sets = rsp.getElementsByTagName('photosets')[0]
288                                         .getElementsByTagName('photoset');
289                                 var ii = sets.length;
290                                 var order = [];
291                                 for (var i = 0; i < ii; ++i) {
292                                         order.push({
293                                                 id: sets[i].getAttribute('id'),
294                                                 title: sets[i].getElementsByTagName('title')[0]
295                                                         .firstChild.nodeValue
296                                         });
297                                 }
298
299                                 // We really shouldn't break our own API spec
300                                 //   TODO: Offer a sort toggle
301                                 //*
302                                 order.sort(function(a, b) {
303                                         return a.title.toLowerCase() > b.title.toLowerCase();
304                                 });
305                                 //*/
306
307                                 // Start the map of old indexes to new ones with any
308                                 // created sets
309                                 var sets_map = {};
310                                 var new_sets = [];
311                                 var ii = meta.sets.length;
312                                 for (var i = 0; i < ii; ++i) {
313                                         if (null != meta.sets[i].id) { continue; }
314                                         sets_map[i] = new_sets.length;
315                                         new_sets.push(meta.sets[i]);
316                                 }
317
318                                 // Find each set in the API result in our old list
319                                 var jj = order.length;
320                                 for (var j = 0; j < jj; ++j) {
321                                         for (var i = 0; i < ii; ++i) {
322                                                 if (order[j].id == meta.sets[i].id) {
323                                                         sets_map[i] = new_sets.length;                                                 
324                                                         break;
325                                                 }
326                                         }
327                                         new_sets.push(order[j]);
328                                 }
329
330                                 // Translate photos in the batch to this list
331                                 for each (var p in photos.list) {
332                                         for (var i in p.sets) {
333                                                 p.sets[i] = sets_map[p.sets[i]];
334                                         }
335                                 }
336                                 meta.sets = new_sets;
337
338                                 // Update the lists of available sets
339                                 var ii = meta.sets.length;
340                                 var prefixes = ['single', 'batch'];
341                                 for each (var prefix in prefixes) {
342                                         var ul = document.getElementById(prefix + '_sets_add');
343                                         while (ul.hasChildNodes()) {
344                                                 ul.removeChild(ul.firstChild);
345                                         }
346                                         if (0 == ii && 0 == meta.created_sets) {
347                                                 var li = document.createElementNS(NS_HTML, 'li');
348                                                 li.className = 'sets_none';
349                                                 li.appendChild(document.createTextNode(
350                                                         locale.getString('meta.sets.add.none')));
351                                                 ul.appendChild(li);
352                                         } else {
353                                                 var ii = meta.sets.length;
354                                                 for (var i = 0; i < ii; ++i) {
355                                                         var li = document.createElementNS(NS_HTML, 'li');
356                                                         li.id = prefix + '_sets_add_' + i;
357                                                         li.className = 'sets_plus';
358                                                         li.appendChild(document.createTextNode(
359                                                                 meta.sets[i].title));
360                                                         ul.appendChild(li);
361                                                 }
362                                         }
363                                 }
364
365                                 // Update selected photos
366                                 if (photos.selected.length) {
367                                         var prefix = 1 == photos.selected.length ?
368                                                 'single' : 'batch';
369                                         var li = document.getElementById(prefix + '_sets_added')
370                                                 .getElementsByTagName('li');
371                                         var ii = li.length;
372                                         for (var i = 0; i < ii; ++i) {
373                                                 if ('sets_none' == li[i].className) { continue; }
374                                                 var id = sets_map[parseInt(li[i].id.replace(
375                                                         /^(single|batch)_sets_added_/, ''))];
376                                                 li[i].id = prefix + '_sets_added_' + id;
377                                                 document.getElementById(prefix + '_sets_add_' + id)
378                                                         .className = 'sets_disabled';
379                                         }
380                                 }
381
382                         }
383                         status.clear();
384                 }
385
386         },
387
388         // Preferences are fetched from the site when no stored version can be found
389         prefs: {
390
391                 getContentType: function(token) {
392                         flickr.prefs.getContentType(wrap.prefs._getContentType, token);
393                 },
394                 _getContentType: function(rsp) {
395                         if ('object' == typeof rsp && 'ok' == rsp.getAttribute('stat')) {
396                                 settings.content_type =
397                                         parseInt(rsp.getElementsByTagName('person')[0]
398                                         .getAttribute('content_type'));
399                                 settings.save();
400                                 meta.defaults({content_type: settings.content_type});
401                         }
402                 },
403
404                 getHidden: function(token) {
405                         flickr.prefs.getHidden(wrap.prefs._getHidden, token);
406                 },
407                 _getHidden: function(rsp) {
408                         if ('object' == typeof rsp && 'ok' == rsp.getAttribute('stat')) {
409                                 settings.hidden =
410                                         parseInt(rsp.getElementsByTagName('person')[0]
411                                         .getAttribute('hidden'));
412                                 settings.save();
413                                 meta.defaults({hidden: settings.hidden});
414                         }
415                 },
416
417                 getPrivacy: function(token) {
418                         flickr.prefs.getPrivacy(wrap.prefs._getPrivacy, token);
419                 },
420                 _getPrivacy: function(rsp) {
421                         if ('object' == typeof rsp && 'ok' == rsp.getAttribute('stat')) {
422                                 var privacy =
423                                         parseInt(rsp.getElementsByTagName('person')[0]
424                                         .getAttribute('privacy'));
425                                 settings.is_public = 1 == privacy ? 1 : 0;
426                                 settings.is_friend = 2 == privacy || 4 == privacy ? 1 : 0;
427                                 settings.is_family = 3 == privacy || 4 == privacy ? 1 : 0;
428                                 settings.save();
429                                 meta.defaults({
430                                         is_public: settings.is_public,
431                                         is_friend: settings.is_friend,
432                                         is_family: settings.is_family
433                                 });
434                         }
435                 },
436
437                 getSafetyLevel: function(token) {
438                         flickr.prefs.getSafetyLevel(wrap.prefs._getSafetyLevel, token);
439                 },
440                 _getSafetyLevel: function(rsp) {
441                         if ('object' == typeof rsp && 'ok' == rsp.getAttribute('stat')) {
442                                 settings.safety_level =
443                                         parseInt(rsp.getElementsByTagName('person')[0]
444                                         .getAttribute('safety_level'));
445                                 settings.save();
446                                 meta.defaults({safety_level: settings.safety_level});
447                         }
448                 }
449
450         },
451
452         utils: {
453
454                 logUploadStats: function(token, source, num_photos, upload_time,
455                         bytes, errors) {
456                         flickr.utils.logUploadStats(null, token, source, num_photos,
457                                 upload_time, bytes, errors)
458                 }
459
460         }
461
462 };
Note: See TracBrowser for help on using the browser.