Google App Engine JRE Класс "Черный список" - PullRequest
10 голосов
/ 15 апреля 2009

Для Google App Engine существует " Белый список класса JRE ".

Что мне действительно нужно, так это «черный список» - другими словами, API-интерфейсы Java, которые не будут работать в GAE. Существует ли такой список? У кого-нибудь из разработчиков возникали проблемы с API Java на GAE?

Ответы [ 5 ]

9 голосов
/ 15 апреля 2009

Похоже, что они заняли больше места в «белом списке»: http://code.google.com/appengine/docs/java/jrewhitelist.html.

Здесь также есть более подробная информация о песочнице (к каким файлам она может получить доступ и т. Д.) Здесь: http://code.google.com/appengine/docs/java/runtime.html#The_Sandbox

Ограничения кажутся довольно интуитивными (например, ограниченный доступ к файловой системе, отсутствие JNI и т. Д.).

6 голосов
/ 15 апреля 2009

Я не знаю черный список, но может пригодиться следующая ссылка: http://groups.google.com/group/google-appengine-java/web/will-it-play-in-app-engine

1 голос
/ 23 декабря 2015

Я искал что-то, когда натолкнулся на этот запрос, и поэтому подумал поделиться подробностями в черно-белом списке GAE (Google App Engine), чтобы любой, кто получил такую ​​проблему, мог решить ее должным образом. Детали: -

appengine-agentruntime.jar имеет две переменные экземпляра: -

private static Agent agent      
private static Set<String> blackList

Мы получаем черный список от агента и агента = AppEngineDevAgent.getAgent(). Поэтому, если мы проверим b) appengine-agent.jar , мы найдем агент Class<?> implClass = agentImplLoader.loadClass("com.google.appengine.tools.development.agent.impl.AgentImpl");

А затем перейдя в класс AgentImpl, т.е. в) appengine-agentimpl.jar мы можем смотрите, как переменная черного списка заполняется при загрузке класса со статической инициализацией и ссылается на белый список для фильтрации разрешенных классов.

static {
            initBlackList();
        }

    public static Set<String> getBlackList() {
        return blackList;
    }

    private static boolean isBlackListed(String className) {
        Set<String> whiteList = WhiteList.getWhiteList();
        return (!whiteList.contains(className))
                && (!className.startsWith("com.sun.xml.internal.bind."));
    }

Наконец, можете проверить d) appengine-tools-sdk-1.8.3.jar для получения списка всех классов WhiteList.

Вывод: Для того, чтобы использовать любой класс JRE, который не принадлежит этому WhiteList, нужно поиграться либо с WhiteList, либо с BlackList . Возможный взлом будет, если вы отключите библиотеку appengine-agentruntime.jar и прокомментируете содержимое метода отклонения как

public static void reject(String className) {
    /*throw new NoClassDefFoundError(className + " is a restricted class. Please see the Google " + " App Engine developer's guide for more details.");*/
  }

А потом снова встряхните его и используйте в своем проекте. Надеюсь, это поможет.

----------------------------------------------- ------------------------------

a) appengine-agentruntime.jar : - Содержит фактический класс Runtime , который выдает исключение (из reject method) для классов, которые не принадлежат в белый список выше.

package com.google.appengine.tools.development.agent.runtime;

import com.google.appengine.tools.development.agent.AppEngineDevAgent;
import com.google.appengine.tools.development.agent.impl.Agent;
import com.google.apphosting.utils.clearcast.ClearCast;
//REMOVED OTHER IMPORTS TO KEEP IT SHORT

public class Runtime {

    private static Agent agent = (Agent) ClearCast.cast(
            AppEngineDevAgent.getAgent(), Agent.class);

    private static Set<String> blackList = agent.getBlackList();

    public static ClassLoader checkParentClassLoader(ClassLoader loader) {
        ClassLoader systemLoader = ClassLoader.getSystemClassLoader();
        return (loader != null) && (loader != systemLoader) ? loader
                : Runtime.class.getClassLoader();
    }

    public static void recordClassLoader(ClassLoader loader) {
        agent.recordAppClassLoader(loader);
    }

    public static void reject(String className) {
        throw new NoClassDefFoundError(className
                + " is a restricted class. Please see the Google "
                + " App Engine developer's guide for more details.");
    }

    private static boolean isBlackListed(Class klass) {
        String className = klass.getName().replace('.', '/');
        return blackList.contains(className);
    }

    // REMOVED OTHER METHODS TO KEEP IT SHORT
}

b) appengine-agent.jar : -

package com.google.appengine.tools.development.agent;

import com.google.apphosting.utils.clearcast.ClearCast;
//REMOVED OTHER IMPORTS TO KEEP IT SHORT

public class AppEngineDevAgent {
    private static final String AGENT_IMPL = "com.google.appengine.tools.development.agent.impl.AgentImpl";
    private static final String AGENT_IMPL_JAR = "appengine-agentimpl.jar";
    private static final Logger logger = Logger.getLogger(AppEngineDevAgent.class.getName());
    private static Object impl;

