mirror of
https://github.com/moparisthebest/Simba
synced 2024-11-25 02:32:19 -05:00
1460 lines
41 KiB
Plaintext
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' +
|
|
'3W+aZal7p+LqAoCtZdQEERBAEXRCwqSt2qVo/S1rpVqfpZkUUWUUG' +
|
|
'QHQIJBLIvJCQsISyBkH0PAe7cVz4Zj2PV8ejMPTmc5Jx/3vze5z53' +
|
|
'ebGze4fBZDLPnz+/d+/eHTt27N69+/Dhw7GxsTU1Ne/yN18cubm5h' +
|
|
'w4d2rp1a1RU1NWrV+Pj42/fvv3TTz9FRET4+/uHh4cXFRX9x2BYLF' +
|
|
'ZgYCCqQaFQFAqF2WyGp6HX6+l0+oULF/DAgQMHGhsb3zXMgwcPtmz' +
|
|
'ZcunSpebmZpVK1dTU1NLSgm+sVis8EwKB4NSpU35+fgUFBe8O5pdf' +
|
|
'fgkICEhKSmptbZVIJFVVVXw+v7a2tr6+HvGeQ7LZbMnJyZi+1NTUd' +
|
|
'wETGRm5a9euwsJCFITL5VKp1LKyMhKJdPPmzaNHj6Kdzp07h2o8mz' +
|
|
'4M1BNthn57iyRisTg4OBity2azGxoakCQvLy8rKwtvHzEwKceOHbt' +
|
|
'48eLBgwd9fX2/++47rLseGI1Ggwm9fPkyIkml0jcGKNJBiR563hfk' +
|
|
'5OAvYl1jUkQiERZOWloaFhRaCGs8NDRUKBT2fhGlO3HiBOYID6C38' +
|
|
'SOyZWZm7tmzB+V9A5IbCUmTBWBXCX1oMFsM0cnpoZs2JCQmyuVyDo' +
|
|
'eTnZ19586dK1euHD9+HBU7cuTICy+Sn5+Pt4DA6OrHjx/HxcWdPHk' +
|
|
'SqwBL79+CSVaDIxscC7WL7lUtTa8eTjEMeVR/Ma+sW6PksJjp6enX' +
|
|
'rl374YcfsMlgOWPbecmlMK3ofCRJSUnBVGJCMZX43deH2SwhNBmT1' +
|
|
'bwxmb4tlb4lhb4umTUyX/mnKtjPlmWnP7x+5dKRo0cxQUFBQXjXr7' +
|
|
'wgpgwFRD3PnDmzf/9+Hx+fkJCQ1yGpNsNnfOhPscy5Xx2SQgtMY25' +
|
|
'MZngmM9cnMVbH0ybcq7Er65hcLI04HR0R6PdtUIBYIHidy8pkMrQN' +
|
|
'mhl9jrewYsUKTOIrv3WuFQYyYUS+wiOFFXGvMvAe0zuZ4XGXsTaJs' +
|
|
'fIuc/ldpns8fVocp2+hbnCxeuG1tNch6Qkej4c8mKPt27d7eno6OT' +
|
|
'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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.
|