quarta-feira, 4 de dezembro de 2013

Smart Mobile Studio - DBGrid with some curves

POST #028 =======================================================================
Like it or not, Delphi is the best development tool for Win32/Win64 but Embarcadero seems to ignore the fact. Someone could say that the baby is being thrown out with the bathwater and after all, when they realize the error will be too late.

The fate of Delphi is increasingly linked to the acclaimed FireMonkey technology. Concerns about FireMonkey are concerns about Delphi. Embarcadero beyond thinking who owns the Pascal, persists in pushing your fancy half-assed multi-platform write-once run-anywhere, in reality, is that you can write once and then run it in any platforms each "supported". For example, you develop for Android "some " Androids.

This is my space for outburst. Now, talking about SMS. Smart Mobile Studio was created with Delphi. The tool lets you instantly convert Pascal "Delphi-like" javascript code to native code. The interesting part is that the generated code (pure javascript) is ready to run on smart phones. In order to demonstrate the functionality of this greate tool, I've created a DBGrid with pictures in SmartMS. Nice photos, ehm. doncha think?

Noteworthy is that you can call javascript event handlers using object pascal . Thus, you could make a sort of binding between components of a javascript library and the native components SmartMS thus being able to create more sophisticated apps. This is warleyalex from Seven Lakes, Brazil. Stay tuned on upcoming videos about SmartMS.

Tags: OP4JS; Smart Mobile Studio; SmartMS with DBGrid.
 


sábado, 30 de novembro de 2013

Smart Mobile Studio - DBGrid component

POST #027 =======================================================================
Smart Mobile Studio (aka Delphi for Javascript) instantly converts pascal Delphi-like code into high-speed javascript. The interesting part is that JS code generated is ready to run on smart phone or any HTML5 web-kit empowered device.

I would like to create a testapp more sophisticated with SmartMS, I realized that I could write a Pascal wrapper classes to mimic the structure of the JS library, with the intent of using it to call events from pascal. In this mini video, I'll demonstrate a DBGrid with SmartMS. Thank you very much, I'm warleyalex, and you take care. Stay tuned on upcoming videos about SMS.

Tags: OP4JS; Smart Mobile Studio; SmartMS with DBGrid.
 


domingo, 13 de outubro de 2013

Delphi mORMot - My Custom 404 error page

POST #026 =======================================================================
Welcome back. Delphi mORMot server will typically generate a error "Not Found" when you attempt to follow a dead link, this message indicates that the client was able to communicate with the server, but the server could not find what was requested.

I would like to display a customised 404 error page, including a more "friendly" message that work in no-script browsers. This is for browsers that do not understand JavaScript can be redirected to special pages that do not expect users to support JavaScript.

I'm using meta refresh tag <meta http-equiv="refresh" content="0; url=/root/">
to auto redirect page. Concerning absolute URIs in redirects, I don't know if this method is the best approach for redirection, but anyway, this is another story. So please stay tuned on upcoming videos. Thank you very much for listening, I'm warleyalex, and you take care.

Tags: Delphi mORMot URI redirection; Custom 404 error page; auto redirect page.
 

segunda-feira, 7 de outubro de 2013

Smart Mobile Studio (Delphi for Javascript) - calendar widget

POST #025 =======================================================================
Welcome back, everyone. This is warleyalex. Playing with SMS - Smart Mobile Studio (AKA Object Pascal for Javascript). SmartMS instantly convertes pascal Delphi-like language into pure JavaScript. The code generated is ready to run on your iPhone or any HTML5 web-kit device. The idea here, in this mini video was demonstrate some SmartMS built-in datetime functions. As you know, since delphi and javascript deal with dates quite differently, this probably is an issue. I’m having a hard time to add an animation feature in Smart, but this is for the next video. So please stay tuned on upcoming videos. Thank you very much for listening, I'm warleyalex, and you take care.

Tags: Delphi for javascript; Object Pascal for Javascript; Smart Mobile Studio with jQuery.
 

quinta-feira, 19 de setembro de 2013

Android with Delphi - Authentication + URI Signature

POST #024 =======================================================================
Welcome back, everyone. This is warleyalex. Playing with Delphi mORMot and Android again. In this mini video, I would like to demonstrate mORMot authentication scheme using Android as client side.

