blob: d4744829f010b8c8f316f849542a049d22b5a2df [file] [log] [blame]
/* your java script code here */
var userTree = false;
var selectedRole = false;
var newDialogRole = false;
var roleDetails = false;
var roleDetailsHelp = false;
var roleDetailsTable = false;
var roleDetailsBody = false;
var roleDetailsTemplate = false;
var roleDetailsTemplateP = false;
var roleDetailsTemplateC = false;
function roleObj(node) {
node = node && node.attr ? node.attr('role') : false;
return node ? JSON.parse(node) : false;
}
var treeSettings = {
data : {
type : 'json',
opts : { 'static' : [] }
},
ui : { theme_name : 'themeroller' },
rules : { multiple : false, valid_children: ['root'] },
types : {
root : { valid_children: ['t0', 't1', 't2'] },
t2 : { valid_children: ['t0', 't1', 't2'] },
t1 : { valid_children: 'none' },
t0 : { valid_children: 'none' }
},
callback : {
onselect : function(node) {
var _role = $(node).attr('role');
if (_role) {
var role = JSON.parse( _role );
onSelectNode(role.name);
$(node).children('a').addClass('ui-priority-primary');
} else {
roleDetailsHelp.removeClass('ui-helper-hidden');
roleDetailsTable.addClass('ui-helper-hidden');
}
},
onparse : function (s, t) {
return $(s)
.find('li[rel=t2] > a > ins').addClass('ui-icon ui-icon-contact').end()
.find('li[rel=t1] > a > ins').addClass('ui-icon ui-icon-person').end()
.find('li[rel=t0] > a > ins').addClass('ui-icon ui-icon-bullet').end();
},
ondeselect : function(node) { $(node).children('a').removeClass('ui-priority-primary') },
ondblclk : function(node, tree_obj) {
var n = $(node);
var pp = tree_obj.parent(node);
var r = roleObj(n);
var g = roleObj(pp);
console.log(r, g);
if (r && g) {
if( isInMemberArray(r, g.members, 1) ) {
$.post(pluginRoot, { action: 'removeMember', role: r.name, group: g.name });
$.post(pluginRoot, { action: 'addRequiredMember', role: r.name, group: g.name }, function(data) {
pp.attr('role', JSON.stringify(data));
}, 'json');
n.addClass('required');
} else if( isInMemberArray(r, g.rmembers, 1) ) {
$.post(pluginRoot, { action: 'removeMember', role: r.name, group: g.name });
$.post(pluginRoot, { action: 'addMember', role: r.name, group: g.name }, function(data) {
pp.attr('role', JSON.stringify(data));
}, 'json');
n.removeClass('required');
}
}
},
beforemove : function(node, ref_node, type, tree_obj, is_copy) {
var _ = dragObj(node, ref_node, type, tree_obj);
// --- check if the move is valid:
// don't move things around the same/root level
if (_.to == false && _.from == false) return false;
// no copy to the root folder
if (is_copy && _.to == false) return false;
// no rearrange withing the folder
if (_.to != false && _.from != false && _.to.name == _.from.name) return false;
// already contains such a member
if (_.to != false && isMember(_.node, _.to)) return false;
// do copy-move
// unassign from the old group, if it is move
if (!is_copy && _.from) $.post(pluginRoot, {'action': 'removeMember', 'role' : _.node.name, 'group' : _.from.name} , function(data) {}, 'json');
// assign to the new group
if (_.to) $.post(pluginRoot, {'action': 'addMember', 'role' : _.node.name, 'group' : _.to.name} , function(data) {}, 'json');
return true;
}
}
}
$(function() {
userTree = $('#userTree');
roleDetails = $('#roleDetails');
roleDetailsTable = roleDetails.find('table');
roleDetailsHelp = roleDetails.find('#roleDetailsHelp');
roleDetailsBody = roleDetailsTable.find('tbody');
roleDetailsTemplateP = roleDetailsBody.find('tr:eq(0)');
roleDetailsTemplateC = roleDetailsBody.find('tr:eq(1)');
roleDetailsTemplate = roleDetailsBody.find('tr:eq(2)').clone();
roleDetailsBody.find('tr').not('.header').remove();
// add new property/credential code
$('tr.header span.ui-icon-plus').click(function() {
$(this).parent().parent().parent().parent().after(newProp());
});
// new role dialog
var _buttons = {};
_buttons[i18n.close] = function() {
$(this).dialog('close');
}
_buttons[i18n.add] = function() {
var _ = newDialogRole;
var n = _.find('input');
if (!n.val()) {
n.addClass('ui-state-error');
return false;
} else n.removeClass('ui-state-error');
var t = _.find('select').val();
$.post(pluginRoot, {'action': 'set', 'data' : JSON.stringify({'name': n.val(), 'type': new Number(t)})} , function(data) {
_.dialog('close');
$('#reload').click();
}, 'json');
}
newDialogRole = $("#newDialogRole").dialog({
autoOpen : false,
modal : true,
open : function() { $(this).find('input').val('').removeClass('ui-state-error') },
closeText: i18n.abort,
buttons : _buttons
});
// role info buttons
$('#delRole').click( function() {
if (selectedRole) $.post(pluginRoot, {'action': 'del', 'role' : selectedRole}, function() {
$('#reload').click();
});
});
$('#savRole').click( doSaveRole );
// top-frame buttons
$('#newRole').click( function() {
newDialogRole.dialog('open');
return false;
});
$('#reload').click( function() {
$.post(pluginRoot, {'action': 'list'} , function(data) {
roleDetailsHelp.removeClass('ui-helper-hidden');
roleDetailsTable.addClass('ui-helper-hidden');
var sortedGroups = sortGroups(data);
var treeRoot = buildTree(sortedGroups);
treeSettings.data.opts['static'] = treeRoot;
userTree.empty().tree(treeSettings);
}, 'json');
return false;
}).click();
});
function newProp() {
var tr = roleDetailsTemplate.clone()
.find('li').click( function() {
tr.remove();
}).end()
.find('select').change( function(evt) {
tr.find('.v').replaceWith('<input class="v" '+ ($(this).val().indexOf('password') == 0 ? 'type="password"' : '') + '/>');
initStaticWidgets(tr);
}).end()
initStaticWidgets(tr);
return tr;
}
function hashToArray(s) {
var r = [];
while(s.length > 0) {
r.push(parseInt(s.substring(0, 2), 16));
s = s.substring(2);
}
return r;
}
function strToArray(s) {
var r = [];
var el = s.split(',');
for(var i=0;i<el.length;i++) r.push( parseInt(el[i], 10) );
return r;
}
function doSaveRole() {
if (!selectedRole) return;
var doProps = true;
var data = {
name : selectedRole,
properties : {},
credentials : {}
};
roleDetailsBody.find('tr').each( function() {
var _ = $(this);
if (_.hasClass('header-props')) doProps = true;
else if (_.hasClass('header-cred')) doProps = false;
else {
var k = _.find('.k').val();
var v = _.find('.v').val();
var t = _.find('select').val();
if (t.indexOf('password-') == 0) {
var hash = CryptoJS[t.substring(9)](v).toString(CryptoJS.enc.Hex);
v = hashToArray(hash);
} else if (t == 'byte[]') {
v = strToArray(v);
}
if (doProps) data.properties[k] = v;
else data.credentials[k] = v;
}
});
$.post(pluginRoot, {'action': 'set', 'data' : JSON.stringify(data)});
}
function isInMemberArray(role, g) {
if(g) for(var i in g) if (g[i].name == role.name) return true;
return false;
}
function isMember(role, group) {
if (!role) return false;
if (!group) return false;
if (isInMemberArray(role, group.members)) return true;
if (isInMemberArray(role, group.rmembers)) return true;
}
function buildTree(sortedGroups) {
var treeRoot = {
data : i18n.root,
state: 'open',
attributes : { 'rel' : 'root' },
children: []
};
var treeNode = function(name, role, parent, req) {
if (!role) return;
if (!parent) parent = treeRoot.children;
var node = {
data : role.name,
attributes : {
'rel' : 't' + role.type,
'role' : JSON.stringify(role)
}
}
if (req) node.attributes['class'] = 'required';
parent.push(node);
if (role.type == 2) {
node['children'] = [];
node = node['children'];
if (role.members) $.each(role.members, function(idx, role) {
treeNode(role.name, role, node, 0);
});
if (role.rmembers) $.each(role.rmembers, function(idx, role) {
treeNode(role.name, role, node, 1);
});
}
}
$.each(sortedGroups, treeNode);
return treeRoot;
}
function sortGroups(data) {
var rootGroups = {}; // only root groups - without parents
var unassigned = {}; // non-groups, not assigned to any group
var processed = {}; // all processed entries
var u = 0;
var g = 0;
var r = 0;
var _st = function(map, n, role) {
if (typeof map[n] == 'undefined') { // not added - add
map[n] = role;
} else if (map[n] != false) { // already added
map[n] = false; // mark for removal
}
}
var groupF = function(i1, role) {
var n = role.name;
var t = role.type;
if (t == 2) { // group
// don't process twice
if (processed[n]) {
rootGroups[n] = false;
return true;
}
processed[n]=role;
_st(rootGroups, n, role);
if (role.members) $.each(role.members, groupF);
if (role.rmembers) $.each(role.rmembers, groupF);
g++;
} else { // role or user
if (t == 1) u++; else r++;
_st(unassigned, n, role);
}
}
$.each(data, groupF);
$('.statline').text( i18n.status.msgFormat(g,u,r) );
return $.extend(rootGroups, unassigned);
}
function onSelectNode(role) {
$.post(pluginRoot, {'action': 'get', 'role' : role} , function(data) {
selectedRole = role;
roleDetailsHelp.addClass('ui-helper-hidden');
roleDetailsTable.removeClass('ui-helper-hidden');
roleDetailsBody.find('tr').not('.header').remove();
var target = false;
var _append = function(k,v) {
var t = $.isArray(v) ? 'byte[]' : 'string';
target.after(newProp()
.data('k', k)
.find('input.k').val(k).end()
.find('input.v').val(v).end()
.find('select').val(t).end()
);
}
var x = data.properties;
if (x) {
target = roleDetailsTemplateP;
$.each(x, _append);
}
x = data.credentials;
if (x) {
target = roleDetailsTemplateC;
$.each(x, _append);
}
// show/user credentials view if user/or not (respectively)
x = roleDetailsBody.find('.header-cred');
if (data.type != 1) x.addClass('ui-helper-hidden');
else x.removeClass('ui-helper-hidden');
}, 'json')
return false;
}
function dragObj(node, ref_node, type, tree_obj) {
// determine the destination folder
var _role = false;
if ('inside' == type) {
_role = $(ref_node).attr('role');
} else {
_role = tree_obj.parent(ref_node)
_role = _role.attr ? _role.attr('role') : false;
}
var to = _role ? JSON.parse(_role) : false;
// determine object to move
_role = $(node).attr('role');
var source = JSON.parse(_role);
// determine the previous location (in case it is move, not copy)
_role = tree_obj.parent(node);
var from = _role.attr && _role.attr('role') ? JSON.parse(_role.attr('role')) : false;
return {
'to' : to,
'from' : from,
'node' : source
}
}