~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to www/media/common/util.js

  • Committer: mattgiuca
  • Date: 2008-02-19 08:26:11 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:509
common.db: Rewrote user_authenticate to return 3 values (True, false, None)
    Now returns False if the password did not match, None if the password
    field is NULL (None implying a soft failure, with the possibility of
    validating against LDAP or something else).

auth.authenticate: Rewrote this module with a new plugin interface
    (as discussed with Tom Conway). Allows successive modules to try to
    authenticate the user.
    Changed the authenticate function interface: Now raises an AuthError
    when auth fails, instead of returning None.

dispatch.login: Handle new auth interface (exception catch).
    Auth is now able to provide an error message, in the exception.
    The exception message is displayed as an error to the user.

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
/* Expects the following variables to have been declared by JavaScript in
26
26
 * the HTML generated by the server:
27
27
 * - root_dir
28
 
 * - public_host
29
28
 * - username
30
29
 */
31
30
 
311
310
    if (("path" in obj) && obj.path != null)
312
311
    {
313
312
        var path = urlencode_path(obj.path.toString());
314
 
        if (url.length > 0 && path.length > 0 && path.charAt(0) != "/")
 
313
        if (url.length > 0 && path.length > 0 && path[0] != "/")
315
314
            path = "/" + path;
316
315
        url += path;
317
316
    }
342
341
    return path;
343
342
}
344
343
 
345
 
/** Writes a JSONable object to the cookie under a particular key
346
 
 * (JSON encoded and URL encoded).
347
 
 */
348
 
function write_cookie(key, value)
349
 
{
350
 
    var sendstr = encodeURIComponent(key) + "="
351
 
        + encodeURIComponent(JSON.stringify(value))
352
 
        + "; path=" + urlencode_path(root_dir);
353
 
    /* This actually just assigns to the key, not replacing the whole cookie
354
 
     * as it appears to. */
355
 
    document.cookie = sendstr;
356
 
}
357
 
/** Reads a cookie which has a JSONable object encoded as its value.
358
 
 * Returns the object, parsed from JSON.
359
 
 */
360
 
function read_cookie(key)
361
 
{
362
 
    var cookies = document.cookie.split(";");
363
 
    var checkstart = encodeURIComponent(key) + "=";
364
 
    var checklen = checkstart.length;
365
 
    for (var i=0; i<cookies.length; i++)
366
 
    {
367
 
        var cookie = cookies[i];
368
 
        while (cookie[0] == ' ')
369
 
            cookie = cookie.substr(1);
370
 
        if (cookie.substr(0, checklen) == checkstart)
371
 
        {
372
 
            var valstr = cookie.substr(checklen);
373
 
            valstr = decodeURIComponent(valstr);
374
 
            return JSON.parse(valstr);
375
 
        }
376
 
    }
377
 
}
378
 
 
379
344
/** Given an argument map, as output in the args parameter of the return of
380
345
 * parseurl, gets the first occurence of an argument in the URL string.
381
346
 * If the argument was not found, returns null.
426
391
    {
427
392
        arg = arguments[i];
428
393
        if (arg.length == 0) continue;
429
 
        if (arg.charAt(0) == '/')
 
394
        if (arg[0] == '/')
430
395
            path = arg;
431
396
        else
432
397
        {
433
 
            if (path.length > 0 && path.charAt(path.length-1) != '/')
 
398
            if (path.length > 0 && path[path.length-1] != '/')
434
399
                path += '/';
435
400
            path += arg;
436
401
        }
491
456
function pathlist_to_path(pathlist)
492
457
{
493
458
    ret = path_join.apply(null, pathlist);
494
 
    if (ret.charAt(ret.length-1) != '/')
 
459
    if (ret[ret.length-1] != '/')
495
460
        ret += '/';
496
461
    return ret;
497
462
}
512
477
    return make_path(path_join.apply(null, arguments));
513
478
}
514
479
 
515
 
/** Generates an absolute URL to a public application
516
 
 */
517
 
function public_app_path(app /*,...*/)
518
 
{
519
 
    return "http://" + public_host
520
 
        + make_path(path_join.apply(null, arguments));
521
 
}
522
 
 
523
480
/** Given a path, gets the "basename" (the last path segment).
524
481
 */
525
482
function path_basename(path)
538
495
    return str.substr(str.length - substring.length) == substring;
539
496
}
540
497
 
 
498
/** Equivalent to Python's repr.
 
499
 * Gets the JavaScript string representation.
 
500
 * Actually just calls JSON.stringify.
 
501
 */
 
502
function repr(str)
 
503
{
 
504
    return JSON.stringify(str);
 
505
}
 
506
 
541
507
/** Removes all occurences of a value from an array.
542
508
 */
543
509
Array.prototype.removeall = function(val)
553
519
    arr.splice(j, i-j);
554
520
}
555
521
 
556
 
/** Shallow-clones an object */
557
 
function shallow_clone_object(obj)
558
 
{
559
 
    o = {};
560
 
    for (k in obj)
561
 
        o[k] = obj[k];
562
 
    return o;
563
 
}
564
 
 
565
 
/** Returns a new XMLHttpRequest object, in a somewhat browser-agnostic
566
 
 * fashion.
567
 
 */
568
 
function new_xmlhttprequest()
569
 
{
570
 
    try
571
 
    {
572
 
        /* Real Browsers */
573
 
        return new XMLHttpRequest();
574
 
    }
575
 
    catch (e)
576
 
    {
577
 
        /* Internet Explorer */
578
 
        try
579
 
        {
580
 
            return new ActiveXObject("Msxml2.XMLHTTP");
581
 
        }
582
 
        catch (e)
583
 
        {
584
 
            try
585
 
            {
586
 
                return new ActiveXObject("Microsoft.XMLHTTP");
587
 
            }
588
 
            catch (e)
589
 
            {
590
 
                throw("Your browser does not support AJAX. "
591
 
                    + "IVLE requires a modern browser.");
592
 
            }
593
 
        }
594
 
    }
595
 
}
596
 
 
597
 
/** Creates a random string of length length,
598
 
 * consisting of alphanumeric characters.
599
 
 */
600
 
var rand_chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ"
601
 
               + "abcdefghiklmnopqrstuvwxyz";
602
 
function random_string(length)
603
 
{
604
 
    var str = Array(length);
605
 
    var v;
606
 
    for (var i=0; i<length; i++)
607
 
    {
608
 
        v = Math.floor(Math.random() * rand_chars.length);
609
 
        str[i] = rand_chars.charAt(v);
610
 
    }
611
 
    return str.join('');
612
 
}
613
 
 
614
 
/** Makes an XMLHttpRequest call to the server.
615
 
 * Sends the XMLHttpRequest object containing the completed response to a
616
 
 * specified callback function.
 
522
/** Makes an XMLHttpRequest call to the server. Waits (synchronously) for a
 
523
 * response, and returns an XMLHttpRequest object containing the completed
 
524
 * response.
617
525
 *
618
 
 * \param callback A callback function. Will be called when the response is
619
 
 *      complete. Passed 1 parameter, an XMLHttpRequest object containing the
620
 
 *      completed response. If callback is null this is a syncronous request 
621
 
 *      otherwise this is an asynchronous request.
622
526
 * \param app IVLE app to call (such as "fileservice").
623
527
 * \param path URL path to make the request to, within the application.
624
528
 * \param args Argument object, as described in parse_url and friends.
625
 
 * \param method String; "GET", "POST", "PUT", or "PATCH"
626
 
 * \param content_type String, optional.
 
529
 * \param method String; "GET" or "POST"
 
530
 * \param content_type String, optional. Only applies if method is "POST".
 
531
 *      May be "application/x-www-form-urlencoded" or "multipart/form-data".
627
532
 *      Defaults to "application/x-www-form-urlencoded".
 
533
 * \return An XMLHttpRequest object containing the completed response.
628
534
 */
