summaryrefslogtreecommitdiff
path: root/extensions
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2018-04-28 09:16:15 +0300
committerMike Kaganski <mike.kaganski@collabora.com>2018-05-02 16:38:40 +0200
commitf154f63cb662f02415d5cb0051011bdb5d0d523c (patch)
tree31f22312e0c8ab339cdbb132a82da08b52f15dd0 /extensions
parentea1f50894ac3e681213b874af08217ae25d0433a (diff)
WinUserInfoBe: a new config backend for user data provided by Windows
This backend provides Active Directory details for current user. If the system is not part of Active Directory domain, GetUserNameEx is used instead, so at least user (given) name is configured. Unlike ldap backend, this one doesn't need connection configuration, as the used API works with current user security context. Change-Id: I74bcc79591a658dc5121df1f09caa15d272fbe12 Reviewed-on: https://gerrit.libreoffice.org/53590 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Diffstat (limited to 'extensions')
-rw-r--r--extensions/Library_WinUserInfoBe.mk38
-rw-r--r--extensions/Module_extensions.mk1
-rw-r--r--extensions/source/config/WinUserInfo/WinUserInfoBe.component15
-rw-r--r--extensions/source/config/WinUserInfo/WinUserInfoBe.cxx479
-rw-r--r--extensions/source/config/WinUserInfo/WinUserInfoBe.hxx115
-rw-r--r--extensions/source/config/WinUserInfo/componentdef.cxx35
6 files changed, 683 insertions, 0 deletions
diff --git a/extensions/Library_WinUserInfoBe.mk b/extensions/Library_WinUserInfoBe.mk
new file mode 100644
index 000000000000..6fdad389a480
--- /dev/null
+++ b/extensions/Library_WinUserInfoBe.mk
@@ -0,0 +1,38 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+#
+# 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/.
+#
+#
+
+$(eval $(call gb_Library_Library,WinUserInfoBe))
+
+$(eval $(call gb_Library_set_componentfile,WinUserInfoBe,extensions/source/config/WinUserInfo/WinUserInfoBe))
+
+$(eval $(call gb_Library_use_sdk_api,WinUserInfoBe))
+
+$(eval $(call gb_Library_add_exception_objects,WinUserInfoBe,\
+ extensions/source/config/WinUserInfo/componentdef \
+ extensions/source/config/WinUserInfo/WinUserInfoBe \
+))
+
+$(eval $(call gb_Library_use_libraries,WinUserInfoBe,\
+ comphelper \
+ cppuhelper \
+ cppu \
+ sal \
+))
+
+$(eval $(call gb_Library_use_system_win32_libs,WinUserInfoBe,\
+ Ole32 \
+ OleAut32 \
+ Activeds \
+ Adsiid \
+ Secur32 \
+))
+
+# vim:set noet sw=4 ts=4:
diff --git a/extensions/Module_extensions.mk b/extensions/Module_extensions.mk
index 3ab21f58a411..31512ff4045f 100644
--- a/extensions/Module_extensions.mk
+++ b/extensions/Module_extensions.mk
@@ -17,6 +17,7 @@ ifneq ($(filter-out IOS ANDROID,$(OS)),)
$(eval $(call gb_Module_add_targets,extensions,\
Library_abp \
Library_ldapbe2 \
+ $(if $(filter WNT,$(OS)),Library_WinUserInfoBe) \
Library_log \
Library_scn \
UIConfig_sabpilot \
diff --git a/extensions/source/config/WinUserInfo/WinUserInfoBe.component b/extensions/source/config/WinUserInfo/WinUserInfoBe.component
new file mode 100644
index 000000000000..90c3e0060685
--- /dev/null
+++ b/extensions/source/config/WinUserInfo/WinUserInfoBe.component
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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/.
+ -->
+
+<component loader="com.sun.star.loader.SharedLibrary" environment="@CPPU_ENV@"
+ prefix="WinUserInfoBe" xmlns="http://openoffice.org/2010/uno-components">
+ <implementation name="com.sun.star.comp.configuration.backend.WinUserInfoBe">
+ <service name="com.sun.star.configuration.backend.WinUserInfoBe"/>
+ </implementation>
+</component>
diff --git a/extensions/source/config/WinUserInfo/WinUserInfoBe.cxx b/extensions/source/config/WinUserInfo/WinUserInfoBe.cxx
new file mode 100644
index 000000000000..3e60716b5cdd
--- /dev/null
+++ b/extensions/source/config/WinUserInfo/WinUserInfoBe.cxx
@@ -0,0 +1,479 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * 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 "WinUserInfoBe.hxx"
+
+#include <com/sun/star/beans/Optional.hpp>
+#include <comphelper/base64.hxx>
+#include <comphelper/configurationhelper.hxx>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/container/XNameReplace.hpp>
+#include <com/sun/star/util/XChangesBatch.hpp>
+#include <cppuhelper/supportsservice.hxx>
+#include <map>
+#include <o3tl/make_unique.hxx>
+#include <o3tl/char16_t2wchar_t.hxx>
+
+#include <Iads.h>
+#include <Adshlp.h>
+#include <Lmcons.h>
+#define SECURITY_WIN32
+#include <Security.h>
+
+namespace extensions
+{
+namespace config
+{
+namespace WinUserInfo
+{
+class WinUserInfoBe_Impl
+{
+public:
+ virtual ~WinUserInfoBe_Impl(){};
+ virtual OUString GetGivenName() = 0;
+ virtual OUString GetSn() { return ""; }
+ virtual OUString GetFathersname() { return ""; }
+ virtual OUString GetInitials() { return ""; }
+ virtual OUString GetStreet() { return ""; }
+ virtual OUString GetCity() { return ""; }
+ virtual OUString GetState() { return ""; }
+ virtual OUString GetApartment() { return ""; }
+ virtual OUString GetPostalCode() { return ""; }
+ virtual OUString GetCountry() { return ""; }
+ virtual OUString GetOrganization() { return ""; }
+ virtual OUString GetPosition() { return ""; }
+ virtual OUString GetTitle() { return ""; }
+ virtual OUString GetHomePhone() { return ""; }
+ virtual OUString GetTelephoneNumber() { return ""; }
+ virtual OUString GetFaxNumber() { return ""; }
+ virtual OUString GetMail() { return ""; }
+};
+}
+}
+}
+
+namespace
+{
+constexpr char givenname[]("givenname");
+constexpr char sn[]("sn");
+constexpr char fathersname[]("fathersname");
+constexpr char initials[]("initials");
+constexpr char street[]("street");
+constexpr char l[]("l");
+constexpr char st[]("st");
+constexpr char apartment[]("apartment");
+constexpr char postalcode[]("postalcode");
+constexpr char c[]("c");
+constexpr char o[]("o");
+constexpr char position[]("position");
+constexpr char title[]("title");
+constexpr char homephone[]("homephone");
+constexpr char telephonenumber[]("telephonenumber");
+constexpr char facsimiletelephonenumber[]("facsimiletelephonenumber");
+constexpr char mail[]("mail");
+
+// Backend class implementing access to Active Directory user data. It caches its encoded data
+// in a configuration entry, to allow reusing it when user later doesn't have access to AD DC
+// (otherwise the user would get different data when connected vs not connected).
+class ADsUserAccess : public extensions::config::WinUserInfo::WinUserInfoBe_Impl
+{
+public:
+ ADsUserAccess(const css::uno::Reference<css::uno::XComponentContext>& xContext)
+ {
+ try
+ {
+ struct CoInitializeGuard
+ {
+ CoInitializeGuard()
+ {
+ if (FAILED(CoInitialize(nullptr)))
+ throw css::uno::RuntimeException();
+ }
+ ~CoInitializeGuard() { CoUninitialize(); }
+ } aCoInitializeGuard;
+
+ IADsADSystemInfo* pADsys;
+ HRESULT hr = CoCreateInstance(CLSID_ADSystemInfo, nullptr, CLSCTX_INPROC_SERVER,
+ IID_IADsADSystemInfo, (void**)&pADsys);
+ if (FAILED(hr))
+ throw css::uno::RuntimeException();
+ CoIfPtr<IADsADSystemInfo> aADsysGuard(pADsys);
+
+ BSTR sUserDN;
+ hr = pADsys->get_UserName(&sUserDN);
+ if (FAILED(hr))
+ throw css::uno::RuntimeException();
+ BSTRGuard aUserNameGuard(sUserDN, SysFreeString);
+ // If this user is an AD user, then without an active connection to the domain, all the
+ // above will succeed, and m_sUserDN will be correctly initialized, but the following
+ // call to ADsGetObject will fail, and we will attempt reading cached values.
+ m_sUserDN = o3tl::toU(sUserDN);
+ OUString sLdapUserDN = "LDAP://" + m_sUserDN;
+ IADsUser* pUser;
+ hr = ADsGetObject(o3tl::toW(sLdapUserDN.getStr()), IID_IADsUser, (void**)&pUser);
+ if (FAILED(hr))
+ throw css::uno::RuntimeException();
+ CoIfPtr<IADsUser> pUserGuard(pUser);
+ // Fetch all the required information right now, when we know to have access to AD
+ // (later the connection may already be lost)
+ m_aMap[givenname] = Str(pUser, &IADsUser::get_FirstName);
+ m_aMap[sn] = Str(pUser, &IADsUser::get_LastName);
+ m_aMap[initials] = Str(pUser, L"initials");
+ m_aMap[street] = Str(pUser, L"streetAddress");
+ m_aMap[l] = Str(pUser, L"l");
+ m_aMap[st] = Str(pUser, L"st");
+ m_aMap[postalcode] = Str(pUser, L"postalCode");
+ m_aMap[c] = Str(pUser, L"co");
+ m_aMap[o] = Str(pUser, L"company");
+ m_aMap[title] = Str(pUser, &IADsUser::get_Title);
+ m_aMap[homephone] = Str(pUser, L"homePhone");
+ m_aMap[telephonenumber] = Str(pUser, L"TelephoneNumber");
+ m_aMap[facsimiletelephonenumber] = Str(pUser, L"facsimileTelephoneNumber");
+ m_aMap[mail] = Str(pUser, &IADsUser::get_EmailAddress);
+
+ CacheData(xContext);
+ }
+ catch (css::uno::Exception&)
+ {
+ // Maybe we temporarily lost connection to AD; try to get cached data
+ GetCachedData(xContext);
+ }
+ }
+ ~ADsUserAccess() {}
+
+ virtual OUString GetGivenName() override { return m_aMap[givenname]; }
+ virtual OUString GetSn() override { return m_aMap[sn]; }
+ virtual OUString GetInitials() override { return m_aMap[initials]; }
+ virtual OUString GetStreet() override { return m_aMap[street]; }
+ virtual OUString GetCity() override { return m_aMap[l]; }
+ virtual OUString GetState() override { return m_aMap[st]; }
+ virtual OUString GetPostalCode() override { return m_aMap[postalcode]; }
+ virtual OUString GetCountry() override { return m_aMap[c]; }
+ virtual OUString GetOrganization() override { return m_aMap[o]; }
+ virtual OUString GetTitle() override { return m_aMap[title]; }
+ virtual OUString GetHomePhone() override { return m_aMap[homephone]; }
+ virtual OUString GetTelephoneNumber() override { return m_aMap[telephonenumber]; }
+ virtual OUString GetFaxNumber() override { return m_aMap[facsimiletelephonenumber]; }
+ virtual OUString GetMail() override { return m_aMap[mail]; }
+
+private:
+ static void ReleaseIUnknown(IUnknown* p)
+ {
+ if (p)
+ p->Release();
+ }
+ template <class If> class CoIfPtr : public std::unique_ptr<If, decltype(&ReleaseIUnknown)>
+ {
+ public:
+ CoIfPtr(If* p = nullptr)
+ : std::unique_ptr<If, decltype(&ReleaseIUnknown)>(p, ReleaseIUnknown)
+ {
+ }
+ };
+ typedef std::unique_ptr<OLECHAR, decltype(&SysFreeString)> BSTRGuard;
+
+ typedef HRESULT (__stdcall IADsUser::*getstrfunc)(BSTR*);
+ static OUString Str(IADsUser* pUser, getstrfunc func)
+ {
+ BSTR sBstr;
+ if (FAILED((pUser->*func)(&sBstr)))
+ return "";
+ BSTRGuard aBstrGuard(sBstr, SysFreeString);
+ return o3tl::toU(sBstr);
+ }
+ static OUString Str(IADsUser* pUser, const wchar_t* property)
+ {
+ BSTRGuard sBstrProp(SysAllocString(property), SysFreeString);
+ struct AutoVariant : public VARIANT
+ {
+ AutoVariant() { VariantInit(this); }
+ ~AutoVariant() { VariantClear(this); }
+ } varArr;
+ if (FAILED(pUser->GetEx(sBstrProp.get(), &varArr)))
+ return "";
+ SAFEARRAY* sa = V_ARRAY(&varArr);
+ LONG nStart, nEnd;
+ if (FAILED(SafeArrayGetLBound(sa, 1, &nStart)) || FAILED(SafeArrayGetUBound(sa, 1, &nEnd)))
+ return "";
+ AutoVariant varItem;
+ for (LONG i = nStart; i <= nEnd; i++)
+ {
+ if (FAILED(SafeArrayGetElement(sa, &i, &varItem)))
+ continue;
+ if (varItem.vt == VT_BSTR)
+ return o3tl::toU(V_BSTR(&varItem));
+ VariantClear(&varItem);
+ }
+ return "";
+ }
+
+ void CacheData(const css::uno::Reference<css::uno::XComponentContext>& xContext)
+ {
+ try
+ {
+ const OUString sNul('\0');
+ OUStringBuffer sCachedData(200);
+ sCachedData.append("user=" + m_sUserDN);
+ sCachedData.append(sNul + givenname + "=" + GetGivenName());
+ sCachedData.append(sNul + sn + "=" + GetSn());
+ sCachedData.append(sNul + initials + "=" + GetInitials());
+ sCachedData.append(sNul + street + "=" + GetStreet());
+ sCachedData.append(sNul + l + "=" + GetCity());
+ sCachedData.append(sNul + st + "=" + GetState());
+ sCachedData.append(sNul + postalcode + "=" + GetPostalCode());
+ sCachedData.append(sNul + c + "=" + GetCountry());
+ sCachedData.append(sNul + o + "=" + GetOrganization());
+ sCachedData.append(sNul + title + "=" + GetTitle());
+ sCachedData.append(sNul + homephone + "=" + GetHomePhone());
+ sCachedData.append(sNul + telephonenumber + "=" + GetTelephoneNumber());
+ sCachedData.append(sNul + facsimiletelephonenumber + "=" + GetFaxNumber());
+ sCachedData.append(sNul + mail + "=" + GetMail());
+ const css::uno::Sequence<sal_Int8> seqCachedData(
+ reinterpret_cast<const sal_Int8*>(sCachedData.getStr()),
+ sCachedData.getLength() * sizeof(sal_Unicode));
+ OUStringBuffer sOutBuf;
+ comphelper::Base64::encode(sOutBuf, seqCachedData);
+
+ auto xIface = comphelper::ConfigurationHelper::openConfig(
+ xContext, "org.openoffice.UserProfile/WinUserInfo",
+ comphelper::EConfigurationModes::Standard);
+ css::uno::Reference<css::container::XNameReplace> xNameReplace(
+ xIface, css::uno::UNO_QUERY_THROW);
+ xNameReplace->replaceByName("Cache", css::uno::makeAny(sOutBuf.makeStringAndClear()));
+
+ css::uno::Reference<css::util::XChangesBatch> xChangesBatch(xIface,
+ css::uno::UNO_QUERY_THROW);
+ xChangesBatch->commitChanges();
+ }
+ catch (const css::uno::Exception& e)
+ {
+ SAL_WARN("extensions.config",
+ "ADsUserAccess: access to configuration data failed: " << e);
+ }
+ }
+
+ void GetCachedData(const css::uno::Reference<css::uno::XComponentContext>& xContext)
+ {
+ if (m_sUserDN.isEmpty())
+ throw css::uno::RuntimeException();
+
+ auto xIface = comphelper::ConfigurationHelper::openConfig(
+ xContext, "org.openoffice.UserProfile/WinUserInfo",
+ comphelper::EConfigurationModes::ReadOnly);
+ css::uno::Reference<css::container::XNameAccess> xNameAccess(xIface,
+ css::uno::UNO_QUERY_THROW);
+ OUString sCache;
+ xNameAccess->getByName("Cache") >>= sCache;
+ if (sCache.isEmpty())
+ throw css::uno::RuntimeException();
+
+ {
+ css::uno::Sequence<sal_Int8> seqCachedData;
+ comphelper::Base64::decode(seqCachedData, sCache);
+ sCache = OUString(reinterpret_cast<const sal_Unicode*>(seqCachedData.getConstArray()),
+ seqCachedData.getLength() / sizeof(sal_Unicode));
+ }
+
+ OUString sUserDN;
+ std::map<const OUString, OUString> aMap;
+ sal_Int32 nIndex = 0;
+ do
+ {
+ const OUString sEntry = sCache.getToken(0, '\0', nIndex);
+ sal_Int32 nEqIndex = 0;
+ const OUString sEntryName = sEntry.getToken(0, '=', nEqIndex);
+ OUString sEntryVal;
+ if (nEqIndex >= 0)
+ sEntryVal = sEntry.copy(nEqIndex);
+ if (sEntryName == "user")
+ sUserDN = sEntryVal;
+ else
+ aMap[sEntryName] = sEntryVal;
+ } while (nIndex >= 0);
+
+ if (sUserDN != m_sUserDN)
+ throw css::uno::RuntimeException();
+ m_aMap = std::move(aMap);
+ }
+
+ OUString m_sUserDN; // used to check if the cached data is for current user
+ std::map<const OUString, OUString> m_aMap;
+};
+
+class SysInfoUserAccess : public extensions::config::WinUserInfo::WinUserInfoBe_Impl
+{
+public:
+ SysInfoUserAccess()
+ {
+ try
+ {
+ ULONG nSize = 0;
+ GetUserNameExW(NameDisplay, nullptr, &nSize);
+ if (GetLastError() != ERROR_MORE_DATA)
+ throw css::uno::RuntimeException();
+ auto pNameBuf(o3tl::make_unique<wchar_t[]>(nSize));
+ if (!GetUserNameExW(NameDisplay, pNameBuf.get(), &nSize))
+ throw css::uno::RuntimeException();
+ m_sName = o3tl::toU(pNameBuf.get());
+ }
+ catch (css::uno::RuntimeException&)
+ {
+ // GetUserNameEx may fail in some cases (e.g., for built-in AD domain
+ // administrator account on non-DC systems), where GetUserName will
+ // still give a name.
+ DWORD nSize = UNLEN + 1;
+ auto pNameBuf(o3tl::make_unique<wchar_t[]>(nSize));
+ if (!GetUserNameW(pNameBuf.get(), &nSize))
+ throw css::uno::RuntimeException();
+ m_sName = o3tl::toU(pNameBuf.get());
+ }
+ }
+
+ virtual OUString GetGivenName() override { return m_sName; }
+
+private:
+ OUString m_sName;
+};
+}
+
+namespace extensions
+{
+namespace config
+{
+namespace WinUserInfo
+{
+WinUserInfoBe::WinUserInfoBe(const css::uno::Reference<css::uno::XComponentContext>& xContext)
+ : WinUserInfoMutexHolder()
+ , BackendBase(mMutex)
+{
+ try
+ {
+ m_pImpl.reset(new ADsUserAccess(xContext));
+ }
+ catch (css::uno::RuntimeException&)
+ {
+ m_pImpl.reset(new SysInfoUserAccess);
+ }
+}
+
+WinUserInfoBe::~WinUserInfoBe() {}
+
+void WinUserInfoBe::setPropertyValue(OUString const&, css::uno::Any const&)
+{
+ throw css::lang::IllegalArgumentException("setPropertyValue not supported",
+ static_cast<cppu::OWeakObject*>(this), -1);
+}
+
+css::uno::Any WinUserInfoBe::getPropertyValue(OUString const& PropertyName)
+{
+ OUString sValue;
+ // Only process the first argument of possibly multiple space- or comma-separated arguments
+ OUString sToken = PropertyName.getToken(0, ' ').getToken(0, ',');
+ if (sToken == givenname)
+ {
+ sValue = m_pImpl->GetGivenName();
+ }
+ else if (sToken == sn)
+ {
+ sValue = m_pImpl->GetSn();
+ }
+ else if (sToken == fathersname)
+ {
+ sValue = m_pImpl->GetFathersname();
+ }
+ else if (sToken == initials)
+ {
+ sValue = m_pImpl->GetInitials();
+ }
+ else if (sToken == street)
+ {
+ sValue = m_pImpl->GetStreet();
+ }
+ else if (sToken == l)
+ {
+ sValue = m_pImpl->GetCity();
+ }
+ else if (sToken == st)
+ {
+ sValue = m_pImpl->GetState();
+ }
+ else if (sToken == apartment)
+ {
+ sValue = m_pImpl->GetApartment();
+ }
+ else if (sToken == postalcode)
+ {
+ sValue = m_pImpl->GetPostalCode();
+ }
+ else if (sToken == c)
+ {
+ sValue = m_pImpl->GetCountry();
+ }
+ else if (sToken == o)
+ {
+ sValue = m_pImpl->GetOrganization();
+ }
+ else if (sToken == position)
+ {
+ sValue = m_pImpl->GetPosition();
+ }
+ else if (sToken == title)
+ {
+ sValue = m_pImpl->GetTitle();
+ }
+ else if (sToken == homephone)
+ {
+ sValue = m_pImpl->GetHomePhone();
+ }
+ else if (sToken == telephonenumber)
+ {
+ sValue = m_pImpl->GetTelephoneNumber();
+ }
+ else if (sToken == facsimiletelephonenumber)
+ {
+ sValue = m_pImpl->GetFaxNumber();
+ }
+ else if (sToken == mail)
+ {
+ sValue = m_pImpl->GetMail();
+ }
+ else
+ throw css::beans::UnknownPropertyException(sToken, static_cast<cppu::OWeakObject*>(this));
+
+ return css::uno::makeAny(css::beans::Optional<css::uno::Any>(
+ !sValue.isEmpty(), sValue.isEmpty() ? css::uno::Any() : css::uno::makeAny(sValue)));
+}
+
+OUString WinUserInfoBe::getWinUserInfoBeName()
+{
+ return OUString("com.sun.star.comp.configuration.backend.WinUserInfoBe");
+}
+
+OUString SAL_CALL WinUserInfoBe::getImplementationName() { return getWinUserInfoBeName(); }
+
+css::uno::Sequence<OUString> WinUserInfoBe::getWinUserInfoBeServiceNames()
+{
+ css::uno::Sequence<OUString> aServices{ "com.sun.star.configuration.backend.WinUserInfoBe" };
+ return aServices;
+}
+
+sal_Bool SAL_CALL WinUserInfoBe::supportsService(const OUString& aServiceName)
+{
+ return cppu::supportsService(this, aServiceName);
+}
+
+css::uno::Sequence<OUString> SAL_CALL WinUserInfoBe::getSupportedServiceNames()
+{
+ return getWinUserInfoBeServiceNames();
+}
+}
+}
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/config/WinUserInfo/WinUserInfoBe.hxx b/extensions/source/config/WinUserInfo/WinUserInfoBe.hxx
new file mode 100644
index 000000000000..766b88c41227
--- /dev/null
+++ b/extensions/source/config/WinUserInfo/WinUserInfoBe.hxx
@@ -0,0 +1,115 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * 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/.
+ */
+
+#ifndef INCLUDED_EXTENSIONS_SOURCE_CONFIG_WINUSERINFO_WINUSERINFOBE_HXX
+#define INCLUDED_EXTENSIONS_SOURCE_CONFIG_WINUSERINFO_WINUSERINFOBE_HXX
+
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <cppuhelper/compbase.hxx>
+#include <memory>
+
+namespace com
+{
+namespace sun
+{
+namespace star
+{
+namespace uno
+{
+class XComponentContext;
+}
+}
+}
+}
+
+namespace extensions
+{
+namespace config
+{
+namespace WinUserInfo
+{
+class WinUserInfoBe_Impl;
+
+typedef cppu::WeakComponentImplHelper<css::beans::XPropertySet, css::lang::XServiceInfo>
+ BackendBase;
+
+struct WinUserInfoMutexHolder
+{
+ osl::Mutex mMutex;
+};
+/**
+ Implements the PlatformBackend service, a specialization of the
+ XPropertySet service for retrieving Active Directory user profile
+ configuration settings.
+*/
+class WinUserInfoBe : private WinUserInfoMutexHolder, public BackendBase
+{
+public:
+ explicit WinUserInfoBe(const css::uno::Reference<css::uno::XComponentContext>& xContext);
+ virtual ~WinUserInfoBe() override;
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+
+ virtual sal_Bool SAL_CALL supportsService(const OUString& aServiceName) override;
+
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+ // XPropertySet
+ virtual css::uno::Reference<css::beans::XPropertySetInfo> SAL_CALL getPropertySetInfo() override
+ {
+ return css::uno::Reference<css::beans::XPropertySetInfo>();
+ }
+
+ virtual void SAL_CALL setPropertyValue(OUString const&, css::uno::Any const&) override;
+
+ virtual css::uno::Any SAL_CALL getPropertyValue(OUString const& PropertyName) override;
+
+ virtual void SAL_CALL addPropertyChangeListener(
+ OUString const&, css::uno::Reference<css::beans::XPropertyChangeListener> const&) override
+ {
+ }
+
+ virtual void SAL_CALL removePropertyChangeListener(
+ OUString const&, css::uno::Reference<css::beans::XPropertyChangeListener> const&) override
+ {
+ }
+
+ virtual void SAL_CALL addVetoableChangeListener(
+ OUString const&, css::uno::Reference<css::beans::XVetoableChangeListener> const&) override
+ {
+ }
+
+ virtual void SAL_CALL removeVetoableChangeListener(
+ OUString const&, css::uno::Reference<css::beans::XVetoableChangeListener> const&) override
+ {
+ }
+
+ /**
+ Provides the implementation name.
+ @return implementation name
+ */
+ static OUString getWinUserInfoBeName();
+ /**
+ Provides the supported services names
+ @return service names
+ */
+ static css::uno::Sequence<OUString> getWinUserInfoBeServiceNames();
+
+private:
+ std::unique_ptr<WinUserInfoBe_Impl> m_pImpl;
+};
+}
+}
+}
+
+#endif // INCLUDED_EXTENSIONS_SOURCE_CONFIG_WINUSERINFO_WINUSERINFOBE_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/config/WinUserInfo/componentdef.cxx b/extensions/source/config/WinUserInfo/componentdef.cxx
new file mode 100644
index 000000000000..7d8ff550445d
--- /dev/null
+++ b/extensions/source/config/WinUserInfo/componentdef.cxx
@@ -0,0 +1,35 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * 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 "WinUserInfoBe.hxx"
+#include <cppuhelper/implementationentry.hxx>
+
+using namespace extensions::config::WinUserInfo;
+
+static css::uno::Reference<css::uno::XInterface>
+createWinUserInfoBe(const css::uno::Reference<css::uno::XComponentContext>& aContext)
+{
+ return *new WinUserInfoBe(aContext);
+}
+
+static const cppu::ImplementationEntry kImplementations_entries[]
+ = { { createWinUserInfoBe, WinUserInfoBe::getWinUserInfoBeName,
+ WinUserInfoBe::getWinUserInfoBeServiceNames, cppu::createSingleComponentFactory, nullptr,
+ 0 },
+ { nullptr, nullptr, nullptr, nullptr, nullptr, 0 } };
+
+extern "C" SAL_DLLPUBLIC_EXPORT void*
+WinUserInfoBe_component_getFactory(const sal_Char* aImplementationName, void* aServiceManager,
+ void* aRegistryKey)
+{
+ return cppu::component_getFactoryHelper(aImplementationName, aServiceManager, aRegistryKey,
+ kImplementations_entries);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */