You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@logging.apache.org by "Sven Seelig (Jira)" <ji...@apache.org> on 2022/08/05 09:03:00 UTC

[jira] [Updated] (LOG4J2-3568) ResolverUtil fails to extractPath for custom plugins in jar, if there are blanks in the path

     [ https://issues.apache.org/jira/browse/LOG4J2-3568?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Sven Seelig updated LOG4J2-3568:
--------------------------------
    Description: 
We are using plugins in our config, e.g.:
{noformat}
"configuration": {
  "name": "DSSLog4JConfig",
  "packages": "de.schufa.dss.adapter.log4j.plugin",
  "properties": {
...
  "appenders": {
...
    "DssConsole": {
      "name": "Dss-Console-Appender",
      "PatternLayout": {
        "pattern": "${sysPatternlayout}",
        "charset": "UTF-8"
      }
 {noformat}
Everything works fine until the installation path of our application contains one or more blanks, e.g. "C:\Program Files\DSS_13.0.1". 

 

The plugin classes and the log4j2.json are delivered within jar files (different jar files, same folder). The config-file itself is found and read. We are accessing the context in a standard way:

 
{code:java}
LoggerContext log4j2LoggerContext = (org.apache.logging.log4j.core.LoggerContext) org.apache.logging.log4j.LogManager.getContext(true);
{code}
 

While trying to extract the path to our custom plugins, the PluginManager lands here: org.apache.logging.log4j.core.config.plugins.util.ResolverUtil#extractPath 
{code:java}
String extractPath(final URL url) throws UnsupportedEncodingException, URISyntaxException {
    String urlPath = url.getPath(); // same as getFile but without the Query portion
[...]
    // For jar: URLs, the path part starts with "file:"
    if (urlPath.startsWith("file:")) {
        urlPath = urlPath.substring(5);
    }
    // If it was in a JAR, grab the path to the jar
    final int bangIndex = urlPath.indexOf('!');
    if (bangIndex > 0) {
        urlPath = urlPath.substring(0, bangIndex);
    }  
 [...]     
final String cleanPath = new URI(urlPath).getPath(); {code}
Problem is, if the urlPath contains blank(s), the new URI(...) call will throw an URISyntaxException and the plugins are not loaded.

Simple solution would be an additional check and replacement of the blanks with "%20".
{code:java}
if(urlPath.contains(" ")){
    // System.out.println("Blank in URL detected, will fail as URI! Replacing with '%20'");
    urlPath = urlPath.replaceAll(" ", "%20");
}

final String cleanPath = new URI(urlPath).getPath(); {code}
We built the current release-2,x from the repo ([https://gitbox.apache.org/repos/asf/logging-log4j2.git]), had the same issue as before (2.17.2) but with this check added it works.

As we can't run the maven build with tests (there seems to be a proxy issue for the MongoDB Tests), we decided not to open a pull-request. Please let us know, if you prefer a pull-request or if you need further information.

(i) We are using the log4j-bridge at the moment, maybe this issue only shows up when using this besides log4j2 core and api (i) 

 

 

  was:
We are using plugins in our config, e.g.:
{noformat}
"configuration": {
  "name": "DSSLog4JConfig",
  "packages": "de.schufa.dss.adapter.log4j.plugin",
  "properties": {
...
  "appenders": {
...
    "DssConsole": {
      "name": "Dss-Console-Appender",
      "PatternLayout": {
        "pattern": "${sysPatternlayout}",
        "charset": "UTF-8"
      }
 {noformat}
Everything works fine until the installation path of our application contains one or more blanks, e.g. "C:\Program Files\DSS_13.0.1". 

 

The plugin classes and the log4j2.json are delivered within jar files (different jar files, same folder). The config-file itself is found and read. We are accessing the context in a standard way:

 
{code:java}
LoggerContext log4j2LoggerContext = (org.apache.logging.log4j.core.LoggerContext) org.apache.logging.log4j.LogManager.getContext(true);
{code}
 

While trying to extract the path to our custom plugins, the PluginManager lands here: org.apache.logging.log4j.core.config.plugins.util.ResolverUtil#extractPath 
{code:java}
String extractPath(final URL url) throws UnsupportedEncodingException, URISyntaxException {
    String urlPath = url.getPath(); // same as getFile but without the Query portion
[...]
    // For jar: URLs, the path part starts with "file:"
    if (urlPath.startsWith("file:")) {
        urlPath = urlPath.substring(5);
    }
    // If it was in a JAR, grab the path to the jar
    final int bangIndex = urlPath.indexOf('!');
    if (bangIndex > 0) {
        urlPath = urlPath.substring(0, bangIndex);
    }  
 [...]     
final String cleanPath = new URI(urlPath).getPath(); {code}
Problem is, if the urlPath contains blank(s), the new URI(...) call will throw an URISyntaxException and the plugins are not loaded.

Simple solution would be an additional check and replacement of the blanks with "%20".
{code:java}
if(urlPath.contains(" ")){
    // System.out.println("Blank in URL detected, will fail as URI! Replacing with '%20'");
    urlPath = urlPath.replaceAll(" ", "%20");
}

final String cleanPath = new URI(urlPath).getPath(); {code}
We built the current release-2,x from the repo ([https://gitbox.apache.org/repos/asf/logging-log4j2.git]), had the same issue as before (2.17.2) but with this check added and it works.

As we can't run the maven build with tests (there seems to be a proxy issue for the MongoDB Tests), we decided not to open a pull-request. Please let us know, if you prefer a pull-request or if you need further information.

(i) We are using the log4j-bridge at the moment, maybe this issue only shows up when using this besides log4j2 core and api (i) 

 

 


> ResolverUtil fails to extractPath for custom plugins in jar, if there are blanks in the path
> --------------------------------------------------------------------------------------------
>
>                 Key: LOG4J2-3568
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-3568
>             Project: Log4j 2
>          Issue Type: Bug
>          Components: Configuration
>    Affects Versions: 2.17.2
>         Environment: Windows 10
> Windows Server 2019
>            Reporter: Sven Seelig
>            Priority: Major
>
> We are using plugins in our config, e.g.:
> {noformat}
> "configuration": {
>   "name": "DSSLog4JConfig",
>   "packages": "de.schufa.dss.adapter.log4j.plugin",
>   "properties": {
> ...
>   "appenders": {
> ...
>     "DssConsole": {
>       "name": "Dss-Console-Appender",
>       "PatternLayout": {
>         "pattern": "${sysPatternlayout}",
>         "charset": "UTF-8"
>       }
>  {noformat}
> Everything works fine until the installation path of our application contains one or more blanks, e.g. "C:\Program Files\DSS_13.0.1". 
>  
> The plugin classes and the log4j2.json are delivered within jar files (different jar files, same folder). The config-file itself is found and read. We are accessing the context in a standard way:
>  
> {code:java}
> LoggerContext log4j2LoggerContext = (org.apache.logging.log4j.core.LoggerContext) org.apache.logging.log4j.LogManager.getContext(true);
> {code}
>  
> While trying to extract the path to our custom plugins, the PluginManager lands here: org.apache.logging.log4j.core.config.plugins.util.ResolverUtil#extractPath 
> {code:java}
> String extractPath(final URL url) throws UnsupportedEncodingException, URISyntaxException {
>     String urlPath = url.getPath(); // same as getFile but without the Query portion
> [...]
>     // For jar: URLs, the path part starts with "file:"
>     if (urlPath.startsWith("file:")) {
>         urlPath = urlPath.substring(5);
>     }
>     // If it was in a JAR, grab the path to the jar
>     final int bangIndex = urlPath.indexOf('!');
>     if (bangIndex > 0) {
>         urlPath = urlPath.substring(0, bangIndex);
>     }  
>  [...]     
> final String cleanPath = new URI(urlPath).getPath(); {code}
> Problem is, if the urlPath contains blank(s), the new URI(...) call will throw an URISyntaxException and the plugins are not loaded.
> Simple solution would be an additional check and replacement of the blanks with "%20".
> {code:java}
> if(urlPath.contains(" ")){
>     // System.out.println("Blank in URL detected, will fail as URI! Replacing with '%20'");
>     urlPath = urlPath.replaceAll(" ", "%20");
> }
> final String cleanPath = new URI(urlPath).getPath(); {code}
> We built the current release-2,x from the repo ([https://gitbox.apache.org/repos/asf/logging-log4j2.git]), had the same issue as before (2.17.2) but with this check added it works.
> As we can't run the maven build with tests (there seems to be a proxy issue for the MongoDB Tests), we decided not to open a pull-request. Please let us know, if you prefer a pull-request or if you need further information.
> (i) We are using the log4j-bridge at the moment, maybe this issue only shows up when using this besides log4j2 core and api (i) 
>  
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)