KAC done; ACID done

master
Dmitry Isaenko 2019-09-22 19:55:08 +03:00
parent 1bf89a2358
commit e50281ca1f
6 changed files with 528 additions and 63 deletions

View File

@ -0,0 +1,175 @@
package konogonka.Controllers.NPDM;
import javafx.fxml.FXML;
import javafx.geometry.Insets;
import javafx.scene.control.Label;
import javafx.scene.control.Separator;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import konogonka.Tools.NPDM.ACID.KernelAccessControlProvider;
import java.util.Map;
public class KernelAccessControlController {
@FXML
private VBox KACRawPane;
@FXML Label kFlagsAval,
hiAllCpuId,
loAllCpuId,
hiAllThreadPrio,
loAllThreadPrio;
@FXML
private VBox syscallMaskPane;
@FXML
private VBox mapIoPane;
@FXML
private Label mapNormalPageRwLbl;
@FXML
private Label interruptPairAvalLbl,
irq0Lbl,
irq1Lbl;
@FXML
private Label appTypeLbl,
kerRelVerLbl,
handleTableSizeLbl;
@FXML
private Label dbgAvalLbl,
canBeDbgLbl,
canDbgLbl;
public void resetTab(){
KACRawPane.getChildren().clear();
kFlagsAval.setText("?");
hiAllCpuId.setText("-");
loAllCpuId.setText("-");
hiAllThreadPrio.setText("-");
loAllThreadPrio.setText("-");
syscallMaskPane.getChildren().clear();
mapIoPane.getChildren().clear();
mapIoPane.getChildren().add(new Separator());
mapNormalPageRwLbl.setText("-");
interruptPairAvalLbl.setText("?");
irq0Lbl.setText("-");
irq1Lbl.setText("-");
appTypeLbl.setText("-");
kerRelVerLbl.setText("-");
handleTableSizeLbl.setText("-");
dbgAvalLbl.setText("?");
canBeDbgLbl.setText("-");
canDbgLbl.setText("-");
}
public void populateFields(KernelAccessControlProvider kacProvider){
resetTab();
StringBuilder stringBuilder;
for (Integer i: kacProvider.getRawData()){
Label entry = new Label(String.format("%32s", Integer.toBinaryString(i)).replace(' ', '0'));
entry.setPadding(new Insets(5.0, 5.0, 5.0, 5.0));
KACRawPane.getChildren().add(entry);
}
if (kacProvider.isKernelFlagsAvailable()){
kFlagsAval.setText("(available)");
hiAllCpuId.setText(Integer.toString(kacProvider.getKernelFlagCpuIdHi()));
loAllCpuId.setText(Integer.toString(kacProvider.getKernelFlagCpuIdLo()));
hiAllThreadPrio.setText(Integer.toString(kacProvider.getKernelFlagThreadPrioHi()));
loAllThreadPrio.setText(Integer.toString(kacProvider.getKernelFlagThreadPrioLo()));
}
else
kFlagsAval.setText("(not available)");
for (Map.Entry entry : kacProvider.getSyscallMasks().entrySet()) {
byte[] maskBarr = (byte[]) entry.getValue();
stringBuilder = new StringBuilder();
for (byte b: maskBarr)
stringBuilder.append(b);
stringBuilder.reverse(); // Flip to show as is
Label mask = new Label(stringBuilder.toString());
Label maskTableIndex = new Label(((Byte) entry.getKey()).toString());
mask.setPadding(new Insets(5.0, 5.0, 5.0, 5.0));
maskTableIndex.setPadding(new Insets(5.0, 15.0, 5.0, 5.0));
syscallMaskPane.getChildren().add(new HBox(maskTableIndex, mask));
}
for (Map.Entry entry : kacProvider.getMapIoOrNormalRange().entrySet()){
byte[] altStPgNnumOfPg = (byte[]) entry.getKey();
stringBuilder = new StringBuilder();
for (byte b : altStPgNnumOfPg)
stringBuilder.append(b);
stringBuilder.reverse();
Label altStPgNnumOfPgLbl = new Label("Alternating start page and number of pages:");
Label altStPgNnumOfPgVal = new Label(stringBuilder.toString());
Label roFlagLbl = new Label("Alternating read-only flag:");
Label roFlagVal = new Label(((Boolean) entry.getValue()).toString());
altStPgNnumOfPgLbl.setPadding(new Insets(5.0, 5.0, 5.0, 5.0));
altStPgNnumOfPgVal.setPadding(new Insets(5.0, 5.0, 5.0, 5.0));
roFlagLbl.setPadding(new Insets(5.0, 5.0, 5.0, 5.0));
roFlagVal.setPadding(new Insets(5.0, 5.0, 5.0, 5.0));
mapIoPane.getChildren().add(new HBox(altStPgNnumOfPgLbl, altStPgNnumOfPgVal));
mapIoPane.getChildren().add(new HBox(roFlagLbl, roFlagVal));
mapIoPane.getChildren().add(new Separator());
}
byte[] mapNormalPageRwBarr = kacProvider.getMapNormalPage();
if (mapNormalPageRwBarr != null){
stringBuilder = new StringBuilder();
for (byte b : mapNormalPageRwBarr)
stringBuilder.append(b);
stringBuilder.reverse();
mapNormalPageRwLbl.setText(stringBuilder.toString());
}
if (kacProvider.isInterruptPairAvailable()){
interruptPairAvalLbl.setText("(available)");
stringBuilder = new StringBuilder();
for (byte b : kacProvider.getIrq0())
stringBuilder.append(b);
stringBuilder.reverse();
irq0Lbl.setText(stringBuilder.toString());
stringBuilder = new StringBuilder();
for (byte b : kacProvider.getIrq1())
stringBuilder.append(b);
stringBuilder.reverse();
irq1Lbl.setText(stringBuilder.toString());
}
else {
interruptPairAvalLbl.setText("(not available)");
}
switch (kacProvider.getApplicationType()){
case 0:
appTypeLbl.setText(kacProvider.getApplicationType()+" (sysmodule)");
break;
case 1:
appTypeLbl.setText(kacProvider.getApplicationType()+" (application)");
break;
case 2:
appTypeLbl.setText(kacProvider.getApplicationType()+" (applet)");
break;
default:
appTypeLbl.setText(kacProvider.getApplicationType()+" (???)");
}
if (kacProvider.isKernelRelVersionAvailable())
kerRelVerLbl.setText(kacProvider.getKernelRelVersionMajor()+"."+kacProvider.getKernelRelVersionMinor()+".0");
handleTableSizeLbl.setText(Integer.toString(kacProvider.getHandleTableSize())); // todo: validate if not null
if (kacProvider.isDebugFlagsAvailable()){
dbgAvalLbl.setText("(available)");
canBeDbgLbl.setText(Boolean.toString(kacProvider.isCanBeDebugged()));
canDbgLbl.setText(Boolean.toString(kacProvider.isCanDebugOthers()));
}
else
dbgAvalLbl.setText("(not available)");
}
}

