INFRALUTION LICENSING SYSTEM RELEASE NOTES  
Version 6.4.1
Fixed sample projects to reference correct assembly versions
Version 6.4.0
Changed all source code to use Visual Studio 2017. 
Fixed issue with Load and Save buttons not working correctly for UWP Authenticated Licenses
Fixed indenting of XML in license file for UWP Applications
Fixed possible unhandled exception when loading licenses if the license is no longer valid.
Version 6.3.2
Added Czech, Polish, Portugese and Korean translations.
Fixed issue where cancelling while creating a new Distributor leaves a phantom Distributor  with name "__New__"
Fixed possible Argument out of Range Exception when opening Product Dialog following upgrade
Fixed issues with scaling on high DPI displays
Version 6.3.1
Fixed missing help reference documentation.
Version 6.3.0
Added support for licensing Universal Windows Platform (UWP) components and applications. 
Fixed possible ObjectDisposedException when selecting items in drop down lists.
Version 6.2.0
Added support for IPN.NET JSON interface.  Requires IPN.NET 4.1 to be installed. 
Version 6.1.3
Added Russion translations for Infralution.Licensing assemblies
Fixed issue with Load License button not saving the authenticated license file if the license cannot be reauthenticated by contacting the authentication server.
Fixed issue with updated expiry dates (set by IPN.NET for subscriptions) not being imported into License Tracker unless the user had reauthenticated the license.
Version 6.1.2
Updated samples for VS2015
Changed License Tracker licensing to allow use of RDP sessions for non server operating systems.
Version 6.1.1
Added Chinese (Simplified) translations for Infralution.Licensing assemblies
Fixed issue when importing IPN.NET data where resetting (deleting) the IPN.NET database could cause new sales data to be imported against the wrong customer.  
Version 6.1.0
Added AtomicAuthenticateAndInstallKeyWithData and AtomicReauthenticateAndInstallLicenseWithData methods to allow applications that use Clone Detection to safely pass application data to the authentication server without having to override GetApplicationData().
Added option to cancel uninstall of a license if the license cannot be deauthenticated by contacting the Authentication Server.
Fixed issue with Background Reauthentication interval being incorrectly calculated depending on the local time zone. 
Fixed possible exception in BackgroundReauthenticationThread if the reauthentication interval is greater than 58 days.
Fixed possible issue (for very long running applications) where Background Reauthentication does not detect license expiry if the license expires after the application is started.
Fixed issue, when reporting web exceptions during authentication, where the size of the error message box could become so large that the OK/Cancel buttons would disappear off-screen.  
Version 6.0.2
Fixed Start Local Authentication Service link in License Tracker start page so that it works with Visual Studio 2012 and 2013. 
Version 6.0.1
Added Spanish translations for Infralution.Licensing assemblies used by the application. 
Fixed EvaluationDialog.AutoSize so that it resizes correctly.
Fixed issue with German translation for AuthenticatedLicenseInstallForm not fitting.
Version 6.0.0
Added Detect Cloned Computers option.  If enabled, then a background thread re-authenticates the license and the authentication server checks that the license is not being used on multiple cloned computers with the same Computer ID.  This option prevents virtual machine cloning or changing the name of a computer to allow a license to run on multiple computers with the same name.   The option can be turned on or off on a product basis or for an individual license.
Added Block Terminal Services option.  This option can set for a product or an individual licence to prevent applications using the license running in a terminal services or Citrix session.   
Added Max Deauthentications period option. This option allows you to specify the number of days over which the Max Deauthentications limit applies.  So, if the period is set to 365 days and the Max Deauthentications is set to 1 then the customer could uninstall and transfer the license to another computer at most once per year.  After this they would have to contact support to get you to deactivate the license for them.
Add explicit support for floating licenses to License Tracker.   You can now set the number of floating licenses to include in an authenticated license in the Key Generation tab for the product.  This allows you to work with floating licenses more easily within License Tracker.
Added an alert to the Product View in License Tracker which is displayed if changes have been made to the Authentication parameters or IPN.NET parameters for a product and the remote server has not yet been updated with the changes.  The alert includes a button to update the remote servers.  This helps ensure you don’t accidently forget to update the remote servers after making changes.
Added AuthenticatedLicenseException as base class for all exceptions raised by AuthenticatedLicenseProvider and AuthenticationService.   This makes it easier to trap authentication specific exceptions.
Added LicenseRevokedException.  This is now thrown by AuthenticatedLicenseProvider.Reauthenticate (instead of returning null) if the license is no longer authenticated on the given computer.  Existing code that calls the Reauthenticate method directly should be changed to handle AuthenticatedLicenseExceptions.
Changed the Product dialog to lock product password parameters if license keys already exist for the product.  This prevents possible errors when later trying to delete or modify the existing license keys.
Added Backward Compatibility selection to Product dialog for authenticated licenses.  This enables the user to select the minimum version of ILS that applications must be compiled against to be compatible with the authenticated license file.  Features that were not available in the selected version are automatically disabled.
Added new StartBackgroundReauthentication/StopBackgroundReauthentication methods.  These support the new Detect Cloned Computers option.  Developers should consider converting existing application that use StartBackgroundAuthenticationCheck to use this method instead.  The method includes an option to specify the time span since the license was last authenticated.  This enables the re-authentication to be done after a specified interval (eg once per day) rather than every time the application is run (reducing the load on the Authentication Server).  
Added overloaded RemainingAuthentications method that takes an EncryptedLicense (instead of an authentication key).   This allows applications to call this method without having to store the authentication key.
Added the Product Name in the CustomGeneratorData. Custom Generators for License Tracker and IPN.NET need to be recompiled for compatibility with version 6 of ILS.
Added ability to select, copy and paste ProductInfo, AuthenticationData and ApplicationData in License Tracker
Added error messages if you attempt to deactivate or set authentication limits or data for license keys which don’t support this function.
Fixed error when changing the Customer for a Sale in the Customer tab using the dropdown box.
Version 5.11.2
Fixed bug which meant that an error (The license file contents have been modified and the license is no longer valid…) would be displayed when authenticating licenses on client systems which have the system locale is set to a culture which uses the Buddhist calendar (eg Thai).
Fixed issue with WPF Evaluation Dialog not being displayed in the centre of the screen.
Changed WPF Authenticated License Install Form to be resizable (same as the Windows Forms version) and fixed issues with Computer ID text box being clipped in German culture.
Version 5.11.1
Fixed bug (introduced in version 5.11.0) which meant that filtering in License Tracker on product, category or distributor did not work correctly.
Added ability to filter customers in License Tracker by product using And or Or logic.
Fixed issue with an InvalidOperationException (cross-thread operation) being thrown sometimes when the AuthenticationLicenseInstallForm is called from a Visual Studio Tools for Office (VSTO) application.
Fixed possible NullReference exception when creating a Sale in License Tracker if Filter Data Automatically option is enabled and the user cancelled the Filter Sales dialog displayed after first selecting the Sales tab.  
Version 5.11.0
Added ability to filter license keys by Serial No and Expiry Date.
Added Filter Data Automatically option. If selected then, when the Customer, Sale or License Key tab is first selected, the filter dialog is shown automatically to allow a subset of data to be selected.   In addition when new customers or sales are created, the filter is automatically changed to display only the new item.  This option is useful with slow database connections to minimize the amount of data that needs to be transferred between the database server and client.   
Improved the performance of License Tracker when using remote SQL Server database connections by reducing the number of queries.
Made Generate License Keys dialog resizable
Changed Auto Load Child Records option to Load Child Records on Expand 
Fixed possible out of range exception when editing sale if the quantity had been set to zero via the Sales/Evaluation view
Fixed display of OK/Cancel buttons in Distributor dialog tabs
Version 5.10.2
Added improved support for High DPI display settings to License Tracker.  
Fixed issue installing standalone Authentication Server database on SQL Azure platform.
Fixed issue where key generation would fail without an error message if the License Tracker license was uninstalled and you then generated keys, while in evaluation mode, for a product that did not use the password “TEST”.
Version 5.10.1
Fixed bug in License Tracker Authentication > Configure Server function which caused an error to be incorrectly reported when configuring an Authentication Server which is connected directly to the License Tracker database.
Fixed bug which could cause the wrong Authentication Server URL to be used when creating license keys for a product if the Authentication Server URL was changed without then opening and saving the product.  
Fixed possible timeout exception while authenticating license keys if the Authentication Server is configured to connect directly to the License Tracker database and a Product dialog is opened in License Tracker.
Fixed License Tracker delete function so that it only contacts Authentication Server to delete license keys when the server is not connected directly to the License Tracker database.   This speeds up deletion of license keys in this case.
Fixed bug in Product.CreateLicenseKey(s) methods (in Infralution.Licensing.Data).  The expiryDays parameter was not being recorded in the LicenseKey record.
Version 5.10.0
Added DisableExpiredLicenses option.  This option can be unselected if you want licenses to remain valid after the expiry date has passed - for instance if you want to use the expiry date for maintenance or support.
Moved AuthenticatedLicense.IsValid function to AuthenticatedLicenseProvider.IsValid. This method now also returns true if the license status is Expired and the DisableExpiredLicense option is false.
Removed error message/question when loading a license file if reauthentication of the license fails because there is no internet connection.
Fixed issue in Outlook integration with Outlook 2012.  Previously if you used the Outlook > New Email or Outlook > Forward Email functions they would work once but subsequent Outlook operations would fail with an “RPC server is unavailable” error.
Fixed installation error (invalid object name 'sysconstraints') when installing License Tracker database on SQL Azure cloud platform.
Fixed display of licensing errors in Trace output for ASP.NET applications
Version 5.9.3
Changed License Tracker to show keys which have an expiry date older than the current date as disabled (greyed out).
Fixed issue with Authenticate License File function in license tracker not setting the license key expiry date (for keys where the expiry date is set a number of days after first authentication) when authenticating locally if the authentication server is offline.  
Fixed the Authentication Server to increment the RevokedAuthenticationCount for a license key if an authentication fails because the license key has expired.  Previously the AuthenticationCount was incremented in this case even though the authentication had failed.
Fixed the Upload Authentication Data option (in Authentication > Configure Server) so that license keys which have had an ExpiryDate, AuthenticationData or Authentication limit set are uploaded.  Previously only license keys which had been authenticated were uploaded, which meant an authentication database rebuilt using this function was missing this information for unauthenticated keys.
Version 5.9.2
Added ability to locate customers in License Tracker Customer tab and drop down lists by typing the last name.   The selected customer changes as you type the first few characters of the name.
Add ability to send emails to customers based on the selected license keys.  This allows you to use license filtering criteria (such as authentications) to select customers to be emailed.
Added option to Authentication Import dialog to filter the displayed license keys to show only those keys with authentications since the last import.
Added option to IPN.NET Import dialog to filter the displayed sales to show only those sales made since the last import.
Version 5.9.1
Fixed issue where a license key for a Variant Product could appear duplicated in License Tracker if it was authenticated before the sales data was imported from IPN.NET.
Fixed error when importing ShareIt sales data (bug introduced in Version 5.8)
Fixed LicenseUtilities so that when the source code is included in a project it no longer requires AuthenticatedLicenseProvider to also be included in the project.
Version 5.9.0
Added CustomGeneratorData.ExpiryDays property to support custom generators setting license key expiry dates based on the first authenticated date.   
Added LicenseKey.ExpiryDays field to the database to allow license key expiry dates based on the first authenticated date to be set for individual keys and variant products
Changed AuthenticationService.SetAuthenticationLimits method to take an ExpiryDays parameter.
Fixed License Tracker configuration wizard to handle upgrade of databases which were originally created in SQL Server 2000. 
Fixed possible creation of duplicate license keys if the authentication server is incorrectly configured in License Tracker as Remote when it is actually connected directly to the License Tracker database.
Changed Authentication Server so that, when connected directly to the License Tracker database, it will not authenticate license keys that have been removed from the database.
Added public AuthenticatedLicense.VerifySignature method to allow a license signature to be verified without having to validate the license on the machine.
Fixed License Tracker Sales Trend report so that when grouping by month it accounts for the difference between UTC and local time. 
Fixed date conversion bug in License Tracker Database configuration wizard when copying data from an SQL database to an Access database
Version 5.8.1
Fixed conversion of Sale dates to UTC when importing from file or Outlook
Fixed error when deactivating a license key that has never been authenticated.
Version 5.8.0
Added ability to Deactivate authentications instead of deleting them.  This enables you to keep track of which computers a license key has previously been authenticated on.   Previously to transfer a license you had to delete the previous authentication.
Added Revoked Count to authentications.  This enables you to track exactly which computers are calling IsAuthenticated or Reauthenticated after the authentication has been deactivated.   
Added Deauthenticate call to AuthenticationService and AuthenticatedLicenseProvider. This enables a client to deactivate a license (provided that the number of deactivated authentications is less than the Max Deauthentications limit).  This method is now called when the user uninstalls a license using the AuthenticatedLicenseInstallForm.
Added MaxDeauthentications property for authenticated licenses.  This allows you to determine the number of license keys that can be deactivated by the end user uninstalling a license.  After this limit is reached the authentication status is set to Deauthenticated however the authentication must be deactivated using License Tracker.  For backward compatibility and maximum security the default is zero.
Added ExpiryDate property for authenticated licenses.  This provides out of the box support for creating time limited licenses.  Previously to create time limited licenses you had to embed the expiry date in the AuthenticationData or ProductInfo.   Products can be configured to calculate the expiry date based on a number of days from when the key is generated or from when it is first authenticated.
Added new AuthenticatedLicenseProvider.GetLicense overload methods which return the license even when if the license status is not Valid.  This enables the AuthenticatedLicenseInstallForm to display more informative status text for the license (including the expiry date) and for invalid licenses to be uninstalled by the user.  It is the responsibility of the caller to check the license status.  See the updated sample projects for the recommended usage.  The GetLicense(bool returnValidLicenseOnly) method is deprecated but retained for backward compatibility.
Added Remote Database option to Configure Authentication Server and Configure IPN.NET Server dialogs.  This allows you to explicitly specify whether the Authentication and IPN.NET Servers connect directly to the License Tracker database or use their own remote databases.  This enables calls to the web services to be avoided (for example when setting Authentication Limits) when they are not required.
Added StartBackgroundAuthenticationCheck and StopBackgroundAuthenticationCheck methods to AuthenticatedLicenseProvider.  These provide a simple way to start a background thread that checks if a license is still authenticated.  This prevents users using a license file on a machine after it has been deactivated.
Added warning to sales dialog when cancelling a sale in which license keys were generated to prevent inadvertent use of license keys which are not recorded in the database. 
Changed LicenseKey.MaxAuthentications and Product.KeyMaxAuthentications fields to be nullable integers (with a null value indicating inherit from parent product).  Previously these fields used a magic value of -1 to indicate inherited values.
Changed License Tracker database to store Sale.Date and LicenseKey.IssueDate in Universal Time (UTC).  This enables multiple clients in different time zones to be able to correctly interpret date/times and fixes issue with Dates/Times from IPN.NET.  Existing local dates/times in the database are changed to UTC by the License Tracker database installer.
Added DateDifferenceFromUtc property to import definitions to allow Sales Import definitions to specify the number of hours (+/-) difference from UTC of the dates being imported.
Improved synchronisation between remote IPN.NET database and License Tracker database.  Details of sales can now be changed in License Tracker after being imported without causing the sale to be recreated when importing all IPN.NET data.  
Changed Infralution.Licensing.Data.Product.CreateLicenseKey methods to call AuthenticationService.SetAuthenticationLimits and AuthenticationService.SetAuthenticationData for each generated license key (if required).  Previously applications using the CreateLicenseKey methods had to call these methods to upload data to the authentication server after generating keys if the server was not configured to connect to the license tracker database directly.
Changed Custom Licensed Application sample project to Custom Authenticated Application and changed Custom Generator sample to demonstrate using AuthenticationData to pass custom license data to the application.
Fixed issue with "Record is deleted" error message occurring when sorting memo columns (AuthenticationData, ApplicationData and Comments) containing large amounts of data.   Access cannot handle sorting memo fields with large amounts of data so sorting of these columns has been disabled.
Fixed error when importing sales data where the sales import definition contains multi-level Xpaths (eg “Transaction/payment_date”)
Fixed issues (in Firefox browser) with selection and upload of license files in AuthenticateFile.aspx page
Fixed issue with compiling source code for Authentication Server when CHECK_ILS_LICENSE compilation constant is removed.
Version 5.7.0
Added support for passing Application Data to the authentication server when authenticating via offline file (ie if web authentication is not possible). Changed AuthenticatedLicense constructors to add applicationData parameter. 
Added option to include Application Data in the license file when it is authenticated
Added AuthenticateFile.aspx page to Authentication Server to allow customers to authenticate license files offline (on another computer) themselves.  
Fixed possible Cryptographic exception on some machines when validating licenses.
Version 5.6.1
Fixed importing of CSV sales files which use spaces in column headers
Added Avangate sale import definition 
Version 5.6.0
Changed name of the AuthenticationService DeleteAllAuthentications method to DeleteLicenseKey.  This method now deletes the license key record as well as the authentication data from the server.   This prevents an issue where keys that have been deleted from the License Tracker database are recreated, when importing data from the authentication database, if the key had been authenticated.
Fixed issue with ICustomGenerator.GetLicenseKeyData always receiving null customer and sales objects - even when generating license keys for a specific sale.
Added Evaluation, IsUpgrade and Price properties to CustomGenerator.ISale interface.  Existing custom generators will need to be recompiled to work with this version of License Tracker.
Version 5.5.4
Implemented ISerializable interface in EncryptedLicense and AuthenticatedLicense to enable license classes to be remoted and serialized.
Added filtering of License Keys by Authentication Data, Product Info and Comments
Added filtering of Sales by Comments
Fixed sample license service so that the name shown in the Event log is correct (“Sample License Service” not “Service1”)
Changed License Tracker to use Virtual Tree 4.4.0.
Changed License Tracker Authentication Data column so that it no longer auto fits the row height to the content.    Previously this caused the license key rows to be very large if the Authentication Data contained new lines.
Changed License Key Generation dialogs to allow longer ProductInfo strings to be entered – limited only by the size of the generated license key fitting within the database string field.  Previously the maximum length ProductInfo that could be entered was 100 characters.   Using SQL Server which has a maximum string field length of 450 the maximum ProductInfo which can be used is now around 160 characters (depending on other License Parameters).
Version 5.5.3
Fixed bug in AuthenticationServer GetAuthenticationData method which caused an error if called for a license key which did not already exist in the Authentication database (because no Authentication Data was specified when the key was created in License Tracker).
Fixed AuthenticatedLicenseInstallForm so that the Install button is disabled when the license key text box is cleared after a license key is installed.
Version 5.5.2
Fixed error if the Authentication -> Import Data from Server menu is used when the Authentication Server is configured to connect directly to the License Tracker database.
Fixed Null Reference exception after creating a new Sale in License Tracker if the Start tab was displayed when the Sale was created.
Fixed License Tracker Database Configuration wizard to display local 32 and 64 bit SQL Server instances in the Server selection dropdown (previously it would only display 32 bit instances in the drop down). 
Fixed text of the progress message when importing sales from IPN.NET
Version 5.5.1
Fixed error when upgrading Version 4 databases to Version 5.5.
Fixed error in Version 5.5.0 using an SQL Server database when creating new Products in License Tracker.
Fixed error when configuring Authentication Server if Upload Authentication Data option is selected and the Authentication Server is configured to connect directly to the License Tracker database.
Version 5.5.0
Added AuthenticatedLicenseProvider.Reauthenticate method.  This allows an existing license to be re-authenticated to send new ApplicationData to the server and receive updated AuthenticationData.
Added UpdateAuthenticationData method to the ICustomGenerator interface.   This allows support of custom interfaces for setting the Authentication Data.   Existing custom generators will need to be updated to use the new interface and recompiled. 
Added Product Categories.  This allows you to define primary and secondary categories for product.   These can then be used for filtering and reporting sales by category instead of product.
Added Active flag to products which can be set via the Product Dialog (Category tab) or the Product View.   This flag determines whether products are displayed in the drop down list when adding new sales or generating new license keys. 
Added And/Or option when filtering Customers by Product or Category.   This allows you to easily locate customers who have purchased a particular combination of products.
Added Save Password option to the License Tracker install wizard for SQL databases.   If the password is not saved then each time License Tracker is run you are prompted to enter the password.
Added Group by Region option to the Sales by Country report.    
Added Link Upgrade from/to Sales function to Edit menu in License Tracker.   This allows you to link an upgrade Sale with the Sale that was upgraded.   This enables you to track whether sales have been upgraded (sales that have been upgraded are greyed) and navigate between linked sales using the new Goto Upgraded to/from Sale functions in Edit menu. 
Added options to Sales Filter dialog to allow filtering based on the new Link Upgrade functionality.
Added Command Line Key Generation sample application to demonstrate using the Infralution.Licensing.Data API to create Customers, Sales and License Keys in the License Tracker database
Added verification prompt when selecting the Use New Configuration Key option when configuring Authentication and IPN.NET Servers to prevent inadvertent use of this option.
Changed filtering for products to display product hierarchy and make selection of related products easier. 
Changed report options to be persistent.
Changed Authentication Import Data from Server mechanism to import data for all products in single round trip (where possible).   This greatly increases the speed of importing authentication data when you have many products.
Changed Authentication Server URL so that it is set in a single location in License Tracker (in the Configure Authentication Server dialog) rather than for each individual product.   This makes it much easier to change between testing using a local authentication server and a public authentication server.
Changed License Tracker so that all interactions with the Authentication Server and IPN.NET Server are done on a background thread to improve responsiveness of the user interface.
Fixed error (Cannot find the object “LicenseKeySale”) when upgrading Authentication Server using SQL Server database from version 5.0. 
Fixed bug in Customer and Product dropdown lists which could result in the customer or product for a Sale or License Key being inadvertently changed if the in place editor was activated but no selection was made.
Fixed directory which Dutch resources (nl) are installed in.
Fixed issue with Revoked Authentication count not being imported correctly from Authentication Server.
After installation of the new Authentication Server assemblies you must run the Install.aspx page to upgrade existing authentication databases to the current schema.
Version 5.4.2
Fixed issues with IPN.NET if it is configured to connect directly to the License Tracker database.
Version 5.4.1
Fixed bug (introduced in 5.4.0) causing errors when authenticating licenses and configuring the Authentication Server if the Authentication Server is setup to use an SQL Server database.  
Version 5.4.0
Added support for Windows 8 and Visual Studio 11 
Fixed installer so that Infralution.Licensing assemblies are displayed in the Add Reference dialog under the .NET tab for Visual Studio 2010.
Fixed and eliminated Code Analysis warnings in client classes (using Microsoft Managed Recommended Rules).
Added overloaded EvaluationDialog.ShowDialog methods to allow usage pattern similar to that for the LicenseInstallForms. 
Fixed issue with importing AuthenticationData and MaxAuthentications from a remote Authentication database when these have been set by an external application (such as IPN.NET).  Previously these were only imported for key after it had been authenticated.
Version 5.3.1
Fixed issue with opening forms inherited from AuthenticatedLicenseInstallForm in the Visual Studio designer (in Version 5.2.0 and 5.3.0 this would cause a LicenseProvider not set exception).
Fixed ASP.NET samples to reference the correct version of Infralution.Licensing.ASP assembly
Version 5.3.0
Added FirstAuthenticatedDate property to AuthenticatedLicenses and to LicenseKey field in the database.  This allows you to implement time limited licenses based on the date that the license key is first used.
Add Set Authentication Data menu item to License Tracker.   This allows you to set or change the Authentication Data for selected license keys after they have been generated.
Fixed error when configuring Authentication Service if there are no products using Authenticated licensing in the License Tracker database.
Version 5.2.0
Added Sample License Service and Floating License Application sample projects that demonstrate implementing a Floating Network License solution using ILS.
Restructured EncryptedLicenseProvider and AuthenticatedLicenseProvider classes to eliminate the use of the static/shared SetLicenseParameters method.   This makes using multiple instances these classes (particularly in multi-threaded apps) much cleaner.  The classes now require using a constructor that takes the license parameters and the name of the license file.   It also simplifies the EncryptedLicenseInstallForm and AuthenticatedLicenseInstallForm.  These now define ShowDialog methods that take the license provider as a parameter.   This is a breaking change.  Client code that uses these classes will need to be refactored to create an instance of the LicenseProvider (passing the license parameters and license file in the constructor) and then pass this license provider to the install form ShowDialog method.  See the sample projects for the recommended implementation.
Fixed issue with French translation of Authentication Error message.
Fixed WPF Evaluation Dialog message. 
Fixed error when authenticating license keys for Variant Products when the Authentication Server is connected directly to the License Tracker database. 
Fixed error when authenticating license keys when the Authentication Server is connected directly to the License Tracker database and the license key is not in the database (ie it was generated externally or deleted)
Version 5.1.2
Fixed issue with insufficient space for French translation of Computer ID in AuthenticatedLicenseInstallForm.
Added Dutch translations for Install Forms
Add localized resource assemblies to the GAC during installation so that that localized resources are found automatically when running sample projects.
Fixed issue with main window hiding behind other windows after importing or configuring Authentication and IPN.NET data.
Fixed handling of null product passwords in the database
Fixed License Tracker Configuration Wizard so that it remembers the SQL Server Name correctly next time it is run.
Updated License Tracker to use Version 4.2.0 of Virtual Tree.
Version 5.1.1
Fixed error displayed if you attempt to use the IPN.NET Import Data from Server menu when you have configured IPN.NET to connect directly to the License Tracker database.   
Fixed exception when upgrading Version 3 and earlier databases.
Version 5.1.0
Greatly improved performance of License Tracker when connected to an SQL database via a slow network connection.
Added Auto Load Child Records option to License Tracker which can be turned off to further improve performance when there is a slow connection to the database.  If this option is off then child records are not loaded in the tabbed views until you click the expand icon.  If there are no children the expand icon disappears when clicked on.
Fixed possible Cryptographic Exception when opening products that were created in Version 4 of ILS
Fixed database constraint exception when deleting Sales from License Tracker when using an SQL Server Database backend.
If you use IPN.NET and have configured the IPN.NET Server to connect directly to the License Tracker database then you must upgrade IPN.NET to Version 3.1 for database compatibility.
After installation of the new Authentication Server assemblies you must run the Install.aspx page to upgrade existing authentication databases to the current schema.
Version 5.0.2
Fixed documentation for including WPF source code in your own project.
Fixed possible exception when configuring Authentication and IPN.NET Servers if the machine running License Tracker uses a locale with a different numeric format to that of the host running the server.
Fixed possible SecurityException when configuring the Authentication Server when it is hosted in partial trust environments that don’t provide KeyContainerPermission
Version 5.0.1
Fixed exception starting License Tracker if Show Start Page option is unchecked.
Fixed License Tracker source code so that Virtual Data and Virtual Tree components are licensed correctly.
Fixed issue with Sales Trend graph not displaying correctly when there are a very large number of products.
Version 5.0.0
Added direct configuration of remote Authentication Servers (ie Authentication Servers using a separate standalone database).   This means that you can now add or change products in License Tracker and upload the changes directly to a remote Authentication Server without having to upload an XML configuration file or restart the service.
Split Infralution.Licensing assembly into separate assemblies for each platform (Windows Forms, WPF, ASP.NET and CF).  This enables WPF applications to reference the assemblies (or use the source code) without requiring a reference to the System.Windows.Forms or System.Web assembly.  This also enables ILS to be used with .NET 4 Framework Client Profile.
Added WPF versions of license install forms and evaluation dialog.   This allows better visual integration of the licensing windows with WPF applications and means the reference to the System.Windows.Forms assembly is no longer required.    
Added direct configuration of IPN.NET Servers.   IPN.NET Version 3 now supports reading product data either directly from the License Tracker database or from a remote database that can be configured from License Tracker using the IPN.NET->Configure Server menu.
Added AuthenticatedLicenseProvider.GetProductInfo method.  This contacts the Authentication Server to decrypt a license key and extract the ProductInfo from it without actually authenticating the license.
Added Authentication Data for authenticated license keys.  This enables you to specify string data that is uploaded to the Authentication Server and passed to the application as part of the Authenticated License when the license key is authenticated.    The application can access this data via the AuthenticatedLicense.AuthenticationData property.  This enables you to pass much larger amounts of information to an application then is possible with ProductInfo without impacting the size of the license key.
Added Application Data for authenticated license keys.  This enables the application to pass back string data to the Authentication Server when a license key is authenticated.   This is done by either calling the new AuthenticatedLicenseProvider.AuthenticateKeyWithData method explicitly or by overriding the AuthenticatedLicenseProvider.GetApplicationData method.   The Application Data can then be imported and displayed in License Tracker.  
Changed source code projects to use Visual Studio 2008 (classes can still be used in Visual Studio 2005 projects if required). 
Added Start tab to License Tracker with links to forums, FAQs and sample projects (this can be optionally turned off).
Changed License Tracker configuration tool to automatically create a distributor and sample products if the existing database is empty,
Removed the simple License Key Generator tool from installation.  The existence of two different applications for generating license keys caused confusion for some customers and all functionality is now available through License Tracker.
Updated License Tracker user interface with new icons and larger toolbar buttons. 
Decoupled filters used for sales reports from those used for displaying sales in the Sales tab of License Tracker.   This allows you to change the filters for reporting without affecting the sales displayed in the Sale tab.   The default sales filter for Sales Trends now displays sales for the last year.
Enhanced the License Tracker Goto Customer function so that if the selected customer is not currently displayed you are asked if you would like to clear the customer filter.
Added Match Partial Text and Auto Apply options to filter dialogs.  These options allow you to quickly narrow a search for a customer or license key by just typing a few characters - without having to use wildcards.
Changed Set Authentication Limits dialog so that the authentication limit defaults to the current value of the selected license key.
Changed EvaluationDialog so that if EvaluationMonitor.CountUsageOncePerDay property is true the UsageCount (ie number of days actually in use) property is used to control the evaluation period instead of the elapsed DaysInUse.
Changed display of revenue and prices to use the currency formatting specified for the current windows user via the control panel.
Changed handling of authentication data in Authentication Server and License Tracker so that for a given license key only unique authentications (ie on different computers) are recorded and displayed.   For each unique authentication a record is now also maintained of the total number of times the key has been authenticated on the computer and first and last date it was authenticated.
Added authentication statistics for License Keys:
•	Authentication Count - total number of different computers the key has been authenticated on
•	Failed Authentications - total number of attempts to authenticate the key which have failed (because the Max Authentication Limit was exceeded)
•	Revoked Authentications - number of times IsAuthenticated has been called for the license key and returned false
Fixed issue with deleting Products which have multiple levels of variants when using an SQL Server database.
Version 4.7.3
Fixed issue with AuthenticatedLicenseInstallForm not displaying the correct computer ID when using a custom license provider.
Fixed License Tracker crash on XP if Service Pack 2 for .NET 2.0 is not installed
Fixed issue with Sales Trend graph not displaying correctly when there are a very large number of products.
Version 4.7.2
Removed set accessor from EvaluationMonitor.CountUsageOncePerDay property.  This property must be set in the constructor.   The set accessor had no effect.
Fixed bug in Sale Dialog which resulted in an exception if you set focus to the License Keys list before generating keys
Changed License Tracker Customer View to autofit the row height to the data for better display of multiline addresses
Version 4.7.1
Added support for Microsoft Active Accessibility (MSAA).
Fixed sample VB.NET Authenticated Web Application projects (added missing Handles clause to Page_Load method)
Fixed exception when using Copy to Clipboard menu with a Sale selected.
Changed sample authenticated licensing settings to use a MaxAuthentications limit of one (was two).
Version 4.7.0
Changed ILS Help/Documentation to be standalone (CHM) rather than integrated with the Microsoft Visual Studio 2005/2008 help system.   This enables the ILS documentation to be viewed when using Visual Studio 2010 (which uses a different help system to VS2008) and also means Visual Studio is no longer required to view the help documentation.
Added Visual Studio 2010 Sample Projects
Added support for running local Authentication Server using Visual Studio 2010 ASP.NET development Server
Changed Copy to Clipboard to so that you can select and copy authentication and customer data as well as license keys
Changed License Tracker Authenticate License File function so that if it is unable to connect to the Authentication Server it gives you the option of authenticating the license file locally.   This means that you are always able to authenticate license files - even if your authentication server or connection is down.
Version 4.6.3
Fixed issue with SQL Server version of Authentication Service that could result in duplicate authentication records being created if you used the License Tracker Authentication Export Data function
Fixed issue with Authentication Export Data function not exporting data for Variant Products.
Fixed documentation for LicenseUtilities.Checksum and added overload Checksum method that allows you to specify whether the returned checksum string should be padded to the maximum length.
Version 4.6.2
Changed exception handlers for EvaluationMonitor so that if SuppressExceptions is false the call stack is preserved when the exception is re-thrown
Fixed permission check in RegistryEvaluationMonitor.ReadData to handle possibility of different permissions being set on sub-registry paths which previously could cause the RegistryEvaluationMonitor to fail in some circumstances. 
Fixed issue with importing Authentications and filtering by date with SQL Server database backend under some non-English cultures.
Version 4.6.1
Fixed issue with configuring IPN.NET Settings when the current locale uses a comma for decimal point.  This would produce settings that could not be read by IPN.NET.
Fixed exception when opening Sale Dialog if the price exceeds $10000.   The maximum price accepted is now $1000000 which should cover most customers!
Fixed issue with splash screen remaining open if there is an error opening the License Tracker database.
Fixed issue with License Tracker window not opening as the top window when License Tracker is started in some circumstances.
Fixed issue with saving AuthenticationServerSettings.xml and IpnSettings.xml files from License Tracker when running Italian user interface.
Fixed issue with local development Authentication Server not starting correctly under Windows x64 and some non-English operating system installations.
Version 4.6.0
Restructured EvaluationMonitor as an abstract base class with two derived classes (RegistryEvaluationMonitor and IsolatedStorageEvaluationMonitor).   The IsolatedStorageEvaluationMonitor class provides an implementation of the EvaluationMonitor class for situations when registry access may not be available (for instance when developing web applications or components that need to run under partial trust).  Applications that previously created instances of the EvaluationMonitor will need to be recoded to use the RegistryEvaluationMonitor.
Changed EvaluationDialog constructor methods to take the EvaluationMonitor as a parameter.   This decouples the EvaluationDialog code from a direct dependence on the RegistryEvaluationMonitor implementation and allows it to be used with any implementation of EvaluationMonitor.  Applications that used the old EvaluationDialog constructors will need to be recoded to create an instance of the RegistryEvaluationMonitor and pass it to the EvaluationDialog constructor.
Added extra parameter to EvaluationMonitor class constructors to allow optional suppression of exceptions when reading/writing evaluation data to persistent storage.
Changed RegistryEvaluationMonitor to dynamically change the registry key used to store the evaluation data each time it is saved - making it more difficult to manually delete the registry information.
Added IsAuthenticated method to AuthenticatedLicenseProvider and AuthenticationService.  This enables applications using authenticated licensing to check whether the authentication for the license has been removed from the Authentication Service.
Changed Authentication Server to allow it to be configured to use either a separate Authentication database (as with previous versions) or to integrate directly with the License Tracker database.   This second (new) option is useful if you are running the Authentication Server on your own server with access to the License Tracker database as it eliminates the need to import data from the Authentication database.
Added Authentication Export Data to Server menu to License Tracker.   This allows you to recreate the separate Authentication database by exporting data from the License Tracker database.   This is potentially useful if you lose your Authentication database and do not have a backup.
Added License Tracker Configuration Wizard.   This is now automatically run by the installer at the completion of setup and allows you to configure (and upgrade) the database you are using for License Tracker.  The wizard can create (or upgrade) either SQL Server or Access (JET) database and also allows you to migrate data from an old database to a new type.  
Added Maintain Selection on Sort menu option to License Tracker.   Unchecking this option can significantly improve performance when sorting large data views by clicking on the column headers (particularly when using SQL Server).   If unchecked the current selection (and expansion state) is lost when the view is resorted.   The option is unchecked by default if you are using an SQL database.
Added Import buttons to License Tracker Distributor dialog to allow Sale and Evaluation Import definitions to be read from file directly.
Fixed License Tracker import mechanism so that it ignores license keys for Products with LicenseType set to None.
Fixed License Tracker New Sale dialog so that if a customer is selected in the main window then the same customer is automatically selected in the dialog.
Add splash window to License Tracker. 
Version 4.5.1
Changed License Tracker filter dialogs to only display products which have the Import as Base Product option unchecked.   This avoids cluttering the lists with product variants that are only used for importing sales data.
Changed License Tracker New Sale dialog so that, if a sale or license key is selected, the customer associated with the selection is automatically selected when the dialog is displayed.  Previously this only occurred if a customer was selected.
Changed License Tracker Generate License Keys dialog so that if a Product or Distributor is selected in the main window this product or distributor is automatically selected in the dialog.   
Changed License Tracker Generate License Keys and Import License Keys dialogs so that only those products with License Type not set to none are displayed in the dropdown list.
Fixed issue with licensing ASP.NET modules using Authenticated Licensing where the computer ID (host name) that the license is linked to could vary depending on how the web page was accessed.   The AuthenticatedLicenseProvider.GetComputerID method now strips the leading "www." from the hostname and returns the name lowercase always.   The IsThisComputer method has also been modified to ensure that existing license files will continue to work.  This change may mean that if a customer re-authenticates their license key on a domain for some reason the new authentication will be counted separately.   In this case you can delete the original authentication using License Tracker.
Increased the License Tracker database field size allowed for Product Names to 100 (was 50)
Fixed issue with setting proxy server when running under partial trust that could cause authentication of license keys to fail.

Version 4.5.0

Added conditional code blocks to LicenseUtilities.ShowError method to allow you to eliminate the dependency on System.Windows.Forms when including the source code directly to your application.   If you define the ILS_ERRORS_WPF compilation constant then System.Windows.MessageBox will be used (instead of System.Windows.Forms.MessageBox) for displaying errors.  If you define ILS_ERRORS_TRACE_ONLY then errors will be written to trace output only and there is no dependency on System.Windows.Forms or System.Windows.   

Added support for new MaxAuthentications option in IPN.NET.  If set then IPN.NET will call the AuthenticationService.SetAuthenticationLimits  web service method to set the maximum number of allowed authentications for each key generated.   This allows you to create product variants that have different Authentication Limits to the base product.   For instance you could generate a license key that can be authenticated on 10 computers and sell it for a different price to a license which can only be authenticated on one computer.

Added sample projects demonstrating licensing WPF applications.
Fixed issues with connecting to the authentication service when client is running Microsoft ISA Proxy Server requiring credentials

Version 4.4.1

Turned off Expect100Continue option for the authentication service point as this causes an error (417 - Expectation failed) when connecting to the Authentication Server through some proxy servers.    

Removed additional AuthenticationServer namespace.

Version 4.4.0

Added EmailFolder to License Tracker Import definitions.   This allows you to specify the email folder (eg \Personal Folders\My Sales) that should be searched when importing sales and evaluations from Outlook.   The default if no folder is specified is to search the Inbox.   

