Simba/Extensions/security.sex

1460 lines
41 KiB
Plaintext

program SecurityExtension;
type
TNamedArray = record
a: TStringArray;
name: String;
end;
{ var SecurityEnabled: Boolean;
Global variable which decides whether or not to pass through any security
measures. It is toggled by the Menu Item (Tools -> Security -> Enabled). }
var
SecurityEnabled: Boolean;
Settings_FIRE_WALL_ENABLED, Settings_FILE_WALL_ENABLED: Boolean;
{ var Menu*: TMenuItem;
Different variables for the different parts of the Menu added to Simba's
TMainMenu. }
{$IFDEF EXTENSION}
var
MenuHead, MenuCheck, MenuEdit: TMenuItem;
{$ENDIF}
{ var Icon_Lock: TMufasaBitmap;
Holds the lock image so that it is not reloaded each and every time. The
license for this icon can be found here:
[url]http://www.iconarchive.com/icons/aha-soft/security/license.txt[/url]
And the image can be found here:
[url]http://icons2.iconarchive.com/icons/aha-soft/security/48/lock-icon.png[/url] }
var
Icon_Lock: TMufasaBitmap;
{ var PathArr: array of TNamedArray;
Array which stores the different lists of URLs and Files/Directories. Each one
is accessed through the consants listed later which are prefixed with `P_'. }
var
PathArr: array [0..1] of array of TNamedArray;
{ const P_?_*: Integer;
Each constant is associated with a Path. W/B/L depicts whether is a White,
Black, or Local list respectively. These constants are in reference to indexes
in the `PathArr' variable. }
const
WALL_FIRE = 0;
WALL_FILE = 1;
ALLOW_ONCE = -2;
DENY_ONCE = -1;
ALLOW_LOCAL = 0;
DENY_LOCAL = 1;
ALLOW_ALWAYS = 2;
DENY_ALWAYS = 3;
ALLOW_ALWAYS_DIR = 4;
DENY_ALWAYS_DIR = 5;
{$IFDEF WINDOWS}
DirectorySeparator = '\';
{$ELSE}
DirectorySeparator = '/';
{$ENDIF}
LIST_SEPARATOR = ';;';
{ var Settings_DEFAULT_(URL|FILE): Integer;
Depict the default option for when the Option dialog times out. These values
must be part of the constants. *MAY CRASH SIMBA IF NOT ONE OF THE CONSTANTS* }
var
Settings_DEFAULT_URL, Settings_DEFAULT_FILE: Integer;
{ var Settings_DEFAULT_TIMEOUT: Integer;
Time to wait in seconds before timing out the Option Dialog. This allows
scripts to progress without needing User Interaction and will choose the
Settings_DEFAULT_(URL|FILE) respectively. }
var
Settings_DEFAULT_TIMEOUT: Integer;
{
Checks if `s' occurs in TStringArray `a'.
}
function InStrArray(s: String; a: TStringArray): Boolean;
var
i, h: Integer;
begin
Result := True;
h := High(a);
for i := 0 to h do
begin
if (s = a[i]) then
Exit;
end;
Result := False;
end;
{
Like `pos(substr, s)' but searches from the end of a string backwards.
}
function LastPos(SubStr, Str: string): integer;
var
i, p: integer;
s, ss: string;
begin
for i := Length(str) downto 1 do
S := S + Str[i];
for i := Length(substr) downto 1 do
ss := ss + substr[i];
p := Pos(ss, S);
if P > 0 then
Result := Length(Str) - p
end;
{
Remove the PHP params being passed around.
}
function trimPHPParams(url: String): String;
var
qPos: Integer;
begin
qPos := pos('?', url);
if (qPos > 0) then
Result := Copy(url, 1, qPos-1)
else
Result := url;
end;
{
Replaces the paths found with an easier to read name. Will remove all the
specified constants from within Simba.
}
function substitutePaths(path: String): String;
var
paths, names: TStringArray;
i, p: Integer;
begin
paths := [ScriptPath, IncludePath, PluginPath, FontPath, AppPath];
names := ['SCRIPTPATH', 'INCLUDEPATH', 'PLUGINPATH', 'FONTPATH', 'SIMBAPATH'];
for i := 0 to 4 do
begin
p := pos(paths[i], path);
if (p > 0) then
begin
Result := format(
'%%%s%%%s%s',
[names[i], DirectorySeparator, copy(path,p+length(paths[i]),Length(path))]
);
//writeln(Result);
Exit;
end;
p := 0;
end;
{ Otherwhise, return normal path }
Result := path;
end;
{
Private method for adding to the global arrays.
}
procedure _AddStr(s: String; uf, p: Integer);
var
l: Integer;
{$IFDEF EXTENSION}tmp: String;{$ENDIF}
begin
if (p < 0) then Exit;
{ Increase the size of the array, adding the new value }
l := Length(PathArr[uf][p].a);
SetLength(PathArr[uf][p].a, l + 1);
PathArr[uf][p].a[l] := s;
{$IFDEF EXTENSION}
{ Write to the Settings.xml }
tmp := Settings.getKeyValueDef(PathArr[uf][p].name, '');
Settings.setKeyValue(PathArr[uf][p].name, tmp + LIST_SEPARATOR + s);
{$ENDIF}
end;
{
Changes MS into a format of: HH:MM:SS.
Taken from SRL4/core/Timing.scar
}
function MsToTime(MS: Integer): string;
var
STA: TVariantArray;
Time: array [0..2] of Integer;
i: Integer;
begin
STA := [':', ':', '', True, 2];
ConvertTime(MS, Time[0], Time[1], Time[2]);
for i := 0 to 2 do
if (Time[i] > 0) or (STA[3]) or (i = 2) then
Result := Result + PadZ(IntToStr(Time[i]), STA[4]) + STA[i];
end;
{
Prints a warning message whenever something attempts to break security
measures.
}
procedure SecurityWarn(msg: String);
begin
Writeln(
Format('[%s] :: SECURITY WARNING :: %s', [MSToTime(GetSystemTime), msg])
);
end;
{ var Option*: FormComponents
Various Form components associated with the User Input Dialog. }
var
OptionForm: TForm;
Option_Label_Path, Option_Label_Default, Option_Label_Title: TLabel;
Option_Button_Okay: TButton;
Option_Timer, Option_Timer_Label: TTimer;
Option_ComboBox: TComboBox;
Option_Default_Time: Integer;
Option_Lock_Image: TImage;
{ var Option_*_Options: TStringArray;
The different options for the option dialog. Consts are associated with these
arrays. }
var
Option_URL_Options, Option_File_Options: TStringArray;
{
Method to close the form, disables `Option_Timer' as well.
}
procedure OptionCloseForm(Sender: TObject);
begin
OptionForm.MODALRESULT := mrOk;
Option_Timer.ENABLED := False;
end;
{
Method which will reset the `Option_Timer' when User Input is detected. It is
currently called when the User Click on a radio button of `Option_RadGrp'.
}
procedure OptionResetTimer(Sender: TObject);
begin
Option_Timer.ENABLED := False;
Option_Timer_Label.ENABLED := False;
Option_Timer.ENABLED := True;
Option_Timer_Label.ENABLED := True;
Option_Default_Time := GetSystemTime;
Option_Timer_Label.ONTIMER(Option_Timer_Label);
end;
{
Modifies a label based on a timer to show how many seconds left until the form
auto-picks the option listed.
}
procedure DefaultLabel(Sender: TObject);
var
t: Integer;
begin
t := Settings_DEFAULT_TIMEOUT-((GetSystemTime-Option_Default_Time) div 1000);
Option_Label_Default.CAPTION := format('Selecting in %ds', [t]);
if (t < 6) then
Option_Label_Default.FONT.Style := [fsBold]
else
Option_Label_Default.FONT.Style := [];
end;
{
Loads and Shows the form. `isURL' depicts whether or not its a file path vs. a
URL. `path' is the actual path which is displayed on the form.
This method needs to be called in a SafeThread when testing. This is covered
later on using the `TESTING' define.
}
procedure LoadOptionDialog(const isURL: Boolean; const path: String);
var
i, w, h: Integer;
begin
{
Load the form.
}
OptionForm := TForm.Create(nil);
OptionForm.BringToFront;
OptionForm.Visible := False;
OptionForm.BORDERSTYLE := bsSingle;
OptionForm.BORDERICONS := [biSystemMenu];
OptionForm.SetBounds({L} 100, {T} 100, {W} 200, {H} 150);
OptionForm.POSITION := poDesktopCenter;
Option_Lock_Image := TImage.Create(OptionForm);
Option_Lock_Image.Parent := OptionForm;
w := Icon_Lock.Width;
h := Icon_Lock.Height;
Icon_Lock.DrawToCanvas(0, 0, Option_Lock_Image.Canvas);
Option_Lock_Image.SetBounds({L} 140, {T} 10, w, h);
Option_Lock_Image.Visible:= True;
Option_Label_Title := TLabel.Create(OptionForm);
Option_Label_Title.Parent := OptionForm;
Option_Label_Title.setBounds({L} 10, {T} 20, {W} 130, {H} 50);
Option_Label_Title.FONT.Size := 20;
Option_Label_Title.Visible := True;
Option_Label_Title.WORDWRAP := True;
Option_Label_Path := TLabel.Create(OptionForm);
Option_Label_Path.Parent := OptionForm;
Option_Label_Path.Left := 10;
Option_Label_Path.Top := 65;
Option_Label_Path.Visible := True;
Option_Label_Path.FONT.Style := [fsBold];
Option_Label_Path.WORDWRAP := True;
Option_Label_Path.ShowHint := True;
Option_Button_Okay := TButton.Create(OptionForm);
Option_Button_Okay.Parent := OptionForm;
Option_Button_Okay.CAPTION := 'Okay';
Option_Button_Okay.Left := 115;
Option_Button_Okay.Top := 120;
Option_Button_Okay.Visible := True;
Option_Button_Okay.ONCLICK := @OptionCloseForm;
Option_Label_Default := TLabel.Create(OptionForm);
Option_Label_Default.Parent := OptionForm;
Option_Label_Default.Left := 10;
Option_Label_Default.Top := 125;
Option_Label_Default.Visible := True;
Option_Timer := TTimer.Create(OptionForm);
Option_Timer.INTERVAL := Settings_DEFAULT_TIMEOUT * 1000;
Option_Timer.ONTIMER := @OptionCloseForm;
Option_Timer.ENABLED := True;
Option_Timer_Label := TTimer.Create(OptionForm);
Option_Timer_Label.INTERVAL := 1000;
Option_Timer_Label.ONTIMER := @DefaultLabel;
Option_Timer_Label.ENABLED := True;
Option_Default_Time := GetSystemTime;
Option_Timer_Label.ONTIMER(Option_Timer_Label);
Option_ComboBox := TComboBox.Create(OptionForm);
Option_ComboBox.Parent := OptionForm;
Option_ComboBox.SetBounds({L} 10, {T} 90, {W} 180, {H} 30);
Option_ComboBox.ONCHANGE := @OptionResetTimer;
Option_ComboBox.CLEAR;
{
Use the passed parameters to change how the form looks depending on whether
its a URL or a File path.
}
if (isURL) then
begin
{ Form Caption }
OptionForm.CAPTION := 'Security - Fire Wall';
Option_Label_Title.CAPTION := 'Fire Wall';
{ Fill the combo box with options. }
for i := 0 to high(Option_URL_Options) do
Option_ComboBox.ITEMS.Add(Option_URL_Options[i]);
{ Default Option: }
Option_ComboBox.ITEMINDEX := Settings_DEFAULT_URL;
{ Show the path in question. }
Option_Label_Path.CAPTION := Path;
end else
begin
{ Form Captions. }
OptionForm.CAPTION := 'Security - File Wall';
Option_Label_Title.CAPTION := 'File Wall';
{ Fill the combo box with options. }
for i := 0 to high(Option_File_Options) do
Option_ComboBox.ITEMS.Add(Option_File_Options[i]);
{ Default Option: }
Option_ComboBox.ITEMINDEX := Settings_DEFAULT_FILE;
{ Show the path in question. }
Option_Label_Path.CAPTION := substitutePaths(Path);
end;
{ Display the full path as a hint. }
Option_Label_Path.Hint := Path;
OptionForm.ShowModal;
end;
function ShowOptionDialog(const isURL: Boolean; const path: String): Integer;
{$IFNDEF EXTENSION}
var
V: TVariantArray;
{$ENDIF}
begin
{$IFNDEF EXTENSION}
V := [isURL, path];
ThreadSafeCall('LoadOptionDialog', V);
{$ELSE}
LoadOptionDialog(isURL, path);
{$ENDIF}
Result := Option_ComboBox.ITEMINDEX - 2;
OptionForm.Free;
end;
function _checkPath(p: String; w: Integer; var cont: Boolean): Boolean;
var
i, h: Integer;
begin
Result := False;
h := High(pathArr[w]);
for i := 0 to h do
begin
if InStrArray(p, pathArr[w][i].a) then
begin
Result := True;
cont := (i mod 2) = 0;
Exit;
end;
end;
end;
procedure onOpenConnection(var url: string; var Cont: boolean);
var
tmp_url: String;
begin
if (not (SecurityEnabled and Settings_FIRE_WALL_ENABLED)) then
Exit;
tmp_url := trimPHPParams(lowercase(url));
{ Check the Loaded URLs }
if _checkPath(tmp_url, WALL_FIRE, cont) then
begin
if (not cont) then
SecurityWarn(
Format('Blocked URL ''%s'' was attempted to be accessed.', [tmp_url])
);
Exit;
end;
{
Ask what to do with URL using the Dialog.
}
case ShowOptionDialog(True, tmp_url) of
ALLOW_ONCE:
Cont := True;
DENY_ONCE:
Cont := False;
ALLOW_LOCAL:
begin
_AddStr(tmp_url, WALL_FIRE, ALLOW_LOCAL);
Cont := True;
end;
DENY_LOCAL:
begin
_AddStr(tmp_url, WALL_FIRE, DENY_LOCAL);
Cont := False;
end;
ALLOW_ALWAYS:
begin
_AddStr(tmp_url, WALL_FIRE, ALLOW_ALWAYS);
Cont := True;
end;
DENY_ALWAYS:
begin
_AddStr(tmp_url, WALL_FIRE, DENY_ALWAYS);
Cont := False;
end;
end;
Writeln(Format('Cont [%s] URL [%s]', [BoolToStr(Cont), tmp_url]));
end;
procedure onOpenFile(var FileName : string; var Cont : boolean);
var
dir: String;
begin
if (not (SecurityEnabled and Settings_FILE_WALL_ENABLED)) then
Exit;
{
check if in either Allowed_URLs, or Local_Allowed_URL
}
dir := Copy(FileName, 1, LastPos(DirectorySeparator, FileName));
//Writeln(Format('Dir [%s] File [%s]', [dir, FileName]));
{ Check the Loaded URLs }
if InStrArray(dir, PathArr[WALL_FILE][ALLOW_ALWAYS_DIR].a) then
begin
Cont := True;
Exit;
end;
if InStrArray(dir, PathArr[WALL_FILE][DENY_ALWAYS_DIR].a) then
begin
SecurityWarn(Format('File in dir: %s was attempted to be used.', [dir]));
Cont := False;
Exit;
end;
if InStrArray(FileName, PathArr[WALL_FILE][ALLOW_LOCAL].a) then
begin
Cont := True;
Exit;
end;
if InStrArray(FileName, PathArr[WALL_FILE][DENY_LOCAL].a) then
begin
SecurityWarn(Format('File: %s was attempted to be used.', [FileName]));
Cont := False;
Exit;
end;
if InStrArray(FileName, PathArr[WALL_FILE][ALLOW_ALWAYS].a) then
begin
Cont := True;
Exit;
end;
if InStrArray(FileName, PathArr[WALL_FILE][DENY_ALWAYS].a) then
begin
SecurityWarn(Format('File: %s was attempted to be used.', [FileName]));
Cont := False;
Exit;
end;
{
Ask what to do with File Path using the Dialog.
}
case ShowOptionDialog(False, FileName) of
ALLOW_ONCE:
Cont := True;
DENY_ONCE:
Cont := False;
ALLOW_LOCAL:
begin
_AddStr(FileName, WALL_FILE, ALLOW_LOCAL);
Cont := True;
end;
DENY_LOCAL:
begin
_AddStr(FileName, WALL_FILE, DENY_LOCAL);
Cont := False;
end;
ALLOW_ALWAYS:
begin
_AddStr(FileName, WALL_FILE, ALLOW_ALWAYS);
Cont := True;
end;
DENY_ALWAYS:
begin
_AddStr(FileName, WALL_FILE, DENY_ALWAYS);
Cont := False;
end;
ALLOW_ALWAYS_DIR:
begin
_AddStr(dir, WALL_FILE, ALLOW_ALWAYS_DIR);
Cont := True;
end;
DENY_ALWAYS_DIR:
begin
_AddStr(dir, WALL_FILE, DENY_ALWAYS_DIR);
Cont := False;
end;
end;
Writeln(Format('Cont [%s] File [%s]', [BoolToStr(Cont), FileName]));
end;
procedure onWriteFile(var FileName : string; var Cont : boolean);
begin
onOpenFile(FileName, Cont);
end;
{
Shows a dialog to make sure one wants to quit.
}
{$IFDEF EXTENSION}
procedure OnMenuCheckClick(Sender: TObject);
begin
if (MenuCheck.checked) then
begin
case MessageDlg(
'Security',
'Are you sure you want to disable Security?',
mtConfirmation,
[mbNo,mbYes],
0
) of
mrNo : Exit;
else
Writeln('Security Disabled.');
end;
end else
Writeln('Security Enabled.');
MenuCheck.checked := not MenuCheck.checked;
Settings.setKeyValue('SecurityEnabled', toStr(MenuCheck.checked));
SecurityEnabled := MenuCheck.CHECKED;
end;
{$ENDIF}
{
Consts for array parts in the different components of the settings form.
}
const
TAB_MAIN = 0;
TAB_FIRE = 1;
TAB_FILE = 2;
LIST_BLACK = 0;
LIST_WHITE = 1;
LIST_FILE = 0;
LIST_DIR = 1;
BUTTON_ADD = 0;
BUTTON_DELETE = 1;
DEFAULT_FIRE_OPT = 0;
DEFAULT_FILE_OPT = 1;
{
var SForm_*;
Variables for the different components of the settings form.
}
var
SettingsForm: TForm;
SForm_PageControl: TPageControl;
SForm_Tabs: array [0..2] of TTabSheet;
SForm_File_ListBoxs: array [0..1] of array [0..1] of TListBox;
SForm_File_Radios: array [0..1] of TRadioButton;
SForm_Fire_ListBoxs: array [0..1] of TListBox;
SForm_ListLabels: array [1..2] of array [0..1] of TLabel;
SForm_ManiButtons: array [1..2] of array [0..1] of TButton;
SForm_ChkBox_Enabled: array [1..2] of TCheckBox;
SForm_DefOpts_Labels: array [0..3] of TLabel;
SForm_DefOpts_Combobox: array [0..1] of TComboBox;
SForm_DefOpts_SpinEdit: TEdit; //SpinEdit;
SForm_Title: TLabel;
SForm_QuitButton: TButton;
SForm_Icon: TImage;
{
Change between working with directories or with Files.
}
procedure SForm_ChangeFileDir(Sender: TObject);
var
b: Boolean;
i: Integer;
begin
b := (Sender = SForm_File_Radios[LIST_FILE]);
for i := 0 to 1 do
begin
SForm_File_ListBoxs[List_FILE][i].Visible := b;
SForm_File_ListBoxs[List_FILE][i].Enabled := b;
SForm_File_ListBoxs[List_DIR][i].Visible := not b;
SForm_File_ListBoxs[List_DIR][i].Enabled := not b;
end;
end;
var
__SForm_ListBox_DragPoint: TPoint;
__SForm_ListBox: TListBox;
{
Load a point, then store where it started from.
}
procedure SForm_List_MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (Button <> mbMiddle) then
begin
__SForm_ListBox_DragPoint := Point(x, y);
__SForm_ListBox := TListBox(Sender);
end;
end;
{
Check if the sender is not the same as the source, thus allowable to be
dragged.
}
procedure SForm_List_DragOver(
Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean
);
begin
Accept := Sender <> Source;
end;
{
Moves item from Source to Sender.
}
procedure SForm_List_DragDrop(Sender, Source: TObject; X, Y: Integer);
var
src, snd: TListBox;
srcPos: Integer;
begin
if (Sender = Source) then Exit;
src := TListBox(Source);
snd := TListBox(Sender);
{ Get the items at the source position. }
srcPos := src.ITEMATPOS(__SForm_ListBox_DragPoint, True);
__SForm_ListBox_DragPoint := Point(-1,-1);
{ If the source position doesn't exist, we can't move anything, eh. }
if (srcPos < 0) then
Exit;
{ Move the items around. }
snd.ITEMS.Add(src.ITEMS.Strings[srcPos]);
src.ITEMS.Delete(srcPos);
end;
{
Adds and removes items based on which items are clicked.
}
procedure SForm_ManiItems(Sender: TObject);
var
addString: String;
delInd: Integer;
begin
if (__SForm_ListBox = nil) then
Exit;
case Sender of
SForm_ManiButtons[TAB_FIRE][BUTTON_ADD],
SForm_ManiButtons[TAB_FILE][BUTTON_ADD]:
begin
//writeln('pushed button_add');
if (not InputQuery(
'Add Item:',
'Please input your new item.',
addString)
) then
Exit;
__SForm_ListBox.ITEMS.Add(addString);
end;
SForm_ManiButtons[TAB_FIRE][BUTTON_DELETE],
SForm_ManiButtons[TAB_FILE][BUTTON_DELETE]:
begin
delInd := __SForm_ListBox.ITEMATPOS(__SForm_ListBox_DragPoint, True);
__SForm_ListBox.ITEMS.Delete(delInd);
end;
end;
__SForm_ListBox := nil;
__SForm_ListBox_DragPoint := Point(-1, -1);
end;
{
Small Hack to remove the need to disable all the different items each time.
}
procedure SForm_PC_Change(Sender: TObject);
begin
__SForm_ListBox := nil;
__SForm_ListBox_DragPoint := Point(-1, -1);
end;
{
Handles when the enabling check boxs are clicked. It will disable the
necessary components.
}
procedure SForm_ChkBox_Click(Sender: TObject);
var
i, j: Integer;
b, bb: Boolean;
begin
b := TCheckBox(Sender).Checked;
case Sender of
SForm_ChkBox_Enabled[Tab_FIRE]:
begin
for i := 0 to 1 do
begin
SForm_Fire_ListBoxs[i].Enabled := b;
SForm_ManiButtons[Tab_FIRE][i].Enabled := b;
end;
end;
SForm_ChkBox_Enabled[Tab_FILE]:
begin
bb := SForm_File_Radios[0].Checked;
for i := 0 to 1 do
begin
for j := 0 to 1 do
SForm_File_ListBoxs[i][j].Enabled := b;
SForm_ManiButtons[Tab_FILE][i].Enabled := b;
SForm_File_Radios[i].Enabled := b;
if (b) then
begin
if (i = 1) then bb := not bb;
SForm_File_ListBoxs[i][0].Enabled := bb;
SForm_File_ListBoxs[i][1].Enabled := bb;
end;
end;
end;
end;
end;
{
Loads the settings from the XML document to the forms components.
}
procedure LoadSettingsXML;
var
i,j,k,h: Integer;
begin
{$IFDEF EXTENSION}
Settings_DEFAULT_URL := 2 + StrToInt(
Settings.getKeyValueDef('Default_URL', toStr(ALLOW_ONCE))
);
Settings_DEFAULT_FILE := 2 + StrToInt(
Settings.getKeyValueDef('Default_File', toStr(ALLOW_ONCE))
);
Settings_DEFAULT_TIMEOUT := StrToInt(
Settings.getKeyValueDef('Settings_TimeOut', '60')
);
Settings_FILE_WALL_ENABLED := StrToBool(
Settings.getKeyValueDef('Settings_FileWallOn', 'True')
);
Settings_FIRE_WALL_ENABLED := StrToBool(
Settings.getKeyValueDef('Settings_FireWallOn', 'True')
);
{$ENDIF}
SForm_ChkBox_Enabled[Tab_FIRE].CHECKED := Settings_FIRE_WALL_ENABLED;
SForm_ChkBox_Enabled[Tab_FILE].CHECKED := Settings_FILE_WALL_ENABLED;
SForm_DefOpts_Combobox[0].ITEMINDEX := Settings_DEFAULT_URL;
SForm_DefOpts_ComboBox[1].ITEMINDEX := Settings_DEFAULT_FILE;
SForm_DefOpts_SpinEdit.TEXT := toStr(Settings_DEFAULT_TIMEOUT);
if (not SForm_ChkBox_Enabled[Tab_FIRE].checked) then
for i := 0 to 1 do
begin
SForm_Fire_ListBoxs[i].Enabled := False;
SForm_ManiButtons[Tab_FIRE][i].Enabled := False;
end;
if (not SForm_ChkBox_Enabled[Tab_FILE].checked) then
for i := 0 to 1 do
begin
for j := 0 to 1 do
SForm_File_ListBoxs[i][j].Enabled := False;
SForm_ManiButtons[Tab_FILE][i].Enabled := False;
SForm_File_Radios[i].Enabled := False;
SForm_File_ListBoxs[i][0].Enabled := False;
SForm_File_ListBoxs[i][1].Enabled := False;
end;
for i := LIST_BLACK to LIST_WHITE do
begin
{ Depending on which list, you know which list to use. }
if (i = LIST_BLACK) then
h := DENY_ALWAYS
else
h := ALLOW_ALWAYS;
for j := 0 to High(PathArr[WALL_FIRE][h].a) do
SForm_Fire_ListBoxs[i].ITEMS.Add(
PathArr[WALL_FIRE][h].a[j]
);
end;
for i := 0 to 1 do
for j := LIST_BLACK to LIST_WHITE do
begin
{ Depending on which list, you know which list to use. }
if (j = LIST_BLACK) then
h := DENY_ALWAYS
else
h := ALLOW_ALWAYS;
for k := 0 to High(PathArr[WALL_FILE][h].a) do
SForm_File_ListBoxs[i][j].ITEMS.Add(
PathArr[WALL_FILE][h].a[k]
);
end;
end;
{
Private method for imploding the TListBox strings into a single String object.
}
function __implodeListBox(obj: TListBox): String;
var
i, h: Integer;
t: String;
begin
h := obj.ITEMS.Count - 1;
Result := '';
t := LIST_SEPARATOR;
for i := 0 to h do
if (Length(obj.ITEMS.Strings[i]) > 1) then
Result := Result + obj.ITEMS.Strings[i] + t;
Delete(Result, Length(Result)-Length(t), Length(Result));
end;
{
Private method for converting from TStrings to TStringArray.
}
function __TStringsToStrArr(obj: TStrings): TStringArray;
var
i, j, h: Integer;
begin
SetLength(Result, obj.Count);
h := obj.count - 1;
j := 0;
for i := 0 to h do
if (length(obj.Strings[i]) > 1) then
begin
Result[j] := obj.Strings[i];
Inc(j);
end;
SetLength(Result, j);
end;
{
Method to save the various settings from the various form components.
}
procedure SaveSettingsXML;
begin
{$IFDEF EXTENSION}
Settings.setKeyValue('Default_URL', toStr(SForm_DefOpts_ComboBox[0].ITEMINDEX-2));
Settings.setKeyValue('Default_File', toStr(SForm_DefOpts_ComboBox[1].ITEMINDEX-2));
Settings.setKeyValue('Settings_TimeOut', SForm_DefOpts_SpinEdit.TEXT);
Settings.setKeyValue(
'Settings_FireWallOn',
toStr(SForm_ChkBox_Enabled[Tab_FIRE].CHECKED)
);
Settings.setKeyValue(
'Settings_FileWallOn',
toStr(SForm_ChkBox_Enabled[Tab_FILE].CHECKED)
);
{ Save the lists. }
Settings.setKeyValue(
PathArr[WALL_FIRE][ALLOW_ALWAYS].name,
__implodeListBox(SForm_Fire_ListBoxs[LIST_WHITE])
);
Settings.setKeyValue(
PathArr[WALL_FIRE][DENY_ALWAYS].name,
__implodeListBox(SForm_Fire_ListBoxs[LIST_BLACK])
);
Settings.setKeyValue(
PathArr[WALL_FILE][ALLOW_ALWAYS].name,
__implodeListBox(SForm_File_ListBoxs[LIST_FILE][LIST_WHITE])
);
Settings.setKeyValue(
PathArr[WALL_FILE][DENY_ALWAYS].name,
__implodeListBox(SForm_File_ListBoxs[LIST_FILE][LIST_BLACK])
);
Settings.setKeyValue(
PathArr[WALL_FILE][ALLOW_ALWAYS_DIR].name,
__implodeListBox(SForm_File_ListBoxs[LIST_DIR][LIST_WHITE])
);
Settings.setKeyValue(
PathArr[WALL_FILE][DENY_ALWAYS_DIR].name,
__implodeListBox(SForm_File_ListBoxs[LIST_DIR][LIST_BLACK])
);
{$ENDIF}
PathArr[WALL_FIRE][ALLOW_ALWAYS].a := __TStringsToStrArr(
SForm_Fire_ListBoxs[LIST_WHITE].ITEMS
);
PathArr[WALL_FIRE][DENY_ALWAYS].a := __TStringsToStrArr(
SForm_Fire_ListBoxs[LIST_BLACK].ITEMS
);
PathArr[WALL_FILE][ALLOW_ALWAYS].a := __TStringsToStrArr(
SForm_File_ListBoxs[LIST_FILE][LIST_WHITE].ITEMS
);
PathArr[WALL_FILE][DENY_ALWAYS].a := __TStringsToStrArr(
SForm_File_ListBoxs[LIST_FILE][LIST_BLACK].ITEMS
);
PathArr[WALL_FILE][ALLOW_ALWAYS_DIR].a := __TStringsToStrArr(
SForm_File_ListBoxs[LIST_DIR][LIST_WHITE].ITEMS
);
PathArr[WALL_FILE][DENY_ALWAYS_DIR].a := __TStringsToStrArr(
SForm_File_ListBoxs[LIST_DIR][LIST_BLACK].ITEMS
);
end;
procedure SForm_OnQuit(Sender: TObject);
begin
SaveSettingsXML;
SettingsForm.MODALRESULT := mrOK;
end;
procedure LoadSettingsForm;
var
i, j, w, h: Integer;
tmpStrings: TStringArray;
begin
{ MainForm: }
SettingsForm := TForm.Create(nil);
SettingsForm.SetBounds({L} 200, {T} 100, {L} 400, {H} 290);
SettingsForm.BringToFront;
SettingsForm.Visible := False;
SettingsForm.BORDERSTYLE := bsSingle;
SettingsForm.BORDERICONS := [biSystemMenu];
SettingsForm.CAPTION := 'Security Settings';
SettingsForm.POSITION := poDesktopCenter;
SForm_PageControl := TPageControl.Create(SettingsForm);
SForm_PageControl.Parent := SettingsForm;
SForm_PageControl.SetBounds({L} 0, {T} 0, {W} 400, {H} 230);
{ Tab Setups: }
{ Load all the tabs }
tmpStrings := ['Main', 'Fire Wall', 'File Wall'];
for i := 0 to 2 do
begin
SForm_Tabs[i] := TTabSheet.Create(SettingsForm);
SForm_Tabs[i].Parent := SettingsForm;
SForm_Tabs[i].PageControl := SForm_PageControl;
SForm_Tabs[i].CAPTION := tmpStrings[i];
SForm_Tabs[i].ONSHOW := @SForm_PC_Change;
end;
tmpStrings := [
'Default Option Timeout:', 'Default Fire Wall:', 'Default File Wall:'
];
for i := 0 to 2 do
begin
SForm_DefOpts_Labels[i] := TLabel.Create(SForm_Tabs[0]);
SForm_DefOpts_Labels[i].Parent := SForm_Tabs[0];
SForm_DefOpts_Labels[i].CAPTION := tmpStrings[i];
SForm_DefOpts_Labels[i].SetBounds({L} 255,{T} 20+50*i,{W} 100,{H} 20);
end;
SForm_DefOpts_SpinEdit := TEdit.Create(SForm_Tabs[0]);
SForm_DefOpts_SpinEdit.Parent := SForm_Tabs[0];
SForm_DefOpts_SpinEdit.SetBounds(250, 40, 125, 20);
for i := 0 to 1 do
begin
SForm_DefOpts_Combobox[i] := TComboBox.Create(SForm_Tabs[0]);
SForm_DefOpts_Combobox[i].Parent := SForm_Tabs[0];
SForm_DefOpts_Combobox[i].SetBounds({L} 250, {T} 90+50*i,{W} 125,{H} 20);
if (i=0) then
tmpStrings := Option_URL_Options
else
tmpStrings := Option_File_Options;
h := High(tmpStrings);
for j := 0 to h do
SForm_DefOpts_Combobox[i].ITEMS.Add(tmpStrings[j]);
end;
tmpStrings := ['Always Allow:', 'Always Deny:', 'Fire', 'File'];
for i := Tab_FIRE to Tab_FILE do
begin
{ Load list labels. }
for j := LIST_BLACK to LIST_WHITE do
begin
SForm_ListLabels[i][j] := TLabel.Create(SForm_Tabs[i]);
SForm_ListLabels[i][j].Parent := SForm_Tabs[i];
SForm_ListLabels[i][j].CAPTION := tmpStrings[j];
SForm_ListLabels[i][j].SetBounds(5 + 250*j, 30, 150, 150);
end;
{ Load Enabling CheckBoxs: }
SForm_ChkBox_Enabled[i] := TCheckBox.Create(SForm_Tabs[i]);
SForm_ChkBox_Enabled[i].Parent := SForm_Tabs[i];
SForm_ChkBox_Enabled[i].SetBounds({L} 5, {T} 8, {W} 150, {H} 100);
SForm_ChkBox_Enabled[i].CAPTION := 'Enable ' + tmpStrings[1+i] + ' Wall';
SForm_ChkBox_Enabled[i].ONCLICK := @SForm_ChkBox_Click;
end;
{ Fire Wall Tab: }
for i := LIST_BLACK to LIST_WHITE do
begin
SForm_Fire_ListBoxs[i] := TListBox.Create(SForm_Tabs[TAB_FIRE]);
SForm_Fire_ListBoxs[i].Parent := SForm_Tabs[TAB_FIRE];
SForm_Fire_ListBoxs[i].SetBounds({L} 250*i, {T} 50, {W} 150, {H} 150);
SForm_Fire_ListBoxs[i].DRAGMODE := dmAutomatic;
SForm_Fire_ListBoxs[i].ENABLED := True;
SForm_Fire_ListBoxs[i].ONDRAGDROP := @SForm_List_DragDrop;
SForm_Fire_ListBoxs[i].ONMOUSEDOWN := @SForm_List_MouseDown;
SForm_Fire_ListBoxs[i].ONDRAGOVER := @SForm_List_DragOver;
end;
{
File Wall:
}
tmpStrings := ['Files', 'Directories'];
for i := 0 to 1 do
begin
SForm_File_Radios[i] := TRadioButton.Create(SForm_Tabs[Tab_FILE]);
SForm_File_Radios[i].Parent := SForm_Tabs[Tab_FILE];
SForm_File_Radios[i].SetBounds({L}200 + 90*i, {T}10, {W}150, 10);
SForm_File_Radios[i].CHECKED := (i = 0);
SForm_File_Radios[i].CAPTION := tmpStrings[i];
SForm_File_Radios[i].ONCLICK := @SForm_ChangeFileDir;
end;
{ Create lists. }
for i := 0 to 1 do
for j := LIST_BLACK to LIST_WHITE do
begin
SForm_File_ListBoxs[i][j] := TListBox.Create(SForm_Tabs[TAB_FILE]);
SForm_File_ListBoxs[i][j].Parent := SForm_Tabs[TAB_FILE];
SForm_File_ListBoxs[i][j].SetBounds({L} 250*j, {T} 50, {W} 150, {H} 150);
SForm_File_ListBoxs[i][j].DRAGMODE := dmAutomatic;
SForm_File_ListBoxs[i][j].Visible := (i = 0);
SForm_File_ListBoxs[i][j].ENABLED := (i = 0);
SForm_File_ListBoxs[i][j].ONDRAGDROP := @SForm_List_DragDrop;
SForm_File_ListBoxs[i][j].ONMOUSEDOWN := @SForm_List_MouseDown;
SForm_File_ListBoxs[i][j].ONDRAGOVER := @SForm_List_DragOver;
end;
// Manipulation Buttons
tmpStrings := ['Add', 'Delete'];
for i := 1 to 2 do
for j := BUTTON_ADD to BUTTON_DELETE do
begin
SForm_ManiButtons[i][j] := TButton.Create(SForm_Tabs[i]);
SForm_ManiButtons[i][j].Parent := SForm_Tabs[i];
SForm_ManiButtons[i][j].setBounds({L} 175, {T} 100 + 30*j, {W} 50, {H} 20);
SForm_ManiButtons[i][j].Caption := tmpStrings[j];
SForm_ManiButtons[i][j].ONCLICK := @SForm_ManiItems;
end;
SForm_Icon := TImage.Create(SettingsForm);
SForm_Icon.Parent := SettingsForm;
w := Icon_Lock.Width;
h := Icon_Lock.Height;
Icon_Lock.DrawToCanvas(0, 0, SForm_Icon.Canvas);
SForm_Icon.SetBounds({L} 10, {T} 235, w, h);
SForm_Icon.Visible:= True;
SForm_QuitButton := TButton.Create(SettingsForm);
SForm_QuitButton.Parent := SettingsForm;
SForm_QuitButton.SetBounds({L}300, {T}250, {W}80, {H}20);
SForm_QuitButton.CAPTION := 'Save and Quit';
SForm_QuitButton.ONCLICK := @SForm_OnQuit;
SForm_Title := TLabel.Create(SettingsForm);
SForm_Title.Parent := SettingsForm;
SForm_Title.SetBounds(10 + w + 10, 235+(h div 2)-12, 200, 40);
SForm_Title.CAPTION := 'Security Settings';
SForm_Title.FONT.height := 25;
LoadSettingsXML;
SettingsForm.ShowModal;
end;
procedure ShowSettingsForm(Sender: TObject);
{$IFNDEF EXTENSION}
var
V: TVariantArray;
{$ENDIF}
begin
// writeln('showing extention form.');
{$IFNDEF EXTENSION}
V := [];
ThreadSafeCall('LoadSettingsForm', V);
{$ELSE}
LoadSettingsForm;
{$ENDIF}
SettingsForm.Free;
end;
procedure Init;
var
i, j, k, h, l: Integer;
ToolsMenu : TMenuItem;
tmpStrings: TStringArray;
begin;
{
Load consts for the User Input Form.
}
Option_URL_Options := [
'Allow Once',
'Deny Once',
'Allow This Session',
'Deny This Session',
'Always Allow',
'Never Allow'
];
Option_FILE_Options := [
'Allow Once',
'Deny Once',
'Allow This Session',
'Deny This Session',
'Always Allow for File',
'Never Allow for File',
'Always allow for Directory',
'Never allow for Directory'
];
for i := 0 to 1 do
begin
if (i = 0) then
l := Length(Option_URL_Options)-2
else
l := Length(Option_FILE_Options)-2;
setLength(pathArr[i], l);
dec(l);
for j := 0 to l do
begin
pathArr[i][j].name := format('lists_%d_%d', [i, j]);
{$IFDEF EXTENSION}
{
Load the previously saved settings.
}
tmpStrings := Explode(
LIST_SEPARATOR,
Settings.getKeyValue(PathArr[i][j].name)
);
h := 0;
SetLength(PathArr[i][j].a, Length(tmpStrings));
for k := 0 to High(tmpStrings) do
if (Length(tmpStrings[k]) > 1) then
begin
PathArr[i][j].a[h] := tmpStrings[k];
Inc(h);
end;
{$ENDIF}
end;
end;
{$IFDEF EXTENSION}
{
Load Default Settings from Settings.xml
}
Settings_DEFAULT_URL := StrToInt(
Settings.getKeyValueDef('Default_URL', toStr(ALLOW_ONCE))
);
Settings_DEFAULT_FILE := StrToInt(
Settings.getKeyValueDef('Default_File', toStr(ALLOW_ONCE))
);
Settings_DEFAULT_TIMEOUT := StrToInt(
Settings.getKeyValueDef('Settings_TimeOut', '60')
);
Settings_FILE_WALL_ENABLED := StrToBool(
Settings.getKeyValueDef('Settings_FileWallOn', 'True')
);
Settings_FIRE_WALL_ENABLED := StrToBool(
Settings.getKeyValueDef('Settings_FireWallOn', 'True')
);
{
Find the Tools Menu.
}
for i := 0 to Simba_MainMenu.Items.count - 1 do
begin
if (Simba_MainMenu.Items.items[i].caption = '&Tools') then
begin
ToolsMenu := Simba_MainMenu.Items.items[i];
Break;
end;
end;
if (ToolsMenu = nil) then
begin
Writeln('Could not find tools menu.');
Exit;
end;
{ Load the Menu Items into the Tools menu. }
MenuHead := TMenuItem.Create(ToolsMenu);
MenuHead.caption := 'Se&curity';
ToolsMenu.Add(MenuHead);
MenuCheck := TMenuItem.CREATE(MenuHead);
MenuCheck.caption := 'Security &Enabled';
MenuCheck.checked := LowerCase(Settings.getKeyValueDef('SecurityEnabled',
'true')) = 'true';
MenuCheck.OnClick := @OnMenuCheckClick;
MenuHead.add(MenuCheck);
SecurityEnabled := MenuCheck.CHECKED;
MenuEdit := TMenuItem.CREATE(MenuHead);
MenuEdit.caption := '&Settings';
MenuEdit.OnClick := @ShowSettingsForm;
MenuHead.Add(MenuEdit);
{$ELSE}
SecurityEnabled := True;
Settings_DEFAULT_URL := ALLOW_ONCE;
Settings_DEFAULT_FILE := ALLOW_ONCE;
Settings_DEFAULT_TIMEOUT := 30;
Settings_FILE_WALL_ENABLED := True;
Settings_FIRE_WALL_ENABLED := True;
{$ENDIF}
Icon_Lock := GetMufasaBitmap(
BitmapFromString(
48, 48,
'meJzFmAlUk3fWxnG3gI61TqeLa5' +
'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' +
'NOJAeU='
)
);
{ Temp hack }
Icon_Lock := TMufasaBitmap.Create();
Icon_lock.SetSize(48, 48);
Icon_Lock.Name := 'Security-lock-icon.bmp';
Icon_Lock.FastReplaceColor(clBlack, 13160660);
end;
procedure Free;
begin
// Only here so people won't freak out. :)
Icon_Lock.Free;
end;
{$IFDEF EXTENSION}
procedure Attach;
begin;
Writeln('Security Extention started.');
MenuHead.Visible := True;
SecurityEnabled := MenuCheck.CHECKED;
end;
procedure Detach;
begin
MenuHead.Visible := False;
SecurityEnabled := False;
end;
function GetName: string;
begin;
result := 'Security Extension';
end;
function GetVersion: string;
begin;
result := '0.1';
end;
{$ENDIF}
{$IFNDEF EXTENSION}
var
cont: Boolean;
URL, FileName: String;
{$ENDIF}
begin
{$IFNDEF EXTENSION}Init;
ShowSettingsForm(nil);
{
//writeln(DirectorySeperator);
URL := 'http://www.google.ca/search?sourceid=chrome&ie=UTF-8&q=fpc+format';
onOpenConnection(URL, cont);
onOpenConnection(URL, cont);
FileName := ScriptPath + 'tmp.txt';
onOpenFile(FileName, cont);
}
Free;
{$ENDIF}
end.