AJAX(112) Apple(1) Application Builder(244) Application Factory(207) ASP.NET(95) ASP.NET 3.5(45) ASP.NET Code Generator(72) ASP.NET Membership(28) Azure(18) Barcode(2) Barcodes(3) BLOB(18) Business Rules(1) Business Rules/Logic(140) BYOD(13) Caching(2) Calendar(5) Charts(29) Cloud(14) Cloud On Time(2) Cloud On Time for Windows 7(2) Code Generator(54) Collaboration(11) command line(1) Conflict Detection(1) Content Management System(11) COT Tools for Excel(26) CRUD(1) Custom Actions(1) Data Aquarium Framework(122) Data Sheet(9) Data Sources(22) Database Lookups(50) Deployment(22) Designer(177) Device(1) DotNetNuke(12) EASE(20) Email(6) Features(99) Firebird(1) Form Builder(14) Globalization and Localization(6) How To(1) Hypermedia(2) Inline Editing(1) Installation(4) JavaScript(20) Kiosk(1) Low Code(3) Mac(1) Many-To-Many(4) Maps(6) Master/Detail(36) Microservices(4) Mobile(63) Mode Builder(3) Model Builder(3) MySQL(10) Native Apps(5) News(17) OAuth(7) OAuth Scopes(1) OAuth2(10) Offline(19) Offline Apps(4) Offline Sync(5) Oracle(10) PKCE(2) PostgreSQL(2) PWA(2) QR codes(2) Rapid Application Development(5) Reading Pane(2) Release Notes(168) Reports(48) REST(28) RESTful(26) RESTful Workshop(15) RFID tags(1) SaaS(7) Security(77) SharePoint(12) SPA(6) SQL Anywhere(3) SQL Server(26) Stored Procedure(4) Teamwork(15) Tips and Tricks(84) Tools for Excel(2) Touch UI(93) Transactions(5) Tutorials(183) Universal Windows Platform(3) User Interface(335) Video Tutorial(37) Web 2.0(100) Web App Generator(101) Web Application Generator(607) Web Form Builder(40) Web.Config(9) Workflow(28)
Tuesday, December 14, 2021PrintSubscribe
Price Changes

 “Code On Time” Price Changes

The prices of our products will change on February 1, 2022

The new price for Code On Time Unlimited Edition / 1 user / 12 months of updates is $1999 USD.
The new price for Code On Time Premium Edition / 1 user / 12 months of updates is $1199 USD.

The prices for multi-user licenses for Unlimited Edition will also change to reflect the increase. 

We are also introducing the renewal pricing. The renewal price will be what you have used to pay for the new product license prior to February 1, 2022. 

For example, if you purchase Code On Time Unlimited Edition / 1 user / 12 months of updates on or after February 1, 2022 for $1999 USD, then you will be able to get the product license renewal for $1699 USD if you choose to renew before March 1, 2023

The current product owners will be able to renew the product for the same price it was purchased prior to February 1, 2022 if they do so within 30 days from the activation code expiration date

The licenses will remain perpetual. You do not have to renew the license if you do not wish to receive the product updates. Your applications built with Code On Time will continue to work. The app generator will have the same level of features that were available at the time of activation code expiration. 

The price increase is due to the following major enhancements:

  • Code On Time injects the  middleware in the generated apps with the introduction of the REST API engine. This significantly increases the value of applications created by developers.
  • Code On Time will include  Progressive Web Apps support in the generated applications, which will allow installing apps natively on Android, Chrome OS, and Windows.
  • Code On Time V9 introduces the new Live Project Designer integrated with online documentation, community forum, and help desk. This will increase productivity and ease-of-use.

Please consult the near term and  long term product roadmaps for more information about the upcoming features and enhancements.

“Offline Sync” Price Changes

Offline Sync Add-On will be sold only in packs of 10-device perpetual licenses for $990 USD per pack starting on February 1, 2022. The software will include 12 months of maintenance updates. 