Added ability to import evaluations directly from Outlook.

Added wrapper methods to AuthenticationService class (and removed extraneous designer generated code) to make it easier for application code to call Authentication Web Service methods if required.

Added RemainingAuthentications method to Authentication Web service.   This enables applications to check the number of authentications remaining for a license key if required.

Changed LicenseUtilities so that it will compile without requiring AuthenticatedLicenseProvider class if CHECK_ILS_LICENSE compilation constant is not defined.   This means that applications using Encrypted Licensing do not need to include the Authentication classes.

Added ability to edit comments for license keys from both customer and sales views in License Tracker

Changed License Tracker to use version 3.12.1 of Virtual Tree.

Version 4.3.2

Fixed bug in License Tracker that caused an "Invalid Query" exception while importing Authentications with certain locales.

Fixed typo mistake in LicenseResources ('filewall' instead of 'firewall').

Fixed conditional compilation block in LicenseUtilities to allow ILS source code to be included directly in IPN.NET project if required.

Version 4.3.1

Changed AuthenticatedLicenseProvider.IsThisComputer method to be case insensitive.   This addresses an issue with ASP.NET applications where the case of the Host Name could change depending on whether the client browser is local to the server.

Fixed potential Cryptographic exception in RSACryptoServiceProvider.VerifyHash when validating licenses if the license parameters have changed.   This exception is now caught and VerifyHash returns false.

