• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Отображение ответа в Web

  • Автор темы killa007
  • Дата начала
K

killa007

народ, помогите, пожалуйста!
Необходимо из вьюшки создавать ответный документ по нажатию кнопки. Форма для ответа создана, Кнопка "response" на вьюшке тоже (@Command([ComposeWithReference]; ""; "resp"; 2)). Вопрос вот в чем: при нажатии в Internet explorer созданной мной кнопки, выскакивает ошибка 500! В чем же дело? причем если форму "resp" сделать простой, а не response, то все открывается без проблем...:)
 
K

K-Fire

Гмм, а как вы себе в вебе представляете определение кто для респонза является парентом? ;)
 
A

Akupaka

ComposeWithReference @Command
...
This command does not work on the Web
@Commands on the Web
...
Compose
The Compose @command creates a new document.
To create a main document in the current database, specify only the form parameter and implement Compose in a view, page, or navigator. The following example, implemented as a view action, creates a main document based on the "Main Topic" form.
@Command([Compose]; "Main Topic")
To create a response document, specify the @command as above but implement it in an open document. For example, if the following code is implemented as an action on the "Main Topic" form, opening a document based on that form and pressing the button creates a response document:
@Command([Compose]; "Response")
To create a main document in another database, specify the database and form parameters. You must specify server as an empty string because the browser cannot access another server. The following example creates a new document in "document examples.nsf" based on the "Main Topic" form in that database.
@Command([Compose]; "" : "document examples.nsf"; "Main Topic")
These @commands are equivalent to URL commands formatted as follows:

 
K

killa007

Видите ли, я всего лишь начинающий, а сделать нужно много за маленький промежуток времени...;)никак не представляю, как определить в вебе парента для респонза:) потому я сюда и написал
 
A

Akupaka

Видите ли, я всего лишь начинающий
не отмазывайся, читай то, что тебе написали, думай, задавай вопросы! ;)
с помощью кнопки и js можно открыть урл по форме (выше описание из справки)
http://host/database/form?OpenForm&ParentUNID=mainunid
документ, который создается при этом будет "думать", что он дочерний от того, чей унид указан параметром ParentUNID
 
K

killa007

2 akupaka.
Спасиба, но @Command([Compose],"resp"); работать тоже не хочет. В content help есть указание на то, что необходимо в form formula у вьюшки написать следующую команду: @If(@IsNewDoc; @Return(Form); @IsResponseDoc;"Response";"MainTopic"), однако это тоже не возымело эффекта...
Кста, а как работать с UNIDами? назначать или ...?
 
A

Akupaka

ну, чтение хелпа это хорошо, но ты куда-то не туда ушел :)

итак, формулы!
объяснять буду просто, не используя ничего лишнего! рекмендую сначала тоже создать минимум для примера, чтобы понять как работает, а потом переделывать существующее приложение под веб.

1) создай на сервере (лучше) базу для тестов, дай доступ Anonymous - Author (чтобы без аутентификации работать)
2) создай форму для основного (родительского дока), тип Document, имя/alias "WebMain"
- помести на ней поле "thisUnid" тип text - computed when composed, формула @Text(@DocumentUniqueID)
- помести кнопку Save: @Command([FileSave])
- помести кнопку Compose Resp: @Command([Compose]; "WebResp")
3) создай форму для ответного (дочернего дока), тип Response или Response to Response, имя/alias "WebResp"
- помести на ней поле "thisUnid" тип text - computed when composed, формула @Text(@DocumentUniqueID)
- помести кнопку Save: @Command([FileSave])

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

откроется форма с полем и двумя кнопками. в виду описанной выше особенности в поле будет некоторое значение-унид, но после нажатия на кнопку сохранения он изменится. именно после сохранения дока (в веб) значение будет реальным унидом, до сохранения - фигня.
(если нажать на кнопку Compose Resp до сохранения, то будет ошибка 500 - сервер попытается создать дочерний док к несуществующему, где-то там у него возникнет исключение и браузер покажет сообщение об 500-й ошибке)
теперь, после сохранения, нажми на кнопку Compose Resp. откроется (в текущем окне) новая форма - дочернего дока. как и прежде поле с унидом будет содержать фигню.
но нам интересно, что URL открытого дока будет иметь не просто вид ,
а там появится еще параметр &ParentUNID=хххххххххххххххххххххххххххххххх
где хххххххххххххххххххххххххххххххх будет иметь значение такое же, как в предыдущем документе в поле (т.е. реальный унид родительского документа!).
единственное, что получить его в дочернем доке с помощью привычной формулы @InheritedDocumentUniqueID нельзя.
нужно распарсить URL такой формулой @UrlQueryString("ParentUNID")

теперь добавь на форму WebResp еще поле "ParentUNID" text, computed when composed с формулой @UrlQueryString("ParentUNID")
и попробуй создать снова новый родительский док, сохранить его, потом нажать Create Resp. в новом родительском доке будет второе поле, с тем же значением, что и в URL-параметре ParentUNID.

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

зы: к сожалению, такой простой способ не всегда самый удобный. но для понимания принципов лучше начинать с простого.
зы2: ты javascript знаешь? веб-страницы умеешь делать? в домино-приложениях полный новичек или под нотес умеешь писать?..
 
K

killa007

спасибо, Akupaka, за простой и понятный пример:) в нем-то я разобрался. JS, Perl знаю немного, web-странички писать умею, и скрипты к ним, а вот в Lotus - новичек, только в рамках учебного курса в институте владею.
 
A

Akupaka

ну, раз разобрался, то спрашивай дальше :)
 
K

killa007

Возник новый вопрос - чтобы сделать респонз из вьюшки, необходимо ParentUnid куда-нить записать, а затем вставить оттуда в адресную строку(этго если я все правильно понимаю). Так вот, есть ли какие @commands, позволяющие помещать и извлекать текст из, скажем, поля?
 
A

Akupaka

вообще, я из стандартных средств не помню возможности создать в вебе ответный по выделенному в виде...
чтобы из вида в вебе создать дочерний придется поиграться с JS и, возможно, вид определенным образом подстроить...
посмотри, что твой вид генерит в html, можешь ли ты оттуда вытащить унид дока, который выделяешь для создания дочернего?

если включить возможность выделения доков в вебе (свойства вида, 5-я закладка, Web Access / Allow selection of documents), то каждый "док" будет содержать чекбокс (<INPUT TYPE=checkbox NAME="$$SelectDoc" VALUE="EE433F6647FBD158C22575C1002B19F8">) из которого можно достать унид. т.е. можно написать скрипт, который будет определять выделенный док и открывать урл
http_ ://servername/dbname.nsf/WebResp?OpenForm&ParentUNID=хххххххххххххххххххххххххххххххх

т.е. тут чистый JS-скрипт.
вот пример, возможно не самый лучший, но рабочий :)
в виде две кнопки:
Create Main: Client/Formula:
Код:
@Command([Compose]; "WebMain")
Create Resp: Web/java script:
Код:
var selDoc = document.getElementsByName("$$SelectDoc");
var parentUNID = "";
var respURL = "";
if (selDoc.length > 0) {
for (var i = 0; i < selDoc.length; i++) {
if (selDoc[i].checked) {
parentUNID = selDoc[i].value;
break;
}
};
};
respURL = "WebResp?OpenForm&ParentUNID=" + parentUNID;
//alert(respURL);
window.open(respURL);

если поставить галочку в виде и нажать на Create Resp, то откроется новое окно с новым дочерним доком к первому выделенному в виде...
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!