The add-on will be hard-wired to work with the particular Internet domain only. The domain will be specified by the customer at the time of purchase. The “wildcard” domains are allowed. The “localhost” domain is included. One time change of the domain is permitted. The license is bound to the server (domain). Offline Sync Add-on will work in Progressive Web Apps mode. The required software will be automatically installed on the device along with the app. 

For example, if you purchase 5 packs of 10-device perpetual licenses for https://demo.codeontime.com and include the add-on in the application, then up to 50 simultaneous client devices running the app frontend in offline/disconnected mode will be able to synchronize the data with this application. The same license will also work with the  “localhost” domain for developers.

Labels: Features
Tuesday, December 14, 2021PrintSubscribe
Roadmap 2022/2024

This roadmap does not represent a guarantee that the features will be delivered on the specified dates as described in this document. The delivery dates may change, and features may be added or removed at any time. It is merely an outline of our thoughts for the future, and is subject to change at our discretion.

Roadmap: January - April 2022 

Full implementation of project configuration in the browser with v9 Live Project Designer. This will be followed by the official announcement of Code On Time v9. 

The new Project Designer is activated directly in the “development” mode of the application.  The screenshot of the app in the development mode is shown next. Application is sized to fit a particular device and orientation. 

The main elements of the Project Designer are the Project Explorer and Properties Window. Both are activated in the sidebar that overlays the live application. The end user can inspect any visible user interface element of the application with a click. Project Explorer will synchronize the hierarchy of the project configuration with the developer’s selection. Properties Window will display all available properties of the selection. Standard properties such as Label or Header Text will be presented together with the “virtual” properties derived from the various tags supported in the application framework. Hunting for the tag description in the blog posts will be no more!

Project Explorer and Properties Window are driven by the project configuration database. The first components of the database will begin shipping with the regular product releases by the end of January 2022. The first target of the live project configuration will be the contents of ~/touch-settings.json and the main project settings currently configured in the Project Wizard. The developers will be able to continue using the current project designer and the new browser-based designer simultaneously. The browser-based designer will communicate with the ~/bin/addon.appbuilder.dll through the REST API. This DLL is required only during development and works if Code On Time is installed on the development machine.  The DLL is removed from the output when the app is published for deployment.

The project configuration database is also shared with the new content management system that replaced the current https://codeontime.com and https://my.codeontime.com. The content management system (CMS) is implemented as a Code On Time application. It will offer the community forum, help desk, blog, and documentation library. The CMS is integrated with the Live Project Designer. Developers will jump straight to the relevant  documentation and will have an option to contribute the content, start discussion on the community forum, or open a help desk ticket. The new CMS will be offered as an add-on for purchase to help infuse the powerful content publishing features into custom applications created with Code on Time. The live project designer itself will also be packaged as an add-on for integration into custom apps built with Code On Time. 

The current user interface of Code On Time generator will become hidden when the new Live Project Designer meets and exceeds the configuration capabilities of the “original” Project Wizard and Project Designer. The app generator will put itself into the icon tray when started.  Management of projects and configuration will become entirely browser-based. We expect to complete this process over multiple regular product releases by the middle of Spring 2022. The app generator project number will change to v9.0.0.0 at that time.

Roadmap: Summer - Fall 2022

Transition of HTTP request/response processing of the server-side framework to a shared class and implementation of this class for .NET Core. This will enable cross platform deployment to Windows, Mac OS, and Linux. Code On Time version number will switch to v10.

We will begin the transitioning to .NET Core right on the heels of the v9.0.0.0 release to production. The server-side framework in the foundation of the generated application is overriding the handling of request/response by .NET Framework.  First, the server-side code references to HttpContext class and its various properties will be replaced with the new wrapper class implementation. Next, we will migrate an app created with Code On Time to the .NET Core 6. The wrapper class will be changed to make use of the .NET Core facilities.  Finally, a new target will become available in the project configuration settings as we put together the new code generation templates. 

The changes will not affect the application framework and will not require any additional knowledge from developers.  Selection of the .NET Core as the target for the project will produce the output that can be deployed to Windows, Mac OS, and Linux. We expect to complete the work before the end of the year 2022. 