Changed VB.NET sample projects that use the Application Framework so that EvaluationDialog appears on top of the Splash Screen (if used) and the application exits properly when the exit button is clicked.

Version 4.3.0

Added ShowBackgroundLogo setting to LicenseTracker.exe.config file.  This allows licensed users to disable the display of the background Infralution logo.   This may improve scrolling performance when using License Tracker in conjunction with Terminal Services or other remoting software.

Added Authenticated Web Application sample projects to demonstrate using Authenticated Licensing for a Web Application.

Changed AuthenticatedLicenseProvider to allow use of different RSA parameters for validating license keys and authenticating license files.  Use of different RSA parameters means that even if your Authentication Web Service is hacked the cracker cannot obtain the parameters used to generate license keys.  To force the use of different RSA parameters for an existing product,  change the Authentication Password and save the product, then reopen the product dialog and set the Authentication Password back to the original password.    You should  then regenerate the license parameters to include in the code and regenerate the AuthenticationServerSettings.xml file and update your Authentication Server.  If you force the use of different RSA parameters using this technique, License Files authenticated using previous versions of ILS will continue to work however installation of new licenses will require code compiled using your new Authenticated License Parameters.

The license for  ILS itself has been changed to use separate RSA parameters as described above.   This means to install a license key for ILS on a new machine you must use this version of ILS (4.3.0 or later).   Existing licensed installations can be upgraded to Version 4.3 without having to re-install the license.

