From 4f928a5823b0bc7cd8af1d588e2084ae1ff1543f Mon Sep 17 00:00:00 2001 From: Julien Nabet Date: Sat, 2 Dec 2023 14:38:16 +0100 Subject: Mysql/Mariadb: implement refreshUsers so get access to users admin page There's still work to do: - retrieve privileges of each table since it's empty for the moment - make the checkboxes editable (it seems read only) - make the user management work (creating one doesn't work for example) Change-Id: Ia1d9c4db7faae16ec1903c5d7aa5e679ce5e944a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/160244 Tested-by: Jenkins Reviewed-by: Julien Nabet --- .../source/drivers/mysqlc/mysqlc_catalog.cxx | 25 +++++++- .../source/drivers/mysqlc/mysqlc_users.cxx | 73 ++++++++++++++++++++++ .../source/drivers/mysqlc/mysqlc_users.hxx | 43 +++++++++++++ 3 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 connectivity/source/drivers/mysqlc/mysqlc_users.cxx create mode 100644 connectivity/source/drivers/mysqlc/mysqlc_users.hxx (limited to 'connectivity/source/drivers') diff --git a/connectivity/source/drivers/mysqlc/mysqlc_catalog.cxx b/connectivity/source/drivers/mysqlc/mysqlc_catalog.cxx index d8b9db7422d0..d72ab1f65d72 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_catalog.cxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_catalog.cxx @@ -10,6 +10,9 @@ #include "mysqlc_catalog.hxx" #include "mysqlc_tables.hxx" #include "mysqlc_views.hxx" +#include "mysqlc_users.hxx" +#include +#include connectivity::mysqlc::Catalog::Catalog( const css::uno::Reference& rConnection) @@ -64,7 +67,27 @@ void connectivity::mysqlc::Catalog::refreshGroups() //----- IRefreshableUsers ---------------------------------------------------- void connectivity::mysqlc::Catalog::refreshUsers() { - // TODO: implement me + css::uno::Reference statement = m_xConnection->createStatement(); + css::uno::Reference xUsers = statement->executeQuery( + "SELECT grantee FROM information_schema.user_privileges GROUP BY grantee"); + + if (!xUsers.is()) + return; + + ::std::vector aUserNames; + + css::uno::Reference xRow(xUsers, css::uno::UNO_QUERY); + while (xUsers->next()) + { + aUserNames.push_back(xRow->getString(1)); + } + xRow.clear(); + ::comphelper::disposeComponent(xUsers); + + if (!m_pUsers) + m_pUsers.reset(new Users(m_xConnection->getMetaData(), *this, m_aMutex, aUserNames)); + else + m_pUsers->reFill(aUserNames); } /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_users.cxx b/connectivity/source/drivers/mysqlc/mysqlc_users.cxx new file mode 100644 index 000000000000..62b8ae44836c --- /dev/null +++ b/connectivity/source/drivers/mysqlc/mysqlc_users.cxx @@ -0,0 +1,73 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include "mysqlc_user.hxx" +#include "mysqlc_users.hxx" + +using namespace ::connectivity; +using namespace ::connectivity::mysqlc; +using namespace ::connectivity::sdbcx; +using namespace ::cppu; +using namespace ::osl; +using namespace ::com::sun::star; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::sdbc; +using namespace ::com::sun::star::uno; + +Users::Users(const uno::Reference& rMetaData, OWeakObject& rParent, + Mutex& rMutex, ::std::vector const& rNames) + : OCollection(rParent, true, rMutex, rNames) + , m_xMetaData(rMetaData) +{ +} + +//----- OCollection ----------------------------------------------------------- +void Users::impl_refresh() +{ + // TODO: IMPLEMENT ME +} + +ObjectType Users::createObject(const OUString& rName) +{ + return new User(m_xMetaData->getConnection(), rName); +} + +uno::Reference Users::createDescriptor() +{ + // There is some internal magic so that the same class can be used as either + // a descriptor or as a normal user. See VUser.cxx for the details. In our + // case we just need to ensure we use the correct constructor. + return new User(m_xMetaData->getConnection()); +} + +//----- XAppend --------------------------------------------------------------- +ObjectType Users::appendObject(const OUString& rName, const uno::Reference&) +{ + // TODO: set sSql as appropriate + m_xMetaData->getConnection()->createStatement()->execute(OUString()); + + return createObject(rName); +} + +//----- XDrop ----------------------------------------------------------------- +void Users::dropObject(sal_Int32 nPosition, const OUString&) +{ + uno::Reference xUser(getObject(nPosition)); + + if (!ODescriptor::isNew(xUser)) + { + // TODO: drop me + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_users.hxx b/connectivity/source/drivers/mysqlc/mysqlc_users.hxx new file mode 100644 index 000000000000..d4c4d3558e42 --- /dev/null +++ b/connectivity/source/drivers/mysqlc/mysqlc_users.hxx @@ -0,0 +1,43 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include +#include + +namespace connectivity::mysqlc +{ +class Users : public ::connectivity::sdbcx::OCollection +{ + css::uno::Reference m_xMetaData; + +protected: + // OCollection + virtual void impl_refresh() override; + virtual ::connectivity::sdbcx::ObjectType createObject(const OUString& rName) override; + virtual css::uno::Reference createDescriptor() override; + virtual ::connectivity::sdbcx::ObjectType + appendObject(const OUString& rName, + const css::uno::Reference& rDescriptor) override; + +public: + Users(const css::uno::Reference& rMetaData, + ::cppu::OWeakObject& rParent, ::osl::Mutex& rMutex, + ::std::vector const& rNames); + + // TODO: we should also implement XDataDescriptorFactory, XRefreshable, + // XAppend, etc., but all are optional. + + // XDrop + virtual void dropObject(sal_Int32 nPosition, const OUString& rName) override; +}; +} // namespace connectivity::mysqlc + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ -- cgit v1.2.3