tdf#165774 Support for Java instrumentation

Change-Id: I5323eaba60a1dbc6b872550dbbfed0fe989bcd11
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/183280
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <stephan.bergmann@allotropia.de>
This commit is contained in:
prrvchr
2025-03-24 21:32:21 +01:00
committed by Stephan Bergmann
parent 73d87a030c
commit fabdac1af8
2 changed files with 101 additions and 35 deletions

View File

@@ -19,6 +19,19 @@
<!DOCTYPE oor:component-schema SYSTEM "../../../../component-schema.dtd">
<oor:component-schema xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" oor:name="Java" oor:package="org.openoffice.Office" xml:lang="en-US">
<info/>
<templates>
<group oor:name="InstrumentationAgent">
<info>
<desc>Contains the Java instrumentation agents archives loaded at JVM startup.</desc>
</info>
<prop oor:name="URL" oor:type="xs:string" oor:nillable="false">
<info>
<desc>An extension can load its own Java instrumentation agent with the value: %origin%/lib/myagent.jar.</desc>
<label>Java instrumentation agent archive URL</label>
</info>
</prop>
</group>
</templates>
<component>
<group oor:name="VirtualMachine">
<info>
@@ -63,6 +76,12 @@
</info>
<value>false</value>
</prop>
<set oor:name="InstrumentationAgents" oor:node-type="InstrumentationAgent">
<info>
<desc>Specifies the Java archives from which the instrumentation agents will be loaded at JVM startup.</desc>
<label>Java instrumentation agent archives</label>
</info>
</set>
</group>
</component>
</oor:component-schema>

View File