Version 4.2.2

Added French translations for Authenticated Licensing  

Fixed AutoSize behaviour for EvaluationDialog to ensure that the last line of the message is displayed.

Fixed possible SQL exception when filtering customers, sales or license keys by product (with large number of products)

Fixed permissions issue with using standard Microsoft RSACryptoServiceProvider in some partial trust environments.  The Infralution.Licensing assembly now defines a plug compatible version of the RSACryptoServiceProvider which will run in partial trust enviroments.

Version 4.2.1

Fixed issue with error logging/reporting for errors that occur while writing the license file.  

Version 4.2.0

Added option for SQL Server backend for Authentication Server.  

Added Authentication Server install page to install (and upgrade) database.

Fixed issue with setting Authentication Limits and removing Authentications for variant product license keys in License Tracker.  These functions failed silently for license keys issued for variant products.   

Version 4.1.0

Added ability to create Product Variants.  These use the same licence parameters as their associated base product but can have different ProductInfo, Product Reference numbers and IPN.NET parameters.  

Added Italian translations for License Tracker and License Key Generator applications.   To use these just set your regional options to Italian and start the application.

Added Italian, German and French resources for Infralution.Licensing assembly.  
Fixed potential exception when importing sales data from an Outlook inbox containing a large number of mail items (250+).

Changed default Show Upgrades Separately option to false for sales reports

Note that if you are using IPN.NET you should upgrade to Version 2.1 for compatibility with this version..

Version 4.0.2

Fixed License Tracker exception when generating license keys from Sale dialog with SQL Server backend.

Changed EvaluationDialog to ensure that ExtendedTrialDays is always greater than TrialDays

Version 4.0.1

Fixed exception when sorting License Key view by Distributor or Max Authentications columns.

