Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / static / snf / js / auth.js @ 628fa84b

History | View | Annotate | Download (5.8 kB)

1 85f1cd1e Kostas Papadimitriou
// Copyright 2012 GRNET S.A. All rights reserved.
2 85f1cd1e Kostas Papadimitriou
// 
3 85f1cd1e Kostas Papadimitriou
// Redistribution and use in source and binary forms, with or
4 85f1cd1e Kostas Papadimitriou
// without modification, are permitted provided that the following
5 85f1cd1e Kostas Papadimitriou
// conditions are met:
6 85f1cd1e Kostas Papadimitriou
// 
7 85f1cd1e Kostas Papadimitriou
//   1. Redistributions of source code must retain the above
8 85f1cd1e Kostas Papadimitriou
//      copyright notice, this list of conditions and the following
9 85f1cd1e Kostas Papadimitriou
//      disclaimer.
10 85f1cd1e Kostas Papadimitriou
// 
11 85f1cd1e Kostas Papadimitriou
//   2. Redistributions in binary form must reproduce the above
12 85f1cd1e Kostas Papadimitriou
//      copyright notice, this list of conditions and the following
13 85f1cd1e Kostas Papadimitriou
//      disclaimer in the documentation and/or other materials
14 85f1cd1e Kostas Papadimitriou
//      provided with the distribution.
15 85f1cd1e Kostas Papadimitriou
// 
16 85f1cd1e Kostas Papadimitriou
// THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 85f1cd1e Kostas Papadimitriou
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 85f1cd1e Kostas Papadimitriou
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 85f1cd1e Kostas Papadimitriou
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 85f1cd1e Kostas Papadimitriou
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 85f1cd1e Kostas Papadimitriou
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 85f1cd1e Kostas Papadimitriou
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 85f1cd1e Kostas Papadimitriou
// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 85f1cd1e Kostas Papadimitriou
// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 85f1cd1e Kostas Papadimitriou
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 85f1cd1e Kostas Papadimitriou
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 85f1cd1e Kostas Papadimitriou
// POSSIBILITY OF SUCH DAMAGE.
28 85f1cd1e Kostas Papadimitriou
// 
29 85f1cd1e Kostas Papadimitriou
// The views and conclusions contained in the software and
30 85f1cd1e Kostas Papadimitriou
// documentation are those of the authors and should not be
31 85f1cd1e Kostas Papadimitriou
// interpreted as representing official policies, either expressed
32 85f1cd1e Kostas Papadimitriou
// or implied, of GRNET S.A.
33 85f1cd1e Kostas Papadimitriou
// 
34 85f1cd1e Kostas Papadimitriou
35 85f1cd1e Kostas Papadimitriou
;(function(root){
36 85f1cd1e Kostas Papadimitriou
    
37 85f1cd1e Kostas Papadimitriou
    // Astakos client javascript lib
38 85f1cd1e Kostas Papadimitriou
    // Requires jquery and jquery.cookie javascript libs
39 85f1cd1e Kostas Papadimitriou
    //
40 85f1cd1e Kostas Papadimitriou
    // Usage
41 85f1cd1e Kostas Papadimitriou
    // -----
42 85f1cd1e Kostas Papadimitriou
    // <script src="jquery.js"></script>
43 85f1cd1e Kostas Papadimitriou
    // <script src="jquery.cookie.js"></script>
44 85f1cd1e Kostas Papadimitriou
    // <script src="snf/auth.js"></script>
45 85f1cd1e Kostas Papadimitriou
    //
46 85f1cd1e Kostas Papadimitriou
    //  var astakos_config = {
47 85f1cd1e Kostas Papadimitriou
    //        'login_url': '/im/login',
48 85f1cd1e Kostas Papadimitriou
    //        'auth_url': '/im/authenticate',
49 85f1cd1e Kostas Papadimitriou
    //        'cookie_name': '_pithos2_a',
50 85f1cd1e Kostas Papadimitriou
    //        'logout_callback': function(client) {
51 85f1cd1e Kostas Papadimitriou
    //            console.log("logging out");
52 85f1cd1e Kostas Papadimitriou
    //            client.redirect_to_logout();
53 85f1cd1e Kostas Papadimitriou
    //        }
54 85f1cd1e Kostas Papadimitriou
    //
55 afe9ca75 Kostas Papadimitriou
    //  var user = new snf.auth.AstakosClient(astakos_config);
56 afe9ca75 Kostas Papadimitriou
    //  if (!user.get_token() { user.redirect_to_login() };
57 afe9ca75 Kostas Papadimitriou
    //  console.log(user.get_username(), user.get_token());
58 85f1cd1e Kostas Papadimitriou
    //
59 85f1cd1e Kostas Papadimitriou
60 85f1cd1e Kostas Papadimitriou
    var root = root;
61 85f1cd1e Kostas Papadimitriou
    var snf = root.synnefo = root.synnefo || {};
62 85f1cd1e Kostas Papadimitriou
    
63 85f1cd1e Kostas Papadimitriou
    // init auth namespace
64 85f1cd1e Kostas Papadimitriou
    snf.auth = {};
65 85f1cd1e Kostas Papadimitriou
    
66 85f1cd1e Kostas Papadimitriou
    snf.auth.AstakosClient = function(config) {
67 85f1cd1e Kostas Papadimitriou
        this.config = $.extend(this.default_config, config);
68 afe9ca75 Kostas Papadimitriou
        this.current_token = undefined;
69 afe9ca75 Kostas Papadimitriou
        this.current_username = undefined;
70 acb284f7 Kostas Papadimitriou
        this.skip_redirects = config.skip_redirects === undefined ? false : 
71 acb284f7 Kostas Papadimitriou
                              config.skip_redirects;
72 afe9ca75 Kostas Papadimitriou
      
73 afe9ca75 Kostas Papadimitriou
        var self = this;
74 afe9ca75 Kostas Papadimitriou
        this.updater = window.setInterval(function(){
75 afe9ca75 Kostas Papadimitriou
          self.get_token();
76 afe9ca75 Kostas Papadimitriou
          self.get_username();
77 afe9ca75 Kostas Papadimitriou
        }, 10000);
78 85f1cd1e Kostas Papadimitriou
    }
79 85f1cd1e Kostas Papadimitriou
80 85f1cd1e Kostas Papadimitriou
    snf.auth.AstakosClient.prototype.default_config = {
81 85f1cd1e Kostas Papadimitriou
            'logout_url': '/im/logout',
82 85f1cd1e Kostas Papadimitriou
            'login_url': '/im/login',
83 85f1cd1e Kostas Papadimitriou
            'cookie_name': '_pithos2_a',
84 85f1cd1e Kostas Papadimitriou
            'logout_callback': function(client) {
85 85f1cd1e Kostas Papadimitriou
                client.redirect_to_logout();
86 85f1cd1e Kostas Papadimitriou
            }
87 85f1cd1e Kostas Papadimitriou
    }
88 85f1cd1e Kostas Papadimitriou
89 85f1cd1e Kostas Papadimitriou
    snf.auth.AstakosClient.prototype.delete_cookie = function() {
90 acb284f7 Kostas Papadimitriou
      if (!this.skip_redirects) {
91 85f1cd1e Kostas Papadimitriou
        $.cookie(this.config.cookie_name, null);
92 acb284f7 Kostas Papadimitriou
      }
93 85f1cd1e Kostas Papadimitriou
    }
94 85f1cd1e Kostas Papadimitriou
95 85f1cd1e Kostas Papadimitriou
    snf.auth.AstakosClient.prototype.redirect_to_logout = function() {
96 acb284f7 Kostas Papadimitriou
      if (!this.skip_redirects) {
97 4ef604a6 Kostas Papadimitriou
        window.location = this.config.logout_url + "?next=";
98 acb284f7 Kostas Papadimitriou
      }
99 85f1cd1e Kostas Papadimitriou
    }
100 85f1cd1e Kostas Papadimitriou
    
101 85f1cd1e Kostas Papadimitriou
    snf.auth.AstakosClient.prototype.redirect_to_login = function() {
102 acb284f7 Kostas Papadimitriou
      if (!this.skip_redirects) {
103 85f1cd1e Kostas Papadimitriou
        window.location = this.config.login_url + "?next=" + window.location.toString();
104 acb284f7 Kostas Papadimitriou
      }
105 85f1cd1e Kostas Papadimitriou
    }
106 85f1cd1e Kostas Papadimitriou
107 85f1cd1e Kostas Papadimitriou
    // delete cookie and redirect to logout
108 85f1cd1e Kostas Papadimitriou
    // cookie removal can be forced by passing true as delete_cookie parameter
109 85f1cd1e Kostas Papadimitriou
    snf.auth.AstakosClient.prototype.logout = function(delete_cookie) {
110 85f1cd1e Kostas Papadimitriou
        var delete_cookie = delete_cookie == undefined ? false : delete_cookie;
111 85f1cd1e Kostas Papadimitriou
        if (delete_cookie) {
112 85f1cd1e Kostas Papadimitriou
            this.delete_cookie();
113 85f1cd1e Kostas Papadimitriou
        }
114 85f1cd1e Kostas Papadimitriou
        this.config.logout_callback(this);
115 85f1cd1e Kostas Papadimitriou
    }
116 85f1cd1e Kostas Papadimitriou
117 85f1cd1e Kostas Papadimitriou
    snf.auth.AstakosClient.prototype.get_cookie_data = function() {
118 85f1cd1e Kostas Papadimitriou
        var data = $.cookie(this.config.cookie_name);
119 85f1cd1e Kostas Papadimitriou
        
120 85f1cd1e Kostas Papadimitriou
        // remove " characters
121 85f1cd1e Kostas Papadimitriou
        if (data) { return data.replace(/\"/g, "") }
122 85f1cd1e Kostas Papadimitriou
        return data;
123 85f1cd1e Kostas Papadimitriou
    }
124 85f1cd1e Kostas Papadimitriou
125 85f1cd1e Kostas Papadimitriou
126 85f1cd1e Kostas Papadimitriou
    snf.auth.AstakosClient.prototype.logged_in = function() {
127 85f1cd1e Kostas Papadimitriou
        return this.get_cookie_data() == null
128 85f1cd1e Kostas Papadimitriou
    }
129 85f1cd1e Kostas Papadimitriou
130 85f1cd1e Kostas Papadimitriou
    // parse cookie data
131 85f1cd1e Kostas Papadimitriou
    // astakos sets cookie data using the following pattern: <username>|<token>
132 85f1cd1e Kostas Papadimitriou
    snf.auth.AstakosClient.prototype.parse_cookie_data = function(data) {
133 85f1cd1e Kostas Papadimitriou
        return {
134 85f1cd1e Kostas Papadimitriou
            'username': data.split("|")[0],
135 85f1cd1e Kostas Papadimitriou
            'token': data.split("|")[1]
136 85f1cd1e Kostas Papadimitriou
        }
137 85f1cd1e Kostas Papadimitriou
    }
138 85f1cd1e Kostas Papadimitriou
    
139 afe9ca75 Kostas Papadimitriou
    snf.auth.AstakosClient.prototype.extract_cookie_contents = function() {
140 85f1cd1e Kostas Papadimitriou
        var data = this.get_cookie_data();
141 85f1cd1e Kostas Papadimitriou
        if (!data) {
142 afe9ca75 Kostas Papadimitriou
            return {};
143 85f1cd1e Kostas Papadimitriou
        }
144 afe9ca75 Kostas Papadimitriou
        return this.parse_cookie_data(data);
145 afe9ca75 Kostas Papadimitriou
    }
146 afe9ca75 Kostas Papadimitriou
147 afe9ca75 Kostas Papadimitriou
    snf.auth.AstakosClient.prototype.get_token = function() {
148 afe9ca75 Kostas Papadimitriou
      var newtoken;
149 afe9ca75 Kostas Papadimitriou
      newtoken = this.extract_cookie_contents().token;
150 afe9ca75 Kostas Papadimitriou
      if (newtoken === undefined || (newtoken != this.current_token && 
151 afe9ca75 Kostas Papadimitriou
          this.current_token != undefined)) {
152 afe9ca75 Kostas Papadimitriou
        this.redirect_to_login();
153 afe9ca75 Kostas Papadimitriou
      }
154 afe9ca75 Kostas Papadimitriou
      this.current_token = newtoken;
155 afe9ca75 Kostas Papadimitriou
      return this.current_token;
156 afe9ca75 Kostas Papadimitriou
    }
157 afe9ca75 Kostas Papadimitriou
158 afe9ca75 Kostas Papadimitriou
    snf.auth.AstakosClient.prototype.get_username = function() {
159 afe9ca75 Kostas Papadimitriou
      var newusername;
160 afe9ca75 Kostas Papadimitriou
      newusername = this.extract_cookie_contents().username;
161 afe9ca75 Kostas Papadimitriou
      if (newusername === undefined || (newusername != this.current_username && 
162 afe9ca75 Kostas Papadimitriou
          this.current_username != undefined)) {
163 afe9ca75 Kostas Papadimitriou
        this.redirect_to_login();
164 afe9ca75 Kostas Papadimitriou
      }
165 afe9ca75 Kostas Papadimitriou
      this.current_username = newusername;
166 e3c026e7 Kostas Papadimitriou
      return this.current_username;
167 85f1cd1e Kostas Papadimitriou
    }
168 85f1cd1e Kostas Papadimitriou
    
169 85f1cd1e Kostas Papadimitriou
})(this);