UI support for ssh keys

To user and host details pages was added ipasshpubkey attribute.

New widget for ssh public keys was created.

https://fedorahosted.org/freeipa/ticket/2340
This commit is contained in:
Petr Voborník 2012-02-06 14:52:09 +01:00
parent 651f932473
commit eb87b8c319
15 changed files with 369 additions and 26 deletions

View File

@ -148,22 +148,28 @@ IPA.field = function(spec) {
that.load = function(record) { that.load = function(record) {
that.record = record; that.record = record;
var value = record[that.name]; that.values = that.get_value(record, that.name);
if (value instanceof Array) {
that.values = value;
} else {
that.values = value !== undefined ? [value] : [];
}
if (!that.values.length) {
that.values = [''];
}
that.load_writable(record); that.load_writable(record);
that.reset(); that.reset();
}; };
that.get_value = function(record, name) {
var value = record[name];
if (!(value instanceof Array)) {
value = value !== undefined ? [value] : [];
}
if (!value.length) {
value = [''];
}
return value;
};
that.load_writable = function(record) { that.load_writable = function(record) {
that.writable = true; that.writable = true;
@ -272,16 +278,21 @@ IPA.field = function(spec) {
//compare values in array //compare values in array
if (values.length !== that.values.length) return true; if (values.length !== that.values.length) return true;
values.sort(); return !that.dirty_are_equal(that.values, values);
that.values.sort(); };
for (var i=0; i<values.length; i++) { that.dirty_are_equal = function(orig_vals, new_vals) {
if (values[i] != that.values[i]) {
return true; orig_vals.sort();
new_vals.sort();
for (var i=0; i<orig_vals.length; i++) {
if (orig_vals[i] !== new_vals[i]) {
return false;
} }
} }
return false; return true;
}; };
that.is_empty = function(value) { that.is_empty = function(value) {
@ -382,6 +393,7 @@ IPA.field = function(spec) {
init(); init();
// methods that should be invoked by subclasses // methods that should be invoked by subclasses
that.field_dirty_are_equal = that.dirty_are_equal;
that.field_load = that.load; that.field_load = that.load;
that.field_reset = that.reset; that.field_reset = that.reset;
that.field_save = that.save; that.field_save = that.save;
@ -567,6 +579,56 @@ IPA.multivalued_field = function(spec) {
return that; return that;
}; };
IPA.sshkeys_field = function(spec) {
spec = spec || {};
var that = IPA.multivalued_field(spec);
that.sshfp_attr = 'sshpubkeyfp' || spec.sshfp_attr;
that.load = function(record) {
var keys = that.get_value(record, that.name);
var fingerprints = that.get_value(record, that.sshfp_attr);
var values = [];
if (keys.length === fingerprints.length) {
for (var i=0; i<keys.length; i++) {
if (keys[i] === '') continue;
var value = {
key: keys[i].__base64__,
fingerprint: fingerprints[i]
};
values.push(value);
}
}
that.values = values;
that.load_writable(record);
that.reset();
};
that.dirty_are_equal = function(orig_vals, new_vals) {
var i;
var orig_keys = [];
for (i=0; i<orig_vals.length; i++) {
orig_keys.push(orig_vals[i].key);
}
return that.field_dirty_are_equal(orig_keys, new_vals);
};
return that;
};
IPA.select_field = function(spec) { IPA.select_field = function(spec) {
spec = spec || {}; spec = spec || {};
@ -805,3 +867,4 @@ IPA.field_factories['entity_select'] = IPA.combobox_field;
IPA.field_factories['combobox'] = IPA.combobox_field; IPA.field_factories['combobox'] = IPA.combobox_field;
IPA.field_factories['link'] = IPA.link_field; IPA.field_factories['link'] = IPA.link_field;
IPA.field_factories['enable'] = IPA.enable_field; IPA.field_factories['enable'] = IPA.enable_field;
IPA.field_factories['sshkeys'] = IPA.sshkeys_field;

View File

@ -63,7 +63,12 @@ IPA.host.entity = function(spec) {
'l', 'l',
'nshostlocation', 'nshostlocation',
'nshardwareplatform', 'nshardwareplatform',
'nsosversion' 'nsosversion',
{
type: 'sshkeys',
name: 'ipasshpubkey',
label: IPA.messages.objects.sshkeystore.keys
}
] ]
}, },
{ {

View File

@ -1251,11 +1251,11 @@ table.scrollable tbody {
width: 250px; width: 250px;
} }
.multivalued-text-widget [name=value] { .multivalued-widget [name=value] {
margin-bottom: 1em; margin-bottom: 1em;
} }
.multivalued-text-widget input { .multivalued-widget input {
width: 250px; width: 250px;
} }
@ -1487,6 +1487,11 @@ div.entity[name=hbactest] div.facet[name=run_test] .hbac-test-content {
font-weight: normal; font-weight: normal;
} }
/* --- SSH key store --- */
span.sshkey-status, a.sshkey-set {
padding-right: 5px;
}
/* --- Automember --- */ /* --- Automember --- */
.automember-header { .automember-header {

View File

@ -10,6 +10,7 @@
"enrolledby": "rsc", "enrolledby": "rsc",
"fqdn": "rscwo", "fqdn": "rscwo",
"ipaclientversion": "rscwo", "ipaclientversion": "rscwo",
"ipasshpubkey": "rscwo",
"ipauniqueid": "rsc", "ipauniqueid": "rsc",
"krbcanonicalname": "rscwo", "krbcanonicalname": "rscwo",
"krbextradata": "rscwo", "krbextradata": "rscwo",

View File

@ -10,6 +10,7 @@
"enrolledby": "rsc", "enrolledby": "rsc",
"fqdn": "rscwo", "fqdn": "rscwo",
"ipaclientversion": "rscwo", "ipaclientversion": "rscwo",
"ipasshpubkey": "rscwo",
"ipauniqueid": "rsc", "ipauniqueid": "rsc",
"krbcanonicalname": "rsc", "krbcanonicalname": "rsc",
"krbextradata": "rsc", "krbextradata": "rsc",

View File

@ -10,6 +10,7 @@
"enrolledby": "rsc", "enrolledby": "rsc",
"fqdn": "rscwo", "fqdn": "rscwo",
"ipaclientversion": "rscwo", "ipaclientversion": "rscwo",
"ipasshpubkey": "rscwo",
"ipauniqueid": "rsc", "ipauniqueid": "rsc",
"krbcanonicalname": "rsc", "krbcanonicalname": "rsc",
"krbextradata": "rsc", "krbextradata": "rsc",

View File

@ -10,6 +10,7 @@
"enrolledby": "rsc", "enrolledby": "rsc",
"fqdn": "rscwo", "fqdn": "rscwo",
"ipaclientversion": "rscwo", "ipaclientversion": "rscwo",
"ipasshpubkey": "rscwo",
"ipauniqueid": "rsc", "ipauniqueid": "rsc",
"krbcanonicalname": "rsc", "krbcanonicalname": "rsc",
"krbextradata": "rsc", "krbextradata": "rsc",

View File

@ -59,6 +59,7 @@
"restore": "Restore", "restore": "Restore",
"retry": "Retry", "retry": "Retry",
"revoke": "Revoke", "revoke": "Revoke",
"set": "Set",
"update": "Update", "update": "Update",
"view": "View" "view": "View"
}, },
@ -318,6 +319,16 @@
"unprovision_title": "Unprovisioning ${entity}", "unprovision_title": "Unprovisioning ${entity}",
"valid": "Kerberos Key Present, Service Provisioned" "valid": "Kerberos Key Present, Service Provisioned"
}, },
"sshkeystore": {
"keys": "SSH public keys",
"set_dialog_help": "Base-64 encoded SSH public key:",
"set_dialog_title": "Set SSH key",
"show_set_key": "Show/Set key",
"status_mod_ns": "Modified: key not set",
"status_mod_s": "Modified",
"status_new_ns": "New: key not set",
"status_new_s": "New: key set"
},
"sudocmd": { "sudocmd": {
"groups": "Groups" "groups": "Groups"
}, },

View File

@ -30,6 +30,7 @@
"inetuserstatus": "rscwo", "inetuserstatus": "rscwo",
"initials": "rscwo", "initials": "rscwo",
"internationalisdnnumber": "rscwo", "internationalisdnnumber": "rscwo",
"ipasshpubkey": "rscwo",
"ipauniqueid": "rsc", "ipauniqueid": "rsc",
"jpegphoto": "rscwo", "jpegphoto": "rscwo",
"krbcanonicalname": "rscwo", "krbcanonicalname": "rscwo",
@ -107,6 +108,14 @@
"homedirectory": [ "homedirectory": [
"/home/kfrog" "/home/kfrog"
], ],
"ipasshpubkey": [
{
"__base64__": "AAAAB3NzaC1kc3MAAACBAJQdBmxjnYdDzpGPzAD2kkoRwGbPIqVsu6mR0eyLjMJafQPbOkrgFpIwxAhb519FHAr0olSOklwq5Pvkm7rSpnoXDAEoVlW5jNCj33NrYkVJTAmtsa4ihZIqz7KJYkYifQyBxy8nYScAlEu1a1k9xfbRT8ZAmiCqgd6klWaKZXHBAAAAFQCd2wJW3Rb7kclRPbKaRF1hhdW+hwAAAIBr9ZozKls1lAkqMZuhGgnvlFg5J7DXKRY6iju1VfMc5HiY1mq197Qq2PVi4iQ1Ach3Pvj/MZGLhz/SyIsH59Uugl21KeQjk2HHt/ZLL1PrJvm9LmX3Fv2E8lQNnEyPaA2Ngf6O0bbzii41lp1F6wo3xQLJCLldljcG+wskRf5RrgAAAIAKTDWct9ES5BZADb3TfBAng2aeeojg6rDhS6i0WYPtna2hjCdRaCnnXM079JVcYBq3IK7mFpINnqnn252Mr9OqGsu/92gglfpTpXq2Lzkvd2dbcyTPQmNBM7+KFlUOZ4hWb4c5CVLBwILccL7QakwSHRYlRhCsDyKbI+2qPGwrXg=="
},
{
"__base64__": "AAAAB3NzaC1yc2EAAAADAQABAAABAQCaoWIiTBqTqsWnAHFUfOUNY65sk2KuEp798ESyDWmOuJbjQNHG0grl8d5D9/OMuDvSHAthkTR4rXn1QAMm+Geh63XhS+nnEpzinPKloMWyF8wsNEw117TX2mA8wzeea1HDcqd0v4YKyU5FAHm+6hOALB9mrAnRZ4WoTY6NWtm3aoRge1D26pOuLRyNFB5Etwa7cmJqaK8EeHN0XNPIbaAP1JNVe46wyYvMlE/yhGYS9qW36OJpQBJGk9nYqHT3/6ai2w3TQ8k5puvAwBcCe0wYhBE9o8c5PmImIfa8lZ3Oo2gHIiOyA9gyHv3MBqUxXBC6PmmYHEr6y/wnYnfSHF+N"
}
],
"ipauniqueid": [ "ipauniqueid": [
"a2854798-e7d811df-b69ad8ca-cb44a24c" "a2854798-e7d811df-b69ad8ca-cb44a24c"
], ],
@ -162,6 +171,10 @@
"sn": [ "sn": [
"Frog" "Frog"
], ],
"sshpubkeyfp": [
"6E:70:C6:8E:88:2F:F1:5D:63:B4:C5:D1:B8:A6:D6:0C (ssh-dss)",
"93:23:CD:AE:50:0F:BF:0A:EB:2C:0C:1A:0B:18:DF:0A (ssh-rsa)"
],
"uid": [ "uid": [
"kfrog" "kfrog"
], ],

View File

@ -27,6 +27,7 @@
"inetuserstatus": "rscwo", "inetuserstatus": "rscwo",
"initials": "rscwo", "initials": "rscwo",
"internationalisdnnumber": "rscwo", "internationalisdnnumber": "rscwo",
"ipasshpubkey": "rscwo",
"ipauniqueid": "rsc", "ipauniqueid": "rsc",
"jpegphoto": "rscwo", "jpegphoto": "rscwo",
"krbcanonicalname": "rscwo", "krbcanonicalname": "rscwo",
@ -103,6 +104,14 @@
"homedirectory": [ "homedirectory": [
"/home/kfrog" "/home/kfrog"
], ],
"ipasshpubkey": [
{
"__base64__": "AAAAB3NzaC1kc3MAAACBAJQdBmxjnYdDzpGPzAD2kkoRwGbPIqVsu6mR0eyLjMJafQPbOkrgFpIwxAhb519FHAr0olSOklwq5Pvkm7rSpnoXDAEoVlW5jNCj33NrYkVJTAmtsa4ihZIqz7KJYkYifQyBxy8nYScAlEu1a1k9xfbRT8ZAmiCqgd6klWaKZXHBAAAAFQCd2wJW3Rb7kclRPbKaRF1hhdW+hwAAAIBr9ZozKls1lAkqMZuhGgnvlFg5J7DXKRY6iju1VfMc5HiY1mq197Qq2PVi4iQ1Ach3Pvj/MZGLhz/SyIsH59Uugl21KeQjk2HHt/ZLL1PrJvm9LmX3Fv2E8lQNnEyPaA2Ngf6O0bbzii41lp1F6wo3xQLJCLldljcG+wskRf5RrgAAAIAKTDWct9ES5BZADb3TfBAng2aeeojg6rDhS6i0WYPtna2hjCdRaCnnXM079JVcYBq3IK7mFpINnqnn252Mr9OqGsu/92gglfpTpXq2Lzkvd2dbcyTPQmNBM7+KFlUOZ4hWb4c5CVLBwILccL7QakwSHRYlRhCsDyKbI+2qPGwrXg=="
},
{
"__base64__": "AAAAB3NzaC1yc2EAAAADAQABAAABAQCaoWIiTBqTqsWnAHFUfOUNY65sk2KuEp798ESyDWmOuJbjQNHG0grl8d5D9/OMuDvSHAthkTR4rXn1QAMm+Geh63XhS+nnEpzinPKloMWyF8wsNEw117TX2mA8wzeea1HDcqd0v4YKyU5FAHm+6hOALB9mrAnRZ4WoTY6NWtm3aoRge1D26pOuLRyNFB5Etwa7cmJqaK8EeHN0XNPIbaAP1JNVe46wyYvMlE/yhGYS9qW36OJpQBJGk9nYqHT3/6ai2w3TQ8k5puvAwBcCe0wYhBE9o8c5PmImIfa8lZ3Oo2gHIiOyA9gyHv3MBqUxXBC6PmmYHEr6y/wnYnfSHF+N"
}
],
"ipauniqueid": [ "ipauniqueid": [
"a2854798-e7d811df-b69ad8ca-cb44a24c" "a2854798-e7d811df-b69ad8ca-cb44a24c"
], ],
@ -149,6 +158,10 @@
"sn": [ "sn": [
"Frog" "Frog"
], ],
"sshpubkeyfp": [
"6E:70:C6:8E:88:2F:F1:5D:63:B4:C5:D1:B8:A6:D6:0C (ssh-dss)",
"93:23:CD:AE:50:0F:BF:0A:EB:2C:0C:1A:0B:18:DF:0A (ssh-rsa)"
],
"uid": [ "uid": [
"kfrog" "kfrog"
], ],

View File

@ -27,6 +27,7 @@
"inetuserstatus": "rscwo", "inetuserstatus": "rscwo",
"initials": "rscwo", "initials": "rscwo",
"internationalisdnnumber": "rscwo", "internationalisdnnumber": "rscwo",
"ipasshpubkey": "rscwo",
"ipauniqueid": "rsc", "ipauniqueid": "rsc",
"jpegphoto": "rscwo", "jpegphoto": "rscwo",
"krbcanonicalname": "rscwo", "krbcanonicalname": "rscwo",
@ -104,6 +105,14 @@
"homedirectory": [ "homedirectory": [
"/home/kfrog" "/home/kfrog"
], ],
"ipasshpubkey": [
{
"__base64__": "AAAAB3NzaC1kc3MAAACBAJQdBmxjnYdDzpGPzAD2kkoRwGbPIqVsu6mR0eyLjMJafQPbOkrgFpIwxAhb519FHAr0olSOklwq5Pvkm7rSpnoXDAEoVlW5jNCj33NrYkVJTAmtsa4ihZIqz7KJYkYifQyBxy8nYScAlEu1a1k9xfbRT8ZAmiCqgd6klWaKZXHBAAAAFQCd2wJW3Rb7kclRPbKaRF1hhdW+hwAAAIBr9ZozKls1lAkqMZuhGgnvlFg5J7DXKRY6iju1VfMc5HiY1mq197Qq2PVi4iQ1Ach3Pvj/MZGLhz/SyIsH59Uugl21KeQjk2HHt/ZLL1PrJvm9LmX3Fv2E8lQNnEyPaA2Ngf6O0bbzii41lp1F6wo3xQLJCLldljcG+wskRf5RrgAAAIAKTDWct9ES5BZADb3TfBAng2aeeojg6rDhS6i0WYPtna2hjCdRaCnnXM079JVcYBq3IK7mFpINnqnn252Mr9OqGsu/92gglfpTpXq2Lzkvd2dbcyTPQmNBM7+KFlUOZ4hWb4c5CVLBwILccL7QakwSHRYlRhCsDyKbI+2qPGwrXg=="
},
{
"__base64__": "AAAAB3NzaC1yc2EAAAADAQABAAABAQCaoWIiTBqTqsWnAHFUfOUNY65sk2KuEp798ESyDWmOuJbjQNHG0grl8d5D9/OMuDvSHAthkTR4rXn1QAMm+Geh63XhS+nnEpzinPKloMWyF8wsNEw117TX2mA8wzeea1HDcqd0v4YKyU5FAHm+6hOALB9mrAnRZ4WoTY6NWtm3aoRge1D26pOuLRyNFB5Etwa7cmJqaK8EeHN0XNPIbaAP1JNVe46wyYvMlE/yhGYS9qW36OJpQBJGk9nYqHT3/6ai2w3TQ8k5puvAwBcCe0wYhBE9o8c5PmImIfa8lZ3Oo2gHIiOyA9gyHv3MBqUxXBC6PmmYHEr6y/wnYnfSHF+N"
}
],
"ipauniqueid": [ "ipauniqueid": [
"a2854798-e7d811df-b69ad8ca-cb44a24c" "a2854798-e7d811df-b69ad8ca-cb44a24c"
], ],
@ -159,6 +168,10 @@
"sn": [ "sn": [
"Frog" "Frog"
], ],
"sshpubkeyfp": [
"6E:70:C6:8E:88:2F:F1:5D:63:B4:C5:D1:B8:A6:D6:0C (ssh-dss)",
"93:23:CD:AE:50:0F:BF:0A:EB:2C:0C:1A:0B:18:DF:0A (ssh-rsa)"
],
"uid": [ "uid": [
"kfrog" "kfrog"
], ],

View File

@ -211,7 +211,7 @@ test("Testing text widget.", function() {
}); });
test("Testing multi-valued text widget.", function() { test("Testing multi-valued text widget.", function() {
factory = IPA.multivalued_text_widget; factory = IPA.multivalued_widget;
spec = {undo:true,name:'title'}; spec = {undo:true,name:'title'};
base_widget_test('test_value'); base_widget_test('test_value');
widget_string_test(); widget_string_test();

View File

@ -91,7 +91,12 @@ IPA.user.entity = function(spec) {
'uidnumber', 'uidnumber',
'gidnumber', 'gidnumber',
'loginshell', 'loginshell',
'homedirectory' 'homedirectory',
{
type: 'sshkeys',
name: 'ipasshpubkey',
label: IPA.messages.objects.sshkeystore.keys
}
] ]
}, },
{ {

View File

@ -308,7 +308,7 @@ IPA.password_widget = function(spec) {
return that; return that;
}; };
IPA.multivalued_text_widget = function(spec) { IPA.multivalued_widget = function(spec) {
spec = spec || {}; spec = spec || {};
@ -322,9 +322,12 @@ IPA.multivalued_text_widget = function(spec) {
that.rows = []; that.rows = [];
that.on_child_value_changed = function(row) { that.on_child_value_changed = function(row) {
if(that.test_dirty_row(row)) { if (that.test_dirty_row(row)) {
row.widget.show_undo(); row.widget.show_undo();
row.remove_link.hide(); row.remove_link.hide();
} else {
row.widget.hide_undo();
row.remove_link.show();
} }
that.value_changed.notify([], that); that.value_changed.notify([], that);
@ -473,7 +476,7 @@ IPA.multivalued_text_widget = function(spec) {
that.create = function(container) { that.create = function(container) {
container.addClass('multivalued-text-widget'); container.addClass('multivalued-widget');
that.widget_create(container); that.widget_create(container);
@ -2813,6 +2816,202 @@ IPA.widget_builder = function(spec) {
return that; return that;
}; };
IPA.sshkeys_widget = function(spec) {
spec = spec || {};
spec.widget_factory = IPA.sshkey_widget;
var that = IPA.multivalued_widget(spec);
that.test_dirty_row = function(row) {
if(row.deleted || row.is_new) return true;
var values = row.widget.save();
var key = values[0];
var original_key = row.original_values[0];
if (original_key && original_key.key && original_key.key !== key) {
return true;
}
return false;
};
return that;
};
IPA.sshkey_widget = function(spec) {
spec = spec || {};
var that = IPA.input_widget(spec);
that.key = null;
that.originally_set = false;
that.create = function(container) {
that.widget_create(container);
container.addClass('text-widget');
that.status_label = $('<span />', {
'class': 'sshkey-status',
text: ''
}).appendTo(container);
that.link = $('<a/>', {
type: that.type,
'class': 'sshkey-set',
name: that.name,
href: '#show-certificate',
title: that.tooltip,
text: IPA.messages.objects.sshkeystore.show_set_key,
onclick: function() {
that.open_edit_dialog();
return false;
}
}).appendTo(container);
if (that.undo) {
that.create_undo(container);
}
that.create_error_link(container);
};
that.update = function(values) {
var key = values && values.length ? values[0] : null;
if (!key || key === '') {
key = {};
}
that.key = $.extend({}, key);
if (that.key.key && that.key.key !== '' &&
that.key.fingerprint && that.key.fingerprint !== '') {
that.originally_set = true;
that.original_key = that.key.key;
}
that.update_link();
};
that.set_deleted = function(deleted) {
if (deleted) {
that.status_label.addClass('strikethrough');
} else {
that.status_label.removeClass('strikethrough');
}
};
that.save = function() {
var value = that.key.key;
value = value ? [value] : [''];
return value;
};
that.update_link = function() {
var text = that.get_status();
that.status_label.text(text);
};
that.get_status = function() {
var text = '';
var value = that.key.key;
if (that.original_key) {
if (value !== that.original_key) {
if (value === '') {
text = IPA.messages.objects.sshkeystore.status_mod_ns;
} else {
text = IPA.messages.objects.sshkeystore.status_mod_s;
}
} else {
text = that.key.fingerprint;
}
} else {
if (!value || value === '') {
text = IPA.messages.objects.sshkeystore.status_new_ns;
} else {
text = IPA.messages.objects.sshkeystore.status_new_s;
}
}
return text;
};
that.set_user_value = function(value) {
var previous = that.key.key;
that.key.key = value;
that.update_link();
if (value !== previous) {
that.value_changed.notify([], that);
}
};
that.open_edit_dialog = function() {
var dialog = that.create_edit_dialog();
dialog.open();
};
that.create_edit_dialog = function() {
var dialog = IPA.dialog({
title: IPA.messages.objects.sshkeystore.set_dialog_title,
width: 500,
height: 380
});
dialog.message = IPA.messages.objects.sshkeystore.set_dialog_help;
dialog.create_button({
name: 'update',
label: IPA.messages.buttons.set,
click: function() {
var value = dialog.textarea.val();
that.set_user_value(value);
dialog.close();
}
});
dialog.create_button({
name: 'cancel',
label: IPA.messages.buttons.cancel,
click: function() {
dialog.close();
}
});
dialog.create = function() {
dialog.container.append(dialog.message);
dialog.textarea = $('<textarea/>', {
'class': 'certificate',
readonly: that.read_only
}).appendTo(dialog.container);
var key = that.key.key || '';
dialog.textarea.val(key);
};
return dialog;
};
return that;
};
IPA.widget_factories['attribute_table'] = IPA.attribute_table_widget; IPA.widget_factories['attribute_table'] = IPA.attribute_table_widget;
IPA.widget_factories['checkbox'] = IPA.checkbox_widget; IPA.widget_factories['checkbox'] = IPA.checkbox_widget;
@ -2825,9 +3024,10 @@ IPA.widget_factories['enable'] = IPA.enable_widget;
IPA.widget_factories['entity_select'] = IPA.entity_select_widget; IPA.widget_factories['entity_select'] = IPA.entity_select_widget;
IPA.widget_factories['header'] = IPA.header_widget; IPA.widget_factories['header'] = IPA.header_widget;
IPA.widget_factories['link'] = IPA.link_widget; IPA.widget_factories['link'] = IPA.link_widget;
IPA.widget_factories['multivalued'] = IPA.multivalued_text_widget; IPA.widget_factories['multivalued'] = IPA.multivalued_widget;
IPA.widget_factories['password'] = IPA.password_widget; IPA.widget_factories['password'] = IPA.password_widget;
IPA.widget_factories['radio'] = IPA.radio_widget; IPA.widget_factories['radio'] = IPA.radio_widget;
IPA.widget_factories['select'] = IPA.select_widget; IPA.widget_factories['select'] = IPA.select_widget;
IPA.widget_factories['sshkeys'] = IPA.sshkeys_widget;
IPA.widget_factories['textarea'] = IPA.textarea_widget; IPA.widget_factories['textarea'] = IPA.textarea_widget;
IPA.widget_factories['text'] = IPA.text_widget; IPA.widget_factories['text'] = IPA.text_widget;

View File

@ -194,6 +194,7 @@ class i18n_messages(Command):
"restore": _("Restore"), "restore": _("Restore"),
"retry": _("Retry"), "retry": _("Retry"),
"revoke": _("Revoke"), "revoke": _("Revoke"),
"set": _("Set"),
"update": _("Update"), "update": _("Update"),
"view": _("View"), "view": _("View"),
}, },
@ -457,6 +458,16 @@ class i18n_messages(Command):
"unprovision_title": _("Unprovisioning ${entity}"), "unprovision_title": _("Unprovisioning ${entity}"),
"valid": _("Kerberos Key Present, Service Provisioned"), "valid": _("Kerberos Key Present, Service Provisioned"),
}, },
"sshkeystore": {
"keys": _("SSH public keys"),
"set_dialog_help": _("Base-64 encoded SSH public key:"),
"set_dialog_title": _("Set SSH key"),
"show_set_key": _("Show/Set key"),
"status_mod_ns": _("Modified: key not set"),
"status_mod_s": _("Modified"),
"status_new_ns": _("New: key not set"),
"status_new_s": _("New: key set"),
},
"sudocmd": { "sudocmd": {
"groups": _("Groups"), "groups": _("Groups"),
}, },