Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 30 additions & 7 deletions src/plugins/analysis/file_type/code/file_type.py
Original file line number Diff line number Diff line change
@@ -1,33 +1,47 @@
from __future__ import annotations

import typing
from typing import List
from typing import TYPE_CHECKING, List, Optional

import pydantic
from pydantic import Field
from magika import Magika
from pydantic import BaseModel, Field
from semver import Version

from analysis.plugin import AnalysisPluginV0
from helperFunctions import magic

if typing.TYPE_CHECKING:
if TYPE_CHECKING:
import io


class MagikaResult(BaseModel):
label: str
mime: str
group: str
description: str
is_text: bool
confidence: float


class AnalysisPlugin(AnalysisPluginV0):
class Schema(pydantic.BaseModel):
class Schema(BaseModel):
mime: str = Field(
description="The file's mimetype.",
)
full: str = Field(
description="The file's full description.",
)
magika: Optional[MagikaResult] = Field(
None,
description="Output of google's deep learning file type detection tool magika.",
)

def __init__(self):
self.magika = Magika()
super().__init__(
metadata=AnalysisPluginV0.MetaData(
name='file_type',
description='identify the file type',
version='1.0.0',
version=Version(1, 1, 0),
Schema=AnalysisPlugin.Schema,
),
)
Expand All @@ -37,8 +51,17 @@ def summarize(self, result: Schema) -> List[str]:

def analyze(self, file_handle: io.FileIO, virtual_file_path: str, analyses: dict) -> Schema:
del virtual_file_path, analyses
magika_result = self.magika.identify_path(file_handle.name)

return AnalysisPlugin.Schema(
mime=magic.from_file(file_handle.name, mime=True),
full=magic.from_file(file_handle.name, mime=False),
magika=MagikaResult(
label=magika_result.output.label,
mime=magika_result.output.mime_type,
group=magika_result.output.group,
description=magika_result.output.description,
is_text=magika_result.output.is_text,
confidence=magika_result.score,
),
)
26 changes: 26 additions & 0 deletions src/plugins/analysis/file_type/install.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#!/usr/bin/env python3

import logging
from pathlib import Path

try:
from plugins.installer import AbstractPluginInstaller
except ImportError:
import sys

SRC_PATH = Path(__file__).absolute().parent.parent.parent.parent
sys.path.append(str(SRC_PATH))

from plugins.installer import AbstractPluginInstaller


class FileTypeInstaller(AbstractPluginInstaller):
base_path = Path(__file__).resolve().parent


# Alias for generic use
Installer = FileTypeInstaller

if __name__ == '__main__':
logging.basicConfig(level=logging.INFO)
Installer().install()
1 change: 1 addition & 0 deletions src/plugins/analysis/file_type/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
magika==0.6.2
37 changes: 35 additions & 2 deletions src/plugins/analysis/file_type/view/file_type.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,44 @@

<tr>
<td>File type</td>
<td>{{ analysis_result['full'] }}</td>
<td>{{ analysis_result.full }}</td>
</tr>
<tr>
<td>MIME</td>
<td>{{ analysis_result['mime'] }}</td>
<td>{{ analysis_result.mime }}</td>
</tr>
{% if analysis_result.magika %}
<tr>
<td>Magika</td>
<td class="p-0">
<table class="m-0 w-100">
<tr>
<td>Label</td>
<td>{{ analysis_result.magika.label }}</td>
</tr>
<tr>
<td>MIME</td>
<td>{{ analysis_result.magika.mime }}</td>
</tr>
<tr>
<td>Group</td>
<td>{{ analysis_result.magika.group }}</td>
</tr>
<tr>
<td>Description</td>
<td>{{ analysis_result.magika.description }}</td>
</tr>
<tr>
<td>is Text</td>
<td>{{ analysis_result.magika.is_text }}</td>
</tr>
<tr>
<td>Confidence</td>
<td>{{ analysis_result.magika.confidence }}</td>
</tr>
</table>
</td>
</tr>
{% endif %}

{% endblock %}
Loading