Before hand to take a step further, I will explain to you that Delphi mORMot uses a technique for security called “Query Authentication”. Therefore, each REST request will expect an additional parameter named "session_signature" which will be appended at the end of the URI. As you know, all REST query must be authenticated by signing the query parameter. This signature will be checked against the valid sessions in order to validate any further request to mORMot server. This signature seems to be very effective and will avoid most of attacks such as Man-In-The-Middle and re-plays attacks.

Imagine a scenario in which a client sends an encrypted user name and password to a server to log in. If an attacker intercepts the communication (using monitoring software) and replays the sequence, he will obtain the same rights as the user. If the system enables password modification, he could even replace it with another, depriving the user of his access. In this type of Man-in-the-Middle attack, packets and authentication tokens are captured using a sniffer. Once the relevant information is extracted, the tokens are placed back on the network to gain access.

The man-in-the middle attack intercepts a communication between two systems. The MITM attack is very effective because of the nature of the HTTP protocol and data transfer which are all ASCII based. In this way, it’s possible to view and interview within the http protocol and also in the data transferred. So, for example, it’s possible to capture a session cookie reading the HTTP header, but it’s also possible to change an amount of money transaction inside the application context.

I'm having hard time trying to figure out how to implement Android-mORMot authentication scheme, the issue is I have zero expertise with Java-Android technology, but anyway… I created a similar java class to mimic authentication mORMot approach in Android. As you know, most Android and iPhones applications use an initial screen or dialog box to ask for credentials. My app accepts username and password from the user and sends to remote server application for authentication. Finally displays the main screen to the user, which there is an icon named “My Calc”, this was based on project 14 - Interface-based services.

The idea here was demonstrate “URI signature” feature in Android, in order to enhance security. These are some of the basic functionality. Of course, it would be nice if I could add others functionality such as change password, reset password feature through email or even registration. But I’m having a hard time to add feature to prompt the user to re-login (when the session is expired), but this is another story. So please stay tuned on upcoming videos. Thank you very much for listening, I'm warleyalex, and you take care.
 

domingo, 1 de setembro de 2013

Android with Delphi - CRUD

POST #023 =======================================================================
Delphi XE5 – (AKA Delphi for Android), is officially out today. It’s neither a Delphi compiler for Java nor generates Dalvik¹ VM bytecode. The compiler named “dccaarm” produces native applications with binary code, compiler builds native machine instructions ARM executables, generating automatically the package .apk. Emborcadaro guys are always stating the word native, the “native machine code” is better than and so on. To be honest, I think “native” here is synonymous of “sex”, anyone talking about it all the time generally is not doing it. In my opinion, seems to be a very interesting tool, despite the price of $ 1.5K - too expensive for most programmers.

Talking about price, size, Delphi and Android, take a look at what I'm trying to build: is a REST server with the old Delphi 7 with Android. The Android Client will list data in a simple widget listview. My first app does something useful, perform CRUD operations such as create, insert, or delete records. Eclipse with Android SDK generates this application to an .apk in 60 KB in size.


AHA! By contrast, an empty Hello World application project in Delphi for Android XE5 – the generated code (file with extension .so) a kind of shared objects library in Linux, is much bigger: around 5MB in size. How quickly does that native binary grow when you add more capability? Normally, I’m very optimistic, but recently I’ve becoming very pessimist with EMBT these days, but this is another story. So please stay tuned on upcoming videos. Next video, I'm going to talk about REST authentication using Android client. Thank you very much for listening, I'm warleyalex from Sete Lagoas, and you take care.

_______
Dalvik¹ Virtual Machine requires that the Java bytecode .class is converted to the Dalvik bytecode, so from compiled Java class files, the files are converted to the Dalvik VM bytecode to native files. dex. The Dalvik virtual machine Android normally does not run Java bytecode.  

quarta-feira, 7 de agosto de 2013

Delphi with jQuery UI Multiselect component

POST #022 =======================================================================
I would like to submit an array of strings from a web form to Delphi mORMot server through GET request.
Suppose you have a multi select jQuery UI control which allows users to select items, you would like to save the multi selected items to a database. When the page is next loaded you want to retrieve the list of items from a remote data source but also set the currently selected items.

