summaryrefslogtreecommitdiff
path: root/src/components/ListView.js
blob: 3e2f523cd7c62db33838cbd152c188e188592cf8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import React, { useEffect, useState } from "react";

import Pagination from "@mui/material/Pagination";

import ListItem from "./ListItem";
import SearchForm from "./SearchForm";

function ListView(props) {
    let [scans, setScans] = useState([]);
    let [filter, setFilter] = useState({ field: null, value: null });
    let [page, setPage] = useState(1);
    let [totalPages, setTotalPages] = useState(1);

    useEffect(getData, [filter]);

    useEffect(() => {
        getData();
        window.scrollTo(0, 0);
    }, [page]);

    function getData() {
        function filterString() {
            return filter.field == null || filter.value == null
                ? null
                : filter.field + "=" + filter.value;
        }

        function queryString() {
            return [
                `limit=${window.injectedEnv.PER_PAGE}`,
                `skip=${(page - 1) * window.injectedEnv.PER_PAGE}`,
                filterString()
            ]
                .filter(x => x !== null)
                .join("&");
        }

        fetch(
            window.injectedEnv.COLLECTOR_URL + "/sc/v0/get?" + queryString(),
            {
                headers: {
                    Authorization: "Bearer " + props.token
                }
            }
        )
            .then(resp => {
                if (resp.status !== 200)
                    throw new Error(
                        `Unexpected HTTP response code from soc_collector: ${resp.status} ${resp.statusText}`
                    );
                setTotalPages(parseInt(resp.headers.get("X-Total-Count")));
                return resp.json();
            })
            .then(json => {
                setScans(
                    json.docs.map(d => ({
                        ...d,
                        timestamp: new Date(d.timestamp)
                    }))
                );
            })
            .catch(e => props.setError(e.toString()));
    }

    return (
        <div id="list-container">
            <div id="controls">
                <SearchForm
                    filter={(field, value) => {
                        setFilter({ field: field, value: value });
                        setPage(1);
                    }}
                />
            </div>
            <table id="main">
                <tbody>
                    {scans
                        .sort((a, b) => (a.timestamp > b.timestamp ? 1 : -1))
                        .map(scan =>
                            Object.entries(scan.result)
                                .filter(
                                    ([_, res]) =>
                                        res.vulnerable ||
                                        res.investigation_needed
                                )
                                .map(([id, res]) => (
                                    <ListItem
                                        key={scan._id + id}
                                        {...scan}
                                        result={res}
                                    />
                                ))
                        )
                        .flat()}
                </tbody>
            </table>
            <div id="pagination">
                <Pagination
                    page={page}
                    count={totalPages}
                    onChange={(_, v) => setPage(v)}
                    variant="outlined"
                    shape="rounded"
                    showFirstButton
                    showLastButton
                />
            </div>
        </div>
    );
}

export default ListView;