* Added an 'RDMatrix::Modbus' element to the 'RDMatrix::Type enum.
* Implemented a Modbus TCP switcher driver in 'ripcd/modbus.cpp' and
'ripcd/modbus.h'.
* Fixed a bug in 'lib/rdcart.cpp' that caused the 'Import' web API call
to return 404 when importing with 'CREATE' set to '1' and unique titles
enabled in the database.
* Added an rdauth(1) utility in 'utils/rdauth/'.
* Fixed a regression in 'lib/rdcart.cpp' that caused the 'Import'
web API call to fail with an 'unsupported format' error.
* Fixed a regression in 'web/rdxport/rdxport.cpp' that broke
the CreateTicket web API call when connecting from localhost
or the machines registered IP address.
* Added a 'USERS.LOCAL_AUTH' field to the database.
* Added a 'USERS.PAM_SERVICE' field to the database.
* Added an index on 'STATIONS.IPV4_ADDRESS' to the database.
* Incremented the database version to 262.
* Added 'RDUser::localAuthentication()',
'RDUser::setLocalAuthentication()', 'RDUser::pamService()' and
'RDUser::setPamService()' methods in 'lib/rduser.cpp' and
'lib/rduser.h'.
* Added 'PAM Service' and 'Authenticate This User Locally' controls
to the Edit User dialog in 'rdadmin/edit_user.cpp' and
'rdadmin/edit_user.h'.
* Added a PAM service configuration in 'conf/rivendell.pam'.
* Changed the result code of the 'AddCart' service when the cart
already exists from '403' to '400'.
* Changed the result code of the 'EditCart' service when attempting
to set a forced length on a macro cart from '403' to '400'.
* Changed the result code of the 'EditCart' service when attempting
to set a forced length outside of the valid range from '403' to '400'.
* Changed the result code of the 'Export' service when attempting
to export from a cut with no audio content from '403' to '404'.
* Changed the '401' result code of the 'EditCart' service to be 403.
* Changed the '401' result code of the 'DeleteAudio' service to be 403.
* Changed the '401' result code of the 'Export' service to be 403.
* Added a 'CUTS.SHA1_HASH' field to the database.
* Incremented the database version to 261.
* Added a 'Sha1' column to the Cut List in 'rdlibrary/audio_cart.cpp'.
* Added 'RDCut::sha1Hash()' and 'RDCut::setSha1Hash()' methods in
'lib/rdcut.cpp' and 'lib/rdcut.h'.
* Added a '--rehash=' directive to rddbcheck(8).
* Added a 'Rehash' Web API call.
* Added an 'RDRehash' class in 'lib/rdrehash.cpp' and 'lib/rdrehash.h'.
* Added a 'WEBAPI_AUTHS' table to the database.
* Added a 'USERS.WEBAPI_AUTH_TIMEOUT' field to the database.
* Incremented the database version to 260.
* Added 'RDUser::webapiAuthTimeout()' and
'RDUser::setWebapiAuthTimeout()' methods in 'lib/rduser.cpp' and
'lib/rduser.h'.
* Added a 'WebAPI Timeout' control to the Edit User dialog in
'rdadmin/edit_user.cpp' and 'rdadmin/edit_user.h'.
* Implemented a 'CreateTicket' Web API call.
* Fixed a bug in 'lib/rdaudioconvert.cpp' that caused conversions
from MPEG Layer 3 VBR data to be truncated when no end point
was specified.
* Fixed a bug in 'web/rdxport/import.cpp' that caused the
end marker to be positioned incorrectly when importing MPEG
Layer 3 VBR files.
* Fixed a bug in 'rdlibrary/audio_cart.cpp' where the 'Conductor'
failed to be imported from RDXL chunks.
* Added a 'songId' field to the cart metadata XML.
* Added 'RDCart::xmlSql()' and second 'RDCart::xml()' methods.
* Refactored the 'RDCart::xml()' method to use a SQL query.
* Refactored the Cart and Cut web methods in 'web/rdxport/carts.cpp'
to use SQL queries.