Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / веб-приложение, авторизация / 25 сообщений из 49, страница 1 из 2
02.02.2012, 11:33:05
    #37643484
Вladimir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб-приложение, авторизация
Здравствуйте,
посоветуйте, как лучше реализовать авторизацию в приложении?

есть вебприложение (smartgwt), развернутое на glassfish. в приложении отображаются, редактируются и тп. данные, хранящиеся в бд оракл. используются рест службы.

теперь необходимо реализовать авторизацию пользователей. пользователи заводятся в самой базе. в оракле вьюшки, отображающие данные о пользователе - sys.dba_role_privs, dba_users, dba_roles. попробовал использовать jdbcrealm, не получилось, скорее всего изза пароля, всмысле шифрование на гласфише и в оракл разные (это предположение). а так было б хорошо, если указать в web.xml security-constraint для ролей и прописать там - какие можно выполнять запросы get, post ....
...
Рейтинг: 0 / 0
02.02.2012, 11:43:29
    #37643516
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб-приложение, авторизация
1. Прочитать мануал соответствующего сервера приложений по конфигурированию реалма в БД
2. Предпринять необходимые действия
3. Если что-то не получилось - выложить сюда максимально полную информацию об ошибке - что делали, что за ошибка, как пытались исправить и т.д..
...
Рейтинг: 0 / 0
02.02.2012, 12:41:54
    #37643652
Вladimir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб-приложение, авторизация
svenom,

создаю пул jdbc/test. теперь создаю реалм testRealm -

JAAS Context: jdbcRealm
JNDI: jdbc/test
User Table: sys.dba_users
User Name Column: username
Password Column: password
Group Table: sys.dba_users_roles
Group Name Column: GRANTED_ROLE

поля encoding и Digest Algorithm при создании реалма пробовал заполнять разными способами, т.е. Digest Algorithm: none, SHA-256, MD5, для encoding: Hex, Base64.

web.xml


<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns=" http://java.sun.com/xml/ns/javaee" xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>LogoutServlet</servlet-name>
<servlet-class>security.LogoutServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LogoutServlet</servlet-name>
<url-pattern>/LogoutServlet</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>
index.jsp
</welcome-file>
</welcome-file-list>
<security-constraint>
<web-resource-collection>
<web-resource-name>Secure Pages</web-resource-name>
<url-pattern>/restricted/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>root</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>testRealm</realm-name>
</login-config>
<security-role>
<description/>
<role-name>root</role-name>
</security-role>
</web-app>


glassfish-web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" " http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app error-url="">
<context-root>/SecurityTest</context-root>
<class-loader delegate="true"/>
<jsp-config>
<property name="keepgenerated" value="true">
<description>Keep a copy of the generated servlet class' java code.</description>
</property>
</jsp-config>
<security-role-mapping>
<role-name>root</role-name>
<group-name>root</group-name>
</security-role-mapping>
</glassfish-web-app>


можно сказать все как по учебнику, но при авторизации, при вводе даже верного пароля не логинится и в логах пишется следующее