Code On Time v9 allows configuration of the apps entirely in the browser.

Code On Time v10 makes it possible to deploy the server-side components of  applications on multiple operating systems.

Roadmap: Winter - Summer 2023

The app generator will migrate from .NET Framework to .NET Core and allow cross platform development on Windows, Mac, and Linux. Code On Time version number will switch to v11.

Cross platform frontend and its development tools along with the cross platform deployment  will leave behind the only element of Code On Time tooling tied to Windows - the app generator itself. Presently the app generator is implemented as the Windows Forms Application with the Project Wizard and Project Designer with the WebBrowser control instances hosting the locally stored HTML files to enable the project configuration. The code generator can also run in the command-line mode to perform various tasks. 

With the release of Code On Time v9 the “original” Project Wizard and Project Designer will become dormant since the entire project configuration process will be browser-based. Instead the command-line capabilities of the app generator will be heavily in use. 

Our research shows that the implementation of all tasks can be ported to the .NET Core. Successful migration will make Code On Time into a fully cross-platform development environment with the cross platform deployment of the frontend and backend. 

Cross platform server-side code can be deployed in a container to various cloud providers. The cross-platform frontend will not know the difference given that it can also execute in the offline/disconnected mode. 

Roadmap: Fall 2023 - Winter 2024

Visual Database Schema Builder. Hosted version of Code On Time becomes a reality. 

Extending the Live Project Designer with the ability to create data models on top of the automatically generated database tables appears to be the next logical step. Our Model Builder makes use of the existing relational databases to create the denormalized views of data suitable for consumption by human beings through the user interface. 

Code On Time will introduce the Visual Database Schema Builder that will automatically create the corresponding models and physical database tables. Multiple database engines will be supported. The schema builder will create the database tables with the structure “preferred” by Code On Time data models. Tight integration with the Model Builder will radically simplify the app development. 

Visual Database Schema Builder and Live Project Designer will deliver the enterprise-quality application production in the hands of the developers with any level of expertise. Code On Time will be offered a cloud container available with a subscription and also as a standalone tool that is available today!

Labels: Features
Thursday, September 30, 2021PrintSubscribe
2-Factor Authentication

 Multi-factor authentication

A combination of a username and password provides access to the personalized features of applications. Unfortunately both elements of the online identity are the primary source of the security breaches. Username and password are obtained by perpetrators through social engineering attacks, spy programs, and other nefarious means. The complexity of our lives forces us to share the passwords with loved ones and friends. The robust mechanisms of online identity protection are urgently needed in every application.

Many organizations adopt security systems that require the end users to enter a numeric time-based verification code generated by an authenticator app installed on the user’s mobile device. The unique secret key is associated with the user account in the application database. Authenticator app uses the same secret to generate a new verification code periodically and does not require a network interaction with the application. If the correct verification code is not provided at the time of sign in, then the access to the application is not granted even if the user is entering the correct username and password combination.

The username, the password, the text message or email with the verification code, the phone with the authenticator app with optional fingerprint scan or face recognition are the components of the multi-factor authentication.

2-Factor Authentication Setup

Applications created with Code On Time can force the end users to provide an additional piece of information to confirm their identity after the username and password were confirmed. By default, the 2-Factor Authentication is the opt-in feature. It can be enabled in the user context menu.

The option “2-Factor Authentication” is available to the authenticated user. The 2FA setup is not available to the end user if the user identity is confirmed by an OAuth provider. Application will rely on the authentication verification methods of the provider instead. The initial activation of 2FA will require the user to confirm their password.

Next the user is giving a consent to enter a verification code after the successful sign in. By default two verification methods are offered. Users may opt into getting a verification code via email and to use an authenticator app.

The verification code delivery via email will rely on the email address associated with the user account. This is a less secure method than using an authenticator app since there may be other individuals who can read the user’s emails.

Choosing the more secure method of verification will present the user with the QR code that needs to be scanned in Google Authenticator, Microsoft Authenticator, or another similar app. The QR code includes the information about the secret associated with the user account, the name of the app, and the name of the user along with some additional configuration data.

