This is part of the AXGate documentation included in newObjects
Development Library (NDL). We recommend you download it in order
to get the full information. There are also samples included with the
component. It will be convenient for you to download the raw package
if you are developer (it contains the DLL and the other files without
installation) in order to be able to fetch the files from the archive
on your desktop computer instead of searching the device for
them.
The AXGate keeps all its configuration in a single text file which
must be located in the same directory where the DLL resides. It must
be named AXGate.cfg. The sample file that comes with the component
contains comments to remind you about the meaning of the settings -
once you have read the documentation (note that using the change
password sample will remove the comments). The configuration has two
top level sections CONTROL which is reserved for future use and
PROFILES which contains the profiles definitions. Each profile is
defined in its own section. Here is a template section we will use for
the description below it:
{ ProfileName:
(int)Access=<AccessCode>
(string)Password=<Password>
(string)Name=<Display name>
(string)Description=<Description>
(string)Default=<Default object>
(string)AllowedProtocols=<protocol1>
...
(string)AllowedProtocols=<protocolN>
(string)AllowedURL=<url1>
...
(string)AllowedURL=<url1>
{ CLASSES:
{ ObjectName1:
(string)Type=File
(int)Create=<1|0>
(int)Exclusive=<1|0>
(int)ShareRead=<1|0>
(string)File=<file full path>
} ObjectName1;
{ ObjectName2:
(string)Type=MemoryStream
} ObjectName2;
{ ObjectName3:
(string)Type=OLEStorage
(int)Create=<1|0>
(int)Exclusive=1
(string)File=<file full path>
} ObjectName3;
{ ObjectName4:
(string)Type=SQLite3DB
(string)File=\AXGate.db3
} ObjectName4;
(int)newObjects.utilctls.SFRecord=1
(int){06C9B1B5-13E5-4661-AE98-DFAB98C67AF1}=1
........ and so on .........
} CLASSES;
} ProfileName;
The ProfileName can be any string you want. It must not
contain ":" or ";" characters and <CR>,
<LF> characters. This name is used by the script when it
requests profile activation through the Profile
property.
The most important setting for a profile is Access. The
current version supports the following values:
0 - Default (if Access is omitted). The profile can be used from
any source, the user is asked for a permission to activate it.
1 - The profile can be used from any source, the access is granted
if the PassCode property matches the Password
setting in the profile.
2 - The profile is allowed only if the page has been downloaded
through one of the protocols listed in an AllowedProtocol
option. At least one such option should exist - otherwise the
profile is unusable. The user is asked for a permission to activate
the profile.
3 - Like previous (2) but PassCode property must match the Password
setting.
4 - The profile is allowed if the page has been downloaded from URL
"under" on of the URL specified in an AllowedURL
option. This means that the page URL must begin with one of URL
specified in the AllowedURL options. The user is asked for a
permission to activate the profile.
5 - Like previous (4), but the PassCode property must match
the Password setting.
The Password setting is meaningful only for profiles with Access
set to 1, 3 or 5.
The Name specifies the display name of the profile. This
name is shown to the user when he/she is asked for a permission to
activate the profile or when the "Access denied" message is
shown in case of a profile with password protection.
The Description allows you specify one line (can be quite
long) of description that helps the user decide what to do - allow or
deny profile activation. Used in profiles with Access set to 0, 2, 4
and not used in password protected profiles (Access set to 1, 3, and
5).
The Default setting is optional. If present it specifies one
of the classes listed in the Classes section - the name of the class
or the pre-initialized objects. It allows the CreateObject
method proceed without parameters or with empty string parameter. If
called this way it will return the default object.
The CLASSES section
The regular entries for COM classes are like this:
(int)<ProgID>=<1|0>
or
(int)<ClassID>=<1|0>
You can specify the ProgID of the class you want to list or/and
its ClassID. If ClassID is specified it will allow CreatObject to
accept the ClassID UID string (like this one for instance:
{06C9B1B5-13E5-4661-AE98-DFAB98C67AF1} ). However most of the
developers are used to ProgID strings instead of ClassID so ProgID-s
should be used unless there is a specific reason to use ClassID.
The entry must be set to 1 in order to allow object creation. You
can set it to 0 if you want to disable the object without removing
the entry (for example if you want to disable it temporarily).
The special pre-initialized objects
Version 1.0.0.2 of AXGate supports 3 types of such objects. Each
of them is specified in a section named after the name you want to
use in CreateObject to obtain it. I.e. you will be able to obtain it
when CreateObject is called with the section name you specified.
File
(string)Type=File
This is a SFStream
object attached to a file explicitly specified by the setting:
(string)File=<file path>
File path must be full - for example: \My Documents\myfile.txt
If you want the file to be created if it does not exist yet
instead of causing an error you can specify:
(int)Create=1
Also there are two more settings you can optionally put in the
section:
(int)Exclusive=1
Will open/create the file with exclusive access - no other
application or script will be able to open it while it is in use.
(int)ShareRead=1
If specified instead of Exclusive will allow other applications to
read the file but not write it while you are using it.
When you obtain the object the file is positioned in the
beginning. If you want to append it the first thing you do should
be ofile.Pos=ofile.Size - position at the end of the file.
MemoryStream
(string)Type=MemoryStream
This is a SFStream
attached to a temporary in-memory file.
The file is lost when the page is closed. Can be useful when
transferring data from other sources.
OLE Storage
(string)Type=OLEStorage
This is a SFStorage
object attached to an OLE storage file explicitly specified by the
setting:
(string)File=<file path>
File path must be full - for example: \My Documents\mystorage.stg
As like File you can use:
(int)Create=1
If you want the storage be created if it does not exist yet.
(int)Exclusive=1
Must be specified in order this to work because of the
platform limitations.
The OLE storages are a kind of a virtual file system maintained
in a file. So the storage looks like single file in the device's
file system, but internally it may contain sub-storages
(sub-directories), streams (files) in a tree-like structure as
like the device's file system. There are certain limitations - for
example the sub-elements names must be up to 31 characters long
and no more, but in general it allows the data to be stored in any
convenient way.
SQLiteDB and SQLite3DB
Type can be one of these two:
(string)Type=SQLiteDB
For SQLite COM
or
(string)Type=SQLite3DB
For SQLite3 COM
(string)File=<dbfile_path>
The full path to a database file which will be automatically
opened/created when the object is created.
The SQLite pre-initialized objects enable you to create
profiles with something you can call default database - i.e. the
database is opened with the object creation saving the page some
work.
The usage of the component is well illustrated in the samples
packed with it. By default they are installed in My Documents\AXGate
samples directory. You can download also the raw package which
includes the samples as well. If you are installing AXGate manually
please note that some examples may have the \My Documents\AXGate
samples directory hardcoded in them - if you have problems check their
source code and change it to match the location you are using.
A few words about the usage. In general there are two techniques
depending on the profile(s) you intend to use. The profile with Access
set to 0,2 and 4 require the user to permit the profile activation,
while the others (1,3 and 5) expect the page to set the PassCode
property before activating the profile.
The profile is activated by writing the profile name desired to the
Profile property. When this is done
before returning the control to the script 3 things may happen
depending on the profile type - user is asked to permit the profile
activation, PassCode is checked against the Password setting in the
profile configuration or the access is implicitly denied if the
profile requires the page to be fetched through a particular protocol
or URL not matching the current page properties (the latter applies to
the profiles with Access set to 2,3,4 and 5).
How to create the AXGate object?
You should use code like this:
...
<BODY>
...
<OBJECT
ID="axgate"
CLASSID="clsid:03797ADA-8CCF-4533-B623-2C5DE06B29C7"></OBJECT>
...
It is recommended to place this outside any form in order to make
it easier to access the object. If the declaration is as in the above
sample code you can refer to AXGate using the axgate variable
(corresponds to the ID attribute) after the page is completely
loaded. Note that you cannot refer to the AXGate object while the
page loads but is not yet finished so it is convenient to use BODY's
onLoad event to initialize AXGate with certain profile. Of course, if
your page is constructed in manner that permits you perform the
initialization later (when user clicks something for example) you can
do this later - in response to some other event.
Below we will assume that the above <OBJECT ...> exists
somewhere in the page and we will only list the other sample code
involved. We also assume for the sample purposes that ID of AXGate is
"axgate" - you can name it otherwise, of course.
A typical code for user acknowledged profile looks like this:
var creator;
function InitProfile() {
axgate.Profile = "FullAccess"; // We want the FullAccess standard profile.
creator = axgate.CreateObject();
var o = creator.CreateObject("Someobject.ProgID");
// use o for something
.....
}
Above we use also the "Default" feature which allows us
call CreateObject without parameters and receive the default object.
In the "FullAccess" profile it is the Pack1Creator
from ActiveX Pack1 which in turn provides access to any registered COM
class in the system and also to composite objects. This special
feature of ActiveX Pack1 is handy here but if we want to use some
restricted profile like FileAccess for instance we may write this:
var SFMain;
function InitProfile() {
axgate.PassCode = "<the actual pass code>";
axgate.Profile = "FileAccess"; // We want the FileAccess standard profile.
SFMain = axgate.CreateObject("newObjects.utilctls.SFMain");
// Open a file for example
var file = SFMain.OpenFile("\myfile.txt");
// Write something in there
file.WriteText("Some text ...",1);
..... etc. .....
}
By the way - the FileAccess profile is password protected so we
need to set the PassCode property before activating it. After that
point everything is the same with any profile - we use
axgate.CreateObject("someID") to produce objects from the
profile. Do not forget that the technique in FullAccess profile is an
exception benefiting of the Pack1Creator object - in general ProgID-s
are used as parameters.
A little discussion. In the first case when you attempt to
set the Profile property a dialog will pop-up to ask the user for
permission to access the profile, while in the second sample the
PassCode and the Password will be compared silently and access
provided if they match. Of course placing the password in the source
of the page is not a good idea especially if the page is downloaded
from a random site. This can be convenient and secure for pages in the
local file system but is not wise for online pages. Note that the
standard profiles follow these considerations (review the AXGate.cfg).
Still a password protected profile can be used quite securely online
if the password is not in the page source. You can provide a field
user must fill or use cookies or something else. For example if it is
in a field you can do this:
axgate.PassCode = document.forms[0].PassCode.value;
Where the ID of the field is "PassCode" too. Of course,
in such cases you should init the profile not on load but later when
the user clicks some button for instance to confirm that he/she have
entered something in the password field.
Do not forget that the profiles with Access set to 2,3,4 and 5
allow you restrict their usage for certain protocols or URL only. This
allows you find the balance between security and convenience. The
standard profiles are good for many things but not for everything, of
course. When creating yours consider how secure are they.
For example if may want to collect information in a file and use
the latest entries on the device for some references. Assume that
later (in the end of the day/week) you transfer the collected
information to the desktop for further processing, but still you want
to implement more then just simple forms - for example you want to
allow the user to review whatever entries he/she have collected today,
search through them etc. You can do this using a flat file and a
SFRecord object. Then you will need a File pre-initialized object (see
in the above section) and a few other objects to perform other
supporting operations. If the only access to the local file system is
through this File pre-initialized object everything you expose is that
file where you collect the data. Well even in case of intrusion the
attacker will only destroy the content of the file. Well, but if the
user has been collecting this information for a few days it will be
quite a loss, depending on what kind of attacks you may expect (based
on popularity, the information and other considerations outside the
pure programming) you can decide what way to use. In general password
protection will be ok - as long as the application on the device
consists of one or more pages in the local file system,. So a profile
with Access=3 will do - limit the protocols to file only and
usage of password is safe enough (if someone manages to access the
files of your applications and thus steal the password then something
elsewhere is very wrong and it has nothing to do with your
application, nor with AXGate). But, suppose you want something more -
for example allow the user connect to your corporate site online and
run some additional pages over the local data. the purpose of this can
be some statistics, analysis you publish for the users that do this or
the reason can be even more complex - allow the user select and submit
entry or entries from the locally stored data to the server. This page
is to be more secured than the locally residing pages. You should look
at profiles with Access set to 4 or 5 then. You can specify there the
local URL and the online URL thus restricting the profile usage to
these two locations only. But still password or user acknowledgment?
If the application rarely requires the user to navigate from page to
page user interaction will not be too disturbing, but if not a
password usage may be more convenient. If you manage to implement the
online pages to fill the password from a parameter or a cookie set by
the local pages it will be better - i.e. if it is possible to avoid
putting the password into the page source and even the URL parameters
it is good and secure if something prevents such solution better go
the other way - user interaction.
Can I create the AXGate object directly?
Yes you can use:
var axgate = new ActiveXObject("newObjects.sandbox.AXGate");
This will even work outside IE (in CE version of IIS for instance),
but it will prevent AXGate from knowing where the page came from which
means that this technique should not be used in the typical area of
application of AXGate - HTML pages. It will limit you to profiles with Access set to 0 and 1 only! If you
use this technique in applications other than PIE consider what kind
of profiles will be appropriate - for instance in IIS user
acknowledgment will not be a good idea because a dialog will pop up
every time a page is served. Why should one need AXGate in an ASP page
or in a script? While this is not a specially targeted area AXGate can
help in such scenarios as well. In Pocket PC the Javascript itself
checks for the object safety and refuses to create unsafe objects even
if the script runs in non-browser environment (in ASP page, in a
scripting host, or another application that supports scripting). Thus
with AXGate you can open such an application to more components. Note:
If you use newObjects Micro Script Host application to run small
scripts (ships with AXPack1 family and is also included with AXGate
for completeness) you do not need AXGate in order to create objects,
the hosts Host.CreateObject overcomes the system limitations on its
own.