NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Martin Suchodol:6.7.2024 15:45

Ahoj, původně jsem myslel že by to mohl být problém nstavení cors. Nicméně zdá se že ne.

Mám, resp. v rámci učení se s node.js. Vytvářím aplikaci kde server je tvořen právě node.js a client reactem. Node server je vlastně jednoduchá aplikace která přijme soubor, prožene ho clamavem pomocí knihovny clamav.js. Všechno funguje vlstaně docela dobře, ale jen a pouze na počítači na kterém to vyvíjím. Jakmile se pokusím přistoupit třeba z mobilu na stejné síti tak server na nic nereaguje.

const express = require('express');
const multer = require('multer');
const clamav = require('clamav.js');
const path = require('path');
const fs = require('fs');
const cors = require('cors');
const app = express();

const maxFileSize = 150 * 1024 * 1024;
const allowedFileTypes = [
    "application/zip",
    "application/gzip",
    "application/x-tar",
    "application/x-7z-compressed",
    "application/vnd.rar",
    "application/x-bzip2",
    "application/x-xz",
    "application/x-lzma",
    "application/x-compress",
    "application/x-lzh-compressed",
    "application/x-zip-compressed",
];

const upload = multer({
    dest: 'uploads/',
    limits: {
        fileSize: maxFileSize,
    },
    fileFilter: (req, file, cb) => {
        if (!allowedFileTypes.includes(file.mimetype)) {
            return cb(new Error('Unsupported file type. Only compressed files (ZIP, RAR) are allowed'));
        }

        return cb(null, true);
    },
});

const cleanFilesDirectory = path.join(__dirname, 'clean_files');

let filePath = null;
let cleanFilePath = null;

if (!fs.existsSync(cleanFilesDirectory)) {
    fs.mkdirSync(cleanFilesDirectory);
}

app.use(cors());

/**
 * Endpoint obshlujucící upload souboru a jeho následnou kontrolu na infekci pomocí ClamAV
 */
app.post('/upload', upload.single('file'), (req, res) => {
    if (req.file) {
        console.log('File: '+req.file.originalname+' has been uploaded');
        filePath = path.join(__dirname, req.file.path);
        cleanFilePath = path.join(cleanFilesDirectory, req.file.originalname);
    } else {
        console.log("Nepřijatý soubor");
        return res.status(400).json({ message: '"No file uploaded, unsupported file type or file is too large."' });
    }

    clamav.ping(3310, 'clamav',1000,(err) => {
        if (err) {
            fs.unlinkSync(filePath);
            console.log(err);
            return res.status(500).json({ message: 'Error pinging ClamAV' });
        }

        clamav.createScanner(3310, 'clamav').scan(filePath, (err, object, malicious) => {

            if (err) {
                fs.unlinkSync(filePath);
                console.log(object+': '+err);
                return res.status(500).json({ message: 'Error scanning file' });
            }
            else if (malicious) {
                fs.unlinkSync(filePath);
                console.log(object+': '+malicious);
                return res.status(400).json({ message: 'File is infected, and hase been deleted' });
            }
            else {
                console.log(object+': OK');
                fs.rename(filePath, cleanFilePath, (err) => {
                    if (err) {
                        console.log(err);
                        return res.status(500).json({ message: 'Error moving file' });
                    }

                    return res.status(200).json({ message: 'File: '+ req.file.originalname +' is clean and has been moved.' });
                });
            }
        });
    });
});

/**
 * Endpoint pro zobrazení všech neinfikovaných souborů které byly přesunuty po kontrole do složky clean_files
 */
app.get('/files', (req, res) => {
    fs.readdir(cleanFilesDirectory, (err, files) => {
        if (err) {
            console.log(err);
            return res.status(500).json({ message: 'Error reading files' });
        }

        const filesDetails = files.map((file) => {
            const filePath = path.join(cleanFilesDirectory, file);
            const stats = fs.statSync(filePath);
            return {
                name: file,
                size: stats.size,


            };
        });

        return res.status(200).json({ files: filesDetails });
    });
});

/**
 * Endpoint pro stažení souboru z clean_files
 */
app.get('/download/:filename', (req, res) => {
    const donwloadFilePath = path.join(cleanFilesDirectory, req.params.filename);
    res.download(donwloadFilePath, (err) => {
        if (err) {
            return res.status(500).json({ message: 'Error downloading file' });
        }
    });
});

app.listen(5000, '0.0.0.0', () => {
    console.log('Server is running on port 5000');
});

Server jako takový pak jede ještě v dockeru. Tam by ale problém být neměl:

version: '3.8'

services:
  app:
    container_name: node
    build:
      context: .
      dockerfile: .docker/node/Dockerfile
    restart: always
    ports:
      - "5000:5000"
    depends_on:
      - clamav
    volumes:
      - .:/usr/src/app
      - ./package.json:/usr/src/app/package.json
      - /usr/src/app/node_modules
    networks:
      node-server-network:
        aliases:
            - node
  clamav:
    container_name: clamav
    image: mkodockx/docker-clamav:alpine
    restart: always
    environment:
      - CLAMD_CONF_StreamMaxLength=150M
    volumes:
      - clam:/var/lib/clamav
    networks:
        node-server-network:
          aliases:
              - clamav

networks:
  node-server-network:
    driver: bridge
    driver_opts:
      com.docker.network.enable_ipv6: "false"

volumes:
    clam:
Editováno 6.7.2024 15:46
 
Odpovědět
6.7.2024 15:45
Avatar
Martin Suchodol:6.7.2024 15:54

A tak nic :D, měl jsem špatně nastaveného react clienta. Ve voláních axiosu jsem stále měl localhosta místo ip adresy serveru

 
Nahoru Odpovědět
6.7.2024 15:54
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.