I suspect that there is a clever way to do this in mORMot, but here I'm using another alternative approach to pass json encoded array into URL via GET method. My mORMot service I've written seems fine with having an array of strings as input using Delphi type "set with enumerations". The array will automatically be parsed by mORMot.
If you don’t know, ENUMERATIONS is simply a fixed range of named values. Each of the values in an enumeration must be unique in a program. It allows a variable to have one, and only one value from a fixed number of values. Otherwise, a SET is a collection of values of the same ordinal type. Sets allow you to have any combination of the given values - none, 1, some, or all. Sets with Enumerations is used to mix both enumerated types and set types. I know this might look complicated, but it really isn't!



Tags: jquery UI with delphi mORMot; Delphi mORMot UI Settings; Delphi jquery multi select list; Delphi REST server;

Warleyalex from Sete Lagoas-MG, Brazil

terça-feira, 30 de julho de 2013

Delphi with jQueryMobile - Store User settings JSON object in DB

POST #021 =======================================================================
The end-result of this mini-video was demonstrate the aproach JSON based-data or key-per-column. The idea is store UI settings JSON object into Sqlite database. Once stored, I’ll retrieve these preferences when user returns to the web app and set the UI as it was when they last left it at later time. One obvious drawback of this approach is that it makes it VERY slow to find things, but it's fine for small structure of data you don't need to search by.

I'm using meta columns which stores data about the user in JSON format. For example, "roles" object is stored as TEXT in Sqlite database column, and extracted directly as such from DB. You just need to decode JSON string as a JSON object. For instance, it is just one line of javascript. I'm using the stringify method to convert the JS object into a string, store it in the Sqlite database and then pull it back and use the reverse parse method to give me the javascript object back.

Maybe this is neither the best aproach to store UI user preferences nor design-wise or performance-wise, but I believe that it often makes sense to organize small trunk of data and store it in json object in database. That's all.




Tags: smart phones with delphi; Delphi mORMot UI Settings; Delphi jquery mobile; Delphi REST server;

Warleyalex from Sete Lagoas-MG, Brazil

domingo, 30 de junho de 2013

Smartphone with Delphi - Part I

POST #020 =======================================================================
In this mini video, I gonna use the old Delphi 7 to build a mobile web frontend application for displaying "NorthWind Traders" database data coming from a mORMot server. Northwind Traders is based on sample database that ships with Microsoft Access. I use the ideas in Northwind Traders to implement this mobile version.

The end-result is mORMot data server providing data optimized for web browsers available on smartphones, like Blackberry, iPhone, Android and others.  At this time of this writing, I'm going to point out two things:
a) I know barely nothing about application development for smartphones; and
b) this is my first mobile version using Delphi.

I guess many companies are creating mobile applications for their internal staff, for their customers, or both. These applications need access to data, business rules, and business processes.  For architectural and security reasons these applications are typically built to access remotes services that provide the data and functionality that are required by the users.

I believe that it often makes sense to organize those services into a mobile environment built using REST, and delivering data in JSON format. Believe it or not, this is possible using the old Delphi 7. Here, Delphi 7 provides dynamic JSON to a thin javascript client.



Tags: smart phones with delphi; Delphi mORMot with Blackberry; Delphi jquery mobile; Delphi REST server;

Warleyalex from Seven Lakes, Brazil

terça-feira, 28 de maio de 2013

uniGUI with DataSnap - Part 1

POST #019
=======================================================================

This is the 1st part of the mini-video about uniGUI. Developing a stateful Rich Internet Application (RIA) is one of the challenging fields in software development. uniGUI Web application framework makes developing stateful Web applications easier than ever. uniGUI extends Web Application development experience to a new dimension. In my little experiment, I'm using uniGUI with DataSnap.

uniGUI with DataSnap seems to be a good match. DataSnap architecture is more flexible than before. It moves the connection between the client applications and database server to application server and database server while you can connect many client applications to the same application server.


 

Tags: RIA with Delphi; unigui; DataSnap with uniGUI; unigui web application.

Warleyalex from Sete Lagoas, Brazil

terça-feira, 21 de maio de 2013

uniGUI with SQLite

POST #018
=======================================================================
You can create web applications RIA (Rich Internet Application) without the need for many specific knowledge for web environment, such as HTML, javascript, CSS, PHP, etc. You can use the same code base object pascal to create a desktop app and a win32 VCL application RIA web quickly and very easily.

