diff -r d5e927d5853b -r 7cee158cb8cd javaruntimes/midp/runtime/javasrc/javax/microedition/midlet/MIDlet.java --- a/javaruntimes/midp/runtime/javasrc/javax/microedition/midlet/MIDlet.java Tue Sep 14 21:06:50 2010 +0300 +++ b/javaruntimes/midp/runtime/javasrc/javax/microedition/midlet/MIDlet.java Wed Sep 15 12:05:25 2010 +0300 @@ -25,6 +25,8 @@ import com.nokia.mj.impl.rt.ui.RuntimeUi; import com.nokia.mj.impl.rt.ui.RuntimeUiFactory; +import com.nokia.mj.impl.rt.midp.SchemeHandlerBase; + import com.nokia.mj.impl.rt.support.ApplicationInfo; import com.nokia.mj.impl.security.midp.authorization.AccessControllerFactoryImpl; @@ -34,6 +36,7 @@ import com.nokia.mj.impl.utils.Id; import com.nokia.mj.impl.utils.Logger; + /** * A class to be extended by the MIDlet applcation. See MIDP spec for * further details. @@ -56,6 +59,8 @@ */ private static boolean mConstructionAllowed = true; + private static final int DOMAIN_MANUFACTURER_OR_OPERATOR = 1; + /*** ----------------------------- PUBLIC ------------------------------ */ /** @@ -139,6 +144,7 @@ { Logger.PLOG(Logger.EJavaRuntime, "MIDlet.platformRequest(): " + url); + if (null == url) { throw new NullPointerException( @@ -153,24 +159,30 @@ return false; } + ApplicationInfo appInfo = ApplicationInfo.getInstance(); + String domain = appInfo.getProtectionDomain(); + + // Handling for java scheme. + /*if (url.startsWith("java://")) + { + String handlerName = parseHandlerName(url); + + if (handlerName.equals("taskmanager")) + { + // Check application is bound either Manufacturer or Operator domain. + enforceSecurityDomain(DOMAIN_MANUFACTURER_OR_OPERATOR, domain); + } + + return invokeSchemeHandler(handlerName, url); + }*/ + // If the platform request is used to start arbitrary native application, // check that MIDlet is in manufacturer or operator domain if (startsArbitraryNativeApp(url)) { - ApplicationInfo appInfo = ApplicationInfo.getInstance(); - String domain = appInfo.getProtectionDomain(); - if ((ApplicationInfo.MANUFACTURER_DOMAIN.equals(domain) != true) && - (ApplicationInfo.OPERATOR_DOMAIN.equals(domain) != true)) - { - Logger.WLOG(Logger.EJavaRuntime, - "Only manufacturer or operator domain MIDlets can start arbitrary native apps."); - - throw new ConnectionNotFoundException( - "Request allowed only for manufacturer or operator MIDlets"); - } + enforceSecurityDomain(DOMAIN_MANUFACTURER_OR_OPERATOR, domain); } - Logger.ILOG(Logger.EJavaRuntime, "Before handleConfirmationNote()"); @@ -362,6 +374,72 @@ return false; } + private String parseHandlerName(String url) throws ConnectionNotFoundException + { + // Parse handler name from URL. Remove java:// prefix. + String handlerName = url.substring(7).trim(); + + // name format: handlername?query + int nameEndIndex = handlerName.indexOf('?'); + + if (nameEndIndex != -1) + { + handlerName = handlerName.substring(0, nameEndIndex); + return handlerName; + } + else + { + throw new ConnectionNotFoundException("Handler not found for URL"); + } + } + + private boolean invokeSchemeHandler(String handlerName, String url) + throws ConnectionNotFoundException + { + try + { + // Avoid loading whatever class from the system using handler + // as package name. + Class clazz = Class.forName("com.nokia.mj.impl.rt." + handlerName + ".SchemeHandler"); + + SchemeHandlerBase handler = (SchemeHandlerBase)clazz.newInstance(); + + handler.execute(url); + return false; // No need to close MIDlet. + } + catch (Throwable t) + { + Logger.ELOG(Logger.EJavaRuntime, "Cannot invoke scheme handler: " + t.toString()); + // ClassNotFoundException, IllegalAccessException or InstantionException. + throw new ConnectionNotFoundException("Handler not found for URL"); + } + } + + private void enforceSecurityDomain(int type, String domain) + throws ConnectionNotFoundException + { + if (DOMAIN_MANUFACTURER_OR_OPERATOR == type) + { + if ((ApplicationInfo.MANUFACTURER_DOMAIN.equals(domain) != true) && + (ApplicationInfo.OPERATOR_DOMAIN.equals(domain) != true)) + { + Logger.WLOG(Logger.EJavaRuntime, + "Only manufacturer or operator domain MIDlets can invoke scheme"); + + throw new ConnectionNotFoundException( + "Request allowed only for manufacturer or operator MIDlets"); + } + } + else + { + Logger.ELOG(Logger.EJavaRuntime, + "Security enforcement failed: unknown domain category"); + + throw new ConnectionNotFoundException( + "Security enforcement failed: unknown domain category"); + } + } + /*** ----------------------------- NATIVE ----------------------------- */ private native void _managePlatformRequest(String url);