@@ -25,6 +25,7 @@
#include <com/sun/star/beans/NamedValue.hpp>
#include <com/sun/star/container/XContainer.hpp>
#include <com/sun/star/container/XNameAccess.hpp>
#include <com/sun/star/java/JavaNotFoundException.hpp>
#include <com/sun/star/java/InvalidJavaSettingsException.hpp>
#include <com/sun/star/java/RestartRequiredException.hpp>
@@ -54,6 +55,7 @@
#include <jvmaccess/classpath.hxx>
#include <jvmaccess/unovirtualmachine.hxx>
#include <jvmaccess/virtualmachine.hxx>
#include <osl/file.hxx>
#include <rtl/process.h>
#include <rtl/ustring.hxx>
#include <sal/types.h>
@@ -321,34 +323,81 @@ void getDefaultLocaleFromConfig(
}
/// @throws css::uno::Exception
void getJavaPropsFromSafetySettings(
void getJavaPropsFromJavaSettings(
stoc_javavm::JVM * pjvm,
const css::uno::Reference<css::lang::XMultiComponentFactory> & xSMgr,
const css::uno::Reference<css::uno::XComponentContext> &xCtx)
{
css::uno::Reference<css::uno::XInterface> xConfRegistry =
xSMgr->createInstanceWithContext(
u"com.sun.star.configuration.ConfigurationRegistry"_ustr,
xCtx);
if(!xConfRegistry.is())
css::uno::Reference<css::lang::XMultiServiceFactory> xConfigProvider(
xCtx->getValueByName(
u"/singletons/com.sun.star.configuration.theDefaultProvider"_ustr),
css::uno::UNO_QUERY);
if (!xConfigProvider.is())
throw css::uno::RuntimeException(
u"javavm.cxx: couldn't get ConfigurationRegistry"_ustr, nullptr);
u"javavm.cxx: couldn't get ConfigurationProvider"_ustr, nullptr);
css::uno::Reference<css::registry::XSimpleRegistry> xConfRegistry_simple(
xConfRegistry, css::uno::UNO_QUERY_THROW);
xConfRegistry_simple->open(
u"org.openoffice.Office.Java"_ustr,
true, false);
css::uno::Reference<css::registry::XRegistryKey> xRegistryRootKey =
xConfRegistry_simple->getRootKey();
css::beans::NamedValue aPath(u"nodepath"_ustr, css::uno::Any(u"org.openoffice.Office.Java/VirtualMachine"_ustr));
css::uno::Sequence<css::uno::Any> aArguments{ css::uno::Any(aPath) };
if (xRegistryRootKey.is())
css::uno::Reference<css::container::XNameAccess> xConfigAccess(xConfigProvider->createInstanceWithArguments(
u"com.sun.star.configuration.ConfigurationAccess"_ustr,
aArguments),
css::uno::UNO_QUERY);
if (!xConfigAccess.is())
throw css::uno::RuntimeException(
u"javavm.cxx: couldn't get ConfigurationAccess"_ustr, nullptr);
if (xConfigAccess->hasByName(u"InstrumentationAgents"_ustr))
{
css::uno::Reference<css::registry::XRegistryKey> key_NetAccess= xRegistryRootKey->openKey(u"VirtualMachine/NetAccess"_ustr);
if (key_NetAccess.is()
&& key_NetAccess->getValueType() != css::registry::RegistryValueType_NOT_DEFINED)
css::uno::Reference<css::container::XNameAccess> xAgentAccess;
xConfigAccess->getByName(u"InstrumentationAgents"_ustr) >>= xAgentAccess;
if (xAgentAccess.is() && xAgentAccess->hasElements())
{
OUString sScheme(u"vnd.sun.star.expand:"_ustr);
css::uno::Reference<css::util::XMacroExpander> exp = css::util::theMacroExpander::get(xCtx);
css::uno::Sequence<OUString> aAgents = xAgentAccess->getElementNames();
for (auto const & sAgent : aAgents)
{
css::uno::Reference<css::container::XNameAccess> xAgent;
xAgentAccess->getByName(sAgent) >>= xAgent;
if (!xAgent->hasByName(u"URL"_ustr))
{
SAL_WARN("stoc.java", "Cant retrieve URL property from InstrumentationAgent: " << sAgent);
continue;
}
OUString sUrl;
xAgent->getByName(u"URL"_ustr) >>= sUrl;
if (sUrl.isEmpty())
{
SAL_WARN("stoc.java", "Cant use empty URL property from InstrumentationAgent: " << sAgent);
continue;
}
if (sUrl.startsWithIgnoreAsciiCase(sScheme))
{
try {
sUrl = exp->expandMacros(sUrl.copy(sScheme.getLength()));
} catch (css::lang::IllegalArgumentException & exception) {
SAL_WARN("stoc.java", exception.Message);
continue;
}
}
OUString sPath = sUrl;
osl::FileBase::RC nError = osl::FileBase::getSystemPathFromFileURL(sUrl, sPath);
if (nError != osl::FileBase::E_None)
{
SAL_WARN("stoc.java", "Cant convert url to system path: " << sUrl);
continue;
}
pjvm->pushProp("-javaagent:" + sPath);
}
}
}
if (xConfigAccess->hasByName(u"NetAccess"_ustr))
{
sal_Int32 val = 0;
if (xConfigAccess->getByName(u"NetAccess"_ustr) >>= val)
{
sal_Int32 val= key_NetAccess->getLongValue();
OUString sVal;
switch( val)
{
@@ -362,20 +411,18 @@ void getJavaPropsFromSafetySettings(
OUString sProperty = "appletviewer.security.mode=" + sVal;
pjvm->pushProp(sProperty);
}
css::uno::Reference<css::registry::XRegistryKey> key_CheckSecurity= xRegistryRootKey->openKey(
u"VirtualMachine/Security"_ustr);
if( key_CheckSecurity.is())
{
bool val = static_cast<bool>(key_CheckSecurity->getLongValue());
OUString sProperty(u"stardiv.security.disableSecurity="_ustr);
if( val)
sProperty += "false";
else
sProperty += "true";
pjvm->pushProp( sProperty);
}
}
xConfRegistry_simple->close();
if (xConfigAccess->hasByName(u"Security"_ustr))
{
bool val = true;
xConfigAccess->getByName(u"Security"_ustr) >>= val;
OUString sProperty(u"stardiv.security.disableSecurity="_ustr);
if( val)
sProperty += "false";
else
sProperty += "true";
pjvm->pushProp(sProperty);
}
}
void setTimeZone(stoc_javavm::JVM * pjvm) noexcept {
@@ -426,10 +473,10 @@ void initVMConfiguration(
try
{
getJavaPropsFromSafetySettings(&jvm, xSMgr, xCtx);
getJavaPropsFromJavaSettings(&jvm, xCtx);
}
catch(const css::uno::Exception & exception) {
SAL_INFO("stoc", "couldn't get safety settings because of " << exception);
SAL_INFO("stoc", "couldn't get Java settings because of " << exception);
}
*pjvm = std::move(jvm);