[#|2012-01-31T13:24:40.506+0600|WARNING|glassfish3.1|javax.enterprise.system.container.web.com.sun.web.security|_ThreadID=120;_ThreadName=Thread-1;|WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Security Exception|#]

[#|2012-01-31T13:24:40.506+0600|WARNING|glassfish3.1|javax.enterprise.system.container.web.com.sun.web.security|_ThreadID=120;_ThreadName=Thread-1;|Exception
com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Security Exception
at com.sun.enterprise.security.auth.login.LoginContextDriver.doPasswordLogin(LoginContextDriver.java:394)
at com.sun.enterprise.security.auth.login.LoginContextDriver.login(LoginContextDriver.java:240)
at com.sun.enterprise.security.auth.login.LoginContextDriver.login(LoginContextDriver.java:153)
at com.sun.web.security.RealmAdapter.authenticate(RealmAdapter.java:483)
at com.sun.web.security.RealmAdapter.authenticate(RealmAdapter.java:425)
at org.apache.catalina.authenticator.BasicAuthenticator.authenticate(BasicAuthenticator.java:176)
at com.sun.web.security.RealmAdapter.invokeAuthenticateDelegate(RealmAdapter.java:1192)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:551)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:623)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:9
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:326)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:227)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:170)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822)
at com.sun.grizzly.comet.CometEngine.executeServlet(CometEngine.java:444)
at com.sun.grizzly.comet.CometEngine.handle(CometEngine.java:308)
at com.sun.grizzly.comet.CometAsyncFilter.doFilter(CometAsyncFilter.java:87)
at com.sun.grizzly.arp.DefaultAsyncExecutor.invokeFilters(DefaultAsyncExecutor.java:171)
at com.sun.grizzly.arp.DefaultAsyncExecutor.interrupt(DefaultAsyncExecutor.java:143)
at com.sun.grizzly.arp.AsyncProcessorTask.doTask(AsyncProcessorTask.java:94)
at com.sun.grizzly.http.TaskBase.run(TaskBase.java:193)
at com.sun.grizzly.http.TaskBase.execute(TaskBase.java:175)
at com.sun.grizzly.arp.DefaultAsyncHandler.handle(DefaultAsyncHandler.java:145)
at com.sun.grizzly.arp.AsyncProtocolFilter.execute(AsyncProtocolFilter.java:204)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
at java.lang.Thread.run(Thread.java:619)
Caused by: javax.security.auth.login.LoginException: Security Exception
at javax.security.auth.login.LoginContext.invoke(LoginContext.java:856)
at javax.security.auth.login.LoginContext.access$000(LoginContext.java:186)
at javax.security.auth.login.LoginContext$4.run(LoginContext.java:683)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:680)
at javax.security.auth.login.LoginContext.login(LoginContext.java:579)
at com.sun.enterprise.security.auth.login.LoginContextDriver.doPasswordLogin(LoginContextDriver.java:382)
... 36 more
Caused by: java.lang.SecurityException
at javax.security.auth.login.LoginContext.invoke(LoginContext.java:857)
... 42 more
|#]
...
Рейтинг: 0 / 0
02.02.2012, 13:35:51
    #37643769
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб-приложение, авторизация
Вladimir,
Это весь стек трейс? Глубже ничего нету? Если есть - выкладывайте, если нет - попробуйте поставить брейкпоинт на java.lang.SecurityException и посмотрите, что там реально происходит.
...
Рейтинг: 0 / 0
02.02.2012, 13:43:25
    #37643789
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб-приложение, авторизация
Ну а вообще вам, разумеется, надо искать способ преобразовать пароль из текста к виду, который используется в оракле.
Как это сделать - хз. Я бы начал с чтения доки по ораклу, что бы понять, как там хранятся пароли. Потом погуглил бы, так как наверняка вы не первый, кто хочет сделать такое. Если гугл не поможет, то варианты такие:
1) Писать свой реалм для работы с ораклом
2) Научиться перегонять оракловский пароль в текст, а потом шифровать его одним из известных Glassfish алгоритмов.
3) Может быть можно имплементировать свой алгоритм преобразования и как-то подсунуть его Glassfish, ну типа Digest Algorithm = MyCustomAlgorithm.
...
Рейтинг: 0 / 0
02.02.2012, 14:44:47
    #37643965
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб-приложение, авторизация
я что-то не пойму.
Какой пароль к СУБД, если пулинг?
- либо нет пулинга и авторизация в СУБД
- либо пулинг и ПРОКСИ авторизация.
IMHO не надо смешивать обе технологии.

