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

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

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

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

FileDownloader

VladSh

начинающий
Lotus Team
11.12.2009
1 786
157
BIT
78
Вот такой
Java:
import java.io.*;
import java.net.*;

class FileDownloader {
    
    public static boolean start(String sURL, String sFilePath) {
        InputStream is = null;
        
        try {
            URL u = new URL(sURL);
            is = u.openStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            
            int bufSize = 1024;
            byte[] buffer = new byte[bufSize];
            
            FileOutputStream fos = new FileOutputStream(sFilePath);
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            
            int bytes;
            while((bytes = bis.read(buffer)) != -1)
                bos.write(buffer, 0, bytes);
            
            fos.flush();
            fos.close();
            
            return true;
        }
        catch (MalformedURLException mue) {
            System.err.println("Ouch - a MalformedURLException happened.");
            mue.printStackTrace();
            return false;
        }
        catch (IOException ioe) {
            System.err.println("Oops - an IOException happened.");
            ioe.printStackTrace();
            return false;
        }
        finally {
            try {
                is.close();
            }
            catch (IOException ioe) {}
        }
    }
    
}

Visual Basic:
Function DownloadFile(sURL As String, sFilePath As String) As Boolean
    On Error GoTo ErrH
    Dim jClassFD As JavaClass
    Dim jMethod As JavaMethod
    Set jClassFD = GetJavaClass("FileDownloader")
    If jClassFD Is Nothing Then Exit Function
    
    Set jMethod = jClassFD.GetMethod("start", "(Ljava/lang/String;Ljava/lang/String;)Z")
    
    DownloadFile = jMethod.Invoke(, sURL, sFilePath)
    Exit Function
    
ErrH:
    Call WriteJavaError(Error$)
Exit Function

End Function

%REM
    Library LS2J
    Created Jun 10, 2010 by я
    Description: основной функционал для работы с бриджами LS2J
%END REM
Option Public
UseLSX "*javacon"

Public jSession As JavaSession

Sub Initialize()
    Set jSession = New JavaSession()
End Sub

%REM
    Function GetJavaClass
    Description: возвращает объект класса
%END REM
Function GetJavaClass(sClassName As String) As JavaClass
    On Error GoTo ErrH
    Set GetJavaClass = jSession.GetClass(sClassName)
    If Not GetJavaClass Is Nothing Then Exit Function
ErrH:
    Call WriteJavaError(Error$)
    Exit Function
End Function

%REM
    Sub WriteJavaError
    Description: пока только вывод сообщения об ошибке
%END REM
Sub WriteJavaError(sError As String)
    Dim jError As JavaError
    Set jError = jSession.getLastJavaError()
    Messagebox sError + Chr(13) + jError.StackTrace, 48, "Lotus Notes..."
End Sub
выплёвывает такую ошибку:
LS2J Error: Threw java.lang.NullPointerException
at FileDownloader.start(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.jav
a:37)
at java.lang.reflect.Method.invoke(Method.java:611)
at lotus.domino.JavaConnectInvoker.invoke(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.jav
a:37)
at java.lang.reflect.Method.invoke(Method.java:611)
at lotus.domino.JavaConnectLoader.invoke(Unknown Source)
Почитал, это что-то типа Object variable not set, но как его понять, в какой строке, какой объект?
 

VladSh

начинающий
Lotus Team
11.12.2009
1 786
157
BIT
78
Что получилось в результате:
Java:
import java.io.*;
import java.net.*;

class FileDownloader {
    
    public static void start(String sURL, String sFilePath) throws Exception {
        String sErrMsg = null;
        
        InputStream is = null;
        BufferedInputStream bis = null;
        
        try {
            //обрабатываем взятие файла по адресу
            URL u = new URL(sURL);
            is = u.openStream();
            bis = new BufferedInputStream(is);
            
            BufferedOutputStream bos = null;
            try {
                //обрабатываем сохранение файла по указанному пути
                int bufSize = 1024;
                byte[] buffer = new byte[bufSize];
                
                FileOutputStream fos = new FileOutputStream(sFilePath);
                bos = new BufferedOutputStream(fos);
                
                int bytes;
                while((bytes = bis.read(buffer)) != -1)
                    bos.write(buffer, 0, bytes);
            }
            catch (FileNotFoundException e) {
                sErrMsg = "Ошибка сохранения файла: " + e.getLocalizedMessage();
            }
            finally {
                if (bos != null) {
                    bos.flush();
                    bos.close();
                }
            }
        }
        catch (MalformedURLException e) {
            sErrMsg = "Ошибка подключения по сети: " + e.getLocalizedMessage();
        }
        catch (IOException e) {
            sErrMsg = "Ошибка чтения файла: " + e.getLocalizedMessage();
        }
        finally {
            if (bis != null)
                bis.close();
            else
                if (is != null) is.close();
            
            if (sErrMsg != null)
                throw new Exception(sErrMsg);
        }
    
    }
    
}
 

VladSh

начинающий
Lotus Team
11.12.2009
1 786
157
BIT
78
Ещё какая-то фигня..
Есть агент, который генерирует ошибку (запускается с действия в виде).
После запуска этого агента запускаю LS-агент, запускаемый из меню, имеющий вызов этого даунлоадера.. и тут на Win7 начинаются странности:
1. В большинстве случаев намертво вешает клиента, варианты:
- закачиваемый файл загружается полностью;
- создаётся файл размером = 0.
В обоих случаях код дальше не выполняется.
2. Изредка появляется сообщение, что "вызван недопустимый метод" или что-то типа того.. в этом случае клиент не вешается.
Если не вызывать первого агента, генерящего ошибку, то всё отрабатывает нормально.
Все исключения, которые могут быть в этих случаях, отловлены, куда копать непонятно.
Есть идея сделать вызов агента, который вызывается из меню, другого агента, в котором и будет находиться код, чтобы разделить "потоки".. но хотелось бы понять, как это можно отловить культурно.
Предложения/помощь только приветствуются! ;)
 

VladSh

начинающий
Lotus Team
11.12.2009
1 786
157
BIT
78
Проблема из предыдущего поста в трабле 8.5.1-2 версий и только в Win7. В 8.5.3 этот баг пофиксен.
При закрытии дока, в котором вызывался агент, генерирующий ошибку, всё работает и в пред. версиях, т.к. контекст текущего дока разрушается. Пытался программно из агента сначала закрыть док, а потом вызвать агент с закачкой, - не получилось. Можно из действия на собаках закрыть док, а после него вызвать агента, но добавлять это действие потом на все формы/виды/страницы не вариант.

P.S. Кстати 18-го числа вышла русская версия 8.5.3, так что можно требовать в представительствах IBM.
 

VladSh

начинающий
Lotus Team
11.12.2009
1 786
157
BIT
78
В ходе экспериментов опробовал больше десятка вариантов..
Решил проблему перемещением агента в другую БД. Всё работает, т.к. агент, находящийся в другой БД, не может подхватить контекст документа с ошибкой из текущей БД.
 
Мы в соцсетях:

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