Statistics
| Branch: | Tag: | Revision:

root / snf-app / synnefo / ui / static / snf / js / ui / web / ui_public_keys_view.js @ 483c9197

History | View | Annotate | Download (11.2 kB)

1 e9392f3c Kostas Papadimitriou
;(function(root){
2 e9392f3c Kostas Papadimitriou
3 e9392f3c Kostas Papadimitriou
    // root
4 e9392f3c Kostas Papadimitriou
    var root = root;
5 e9392f3c Kostas Papadimitriou
    
6 e9392f3c Kostas Papadimitriou
    // setup namepsaces
7 e9392f3c Kostas Papadimitriou
    var snf = root.synnefo = root.synnefo || {};
8 e9392f3c Kostas Papadimitriou
    var api = snf.api = snf.api || {};
9 e9392f3c Kostas Papadimitriou
    var models = snf.models = snf.models || {}
10 e9392f3c Kostas Papadimitriou
    var storage = snf.storage = snf.storage || {};
11 e9392f3c Kostas Papadimitriou
    var ui = snf.ui = snf.ui || {};
12 e9392f3c Kostas Papadimitriou
    var util = snf.util = snf.util || {};
13 e9392f3c Kostas Papadimitriou
14 e9392f3c Kostas Papadimitriou
    var views = snf.views = snf.views || {}
15 e9392f3c Kostas Papadimitriou
16 e9392f3c Kostas Papadimitriou
    // shortcuts
17 e9392f3c Kostas Papadimitriou
    var bb = root.Backbone;
18 e9392f3c Kostas Papadimitriou
    
19 e9392f3c Kostas Papadimitriou
    views.PublicKeysView = views.CollectionView.extend({
20 e9392f3c Kostas Papadimitriou
        collection: storage.keys,
21 e9392f3c Kostas Papadimitriou
22 3b214560 Kostas Papadimitriou
        confirm_delete_msg: 'Are you sure you want to remove this key ?',
23 3b214560 Kostas Papadimitriou
        create_success_msg: 'Public key created successfully.',
24 ff44c486 Kostas Papadimitriou
        update_success_msg: 'Public key updated successfully.',
25 3b214560 Kostas Papadimitriou
        create_failed_msg: 'Failed to create public key.',
26 3b214560 Kostas Papadimitriou
27 c72a830d Kostas Papadimitriou
28 e9392f3c Kostas Papadimitriou
        initialize: function(options) {
29 e9392f3c Kostas Papadimitriou
            views.PublicKeysView.__super__.initialize.apply(this, arguments);
30 e9392f3c Kostas Papadimitriou
            this.$(".private-cont").hide();
31 e9392f3c Kostas Papadimitriou
            _.bindAll(this);
32 c72a830d Kostas Papadimitriou
            this.keys_limit = snf.config.userdata_keys_limit || 10000;
33 c26afad6 Kostas Papadimitriou
            this.bind("item:add", this.animate_on_add);
34 c26afad6 Kostas Papadimitriou
        },
35 c26afad6 Kostas Papadimitriou
36 c26afad6 Kostas Papadimitriou
        animate_on_add: function(list, el, model) {
37 c26afad6 Kostas Papadimitriou
            el.hide();
38 c26afad6 Kostas Papadimitriou
            el.fadeIn(400);
39 e9392f3c Kostas Papadimitriou
        },
40 e9392f3c Kostas Papadimitriou
41 e9392f3c Kostas Papadimitriou
        append_actions: function(el, model) {
42 e9392f3c Kostas Papadimitriou
            var actions = $('<div class="item-actions">' +
43 e9392f3c Kostas Papadimitriou
                            '<div class="item-action remove">remove</div>' + 
44 e9392f3c Kostas Papadimitriou
                            '<div class="item-action confirm-remove">' + 
45 e9392f3c Kostas Papadimitriou
                            '<span class="text do-confirm">confirm</span>' + 
46 e9392f3c Kostas Papadimitriou
                            '<span class="cancel-remove cancel">X</span></div>' + 
47 e9392f3c Kostas Papadimitriou
                            '<div class="item-action edit">edit</div>' + 
48 e9392f3c Kostas Papadimitriou
                            '<div class="item-action show">show key</div>' + 
49 e9392f3c Kostas Papadimitriou
                            '</div>');
50 e9392f3c Kostas Papadimitriou
            el.append(actions);
51 e9392f3c Kostas Papadimitriou
        },
52 556dcd88 Kostas Papadimitriou
        
53 556dcd88 Kostas Papadimitriou
        close_private: function() {
54 556dcd88 Kostas Papadimitriou
            this.$(".private-cont").hide();
55 556dcd88 Kostas Papadimitriou
            this.$(".private-cont textarea").val("");   
56 556dcd88 Kostas Papadimitriou
            this.$('.private-cont [name=data]').val("");
57 556dcd88 Kostas Papadimitriou
            this.$('.private-cont [name=name]').val("");
58 556dcd88 Kostas Papadimitriou
        },
59 e9392f3c Kostas Papadimitriou
60 e9392f3c Kostas Papadimitriou
        init_handlers: function() {
61 e9392f3c Kostas Papadimitriou
            views.PublicKeysView.__super__.init_handlers.apply(this, arguments);
62 e9392f3c Kostas Papadimitriou
            
63 e9392f3c Kostas Papadimitriou
            this.$(".add-generate").click(_.bind(this.generate_new, this, undefined));
64 e9392f3c Kostas Papadimitriou
65 e9392f3c Kostas Papadimitriou
            // browser compat check
66 e9392f3c Kostas Papadimitriou
            if (snf.util.canReadFile()) {
67 e9392f3c Kostas Papadimitriou
                var self = this;
68 e9392f3c Kostas Papadimitriou
                this.form.find(".fromfile").get(0).addEventListener("change", function(e){
69 e9392f3c Kostas Papadimitriou
                    var f = undefined;
70 e9392f3c Kostas Papadimitriou
                    var files = e.target.files;
71 e9392f3c Kostas Papadimitriou
                    if (files.length == 0) { return };
72 e9392f3c Kostas Papadimitriou
73 e9392f3c Kostas Papadimitriou
                    f = files[0];
74 e9392f3c Kostas Papadimitriou
                    var data = snf.util.readFileContents(f, _.bind(function(data) {
75 e9392f3c Kostas Papadimitriou
                        this.form.find("textarea").val(data);   
76 e9392f3c Kostas Papadimitriou
                    }, self));
77 e9392f3c Kostas Papadimitriou
                });
78 e9392f3c Kostas Papadimitriou
            }
79 e9392f3c Kostas Papadimitriou
80 e9392f3c Kostas Papadimitriou
            var self = this;
81 e9392f3c Kostas Papadimitriou
            this.$(".private-cont .close-private").live("click", function(e) {
82 556dcd88 Kostas Papadimitriou
                self.close_private();
83 e9392f3c Kostas Papadimitriou
            });
84 e9392f3c Kostas Papadimitriou
85 e9392f3c Kostas Papadimitriou
            this.$(".item-action.show, .item-action.hide").live("click", function(e) {
86 e9392f3c Kostas Papadimitriou
                var open = $(this).parent().parent().parent().hasClass("expanded");
87 e9392f3c Kostas Papadimitriou
                if (open) {
88 e9392f3c Kostas Papadimitriou
                    $(this).text("show key");
89 e9392f3c Kostas Papadimitriou
                    $(this).addClass("show").removeClass("hide");
90 e9392f3c Kostas Papadimitriou
                } else {
91 e9392f3c Kostas Papadimitriou
                    $(this).text("hide key");
92 e9392f3c Kostas Papadimitriou
                    $(this).removeClass("show").addClass("hide");
93 e9392f3c Kostas Papadimitriou
                }
94 e9392f3c Kostas Papadimitriou
                $(this).parent().parent().parent().toggleClass("expanded");
95 e9392f3c Kostas Papadimitriou
            });
96 e9392f3c Kostas Papadimitriou
        },
97 e9392f3c Kostas Papadimitriou
        
98 556dcd88 Kostas Papadimitriou
        __save_new: function(generate_text, key) {
99 e9392f3c Kostas Papadimitriou
            var self = this;
100 556dcd88 Kostas Papadimitriou
            storage.keys.add_crypto_key(key.public,
101 e9392f3c Kostas Papadimitriou
                _.bind(function(instance, data) {
102 e9392f3c Kostas Papadimitriou
                    self.update_models();
103 e9392f3c Kostas Papadimitriou
                    this.generating = false;
104 e9392f3c Kostas Papadimitriou
                    this.$(".add-generate").text(generate_text).removeClass(
105 e9392f3c Kostas Papadimitriou
                        "in-progress").addClass("download");
106 556dcd88 Kostas Papadimitriou
                    this.show_download_private(instance.get('name'), key.private, instance);
107 c1c836ec Kostas Papadimitriou
                    this.enable_create();
108 e9392f3c Kostas Papadimitriou
                },this),
109 e9392f3c Kostas Papadimitriou
110 e9392f3c Kostas Papadimitriou
                _.bind(function() {
111 e9392f3c Kostas Papadimitriou
                    self.show_list_msg("error", "Cannot generate public key, please try again later.");
112 e9392f3c Kostas Papadimitriou
                    
113 e9392f3c Kostas Papadimitriou
                    this.generating = false;
114 e9392f3c Kostas Papadimitriou
                    this.download_private = false;
115 e9392f3c Kostas Papadimitriou
116 e9392f3c Kostas Papadimitriou
                    this.$(".add-generate").text(generate_text).removeClass("in-progress").removeClass("download");
117 c1c836ec Kostas Papadimitriou
                    this.enable_create();
118 e9392f3c Kostas Papadimitriou
                }, this)
119 e9392f3c Kostas Papadimitriou
            );
120 e9392f3c Kostas Papadimitriou
        },
121 e9392f3c Kostas Papadimitriou
122 556dcd88 Kostas Papadimitriou
        __generate_new: function(generate_text) {
123 556dcd88 Kostas Papadimitriou
            var self = this;
124 c72a830d Kostas Papadimitriou
            var key = storage.keys.generate_new(_.bind(this.__save_new, this, generate_text), function(xhr){
125 c72a830d Kostas Papadimitriou
                var resp_error = "";
126 c72a830d Kostas Papadimitriou
                // try to parse response
127 c72a830d Kostas Papadimitriou
                try {
128 c72a830d Kostas Papadimitriou
                    json_resp = JSON.parse(xhr.responseText);
129 c72a830d Kostas Papadimitriou
                    resp_error = json_resp.errors[json_resp.non_field_key].join("<br />");
130 c72a830d Kostas Papadimitriou
                } catch (err) {}
131 c72a830d Kostas Papadimitriou
                
132 c72a830d Kostas Papadimitriou
                var msg = "Cannot generate new key pair";
133 c72a830d Kostas Papadimitriou
                if (resp_error) {
134 c72a830d Kostas Papadimitriou
                    msg += " ({0})".format(resp_error);
135 c72a830d Kostas Papadimitriou
                }
136 c72a830d Kostas Papadimitriou
                self.show_list_msg("error", msg);
137 556dcd88 Kostas Papadimitriou
                self.generating = false;
138 556dcd88 Kostas Papadimitriou
                self.download_private = false;
139 556dcd88 Kostas Papadimitriou
                self.$(".add-generate").text(generate_text).removeClass(
140 556dcd88 Kostas Papadimitriou
                        "in-progress").addClass("download");
141 c1c836ec Kostas Papadimitriou
                self.enable_create();
142 556dcd88 Kostas Papadimitriou
            });
143 556dcd88 Kostas Papadimitriou
        },
144 556dcd88 Kostas Papadimitriou
145 e9392f3c Kostas Papadimitriou
        generate_new: function() {
146 e9392f3c Kostas Papadimitriou
            if (this.generating) { return false };
147 c1c836ec Kostas Papadimitriou
148 e9392f3c Kostas Papadimitriou
            this.$(".private-cont").hide();
149 e9392f3c Kostas Papadimitriou
            this.generating = true;
150 e9392f3c Kostas Papadimitriou
            this.download_private = false;
151 c1c836ec Kostas Papadimitriou
            this.disable_create();
152 e9392f3c Kostas Papadimitriou
            var generate_text = this.$(".add-generate").text();
153 e9392f3c Kostas Papadimitriou
            this.$(".add-generate").text("Generating...").addClass("in-progress").removeClass("download");
154 e9392f3c Kostas Papadimitriou
            
155 e9392f3c Kostas Papadimitriou
            window.setTimeout(_.bind(this.__generate_new, this, generate_text), 400);
156 e9392f3c Kostas Papadimitriou
157 e9392f3c Kostas Papadimitriou
        },
158 c1c836ec Kostas Papadimitriou
159 c1c836ec Kostas Papadimitriou
        disable_create: function() {
160 c1c836ec Kostas Papadimitriou
            this.create_disabled = true;
161 c1c836ec Kostas Papadimitriou
            this.$(".collection-action.add").addClass("disabled");
162 c1c836ec Kostas Papadimitriou
        },
163 c1c836ec Kostas Papadimitriou
        
164 c1c836ec Kostas Papadimitriou
        enable_create: function() {
165 c1c836ec Kostas Papadimitriou
            this.create_disabled = false;
166 c1c836ec Kostas Papadimitriou
            this.$(".collection-action.add").removeClass("disabled");
167 c1c836ec Kostas Papadimitriou
        },
168 e9392f3c Kostas Papadimitriou
        
169 556dcd88 Kostas Papadimitriou
        show_download_private: function(name, private) {
170 e9392f3c Kostas Papadimitriou
            var download_cont = this.$(".private-cont");
171 e9392f3c Kostas Papadimitriou
            download_cont.show();
172 556dcd88 Kostas Papadimitriou
            download_cont.find(".key-contents textarea").val("");
173 556dcd88 Kostas Papadimitriou
            download_cont.find(".private-msg, .down-button").show();
174 556dcd88 Kostas Papadimitriou
            download_cont.find(".private-msg.copy").hide();
175 556dcd88 Kostas Papadimitriou
            download_cont.find(".private-msg.download").hide();
176 556dcd88 Kostas Papadimitriou
            download_cont.find("textarea").hide();
177 556dcd88 Kostas Papadimitriou
            download_cont.find("form").attr({action: snf.config.userdata_keys_url + '/download'})
178 556dcd88 Kostas Papadimitriou
            download_cont.find('[name=data]').val(private);
179 556dcd88 Kostas Papadimitriou
            download_cont.find('[name=name]').val(name);
180 e9392f3c Kostas Papadimitriou
        },
181 e9392f3c Kostas Papadimitriou
182 e9392f3c Kostas Papadimitriou
        update_list_item: function(el, model) {
183 e9392f3c Kostas Papadimitriou
            el.find(".name").text(model.get("name"));
184 e9392f3c Kostas Papadimitriou
            el.find(".key-type").text(model.identify_type() || "unknown");
185 e9392f3c Kostas Papadimitriou
            el.find(".publicid .param-content textarea").val(model.get("content"));
186 386481eb Kostas Papadimitriou
            el.find(".fingerprint .text").text(model.get("fingerprint"));
187 e9392f3c Kostas Papadimitriou
            el.find(".publicid").attr("title", _(model.get("content")).truncate(1000, "..."));
188 e9392f3c Kostas Papadimitriou
            return el;
189 e9392f3c Kostas Papadimitriou
        },
190 e9392f3c Kostas Papadimitriou
191 c72a830d Kostas Papadimitriou
        update_list: function() {
192 c72a830d Kostas Papadimitriou
            views.PublicKeysView.__super__.update_list.apply(this, arguments);
193 c72a830d Kostas Papadimitriou
            this.check_limit();
194 c72a830d Kostas Papadimitriou
        },
195 c72a830d Kostas Papadimitriou
196 c72a830d Kostas Papadimitriou
        check_limit: function() {
197 c72a830d Kostas Papadimitriou
            if (snf.storage.keys.length >= this.keys_limit) {
198 c72a830d Kostas Papadimitriou
                this.$(".collection-action").hide();
199 c72a830d Kostas Papadimitriou
                this.$(".limit-msg").show();
200 c72a830d Kostas Papadimitriou
            } else {
201 c72a830d Kostas Papadimitriou
                this.$(".collection-action").show();
202 c72a830d Kostas Papadimitriou
                this.$(".limit-msg").hide();
203 c72a830d Kostas Papadimitriou
            }
204 c72a830d Kostas Papadimitriou
        },
205 c72a830d Kostas Papadimitriou
206 e9392f3c Kostas Papadimitriou
        update_form_from_model: function(model) {
207 e9392f3c Kostas Papadimitriou
            this.form.find("input.input-name").val(model.get("name"));
208 e9392f3c Kostas Papadimitriou
            this.form.find("textarea.input-content").val(model.get("content"));
209 e9392f3c Kostas Papadimitriou
        },
210 e9392f3c Kostas Papadimitriou
211 e9392f3c Kostas Papadimitriou
        get_form_data: function() {
212 e9392f3c Kostas Papadimitriou
            return {
213 e9392f3c Kostas Papadimitriou
                'name': this.form.find("input.input-name").val(),
214 e9392f3c Kostas Papadimitriou
                'content': this.form.find("textarea.input-content").val()
215 e9392f3c Kostas Papadimitriou
            }
216 e9392f3c Kostas Papadimitriou
        },
217 e9392f3c Kostas Papadimitriou
        
218 e9392f3c Kostas Papadimitriou
        get_fields_map: function() {
219 e9392f3c Kostas Papadimitriou
            return {'name': "input.input-name", 'content': "textarea.input-content"};
220 e9392f3c Kostas Papadimitriou
        },
221 e9392f3c Kostas Papadimitriou
        
222 e9392f3c Kostas Papadimitriou
        validate_data: function(data) {
223 e9392f3c Kostas Papadimitriou
            var user_data = _.clone(data)
224 e9392f3c Kostas Papadimitriou
            var errors = new snf.util.errorList();
225 e9392f3c Kostas Papadimitriou
226 e9392f3c Kostas Papadimitriou
            if (!data.name || _.clean(data.name) == "") {
227 e9392f3c Kostas Papadimitriou
                errors.add("name", "Provide a valid public key name");
228 e9392f3c Kostas Papadimitriou
            }
229 e9392f3c Kostas Papadimitriou
230 e9392f3c Kostas Papadimitriou
            if (!data.content || _.clean(data.content) == "") {
231 e9392f3c Kostas Papadimitriou
                errors.add("content", "Provide valid public key content");
232 e9392f3c Kostas Papadimitriou
                return errors;
233 e9392f3c Kostas Papadimitriou
            }
234 e9392f3c Kostas Papadimitriou
            
235 e9392f3c Kostas Papadimitriou
            try {
236 e9392f3c Kostas Papadimitriou
                var content = snf.util.validatePublicKey(data.content);
237 e9392f3c Kostas Papadimitriou
                if (content) {
238 e9392f3c Kostas Papadimitriou
                    this.form.find("textarea.input-content").val(content);
239 e9392f3c Kostas Papadimitriou
                }
240 e9392f3c Kostas Papadimitriou
            } catch (err) {
241 e9392f3c Kostas Papadimitriou
                errors.add("content", "Invalid key content (" + err + ")");
242 e9392f3c Kostas Papadimitriou
            }
243 e9392f3c Kostas Papadimitriou
244 e9392f3c Kostas Papadimitriou
            return errors;
245 e9392f3c Kostas Papadimitriou
        },
246 e9392f3c Kostas Papadimitriou
247 e9392f3c Kostas Papadimitriou
        reset: function() {
248 e9392f3c Kostas Papadimitriou
            this.$(".private-cont").hide();
249 e9392f3c Kostas Papadimitriou
            this.$(".list-messages").empty();
250 e9392f3c Kostas Papadimitriou
            this.$(".form-messages").empty();
251 e9392f3c Kostas Papadimitriou
            this.$(".model-item").removeClass("expanded");
252 556dcd88 Kostas Papadimitriou
            this.close_private();
253 e9392f3c Kostas Papadimitriou
            this.close_form();
254 e9392f3c Kostas Papadimitriou
        }
255 e9392f3c Kostas Papadimitriou
256 e9392f3c Kostas Papadimitriou
    })
257 e9392f3c Kostas Papadimitriou
258 e9392f3c Kostas Papadimitriou
    views.PublicKeysOverlay = views.Overlay.extend({
259 e9392f3c Kostas Papadimitriou
        
260 e9392f3c Kostas Papadimitriou
        view_id: "public_keys_view",
261 e9392f3c Kostas Papadimitriou
        content_selector: "#user_public_keys",
262 e9392f3c Kostas Papadimitriou
        css_class: 'overlay-public-keys overlay-info',
263 e9392f3c Kostas Papadimitriou
        overlay_id: "user_public_keys_overlay",
264 e9392f3c Kostas Papadimitriou
265 e9392f3c Kostas Papadimitriou
        title: "Manage your ssh keys",
266 e9392f3c Kostas Papadimitriou
        subtitle: "SSH keys",
267 e9392f3c Kostas Papadimitriou
268 e9392f3c Kostas Papadimitriou
        initialize: function(options) {
269 e9392f3c Kostas Papadimitriou
            views.PublicKeysOverlay.__super__.initialize.apply(this, arguments);
270 e9392f3c Kostas Papadimitriou
            this.subview = new views.PublicKeysView({el:this.$(".public-keys-view")});
271 47276ec2 Kostas Papadimitriou
            
272 47276ec2 Kostas Papadimitriou
            var self = this;
273 47276ec2 Kostas Papadimitriou
            this.$(".previous-view-link").live('click', function(){
274 47276ec2 Kostas Papadimitriou
                self.hide();
275 47276ec2 Kostas Papadimitriou
            })
276 e9392f3c Kostas Papadimitriou
        },
277 e9392f3c Kostas Papadimitriou
278 47276ec2 Kostas Papadimitriou
        show: function(view) {
279 47276ec2 Kostas Papadimitriou
            this.from_view = view || undefined;
280 47276ec2 Kostas Papadimitriou
            
281 47276ec2 Kostas Papadimitriou
            if (this.from_view) {
282 47276ec2 Kostas Papadimitriou
                this.$(".previous-view-link").show();
283 47276ec2 Kostas Papadimitriou
            } else {
284 47276ec2 Kostas Papadimitriou
                this.$(".previous-view-link").hide();
285 47276ec2 Kostas Papadimitriou
            }
286 47276ec2 Kostas Papadimitriou
287 e9392f3c Kostas Papadimitriou
            this.subview.reset();
288 e9392f3c Kostas Papadimitriou
            views.PublicKeysOverlay.__super__.show.apply(this, arguments);
289 e9392f3c Kostas Papadimitriou
        },
290 47276ec2 Kostas Papadimitriou
        
291 47276ec2 Kostas Papadimitriou
        onClose: function() {
292 47276ec2 Kostas Papadimitriou
            if (this.from_view) {
293 47276ec2 Kostas Papadimitriou
                this.hiding = true;
294 47276ec2 Kostas Papadimitriou
                this.from_view.skip_reset_on_next_open = true;
295 47276ec2 Kostas Papadimitriou
                this.from_view.show();
296 47276ec2 Kostas Papadimitriou
                this.from_view = undefined;
297 47276ec2 Kostas Papadimitriou
            }
298 47276ec2 Kostas Papadimitriou
        },
299 e9392f3c Kostas Papadimitriou
300 e9392f3c Kostas Papadimitriou
        init_handlers: function() {
301 e9392f3c Kostas Papadimitriou
        }
302 e9392f3c Kostas Papadimitriou
        
303 e9392f3c Kostas Papadimitriou
    });
304 e9392f3c Kostas Papadimitriou
})(this);
305 e9392f3c Kostas Papadimitriou