1
0
Fork 0
mirror of synced 2024-05-18 19:52:39 +12:00

Exported ClamAV client to 3rd party package

This commit is contained in:
eldadfux 2019-05-11 18:30:53 +03:00
parent a430d9a25e
commit 63068f6b1d
8 changed files with 54 additions and 198 deletions

View file

@ -10,6 +10,7 @@ use Utopia\Validator\Text;
use Utopia\Validator\HexColor;
use Utopia\Cache\Cache;
use Utopia\Cache\Adapter\Filesystem;
use Appwrite\ClamAV\Network;
use Database\Database;
use Database\Validator\UID;
use Storage\Storage;
@ -18,7 +19,6 @@ use Storage\Validators\File;
use Storage\Validators\FileSize;
use Storage\Compression\Algorithms\GZIP;
use Resize\Resize;
use LibreOffice\LibreOffice;
use OpenSSL\OpenSSL;
Storage::addDevice('local', new Local('app-' . $project->getUid()));
@ -529,7 +529,7 @@ $utopia->post('/v1/storage/files')
}
}
$antiVirus = new \ClamAV\Network('clamav', 3310);
$antiVirus = new Network('clamav', 3310);
/**
* Models
@ -680,7 +680,7 @@ $utopia->get('/v1/storage/files/:fileId/scan')
$source = $compressor->decompress($source);
$antiVirus = new \ClamAV\Network('clamav', 3310);
$antiVirus = new Network('clamav', 3310);
//var_dump($antiVirus->ping());
//var_dump($antiVirus->version());
@ -701,7 +701,7 @@ $utopia->get('/v1/storage/scan')
{
$device = Storage::getDevice('local');
$antiVirus = new \ClamAV\Network('clamav', 3310);
$antiVirus = new Network('clamav', 3310);
//var_dump($antiVirus->ping());
//var_dump($antiVirus->version());
//var_dump($antiVirus->fileScan('/storage/uploads/app-1/5/9/f/e/59fecaed49645.pdf'));

View file

@ -13,7 +13,6 @@
"psr-4": {
"Audit\\": "src/Audit",
"Auth\\": "src/Auth",
"ClamAV\\": "src/ClamAV",
"Database\\": "src/Database",
"Event\\": "src/Event",
"OpenSSL\\": "src/OpenSSL",
@ -38,6 +37,8 @@
"ext-zlib": "*",
"ext-sockets": "*",
"appwrite/php-clamav": "master",
"utopia-php/framework": "master",
"utopia-php/abuse": "master",
"utopia-php/cache": "master",

47
composer.lock generated
View file

@ -4,8 +4,53 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
"content-hash": "57d614ec24a3ebc4cee0e6fd1f4cebfb",
"content-hash": "c1d8468f36e74c0212272b585e01ffaf",
"packages": [
{
"name": "appwrite/php-clamav",
"version": "dev-master",
"source": {
"type": "git",
"url": "https://github.com/appwrite/php-clamav.git",
"reference": "9298a2d490e064f0c72d86ecc9f4792a49f4288f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/appwrite/php-clamav/zipball/9298a2d490e064f0c72d86ecc9f4792a49f4288f",
"reference": "9298a2d490e064f0c72d86ecc9f4792a49f4288f",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"require-dev": {
"phpunit/phpunit": "^7.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Appwrite\\ClamAV\\": "src/ClamAV"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Eldad Fux",
"email": "eldad@appwrite.io"
}
],
"description": "ClamAV network and pipe client for PHP",
"keywords": [
"anti virus",
"appwrite",
"clamav",
"php"
],
"time": "2019-05-11 15:12:28"
},
{
"name": "bacon/bacon-qr-code",
"version": "2.0.0",

View file

@ -44,7 +44,7 @@ services:
restart: unless-stopped
clamav:
image: registry.gitlab.com/appwrite/appwrite/clamav:v1.0.0
image: appwrite/clamav:v1.0.2
restart: unless-stopped
influxdb:

View file

@ -97,7 +97,7 @@ services:
- redis
clamav:
image: registry.gitlab.com/appwrite/appwrite/clamav:v1.0.0
image: appwrite/clamav:v1.0.2
restart: unless-stopped
networks:
- clamav

View file

@ -1,112 +0,0 @@
<?php
namespace ClamAV;
/**
* Class ClamAV
*
* An abstract class that `ClamdPipe` and `ClamdNetwork` will inherit.
*
* @package ClamAV
*/
abstract class ClamAV {
const CLAMAV_MAXP = 20000;
/**
* @return mixed
*/
abstract protected function getSocket();
/* Send command to Clamd */
private function sendCommand($command)
{
$return = null;
$socket = $this->getSocket();
socket_send($socket, $command, strlen($command), 0);
socket_recv($socket, $return, self::CLAMAV_MAXP, 0);
socket_close($socket);
return $return;
}
/* `ping` command is used to see whether Clamd is alive or not */
public function ping()
{
$return = $this->sendCommand('PING');
return strcmp($return, 'PONG') ? true : false;
}
/* `version` is used to receive the version of Clamd */
public function version()
{
return trim($this->sendCommand('VERSION'));
}
/* `reload` Reload Clamd */
public function reload()
{
return $this->sendCommand('RELOAD');
}
/* `shutdown` Shutdown Clamd */
public function shutdown()
{
return $this->sendCommand('SHUTDOWN');
}
/* `fileScan` is used to scan single file. */
public function fileScan($file)
{
$out = $this->sendCommand('SCAN ' . $file);
list($file, $stats) = explode(':', $out);
$result = trim($stats);
return ($result === 'OK');
}
/* `continueScan` is used to scan multiple files/directories. */
public function continueScan($file)
{
$return = array();
foreach(explode("\n", trim($this->sendCommand('CONTSCAN ' . $file))) as $results ) {
list($file, $stats) = explode(':', $results);
array_push($return, array( 'file' => $file, 'stats' => trim($stats) ));
}
return $return;
}
/* `streamScan` is used to scan a buffer. */
public function streamScan($buffer)
{
$port = null;
$socket = null;
$command = 'STREAM';
$return = null;
$socket = $this->getSocket();
socket_send($socket, $command, strlen($command), 0);
socket_recv($socket, $return, self::CLAMAV_MAXP, 0);
sscanf($return, 'PORT %d\n', $port);
$stream = socket_create(AF_INET, SOCK_STREAM, 0);
socket_connect($stream, self::CLAMAV_MAXP, $port);
socket_send($stream, $buffer, strlen($buffer), 0);
socket_close($stream);
socket_recv($socket, $return, self::CLAMAV_MAXP, 0);
socket_close($socket);
return array('stats' => trim(str_replace('stream: ', '', $return)));
}
}