может вот это поможет?
http://habrahabr.ru/blogs/java/92608/
______________________________________________
"Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн.
AutoPOI.ru — ГИС-технологии для Oracle
...
Рейтинг: 0 / 0
02.02.2012, 14:52:49
    #37643990
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб-приложение, авторизация
Petro123я что-то не пойму.
Какой пароль к СУБД, если пулинг?
- либо нет пулинга и авторизация в СУБД
- либо пулинг и ПРОКСИ авторизация.
IMHO не надо смешивать обе технологии.Речь не об этом. Есть коннекшн к базе - тут вопросов нет. А в базе так же есть информация о пользователях в стандартных оракловских табличках, т.е. пользователь приложения = пользователь Oracle. И надо научить Glassfish аутентифицировать пользователей по этой информации.
...
Рейтинг: 0 / 0
02.02.2012, 15:06:12
    #37644022
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб-приложение, авторизация
svenomА в базе так же есть информация о пользователях в стандартных оракловских табличках, т.е. пользователь приложения = пользователь Oracle.

нет.
Мы это обсуждали.
Либо
create user aaaaa password bbbbb
тогда это аут-ия СУБД и на каждого юзверя по 1 схеме.
Либо на каждого из пула берётся коннект ОДНОГО суперЮзверя. (Веб)

Есть ещё смешанные варианты
ЗЫ
Если пассс и имя в стандартной табличке, тогда обычное select
...
Рейтинг: 0 / 0
02.02.2012, 15:07:44
    #37644027
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб-приложение, авторизация
svenomт.е. пользователь приложения = пользователь Oracle.

вот это не верно.
Второй это CREATE USER
...
Рейтинг: 0 / 0
02.02.2012, 15:13:36
    #37644041
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб-приложение, авторизация
Petro123svenomА в базе так же есть информация о пользователях в стандартных оракловских табличках, т.е. пользователь приложения = пользователь Oracle.

нет.
Мы это обсуждали.
Либо
create user aaaaa password bbbbb
тогда это аут-ия СУБД и на каждого юзверя по 1 схеме.
Либо на каждого из пула берётся коннект ОДНОГО суперЮзверя. (Веб)

Есть ещё смешанные варианты
ЗЫ
Если пассс и имя в стандартной табличке, тогда обычное selectВот странно - вы вроде и понимаете, а вроде и нет. Еще раз попытаюсь пояснить за автора.
1) Есть СУБД Oracle.
2) В СУБД есть специальный системынй пользователь и ассоциированная с ним схема (или чужая схема, но к которой у пользователя есть объектный привилегии), через которого AppServer подключается к БД.
3) Далее, в этой жу СУБД есть еще 100500 других пользователей у которых нет никаких схем (ну есть то они есть, просто пустые) с точки зрения приложения. Нам плевать на их схемы. Важно то, что в системных таблицах СУБД хранятся их данные - пароль и роли.
4) Идея автора заключается в том, что бы приспособить стандартный JDBCRealm Глассфиша так, что бы он мог аутентифицировать пользователей приложения по данным из этих системных таблиц Oracle. Все, точка. Больше нам эти пользователи ни для чего не нужны.
Эта задача хитрая, возможно глупая, но она решаемая. Вопрос - как ее решить.
...
Рейтинг: 0 / 0
02.02.2012, 15:27:03
    #37644069
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб-приложение, авторизация
ну дак я и спрашиваю про то ЧТО Я НЕ ПОНЯЛ
Я ж субд больше знаю, чем аппсервер
svenom3) Далее, в этой жу СУБД есть еще 100500 других пользователей у которых нет никаких схем (ну есть то они есть, просто пустые)

дак есть или нет?
- например, админка. Как узнать список пользователей?
...
Рейтинг: 0 / 0
02.02.2012, 15:27:58
    #37644071
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб-приложение, авторизация
или ещё проще - код создания нового пользователя?
...
Рейтинг: 0 / 0
02.02.2012, 15:37:23
    #37644100
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб-приложение, авторизация
Petro123дак есть или нет?
- например, админка. Как узнать список пользователей? Что есть или нет?
...
Рейтинг: 0 / 0
02.02.2012, 15:43:48
    #37644127
