File-uploader will perform scanning virus of files, uploading files in different bucket system like local, s3 etc
uploaded via http requests with multipart/form-data
. If a virus exists, it will respond with infected file information
and also if clean it will upload to specified bucket.
For running the service in docker container use make run-docker-compose
.
The project uses wire for building a dependency tree without pain.
The easiest and straight forward way is to have local setup of Go. There is how the GoLand build should be configured:
Property | Value |
---|---|
Package path | ABSOLUTE_LOCAL_PATH...file-uploader/src |
Output directory | ABSOLUTE_LOCAL_PATH...file-uploader/bin |
Working directory | ABSOLUTE_LOCAL_PATH...file-uploader/ |
Environment | Point to .dev.env (please install "EnvFile" plugin for GoLand) |
In order to generate mocks, use mockery
Property | Example Values |
---|---|
ENV_NAME | local |
HTTP_PORT | 8085 |
CLAMAV_SOCKET_URL | unix:/tmp/clamd.socket |
FILE_UPLOADER_API_KEY | asdfjkasdf,sadfsad |
DB_HOST | localhost |
DB_PORT | 3306 |
DB_NAME | file_upload |
DB_USER | root |
DB_PASS | password |
DB_PASS_FILE | |
FILE_STORAGE_DRIVER | s3 |
FILE_STORAGE_DISABLE_SSL | false |
FILE_STORAGE_REGION | eu-central-1 |
FILE_STORAGE_PROFILE | xxx-sandbox |
FILE_STORAGE_ACCESS_KEY | |
FILE_STORAGE_SECRET | |
S3_FORCE_PATH_STYLE | empty means true |
NEWRELIC_APM_LICENSE | XXXXXXXXX |
NEWRELIC_APPNAME_PREFIX | XXXXXXXXX |
NEWRELIC_HOST_DISPLAY_NAME | XXXXXXXXX |
Please install clamav antivirus and run clamad deamon service so that the application can communication with clamd. Also don't forget to update virus database for more information please follow the link Clamav
Token Generation: To generate the token for downloading or streaming the file, you can generate JWT with validity and must be signed with your api key and file id together (e.g: <API_KEY><FILE_ID>)
GET /files
Name | Value | Required |
---|---|---|
x-api-key | <PROVIDED_API_KEY> | x |
Name | Required | Example Value |
---|---|---|
name | <search_string> | |
created_date | ||
offset | Any integer value, default is 0 | |
limit | Any integer value, default is 500 |
[
{
"id": "957ad83c-3e7f-494e-89b7-717cad82103d",
"name": "A-Z-Infoservices and 140 others.vcf",
"meta_data": {
"size": 25919,
"mime_type": "text/x-vcard"
},
"owner_id": "asdfjkasdf",
"bucket_path": "xxx-file-upload/test/957ad83c-3e7f-494e-89b7-717cad82103d.vcf",
"provider": "s3",
"created_at": "2021-05-10T06:37:42Z",
"expired_at": "2021-05-12T19:21:04Z"
}
]
POST /files
Name | Value | Required |
---|---|---|
x-api-key | <PROVIDED_API_KEY> | x |
Name | Type | Value | Required | Example |
---|---|---|---|---|
bucket_path | string | <BUCKET_PATH> | x | xxx-bucket or xxx-bucket/<POSTFIX> |
files[0].file | file | <FILE_TO_UPLOAD> | x | |
files[0].id | string | <UUID_4> or will be auto generated | ||
files[1].file | file | <FILE_TO_UPLOAD> | x | |
files[1].id | string | <UUID_4> or will be auto generated | b69724a3-8488-402c-a16e-fc0da0ea6832 | |
expired_at | date-time | <VALID_ISO_DATE_TIME> |
Response 207:
[
{
"file_name": "eicarcom2.zip",
"success": false,
"message": "Virus found with defination Win.Test.EICAR_HDB-1",
"virus": true
},
{
"id": "4825181a-f908-4a7b-88b4-e00eda2adb76",
"file_name": "A-Z-Infoservices and 140 others.vcf",
"success": true,
"message": "",
"virus": false
}
]
Response 201, all file uploaded successfully:
[
{
"id": "4825181a-f908-4a7b-88b4-e00eda2adb76",
"file_name": "A-Z-Infoservices and 140 others.vcf",
"success": true,
"message": "",
"virus": false
}
]
GET /files/:id
Name | Value | Required |
---|---|---|
x-api-key | <PROVIDED_API_KEY> | x |
Name | Required | Example Value |
---|---|---|
id | x | <file_UUID> |
{
"id": "62ce012e-44b7-42f3-b017-ebbbfaa6bede",
"name": "A-Z-Infoservices and 140 others.vcf",
"meta_data": {
"size": 25919,
"mime_type": "text/x-vcard"
},
"owner_id": "asdfjkasdf",
"bucket_path": "xxx-file-upload/test/62ce012e-44b7-42f3-b017-ebbbfaa6bede.vcf",
"provider": "s3",
"created_at": "2021-05-07T18:08:02Z",
"expired_at": "2021-05-12T19:21:04Z"
}
DELETE /files/:id
Name | Value | Required |
---|---|---|
x-api-key | <PROVIDED_API_KEY> | x |
Name | Required | Example Value |
---|---|---|
id | x | <file_UUID> |
POST /files/tokens
Name | Value | Required |
---|---|---|
x-api-key | <PROVIDED_API_KEY> | x |
Name | Type | Required | Example Value |
---|---|---|---|
ids | Array of file_UUID | x | ["b69724a3-8488-402c-a16e-fc0da0ea6832"] |
expired_at | date-time | default 10 years | 2021-05-19T12:48:32.350848+02:00 |
{
"b69724a3-8488-402c-a16e-fc0da0ea6832": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdXRob3JpemVkIjp0cnVlLCJleHAiOjE2MjEzNzYxMTksImZpbGVfaWQiOiJiNjk3MjRhMy04NDg4LTQwMmMtYTE2ZS1mYzBkYTBlYTY4MzIifQ.YSjK5MSoaUrtIK7_u0PVMd2UYWcDxSsWDUabOV69WwM"
}
GET /files/:id/stream
Name | Value | Required |
---|---|---|
x-api-key | <PROVIDED_API_KEY> | x |
Name | Required | Example Value |
---|---|---|
id | x | <file_UUID> |
Name | Required | Example Value |
---|---|---|
token | x [If x-api-key is not present in header] | JWT token signed with <api-key><file_id> |
GET /files/:id/download
Name | Value | Required |
---|---|---|
x-api-key | <PROVIDED_API_KEY> | x |
Name | Required | Example Value |
---|---|---|
id | x | <file_UUID> |
Name | Required | Example Value |
---|---|---|
token | x [If x-api-key is not present in header] | JWT token signed with <api-key><file_id> |
disposition | inline or attachment |
GET /health
"OK"
GET /scanners/info
{
"file_uploader_version": "master",
"scan_server_url": "unix:/tmp/clamd.socket",
"ping_result": "Connected to server OK",
"scan_server_version": "ClamAV 0.103.2/26172/Sun May 16 13:13:51 2021",
"test_scan_virus": "Status: FOUND; Virus: true; Description: Win.Test.EICAR_HDB-1",
"test_scan_clean": "Status: CLEAN; Virus: false"
}
This method will return JSON giving the current status of File Uploader and its connection to ClamAV.
POST /scanners/files
Body should be multipart/form-date with files
{
"success": false,
"files": [
{
"Status": "FOUND",
"Virus": true,
"Description": "Win.Test.EICAR_HDB-1",
"error": false,
"file_name": "eicarcom2.zip",
"message": ""
},
{
"Status": "CLEAN",
"Virus": false,
"Description": "",
"error": false,
"file_name": "A-Z-Infoservices and 140 others.vcf",
"message": ""
}
],
"message": ""
}
POST /scanners/urls
{
"urls": [
"https://secure.eicar.org/eicar.com.txt",
"https://secure.eicar.org/eicar_com.zip"
]
}
{
"success": false,
"files": [
{
"Status": "FOUND",
"Virus": true,
"Description": "Win.Test.EICAR_HDB-1",
"error": false,
"file_name": "https://secure.eicar.org/eicar.com.txt",
"message": ""
},
{
"Status": "FOUND",
"Virus": true,
"Description": "Win.Test.EICAR_HDB-1",
"error": false,
"file_name": "https://secure.eicar.org/eicar_com.zip",
"message": ""
}
],
"message": ""
}