View file

@ -1,48 +0,0 @@
<?php
namespace ClamAV;
class Network extends ClamAV
{
const CLAMAV_HOST = '127.0.0.1';
const CLAMAV_PORT = 3310;
/**
* @var string
*/
private $host;
/**
* @var int
*/
private $port;
/**
* Network constructor
*
* You need to pass the host address and the port the the server
*
* @param string $host
* @param int $port
*/
public function __construct(string $host = self::CLAMAV_HOST, int $port = self::CLAMAV_PORT)
{
$this->host = $host;
$this->port = $port;
}
/**
* @return resource
* @throws \Exception
*/
protected function getSocket()
{
$socket = socket_create(AF_INET, SOCK_STREAM, 0);
$status = socket_connect($socket, $this->host, $this->port);
if(!$status) {
throw new \Exception('Unable to connect to ClamAV server');
}
return $socket;
}
}

View file

@ -1,30 +0,0 @@
<?php
namespace ClamAV;
class Pipe extends ClamAV
{
const CLAMAV_HOST = '/var/run/clamav/clamd.ctl';
private $pip;
/**
* Pipe constructor.
*
* This class can be used to connect to local socket.
* You need to pass the path to the socket pipe.
*
* @param string $pip
*/
public function __construct(string $pip = self::CLAMAV_HOST)
{
$this->pip = $pip;
}
protected function getSocket()
{
$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
socket_connect($socket, $this->pip);
return $socket;
}
}