Fixed issue with Product Dialog Cancel button not reverting changes if the Generate Validatation Parameters or Configure Authentication Server button had been pressed.

Added GenerateRuntimeKey method to EncryptedLicenseProvider.   This allows applications to make use of the distinction between Design Time and Runtime licenses.   An application could, for instance, generate runtime licenses to embed a document or file that could then be used to verify that the file was produced by a licensed version of the application.

Version 4.0.0

Added support for AuthenticatedLicenses (as an alternative to simple EncryptedLicenses) using the new AuthenticatedLicenseProvider class.  Authenticated Licenses require the license key to be authenticated (by contacting an Authentication Web Service) before the license is installed on a machine.   Authenticated licenses can be locked to a specific computer name or other hardware characteristics and are individually signed using an RSA Key to provide maximum security. 

Added EvaluationDialog.  This provides a convenient way to display evaluation information to the end user and allow them to install a license.

Changed LicenseInstallForm to EncryptedLicenseInstallForm (to distinguish it from the new AuthenticatedLicenseInstallForm) and refactored it to allow it to be used to change and uninstall existing license keys (as well as install new license keys).    Customers who have built applications using the previous LicenseInstallForm can either continue using their existing form (which is still source code compatible) or change their code to use the new EncryptedLicenseInstallForm.

Renamed protected EncryptedLicenseProvider.LoadLicense method to ValidateLicense for consistency.

Added C# and VB.NET Formatting options to the Licence Parameter dialogs.   These format the License Parameters for easy inclusion in your application code.

Added Save Settings and Load Settings options to License Key Generator to allow the current settings to be saved to a file and reloaded later.

Added IPN.NET tab to License Tracker Product Dialog.   This tab allows you to quickly generate the settings required for generating license keys using Infralution's optional IPN.NET payment processing backend for PayPal.

Added EncryptedLicenseParameters class to encapsuate all parameters required to generated and validate license keys.  Changed EncryptedLicenseProvider.GenerateKey method to take an EncryptedLicenseParameters object as a parameter.   This simplifies the code needed to generate keys and make it more resilient to future changes.  It is also consistent with the new AuthenticatedLicenseProvider class.

Added ShortSerialNo license parameter.   This provides control over the size of the unique serial number included in license keys.   If this parameter is set to true then the maximum size for a serial number is 65535.  If false the maximum serial number is 2147483647.   For backward compatibility with previous versions of ILS the default value is true.

Added EncryptedLicenseProvider.InstallLicense methods that take an EncryptedLicense parameter instead of a license key.

Separated common logic from EncryptedLicenseProvider and AuthenticatedLicenseProvider into LicenseUtilities class.  This class must be included in your application project if you are compiling the source code into your application.

Moved Checksum method from EncryptedLicense to LicenseUtilities.

Moved UseMachineKeyStore property from EncryptedLicenseProvider to LicenseUtilities.

Added HandleIOExceptions property to LicenseUtilities.  This allows control over whether ILS will handle IO Exceptions when reading and writing license files and display error messages.   If this is set to false then it is left to the application to handles these exceptions.   The default is true.

Moved string resources for forms and dialogs into LicenseResource.resx.   LicenseResource.resx and LicenseResources.Designer files must be included in your application project if you are using the predefined forms and dialogs and compiling the source code into your application.

Removed the EncryptedLicenseProvider.GenerateLicenseParameters method.  The XML parameters string required to call the EncryptedLicenseProvider.SetParameters method is now generated by creating an instance of EncryptedLicenseParameters and calling the WriteToString method.

Add  MaxLicenseKeyLength property to License Tracker config file.  This allows users using an SQL Server backend to increase the maximum license key that can be stored by the database up to a maximum of 4000 characters.  In this release SQL databases are automatically upgraded to change the length of the LicenseKey ProductInfo and Key fields to a maximum length of 450 characters.   This is the maximum SQL field length that can still support indexing.   The fields can be increased (using SQL Server Management Studio) to support more than 450 characters, however this causes the index to be removed and may adversely affect performance.

Changed License Tracker Sales and Evaluation Import dialogs to allow selection and import of multiple files

Changed License Tracker Filter dialogs to be modeless.   This allows you to interact with the main window while the filter dialog remains open.

Changed LicensedApp and LicensedControl sample projects to use new EvaluationDialog

Changed LicenseWebApp sample projects to demonstrate installation of license keys directly via web interface

NOTE:  This is a paid upgrade from previous versions and requires installation of a new license key.  If you are evaluating Version 4 then you should make a backup copy of your Version 3 database to enable you to revert to Version 3 if required.

NOTE: Version 4 source code requires Visual Studio 2005 or 2008 to compile.   Visual Studio 2003 is no longer supported.   Applications built using VS2003 with Version 3 source code can, however, still validate Encrypted License keys generated using Version 4 License Tracker and License Key Generator (the Use Short Serial No option must be set to true for backward compatibility).

Version 3.7.5

Added workaround for a bug in Microsoft's RSACryptoServiceProvider class that could cause lengthy delays when validating licenses (see http://support.microsoft.com/kb/948080) under some circumstances.  The EncryptedLicenseProvider now uses VerifyHash instead of VerifyData.
Changed declaration of TextEncoding enumeration to use the PUBLIC_LICENSE_CLASS define

Version 3.7.4

Updated to use version 3.10.1 of Virtual Tree to fix issue with License Tracker not displaying records when User Locale is set to Turkish.

Softened License Tracker background image.

Version 3.7.3

Updated to use version 3.10.0 of Virtual Tree.

Updated dialog images in help

Version 3.7.2

Fixed problem in EncryptedLicenseProvider.ILSLicense causing a SecurityException calling GenerateKey from an ASP.NET application.

Fixed issue in EvaluationMonitor when called from a Network Service under Windows Vista

Changed License Tracker SQL Server schema.  Comments columns type changed from ntext nvarchar(MAX) to allow sorting.   Previously sorting on the comments columns when using an SQL server backend would cause an exception.

Added config file for SQL Server Express.

Removed unused reference to System.Windows.Forms in EvaluationMonitor class

Version 3.7.1

Fixed issue in VB source code for EncryptedLicenseProvider.ReadKeyFromFile which meant Base32 encoded license keys could not be read after they had been installed.

Updated the PayPalIPN.xml import definition to use the PayPal ItemNumber as the Product reference instead of the item name.

Version 3.7.0

Restructured Custom Generator mechanism to support use of Custom Generators for both License Tracker and IPN.NET.   The Custom Generator interfaces and types are now defined in the Infralution.Licensing assembly and the LicenseTracker.API assembly has been removed.  Customers who have implemented Custom Generators for License Tracker will need to update and recompile them when upgrading to this version.

Enabled Row Headers for Customer, Sale views to enable rows to be resized to display multiline data

Enabled drag selection of rows in various views.

Fixed issue causing fatal framework error on Windows x64 if you call ValidateLicenseKey with an empty license key.

Version 3.6.1

Added Visual Studio 2008 Sample projects

Version 3.6.0

Added Copy Email Addresses to Clipboard and Select All menus to Edit Menu.

Added CountUsageOncePerDay property to EvaluationMonitor and added additional constructor with this as a parameter.   If CountUsageOncePerDay is set to true then the UsageCount and LastUseDate values are only updated once a day.   This allows you to create evaluations that depend on the number of days that a product is actually used (by checking the UsageCount).  So if a user installs your product then goes on holidays their evaluation period will still be valid provided the number of days they have actually used the product has not exceeded the allowable value.   For backward compatibility the default value of CountUsageOncePerDay is false.

Changed EvaluationMonitor.UsageCount so that it is initially one (instead of zero).
Added Base32 TextEncoding option.   This allows keys to be encoded using Base32 (instead of Hex) resulting in shorter keys (minimum length of 26 chars vs 32 chars for Hex encoding). 

Improved performance of EvaluationMonitor locating evaluation data in the registry.  To see the effect of the performance improvement you may need to use a new ProductID.   

Version 3.5.2

Fixed reference in Sample Web Application project

Updated License Tracker to use the latest version of Virtual Tree and Virtual Data Objects

Version 3.5.1

Changed EncryptedLicenseProvider to fallback to using the Machine Key Store for the RSA Crypto Service Provider if the default User Profile Key Store fails for some reason.   Some users have reported that very rarely on some user systems (about 1 in every 5000 user systems) creating an RSA key using the default key store store fails.   This change provides a fallback solution in these cases - without having to set the EncryptedLicenseProvider.UseMachineKeyStore property explicitly.

Version 3.5.0

Changed default location of ILS License to a directory under the common application data directory.   This allows non-admin users to install the license under Vista. 

Changed the default location of the License Tracker database (License.mdb) to the Infralution\ILS subdirectory of the common application data directory.  This enables use of License Tracker by non-admin users under Vista.   License Tracker will continue to use existing databases (if present) in the Program Files\Infralution Licensing System\License Tracker directory to support existing users.