View File

@ -81,6 +81,9 @@ public class NPDMController implements ITabController {
@FXML
private ServiceAccessControlController ServiceAccessControlTableController;
@FXML
private KernelAccessControlController KernelAccessControlTableController;
@Override
public void initialize(URL url, ResourceBundle resourceBundle) { }
@ -168,6 +171,8 @@ public class NPDMController implements ITabController {
FSAccessControlTableController.resetTab();
ServiceAccessControlTableController.resetTab();
KernelAccessControlTableController.resetTab();
}
private void setData(NPDMProvider npdmProvider, File file) {
if (npdmProvider == null)
@ -230,6 +235,6 @@ public class NPDMController implements ITabController {
FSAccessControlTableController.populateFields(acid.getFsAccessControlProvider());
ServiceAccessControlTableController.populateFields(acid.getServiceAccessControlProvider().getCollection());
KernelAccessControlTableController.populateFields(acid.getKernelAccessControlProvider());
}
}

View File

@ -1,26 +1,19 @@
package konogonka.Controllers.NPDM;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.geometry.Insets;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import java.net.URL;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.ResourceBundle;
public class ServiceAccessControlController implements Initializable {
public class ServiceAccessControlController {
@FXML
private VBox SACPane;
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
}
public void resetTab(){
SACPane.getChildren().clear();
}

View File

@ -1,14 +1,13 @@
package konogonka.Tools.NPDM.ACID;
import konogonka.LoperConverter;
import konogonka.RainbowHexDump;
import java.lang.reflect.Array;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.LinkedList;
/*
NOTE: This implementation is extremely bad for using application as library. Use raw for own purposes.
NOTE:
KAC is set of 4-byes blocks
Consider them as uInt32 (Read as Little endian)
@ -57,45 +56,66 @@ for (byte i = 0; i < 16; i++){
public class KernelAccessControlProvider {
private static final int KERNELFLAGS = 3;
private static final int SYSCALLMASK = 4;
private static final int MAPIOORNORMALRANGE = 6;
private static final int MAPNORMALPAGE_RW = 7;
private static final int INTERRUPTPAIR = 11;
private static final int APPLICATIONTYPE = 13;
private static final int KERNELRELEASEVERSION = 14;
private static final int HANDLETABLESIZE = 15;
private static final int DEBUGFLAGS = 16;
private static final int KERNELFLAGS = 3,
SYSCALLMASK = 4,
MAPIOORNORMALRANGE = 6,
MAPNORMALPAGE_RW = 7,
INTERRUPTPAIR = 11,
APPLICATIONTYPE = 13,
KERNELRELEASEVERSION = 14,
HANDLETABLESIZE = 15,
DEBUGFLAGS = 16;
// RAW data
private LinkedList<Integer> rawData;
// Kernel flags
private boolean kernelFlagsAvailable;
private int kernelFlagCpuIdHi;
private int kernelFlagCpuIdLo;
private int kernelFlagThreadPrioHi;
private int kernelFlagThreadPrioLo;
// System Call Mask
private int maskTableIndex;
private int mask;
// Handle Table Size
private int handleTableSize;
private int kernelFlagCpuIdHi,
kernelFlagCpuIdLo,
kernelFlagThreadPrioHi,
kernelFlagThreadPrioLo;
// Syscall Masks as index | mask - order AS IS. [0] = bit5; [1] = bit6
private LinkedHashMap<Byte, byte[]> syscallMasks; // Index, Mask
// MapIoOrNormalRange
private LinkedHashMap<byte[], Boolean> mapIoOrNormalRange; // alt page+num, RO flag
// MapNormalPage (RW)
private byte[] mapNormalPage; // TODO: clarify is possible to have multiple
// InterruptPair
private boolean interruptPairAvailable;
private byte[] irq0,
irq1;
// Application type
private int applicationType;
// KernelReleaseVersion
private boolean isKernelRelVersionAvailable;
private int kernelRelVersionMajor,
kernelRelVersionMinor;
// Handle Table Size
private int handleTableSize;
// Debug flags
private boolean debugFlagsAvailable;
private byte canBeDebugged;
private byte canDebugOthers;
private boolean debugFlagsAvailable,
canBeDebugged,
canDebugOthers;
KernelAccessControlProvider(byte[] bytes) throws Exception{
if (bytes.length < 4)
throw new Exception("ACID-> KernelAccessControlProvider: too small size of the Kernel Access Control");
rawData = new LinkedList<Integer>();
syscallMasks = new LinkedHashMap<Byte, byte[]>();
mapIoOrNormalRange = new LinkedHashMap<byte[], Boolean>();
int position = 0;
// Collect all blocks
for (int i = 0; i < bytes.length / 4; i++) {
int block = LoperConverter.getLEint(bytes, position);
byte[] blockBytes = Arrays.copyOfRange(bytes, position, position+4);
position += 4;
rawData.add(block);
//RainbowHexDump.octDumpInt(block);
int type = getMinBitCnt(block);
switch (type){
@ -105,56 +125,75 @@ public class KernelAccessControlProvider {
kernelFlagCpuIdLo = block >> 16 & 0b11111111;
kernelFlagThreadPrioHi = block >> 10 & 0b111111;
kernelFlagThreadPrioLo = block >> 4 & 0b111111;
System.out.println("KERNELFLAGS "+
kernelFlagCpuIdHi+" "+
kernelFlagCpuIdLo+" "+
kernelFlagThreadPrioHi+" "+
kernelFlagThreadPrioLo+"\n"
);
//System.out.println("KERNELFLAGS "+kernelFlagCpuIdHi+" "+kernelFlagCpuIdLo+" "+kernelFlagThreadPrioHi+" "+kernelFlagThreadPrioLo);
break;
case SYSCALLMASK:
/*
System.out.println("SYSCALLMASK\t\t"+block+" "+type);
maskTableIndex = block >> 29;
mask = block >> 5 & 0b11111111111111111111111;
*/
byte maskTableIndex = (byte) (block >> 29 & 0b111); // declared as byte; max value could be 7; min - 0;
byte[] mask = new byte[24]; // Consider as bit.
//System.out.println("SYSCALLMASK ind: "+maskTableIndex);
for (int k = 28; k >= 5; k--) {
mask[k-5] = (byte) (block >> k & 1); // Only 1 or 0 possible
//System.out.print(mask[k-5]);
}
//System.out.println();
syscallMasks.put(maskTableIndex, mask);
break;
case MAPIOORNORMALRANGE:
//System.out.println("MAPIOORNORMALRANGE\t\t"+block+" "+type);
byte[] altStPgNPgNum = new byte[24];
//System.out.println("MAPIOORNORMALRANGE Flag: "+((block >> 31 & 1) != 0));
for (int k = 30; k >= 7; k--){
altStPgNPgNum[k-7] = (byte) (block >> k & 1); // Only 1 or 0 possible
//System.out.print(altStPgNPgNum[k-7]);
}
mapIoOrNormalRange.put(altStPgNPgNum, (block >> 31 & 1) != 0);
//System.out.println();
break;
case MAPNORMALPAGE_RW:
//System.out.println("MAPNORMALPAGE_RW\t\t"+block+" "+type);
//System.out.println("MAPNORMALPAGE_RW\t");
mapNormalPage = new byte[24];
for (int k = 31; k >= 8; k--){
mapNormalPage[k-8] = (byte) (block >> k & 1);
//System.out.print(mapNormalPage[k-8]);
}
//System.out.println();
break;
case INTERRUPTPAIR:
//System.out.println("INTERRUPTPAIR\t\t"+block+" "+type);
System.out.println("INTERRUPTPAIR found (must (?) appear once, please report if it's not)");
interruptPairAvailable = true;
irq0 = new byte[10];
irq1 = new byte[10];
for (int k = 21; k >= 12; k--)
irq0[k-12] = (byte) (block >> k & 1);
for (int k = 31; k >= 22; k--)
irq1[k-22] = (byte) (block >> k & 1);
break;
case APPLICATIONTYPE:
applicationType = block >> 14 & 0b111;
System.out.println("APPLICATIONTYPE "+applicationType);
//System.out.println("APPLICATIONTYPE "+applicationType);
break;
case KERNELRELEASEVERSION:
//System.out.println("KERNELRELEASEVERSION\t"+block+" "+type);
//System.out.println("KERNELRELEASEVERSION\t"+(block >> 19 & 0b111111111111)+"."+(block >> 15 & 0b1111)+".X");
isKernelRelVersionAvailable = true;
kernelRelVersionMajor = (block >> 19 & 0b111111111111);
kernelRelVersionMinor = (block >> 15 & 0b1111);
break;
case HANDLETABLESIZE:
handleTableSize = block >> 16 & 0b1111111111;
System.out.println("HANDLETABLESIZE "+handleTableSize);
//System.out.println("HANDLETABLESIZE "+handleTableSize);
break;
case DEBUGFLAGS:
debugFlagsAvailable = true;
canBeDebugged = blockBytes[17];
canDebugOthers = blockBytes[18];
System.out.println("DEBUGFLAGS "+canBeDebugged+" "+canDebugOthers);
canBeDebugged = (block >> 17 & 1) != 0;
canDebugOthers = (block >> 18 & 1) != 0;
//System.out.println("DEBUGFLAGS "+canBeDebugged+" "+canDebugOthers);
break;
default:
//System.out.println("UNKNOWN\t\t"+block+" "+type);
System.out.println("UNKNOWN\t\t"+block+" "+type);
}
}
System.out.println();
//System.out.println();
}
private int getMinBitCnt(int value){
@ -165,4 +204,24 @@ public class KernelAccessControlProvider {
}
return minBitCnt;
}
public LinkedList<Integer> getRawData() { return rawData; }
public boolean isKernelFlagsAvailable() { return kernelFlagsAvailable; }
public int getKernelFlagCpuIdHi() { return kernelFlagCpuIdHi; }
public int getKernelFlagCpuIdLo() { return kernelFlagCpuIdLo; }
public int getKernelFlagThreadPrioHi() { return kernelFlagThreadPrioHi; }
public int getKernelFlagThreadPrioLo() { return kernelFlagThreadPrioLo; }
public LinkedHashMap<byte[], Boolean> getMapIoOrNormalRange() { return mapIoOrNormalRange; }
public byte[] getMapNormalPage() { return mapNormalPage; }
public boolean isInterruptPairAvailable() { return interruptPairAvailable; }
public byte[] getIrq0() { return irq0; }
public byte[] getIrq1() { return irq1; }
public int getApplicationType() { return applicationType; }
public boolean isKernelRelVersionAvailable() { return isKernelRelVersionAvailable; }
public int getKernelRelVersionMajor() { return kernelRelVersionMajor; }
public int getKernelRelVersionMinor() { return kernelRelVersionMinor;}
public int getHandleTableSize() { return handleTableSize; }
public boolean isDebugFlagsAvailable() { return debugFlagsAvailable; }
public boolean isCanBeDebugged() { return canBeDebugged; }
public boolean isCanDebugOthers() { return canDebugOthers; }
public LinkedHashMap<Byte, byte[]> getSyscallMasks() { return syscallMasks; }
}