Google Authenticator immediately begins showing the verification code after the scan of the QR code. The time code will change every 30 seconds. There is no need to write down the verification codes since they will not be usable in the future. Other authenticator apps have a similar user interface and may require fingerprint scan or face recognition to display the verification codes.

If the user is not able to scan the QR code then they may opt to enter the setup key manually directly in the authenticator app. 

Users may also indicate that they need help installing an authenticator app. Three apps are offered by default. Scanning of the QR code with the camera of the mobile device will direct the user to the corresponding app store. 

Users must press the Next button when their authenticator app is configured through the QR code scan or after the direct input of the setup key. 

The configuration screen will present the list of the one-time use backup codes The backup codes are also available for the other verification methods including email, text message, and call.

The backup codes are stored directly in the user account. Each backup code can be used one time only as an alternative to the verification code in the situations when the mobile device with the authenticator app is not available and there are no other means of getting a verification code. Button Save will create a file with the current set of backup codes. Button Generate will produce a new set of backup codes. It is recommended to print the backup codes and have them stored in the safe place.

Users complete the configuration by pressing the Enable button. This will result in the request to enter a verification code. Type in the verification code displayed in the authenticator app or get the code via email. Successful input of the verification code will enable the 2-factor authentication for the user account. The backup codes are not accepted during the setup verification. The objective of the setup verification is to ensure that the user is able to get the verification codes with the selected methods of delivery

Living With 2-Factor Authentication

The application will still require the user to enter the username and password in the custom or standard Login form.

Successful identification of the user will present the request to input the verification code. The user may opt to enter a one-time use backup code as an alternative to the verification code. Input of the incorrect verification or backup code will count as a failed login attempt. Multiple failed attempts to verify the username and password will result in the locked user account.

If the device can be trusted then the further requests to input the verification code can be suppressed by selecting the “Trust this device” option. The encrypted cookie with a unique verification code associated with the user name will be created. The application will verify the code stored in the cookie after the successful sign in to confirm the user identity.

Selection of the verification method may reveal the Get Verification Code button. The verification code is delivered when the button is pressed. 

The setup screen can be re-entered by choosing the same “2-Factor Authentication” option in the user context menu. Users will be greeted with the verification code input screen before the setup options are presented. Users may change the verification code delivery methods, download the backup codes, or generate a new set of backup codes. Changes will be saved after another successful verification code input.

Disabling 2-Factor Authentication

Users may disable the 2-factor authentication by withdrawing the consent to enter a verification code. The withdrawal of the consent in the setup screen will disable the 2FA for the user account when the Save button is pressed.

The multi-factor authentication can be permanently disabled in the application by setting the server.2FA.enabled option to false in the ~/app/touch-settings.json configuration file. 


2FA requires the additional data to be stored in the user account in the application database. If you have enabled the standard membership feature in your Code On Time app, then there is no need to do anything else. The application will store the 2FA setup in the Comment field of the user membership account.

The screenshot below shows the Comment field of the admin user configured for multi-factor authentication. 

If the custom membership manager is configured for the Code On Time application, then make sure to map the Comment logical field to the corresponding column in your own “Users” table.

The application framework provides two methods in the ApplicationServices class to read and write the user authentication data. Developers may override the methods ReadUserAuthenticationData and WriteUserAuthenticationData to store the data elsewhere. 

Verification Code with SMS and Call

Developers may enable three additional methods of verification code delivery in the app. These include sms, call, and dial. Enter the following options in the touch-settings.json file of your application to enable these methods:

Re-enter the 2FA setup and enable the verification code delivery via text message and call. Save the setup.

Verification methods app and email are enabled by default and available on the 2FA setup screen.  Delivery via email will require specifying the SMTP server parameters in Settings | Features | Smtp Configuration section of the project configuration. 

There is no built-in support for sms or voice call delivery of the verification code in the framework. Developers may sign up for the text and voice delivery services from their favorite messaging provider and override two methods in the ApplicationServices partial class.

Method OtpVerificationData must provide the means of verification code delivery for the given username parameter. The implementation below uses the sample static values.