If you do not know, uniGUI is an alternative for developing RIA web applications using 100% AJAX features of the Delphi RAD environment. In uniGUI, most of the business logic, as well as the complexity of threads, managing multi-user access and all data is located in a central layer, running on the server.

You can freely download uniGUI beta, for testing. But if you intend to use it to publish a web application or even a commercial application freeware, closed source, the developer will have to purchase a full license of ExtJS, which costs about US$330. Any uniGUI server requires a copy of the ExtJS library. Due to its licensing scheme, I think even freeware closed source applications are unable to use it. According to the roadmap uniGUI, from version 1.0, it is likely that uniGUI be marketed - in 2013, and the license price will be the "style" of the Sencha ExtJS, around US$330 per developer, ie, to use uniGUI, developer should spend approximately R$1.200,00 (BR).

I was wondering about using mORMot together uniGUI. In uniGUI, since all server-centered activity is hosted in one multi-thread process. Perhaps, make sense to use a local SQLite database engine. I'd like to use SQLite3 as a client-server where the same database will be accessed simultaneously by many clients/threads, accessing a common database. Interesting, isn't it?
 Typically in uniGUI, if you want to show records from your database table on a DBGrid in your application, you will need:

1. TSQLConnection to provide the necessary connection details to the database.  One TSQLConnection can service several TSQLDatasets.

2. A TSQLDataset component which will specify the TSQLConnection component in the SQLConnection property.

3. A TDatasetProvider component which will specify the TSQLDataset in its Dataset property.

4. A TClientDataset component which will specify the TDatasetProvider in its ProviderName property

5. A TDataSource component which will specify the TClientDataset component in its Dataset property.

A TDBGrid component which will specify the TDataSource in its DataSource property.

By setting the appropriate Active properties to true in TSQLConnection, TSQLDataset and TClientDataset you should find that the data will appear in the grid.
__________
I skipped steps 1-2 to simply display data in a DBGrid, for me, the easiest way to edit/delete/insert any of the cell values in a DBGrid with mORMOt and write back do database is using TClientDataSet. On BeforeApplyUpdates event I could capture delta, and put Delta back to to the database using Batch sequences. TDatasetProvider here is like a pipe connecting TClientDataset with TSQLTableJSON. It seems like quite a bit of effort to simply display and modify records in a DBGrid, but that is the way it works!

Yep, this is like bizarre creatures from another planet.


 

Tags: RIA with Delphi; unigui; mORMOt with uniGUI; unigui web application.

Warleyalex from Sete Lagoas, Brazil

quinta-feira, 25 de abril de 2013

Fish Facts using jQuery with Delphi

POST #017
=======================================================================
Remember that old demo well known "FishFacts" developed with Delphi win32 that displays a list of fishes, as well fishes images and notes text BLOBS from a paradox dataset Biolife. Old days...

Now, I’m using mORMot, with a background HTTP REST server, together with its SQLite3 database engine. I’ve implemented a thin client, Ajax-ready, open and lightweight javascript client using jQuery, that shows how to display style memo and graphic fields. This app has been compiled with Delphi 7, but you can recompile it with Delphi 2009/2010/XE.

 

Tags: Delphi with jQuery; Delphi REST server; Delphi mORMOt with thin client.

over and out,

warley alex from Sete Lagoas, Brazil

domingo, 21 de abril de 2013

Web Application Using jqGrid with Delphi

POST #016
=======================================================================
Rather than just dabbling around a handful of jqGrid demos examples, I recently spent a few hours building a quite simplistic project using jqGrid with mORMot. I found that functionalities like "remote paging", "remote sorting" and "remote multi-searching" are working fine.


Remote paging is fine but I would like the grid will automatically postback to the server when end-users select a row and will fire the RowSelecting event handler and databind a second grid with details. I have tested more complex events, such as a subgrid. It's so fast and beautiful.
I had to use boils down (to do a MacGyver) to handle master detail and subgrid with mORMot with jqGrid. Technically everything goes pretty well.
 

Tags: Remote Filtering with jqGrid and Delphi; jqGrid with Delphi mORMot; Master detail grid with jqGrid and Delphi mORMot; subgrid with jqGrid and Delphi mORMot;Delphi Restful.

quinta-feira, 4 de abril de 2013

Remote Paging and Sorting using Delphi with ExtJS

POST #015 ========================================================================
In this mini-video, a remote RESTful access of a SQLite3 database, hosted by a mORMot server, with this dedicated server it was possible to do remote paging and remote sorting as well as CRUD operations with the ExtJS Grid.

