Получить результаты от веб-сервиса с помощью Android Volley - PullRequest
0 голосов
/ 01 июня 2019

Я хочу сделать приложение для Android, которое: 1. Отправьте файл apk в веб-сервис, используя Volley HTTP Post 2. Веб-служба отправляет файл в другой сервис (TheHive Cortex), который запускает анализ безопасности на нем 3. Cortex отвечает на веб-сервис 4. Приложение Android получает результаты от веб-сервиса

Проблема в том, что я не могу получить результаты в приложении Android, даже если веб-служба получает данные и Cortex работает хорошо.

Нет проблем с веб-сервисом и анализатором: они хорошо работают при получении файла. Но приложение вылетает и не может получить результаты. Результаты в формате JSON.

Android-приложение MainActivity:

public class MainActivity extends AppCompatActivity {

Button button1;

Intent intent;
TextView text;

private static final int READ_REQUEST_CODE = 42;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    button1 = findViewById(R.id.button1);
    text = findViewById(R.id.text);

    button1.setOnClickListener(new View.OnClickListener() {


        @Override
        public void onClick(View v) {

            intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
            intent.setType("application/vnd.android.package-archive");
            startActivityForResult(intent, READ_REQUEST_CODE);
        }

    });


}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK) {

        Uri uri = null;
        uri = data.getData();

        try
        {
            final String conv = readTextFromUri(uri); //encoding function
            //text.setText(conv);
            String url = "http://192.168.1.10:5000";

            StringRequest postRequest = new StringRequest(Request.Method.POST, url,
                    new Response.Listener<String>()
                    {
                        @Override
                        public void onResponse(String response) {
                            // response
                            //text.setText("Response is: "+ response.substring(0,500));
                            Log.v("Martina", "Risposta = " + response);
                        }
                    },
                    new Response.ErrorListener()
                    {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            // error
                            //text.setText(error.toString());
                            Log.v("Martina", error.getMessage());
                        }
                    }
            ) {

                @Override
                protected Map<String, String> getParams()
                {
                    Map<String, String> params = new HashMap<String, String>();
                    params.put("conv", conv);

                    return params;
                }
            };
            Volley.newRequestQueue(this).add(postRequest);
        }
        catch (IOException e)
        {
            Log.v("Martina", e.getMessage());
        }
    }
}}

Веб-сервис Python (я использовал Flask):

UPLOAD_FOLDER = './apk'
ALLOWED_EXTENSIONS = set(['txt', 'apk'])

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

@app.route('/', methods=['GET','POST'])
def call_cortex():
if request.method == 'POST':
    fileb64 = request.form.get('conv')

    #converti fileb64 in file e invia questo file a cortex      
    filename = 'test.apk'
    with open(os.path.join(app.config['UPLOAD_FOLDER'], filename), 'wb') as f:
        f.write(base64.b64decode(fileb64))  

    ###FUNZIONA###
    fileapk = os.path.join(app.config['UPLOAD_FOLDER'], filename)
    results = analyze(fileapk)

    os.remove(fileapk)      
    return results              

else:
    return 'Errore!'






def analyze(apk):
api = Api('http://127.0.0.1:9001', 'RjjWFkldGkRyw7lTV5px9Qe7gKlU4V1i')

analyzers = api.analyzers.find_all({}, range='all')

job1 = api.analyzers.run_by_name('Virusshare_2_0', {
    'data': apk,
    'dataType': 'file',     
    'tlp': 1
}, force=1)

res1 = json.dumps(job1.json(), indent=2)

job2 = api.analyzers.run_by_name('HybridAnalysis_GetReport_1_0', {
'data': apk,
'dataType': 'file',
'tlp': 1
}, force=1)

res2 = json.dumps(job2.json(), indent=2)

###Aspetta la fine del job VirusShare###
time.sleep(60)

query = Eq('status', 'Success')

jobs = api.jobs.find_all(query, range='0-2', sort='-updatedAt')

hybrid = None
virus = None
for job in jobs:
    report = api.jobs.get_report(job.id).report
    if report['summary']['taxonomies'][0]['namespace'] == 'HybridAnalysis':
        hybrid = report['summary']['taxonomies'][0]
    if report['summary']['taxonomies'][0]['namespace'] == 'Virusshare':
        virus = report['summary']['taxonomies'][0]

return {
    'virus': {
        'value': virus['value'],
        'level': virus['level']
    },
    'hybrid': {
        'value': hybrid['value'],
        'level': hybrid['level']
    }
}

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

Спасибо

1 Ответ

0 голосов
/ 04 июля 2019

Вы можете использовать TheHiveHooks , чтобы сделать это.
TheHiveHooks использует веб-крюки для получения событий от TheHive.
Существует событие под названием CaseArtifactJobUpdate для мониторинга заданий анализаторов.
Таким образомВы можете быть уверены, что работа завершена.

...