    public static void premain(String agentArgs, Instrumentation inst) {
        URL agentImplLib = findAgentImplLib();
        URLClassLoader agentImplLoader = new URLClassLoader(
                new URL[] { agentImplLib }) {
            protected PermissionCollection getPermissions(CodeSource codesource) {
                PermissionCollection perms = super.getPermissions(codesource);
                perms.add(new AllPermission());
                return perms;
            }
        };
        try {
            Class<?> implClass = agentImplLoader
                    .loadClass("com.google.appengine.tools.development.agent.impl.AgentImpl");
            impl = ((AgentImplStruct) ClearCast.staticCast(implClass,
                    AgentImplStruct.class)).getInstance();
            AgentImplStruct agentImplStruct = (AgentImplStruct) ClearCast.cast(
                    impl, AgentImplStruct.class);
            agentImplStruct.run(inst);
        } catch (Exception e) {
            logger.log(
                    Level.SEVERE,
                    "Unable to load the App Engine dev agent. Security restrictions will not be completely emulated.",
                    e);
        }
    }

    public static Object getAgent() {
        return impl;
    }

    //REMOVED OTHER METHODS TO KEEP IT SHORT
}

c) appengine-agentimpl.jar : -

package com.google.appengine.tools.development.agent.impl;

import com.google.apphosting.runtime.security.WhiteList;
//REMOVED OTHER IMPORTS TO KEEP IT SHORT

public class BlackList {
    private static final Logger logger = Logger.getLogger(BlackList.class.getName());
    private static Set<String> blackList = new HashSet();

    static {
        initBlackList();
    }

    public static Set<String> getBlackList() {
        return blackList;
    }

    private static boolean isBlackListed(String className) {
        Set<String> whiteList = WhiteList.getWhiteList();
        return (!whiteList.contains(className))
                && (!className.startsWith("com.sun.xml.internal.bind."));
    }

    private static void initBlackList() {
        Set<File> jreJars = getCurrentJreJars();
        for (File f : jreJars) {
            JarFile jarFile = null;
            try {
                jarFile = new JarFile(f);
            } catch (IOException e) {
                logger.log(
                        Level.SEVERE,
                        "Unable to read a jre library while constructing the blacklist. Security restrictions may not be entirely emulated. "
                                + f.getAbsolutePath());
            }
            continue;

            Enumeration<JarEntry> entries = jarFile.entries();
            while (entries.hasMoreElements()) {
                JarEntry entry = (JarEntry) entries.nextElement();
                String entryName = entry.getName();
                if (entryName.endsWith(".class")) {
                    String className = entryName.replace('/', '.').substring(0,
                            entryName.length() - ".class".length());
                    if (isBlackListed(className)) {
                        blackList.add(className.replace('.', '/'));
                    }
                }
            }
        }
        blackList = Collections.unmodifiableSet(blackList);
    }

    private static Set<File> getCurrentJreJars() {
        return getJreJars(System.getProperty("java.home"));
    }

    //REMOVED OTHER METHODS TO KEEP IT SHORT
}

d) appengine-tools-sdk-1.8.3.jar : - У него есть класс с именем WhiteList , который включает в себя все разрешенные классы JRE.

package com.google.apphosting.runtime.security;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class WhiteList {
    private static Set<String> whiteList = new HashSet(
            Arrays.asList(new String[] {
                    "java.beans.Transient",
                    "java.lang.BootstrapMethodError",
                    "java.lang.Character$UnicodeScript",
                    "java.lang.ClassValue",
                    "java.lang.SafeVarargs",

                    //Removed other classes to keep this article short

                    "java.net.URLClassLoader",
                    "java.security.SecureClassLoader",
                    "sun.net.spi.nameservice.NameService" }));

    public static Set<String> getWhiteList() {
        return whiteList;
    }
}
1 голос
/ 01 сентября 2011

Я использую сервлет в своем проекте GAE, однако его нет в белом списке, даже когда он будет работать без проблем. На самом деле, Google упоминает, как использовать сервлет, но его нет в белом списке

import javax.servlet.http. *;

Упоминается здесь:

http://code.google.com/appengine/docs/java/runtime.html

но сюда не включается:

http://code.google.com/appengine/docs/java/jrewhitelist.html

Я люблю GAE (потому что свободная квота), но документация - беспорядок.

Я использую IntelliJ, и он помечается как ошибка, когда импорт отсутствует в белом списке. Однако его можно отключить.

1 голос
/ 01 июня 2009

Я получил карту с рекламой этой услуги в Google I / O:

Анализатор совместимости LTech AppEngine

Звучит так, будто это может быть вам полезно. Я не пробовал, если вы попробуете, пожалуйста, вернитесь и прокомментируйте. Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...