VoDA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб-приложение, авторизация
svenom3) Далее, в этой жу СУБД есть еще 100500 других пользователей у которых нет никаких схем (ну есть то они есть, просто пустые) с точки зрения приложения. Нам плевать на их схемы. Важно то, что в системных таблицах СУБД хранятся их данные - пароль и роли.
4) Идея автора заключается в том, что бы приспособить стандартный JDBCRealm Глассфиша так, что бы он мог аутентифицировать пользователей приложения по данным из этих системных таблиц Oracle. Все, точка. Больше нам эти пользователи ни для чего не нужны.
Эта задача хитрая, возможно глупая, но она решаемая. Вопрос - как ее решить.в пункте 3 ошибка - там НЕ ХРАНИТСЯ пароль. там хранится нечто, нужное для алгоритма авторизации СУБД (для простоты назовем хэш пароля). авторизация в этом случае возможна только использованием спец-средств СУБД.

как следствие 4-й пункт не решается через JDBCRealm в принципе. правильное решение это написание своего реалма который для авторизации вызывает функции Oracle. Реалм выступает прослойкой между тем как АппСервер запрашивает API авторизации и API Oracle для прохождения авторизации.

Для Спринг проще показать примеры как это должно работать. Работа с Realms не стандартизована, потому нужно читать доки по конкретному серверу (а часто и по конкретной версии сервера).
...
Рейтинг: 0 / 0
02.02.2012, 15:51:26
    #37644151
VoDA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб-приложение, авторизация
Petro123- например, админка. Как узнать список пользователей? зайти в стандартную админку СУБД и посмотреть
...
Рейтинг: 0 / 0
02.02.2012, 15:51:45
    #37644154
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб-приложение, авторизация
svenomPetro123дак есть или нет?
- например, админка. Как узнать список пользователей? Что есть или нет?
я сразу отвечу:
- в 1 случае - select users_name from sys.table_users (служебная таблица)
- в 2 случае - select users_nameMy from ORM (пользовательская таблица)
...
Рейтинг: 0 / 0
02.02.2012, 15:53:46
    #37644169
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб-приложение, авторизация
VoDAPetro123- например, админка. Как узнать список пользователей? зайти в стандартную админку СУБД и посмотреть
намёк на EM?
Тогда в простом случае, это 1000 схем-логинов (пускай пустых)
...
Рейтинг: 0 / 0
02.02.2012, 15:56:46
    #37644179
VoDA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб-приложение, авторизация
Petro123VoDAзайти в стандартную админку СУБД и посмотреть
намёк на EM?
Тогда в простом случае, это 1000 схем-логинов (пускай пустых)Да.

В предыдущих твоих постах я не увидел проблемы, только вопрос "как посмотреть?". Посмотреть просто. Для этого уже давно сделаны средства. Так что телепатирую, что ты пытаешься намекнуть на сложность чего то иного, но не просто "посмотреть список логинов" ;)
...
Рейтинг: 0 / 0
02.02.2012, 16:07:36
    #37644208
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб-приложение, авторизация
VoDA,
да простой был вопрос:
- через create user Оракла! создаётся новый пользователь или через insert в оракле.
Но ты сказал уже, что проще в спринг.
ОК.
...
Рейтинг: 0 / 0
02.02.2012, 16:34:58
    #37644278
VoDA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб-приложение, авторизация
Petro123VoDA,
да простой был вопрос:
- через create user Оракла! создаётся новый пользователь или через insert в оракле.
Но ты сказал уже, что проще в спринг.
ОК.Спринг выполняет авторизацию либо встроенными методами (plain JDBC) ибо через собственный алгоритм. Собственный алгоритм может действовать как программисту удобно или нужно сделать - хоть JDBC, хоть JPA, хоть отправлять запросы на авторизацию к СУБД.

