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

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

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

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

Аттачи: получение бинарника

Kizarek86

Green Team
20.07.2007
871
7
BIT
38
Только без выгрузки файла в какую либо директорию и получения банарника через stream.
Есть ли такая возможность?
 
N

nvyush

Если не через stream, то как (в каком виде) Вы хотели бы получить файл?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
215
не понятны "претензии" к стриму
 

Kizarek86

Green Team
20.07.2007
871
7
BIT
38
ну вот
Java:
public class JavaAgent extends AgentBase {
    
    public void NotesMain() {
        try {
            Session session = getSession();
            AgentContext agentContext = session.getAgentContext();
            
            //Получаем документ
            Database db      = session.getDatabase("server", "DB.NSF");               
            Agent agent      = agentContext.getCurrentAgent();
            Document doc     = db.getDocumentByID(agent.getParameterDocID());
            Document doc     = db.getDocumentByID("B7DA");
            
            String URL = "<тут путь с логином и паролем>";
            
            //Получаем имена аттачай
            String ATTACH_NAME = "";
            String ATTACH_BIN = "";
            Vector items = doc.getItems();
            for (int j = 0; j < items.size(); j++) {
                Item item = (Item) items.elementAt(j);
                switch (item.getType()) {
                    case Item.ATTACHMENT:
                    EmbeddedObject obj = doc.getAttachment(item.getValueString());
                    ATTACH_NAME = ATTACH_NAME + "Attachment: " + obj.getName() + "\n";
                    ATTACH_BIN     = ATTACH_BIN + Как сюда засунуть бинрник аттача????
                    break;
                }
            }
            
            //Формируем текст запроса
            String CONTENT = "content=id: ticket/new";
            CONTENT = CONTENT + "\nQueue: "         + "server";
            CONTENT = CONTENT + "\nSubject: "         + "SUBJ";
            CONTENT = CONTENT + "\nRequestor: "     + "FROM MAIL";
            CONTENT = CONTENT + "\nText: "             + "TEST";
            CONTENT = CONTENT + "\n" + ATTACH_NAME;
            CONTENT = CONTENT + "\n" + ATTACH_BIN;
            
            //Отправляем запрос в RT
            String REQUEST = doPost(URL, CONTENT);
            
            //Парсим ответ сервера
            ...
        }
        catch(Exception e) {
            e.printStackTrace();
        }
        
    }
    
    public String doPost(String urlString, String query) {
        String line;
        URLConnection urlConnection;
        try {
            String charset = "UTF-8";
            URL url = new URL(urlString);
            urlConnection = url.openConnection();
            urlConnection.setDoInput(true);       
            urlConnection.setDoOutput(true);
            urlConnection.setUseCaches(false);
            urlConnection.setRequestProperty("Accept-Charset", charset);
            urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + charset);
            OutputStream output = urlConnection.getOutputStream();
            output.write(query.getBytes(charset));
            output.close();
            StringBuffer response = new StringBuffer();
            BufferedReader input = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
            while ((line = input.readLine()) != null)
                response.append(line + "\n");
            input.close();
            return response.toString();
        }
        catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
}
Добавлено:
не понятны "претензии" к стриму
ну на LS нужно предварительно выгрузить файл из документа в какую либо директорию, чтобы потом взять бинарник через stream.

может на Java не так, не силен)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
215
ну на LS нужно предварительно выгрузить файл из документа в какую либо директорию, чтобы потом взять бинарник через stream.
ващето - нет...
берём ДХЛ - гоним его в SAX, дергаем тег filedata, декодим его через base64 - вот они бинарные данные
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
215
в джаве аналогично, но там с нотусёвым стримом засада - он какбэ нахненужен, но без него никак не экспортнуть (тока в стринг)
потому мона сразу в стринг и дёрнуть filedata
дергалки файлов я постил "на интертрасте"
там есть дергалки через ДОМ - но это накладные расходы по памяти, кот. жвм выделено мало, в нотусне, и ежели не поменять нотес.ини - память могет скончаться :)
а для ДОМ и ЛС
тока тег другой взять, но в base64 - будет е..ля под ЛС (если данных много)
тамже есть конвертация base64 (для ЛС)
в джаве оно штатно
 

VladSh

начинающий
Lotus Team
11.12.2009
1 784
157
BIT
57
А если читать с помощью Java (там же ж есть Stream в Java Classes), брать string из filedata и использовать "родной" явовский кодировщик в base64? Не понятно, зачем тут LS?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
215

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
еще круче :)
1. гоним в стим
2. вырезаем всё кроме аттача
3. импортим стим в базу в виде простого документа с ататчем
4. урл на атач буде типа
 
T

turumbay

Код:
	String ATTACH_BIN = "";