Recently I was playing with mORMot and ExtJS when I came across a major block, the solution of which I now wish to share through this tip. While working with ExtJS at Client side and JSON objects returned on the server side (here mORMot), I found that all functionalities were working fine except remote filtering. It is quite well-known that mORMot supports sorting as well as paging.

Please note:
=========
- the docked pagination toolbar at the bottom of the screen.
- the results are sorted by Name in ascending / descending order.
- the pagination and sorting is being done remotely at server side.
- Filtering: has been done LOCALLY at client side.
- Table SampleRecord has 52,500 records

Best regards,

warleyalex from Sete Lagoas, Brazil


Tags: Remote Paging; Remote Sorting; ExtJS with Delphi; Remote Paginator; CRUD with Delphi and ExtJS; Extjs with mORMot;

Remote Filtering using Delphi with ExtJS

POST #014
=======================================================================

Sometimes, you only need a specific subset of data from your dataset, but you need it filtered to a specific set of Records. After working with our filtered dataset, there will come a time when we want our original dataset back. When we filtered the dataset, the other Records didn't go away. They're still sitting in cache, to the side, waiting to be recalled. Rather than query the server again, we can simply clear our filter.

Client-side filtering is great, reducing our trips to the server. Sometimes, however, our record set is just too large to pull in at once. A great example of this is a paging grid. Many times we'll only be pulling in 10 Records at a time. The client-side filtering methods just are fine if we only want to filter the resident dataset, but most of the time we'll want a filter applied to all of our data.

Sorting data on remote calls is pretty easy, using Extjs, as we can set the property remoteSort to true (default value is false) and the proxy will pass the filter object as the parameter:

filter:[{"property":"subject","value":"mORMot"}].


So, basically if our Store was attached to a grid object, clicking on a column heading to sort the display would automatically pass the parameter value in its AJAX request, and our little server mORMot should be well enough to handle these request.

Filtering data on remote requests is a bit harder. We would pass parameters through the Store's load event, and act on those arguments in our mORMot server-side method. Our little mORMot should read the parameter filter (a json object) and perform the filtering on server side. The problem is: our mORMot uses another approach to filter data – it uses inlined parameters via SQLwhere and cannot read directly with parameter Filter coming from the client side.

This might look complicated, but it really isn't! Again, our mission here is to learn how mORMot handle with this task, it is important to have some understanding of what your server-side process is doing. The trick is: what we have to do here is just passing some expected parameters related to filtering using inlined aproach through HTTP request, mORMot will just ignore the option parameter filter.


Regards,

warleyalex from Sete Lagoas, Brazil


Tags: Remote Filtering with ExtJS; Remote ComboBox Filtering with Extjs; ExtJS with Delphi mORMot; remote Filter with Extjs and Delphi;


segunda-feira, 11 de março de 2013

Remote Reports using Crystal Reports + ExtJS + DataSnap

POST #013 ========================================================================
In this mini-video, a dedicated server reports using the DataSnap architecture, it was possible to take reports created with Crystal Reports XI - using thin clients (ExtJS).

Using reports created in Crystal Reports, traditionally in Delphi customers, is a very boring task, shall be installed at hundreds of libraries on clients, beyond the concern with updating reports. RPT on each client. license costs...

In this approach, the Crystal Reports were stored on the server-side (where the reports are processed), the "thin clients" just ordering reports, passing parameters - does not require installation. With this, the Crystal Reports could be called on different platforms. Pretty nice, isn't it?

Regards,
warleyalex from Sete Lagoas, Brazil


Tags: Crystal Reports with ExtJS; ExtJS with Crystal Reports; datasnap with Crystal Reports; Datasnap with Extjs; Extjs Reporting;


domingo, 10 de fevereiro de 2013

Delphi + ExtJS + Firebird = CRUD

POST #012 ========================================================================
Delphi XE introduced the ability to build DataSnap servers to work with an HTTP REST interface.
On client side, there's a powerful framework called ExtJS.
I would like to make CRUD operations (create, Read, Update, Destroy) using these outstanding technologies.

