{"record":{"id":"3f2de8f99188d209","repo":"pentaho/pentaho-kettle","slug":"cannot-open-browser-on-os","errorCode":null,"errorMessage":"Cannot open browser on OS: ","messagePattern":"Cannot open browser on OS: ","errorType":"exception","errorClass":"IOException","httpStatus":null,"severity":"error","filePath":"ui/src/main/java/org/pentaho/di/ui/repo/service/BrowserAuthenticationService.java","lineNumber":355,"sourceCode":"        desktop.browse( URI.create( url ) );\n        log.logBasic( \"Opened system browser: \" + url );\n        return;\n      }\n    }\n\n    // OS-specific fallback using ProcessBuilder with separated arguments\n    // to avoid command-injection risks and handle URLs with spaces correctly.\n    String os = System.getProperty( \"os.name\" ).toLowerCase();\n    ProcessBuilder pb;\n\n    if ( os.contains( \"win\" ) ) {\n      pb = createProcessBuilder( \"rundll32\", \"url.dll,FileProtocolHandler\", url );\n    } else if ( os.contains( \"mac\" ) ) {\n      pb = createProcessBuilder( \"open\", url );\n    } else if ( os.contains( \"nix\" ) || os.contains( \"nux\" ) ) {\n      pb = createProcessBuilder( \"xdg-open\", url );\n    } else {\n      throw new IOException( \"Cannot open browser on OS: \" + os );\n    }\n\n    pb.redirectErrorStream( true );\n    pb.start();\n  }\n\n  /**\n   * Creates a {@link ProcessBuilder} with the given command arguments.\n   * Package-visible to allow overriding in tests.\n   */\n  ProcessBuilder createProcessBuilder( String... command ) {\n    return new ProcessBuilder( command );\n  }\n\n  /**\n   * URL encoding utility.\n   */\n  static String encodeURIComponent( String value ) {","sourceCodeStart":337,"sourceCodeEnd":373,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/ui/src/main/java/org/pentaho/di/ui/repo/service/BrowserAuthenticationService.java#L337-L373","documentation":"openSystemBrowser picks a per-OS command (rundll32 on Windows, open on mac, xdg-open on *nix) to launch the browser for OAuth authentication. If the OS string matches none of these branches it throws IOException('Cannot open browser on OS: ' + os), meaning the platform is unsupported for browser-based authentication.","triggerScenarios":"Calling authenticate() on an OS whose os.name contains none of 'win', 'mac', 'nix'/'nux' — e.g. unknown/forked JVM os.name values, exotic Unix variants, or OS/2-like platforms.","commonSituations":"Running Pentaho on unusual Unix flavors (e.g. AIX with os.name='AIX'? actually nux may match), containers without a desktop where even the matched command fails silently, or JVMs reporting a non-standard os.name.","solutions":["Run on a supported platform (Windows, macOS, or Linux/Unix with xdg-open installed).","Install/put 'xdg-open' on PATH for headless Unix variants, or set up an alternative browser launcher.","If the OS truly is unsupported, use a non-browser authentication flow (token-based repository login) instead of authenticate()."],"exampleFix":"// before\nservice.authenticate(); // throws on unsupported OS\n// after\nString os = System.getProperty( \"os.name\" ).toLowerCase();\nif ( !( os.contains( \"win\" ) || os.contains( \"mac\" ) || os.contains( \"nix\" ) || os.contains( \"nux\" ) ) ) {\n  useTokenBasedLogin();\n} else {\n  service.authenticate();\n}","handlingStrategy":"fallback","validationCode":"String os = System.getProperty( \"os.name\" ).toLowerCase();\nboolean browserSupported = os.contains( \"win\" ) || os.contains( \"mac\" )\n  || os.contains( \"nix\" ) || os.contains( \"nux\" );\nif ( !browserSupported ) {\n  LOGGER.warning( \"Unsupported OS for browser auth: \" + os + \"; using token login\" );\n}","typeGuard":null,"tryCatchPattern":"try {\n  authService.authenticate();\n} catch ( IOException e ) {\n  if ( e.getMessage() != null && e.getMessage().startsWith( \"Cannot open browser on OS:\" ) ) {\n    promptForManualTokenEntry();\n  } else {\n    throw e;\n  }\n}","preventionTips":["Detect os.name at startup and surface unsupported platforms early, before login.","On Unix targets ensure xdg-open is installed; on servers prefer headless/token auth.","Avoid exotic JVM os.name values by running on mainstream JDK builds.","Provide a manual URL-copy/paste flow as a fallback for unsupported OSes."],"tags":["os","browser","unsupported-platform","oauth","process"],"backgroundTag":"unsupported-platform","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}