Changed all License Tracker dialogs and windows to remember their last position and size and restore to that location next time they are opened. 

Added confirmation prompt in License Tracker when deleting license keys that have been sold to customers

Changed License Tracker key selection list (from Sale Dialog) to a List View to allow sorting and selection by serial number

Added double click action for direct editing of Customers, Sales, Products and Distributors in License Tracker

Fixed EncryptedLicenseProvider.GetLicenseDirectory to handle case where the application assembly is in a root directory.

Changed Installer to use self-extracting executable which bundles bootstrapper with the MSI.   This overcomes permission issues when installing on Vista and also eliminates the problems that can occur if installing from mapped drives.

Modified VB Licensing Classes so that they can be compiled under VS2003 or VS2005

Changed LicenseInstallForm so that web address can be specified with or without hhtp moniker.

Note:  Customers who have created License Tracker custom generators will need to recompile them to use this version of License Tracker.

Version 3.4.4

Fixed exception when calling Sale.DistributorName and Sale.ProductName from within a License Tracker custom generator if the sale had not been previously saved.

Added Cancel flag to LicenseKeyData.  This allows License Tracker custom generators to abort the generation of license keys.

Changed License Tracker generation of keys to allow the user to enter Product Info and Comments when generating keys for a sale.

Changed EncryptedLicenseProvider.InstallLicense method to create license directory if it doesn't already exist.

Changed LicensedApp sample code to illustrate installing licenses in shared Common Application Data directory

Version 3.4.3

Added ImportCulture option to Sales Import definition.   This allows you to specify the culture to use when importing sales data allowing import of data that uses non decimal point separator.

Version 3.4.2

Fixed exception when creating new Products with an SQL Server backend.

Version 3.4.1

Fixed issue in License Tracker with Include Product Info Checksum option.  It was not being saved in the database.

Version 3.4.0