So I've decided to mix {Delphi + Firebird + ExtJS 4+} up to see what would happen. I've looking for a trully RAD tool that would save me the time to develop a thin client JS, to create user interface and so on, I've found a tool called Sencha Architect, I love the way straightforward and sturdy you can do something with this tool, you can invoke remote methods from Delphi using REST interface. That's so beautiful.

warleyalex from Seven Lakes, Brazil.

Tags: crud with delphi and extjs; sencha architect with datasnap; crud com datasnap and extjs;


sábado, 26 de janeiro de 2013

JAVASCRIPT AUTHENTICATION WITH DELPHI REST SERVER

POST #011 ============================================================================= 
Has anyone done Javascript authentication with a Delphi REST server application?

It makes sense to ask about authentication, since without authentication anyone will be able to connect to your web server and execute all server methods available.

In this mini-video, it shows the DataSnap authentication scheme and  mORMot using the HTTP transport layer. My first webservice using the framework mORMot.

AUTHENTICATION SCHEME WITH DATASNAP:

The DataSnap authentication scheme is the awful "Basic Authentication". This scheme is used by most web services (about 95% of webservices).

It is available by default "native" in all browsers, but has some known weaknesses, such as a) that terrible authentication window displayed by browsers b) no appeal to have the feature "logout-like" and c) the fact that the username and password are transmitted "in plain text" to the server (it would be safer to leave the password only stay on the client side, while the keyboard input, and be stored as a hash in secure Server).

The first time a JS client calls the DataSnap REST server, it creates a new session ID and returns it in a custom HTTP header "dssession." Subsequent requests from the client must include a header "Pragma" with the session ID to the server to recognize that the request comes from the same client. This session remains active until the time expires (by default is 20 minutes).

The support code generated by the DataSnap wizard manages the session ID with a JavaScript global variable "$$$$SessionID" and passes next to each AJAX call on the same page. If you change the page or refresh it the session ID is lost.

You can, however, force the code to add this support JavaScript session ID cookie to a browser, so that is still available on all pages. If you try to call a REST URL directly in the browser, you'll be prompted to login HTTP standard. Once the user is authenticated and its session, the method is not called again.

In short, a flexible architecture is always welcome, but the authentication scheme used by Embarcadero is really useless in any real situation, do not use adequate security. You are transmitting clear text, you are transmitting the password! No matter you encrypt the session, is a basic flaw send the password itself.

Another point is unpleasant is when the credentials "username and password" are wrong, you need to restart another session, reopen the browser to be challenged for a username and password dialog box Basic authentication, this is really terrible. 


AUTHENTICATION SCHEME WITH MORMOT:
I did not understand how mORMot Authentication scheme works fully yet. The authentication process is quite secured and complex. It uses a nonce and to increase security, add a salt at the beginning of a SHA-256 hashed expression. The authentication scheme require to exchange binary data, using “params” they are encoded in strings. The connection handshaking requires more than a single call to establish the security context.

The SHA hash functions were designed by the National Security Agency (NSA). SHA-256 is one of the four variants in the SHA-2 set. It isn't as widely used as SHA-1, though it appears to provide much better security.
In mORMot, in order to create a new user session, first of all:
a) a JS Client sends a
GET ModelRoot/auth?UserName=... request to the remote server;
b) Server answers with an hexadecimal nonce contents (valid for about 5 minutes);
c) Client sends a GET ModelRoot/auth?UserName=...&PassWord=...&ClientNonce=... request to the remote server, in which ClientNonce is a random value used as Client nonce, and PassWord is computed from the log-on and password entered by the User, using both Server and Client nonce as salt;
d) Server checks that the transmitted password is valid, i.e. that its matches the hashed password stored in its database and a time-valid Server nonce - if the value is not correct, authentication failed;
e) On success, Server will create a new in-memory session (sessions are not stored in the database, for lighter and safer process) and returns the session number and a private key to be used during the session;
f) On any further access to the Server, a &session_signature= parameter is added to the URL, and will be checked against the valid sessions in order to validate the request;
g) When the Client is about to close (typically in TSQLRestClientURI. Destroy), the GET ModelRoot/auth?UserName=...&Session=... request is sent to the remote server, in order to explicitly close the corresponding session in the server memory (avoiding most re-play attacks);
Looks like Embarcardero is unable to understand what security means in today's world. Please go back to drawing board and design a more modern solution - and not one of the 80's.
 


Tags: Datasnap authentication scheme; mORMot authentication; Javascript authentication;