View File

@ -0,0 +1,232 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Separator?>
<?import javafx.scene.control.TitledPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<VBox xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="konogonka.Controllers.NPDM.KernelAccessControlController">
<TitledPane text="Kernel Access Control">
<VBox.margin>
<Insets bottom="5.0" />
</VBox.margin>
<content>
<VBox spacing="5.0">
<children>
<TitledPane animated="false" expanded="false" text="Kernel Access Control (RAW)">
<content>
<VBox fx:id="KACRawPane" />
</content>
</TitledPane>
<HBox spacing="5.0">
<children>
<Label text="Kernel flags">
<font>
<Font name="System Bold" size="13.0" />
</font>
</Label>
<Label fx:id="kFlagsAval" text="?" />
</children>
</HBox>
<GridPane gridLinesVisible="true">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" maxWidth="200.0" minWidth="200.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="50.0" minWidth="50.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<Label text="Highest allowed cpu id">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</Label>
<Label text="Lowest allowed cpu id" GridPane.rowIndex="1">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</Label>
<Label text="Highest allowed thread prio" GridPane.rowIndex="2">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</Label>
<Label text="Lowest allowed thread prio" GridPane.rowIndex="3">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</Label>
<Label fx:id="hiAllCpuId" text="-" GridPane.columnIndex="1">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</Label>
<Label fx:id="loAllCpuId" text="-" GridPane.columnIndex="1" GridPane.rowIndex="1">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</Label>
<Label fx:id="hiAllThreadPrio" text="-" GridPane.columnIndex="1" GridPane.rowIndex="2">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</Label>
<Label fx:id="loAllThreadPrio" text="-" GridPane.columnIndex="1" GridPane.rowIndex="3">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</Label>
</children>
</GridPane>
<Separator prefWidth="200.0" />
<Label text=" Syscall Mask">
<font>
<Font name="System Bold" size="13.0" />
</font>
</Label>
<HBox spacing="5.0">
<children>
<Label text="Indx" />
<Label text="Mask" />
</children>
</HBox>
<VBox fx:id="syscallMaskPane" />
<Separator prefWidth="200.0" />
<Label text="Map IO or normal range">
<font>
<Font name="System Bold" size="13.0" />
</font>
</Label>
<VBox fx:id="mapIoPane">
<children>
<Separator prefWidth="200.0" />
</children></VBox>
<Label text="Map normal page (RW)">
<font>
<Font name="System Bold" size="13.0" />
</font></Label>
<Label fx:id="mapNormalPageRwLbl" text="-" />
<Separator prefWidth="200.0" />
<HBox spacing="5.0">
<children>
<Label text="Interrupt pair">
<font>
<Font name="System Bold" size="13.0" />
</font>
</Label>
<Label fx:id="interruptPairAvalLbl" text="?" />
</children>
</HBox>
<GridPane gridLinesVisible="true">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" maxWidth="50.0" minWidth="40.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="400.0" minWidth="300.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<Label text="Irq0">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</Label>
<Label text="Irq1" GridPane.rowIndex="1">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</Label>
<Label fx:id="irq0Lbl" text="-" GridPane.columnIndex="1">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</Label>
<Label fx:id="irq1Lbl" text="-" GridPane.columnIndex="1" GridPane.rowIndex="1">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</Label>
</children>
</GridPane>
<Separator prefWidth="200.0" />
<HBox spacing="5.0">
<children>
<Label text="Application Type:">
<font>
<Font name="System Bold" size="13.0" />
</font></Label>
<Label fx:id="appTypeLbl" text="-" />
</children>
</HBox>
<Separator prefWidth="200.0" />
<Label text="Kernel release version">
<font>
<Font name="System Bold" size="13.0" />
</font></Label>
<Label fx:id="kerRelVerLbl" text="-" />
<Separator prefWidth="200.0" />
<Label text="Handle table size ">
<font>
<Font name="System Bold" size="13.0" />
</font></Label>
<Label fx:id="handleTableSizeLbl" text="-" />
<Separator prefWidth="200.0" />
<HBox spacing="5.0">
<children>
<Label text="Debug flags">
<font>
<Font name="System Bold" size="13.0" />
</font>
</Label>
<Label fx:id="dbgAvalLbl" text="?" />
</children>
</HBox>
<GridPane gridLinesVisible="true">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" maxWidth="150.0" minWidth="120.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="50.0" minWidth="50.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<Label text="Can be debugged">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</Label>
<Label text="Can debug others" GridPane.rowIndex="1">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</Label>
<Label fx:id="canBeDbgLbl" text="-" GridPane.columnIndex="1">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</Label>
<Label fx:id="canDbgLbl" text="-" GridPane.columnIndex="1" GridPane.rowIndex="1">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</Label>
</children>
</GridPane>
<Separator prefWidth="200.0" />
</children>
</VBox>
</content>
</TitledPane>
</VBox>

View File

@ -1175,6 +1175,7 @@
<Label text="*** Inside of ACID block" />
<fx:include fx:id="FSAccessControlTable" source="FSAccessControlTable.fxml" />
<fx:include fx:id="ServiceAccessControlTable" source="ServiceAccessControlTable.fxml" />
<fx:include fx:id="KernelAccessControlTable" source="KernelAccessControlTable.fxml" />
</children>
</VBox>
</content>