tdf#143905: Parse password from connection string

Parse user and password, so its possible to connect to a
firebird server more over embeded and file

Change-Id: Idbfa526e2a29f6f8bed5165f57844350c8b6d127
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/121638
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
diff --git a/connectivity/source/drivers/firebird/Connection.cxx b/connectivity/source/drivers/firebird/Connection.cxx
index cc4ee39..6c150fe 100644
--- a/connectivity/source/drivers/firebird/Connection.cxx
+++ b/connectivity/source/drivers/firebird/Connection.cxx
@@ -211,8 +211,8 @@ void Connection::construct(const OUString& url, const Sequence< PropertyValue >&

        std::string dpbBuffer;
        {
            char userName[256] = "";
            char userPassword[256] = "";
            OString userName;
            OString userPassword;

            dpbBuffer.push_back(isc_dpb_version1);
            dpbBuffer.push_back(isc_dpb_sql_dialect);
@@ -233,28 +233,42 @@ void Connection::construct(const OUString& url, const Sequence< PropertyValue >&

            if (m_bIsEmbedded || m_bIsFile)
            {
                strcpy(userName,"sysdba");
                strcpy(userPassword,"masterkey");
                userName = "sysdba";
                userPassword = "masterkey";
            }
            else
            {
                // TODO: parse password from connection string as needed?
                for (const auto& rIter : info)
                {
                    if (rIter.Name == "user")
                    {
                        if (OUString value; rIter.Value >>= value)
                            userName = OUStringToOString(value, RTL_TEXTENCODING_UTF8);
                    }
                    else if (rIter.Name == "password")
                    {
                        if (OUString value; rIter.Value >>= value)
                            userPassword = OUStringToOString(value, RTL_TEXTENCODING_UTF8);
                    }
                }
            }

            if (strlen(userName))
            if (!userName.isEmpty())
            {
                int nUsernameLength = strlen(userName);
                const sal_Int32 nMaxUsername = 255; //max size
                int nUsernameLength = std::min(userName.getLength(), nMaxUsername);
                dpbBuffer.push_back(isc_dpb_user_name);
                dpbBuffer.push_back(nUsernameLength);
                dpbBuffer.append(userName);
                dpbBuffer.append(userName.getStr(), nUsernameLength);
            }

            if (strlen(userPassword))
            if (!userPassword.isEmpty())
            {
                int nPasswordLength = strlen(userPassword);
                const sal_Int32 nMaxPassword = 255; //max size
                int nPasswordLength = std::min(userPassword.getLength(), nMaxPassword);
                dpbBuffer.push_back(isc_dpb_password);
                dpbBuffer.push_back(nPasswordLength);
                dpbBuffer.append(userPassword);
                dpbBuffer.append(userPassword.getStr(), nPasswordLength);
            }
        }