629
 
function ajax_call(callback, app, path, args, method, content_type)
 
535
function ajax_call(app, path, args, method, content_type)
630
536
{
631
 
    if (!content_type)
 
537
    if (content_type != "multipart/form-data")
632
538
        content_type = "application/x-www-form-urlencoded";
633
539
    path = app_path(app, path);
634
540
    var url;
635
541
    /* A random string, for multipart/form-data
636
542
     * (This is not checked against anywhere else, it is solely defined and
637
543
     * used within this function) */
638
 
    var boundary = random_string(20);
639
 
    var xhr = new_xmlhttprequest();
640
 
    var asyncronous = callback != null;
641
 
    if (asyncronous)
642
 
    {
643
 
        xhr.onreadystatechange = function()
644
 
            {
645
 
                if (xhr.readyState == 4)
646
 
                {
647
 
                    callback(xhr);
648
 
                }
649
 
            }
650
 
    }
 
544
    var boundary = "48234n334nu7n4n2ynonjn234t683jyh80j";
 
545
    var xhr = new XMLHttpRequest();
651
546
    if (method == "GET")
652
547
    {
653
548
        /* GET sends the args in the URL */
654
549
        url = build_url({"path": path, "args": args});
655
 
        /* open's 3rd argument = true -> asynchronous */
656
 
        xhr.open(method, url, asyncronous);
 
550
        /* open's 3rd argument = false -> SYNCHRONOUS (wait for response)
 
551
         * (No need for a callback function) */
 
552
        xhr.open(method, url, false);
657
553
        xhr.send(null);
658
554
    }
659
555
    else
660
556
    {
661
 
        /* POST & PUT & PATCH sends the args in the request body */
 
557
        /* POST sends the args in application/x-www-form-urlencoded */
662
558
        url = encodeURI(path);
663
 
        xhr.open(method, url, asyncronous);
 
559
        xhr.open(method, url, false);
664
560
        var message;
665
561
        if (content_type == "multipart/form-data")
666
562
        {
667
563
            xhr.setRequestHeader("Content-Type",
668
 
                "multipart/form-data; boundary=" + boundary);
 
564
                "multipart/form-data, boundary=" + boundary);
669
565
            message = make_multipart_formdata(args, boundary);
670
566
        }
671
 
        else if (content_type == "application/x-www-form-urlencoded")
 
567
        else
672
568
        {
673
569
            xhr.setRequestHeader("Content-Type", content_type);
674
570
            message = make_query_string(args);
675
571
        }
676
 
        else if (content_type == "application/json")
677
 
        {
678
 
            xhr.setRequestHeader("Content-Type", content_type);
679
 
            message = JSON.stringify(args);
680
 
        }
681
 
        else
682
 
        {
683
 
            xhr.setRequestHeader("Content-Type", content_type);
684
 
            message = args;
685
 
        }
 
572
        xhr.setRequestHeader("Content-Length", message.length);
686
573
        xhr.send(message);
687
574
    }
688
 
    /* Only return the XHR for syncronous requests */
689
 
    if (!asyncronous)
690
 
    { 
691
 
        return xhr;
692
 
    }
 
575
    return xhr;
693
576
}
694
577
 
695
 
/** Attempts to JSON decodes a response object
696
 
 * If a non-200 response or the JSON decode fails then returns null
697
 
 */
698
 
function decode_response(response)
699
 
{
700
 
    if (response.status == 200)
701
 
    {
702
 
        try
703
 
        {
704
 
            var responseText = response.responseText;
705
 
            return JSON.parse(responseText);
706
 
        }
707
 
        catch (e)
708
 
        {
709
 
            // Pass
710
 
        }
711
 
     }
712
 
    
713
 
     return null;
714
 
}