ATTACH_BIN 	= ATTACH_BIN + Как сюда засунуть бинрник аттача????
}
Позволю себе провести небольшой ликбез:
бинарник - это byte[]. Преобразование его в строку возможно кучей способов. Не существует единственного правильного (стандартного, общепринятого - как угодно ) способа преобразовать массив байт в строку.
Поэтому вам для начала надо определиться со способом кодировки...
Судя по всему - вы собираетесь гнать его в x-www-form-urlencoded, что не совсем разумно. The encoding type application/x-www-form-urlencoded is inefficient for sending large quantities of binary data or text containing non-ASCII characters. Thus, a new media type, multipart/form-data, is proposed as a way of efficiently sending the values associated with a filled-out form from client to server.

По сути вопроса:
Для получения содержимого файла проще всего воспользоваться EmbeddedObject.getInputStream().
Строку из файла делать не надо - это мучительная и затратная по памяти операция, тем более что в итоге вы будете его писать его в OutputStream.
Читайте данные из EmbeddedObject.getInputStream(), конвертируйте в нужный формат ( url-encoded в вашем случае ) и пишите в сonnection.getOutputStream(). В результате - затраты по памяти будут околонулевые.

P.S. eo.getInputStream() требует доступа на запись в ФС, т.к. физически происходит выгрузка аттача в темповую папку. Аттач автоматически убивается при выполнении eo.recycle(). Подробности - в хелпе.
Если есть серьезные причины избежать записи на диск - можно потанцевать вокруг dxl или посмотреть на Document.ConvertToMIME ( since 8.5.1 )
 

Kizarek86

Green Team
20.07.2007
871
7
BIT
38
turumbay
По поводу "x-www-form-urlencoded",
не моя хотелка, нужно аттач передать в другую систему, как понимаю другого не ест.
По сути вопроса:
Для получения содержимого файла проще всего воспользоваться EmbeddedObject.getInputStream().
Строку из файла делать не надо - это мучительная и затратная по памяти операция, тем более что в итоге вы будете его писать его в OutputStream.
Читайте данные из EmbeddedObject.getInputStream(), конвертируйте в нужный формат ( url-encoded в вашем случае ) и пишите в сonnection.getOutputStream(). В результате - затраты по памяти будут околонулевые.
Слаб я в Java)

Java:
Vector items = doc.getItems();
for (int j = 0; j < items.size(); j++) {
    Item item = (Item)items.elementAt(j);
    switch (item.getType()) {
        case Item.ATTACHMENT:
        EmbeddedObject obj = doc.getAttachment(item.getValueString());
        obj.getInputStream() // что дальше с этим делать?
        break;
    }
}
// Отправляем запрос
OutputStream output = null;
output = urlConnection.getOutputStream();
output.write(query.getBytes(charset));
output.close();
 
T

turumbay

Имея inputStream с контентом файла - просто пишем его в oututStream открытого соединения. Как-то так:
Java:
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = input.read(buffer)) != -1) {
    output.write(buffer, 0, bytesRead);
}
в вашем случае - нужно еще применить какое-то преобразование к контенту файла, чтобы соответствовать заявленному формату( urlencoded ). Как перегнать произвольный ( не текстовый ) файл в %% - я не очень в курсе. Предположу, что для заданного byte[] нужно собрать строку:
Java:
String bullshit = new String( buffer, "UTF-8" ); // собираем строку. Для бинарных файлов получится какая-то фигня.
String encoded = URLEncoder.encode( bullshit, "UTF-8" ); // енкодим в url-encoded
byte[] bytes = encoded.getBytes(); // и вот этот byte[] пишем в открытый поток
Однако, есть подозрение, что это не совсем то, что вам нужно. Таки подозреваю, что от вас хотят какой-то более нормальный вариант передачи файла: multipart form-data, или хотя бы base64 в теле поста...
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
215
obj.getInputStream() - что дальше с этим делать?
оно уже типа инпут стрим, т.е. его можно подавать на вход "любоой" ф-ции кот. принимает такой базовый класс или юзазать read...
существует 1000+ способов (это вам не LS) как исполнять передачу
вот небольшие примерчики

Добавлено: в "старых" джавах, где присутствует sun.misc.BASE64...
можно
Java:
byte encoded[] = new sun.misc.BASE64Encoder().encodeBuffer(in);
out.write(encoded);


Добавлено: стоит отметить, что классы misc не рекомендуется

и "тогда" можно подключать аппачевский енкодер либо на своё усмотрение
 

Kizarek86

Green Team
20.07.2007
871
7
BIT
38
Поэтому вам для начала надо определиться со способом кодировки...
Судя по всему - вы собираетесь гнать его в x-www-form-urlencoded, что не совсем разумно. The encoding type application/x-www-form-urlencoded is inefficient for sending large quantities of binary data or text containing non-ASCII characters. Thus, a new media type, multipart/form-data, is proposed as a way of efficiently sending the values associated with a filled-out form from client to server.

Вы правы.
Придется заморочится с "multipart/form-data".
 
Мы в соцсетях:

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