+ if ($.isArray(scope))
+ {
+ for (var i = 0; i < scope.length; i++)
+ acl_scope[scope[i]] = true;
+ }
+ else if ($.isPlainObject(scope))
+ {
+ for (var object_name in scope)
+ {
+ if (!$.isArray(scope[object_name]))
+ continue;
+
+ var acl_object = acl_scope[object_name] || (acl_scope[object_name] = { });
+
+ for (var i = 0; i < scope[object_name].length; i++)
+ acl_object[scope[object_name][i]] = true;
+ }
+ }
+ },
+
+ _acl_merge_permission: function(acl_perm, perm)
+ {
+ if ($.isPlainObject(perm))
+ {
+ for (var scope_name in perm)
+ {
+ var acl_scope = acl_perm[scope_name] || (acl_perm[scope_name] = { });
+ this._acl_merge_scope(acl_scope, perm[scope_name]);
+ }
+ }
+ },
+
+ _acl_merge_group: function(acl_group, group)
+ {
+ if ($.isPlainObject(group))
+ {
+ if (!acl_group.description)
+ acl_group.description = group.description;
+
+ if (group.read)
+ {
+ var acl_perm = acl_group.read || (acl_group.read = { });
+ this._acl_merge_permission(acl_perm, group.read);
+ }
+
+ if (group.write)
+ {
+ var acl_perm = acl_group.write || (acl_group.write = { });
+ this._acl_merge_permission(acl_perm, group.write);
+ }
+ }
+ },
+
+ _acl_merge_tree: function(acl_tree, tree)
+ {
+ if ($.isPlainObject(tree))
+ {
+ for (var group_name in tree)
+ {
+ var acl_group = acl_tree[group_name] || (acl_tree[group_name] = { });
+ this._acl_merge_group(acl_group, tree[group_name]);
+ }
+ }
+ },
+
+ listAvailableACLs: _luci2.rpc.declare({
+ object: 'luci2.ui',
+ method: 'acls',
+ expect: { acls: [ ] },
+ filter: function(trees) {
+ var acl_tree = { };
+ for (var i = 0; i < trees.length; i++)
+ _luci2.ui._acl_merge_tree(acl_tree, trees[i]);
+ return acl_tree;
+ }
+ }),
+
+ renderMainMenu: _luci2.rpc.declare({
+ object: 'luci2.ui',
+ method: 'menu',
+ expect: { menu: { } },
+ filter: function(entries) {