Практически также работают Realms, но API для realms не специфицированы, потому под каждый сервер нужно было писать по своему. В Java EE 6 доработали авторизацию, но насколько они догнали Spring по удобству мне не ведомо.

Потому при выборе между Spring и Realm - проще работать с Spring Security.

На вопрос же "через create user Оракла! создаётся новый пользователь или через insert в оракле" это не отвечает. Тут правильно заходить с позиции "что хотите получить?" или "какие требования в ТЗ?"

Если требование в ТЗ работать через insert/select, то это можно сделать стандартными средствами Spring Security или созданными производителем сервера Realm.

Если требование в ТЗ работать через create user в Oracle, то для этого вероятнее всего придется дописать свой Manager для Spring Security или свой Realm для конкретной версии конкретного сервера.
И выбор между этими вариантами лежит на авторе топика, а не конкретной технологии.

"Если не знаешь куда идти, то ни один ветер не будет попутным"
...
Рейтинг: 0 / 0
02.02.2012, 16:47:58
    #37644329
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб-приложение, авторизация
VoDA,
Всё верно, но я одно не пойму.
Я вот с такими _твоими_ словами больше согласен:
автордля java проще авторизацию сделать на своей стороне. при этом общение с СУБД идет под одним аккаунтом и через пул коннектов. пул коннектов - сильно лучше для большого числа пользователей ибо для работы применяется меньшее количество подключений.

я полностью их разделяю, т.к. критерий-требование не insert в ТЗ, а веб+пул.
...
Рейтинг: 0 / 0
02.02.2012, 16:49:25
    #37644335
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб-приложение, авторизация
можно ещё проще:
- короткие транзакции не делают с оракловой аутентификацией (create user...)
...
Рейтинг: 0 / 0
03.02.2012, 06:02:22
    #37645082
Вladimir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб-приложение, авторизация
как много написали пока отсутствовал...

svenom правильно разъяснил, какова была моя попытка реализовать авторизацию через jdbc realm, после этой попытки понял, что через обычный jdbcrealm не получится, т.к. в оракле - в поле password это вовсе не пароль а нечто зашифрованное.

и возвращаясь к изначальному моему вопросу авторпосоветуйте, как лучше реализовать авторизацию в приложении?

самый простой вариант, это в сделать коннект к базе по данным пользователя и вытащить его роль, если она, скажем, админ, то ему можно все, если просто юзер, то заблокировать кнопочки, выполняющие post, put запросы. а хотелось бы еще, ставить некий запрет для определенной роли на выполнение get, post или put запросов.

по поводу своего реалма, не подскажите подробного примера для разбора как его написать..

приложение smartGWT, сервер glassfish 3.1
...
Рейтинг: 0 / 0
03.02.2012, 06:09:28
    #37645083
Вladimir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб-приложение, авторизация
хотя, пропустил сразу ссылку http://habrahabr.ru/blogs/java/92608/, попробую реализовать
...
Рейтинг: 0 / 0
03.02.2012, 10:04:54
    #37645191
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб-приложение, авторизация
Видимо у вас так мало времени, что вы свой тред не читаете. Иначе ответили бы на вопрос:
- как сейчас происходит соединение. Есть пул или нет? Кто дал идею заводить роли и пользователей именно Оракловых?

svenom без сомнения верно отправил вас читать документацию.
Разве там написано:
ВladimirUser Table: sys.dba_users
- что надо выставлять системные таблицы оракла с рутовыми паролями наружу в аппСервер в конфиги?
- что для авторизации необходимо в БД заводить пользователя\роли в SYS?
- что можно соединить архитектуру десктоп-корпоратив-длинные и пул-веб-короткие?
Я не спорю, SmartGWT позволяет писать так и так... только там есть ньюансы.
Это же безопасность
Удачи!
______________________________________________
"Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн.
AutoPOI.ru — ГИС-технологии для Oracle
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / веб-приложение, авторизация / 25 сообщений из 49, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]