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

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

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

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

Как определить используемый разделитель строк

  • Автор темы nvyush
  • Дата начала
N

nvyush

Здравствуйте все!
Столкнулся с такой проблемой. Есть документ, в нём рт-поле (многострочный текст). Беру этот текст и разбираю на строки. Подстроки "выкусываю" примерно так
Код:
pos0 = 1
pos1 = Instr(pos0, str, lineDelimiter)
Do Until pos1 = 0
resStr = Mid(str, pos0, pos1 - pos0)
...
pos0 = pos1 + Len(lineDelimiter)
pos1 = Instr(pos0, str, lineDelimiter)
Loop
На клиенте (8.0.1 на winxp) — всё нормально, при выполнении того же кода сервеным агентом не находятся разделители строк. Путём экспериментов выяснил, что когда код исполняется на клиенте разделитель строк cr+lf, когда на сервере (сервер на linux) — разделитель строк lf.
Чтобы не зависеть от платформы решил определять разделить строк таким образом:
Код:
Dim s As New NotesSession
Dim db As NotesDatabase
Set db = s.CurrentDatabase
Dim doc As New NotesDocument(db)
Dim rti As New NotesRichTextItem(doc, "Body")
Call rti.AddNewline(1)
lineDelimiter = rti.GetUnformattedText()
Работает, но мне кажется, что можно как-то проще. Кто подскажет, что не так?
 
A

Akupaka

ой-ей ;) ну про то где исполняется сессия мы уже флудили ;)
можешь добавить условие в код и искать либо тот, либо иной разделитель, в зависимости от места выполнения сессии, но вдруг сервак будет виндошный! нужен независимый код.

AddNewline(1) не только перенос строки добавляет, но и параграф.

а вообще, думаю, достаточно будет искать chr(10) (LF), т.к. в любом случае он является последним. но CR (chr(13)) останется в строке, а он никому не нужен...

а так попробуй?
Код:
str = rti.GetUnformattedText() ' ричтекст с текстом в строку

str = Replace(str, chr(13), "")
strArray = split(str, chr(10))
forall strArrayElement in strArray
print cstr(strArrayElement)
end forall
 
N

nvyush

Akupaka
Дело в том, что размер строки потенциально больше 32К. Так бы я загнал в многозначное поле и не парился, а тут приходится выкручиваться с рт. Думал рт-нафигатор использовать, но то ли я справку недокурил, то ли он для моей задачи не совсем подходит, в общем сделал "по старинке".
 
A

Akupaka

а мой кусочек не проверял? мне просто интересно будет ли работать как надо... но пробовать лениво ))
 
N

nvyush

а мой кусочек не проверял? мне просто интересно будет ли работать как надо... но пробовать лениво ))
На вскидку будет работать 100%, но проверять тоже лень.
Добавляемый AddNewLine параграф мне не мешает, GetUnformattedText его игнорирует. Кстати, обнаружил, что Text в данном случае возвращает пустую строку, а GetUnformattedText — разделитель строк.

Я тут с прискорбием обнаружил, что всё мне придётся переписывать на Jave. Дело в том, что агент формирует xml, который потом отправляется post-запросом на сервер провайдера услуг. На клиенте использовал IE, но на сервере его нет. Кто-нибудь в курсе, как из Java отправлять post-запросы?
 
K

K-Fire

А может проще захардкодить разделитель? :rolleyes:
 
N

nvyush

А может проще захардкодить разделитель? :rolleyes:
Было захардкодено, пока работало на клиенте. Теперь по соображениям безопасности должно обрабатываться серверным агентом.
Вкратце задача такая: по данным из рт-поля формировать xml-запросы и постить их на сторонний сервер. В запросе есть системные учётные данные, которые пользователю видеть ну совсем не надо, поэтому они берутся из системного профиля, скрытого от пользователя. Соответственно, нужно делать это серверным агентом. Отсюда две проблемы: 1) разделитель строк (криво, но решил); 2) отправка пост-запроса.
Из 2 плавно вытекает java, которую сейчас активно изучаю на sun.
Почему в качестве разделителя не использовать что-нибудь другое - с разделителями строк нагляднее отображаются исходные данные.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
214
слабо понял о чём речь...
что разделители не совпадают на платформах понял ;)
не понятно:
-где исполняется будет код
-причём здесь POST - инициатором типа запроса является клиент, или речь идет о запроси с сервера к др. серверу
 
K

K-Fire

Было захардкодено, пока работало на клиенте. Теперь по соображениям безопасности должно обрабатываться серверным агентом.
Да нет никакой разницы на клиенте или сервере. Захардкодить можно используя NotesSession.Platform.

Т.е. если Platform="Windows/32" - то пишете один разделитель, если Linux/UNIX - то другой.
 
N

nvyush

слабо понял о чём речь...
что разделители не совпадают на платформах понял :)
не понятно:
-где исполняется будет код
-причём здесь POST - инициатором типа запроса является клиент, или речь идет о запроси с сервера к др. серверу
Нужно: по экшену в форме или на вью запустить серверного агента, который откроет нужный док, сгенерит xml и отправит его post'ом на сервер по известному url, затем полученный ответ сохранит в доке.
Раньше это работало на ЛС на клиенте, но возникла задача отгородить пользователя от учётных данных. Поэтому решил использовать серверного агента. Но в этом случае создавать объект IE и постить из него не получится ;). Если не трудно, ткни, какие java-классы нужно пользовать для постинга.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
214
вот ссылки:


во втором отправляется форма для CGI скрипта

понимание процесса:


вот (на всяк случай) с SSL:


в догонку - для "больших" объемов - луча юзать StringBuffer:
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
214
забыл про прокси:
 
N

nvyush

lmike
В принципе в сторону URLConnection я и копал, но не был уверен в правильности вектора. Спасибо за вагон примеров. Эх, это б всё на нашей, а не буржуйской мове, ну да ладно, разберусь. С меня +.
 
Мы в соцсетях:

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