Qt License Service changelog #################### Changes in 3.4.0 - [QLS-1751] Ensure the daemon clears the cache when a server connection is unavailable - Support qtlicd.ini config migration with the qtlicensetool - [QLS-1777] CIP: Ensure compatibility with pre 3.4.0 service versions - [QLS-1753] Fix unconditional renewal of reservations on startup - CMake: Ensure all libraries are built with -fPIC - [QLS-1637] Prefer latest minor parser version in unified license JSON parsers - [QLS-1771] Fix registration of qtlicd if the settings folder does not exist - [QLS-1659] Fix daemon to correctly read settings containing whitespace within values - 3rdparty: update curl to version 8.12.1 - [QLS-1731] Fix IniFileParser breaking formatting of the file - CIP: provide a method to return the string name of a status code - [QLS-1754] LicenseClient: send -settings-type only for the 'set_settings' operation - mocwrapper: print string representation of errno on failure to call moc - [QLS-1755] mocwrapper: return EXIT_FAILURE on errors when invoking moc executable - [QLS-522] qtlicensetool: fix exit codes on failed operations - [QLS-1730] Pipe: use condition variable to wait for data instead of polling - Fixes excessive CPU usage - [QLS-1278] Support lease renewal policy from the unified license itself - [QLS-1749] Require acceptance of Terms & Conditions to use the license service - Add LICENSES folder and licenseRule.json to adhere to QUIP 18 rules - [QLS-956] CIP: generate a unique UUID for consumer process ID - [QLS-1432] Add support for changing the server URL by clients - qtlicensetool: add convenience options to get and set the server URL - [QLS-1743] mocwrapper: treat errors and failures as warnings - qtlicensetool: fix a crash resulted from constructing std::string from null C string - [QLS-1662] Collect information about the OS architecture - [QLS-1512] CIP: add interface for supporting dynamic settings - Client applications can now change supported settings of the license service - Support changing request_timeout - [QLS-1655] Use dedicated endpoint for sending execution statistics - [QLS-1445] Export qlicensecore library for usage by external applications - Make LicdSetup and InstallationManager usable by external applications - [QLS-1532] Support expired perpetual licenses correctly - ClientHandler: do not send empty consumer_build_timestamp in requests - qtlicensetool: fix output for option -r when there are no reservations - JsonHandler: fix missing details when logging parsing exceptions - [QLS-1525] Add new client library for installation time license pre-check - CIP: Split license info related types to separate header - [QLS-1607] Fix linking binaries built on Xcode 14 and newer on Xcode 13 and older - [QLS-1456] TcpClient: adjust WinSock2 shutdown and socket closure sequence - Fixes errors on some client application disconnections - [QLS-1471] TcpClient/Server: send protocol capabilities as a message header - Enables dynamic buffer size for messages - [QLS-1445] Create new default settings if settings file does not exist - [QLS-1279] CIP: add extension API for license check - Print error log when reservation valid_to and valid_from are not sane #################### Changes in 3.3.2 - [QLS-1605] mocwrapper: do not repurpose existing options of moc - [QLS-1576] UsageStatistics: allow leeway in using a completed statistic - [QLS-1598] mocwrapper: preserve original environment when calling moc - [QLS-1577] mocwrapper: fix handling of quotes on formation of the command string - [QLS-1567] mocwrapper: use Qt framework version as the "consumer_version" - [QLS-1575] TcpClient: fix getting gethostbyname() error details on Unix platforms - [QLS-1572] Fix cip.lock file descriptor inheritance by qtlicd and close it #################### Changes in 3.3.1 - [QLS-1456] TcpServer: fix confusing error logging when POLLERR is set - [QLS-1536] Ensure forward version compatibility of the QLS: - Make CIP version compatibility check only for major version range - CipCommandParser: allow unknown request parameters - Make protocol version compatibility check only for major version range - Make installation.ini compatibility check only for major version range - LicenseJsonParser: do not remove values from response JSON - [QLS-1466] CIP: include client library version in TCP messages - [QLS-1473] Add guard against double release of license - Do not skip fetching license server version if already fetched - Fix incorrect message for ServiceVersionTooNew status code #################### Changes in 3.3.0 - [QLS-1439] CIP: retry TCP connection if the port information was changed after initial attempt - [QLS-1054] CIP: improve error message when no suitable service installation was found - [QLS-1423] TcpServer: fix missing handling for some socket events - libcurl: remove dependency to libssh2 - [QLS-1415] Fix issues caused by creating a file lock for the port file - [QLS-1314] LicenseCache: include daemon version in default cache paths - [QLS-1281] CIP: do not remove port file if license service process is running - [QLS-1350] Update libcurl to version 8.10.1 - [QLS-1404] LicenseCache: fix wrong path for reservation files - [QLS-1347] Send attached consumer properties in renewal request payload - This allows the server to decide if a better license has become available for any of the consumers - [QLS-1334] Allow usage of expired perpetual licenses - [QLS-1306] Windows: make certificate revocation check behavior configurable - This also changes the default behavior from strict to best effor check, an allowed failure case is when the CRL distribution point is unreachable - [QLS-1335] Allow using process based reservation for multiple matching clients - [QLS-1322] Make network request timeout configurable - Avoid creating a temporary copy of the JsonData in JsonHandler - Retry renewal request at later time on request errors - Licenser: fix warning logs for network request errors - [QLS-1324] Replace "restore server connection" mechanism with individual retries for requests - Optimize parsing of license and reservation data for better performance - LicenseCache: print warnings for non-fatal fails on removing directories - TcpClient: fix confusing error message on graceful socket closing - [QLS-1321] Optimize license cache flushing for better performance - Fix renewal event triggering when reservation is already waiting for release - [QLS-1252] Track consumer usage statistics in milliseconds accuracy - [QLS-1254] Attach unique consumer applications to reservation - This allows retrieving the best possible license for clients that have not previously used a cached reservation - CIP: split StatusCode::BadRequest into more meaningful error enumerators - [QLS-1311] Fix incomplete usage statistics left hanging in license cache - macOS: remove obsolete environment variables from service property list - CMake: set to explicitly look for static OpenSSL libraries - TcpServer: fix incorrect destruction of the worker thread - Windows: fix return value check for Winsock functions - Improve error handling and user visible messages from TcpClient - [QLS-1303] CIP: allow app configurable retries in case connecting to service socket failed - Retries are disabled by default - [QLS-1304] Fix wrong username in license requests in high concurrency situations - Licenser: fix dubious condition on network error - CIP: remove dubious error about not being able to open port file - [QLS-1272] Fix daemon not shutting down due to TcpServer missing a notify - Licenser: remove unnecessary disconnection of client on error - [QLS-1302] Increase the maximum count of simultaneously open file handles on all platforms - [QLS-1281] TcpServer: fix limitations with select() based socket monitoring - This fixes several issues in high concurrency situations, where multiple client applications attempt to connect to the service simultaneously - Windows: remove duplicate parsing of log level environment variable - [QLS-1277] mocwrapper: suppress output for successful reservation by default - [QLS-1139] CIP: fix extra quotes in some LicenseReservationInfo values - [QLS-1262] Fix sending extra parameters to daemon via TCP causing crash - Windows: add VERSIONINFO resource file for executables #################### Changes in 3.2.1 - [QTBUG-128491] Utils: fix startDetached() not detaching child process properly - This caused mocwrapper to hang when building with CMake - [QLS-1023] Fix invalid SSL CA path on openSUSE - This caused network requests, and thus license reservations to fail - [QLS-1067] Ask operating system for TCP port instead of searching for a free one - This may have caused false alarms with virus scanners - [QLS-1039] Improve error message details on TCP socket related errors - [QLS-1182] Fix repeating print of search path when importing local licenses - Improve default logging level messages related to license reservation - Logger: fix null characters ending up printed to the log file - [QLS-1064] CIP: fix dubious prints about not being able to open log file - [QLS-1144] CIP: add separate client status codes for SSL related errors - [QLS-1218] CIP: add support for revoking current license - CIP: Use same count of max tries for waiting and starting the service - CIP: Fix error message about not being able to remove non-existent port file - [QLS-1209] mocwrapper: improve user visible messages - [QLS-1217] [QLS-1250] mocwrapper: add fallback mechanism for license check - This can be enabled in case the primary license reservation mechanism fails - [QLS-1208] qtlicensetool: add support for clearing local reservation cache - A workaround until the server is able to automatically switch to a better version of the same license if such becomes available for the user - tools: fix missing build date and revision SHA in binaries #################### Changes in 3.2.0 - macOS: workaround Xcode 15.0 bug causing runtime crash - [QLS-892] Build universal binaries for macOS - 3rdparty: update nlohmann JSON for Modern C++ to 3.11.3 - Change used TLS backend from OpenSSL to Secure Transport on macOS - [QLS-1049] Windows: fix mismatch of getTimezoneOffset() to Unix version - Fix incorrect warning on failed reservation renew - [QLS-359] Collect usage statistics for license consumers - [QLS-671] Add support for periodical synchronization of local licenses to cache - Allow overriding license import directory from env variable - [QLS-1020] Release floating licenses on client disconnection - Changes behavior from previous one, where all license models were released only when reservation expired - [QTCREATORBUG-30840] Fix invalid certificate authority file path on some Linux distributions - [QLS-957] Make protocol (HTTP/HTTPS) decision dynamic again - This reverts QLS-675, there is no more need to configure HTTPS enforcement at build time - [QLS-944] CIP: increase timeout for on-demand service start - Show successful renew and release request on "info" log level - Update server respose code mapping for new "server busy" status code - utils: fix wrong format specifier for log function #################### Changes in 3.1.0 - License validity - [QLS-713] Calculate checksum for cached reservation files - Security fixes - [QLS-675] curl: force HTTPS by default - [QLS-675] curl: require TLS v1.2 or later - [QLS-679] Create directories with stricter permissions - [QLS-677] remove system() calls with non-absolute paths - [QLS-686] HttpRequest: Replace deprecated CURLOPT_PROTOCOLS option - [QLS-681] License: prevent secrets leaking through timing side channel - [QLS-934] Hide sensitive information from logs - Bug fixes - [QLS-784] Windows: prefer %USERPROFILE% for getting the user's home directory - Linux: fix incorrect CA certificate file path for qtlicensetool login - [QLS-886] qtlicd.ini: fix incorrectly quoted default value for ca_bundle_path - [QLS-856] Fix revision SHA missing from official binaries - [QLS-896] Fix logic error on releasing a reservation which has connected clients - [QLS-898] Disconnect clients immediately on reservation expiration - [QLS-897] Fix attempt of new reservation in case license was revoked by server - Clients will make a new license request (once per heartbeat) if the existing reservation becomes invalid - qtlicensetool: disable log prints to file - [QLS-924] Fix on-demand process shutting down after resuming from sleep - Fix UnknownError status codes for LicenseClientPrivate::request() - Building - CMake: Default to BUILD_SHARED_LIBS=off - CMake: require OPENSSL_ROOT_DIR only when building the service library - Disable build curl if BUILD_SERVICE_LIB=OFF - Use UUID generation for hardware id in daemon settings - Removed bundled hmac_sha256 3rdparty library as it becomes unused - Strip release binaries - Other - Logger: reduce amount of file opens for the output stream - [QLS-900] Retry requests for HTTP status code 503 - [QLS-850] Clean up installations.ini file during service shutdown - CIP: add serviceAvailable() function to make fallbacks possible for clients - Print error in case CipCommandParser could not parse input - Windows: add reference for controlling the system service from CMD - HttpClient: increase maximum time the transfer is allowed to complete to 30s - Add "silly" log level for curl debug information - Rename orig_moc(.exe) as qtmoc(.exe) - Support differentiating preview releases in installations.ini - 3rdparty: update libcurl to version 8.7.1 #################### Changes in 3.0.1 - [QLS-883] Linux: fix wrong CA bundle path in prebuilt binaries - [QLS-860] Build License Service against static openssl and curl - [QLS-857] Fix CIP launching on-demand service in a new console window on Windows - [QLS-852] Fix wrong application data path on macOS - [QLS-804] Fix early renewal and late releasing of reservation - [QLS-791] Fix configuration for the license renewal endpoint #################### Changes in 3.0.0 - Coco legacy drop-in support removed - Stop listening the legacy TCP port - Add macOS service support - Documents updated to describe macOS-specifics - Build and install/uninstall scripts updated to handle both macOS and Linux - build_linux.sh script renamed to build_unix.sh - Automatic license resolution - No need for client side 'qtlicenseservice.ini' file anymore - The server decides the suitable license for the client - Long-term reservation behavioral change - The long-term reservation for a give license is controlled by the ACL configuration on the server side - Remove LicenseToolClient class - Unified license model - Initial support for the new license model that will cover all the products and features - Prepare for consumer_reservation_type handling - Update license structure to support process level reservations - Add method to check if "valid_from" time is yet started - [QLS-638] qtlicensetool: reimplement --reservations option for unified license - [QLS-703] Do not allow using licenses where valid_from is in future - Parse license response time information as UTC time - [QLS-726] Set minimum license renewal time - [QLS-538] Create a waiting queue for floating clients - Enable release request - Add renewal mechanism - Limit maximum renewal time of reservation to once per day - Cloud back-end support - [QLS-268] Add QtAccount integration - Force HTTPS for login request - On-demand launch support - Alternative for installing the daemon as a system service. The service will be kick-started by the client apps in the user-space - [QLS-576] Add command line option to start in on-demand mode - [QLS-586] Search for first free TCP port to listen at - [QLS-573] [QLS-574] [QLS-578] Add support for on-demand startup of license service - [QLS-574] Make on-demand service shutdown timeout configurable - [QLS-632] Register service installation to installations.ini - [QLS-695] Remove qtlicd.port in case of invalid port information - License Cache - Cache licenses in a local cache. Supports usage without network connection. - [QLS-518] Introduce LicenseCache and LocalLicense types for caching unified licenses to disk - [QLS-591] Verify license signature - Store retrieved licenses to cache - Prepare to use reservation information from license cache - [QLS-628] Import local license files from $HOME root - [QLS-425] Create "local reservation" for imported licenses - Client API - [QLS-385] Add integration point library for client tools - [QLS-647] Add license renew and release notify mechanism for LicenseClient - Bug fixes - [QLS-440] Fix a bug when client dies before server response - Fix potential nullptr reference - Fix missing reservations query command - [QLS-472] Recover from temporary server outage - TcpClient: do not close socket after successfully receiving data - [QLS-537] Allow permanent reservation for site license only - Retry failed license release requests when server is busy - Fix Windows service start/stop problem - Fix releasing expired reservations on service startup - Licenser: attempt re-reservation for connected clients on renew failure - Fix file logger initialization - [QLS-667] Do not ping the server if server_url is not defined - ClientHandler: fix potential skipping of valid existing reservations - [QLS-607] Windows: Unicode handling fixes - Fix Service hangup in case of empty incoming request - [QLS-725] Fix several possible causes for segmentation faults - [QLS-743] Linux: fix invalid working directory when running as system service - [QLS-755] Fix mocwrapper argument forwarding - [QLS-781] Create lock file directory path - [QLS-783] Windows: fix CRT conflicts - Other - Add support for setting the logging level from env variable - build_windows.bat: support passing CMake generator as argument to script - [QLS-711] Use server response codes instead on relying on string messages - Allow conditional building of subprojects - Generate UUID on macOS using the foundation libraries - [QLS-776] Windows: update libcurl to 8.6.0 version - Include HTTP status codes in logs #################### Changes in 2.1.0 - Remove warning about empty email setting value from legacy coco - Add git sha and build date to version information - Clean up log prints * Changed some info prints to debug ones, in order to reduce log prints in daemon's default operating mode - Minor documentation updates - Add support for setting the logging level from env variable - Do not strip '@' from incoming messages - [QLS-543] Add support for overriding single user settings from environment variables #################### Changes in 2.1.0-rc1 - [QLS-422] Daemon now fetches info for all the available license numbers and their types by sending ping message to the server. * Note: Server 2.2 or above required to reply a ping with license info. * Daemon now relies entirely on server to get info about licenses and their models. * As a backup, daemon stores the newest fetched license info in the file. If no server connection, and no info from the cached license info file, daemon fails to start. - [QLS-440] Additional class created to handle the leftover reservations * Each time floating license is reserved, daemon stores the reservation ID in the file. When client disconnects, the reservation ID is removed. * If something bad happens e.g. daemon crashes, being not able to release the reservations from server, current reservations still stay in the file. Upon daemon restart, the cache file is being read, making it possible to release all those "ghosted" reservations from the server. With empty cache, daemon then starts listening for client apps. - [QLS-360] [QLS-366] Refactored the client classes to reflect license models rather than client app name * Better maintainability and scalability - [QLS-385] Add integration point library for client tools * Migrate qtlicensetool and mocwrapper to use the client library - Remove deprecated support for server address override in the user configuration file - Fix a bug when client dies before server response * Release the reservation normally from the server - [QLS-472] Recover from temporary server outage * Release all clients that disconnected during a server outage, once the server is up again - [QLS-538] Create a waiting queue for floating clients * If the license seats are all used in the server, the floating clients are put in a queue to wait some seats to be freed - Retry failed license release requests when server is busy * In case the server returns with a message indicating busy status, attempt the request again after a small delay - Email not needed with Coco drop-in usage - Update and restructure documentation #################### Changes in 2.1.0-beta3: - Add a feature to release all pending (leftover) floating reservations upon daemon restart - Add process_id field to the server requests, to separate identical requests from each other * Fixes an issue with new server versions which require the process_id #################### Changes in 2.1.0-beta2: - Fix daemon work directory for Windows - Fix unnecessary server requests for clients without valid reservation - Windows: fix allowing binding listening socket to used address - Add new logging functionality * More detailed output and support logging into file - Remove UUID part from the user_id value in license requests (legacy coco) #################### Changes in 2.1.0-beta1: - Prepare for floating license support - Daemon name 'licd' changed to 'qtlicd' - Daemon architecture changed towards more modular approach - Fixed a bug with SSL support - Added HW ID calculation if empty (hw_id now empty by default in qtlicd.ini) - Removed possibility to override license server address from CLI - Concept of "long-term" renamed to "permanent" '-L' switch of qtlicensetool changed to '-p' to reflect the change - Fixed cloud server support - Add qlicenseservice static library for common code - Improvement in TCP/IP server for handling client sockets - Run Licenser instance in its own thread - Add preliminary auto-test suite - Fix segmentation fault after receiving SIGINT signal - Fix issues caused by invoking exit() on non-main thread - Fix of a bug where daemon grants non-valid license - Enable CI for the repository - Fixes to Windows build script - Asynchronous TcpServer and HttpClient - Support drop-in replacement for Coco license server Daemon now listens additional non-changeable port 49344 which is dedicated to coco only #################### Changes in 2.0.4: - Changed daemon response message in case there is no licenses left in the pool #################### Changes in 2.0.3: - Mocwrapper made even less verbose #################### Changes in 2.0.2: - Added this changelog - Implemented support for additional leeway time in case there's no server connection #################### Changes in 2.0.1: - Added a new feature to the qtlicensetool: Get current reservation status - Mocwrapper is now less verbose #################### Changes from 0.xxx to 2.0.0 - 'qtlongterm' CLI tool replaced with a new, more generic 'qtlicensetool' - Long-term functionality added in the qtlicensetool through -L (or --longterm) switch - The qtlicensetool always uses [default] section in the user settings file to get its settings from * Swithces used in qtlongterm command are now mostly optional, to be able to override the [default] ones * See 'qtlicensetool --help' or README.md - Version queries now possible with the qtlicensetool * Version queries from the License Service (daemon), the License Server and the tool itself - The binaries (licd, mocwrapper, qtlicensetool) now accepts --version (or -v) switch - Several under-the-hood improvements for maintainability and robustness