Added Include Product Info Checksum option to the License Key Generator and License Tracker Product Dialog.  If ticked ILS will automatically generate a checksum of the Product Info included in a license key and validate this when the license key is read.   See comments below:
If the length of the Product Info included in a key is less than 7 characters then the decryption algorithm ensures the validity of the Product Info.   For longer Product Info, however, the block nature of the encryption algorithm means that successful decryption is not a guarantee of the validity of the Product Info.  This meant that if a user, when entering a long license key, made a mistake in the portion of the key containing the Product Info data this may not have been detected.  Note that this did not affect the security of the system since the user still had to correctly enter the portion of the license key which is validated using public encryption - but it did mean that the application may get garbled Product Info.   Including a Product Info checksum in the license key allows the integrity of the Product Info to be guaranteed in these circumstances.  For backward compatibility with license parameters generated by previous versions of ILS this option should be left unticked.
Added productInfoChecksum parameter to GenerateKey and GenerateLicenseParameters methods (see discussion above).
Restructured EncryptedLicenseProvider source code to eliminate some duplication and rename some internal methods/variables more appropriately.
Version 3.3.3
Fixed issue with importing sales/evaluation data when regional settings are set to certain locales.  
Version 3.3.2 
Fixed InvalidRecord exception thrown if you open an existing Sale, remove a license key then generate another.
Fixed problem in VB source code causing FormatException in EncryptedLicenseProvider.SetParameters.   Note this did not affect C# source code. 
Fixed Compact Framework VB source code to add conditional compilation directive InstallForm.
Added missing text in help section Component and Control Licensing
Version 3.3.1 
Fixed issue in EvaluationMonitor that could cause the evaluation to expire, or become invalid, if the user changes the DateTime format (or locale) of the computer after first using the software.  This fix is backwardly compatible, however it may be necessary for a user affected by this problem to run the software once under the original locale to reset the evaluation data.
Fixed PayPalIPN import definition to handle summer date format
Version 3.3.0 (Visual Studio 2005 only)
Converted all source code to Visual Studio 2005.  This provides us with a single development platform and allows License Tracker to take advantage of new features only available in VS2005.  If you still need to support VS2003 applications you can still use this (and later) versions however you will need to compile against the Version 3.2 DLL or once you have puchased you can include the licensing classes directly in your VS2003 application code.  These classes are still VS2003 compatible.  Existing applications compiled using V3.2 and earlier versions remain compatible with licenses generated by V3.3.
Added automatic Revenue and Sales summaries to the License Tracker status bar - and a menu option to control whether they should be displayed
Added graphical Sales Trend and Sales Breakdown (by product, distributor and country) reports to License Tracker
Add the ability to generate and store license keys for Evaluations.   This means that if you generate evaluation license keys you can now use License Tracker to record and manage them.
Modified the mechanism for importing Evaluations to use the Sales import mechanism.   This means that there is now a single format for importing sales and evaluation data and allows license keys to be imported for Evaluations (if present).   A ramification of this change is that existing Evaluation importer definitions will no longer work.  You will need to change any evaluation importer definitions for each distributor.  The ImporterDefinitions folder contain the new definition for importing evaluations from ShareIt. 
Merged the Sales and Evaluation tabs in License Tracker.  This allows you to display Sales and Evaluations in a single view and also enables the advanced reporting features added for Sales to be used for tracking Evaluations.  You can still display either Evaluations only or Sales only by using the Sales filtering options.
Removed the dependence on the OpenNETCF library for Compact Framework applications.   The Compact Framework licensing classes now use the new encryption classes included in .NET 2.0.
Added ASP.NET Sample Project
Version 3.2.2
Fixed issues with using SQL Server as the database backend 
Version 3.2.1
Fixed issue in EvaluationMonitor that could cause the Invalid property to incorrectly be set in rare circumstances due to registry permissions issues
Fixed License Tracker Filter Evaluations menu to open the dialog
Version 3.2.0
Added options to License Tracker Customer filter dialog - allows filtering by most customer fields and filtering by sales to selected products and distributors.
Added Sale filter dialog to License Tracker - allows sales displayed in the Sales tab to be filtered by date, product, distributor and customer fields
Added License Key filter dialog to License Tracker - allows license keys displayed in the License Keys tab to be filtered by product, distributor
License Tracker Toolbar buttons now indicate when a filter is active.
Added Expand Selected Items and Collapse Selected Items menus to License Tracker
Added PayPal IPN importer definition to allow importing of data from Infralution's IPN.NET PayPal integration.
Added inplace editing of product and distributor for sales and license keys to License Tracker
Changed License Tracker to use version 2.6.1 of Virtual Tree and version 1.1.3 of Virtual Data Objects.   These improve browsing and editing performance when many customer nodes are expanded.   This should also resolve the InvalidOperationException exception experienced by some customers when using multiple instances of License Tracker. 
Changed EncryptedLicenseProvider.LoadLicense method from private to protected virtual to make extensibility easier.
Added UseMachineKeyStore property to EncryptedLicenseProvider.   This allows you to force the use of the machine key store for the RSA keys used to encrypt/decrypt licenses.  This can be useful when impersonating or running under an account whose user profile is not loaded.
Version 3.1.0
Added AllowPartiallyTrusterCallers attribute to the assembly and added exception handler in GetLicenseKey  to allow use of the DLL with non-fully trusted web applications.  
Added CLSCompliant attribute to assemblies.  Note that this required minor changes to the signatures of the following methods and classes:
•	EncryptedLicenseProvider.GenerateKey - serialNo parameter changed from UInt16 to Int32
•	EncryptedLicense constructor - serialNo parameter changed from UInt16 to Int32
•	EncryptedLicense.SerialNo - changed from UInt16 to Int32
•	LicenseInstallForm - underscore removed from protected form variable names
Added status bar to License Tracker containing details of the number of matching and selected items
Added Upgrade field to Sales.  This allows you to indicate whether a particular sale is an upgrade from a previous version
Added Price field to Sales.  This will facilite tracking of basic sales data in future releases. 
Modified import definitions to import Price and Upgrade fields if available
Changed cursor to "wait" when starting Outlook integration operations that can take some time to initiate.
Version 3.0.0
Added the ability to set the KeyStrength.   This allows you to determine the length of the encrypted password used to generate and verify license keys.  A larger KeyStrength produces more secure keys that are more difficult to crack using brute force approaches.  A smaller KeyStrength produces shorter (but less secure) keys.   License keys can be generated for applications using previous versions of ILS by using the default KeyStrength of 7.
NOTE:  This is a paid upgrade from previous versions and requires installation of a new license key
Version 2.2.5
Changed License Tracker Sale Import so that it no longer changes the Product "Last Serial No" field value.  This value determines the next serial number to use when generating license keys from License Tracker.  This change provides support for pregenerating some keys (using License Tracker) for some distributors while having other distributors use a license key generator.  To do this the license key generator should start generating license keys at serial number distinct from the pregenerated values.
Added ability to edit the Product "Last Serial No" field.   This allows more control over the license key generation process from within License Tracker.
Fixed License Tracker Sale Import function to support multiple purchase items of the same product within a single import file.  Previously the duplicate checking done by License Tracker meant only the first purchase item would be imported.
Fixed NullReference exception when generating keys from an unlicensed version of License Tracker.
Version 2.2.4
Fixed exception in License Tracker sales import if LicenseKeyTag is not set
Changed to use latest version of Virtual Tree.
Changed License Tracker to automatically select newly added customers, sales, products and distributors 
Version 2.2.3
Recompiled to use latest version of Virtual Tree and Virtual Data - this fixes issues with flickering when scrolling using the keyboard
Added restricted Virtual Tree and Virtual Data licenses for purchasers of License Tracker source.
Version 2.2.2
Fixed compilation warnings in that occur under VS2005 for VB classes
Version 2.2.1
Added overloaded EncryptedLicenseProvider.GetLicenseKey(context, assembly, type) method that allows you to check for licenses in a specific DLL assembly.    This is useful if you are licensing a control or component and want to allow your customers to use it in their own component or control without requiring that their customers have a license for your control.
Fixed null reference exception when using new EncryptedLicenseProvider.GetLicense(parameters, filename) method from ASP.NET applications.
Fixed bug in LicenseTracker Import License Key dialog that caused an exception when importing keys 
Version 2.2.0
Added overloaded EncryptedLicenseProvider.GetLicense method to simplify licensing of applications.   Applications no longer need to use the LicenseProvider attribute and LicenseManager methods.  Applications can now call the EncryptedLicenseProvider.GetLicense and EncryptedLicenseProvider.InstallLicense methods directly and specify the name of the license file (instead of providing a type).   This makes it much easy for application developers to specify the name and location of the license file.  The application samples have now been updated to illustrate the new approach.  Existing applications, licensed by type will continue to work.
Added overloaded convenience methods (EncryptedLicenseProvider.GetLicense , EncryptedLicenseProvider.InstallLicense and EncryptedLicenseProvider.ValidateLicenseKey) methods that take the license parameters as an argument.  These can be used as an alternative to calling EncryptedLicenseProvider.SetParameters before calling the corresponding method.
Added support to the LicenseInstallForm for the installing licenses by giving a filename (rather than a type).
Added LicenseInstallForm.AllowMultilineKeys property.   This allows you to specify whether multiline keys can be entered in the install form.  The default for this is now false (because allowing multiline keys can be confusing for the end user).
Fixed EncryptedLicenseProvider.ReadKeyFromFile to handle case where keys are split across multiple lines.
Fixed issue with EncryptedLicense.CheckSum method generating different values depending on the platform (.NET 1.1, .NET 2.0, CF). 
Fixed issue with installing License Tracker CustomGenerators compiled using VS2005.  Previously these could not be installed if .NET1.1 framework was also installed on the machine. 
Fixed VB licensing classes so that they will compile with Option Strict turned on.
Version 2.1.4
Fixed issue with CryptographicException occuring in some circumstances when calling licensing code from ASP.NET applications.
Fixed issue in LicensedControl samples that would cause the runtime nag message to be displayed when copying and pasting LicensedControls within the Visual Studio designer.
Fixed OpenNetCF cryptographic classes to compile under VS2005.  Previously some classes would not compile under VS2005 because they included references to the Serialization namespace.   The included OpenNetCF classes will now compile under VS2005 albeit with warnings.  The warnings should be eliminated when OpenNetCF release their VS2005 compatible version.
Version 2.1.3
Changed installer so that Setup can be run on systems that have the release version 2.0 of .NET framework installed only.
Added section in help on licensing ASP.NET applications.
Recompiled to use the latest version of Virtual Tree (V2.3.0) 
Version 2.1.2
Added Copy to Clipboard menu item to License Tracker to allow you to select License Keys and copy the key to the clipboard.
Added Go to Customer menu item to License Tracker to allow you to navigate to the Customer in the Customer View from the Sales and License Key Views.
Recompiled to use the latest version of Virtual Tree (V2.1.1) 
Version 2.1.1
Changes to support use of SQLServer for the License Tracker database.  The LicenseTracker.exe.config file can now be configured to set the connection string and other parameters required to change the backend database. 
Version 2.1.0
Added "Generate keys at Point of Sale" option to License Tracker products.  This allows you to generate keys when you create a new sale (instead of pre-generating keys).  It also allows License Tracker to be used with an external key generator.  If the option is checked then keys are automatically created when sales data is imported if they haven't been created previously.
Added support for CustomGenerators to License Tracker.  This mechanism allows you to add your own code to License Tracker to generate the ProductInfo to be embedded in License Keys for a given product.  You can use this to display your own forms that get input from the user and incorporate it and other customer information into the generated license key.
Added Filter Customers option to License Tracker.   This allows you to filter the customers displayed in the customer view based on product purchased and/or evaluated.
Increased the maximum size of the license key that License Tracker can store from 80 to 255 characters.   This means that Product Info can now be up to 100 ASCII characters long before the generated keys will be too long for License Tracker.  Note that unicode characters require more space and using them will reduce the maximum allowable Product Info length accordingly.   
Changed LicenseInstallForm key entry text box to multiline to allow pasting of keys which have been broken into multiple lines by email.
Fixed issue with using LicenseManager.Validate method.   This should cause a LicenseException to be thrown if there is not a valid license.  Instead a NullReference exception was thrown if there was no license because of a bug in EncryptedLicenseProvider.GetLicense
Fixed issue with embedding international (unicode) characters in Product Info.
Changed License Tracker application to use Version 2.0 of Virtual Tree.  This provides some useful new features such as pinning columns.
Fixed installer so that License Tracker application can be installed on computers which don't have Visual Studio installed on them.
Version 2.0.4
Fixed issue with location of license files when licensing ASP.NET applications.
Fixed LicensedControl samples to properly ensure LicenseInstall dialogs and nag messages are shown only once.  The previous sample implementation of this logic could result in runtime licenses for the control not being compiled into the application resources in some circumstances.
Changed LicenseTracker Key view to sub-sort by serial number when sorting by Product.  This makes it easier to track which license keys have been sold.
Version 2.0.3
Improved performance of LicenseTracker customer and sales views by changing VirtualTree nodes to load on expand.
Recompiled to use the latest version of VirtualTree and VirtualData.
Version 2.0.2
Fixed exception in LicenseTracker that occurs when the window is resized (or maximized) to display more than about 20 customers. 
Changed LicenseTracker to use Virtual Data Objects library – previously it used it’s own internal predecessor to this library.
Fixed issue with LicenseTracker where user could enter a Product Info string that would result in license keys being generated that were too large for the database field (80 characters) resulting in an exception.  The product info that can be entered is now limited to a maximum of 20 characters.
Fixed installation of documentation short cut under VS2005 Beta2
Version 2.0.1
Fixed problem with LicenseKeyGenerator installing license in the wrong location - this meant that it was not possible to install the license for the LicenseKeyGenerator.
Fixed sorting of Sales and LicenseKeys in LicenseTracker so that when sorting by Product or Distributor the items are sub-sorted by the Date field.
Fixed bug if importing from Outlook and the SaleImporter definition does not include an EmailSubject definition. 
Included required OpenNETCF classes directly in Infralution.Licensing.CF DLL so that it no longer requires the OpenNETCF library to be installed.  This eliminates reference issues that occur when a new version of OpenNETCF is released and makes it easier for users evaluating the Compact Framework licensing DLL.
Version 2.0.0
Added License Tracker application. This provides a complete license and customer management solution including:
•	license key generation
•	management of product passwords and license serial numbers
•	license key tracking - ensure your distributors are not recycling license keys
•	ability to import sales and evaluation data from 3rd party distributors such as Shareit
•	integration with Microsoft Outlook 
Changed EncryptedLicense.ClientID to SerialNo and EncryptedLicense.Product to ProductInfo for consistency with the new license tracker user interface.
Added GenerateLicenseParameters and GenerateKey methods to EncryptedLicenseProvider class.  Previously these methods were only available internally in the source code (LicensingUtilities) of the LicenseKeyGenerator.   These methods allow clients to programmatically generate license keys using the Infralution.Licensing.DLL.  If the Licensing System is in evaluation mode then the only allowed product password is "TEST".
Added Compact Framework DLL (Infralution.Licensing.CF.DLL) to allow full evalution of the the system within the CompactFramework environment.  VB and C# source code is now available for the compact framework licensing classes. 
Version 1.1.1
Recompiled to use release 1.4.0 of Infralution.Common
Version 1.1.0
Added EvaluationMonitor class to provide support for time and usage limited evaluations
Changed EncryptedLicenseProvider.InstallLicense method from static/shared to normal instance method.   This allows derived classes to override methods such as GetLicenseFilePath and GetLicenseKey to change the location that the license key is stored in.
Version 1.0.2
Recompiled to use release 1.3.0 of Infralution.Common
Version 1.0.1
Recompiled to use release 1.2.0 of Infralution.Common
Version 1.0.0
Initial Release