Method OptAuthenticationSendVerificationCode implements the physical delivery of the verification code. The implementation must send the contents of the message parameter to the contact using the code specific to the messaging provider.

Users will initiate the delivery by selecting the corresponding method and pressing the Get Verification Code button. The delivery confirmation message will be displayed at the bottom of the screen. The framework obfuscates the email addresses and phone numbers available in the list of methods.

The dial verification method entered in the server.2FA.verify.dial option in touch-settings.json file. It will provide the user with the phone number to call. Use this delivery method if the live operator will be available to the application users to assist with their identity verification. The operator may enter the one-time use backup code directly into the user account in the Membership Manager or in a custom form. This backup code may be a word or a number that the operator will communicate to the user after their identity is confirmed.

Trust No One 

Developers may force the users to always enter the verification code when signing into the app.

Parameter server.2FA.trustThisDevice must be set to 0 in touch-settings.json to hide the “Trust this device” option on the verification code input screen.

The default value of the parameter is 180. It specifies the number of days during which the user will be able to avoid entering the verification code when signing into the application after the initial verification with the “Trust this device” option. 

If the user has lost access to the “trusted” device then the 2-factor authentication must be disabled and enabled one more time on the user account to invalidate any previous trusts.

Verification Code Length and Period

The default length of the verification code is set to 6 digits that are changing every 30 seconds. Application framework will compare the provided verification code with the codes produced in the 180 second window. 

The length of the verification code, the period of change, and the testing window can be changed like this:

The longer testing window can be specified if the delivery of the verification codes is slower than 3 minutes.

Parameter server.2FA.code.window is provided exclusively for the application. It will generate multiple verification codes in the specified time window to find the match to the verification code provided by the user. 

Do not change the length and period if you expect the end users to work with the authenticator apps from Google or Microsoft. These apps will ignore the parameters and generate the 6 digit code every 30 seconds.

Salesforce Authenticator will respect the length and period parameters. It will correctly generate the 4-digit verification code every 60 seconds as instructed by the app.

Developers can specify their own set of the authenticator apps to be available on the setup screen. Option server.2FA.setup.authenticators is an array of name/url pairs in touch-settings.json. This custom set is presented to the user asking for help with the installation of the authenticator app. Users are prompted to scan the QR code with the device camera, which will present the link leading to the app store directly on the device.

Backup Codes

By default the 2FA setup will produce ten 8-digit backup codes. Developers may opt to configure their own set of backup codes.

This configuration will produce the set of five 3-digit backup codes.

Users must print or save the backup codes and use them if the access to the verification methods selected during the setup is lost.


By default the 2-factor authentication requires the users to opt in. Developers have an option to automatically generate the 2FA setup for the user accounts at the moment when the user is singing in.

For example, the following configuration in touch-settings.json will automatically create the 2FA setup with the email-based delivery of verification codes. 

Users will enter the username and password and press login. The framework will create the 2FA setup if it does not exist. Users will be immediately presented with the request to enter the verification code. The only option to get the verification code is the email. 

Make sure to set up the SMTP Configuration in the Settings | Features of the application. Otherwise users will not be able to access the application.

Applications may support the other methods of verification that can be configured in server.2FA.verify section of touch-settings.json as explained above. Users will need to enter the setup mode through the user context menu to change their verification preferences. 

If a user withdraws the consent to enter the verification code, then the application will perform the automatic setup during the next sign in to keep the user accounts protected.

Login Without Password

Automatic setup makes it possible to disable the requirement to enter the password during the setup. Set the server.2FA.disableLoginPassword to true and server.2FA.setup.mode to auto in touch-settings.json. Optionally specify the automatic setup methods. The default setup method of verification code delivery is email.

The built-in login form will not ask the user to enter the password.

The framework will locate the user account by name. If the user is found, then the automatic 2FA setup is performed when needed. The user will be asked to enter a verification code to sign in. 

The initial verification is done via email. Users may opt to enable the authenticator app verification in the setup. We recommend also setting the server.2FA.trustThisDevice option to 0 to ensure that the verification code is always requested.