includes/clientside/static/acl.js
changeset 735 f191cb6bd0ca
parent 730 b09cb1dab505
child 749 ea3045a3bcbd
equal deleted inserted replaced
734:904fbf10f112 735:f191cb6bd0ca
   163   editbtn_wrapper.style.fontSize = 'smaller';
   163   editbtn_wrapper.style.fontSize = 'smaller';
   164   var editbtn = document.createElement('a');
   164   var editbtn = document.createElement('a');
   165   editbtn.href = '#';
   165   editbtn.href = '#';
   166   editbtn.innerHTML = $lang.get('acl_btn_show_existing');
   166   editbtn.innerHTML = $lang.get('acl_btn_show_existing');
   167   editbtn_wrapper.appendChild(editbtn);
   167   editbtn_wrapper.appendChild(editbtn);
       
   168   
       
   169   // tracer button
       
   170   var tracebtn = document.createElement('a');
       
   171   tracebtn.href = '#';
       
   172   tracebtn.innerHTML = $lang.get('acl_btn_view_effective');
       
   173   editbtn_wrapper.appendChild(document.createElement('br'));
       
   174   editbtn_wrapper.appendChild(tracebtn);
       
   175   
   168   main.appendChild(editbtn_wrapper);
   176   main.appendChild(editbtn_wrapper);
   169   
   177   
   170   editbtn.onclick = function()
   178   editbtn.onclick = function()
   171   {
   179   {
   172     aclSetViewListExisting();
   180     aclSetViewListExisting();
       
   181     return false;
       
   182   }
       
   183   
       
   184   tracebtn.onclick = function()
       
   185   {
       
   186     aclSetViewDebugTools();
   173     return false;
   187     return false;
   174   }
   188   }
   175   
   189   
   176   selector = document.createElement('div');
   190   selector = document.createElement('div');
   177   
   191   
   523             aclDebug(data.text);
   537             aclDebug(data.text);
   524             break;
   538             break;
   525           case 'list_existing':
   539           case 'list_existing':
   526             aclSetViewListExistingRespond(data);
   540             aclSetViewListExistingRespond(data);
   527             break;
   541             break;
       
   542           case 'trace':
       
   543             aclDrawTraceWrapper(data);
       
   544             break;
   528           default:
   545           default:
   529             handle_invalid_json(ajax.responseText);
   546             handle_invalid_json(ajax.responseText);
   530             break;
   547             break;
   531         }
   548         }
   532       }
   549       }
   656   return select;
   673   return select;
   657 }
   674 }
   658 
   675 
   659 function __aclBuildWizardWindow()
   676 function __aclBuildWizardWindow()
   660 {
   677 {
   661   darken(aclDisableTransitionFX);
   678   darken(aclDisableTransitionFX, 70, 'acldarkener');
   662   box = document.createElement('div');
   679   box = document.createElement('div');
   663   box.style.width = '640px'
   680   box.style.width = '640px'
   664   box.style.height = '440px';
   681   box.style.height = '440px';
   665   box.style.position = 'fixed';
   682   box.style.position = 'fixed';
   666   width = getWidth();
   683   width = getWidth();
   779   el = document.getElementById(aclManagerID);
   796   el = document.getElementById(aclManagerID);
   780   if(el)
   797   if(el)
   781   {
   798   {
   782     if ( aclDisableTransitionFX )
   799     if ( aclDisableTransitionFX )
   783     {
   800     {
   784       enlighten(true);
   801       enlighten(true, 'acldarkener');
   785       el.parentNode.removeChild(el);
   802       el.parentNode.removeChild(el);
   786     }
   803     }
   787     else
   804     else
   788     {
   805     {
   789       opacity(aclManagerID, 100, 0, 500);
   806       opacity(aclManagerID, 100, 0, 500);
   790       setTimeout('var el = document.getElementById(aclManagerID); el.parentNode.removeChild(el); enlighten();', 750);
   807       setTimeout('var el = document.getElementById(aclManagerID); el.parentNode.removeChild(el); enlighten(false, "acldarkener");', 750);
   791     }
   808     }
   792   }
   809   }
   793 }
   810 }
   794 
   811 
   795 function __aclSubmitManager(form)
   812 function __aclSubmitManager(form)
   894       obj['target_name'] = aclDataCache.target_name;
   911       obj['target_name'] = aclDataCache.target_name;
   895       obj['page_id'] = aclDataCache.page_id;
   912       obj['page_id'] = aclDataCache.page_id;
   896       obj['namespace'] = aclDataCache.namespace;
   913       obj['namespace'] = aclDataCache.namespace;
   897       __aclJSONSubmitAjaxHandler(obj);
   914       __aclJSONSubmitAjaxHandler(obj);
   898       break;
   915       break;
       
   916     case 'trace':
       
   917       var params = {
       
   918         mode: 'trace',
       
   919         user: document.getElementById(aclManagerID + 'trace_user').value,
       
   920         page: document.getElementById(aclManagerID + 'trace_page').value
       
   921       };
       
   922       __aclJSONSubmitAjaxHandler(params);
       
   923       break;
   899     default:
   924     default:
   900       alert("JSON form submit: invalid mode string "+mode+", stopping execution");
   925       alert("JSON form submit: invalid mode string "+mode+", stopping execution");
   901       return false;
   926       return false;
   902       break;
   927       break;
   903   }
   928   }
  1071       ajaxOpenDirectACLRule(parseInt(this.rule_id));
  1096       ajaxOpenDirectACLRule(parseInt(this.rule_id));
  1072     }
  1097     }
  1073     div.innerHTML = rule.score_string;
  1098     div.innerHTML = rule.score_string;
  1074     main.appendChild(div);
  1099     main.appendChild(div);
  1075   }
  1100   }
       
  1101 }
       
  1102 
       
  1103 function aclSetViewDebugTools()
       
  1104 {
       
  1105   // selection window for viewing effective permissions
       
  1106   var main = document.getElementById(aclManagerID + '_main');
       
  1107   main.innerHTML = '';
       
  1108  
       
  1109   // set the submission handler to trace
       
  1110   var thefrm = document.forms[form.name];
       
  1111   var modeobj = form_fetch_field(thefrm, 'mode');
       
  1112   modeobj.value = 'trace';
       
  1113   
       
  1114   // show the back button
       
  1115   document.getElementById(aclManagerID + '_back').style.display = 'inline';
       
  1116   
       
  1117   //
       
  1118   // start building
       
  1119   //
       
  1120   
       
  1121   // selection interface
       
  1122   var selector = document.createElement('div');
       
  1123   
       
  1124     var table = document.createElement('table');
       
  1125     
       
  1126     // username
       
  1127     var tr_user = document.createElement('tr');
       
  1128     var td_user_l = document.createElement('td');
       
  1129     var lbl_user = document.createElement('label');
       
  1130     lbl_user.setAttribute('for', aclManagerID + 'trace_user');
       
  1131     lbl_user.appendChild(document.createTextNode($lang.get('acl_lbl_trace_user')));
       
  1132     td_user_l.appendChild(lbl_user);
       
  1133     tr_user.appendChild(td_user_l);
       
  1134     
       
  1135     var td_user_i = document.createElement('td');
       
  1136     var i_user = document.createElement('input');
       
  1137     i_user.type = 'text';
       
  1138     i_user.id = aclManagerID + 'trace_user';
       
  1139     i_user.onkeyup = function() { new AutofillUsername(this); };
       
  1140     i_user.size = '20';
       
  1141     td_user_i.appendChild(i_user);
       
  1142     tr_user.appendChild(td_user_i);
       
  1143     
       
  1144     table.appendChild(tr_user);
       
  1145     
       
  1146     // page
       
  1147     var tr_page = document.createElement('tr');
       
  1148     var td_page_l = document.createElement('td');
       
  1149     var lbl_page = document.createElement('label');
       
  1150     lbl_page.setAttribute('for', aclManagerID + 'trace_page');
       
  1151     lbl_page.appendChild(document.createTextNode($lang.get('acl_lbl_trace_page')));
       
  1152     td_page_l.appendChild(lbl_page);
       
  1153     tr_page.appendChild(td_page_l);
       
  1154     
       
  1155     var td_page_i = document.createElement('td');
       
  1156     var i_page = document.createElement('input');
       
  1157     i_page.type = 'text';
       
  1158     i_page.id = aclManagerID + 'trace_page';
       
  1159     i_page.onkeyup = function() { new AutofillPage(this); };
       
  1160     i_page.size = '20';
       
  1161     td_page_i.appendChild(i_page);
       
  1162     tr_page.appendChild(td_page_i);
       
  1163     
       
  1164     table.appendChild(tr_page);
       
  1165     
       
  1166     selector.appendChild(table);
       
  1167   
       
  1168   // wrapper
       
  1169   
       
  1170   var container = document.createElement('div');
       
  1171   
       
  1172     container.style.margin = 'auto';
       
  1173     container.style.width = '360px';
       
  1174     container.style.paddingTop = '90px';
       
  1175     
       
  1176     var head = document.createElement('h2');
       
  1177     head.appendChild(document.createTextNode($lang.get('acl_lbl_trace_title')));
       
  1178     
       
  1179     var desc = document.createElement('p');
       
  1180     desc.innerHTML = $lang.get('acl_lbl_trace_body');
       
  1181     
       
  1182     container.appendChild(head);
       
  1183     container.appendChild(desc);
       
  1184     container.appendChild(selector);
       
  1185   
       
  1186   main.appendChild(container);
       
  1187 }
       
  1188 
       
  1189 function aclTraceKey()
       
  1190 {
       
  1191   var div = document.createElement('div');
       
  1192   $(div).addClass('tblholder');
       
  1193   var table = document.createElement('table');
       
  1194   $(table).attr('cellspacing', '1').attr('cellpadding', '4');
       
  1195   
       
  1196   var inherit_list = ['enano_default', 'global_everyone', 'global_group', 'global_user', 'pg_everyone', 'pg_group', 'pg_user', 'local_everyone', 'local_group', 'local_user'];
       
  1197   for ( var i = 0; i < inherit_list.length; i++ )
       
  1198   {
       
  1199     var t = inherit_list[i];
       
  1200     var tr = document.createElement('tr');
       
  1201     var td_key = document.createElement('td');
       
  1202     $(td_key).addClass('acl_' + t).addClass('acl_inherit_key');
       
  1203     tr.appendChild(td_key);
       
  1204     var td_explain = document.createElement('td');
       
  1205     $(td_explain).addClass(i % 2 == 0 ? 'row1' : 'row2');
       
  1206     td_explain.appendChild(document.createTextNode($lang.get('acl_inherit_key_' + t)));
       
  1207     tr.appendChild(td_explain);
       
  1208     table.appendChild(tr);
       
  1209   }
       
  1210   div.appendChild(table);
       
  1211   return div;
       
  1212 }
       
  1213 
       
  1214 function aclTraceModalKey()
       
  1215 {
       
  1216   load_component('messagebox');
       
  1217   miniPrompt(function(parent)
       
  1218     {
       
  1219       // heading
       
  1220       var h3 = document.createElement('h3');
       
  1221       h3.appendChild(document.createTextNode($lang.get('acl_msg_trace_key')));
       
  1222       parent.appendChild(h3);
       
  1223       
       
  1224       var key = aclTraceKey();
       
  1225       parent.appendChild(key);
       
  1226       
       
  1227       var p = document.createElement('p');
       
  1228       $(p).css('text-align', 'center');
       
  1229       
       
  1230       var closer = document.createElement('a');
       
  1231       $(closer).addClass('abutton').addClass('abutton_red').css('font-weight', 'bold');
       
  1232       closer.appendChild(document.createTextNode($lang.get('etc_close')));
       
  1233       closer.href = '#';
       
  1234       $(closer).click(function(e)
       
  1235         {
       
  1236           miniPromptDestroy(this);
       
  1237           return false;
       
  1238         });
       
  1239       
       
  1240       p.appendChild(closer);
       
  1241       parent.appendChild(p);
       
  1242     });
       
  1243 }
       
  1244 
       
  1245 function aclDrawTraceWrapper(data)
       
  1246 {
       
  1247   // hide the next button
       
  1248   document.getElementById(aclManagerID + '_next').style.display = 'none';
       
  1249   
       
  1250   var trace_by_perm = aclDrawTraceByPerm(data);
       
  1251   var trace_by_rule = aclDrawTraceByRule(data);
       
  1252   
       
  1253   trace_by_perm.id = 'aclDebugTraceViewPerm';
       
  1254   trace_by_rule.id = 'aclDebugTraceViewRule';
       
  1255   
       
  1256   var start_with_rule = ( readCookie('acl_trace_view') == 'rule' );
       
  1257   
       
  1258   if ( start_with_rule )
       
  1259   {
       
  1260     trace_by_perm.style.display = 'none';
       
  1261   }
       
  1262   else
       
  1263   {
       
  1264     trace_by_rule.style.display = 'none';
       
  1265   }
       
  1266   
       
  1267   // selection window for viewing effective permissions
       
  1268   var main = document.getElementById(aclManagerID + '_main');
       
  1269   main.innerHTML = '';
       
  1270   
       
  1271   var wrapper = document.createElement('div');
       
  1272   $(wrapper).css('padding-bottom', '20px');
       
  1273   
       
  1274   var floatlink = document.createElement('div');
       
  1275   $(floatlink).css('float', 'right').css('margin-left', '20px').css('margin-bottom', '20px').css('text-align', 'right');
       
  1276   var a_toggle = document.createElement('a');
       
  1277   $(a_toggle).attr('id', 'aclDebugTraceViewToggle');
       
  1278   a_toggle.innerHTML = '&raquo; ';
       
  1279   a_toggle.innerHTML += start_with_rule ? $lang.get('acl_btn_sort_perm') : $lang.get('acl_btn_sort_rule');
       
  1280   a_toggle.href = '#';
       
  1281   floatlink.appendChild(a_toggle);
       
  1282   floatlink.appendChild(document.createElement('br'));
       
  1283   var a_key = document.createElement('a');
       
  1284   $(a_key).css('font-size', 'smaller');
       
  1285   a_key.innerHTML = '&raquo; ';
       
  1286   a_key.innerHTML += $lang.get('acl_btn_view_key');
       
  1287   a_key.href = '#';
       
  1288   floatlink.appendChild(a_key);
       
  1289   wrapper.appendChild(floatlink);
       
  1290   
       
  1291   var h3 = document.createElement('h3');
       
  1292   h3.appendChild(document.createTextNode($lang.get('acl_msg_debug_main_title')));
       
  1293   wrapper.appendChild(h3);
       
  1294   var p = document.createElement('p');
       
  1295   p.appendChild(document.createTextNode($lang.get('acl_msg_debug_main_body')));
       
  1296   wrapper.appendChild(p);
       
  1297   
       
  1298   wrapper.appendChild(trace_by_perm);
       
  1299   wrapper.appendChild(trace_by_rule);
       
  1300   
       
  1301   main.appendChild(wrapper);
       
  1302   
       
  1303   $(a_toggle).click(function(e)
       
  1304     {
       
  1305       aclTraceToggleViews();
       
  1306       return false;
       
  1307     });
       
  1308   
       
  1309   $(a_key).click(function(e)
       
  1310     {
       
  1311       aclTraceModalKey();
       
  1312       return false;
       
  1313     });
       
  1314 }
       
  1315 
       
  1316 function aclTraceToggleViews()
       
  1317 {
       
  1318   var trace_by_perm = document.getElementById('aclDebugTraceViewPerm');
       
  1319   var trace_by_rule = document.getElementById('aclDebugTraceViewRule');
       
  1320   
       
  1321   var toggler = document.getElementById('aclDebugTraceViewToggle');
       
  1322   var newtext;
       
  1323   
       
  1324   if ( trace_by_perm.style.display == 'none' )
       
  1325   {
       
  1326     newtext = $lang.get('acl_btn_sort_rule');
       
  1327     $(trace_by_rule).hide('blind', {}, 750, function()
       
  1328       {
       
  1329         $(trace_by_perm).show('blind', {}, 750);
       
  1330       });
       
  1331     createCookie('acl_trace_view', 'perm');
       
  1332   }
       
  1333   else
       
  1334   {
       
  1335     newtext = $lang.get('acl_btn_sort_perm');
       
  1336     $(trace_by_perm).hide('blind', {}, 750, function()
       
  1337       {
       
  1338         $(trace_by_rule).show('blind', {}, 750);
       
  1339       });
       
  1340     createCookie('acl_trace_view', 'rule');
       
  1341   }
       
  1342   $(toggler).fadeOut(500, function()
       
  1343     {
       
  1344       this.innerHTML = '&raquo; ' + newtext;
       
  1345       $(this).fadeIn(500);
       
  1346     });
       
  1347 }
       
  1348 
       
  1349 function aclDrawTraceByPerm(data)
       
  1350 {
       
  1351   var wrapper = document.createElement('div');
       
  1352   // wrapper.style.display = 'none';
       
  1353   
       
  1354   // temporarily append wrapper to body to allow onclick to work
       
  1355   // var body = document.getElementsByTagName('body')[0];
       
  1356   // body.appendChild(wrapper);  
       
  1357   
       
  1358   for ( var i in data.perms )
       
  1359   {
       
  1360     var perm = data.perms[i];
       
  1361     var item = document.createElement('div');
       
  1362     item.className = perm.divclass;
       
  1363     
       
  1364     // first row - permission name + current setting
       
  1365     // use innerHTML here to allow for HTML in localized permission types
       
  1366     item.innerHTML += '<b>' + perm.perm_name + ' - ' + perm.perm_value + '</b>';
       
  1367     item.appendChild(document.createElement('br'));
       
  1368     
       
  1369     // second row - permission localized name + rule ID
       
  1370     var sm = document.createElement('small');
       
  1371     sm.innerHTML = perm.perm_src;
       
  1372     
       
  1373     item.appendChild(sm);
       
  1374     
       
  1375     wrapper.appendChild(item);
       
  1376     
       
  1377     // whole row is now in the document
       
  1378     if ( perm.rule_id != -1 )
       
  1379     {
       
  1380       sm.innerHTML += ' [';
       
  1381       // rule is editable
       
  1382       var editlink = document.createElement('a');
       
  1383       editlink.href = 'javascript:ajaxOpenDirectACLRule(' + perm.rule_id + ');';
       
  1384       editlink.appendChild(document.createTextNode($lang.get('acl_btn_edit_rule')));
       
  1385       sm.appendChild(editlink);
       
  1386       sm.innerHTML += ']';
       
  1387     }
       
  1388   }
       
  1389   
       
  1390   // var ret = wrapper.cloneNode(true);
       
  1391   // body.removeChild(wrapper);
       
  1392   // wrapper = false;
       
  1393   // ret.style.display = 'block';
       
  1394   // console.debug(ret);
       
  1395   // return ret;
       
  1396   return wrapper;
       
  1397 }
       
  1398 
       
  1399 function aclDrawTraceByRule(data)
       
  1400 {
       
  1401   var wrapper = document.createElement('div');
       
  1402   var groupdata = {};
       
  1403   
       
  1404   for ( var i in data.perms )
       
  1405   {
       
  1406     var perm = data.perms[i];
       
  1407     if ( !groupdata[perm['rule_id']] )
       
  1408     {
       
  1409       groupdata[perm['rule_id']] = {
       
  1410         meta: {
       
  1411           divclass: perm.divclass,
       
  1412           perm_src: perm.perm_src,
       
  1413           rule_id: perm.rule_id
       
  1414         },
       
  1415         rules: {}
       
  1416       };
       
  1417     }
       
  1418     groupdata[perm['rule_id']]['rules'][i] = perm;
       
  1419   }
       
  1420   
       
  1421   console.debug('draw by rule - group data: ', groupdata);
       
  1422   
       
  1423   for ( var i in groupdata )
       
  1424   {
       
  1425     var group = groupdata[i];
       
  1426     var grp = document.createElement('div');
       
  1427     var head = document.createElement('div');
       
  1428     head.className = group.meta.divclass;
       
  1429     var span = document.createElement('span');
       
  1430     span.style.fontSize = 'larger';
       
  1431     span.appendChild(document.createTextNode(group.meta.perm_src));
       
  1432     head.appendChild(span);
       
  1433     if ( group.meta.rule_id != -1 )
       
  1434     {
       
  1435       head.innerHTML += ' [';
       
  1436       // rule is editable
       
  1437       var editlink = document.createElement('a');
       
  1438       editlink.href = 'javascript:ajaxOpenDirectACLRule(' + group.meta.rule_id + ');';
       
  1439       editlink.appendChild(document.createTextNode($lang.get('acl_btn_edit_rule')));
       
  1440       head.appendChild(editlink);
       
  1441       head.innerHTML += ']';
       
  1442     }
       
  1443     grp.appendChild(head);
       
  1444     for ( var i in group.rules )
       
  1445     {
       
  1446       var rule = group.rules[i];
       
  1447       var rulediv = document.createElement('div');
       
  1448       rulediv.style.padding = '3px 12px';
       
  1449       rulediv.innerHTML += rule.perm_name + ': ';
       
  1450       var b = document.createElement('strong');
       
  1451       b.appendChild(document.createTextNode(rule.perm_value));
       
  1452       rulediv.appendChild(b);
       
  1453       grp.appendChild(rulediv);
       
  1454     }
       
  1455     wrapper.appendChild(grp);
       
  1456   }
       
  1457   
       
  1458   return wrapper;
  1076 }
  1459 }
  1077 
  1460 
  1078 function aclShowPresetLoader()
  1461 function aclShowPresetLoader()
  1079 {
  1462 {
  1080   var prompt = miniPrompt(function(parent)
  1463   var prompt = miniPrompt(function(parent)