Web File Repository
Simple web server with a file uploading console to store small files. This is helpful to make your environment ready for testing purpose for your playbooks or automations to download files from a web server.
Utilities · Web File Repository
Details
| ID | Web File Repository |
|---|---|
| Provider | Open Source |
| Category | Utilities |
| From Version | 6.0.0 |
| Docker Image | demisto/bottle:1.0.0.10133006 |
| Supported Modules | Agentix XSIAM |
README
Simple web server with a file uploading console to store small files.
Helps make your environment ready for testing purpose for your playbooks or automations to download files from a web server. NOTE: For more information about long-running integrations, see the Cortex XSOAR 8 Cloud, Cortex XSOAR 8 On-prem or Cortex XSIAM documentation.
Configure Web File Repository in Cortex
| Parameter | Description | Required |
|---|---|---|
| Incident type | False | |
| Long running instance | False | |
| Port mapping (<port> or <host port>:<docker port>) | Runs the service on this port from within Cortex XSOAR. Requires a unique port for each long-running integration instance. Do not use the same port for multiple instances. Note: If you click the test button more than once, a failure may occur mistakenly indicating that the port is already in use. (For Cortex XSOAR 8 and Cortex XSIAM) If you do not enter a port, an unused port for Web File Repository will automatically be generated when the instance is saved. However, if using an engine, you must enter a port. | True |
| User ID for Read/Write | False | |
| Password | False | |
| User ID for Read-Only | False | |
| Password | False | |
| Authentication Method | Some of the browsers such as Chrome may not support Digest-sha256. | False |
| Public Read Access | Authentication is not requiured for read access | False |
| MIME Types for file extensions | “mime-type extension [extension]*” for each line, wild-card file extensions are supported. | False |
| Merge with Default MIME Types | Set true to merge the specified types with the default settings, false to replace them | False |
| Attachment extensions | List of extensions to set “attachment” to Content-Disposition | False |
| Storage Protection | True | |
| The maximum repository size | False | |
| The maximum sandbox repository size | False |
How to Access the File Management UI
Access the File Management UI by URL and Port (HTTP)
In a web browser, go to http://<cortex-xsoar-server-address>:<listen_port>.
Access the File Management UI by Instance Name (HTTPS)
To access the File Management UI by instance name, make sure Instance execute external is enabled.
-
In Cortex XSOAR 6.x:
- Navigate to Settings > About > Troubleshooting.
- In the Server Configuration section, verify that the
instance.execute.external.<instance_name>key is set totrue. If this key does not exist, click + Add Server Configuration and add theinstance.execute.external.<instance_name>and set the value totrue. See this documentation for further information.
-
In a web browser:
- For Cortex XSOAR 6.x: Go to
https://<cortex-xsoar-address>/instance/execute/<instance_name>. - For Cortex XSOAR 8 On-prem, Cortex XSOAR 8 Cloud, or Cortex XSIAM: Go to
https://ext-<tenant>.crtx.<region>.paloaltonetworks.com/xsoar/instance/execute/<instance-name>. -
For Multi Tenant environments: Go to
https://<cortex-xsoar-address>/acc_<account name>/instance/execute/<instance_name>.Note:
For Cortex XSOAR 8 On-prem, you need to add theext-FQDN DNS record to map the Cortex XSOAR DNS name to the external IP address.
For example,ext-xsoar.mycompany.com.
- For Cortex XSOAR 6.x: Go to
Commands
You can execute these commands from the CLI, as part of an automation, or in a playbook.
After you successfully execute a command, a DBot message appears in the War Room with the command details.
wfr-status
Get the service status
Base Command
wfr-status
Input
| Argument Name | Description | Required |
| — | — | — |
Context Output
| Path | Type | Description |
|---|---|---|
| WebFileRepository.Status.StorageUsage | number | The current storage usage in bytes |
| WebFileRepository.Status.SandboxUsage | number | The current sandbox usage in bytes |
| WebFileRepository.Status.StorageProtection | string | The storage protection mode |
| WebFileRepository.Status.IntercommunicationIP | string | The IP address of the service to which the internal client connects |
| WebFileRepository.Status.IntercommunicationPort | number | The port number of the service to which the internal client connects |
| WebFileRepository.Status.ExternaIP | unknown | The external IP address of the service |
| WebFileRepository.Status.ExternalPort | unknown | The external port number of the service |
| WebFileRepository.Status.ServerIP | string | The IP address of the service |
| WebFileRepository.Status.ServerPort | number | The port number of the service |
wfr-cleanup
Remove all the files from the repository
Base Command
wfr-cleanup
Input
| Argument Name | Description | Required |
| — | — | — |
Context Output
There is no context output for this command.
wfr-upload-as-file
Upload a file from data to the repository.
Base Command
wfr-upload-as-file
Input
| Argument Name | Description | Required |
|---|---|---|
| file_name | The name of the file. | Required |
| data | Input data to create the file. | Optional |
| encoding | Encoding type of the input data. Default is utf-8. | Optional |
| extract_archive | Set to true to extract files to archive files, otherwise false. Possible values are: true, false. Default is false. | Optional |
| upload_directory | The directory path where to upload. Default is /. | Optional |
Context Output
There is no context output for this command.
wfr-upload-file
Upload a file to the repository
Base Command
wfr-upload-file
Input
| Argument Name | Description | Required |
|---|---|---|
| entry_id | The entry ID list of the file. | Required |
| file_name | The name of the file. | Optional |
| extract_archive | Set to true to extract files to archive files, otherwise false. Possible values are: true, false. Default is false. | Optional |
| upload_directory | The directory path where to upload. Default is /. | Optional |
Context Output
There is no context output for this command.
wfr-upload-files
Upload files to the repository
Base Command
wfr-upload-files
Input
| Argument Name | Description | Required |
|---|---|---|
| entry_ids | The entry ID list of files. | Required |
| extract_archive | Set to true to extract files to archive files, otherwise false. Possible values are: true, false. Default is false. | Optional |
| upload_directory | The directory path where to upload. Default is /. | Optional |
Context Output
There is no context output for this command.
wfr-list-files
List files in the repository
Base Command
wfr-list-files
Input
| Argument Name | Description | Required |
|---|---|---|
| directory | The directory path where to list files. Default is /. | Optional |
| recursive | Set to true to list subdirectories recursively, otherwise false. Possible values are: true, false. Default is false. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| WebFileRepository.Files.Name | string | The file name |
| WebFileRepository.Files.Path | string | The file path |
| WebFileRepository.Files.Size | number | The file size in bytes |
| WebFileRepository.Files.LastModified | date | The last modified time |
wfr-remove-files
Remove files from the repository
Base Command
wfr-remove-files
Input
| Argument Name | Description | Required |
|---|---|---|
| paths | The list of the file paths. | Required |
Context Output
There is no context output for this command.
wfr-download-file
Download a file from the repository
Base Command
wfr-download-file
Input
| Argument Name | Description | Required |
|---|---|---|
| path | The file path. | Required |
| save_as | The name to give the file to save. | Optional |
Context Output
There is no context output for this command.
wfr-download-as-text
Retrieve the file data from the repository into the context.
Base Command
wfr-download-as-text
Input
| Argument Name | Description | Required |
|---|---|---|
| path | The file path. | Required |
| encoding | Encoding type to convert the file data when setting to the context. Default is utf-8. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| WebFileRepository.Files.Name | string | The file name |
| WebFileRepository.Files.Path | string | The file path |
| WebFileRepository.Files.Size | number | The file size in bytes |
| WebFileRepository.Files.Data | string | The file data encoded in the encoding |
| WebFileRepository.Files.Encoding | string | The encoding name |
wfr-archive-zip
Download a file to which all the files are archived
Base Command
wfr-archive-zip
Input
| Argument Name | Description | Required |
|---|---|---|
| save_as | The name to give the archive-file to save. | Optional |
Context Output
There is no context output for this command.
wfr-reset
Reset the repository data
Base Command
wfr-reset
Input
| Argument Name | Description | Required |
| — | — | — |
Context Output
There is no context output for this command.
Configuration parameters
incidentType— Incident typelongRunning— Long running instancelongRunningPort— Port mapping (<port> or <host port>:<docker port>) (required)rwCredentials— User ID for Read/WriteroCredentials— User ID for Read-OnlyauthenticationMethod— Authentication MethodpublicReadAccess— Public Read AccessmimeTypes— MIME Types for file extensionsmergeMimeTypes— Merge with Default MIME TypesattachmentExtensions— Attachment extensionsstorageProtection— Storage Protection (required)maxStorageSize— The maximum repository sizemaxSandboxSize— The maximum sandbox repository size
Commands (11)
-
wfr-archive-zipDownload a file to which all the files are archived.
-
wfr-cleanupRemove all the files from the repository.
-
wfr-download-as-textRetrieve the file data from the repository into the context.
-
wfr-download-fileDownload a file from the repository.
-
wfr-list-filesList files in the repository.
-
wfr-remove-filesRemove files from the repository.
-
wfr-resetReset the repository data.
-
wfr-statusGet the service status.
-
wfr-upload-as-fileUpload a file from data to the repository.
-
wfr-upload-fileUpload files to the repository.
-
wfr-upload-filesUpload files to the repository.
import base64 import fnmatch import gzip import hashlib import io import math import os import re import socket import struct import tarfile import urllib.parse import urllib.request import uuid import zipfile from collections.abc import Callable, Iterator from datetime import timezone, UTC from email import parser as email_parser from enum import Enum from tempfile import NamedTemporaryFile from typing import IO, Any import bottle import demistomock as demisto # noqa: F401 from bottle import BaseRequest, HTTPResponse from CommonServerPython import * # noqa: F401 from requests.auth import HTTPBasicAuth, HTTPDigestAuth """ The resource archive includes the following files provided by DataTables (https://datatables.net/). - datatables.min.css - datatables.min.js Those files have been downloaded with the options below. ## styling framework - DataTables ## packages - jQuery 3 ## extensions - Buttons - RowGroup - Select """ RESOURCES_ZIP_B64 = """ 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 """ RESOURCES_ZIP: zipfile.ZipFile | None = None RESOURCES_DIC: dict[str, str] = { "main.js": ( r""" var STORAGE_USAGE = 0; var SANDBOX_USAGE = 0; var STORAGE_PROTECTION_MODE = 'read/write'; function is_read_only_mode() { return STORAGE_PROTECTION_MODE == 'read-only'; } function update_status() { $.ajaxSetup({async: false}); $.getJSON('?q=status&_=' + Date.now(), function(resp){ STORAGE_USAGE = resp.storage_usage; SANDBOX_USAGE = resp.storage_protection == 'sandbox' ? resp.sandbox_usage : -1; STORAGE_PROTECTION_MODE = resp.storage_protection; }) $.ajaxSetup({async: true}); } update_status(); $(document).ready(function () { let table = $("#filelist").DataTable({ ajax: { url: location.search ? location.search + '&q=ls' : '?q=ls', type: 'GET', }, orderFixed: [1, 'asc'], rowGroup: { dataSrc: ['base'], }, deferRender: false, dom: 'Bfrtip', pageLength: 10, lengthMenu: [ [10, 25, 50, -1], ['10 rows', '25 rows', '50 rows', 'Show all'] ], select: { style: is_read_only_mode() ? 'api': 'multi' }, columnDefs: [ { targets: 0, className: 'select-checkbox', width: '10px', searchable: false, orderable: false, createdCell: function(td, cell, row, rows, col) { if (row.type == 'P' || is_read_only_mode()) { $(td).removeClass('select-checkbox'); } }, render: function (data, type, full, meta) { return ''; }, }, { targets: 3, width: '65%' } ], buttons: [ 'pageLength', is_read_only_mode() ? '': 'selectAll', is_read_only_mode() ? '': 'selectNone', is_read_only_mode() ? '': { text: 'Delete', className: 'delete', enabled: false, action: function(e, dt, node, config) { let data = this.rows({selected: true}).data(); let base = data.length != 0 ? data[0].base : '/'; let request = { 'q': 'delete', 'path': data.pluck('path').toArray() }; $.ajax({ type: 'POST', url: '', data: JSON.stringify(request), dataType: 'json', processData: false, contentType: 'application/json', success: function (response) { if (!response['success']) { alert('Failed to delete entries: ' + response['message']); } table.ajax.url('?q=ls&dir=' + encodeURIComponent(base)).load(function() { handle_onload(table); }); }, error: function (response) { console.log(response); alert('Failed to delete entries.'); } }); } }, { text: 'Archive all', className: 'archive-all', enabled: true, action: function(e, dt, node, config) { e.preventDefault(); location.href = '?q=archive-all&_=' + Date.now(); } }, ], columns: [ { data: 'path', visible: is_read_only_mode() ? false : true, }, { data: 'type', visible: false, render: function(data, type, row, meta) { return {'P': 0, 'D': 1, 'F': 2}[data]; } }, { data: 'base', visible: false, }, { data: 'name', render: function(data, type, row, meta) { attrs = { P: { dname: 'Parent Directory', iname: 'fi_parent.png' }, D: { dname: data, iname: 'fi_folder.png' }, F: { dname: data, iname: 'fi_file.png' }, 0: { dname: data, iname: 'fi_unknown.png' } }; let path = row.path; if (location.pathname.endsWith('/')) { path = path.replace(/^\/*/, ''); } else { path = location.pathname.substr(location.pathname.lastIndexOf('/') + 1) + path; } let attr = attrs[row.type in attrs ? row.type : 0]; let href = ['P', 'D'].includes(row.type) ? '?dir=' + encodeURIComponent(row.path) : encodeURIComponent(path); return '<div>' + '<img src="?q=resource&name=' + encodeURIComponent(attr.iname) + '" style="float:left;margin-right:8px" alt="' + row.type + '">' + '<a href="' + href + '" class="file-entry">' + attr.dname + '</a>' + '</div>'; } }, { data: 'last-modified', render: function(data, type, row, meta) { if (type != 'display') { return data; } let ts = parseInt(data); if (isNaN(ts)) { return data; } let d = new Date(data * 1000); let tz = d.getTimezoneOffset(); let tzstr = ' UTC'; if (tz != 0) { tzstr = tz < 0 ? '+' : '-'; tz = Math.abs(tz); tzstr += ('00' + Math.floor((tz / 60))).slice(-2) + ('00' + (tz % 60)).slice(-2); } return d.getFullYear() + '-' + ('00' + (d.getMonth() + 1)).slice(-2) + '-' + ('00' + d.getDate()).slice(-2) + ' ' + ('00' + d.getHours()).slice(-2) + ':' + ('00' + d.getMinutes()).slice(-2) + ':' + ('00' + d.getSeconds()).slice(-2) + tzstr; } }, { data: 'size', type: 'numeric', render: function(data, type, row, meta) { return type != 'display' ? data : pretty_size(data); } }, ], footerCallback: function (row, data, start, end, display) { update_status(); let footer = 'Storage Usage: ' + pretty_size(STORAGE_USAGE); if (SANDBOX_USAGE >= 0) { footer += ' + ' + pretty_size(SANDBOX_USAGE); } footer += ' (' + to_title_case(STORAGE_PROTECTION_MODE) +' Mode)'; let api = this.api(); $(api.column(1).footer()).html(footer); }, order: [ [1, 'asc'], [2, 'asc'], [3, 'asc'], [4, 'asc'], [5, 'asc'], ], initComplete: function(settings, json) { handle_onload(table); } }); table.on('user-select', function (e, dt, type, cell, originalEvent) { let data = table.row(cell.node()).data(); if (data.type == 'P') { e.preventDefault(); } }) .on('select', function (e, dt, type, indexes) { handle_onload(table); }) .on('deselect', function (e, dt, type, indexes) { handle_onload(table); }); $('#filelist tbody').on('click', '.file-entry', function () { let data = table.row($(this).closest('tr')).data(); if (data.type == 'P' || data.type == 'D') { table.ajax.url('?q=ls&dir=' + encodeURIComponent(data.path)).load(); return false; } else { table.rows().deselect(); } }); $('#select-all').on('click', function() { let rows = table.rows({search: 'applied'}); this.checked ? rows.select() : rows.deselect(); }); }); $(function(){ $(document).on('dragover', function (event) { event.preventDefault(); }); $(document).on('dragleave', function (event) { event.preventDefault(); }); $(document).on('drop', function (event) { event.preventDefault(); }); $(document).on('dragover', '#file-drop-area', function (event) { event.preventDefault(); $('#file-drop-area').css({'background-color': 'rgb(200, 200, 200)'}); }); $(document).on('dragleave', '#file-drop-area', function (event) { event.preventDefault(); $('#file-drop-area').css({'background-color': 'rgba(0, 0, 0, 0)'}); }); $(document).on('drop', '#file-drop-area', function (event) { let ev = event.originalEvent || event; ev.preventDefault(); $('#file-drop-area').css({'background-color': 'rgba(0, 0, 0, 0)'}); upload_files(ev.dataTransfer.files); }); $(document).on('change', '#file_input', function (event) { event.preventDefault(); upload_files(this.files); }); }); function handle_onload(table) { let select_all = $('#select-all'); let delete_btn = table.buttons(['.delete']); let arcall_btn = table.buttons(['.archive-all']); let count = table.rows({selected: true}).indexes().length; let total = table.rows().indexes().length; select_all.prop('checked', count != 0 && count == total); select_all.prop('indeterminate', count != 0 && count != total); count == 0 ? delete_btn.disable() : delete_btn.enable(); total == 0 ? arcall_btn.disable() : arcall_btn.enable(); if (is_read_only_mode()) { $('#file-upload-form').css({'display': 'none'}); select_all.css({'display': 'none'}); } } function upload_files_in_chunk_mode(ufiles, files_index, chunk_size, chunk_index) { const base = $('#file-upload-dir').val(); const table = $('#filelist').DataTable(); const data = table.rows().data(); const curdir = data.length != 0 ? data[0].base : '/'; const ufile = ufiles[files_index]; const file = ufile.file; const chunk = file.slice(chunk_index * chunk_size, (chunk_index + 1) * chunk_size); const last_chunk = ((chunk_index + 1) * chunk_size) >= file.size; const uploaded_files_total = ufiles.slice(0, files_index).reduce((a, c) => a + c.file.size, 0); const uploaded_total = uploaded_files_total + (chunk_index * chunk_size); const grand_total = ufiles.reduce((a, c) => a + c.file.size, 0); let form = new FormData(); form.append('file', chunk, file.name); form.append('chunk_sid', ufile.sid); form.append('chunk_index', chunk_index); form.append('dir', base || curdir); form.append('q', 'upload'); if (last_chunk) { form.append('last_chunk', 'true'); form.append('file_size', file.size); form.append('extract', $('#file-upload-extract').prop('checked')); } $.ajax({ type: 'POST', url: '', data: form, processData: false, contentType: false, xhr : function(){ $('#file-upload-result').text('Uploading...'); let xhr = $.ajaxSettings.xhr(); xhr.upload.addEventListener('progress', function(e) { let progre = parseInt((uploaded_total + (chunk.size * (e.loaded / e.total))) / grand_total * 100); $('#file-upload-progress').val(progre); $('#file-upload-progress').css({display: ''}); }); return xhr; }, success: function (response) { console.log(response); if (!response['success']) { $('#file-upload-result').text('Failed:' + response['message']); } else { ++chunk_index; if (last_chunk) { chunk_index = 0; if (++files_index >= ufiles.length) { $('#file-upload-result').text('Done.'); table.ajax.url('?q=ls&dir=' + encodeURIComponent(curdir)).load(function() { handle_onload(table); }); return; } } upload_files_in_chunk_mode(ufiles, files_index, chunk_size, chunk_index); } }, error: function (response) { console.log(response); $('#file-upload-result').text(response.statusText); table.ajax.url('?q=ls&dir=' + encodeURIComponent(curdir)).load(function() { handle_onload(table); }); } }); } function upload_files(files) { $('#file-upload-result').text(''); $('#file-upload-progress').val(0); $.ajax({ type: 'POST', url: '', async: true, data: JSON.stringify({q: 'health', permission: 'write'}), dataType: 'json', processData: false, contentType: 'application/json', success: function (response) { const chunk_size = 1 * 1024 * 1024; let ufiles = Array.from(files).map(file => new Object({ file: file, sid: generate_uuid() })); upload_files_in_chunk_mode(ufiles, 0, chunk_size, 0); }, error: function (response) { console.log(response); $('#file-upload-result').text(response.statusText); } }); } function pretty_size(size){ let szstr = ''; size = parseInt(size); if (!isNaN(size)) { const units = ['bytes', 'KB', 'MB', 'GB', 'TB']; const i = Math.min(Math.floor(Math.log2(size ? size : 1) / 10), units.length - 1); szstr = (i == 0 ? size : (size / Math.pow(1024, i)).toFixed(1)) + ' ' + units[i]; } return szstr; } function to_title_case(str) { return str.replace( /([^\W_]+[^\s-/]*) */g, function(txt) { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); } ); } function generate_uuid() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { let r = Math.random() * 16 | 0; let v = c === 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); } """ ) } DEFAULT_MIME_TYPES = """ { "application/andrew-inset": ["ez"], "application/applixware": ["aw"], "application/atom+xml": ["atom"], "application/atomcat+xml": ["atomcat"], "application/atomsvc+xml": ["atomsvc"], "application/bdoc": ["bdoc"], "application/ccxml+xml": ["ccxml"], "application/cdmi-capability": ["cdmia"], "application/cdmi-container": ["cdmic"], "application/cdmi-domain": ["cdmid"], "application/cdmi-object": ["cdmio"], "application/cdmi-queue": ["cdmiq"], "application/cu-seeme": ["cu"], "application/dash+xml": ["mpd"], "application/davmount+xml": ["davmount"], "application/docbook+xml": ["dbk"], "application/dssc+der": ["dssc"], "application/dssc+xml": ["xdssc"], "application/ecmascript": ["ecma"], "application/emma+xml": ["emma"], "application/epub+zip": ["epub"], "application/exi": ["exi"], "application/font-tdpfr": ["pfr"], "application/font-woff": ["woff"], "application/font-woff2": ["woff2"], "application/geo+json": ["geojson"], "application/gml+xml": ["gml"], "application/gpx+xml": ["gpx"], "application/gxf": ["gxf"], "application/gzip": ["gz"], "application/hyperstudio": ["stk"], "application/inkml+xml": ["inkml", "ink"], "application/ipfix": ["ipfix"], "application/java-archive": ["war", "jar", "ear"], "application/java-serialized-object": ["ser"], "application/java-vm": ["class"], "application/javascript": ["mjs", "js"], "application/json": ["json", "map"], "application/json5": ["json5"], "application/jsonml+json": ["jsonml"], "application/ld+json": ["jsonld"], "application/lost+xml": ["lostxml"], "application/mac-binhex40": ["hqx"], "application/mac-compactpro": ["cpt"], "application/mads+xml": ["mads"], "application/manifest+json": ["webmanifest"], "application/marc": ["mrc"], "application/marcxml+xml": ["mrcx"], "application/mathematica": ["nb", "ma", "mb"], "application/mathml+xml": ["mathml"], "application/mbox": ["mbox"], "application/mediaservercontrol+xml": ["mscml"], "application/metalink+xml": ["metalink"], "application/metalink4+xml": ["meta4"], "application/mets+xml": ["mets"], "application/mods+xml": ["mods"], "application/mp21": ["mp21", "m21"], "application/mp4": ["mp4s", "m4p"], "application/msword": ["doc", "dot"], "application/mxf": ["mxf"], "application/octet-stream": ["msm", "bpk", "deploy", "mar", "dms", "pkg", "elc", "lrf", "buffer", "deb", "dll", "msi", "dmg", "distz", "iso", "dump", "img", "dist", "exe", "msp", "so", "bin"], "application/oda": ["oda"], "application/oebps-package+xml": ["opf"], "application/ogg": ["ogx"], "application/omdoc+xml": ["omdoc"], "application/onenote": ["onepkg", "onetoc2", "onetoc", "onetmp"], "application/oxps": ["oxps"], "application/patch-ops-error+xml": ["xer"], "application/pdf": ["pdf"], "application/pgp-encrypted": ["pgp"], "application/pgp-signature": ["sig", "asc"], "application/pics-rules": ["prf"], "application/pkcs10": ["p10"], "application/pkcs7-mime": ["p7c", "p7m"], "application/pkcs7-signature": ["p7s"], "application/pkcs8": ["p8"], "application/pkix-attr-cert": ["ac"], "application/pkix-cert": ["cer"], "application/pkix-crl": ["crl"], "application/pkix-pkipath": ["pkipath"], "application/pkixcmp": ["pki"], "application/pls+xml": ["pls"], "application/postscript": ["ps", "ai", "eps"], "application/prs.cww": ["cww"], "application/pskc+xml": ["pskcxml"], "application/rdf+xml": ["rdf"], "application/reginfo+xml": ["rif"], "application/relax-ng-compact-syntax": ["rnc"], "application/resource-lists+xml": ["rl"], "application/resource-lists-diff+xml": ["rld"], "application/rls-services+xml": ["rs"], "application/rpki-ghostbusters": ["gbr"], "application/rpki-manifest": ["mft"], "application/rpki-roa": ["roa"], "application/rsd+xml": ["rsd"], "application/rss+xml": ["rss"], "application/rtf": ["rtf"], "application/sbml+xml": ["sbml"], "application/scvp-cv-request": ["scq"], "application/scvp-cv-response": ["scs"], "application/scvp-vp-request": ["spq"], "application/scvp-vp-response": ["spp"], "application/sdp": ["sdp"], "application/set-payment-initiation": ["setpay"], "application/set-registration-initiation": ["setreg"], "application/shf+xml": ["shf"], "application/smil+xml": ["smil", "smi"], "application/sparql-query": ["rq"], "application/sparql-results+xml": ["srx"], "application/srgs": ["gram"], "application/srgs+xml": ["grxml"], "application/sru+xml": ["sru"], "application/ssdl+xml": ["ssdl"], "application/ssml+xml": ["ssml"], "application/tei+xml": ["teicorpus", "tei"], "application/thraud+xml": ["tfi"], "application/timestamped-data": ["tsd"], "application/vnd.3gpp.pic-bw-large": ["plb"], "application/vnd.3gpp.pic-bw-small": ["psb"], "application/vnd.3gpp.pic-bw-var": ["pvb"], "application/vnd.3gpp2.tcap": ["tcap"], "application/vnd.3m.post-it-notes": ["pwn"], "application/vnd.accpac.simply.aso": ["aso"], "application/vnd.accpac.simply.imp": ["imp"], "application/vnd.acucobol": ["acu"], "application/vnd.acucorp": ["atc", "acutc"], "application/vnd.adobe.air-application-installer-package+zip": ["air"], "application/vnd.adobe.formscentral.fcdt": ["fcdt"], "application/vnd.adobe.fxp": ["fxp", "fxpl"], "application/vnd.adobe.xdp+xml": ["xdp"], "application/vnd.adobe.xfdf": ["xfdf"], "application/vnd.ahead.space": ["ahead"], "application/vnd.airzip.filesecure.azf": ["azf"], "application/vnd.airzip.filesecure.azs": ["azs"], "application/vnd.amazon.ebook": ["azw"], "application/vnd.americandynamics.acc": ["acc"], "application/vnd.amiga.ami": ["ami"], "application/vnd.android.package-archive": ["apk"], "application/vnd.anser-web-certificate-issue-initiation": ["cii"], "application/vnd.anser-web-funds-transfer-initiation": ["fti"], "application/vnd.antix.game-component": ["atx"], "application/vnd.apple.installer+xml": ["mpkg"], "application/vnd.apple.mpegurl": ["m3u8"], "application/vnd.apple.pkpass": ["pkpass"], "application/vnd.aristanetworks.swi": ["swi"], "application/vnd.astraea-software.iota": ["iota"], "application/vnd.audiograph": ["aep"], "application/vnd.blueice.multipass": ["mpm"], "application/vnd.bmi": ["bmi"], "application/vnd.businessobjects": ["rep"], "application/vnd.chemdraw+xml": ["cdxml"], "application/vnd.chipnuts.karaoke-mmd": ["mmd"], "application/vnd.cinderella": ["cdy"], "application/vnd.claymore": ["cla"], "application/vnd.cloanto.rp9": ["rp9"], "application/vnd.clonk.c4group": ["c4d", "c4u", "c4g", "c4p", "c4f"], "application/vnd.cluetrust.cartomobile-config": ["c11amc"], "application/vnd.cluetrust.cartomobile-config-pkg": ["c11amz"], "application/vnd.commonspace": ["csp"], "application/vnd.contact.cmsg": ["cdbcmsg"], "application/vnd.cosmocaller": ["cmc"], "application/vnd.crick.clicker": ["clkx"], "application/vnd.crick.clicker.keyboard": ["clkk"], "application/vnd.crick.clicker.palette": ["clkp"], "application/vnd.crick.clicker.template": ["clkt"], "application/vnd.crick.clicker.wordbank": ["clkw"], "application/vnd.criticaltools.wbs+xml": ["wbs"], "application/vnd.ctc-posml": ["pml"], "application/vnd.cups-ppd": ["ppd"], "application/vnd.curl.car": ["car"], "application/vnd.curl.pcurl": ["pcurl"], "application/vnd.dart": ["dart"], "application/vnd.data-vision.rdz": ["rdz"], "application/vnd.dece.data": ["uvf", "uvvd", "uvd", "uvvf"], "application/vnd.dece.ttml+xml": ["uvvt", "uvt"], "application/vnd.dece.unspecified": ["uvvx", "uvx"], "application/vnd.dece.zip": ["uvvz", "uvz"], "application/vnd.denovo.fcselayout-link": ["fe_launch"], "application/vnd.dna": ["dna"], "application/vnd.dolby.mlp": ["mlp"], "application/vnd.dpgraph": ["dpg"], "application/vnd.dreamfactory": ["dfac"], "application/vnd.ds-keypoint": ["kpxx"], "application/vnd.dvb.ait": ["ait"], "application/vnd.dvb.service": ["svc"], "application/vnd.dynageo": ["geo"], "application/vnd.ecowin.chart": ["mag"], "application/vnd.enliven": ["nml"], "application/vnd.epson.esf": ["esf"], "application/vnd.epson.msf": ["msf"], "application/vnd.epson.quickanime": ["qam"], "application/vnd.epson.salt": ["slt"], "application/vnd.epson.ssf": ["ssf"], "application/vnd.eszigno3+xml": ["et3", "es3"], "application/vnd.ezpix-album": ["ez2"], "application/vnd.ezpix-package": ["ez3"], "application/vnd.fdf": ["fdf"], "application/vnd.fdsn.mseed": ["mseed"], "application/vnd.fdsn.seed": ["dataless", "seed"], "application/vnd.flographit": ["gph"], "application/vnd.fluxtime.clip": ["ftc"], "application/vnd.framemaker": ["book", "maker", "fm", "frame"], "application/vnd.frogans.fnc": ["fnc"], "application/vnd.frogans.ltf": ["ltf"], "application/vnd.fsc.weblaunch": ["fsc"], "application/vnd.fujitsu.oasys": ["oas"], "application/vnd.fujitsu.oasys2": ["oa2"], "application/vnd.fujitsu.oasys3": ["oa3"], "application/vnd.fujitsu.oasysgp": ["fg5"], "application/vnd.fujitsu.oasysprs": ["bh2"], "application/vnd.fujixerox.ddd": ["ddd"], "application/vnd.fujixerox.docuworks": ["xdw"], "application/vnd.fujixerox.docuworks.binder": ["xbd"], "application/vnd.fuzzysheet": ["fzs"], "application/vnd.genomatix.tuxedo": ["txd"], "application/vnd.geogebra.file": ["ggb"], "application/vnd.geogebra.tool": ["ggt"], "application/vnd.geometry-explorer": ["gex", "gre"], "application/vnd.geonext": ["gxt"], "application/vnd.geoplan": ["g2w"], "application/vnd.geospace": ["g3w"], "application/vnd.gmx": ["gmx"], "application/vnd.google-apps.document": ["gdoc"], "application/vnd.google-apps.presentation": ["gslides"], "application/vnd.google-apps.spreadsheet": ["gsheet"], "application/vnd.google-earth.kml+xml": ["kml"], "application/vnd.google-earth.kmz": ["kmz"], "application/vnd.grafeq": ["gqs", "gqf"], "application/vnd.groove-account": ["gac"], "application/vnd.groove-help": ["ghf"], "application/vnd.groove-identity-message": ["gim"], "application/vnd.groove-injector": ["grv"], "application/vnd.groove-tool-message": ["gtm"], "application/vnd.groove-tool-template": ["tpl"], "application/vnd.groove-vcard": ["vcg"], "application/vnd.hal+xml": ["hal"], "application/vnd.handheld-entertainment+xml": ["zmm"], "application/vnd.hbci": ["hbci"], "application/vnd.hhe.lesson-player": ["les"], "application/vnd.hp-hpgl": ["hpgl"], "application/vnd.hp-hpid": ["hpid"], "application/vnd.hp-hps": ["hps"], "application/vnd.hp-jlyt": ["jlt"], "application/vnd.hp-pcl": ["pcl"], "application/vnd.hp-pclxl": ["pclxl"], "application/vnd.hydrostatix.sof-data": ["sfd-hdstx"], "application/vnd.ibm.minipay": ["mpy"], "application/vnd.ibm.modcap": ["listafp", "afp", "list3820"], "application/vnd.ibm.rights-management": ["irm"], "application/vnd.ibm.secure-container": ["sc"], "application/vnd.iccprofile": ["icm", "icc"], "application/vnd.igloader": ["igl"], "application/vnd.immervision-ivp": ["ivp"], "application/vnd.immervision-ivu": ["ivu"], "application/vnd.insors.igm": ["igm"], "application/vnd.intercon.formnet": ["xpx", "xpw"], "application/vnd.intergeo": ["i2g"], "application/vnd.intu.qbo": ["qbo"], "application/vnd.intu.qfx": ["qfx"], "application/vnd.ipunplugged.rcprofile": ["rcprofile"], "application/vnd.irepository.package+xml": ["irp"], "application/vnd.is-xpr": ["xpr"], "application/vnd.isac.fcs": ["fcs"], "application/vnd.jam": ["jam"], "application/vnd.jcp.javame.midlet-rms": ["rms"], "application/vnd.jisp": ["jisp"], "application/vnd.joost.joda-archive": ["joda"], "application/vnd.kahootz": ["ktz", "ktr"], "application/vnd.kde.karbon": ["karbon"], "application/vnd.kde.kchart": ["chrt"], "application/vnd.kde.kformula": ["kfo"], "application/vnd.kde.kivio": ["flw"], "application/vnd.kde.kontour": ["kon"], "application/vnd.kde.kpresenter": ["kpr", "kpt"], "application/vnd.kde.kspread": ["ksp"], "application/vnd.kde.kword": ["kwt", "kwd"], "application/vnd.kenameaapp": ["htke"], "application/vnd.kidspiration": ["kia"], "application/vnd.kinar": ["knp", "kne"], "application/vnd.koan": ["skt", "skp", "skd", "skm"], "application/vnd.kodak-descriptor": ["sse"], "application/vnd.las.las+xml": ["lasxml"], "application/vnd.llamagraphics.life-balance.desktop": ["lbd"], "application/vnd.llamagraphics.life-balance.exchange+xml": ["lbe"], "application/vnd.lotus-1-2-3": ["123"], "application/vnd.lotus-approach": ["apr"], "application/vnd.lotus-freelance": ["pre"], "application/vnd.lotus-notes": ["nsf"], "application/vnd.lotus-organizer": ["org"], "application/vnd.lotus-screencam": ["scm"], "application/vnd.lotus-wordpro": ["lwp"], "application/vnd.macports.portpkg": ["portpkg"], "application/vnd.mcd": ["mcd"], "application/vnd.medcalcdata": ["mc1"], "application/vnd.mediastation.cdkey": ["cdkey"], "application/vnd.mfer": ["mwf"], "application/vnd.mfmp": ["mfm"], "application/vnd.micrografx.flo": ["flo"], "application/vnd.micrografx.igx": ["igx"], "application/vnd.mif": ["mif"], "application/vnd.mobius.daf": ["daf"], "application/vnd.mobius.dis": ["dis"], "application/vnd.mobius.mbk": ["mbk"], "application/vnd.mobius.mqy": ["mqy"], "application/vnd.mobius.msl": ["msl"], "application/vnd.mobius.plc": ["plc"], "application/vnd.mobius.txf": ["txf"], "application/vnd.mophun.application": ["mpn"], "application/vnd.mophun.certificate": ["mpc"], "application/vnd.mozilla.xul+xml": ["xul"], "application/vnd.ms-artgalry": ["cil"], "application/vnd.ms-cab-compressed": ["cab"], "application/vnd.ms-excel": ["xlm", "xlc", "xla", "xlw", "xlt", "xls"], "application/vnd.ms-excel.addin.macroenabled.12": ["xlam"], "application/vnd.ms-excel.sheet.binary.macroenabled.12": ["xlsb"], "application/vnd.ms-excel.sheet.macroenabled.12": ["xlsm"], "application/vnd.ms-excel.template.macroenabled.12": ["xltm"], "application/vnd.ms-fontobject": ["eot"], "application/vnd.ms-htmlhelp": ["chm"], "application/vnd.ms-ims": ["ims"], "application/vnd.ms-lrm": ["lrm"], "application/vnd.ms-officetheme": ["thmx"], "application/vnd.ms-outlook": ["msg"], "application/vnd.ms-pki.seccat": ["cat"], "application/vnd.ms-pki.stl": ["stl"], "application/vnd.ms-powerpoint": ["pps", "ppt", "pot"], "application/vnd.ms-powerpoint.addin.macroenabled.12": ["ppam"], "application/vnd.ms-powerpoint.presentation.macroenabled.12": ["pptm"], "application/vnd.ms-powerpoint.slide.macroenabled.12": ["sldm"], "application/vnd.ms-powerpoint.slideshow.macroenabled.12": ["ppsm"], "application/vnd.ms-powerpoint.template.macroenabled.12": ["potm"], "application/vnd.ms-project": ["mpp", "mpt"], "application/vnd.ms-word.document.macroenabled.12": ["docm"], "application/vnd.ms-word.template.macroenabled.12": ["dotm"], "application/vnd.ms-works": ["wps", "wdb", "wcm", "wks"], "application/vnd.ms-wpl": ["wpl"], "application/vnd.ms-xpsdocument": ["xps"], "application/vnd.mseq": ["mseq"], "application/vnd.musician": ["mus"], "application/vnd.muvee.style": ["msty"], "application/vnd.mynfc": ["taglet"], "application/vnd.neurolanguage.nlu": ["nlu"], "application/vnd.nitf": ["ntf", "nitf"], "application/vnd.noblenet-directory": ["nnd"], "application/vnd.noblenet-sealer": ["nns"], "application/vnd.noblenet-web": ["nnw"], "application/vnd.nokia.n-gage.data": ["ngdat"], "application/vnd.nokia.n-gage.symbian.install": ["n-gage"], "application/vnd.nokia.radio-preset": ["rpst"], "application/vnd.nokia.radio-presets": ["rpss"], "application/vnd.novadigm.edm": ["edm"], "application/vnd.novadigm.edx": ["edx"], "application/vnd.novadigm.ext": ["ext"], "application/vnd.oasis.opendocument.chart": ["odc"], "application/vnd.oasis.opendocument.chart-template": ["otc"], "application/vnd.oasis.opendocument.database": ["odb"], "application/vnd.oasis.opendocument.formula": ["odf"], "application/vnd.oasis.opendocument.formula-template": ["odft"], "application/vnd.oasis.opendocument.graphics": ["odg"], "application/vnd.oasis.opendocument.graphics-template": ["otg"], "application/vnd.oasis.opendocument.image": ["odi"], "application/vnd.oasis.opendocument.image-template": ["oti"], "application/vnd.oasis.opendocument.presentation": ["odp"], "application/vnd.oasis.opendocument.presentation-template": ["otp"], "application/vnd.oasis.opendocument.spreadsheet": ["ods"], "application/vnd.oasis.opendocument.spreadsheet-template": ["ots"], "application/vnd.oasis.opendocument.text": ["odt"], "application/vnd.oasis.opendocument.text-master": ["odm"], "application/vnd.oasis.opendocument.text-template": ["ott"], "application/vnd.oasis.opendocument.text-web": ["oth"], "application/vnd.olpc-sugar": ["xo"], "application/vnd.oma.dd2+xml": ["dd2"], "application/vnd.openofficeorg.extension": ["oxt"], "application/vnd.openxmlformats-officedocument.presentationml.presentation": ["pptx"], "application/vnd.openxmlformats-officedocument.presentationml.slide": ["sldx"], "application/vnd.openxmlformats-officedocument.presentationml.slideshow": ["ppsx"], "application/vnd.openxmlformats-officedocument.presentationml.template": ["potx"], "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": ["xlsx"], "application/vnd.openxmlformats-officedocument.spreadsheetml.template": ["xltx"], "application/vnd.openxmlformats-officedocument.wordprocessingml.document": ["docx"], "application/vnd.openxmlformats-officedocument.wordprocessingml.template": ["dotx"], "application/vnd.osgeo.mapguide.package": ["mgp"], "application/vnd.osgi.dp": ["dp"], "application/vnd.osgi.subsystem": ["esa"], "application/vnd.palm": ["pqa", "oprc", "pdb"], "application/vnd.pawaafile": ["paw"], "application/vnd.pg.format": ["str"], "application/vnd.pg.osasli": ["ei6"], "application/vnd.picsel": ["efif"], "application/vnd.pmi.widget": ["wg"], "application/vnd.pocketlearn": ["plf"], "application/vnd.powerbuilder6": ["pbd"], "application/vnd.previewsystems.box": ["box"], "application/vnd.proteus.magazine": ["mgz"], "application/vnd.publishare-delta-tree": ["qps"], "application/vnd.pvi.ptid1": ["ptid"], "application/vnd.quark.quarkxpress": ["qwd", "qxb", "qxd", "qxt", "qxl", "qwt"], "application/vnd.realvnc.bed": ["bed"], "application/vnd.recordare.musicxml": ["mxl"], "application/vnd.recordare.musicxml+xml": ["musicxml"], "application/vnd.rig.cryptonote": ["cryptonote"], "application/vnd.rim.cod": ["cod"], "application/vnd.rn-realmedia": ["rm"], "application/vnd.rn-realmedia-vbr": ["rmvb"], "application/vnd.route66.link66+xml": ["link66"], "application/vnd.sailingtracker.track": ["st"], "application/vnd.seemail": ["see"], "application/vnd.sema": ["sema"], "application/vnd.semd": ["semd"], "application/vnd.semf": ["semf"], "application/vnd.shana.informed.formdata": ["ifm"], "application/vnd.shana.informed.formtemplate": ["itp"], "application/vnd.shana.informed.interchange": ["iif"], "application/vnd.shana.informed.package": ["ipk"], "application/vnd.simtech-mindmapper": ["twd", "twds"], "application/vnd.smaf": ["mmf"], "application/vnd.smart.teacher": ["teacher"], "application/vnd.solent.sdkm+xml": ["sdkm", "sdkd"], "application/vnd.spotfire.dxp": ["dxp"], "application/vnd.spotfire.sfs": ["sfs"], "application/vnd.stardivision.calc": ["sdc"], "application/vnd.stardivision.draw": ["sda"], "application/vnd.stardivision.impress": ["sdd"], "application/vnd.stardivision.math": ["smf"], "application/vnd.stardivision.writer": ["vor", "sdw"], "application/vnd.stardivision.writer-global": ["sgl"], "application/vnd.stepmania.package": ["smzip"], "application/vnd.stepmania.stepchart": ["sm"], "application/vnd.sun.wadl+xml": ["wadl"], "application/vnd.sun.xml.calc": ["sxc"], "application/vnd.sun.xml.calc.template": ["stc"], "application/vnd.sun.xml.draw": ["sxd"], "application/vnd.sun.xml.draw.template": ["std"], "application/vnd.sun.xml.impress": ["sxi"], "application/vnd.sun.xml.impress.template": ["sti"], "application/vnd.sun.xml.math": ["sxm"], "application/vnd.sun.xml.writer": ["sxw"], "application/vnd.sun.xml.writer.global": ["sxg"], "application/vnd.sun.xml.writer.template": ["stw"], "application/vnd.sus-calendar": ["sus", "susp"], "application/vnd.svd": ["svd"], "application/vnd.symbian.install": ["sis", "sisx"], "application/vnd.syncml+xml": ["xsm"], "application/vnd.syncml.dm+wbxml": ["bdm"], "application/vnd.syncml.dm+xml": ["xdm"], "application/vnd.tao.intent-module-archive": ["tao"], "application/vnd.tcpdump.pcap": ["cap", "dmp", "pcap"], "application/vnd.tmobile-livetv": ["tmo"], "application/vnd.trid.tpt": ["tpt"], "application/vnd.triscape.mxs": ["mxs"], "application/vnd.trueapp": ["tra"], "application/vnd.ufdl": ["ufd", "ufdl"], "application/vnd.uiq.theme": ["utz"], "application/vnd.umajin": ["umj"], "application/vnd.unity": ["unityweb"], "application/vnd.uoml+xml": ["uoml"], "application/vnd.vcx": ["vcx"], "application/vnd.visio": ["vst", "vsd", "vsw", "vss"], "application/vnd.visionary": ["vis"], "application/vnd.vsf": ["vsf"], "application/vnd.wap.wbxml": ["wbxml"], "application/vnd.wap.wmlc": ["wmlc"], "application/vnd.wap.wmlscriptc": ["wmlsc"], "application/vnd.webturbo": ["wtb"], "application/vnd.wolfram.player": ["nbp"], "application/vnd.wordperfect": ["wpd"], "application/vnd.wqd": ["wqd"], "application/vnd.wt.stf": ["stf"], "application/vnd.xara": ["xar"], "application/vnd.xfdl": ["xfdl"], "application/vnd.yamaha.hv-dic": ["hvd"], "application/vnd.yamaha.hv-script": ["hvs"], "application/vnd.yamaha.hv-voice": ["hvp"], "application/vnd.yamaha.openscoreformat": ["osf"], "application/vnd.yamaha.openscoreformat.osfpvg+xml": ["osfpvg"], "application/vnd.yamaha.smaf-audio": ["saf"], "application/vnd.yamaha.smaf-phrase": ["spf"], "application/vnd.yellowriver-custom-menu": ["cmp"], "application/vnd.zul": ["zir", "zirz"], "application/vnd.zzazz.deck+xml": ["zaz"], "application/voicexml+xml": ["vxml"], "application/widget": ["wgt"], "application/winhlp": ["hlp"], "application/wsdl+xml": ["wsdl"], "application/wspolicy+xml": ["wspolicy"], "application/x-7z-compressed": ["7z"], "application/x-abiword": ["abw"], "application/x-ace-compressed": ["ace"], "application/x-apple-diskimage": ["dmg"], "application/x-arj": ["arj"], "application/x-authorware-bin": ["vox", "u32", "aab", "x32"], "application/x-authorware-map": ["aam"], "application/x-authorware-seg": ["aas"], "application/x-bcpio": ["bcpio"], "application/x-bdoc": ["bdoc"], "application/x-bittorrent": ["torrent"], "application/x-blorb": ["blb", "blorb"], "application/x-bzip": ["bz"], "application/x-bzip2": ["boz", "bz2"], "application/x-cbr": ["cb7", "cbr", "cbz", "cba", "cbt"], "application/x-cdlink": ["vcd"], "application/x-cfs-compressed": ["cfs"], "application/x-chat": ["chat"], "application/x-chess-pgn": ["pgn"], "application/x-chrome-extension": ["crx"], "application/x-cocoa": ["cco"], "application/x-conference": ["nsc"], "application/x-cpio": ["cpio"], "application/x-csh": ["csh"], "application/x-debian-package": ["deb", "udeb"], "application/x-dgc-compressed": ["dgc"], "application/x-director": ["dir", "swa", "w3d", "fgd", "cst", "dxr", "cct", "cxt", "dcr"], "application/x-doom": ["wad"], "application/x-dtbncx+xml": ["ncx"], "application/x-dtbook+xml": ["dtb"], "application/x-dtbresource+xml": ["res"], "application/x-dvi": ["dvi"], "application/x-envoy": ["evy"], "application/x-eva": ["eva"], "application/x-font-bdf": ["bdf"], "application/x-font-ghostscript": ["gsf"], "application/x-font-linux-psf": ["psf"], "application/x-font-otf": ["otf"], "application/x-font-pcf": ["pcf"], "application/x-font-snf": ["snf"], "application/x-font-ttf": ["ttc", "ttf"], "application/x-font-type1": ["pfm", "pfa", "pfb", "afm"], "application/x-freearc": ["arc"], "application/x-futuresplash": ["spl"], "application/x-gca-compressed": ["gca"], "application/x-glulx": ["ulx"], "application/x-gnumeric": ["gnumeric"], "application/x-gramps-xml": ["gramps"], "application/x-gtar": ["gtar"], "application/x-hdf": ["hdf"], "application/x-httpd-php": ["php"], "application/x-install-instructions": ["install"], "application/x-iso9660-image": ["iso"], "application/x-java-archive-diff": ["jardiff"], "application/x-java-jnlp-file": ["jnlp"], "application/x-latex": ["latex"], "application/x-lua-bytecode": ["luac"], "application/x-lzh-compressed": ["lzh", "lha"], "application/x-makeself": ["run"], "application/x-mie": ["mie"], "application/x-mobipocket-ebook": ["mobi", "prc"], "application/x-ms-application": ["application"], "application/x-ms-shortcut": ["lnk"], "application/x-ms-wmd": ["wmd"], "application/x-ms-wmz": ["wmz"], "application/x-ms-xbap": ["xbap"], "application/x-msaccess": ["mdb"], "application/x-msbinder": ["obd"], "application/x-mscardfile": ["crd"], "application/x-msclip": ["clp"], "application/x-msdos-program": ["exe"], "application/x-msdownload": ["exe", "com", "dll", "msi", "bat"], "application/x-msmediaview": ["m13", "mvb", "m14"], "application/x-msmetafile": ["wmf", "emf", "emz", "wmz"], "application/x-msmoney": ["mny"], "application/x-mspublisher": ["pub"], "application/x-msschedule": ["scd"], "application/x-msterminal": ["trm"], "application/x-mswrite": ["wri"], "application/x-netcdf": ["cdf", "nc"], "application/x-ns-proxy-autoconfig": ["pac"], "application/x-nzb": ["nzb"], "application/x-perl": ["pl", "pm"], "application/x-pilot": ["pdb", "prc"], "application/x-pkcs12": ["pfx", "p12"], "application/x-pkcs7-certificates": ["p7b", "spc"], "application/x-pkcs7-certreqresp": ["p7r"], "application/x-rar-compressed": ["rar"], "application/x-redhat-package-manager": ["rpm"], "application/x-research-info-systems": ["ris"], "application/x-sea": ["sea"], "application/x-sh": ["sh"], "application/x-shar": ["shar"], "application/x-shockwave-flash": ["swf"], "application/x-silverlight-app": ["xap"], "application/x-sql": ["sql"], "application/x-stuffit": ["sit"], "application/x-stuffitx": ["sitx"], "application/x-subrip": ["srt"], "application/x-sv4cpio": ["sv4cpio"], "application/x-sv4crc": ["sv4crc"], "application/x-t3vm-image": ["t3"], "application/x-tads": ["gam"], "application/x-tar": ["tar"], "application/x-tcl": ["tcl", "tk"], "application/x-tex": ["tex"], "application/x-tex-tfm": ["tfm"], "application/x-texinfo": ["texinfo", "texi"], "application/x-tgif": ["obj"], "application/x-ustar": ["ustar"], "application/x-virtualbox-hdd": ["hdd"], "application/x-virtualbox-ova": ["ova"], "application/x-virtualbox-ovf": ["ovf"], "application/x-virtualbox-vbox": ["vbox"], "application/x-virtualbox-vbox-extpack": ["vbox-extpack"], "application/x-virtualbox-vdi": ["vdi"], "application/x-virtualbox-vhd": ["vhd"], "application/x-virtualbox-vmdk": ["vmdk"], "application/x-wais-source": ["src"], "application/x-web-app-manifest+json": ["webapp"], "application/x-x509-ca-cert": ["pem", "der", "crt"], "application/x-xfig": ["fig"], "application/x-xliff+xml": ["xlf"], "application/x-xpinstall": ["xpi"], "application/x-xz": ["xz"], "application/x-zmachine": ["z3", "z4", "z6", "z1", "z8", "z7", "z2", "z5"], "application/xaml+xml": ["xaml"], "application/xcap-diff+xml": ["xdf"], "application/xenc+xml": ["xenc"], "application/xhtml+xml": ["xhtml", "xht"], "application/xml": ["xsl", "rng", "xml", "xsd"], "application/xml-dtd": ["dtd"], "application/xop+xml": ["xop"], "application/xproc+xml": ["xpl"], "application/xslt+xml": ["xslt"], "application/xspf+xml": ["xspf"], "application/xv+xml": ["mxml", "xvml", "xhvml", "xvm"], "application/yang": ["yang"], "application/yin+xml": ["yin"], "application/zip": ["zip"], "audio/3gpp": ["3gpp"], "audio/adpcm": ["adp"], "audio/basic": ["snd", "au"], "audio/midi": ["kar", "midi", "mid", "rmi"], "audio/mp3": ["mp3"], "audio/mp4": ["mp4a", "m4a"], "audio/mpeg": ["mp3", "mp2", "m3a", "mp2a", "mpga", "m2a"], "audio/ogg": ["oga", "spx", "ogg", "opus"], "audio/s3m": ["s3m"], "audio/silk": ["sil"], "audio/vnd.dece.audio": ["uva", "uvva"], "audio/vnd.digital-winds": ["eol"], "audio/vnd.dra": ["dra"], "audio/vnd.dts": ["dts"], "audio/vnd.dts.hd": ["dtshd"], "audio/vnd.lucent.voice": ["lvp"], "audio/vnd.ms-playready.media.pya": ["pya"], "audio/vnd.nuera.ecelp4800": ["ecelp4800"], "audio/vnd.nuera.ecelp7470": ["ecelp7470"], "audio/vnd.nuera.ecelp9600": ["ecelp9600"], "audio/vnd.rip": ["rip"], "audio/wav": ["wav"], "audio/wave": ["wav"], "audio/webm": ["weba"], "audio/x-aac": ["aac"], "audio/x-aiff": ["aifc", "aiff", "aif"], "audio/x-caf": ["caf"], "audio/x-flac": ["flac"], "audio/x-m4a": ["m4a"], "audio/x-matroska": ["mka"], "audio/x-mpegurl": ["m3u"], "audio/x-ms-wax": ["wax"], "audio/x-ms-wma": ["wma"], "audio/x-pn-realaudio": ["ra", "ram"], "audio/x-pn-realaudio-plugin": ["rmp"], "audio/x-realaudio": ["ra"], "audio/x-wav": ["wav"], "audio/xm": ["xm"], "chemical/x-cdx": ["cdx"], "chemical/x-cif": ["cif"], "chemical/x-cmdf": ["cmdf"], "chemical/x-cml": ["cml"], "chemical/x-csml": ["csml"], "chemical/x-xyz": ["xyz"], "font/otf": ["otf"], "image/apng": ["apng"], "image/bmp": ["bmp"], "image/cgm": ["cgm"], "image/g3fax": ["g3"], "image/gif": ["gif"], "image/ief": ["ief"], "image/jpeg": ["jpeg", "jpe", "jpg"], "image/ktx": ["ktx"], "image/png": ["png"], "image/prs.btif": ["btif"], "image/sgi": ["sgi"], "image/svg+xml": ["svgz", "svg"], "image/tiff": ["tif", "tiff"], "image/vnd.adobe.photoshop": ["psd"], "image/vnd.dece.graphic": ["uvvi", "uvi", "uvg", "uvvg"], "image/vnd.djvu": ["djv", "djvu"], "image/vnd.dvb.subtitle": ["sub"], "image/vnd.dwg": ["dwg"], "image/vnd.dxf": ["dxf"], "image/vnd.fastbidsheet": ["fbs"], "image/vnd.fpx": ["fpx"], "image/vnd.fst": ["fst"], "image/vnd.fujixerox.edmics-mmr": ["mmr"], "image/vnd.fujixerox.edmics-rlc": ["rlc"], "image/vnd.ms-modi": ["mdi"], "image/vnd.ms-photo": ["wdp"], "image/vnd.net-fpx": ["npx"], "image/vnd.wap.wbmp": ["wbmp"], "image/vnd.xiff": ["xif"], "image/webp": ["webp"], "image/x-3ds": ["3ds"], "image/x-cmu-raster": ["ras"], "image/x-cmx": ["cmx"], "image/x-freehand": ["fhc", "fh7", "fh5", "fh", "fh4"], "image/x-icon": ["ico"], "image/x-jng": ["jng"], "image/x-mrsid-image": ["sid"], "image/x-ms-bmp": ["bmp"], "image/x-pcx": ["pcx"], "image/x-pict": ["pic", "pct"], "image/x-portable-anymap": ["pnm"], "image/x-portable-bitmap": ["pbm"], "image/x-portable-graymap": ["pgm"], "image/x-portable-pixmap": ["ppm"], "image/x-rgb": ["rgb"], "image/x-tga": ["tga"], "image/x-xbitmap": ["xbm"], "image/x-xpixmap": ["xpm"], "image/x-xwindowdump": ["xwd"], "message/rfc822": ["eml", "mime"], "model/gltf+json": ["gltf"], "model/gltf-binary": ["glb"], "model/iges": ["iges", "igs"], "model/mesh": ["silo", "mesh", "msh"], "model/vnd.collada+xml": ["dae"], "model/vnd.dwf": ["dwf"], "model/vnd.gdl": ["gdl"], "model/vnd.gtw": ["gtw"], "model/vnd.mts": ["mts"], "model/vnd.vtu": ["vtu"], "model/vrml": ["vrml", "wrl"], "model/x3d+binary": ["x3db", "x3dbz"], "model/x3d+vrml": ["x3dvz", "x3dv"], "model/x3d+xml": ["x3d", "x3dz"], "text/cache-manifest": ["appcache", "manifest"], "text/calendar": ["ics", "ifb"], "text/coffeescript": ["litcoffee", "coffee"], "text/css": ["css"], "text/csv": ["csv"], "text/hjson": ["hjson"], "text/html": ["htm", "html", "shtml"], "text/jade": ["jade"], "text/jsx": ["jsx"], "text/less": ["less"], "text/markdown": ["md", "markdown"], "text/mathml": ["mml"], "text/n3": ["n3"], "text/plain": ["text", "conf", "list", "txt", "in", "ini", "log", "def"], "text/prs.lines.tag": ["dsc"], "text/richtext": ["rtx"], "text/rtf": ["rtf"], "text/sgml": ["sgml", "sgm"], "text/slim": ["slm", "slim"], "text/stylus": ["stylus", "styl"], "text/tab-separated-values": ["tsv"], "text/troff": ["me", "man", "tr", "t", "ms", "roff"], "text/turtle": ["ttl"], "text/uri-list": ["uris", "uri", "urls"], "text/vcard": ["vcard"], "text/vnd.curl": ["curl"], "text/vnd.curl.dcurl": ["dcurl"], "text/vnd.curl.mcurl": ["mcurl"], "text/vnd.curl.scurl": ["scurl"], "text/vnd.dvb.subtitle": ["sub"], "text/vnd.fly": ["fly"], "text/vnd.fmi.flexstor": ["flx"], "text/vnd.graphviz": ["gv"], "text/vnd.in3d.3dml": ["3dml"], "text/vnd.in3d.spot": ["spot"], "text/vnd.sun.j2me.app-descriptor": ["jad"], "text/vnd.wap.wml": ["wml"], "text/vnd.wap.wmlscript": ["wmls"], "text/vtt": ["vtt"], "text/x-asm": ["s", "asm"], "text/x-c": ["cc", "dic", "cpp", "h", "c", "cxx", "hh"], "text/x-component": ["htc"], "text/x-fortran": ["f77", "f90", "f", "for"], "text/x-handlebars-template": ["hbs"], "text/x-java-source": ["java"], "text/x-lua": ["lua"], "text/x-markdown": ["mkd"], "text/x-nfo": ["nfo"], "text/x-opml": ["opml"], "text/x-org": ["org"], "text/x-pascal": ["p", "pas"], "text/x-processing": ["pde"], "text/x-sass": ["sass"], "text/x-scss": ["scss"], "text/x-setext": ["etx"], "text/x-sfv": ["sfv"], "text/x-suse-ymp": ["ymp"], "text/x-uuencode": ["uu"], "text/x-vcalendar": ["vcs"], "text/x-vcard": ["vcf"], "text/xml": ["xml"], "text/yaml": ["yaml", "yml"], "video/3gpp": ["3gp", "3gpp"], "video/3gpp2": ["3g2"], "video/h261": ["h261"], "video/h263": ["h263"], "video/h264": ["h264"], "video/jpeg": ["jpgv"], "video/jpm": ["jpgm", "jpm"], "video/mj2": ["mj2", "mjp2"], "video/mp2t": ["ts"], "video/mp4": ["mp4v", "mp4", "mpg4"], "video/mpeg": ["m1v", "mpg", "mpeg", "m2v", "mpe"], "video/ogg": ["ogv"], "video/quicktime": ["qt", "mov"], "video/vnd.dece.hd": ["uvh", "uvvh"], "video/vnd.dece.mobile": ["uvvm", "uvm"], "video/vnd.dece.pd": ["uvvp", "uvp"], "video/vnd.dece.sd": ["uvs", "uvvs"], "video/vnd.dece.video": ["uvvv", "uvv"], "video/vnd.dvb.file": ["dvb"], "video/vnd.fvt": ["fvt"], "video/vnd.mpegurl": ["mxu", "m4u"], "video/vnd.ms-playready.media.pyv": ["pyv"], "video/vnd.uvvu.mp4": ["uvvu", "uvu"], "video/vnd.vivo": ["viv"], "video/webm": ["webm"], "video/x-f4v": ["f4v"], "video/x-fli": ["fli"], "video/x-flv": ["flv"], "video/x-m4v": ["m4v"], "video/x-matroska": ["mks", "mkv", "mk3d"], "video/x-mng": ["mng"], "video/x-ms-asf": ["asf", "asx"], "video/x-ms-vob": ["vob"], "video/x-ms-wm": ["wm"], "video/x-ms-wmv": ["wmv"], "video/x-ms-wmx": ["wmx"], "video/x-ms-wvx": ["wvx"], "video/x-msvideo": ["avi"], "video/x-sgi-movie": ["movie"], "video/x-smv": ["smv"], "x-conference/x-cooltalk": ["ice"], "font/collection": ["ttc"], "font/ttf": ["ttf"], "font/woff": ["woff"], "font/woff2": ["woff2"], "text/javascript": ["mjs"] } """ HTML_MAIN = r""" <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <link rel="stylesheet" type="text/css" href="?q=resource&name=datatables.min.css"/> <script type="text/javascript" src="?q=resource&name=datatables.min.js"></script> <script type="text/javascript" src="?q=resource&name=main.js"></script> <style> #file-uploader label { display: inline-block; padding: 10px 40px; text-align: center; font-size: 14px; color: rgb(0, 0, 0); border-color: rgba(0, 0, 0, 0.3); border-style: dashed solid; border-width: 1px; border-bottom-left-radius: 2px; border-bottom-right-radius: 2px; border-top-left-radius: 2px; border-top-right-radius: 2px; outline-color: rgb(0, 0, 0); background-color: rgba(0, 0, 0, 0); background-image: linear-gradient(rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%); cursor: pointer; width: 240px; } #file-uploader input[type="file"] { display: none; } #file-uploader-tailer { margin: 8px; font-size: 14px; } </style> <title></title> </head> <body> <table id="filelist" class="display"> <thead> <tr> <th><input type="checkbox" id="select-all" /></th> <th>Type</th> <th>Base</th> <th>Name</th> <th>Last Modified</th> <th>Size</th> </tr> </thead> <tbody></tbody> <tfoot> <tr><th colspan="6" style="text-align:right">Storage Usage:</th></tr> </tfoot> </table> <div id="file-upload-form"> <form action="#" method="POST" enctype="multipart/form-data"> <div id="file-uploader"> <label id="file-drop-area"> <input id="file_input" type="file" name="files" multiple />Drop files to upload </label> </div> <div id="file-uploader-tailer"> <label>Upload To:<input id="file-upload-dir" type="text" size="64" /></label> <label> <input type="checkbox" id="file-upload-extract" />Extract archives (.zip, .tar, tar.gz, .tar.bz2, .tar.xz) </label><br> <progress id="file-upload-progress" value="0" max="100" style="display:none; width:500px;"></progress> <span id="file-upload-result"></span> </div> </form> </div> </body> </html> """ STORAGE_PROTECTION = Enum("STORAGE_PROTECTION", ["READ_WRITE", "READ_ONLY", "SANDBOX"]) PERMISSION = Enum("PERMISSION", ["READ", "WRITE"]) VALIDATION = Enum("VALIDATION", ["SUCCESS", "FAILURE", "NONCE_EXPIRED"]) class Settings: @staticmethod def parse_attachment_exts(text: str) -> set[str]: """Parse a text to build a attachment extentions. :param text: A attachment extentions configuration :return: A set of extentions. """ return {ext if ext == "*" or ext.startswith(".") else f".{ext}" for ext in text.replace(",", " ").split()} @staticmethod def parse_mime_types(text: str) -> dict[str, str]: """Parse a text to build a mime type mapping to extensions :param text: A mapping configuration :return: A mapping table (extension (key) and mime type (value)). """ mapping = {} try: for mime_type, exts in json.loads(text).items(): for ext in argToList(exts): mapping[ext if ext.startswith(".") else f".{ext}"] = mime_type except json.decoder.JSONDecodeError: for line in text.splitlines(): if not (line := line.strip()).startswith("#"): mime_type, _, exts = line.replace("\t", " ").partition(" ") if mime_type: for ext in exts.rstrip(";").split(): mapping[ext if ext.startswith(".") else f".{ext}"] = mime_type return mapping @staticmethod def parse_human_size(size: str) -> int | None: """Parse a human readable size string :return: Size in bytes """ if not (m := re.match(r"^(\d+(?:\.\d+)?)\s*([KMGT]?B)?$", size.upper())): return None num, unit = m.groups() UNITS = {None: 1, "B": 1, "KB": 2**10, "MB": 2**20, "GB": 2**30, "TB": 2**40} return int(float(num) * UNITS[unit]) def __init__(self, params: dict[str, Any]) -> None: max_storage_size_str = params.get("maxStorageSize") or "100 MB" if (max_storage_size := Settings.parse_human_size(max_storage_size_str)) is None: raise DemistoException("Invalid max storage size") max_sandbox_size_str = params.get("maxSandboxSize") or "1 GB" if (max_sandbox_size := Settings.parse_human_size(max_sandbox_size_str)) is None: raise DemistoException("Invalid max sandbox repository size") self.__max_storage_size = max_storage_size self.__max_sandbox_size = max_sandbox_size self.__attachment_exts = Settings.parse_attachment_exts(params.get("attachmentExtensions") or "") if argToBoolean(params.get("mergeMimeTypes", "true")): self.__ext_to_mimetype = Settings.parse_mime_types(DEFAULT_MIME_TYPES) self.__ext_to_mimetype.update(Settings.parse_mime_types(params.get("mimeTypes") or "{}")) else: self.__ext_to_mimetype = Settings.parse_mime_types(params.get("mimeTypes") or DEFAULT_MIME_TYPES) self.__public_read_access = argToBoolean(params.get("publicReadAccess", "true")) storage_protection = params.get("storageProtection") or "read/write" self.__storage_protection = { "read/write": STORAGE_PROTECTION.READ_WRITE, "read-only": STORAGE_PROTECTION.READ_ONLY, "sandbox": STORAGE_PROTECTION.SANDBOX, }.get(storage_protection) if self.__storage_protection is None: raise DemistoException(f"Invalid storage protection mode: {storage_protection}") host_port, _, docker_port = (params.get("longRunningPort") or "").partition(":") self.__host_port = int(host_port or docker_port or 0) self.__docker_port = int(docker_port or host_port or 0) self.__auth_method = params.get("authenticationMethod") creds = params.get("rwCredentials") or {} self.__rw_username = creds.get("identifier") or "" self.__rw_password = creds.get("password") or "" creds = params.get("roCredentials") or {} self.__ro_username = creds.get("identifier") or "" self.__ro_password = creds.get("password") or "" def get_user_password(self, username: str | None) -> str | None: if username == self.__rw_username: return self.__rw_password elif username == self.__ro_username: return self.__ro_password else: return None def get_user_permissions(self, username: str | None) -> set[PERMISSION]: if username == self.__rw_username: return set({PERMISSION.READ, PERMISSION.WRITE}) elif username == self.__ro_username: return set({PERMISSION.READ}) else: return set() def get_content_type_from_file_extension(self, ext: str) -> str: if content_type := self.__ext_to_mimetype.get(ext): return content_type else: for pattern, content_type in self.__ext_to_mimetype.items(): if fnmatch.fnmatch(ext, pattern): return content_type return "application/octet-stream" def is_attachment_file_extension(self, ext: str) -> bool: return ext in self.__attachment_exts or any(fnmatch.fnmatch(ext, pattern) for pattern in self.__attachment_exts) @property def host_port(self) -> int: return self.__host_port @property def docker_port(self) -> int: return self.__docker_port @property def attachment_exts(self) -> set[str]: return self.__attachment_exts @property def ext_to_mimetype(self) -> dict[str, str]: return self.__ext_to_mimetype @property def max_storage_size(self) -> int: return self.__max_storage_size @property def max_sandbox_size(self) -> int: return self.__max_sandbox_size @property def public_read_access(self) -> bool: return self.__public_read_access @property def storage_protection(self) -> STORAGE_PROTECTION: return self.__storage_protection # type: ignore @property def auth_method(self) -> str | None: return self.__auth_method @property def rw_user_credentials(self) -> tuple[str, str]: return self.__rw_username, self.__rw_password @property def ro_user_credentials(self) -> tuple[str, str]: return self.__ro_username, self.__ro_password SETTINGS = Settings(demisto.params()) def get_default_gateway() -> str | None: """Get a default gateway address. :return: A default gateway address found. """ with open("/proc/net/route") as f: for line in f: fields = line.strip().split() if fields[1] != "00000000" or not int(fields[3], 16) & 2: continue return socket.inet_ntoa(struct.pack("<L", int(fields[2], 16))) return None def get_local_ip() -> str: """Get an external IP address. NOTE: https://stackoverflow.com/questions/166506/finding-local-ip-addresses-using-pythons-stdlib :return: An external IP address found. """ with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: s.settimeout(0) try: # doesn't even have to be reachable s.connect(("10.254.254.254", 1)) ip = s.getsockname()[0] except Exception: ip = "127.0.0.1" return ip def detect_service_ip_port(settings: Settings) -> tuple[str, int]: """Detect the IP:port of the local server :param settings: The instance settings. :return: The IP and port number. """ try: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.settimeout(1) server_addr = "127.0.0.1" server_port = settings.docker_port s.connect((server_addr, server_port)) except Exception: server_addr = get_default_gateway() # type: ignore server_port = settings.host_port if not server_addr: raise DemistoException("Unable to get any server addresses.") return server_addr, server_port def new_client(host_port: tuple[str, int], settings: Settings) -> BaseClient: """Create a new BasicClient :param host_port: The IP and port number :param settings: The instance settings. :return: A new BasicClient created. """ server_addr, server_port = host_port auth: HTTPBasicAuth | HTTPDigestAuth | None = None username, password = settings.rw_user_credentials if settings.auth_method in ("", None): pass elif settings.auth_method == "Basic": auth = HTTPBasicAuth(username, password) elif settings.auth_method in ("Digest-md5", "Digest-sha256"): auth = HTTPDigestAuth(username, password) else: raise DemistoException(f"Unknown authentication method - {settings.auth_method}") return BaseClient(f"http://{server_addr}:{server_port}", auth=auth) def to_abs_path(path: str) -> str: return path if path.startswith(os.sep) else os.sep + path def pretty_size(size: int) -> str: units = ["bytes", "KB", "MB", "GB", "TB"] i = min(int(math.log(size or 1, 1024)), len(units) - 1) return f"{size / 1024 ** i:.{max(min(1, i), 0)}f} {units[i]}" class NonceManager: def __init__(self) -> None: self.__cache: dict[str, dict[str, Any]] = {} self.__expires = 10 self.__max_replays = 20 self.__max_nonce = 4096 def __remove_expired_oldest(self, now: int | None = None) -> bool: """Remove the expired oldest nonce from the cache :param now: The current timestamp :return: Return True if the expired oldest nonce has been removed. Otherwise False. """ if now is None: now = int(datetime.now().timestamp()) oldest_time = 0 oldest_nonce = None for nonce, ent in self.__cache.items(): last_time = ent.get("last_time") or 0 if last_time + self.__expires < now and last_time < oldest_time: oldest_time = last_time oldest_nonce = nonce if oldest_nonce is not None: self.__cache.pop(oldest_nonce, None) return True else: return False def __new_nonce(self) -> tuple[int, str]: """Create a new nonce :return: The current timestamp and a new nonce. """ now = int(datetime.now().timestamp()) nonce = str(now) + ":" + os.urandom(16).hex() return now, nonce def validate_nonce(self, nonce: str) -> VALIDATION: """Check if the nonce is valid. :param nonce: A nonce to validate. :return: Return the result of validation. """ if (ent := self.__cache.get(nonce)) is None: return VALIDATION.FAILURE now = int(datetime.now().timestamp()) if (ent.get("last_time") or 0) + self.__expires < now: return VALIDATION.NONCE_EXPIRED if (count := (ent.get("count") or 0) + 1) >= self.__max_replays: return VALIDATION.NONCE_EXPIRED self.__cache[nonce] = {"last_time": now, "count": count} return VALIDATION.SUCCESS def gen_nonce(self) -> str: """Generate a new nonce :return: A new nonce generated. """ now, nonce = self.__new_nonce() if len(self.__cache) >= self.__max_nonce and not self.__remove_expired_oldest(now): raise DemistoException("Unable to generate a new nonce (too many active nonces).") self.__cache[nonce] = {"last_time": now, "count": 0} return nonce NONCE_MANAGER = NonceManager() class FileReceiver: class UploadingData: def __init__(self, sess_id: str, data: IO[bytes], expiry: int) -> None: self.__last_seq_no = -1 self.__expiry = expiry self.__sess_id = sess_id self.__valid_until = int(datetime.now().timestamp()) + expiry self.__file: IO[bytes] | None = NamedTemporaryFile() self.append_chunk(data, 0) def is_active(self) -> bool: return self.__file is not None and int(datetime.now().timestamp()) < self.__valid_until def update_session_time(self) -> bool: now = int(datetime.now().timestamp()) if now > self.__valid_until: return False self.__valid_until = now + self.__expiry return True def validate_session_id(self, sess_id) -> bool: return sess_id == self.__sess_id def close(self) -> None: if self.__file is not None: self.__file.close() self.__file = None def append_chunk(self, data: IO[bytes], seq_no: int) -> None: if self.__file is None: raise DemistoException("The session has already closed.") next_seq_no = self.__last_seq_no + 1 if next_seq_no != seq_no: raise DemistoException(f"Incorrect chunk sequence # - {seq_no} (expected {next_seq_no})") self.__last_seq_no = next_seq_no try: while d := data.read(4096): self.__file.write(d) except Exception: self.__file.close() raise def finish(self, total_size: int) -> IO[bytes]: """Finish uploading chunk data The payload file returned must be closed after using it. :param total_size: The total size in bytes. :return: The payload file that all the chunk data have been concatinated. """ if self.__file is None: raise DemistoException("The session has already closed.") self.__file.flush() cur_size = self.__file.tell() if cur_size != total_size: raise DemistoException(f"File upload is incomplete - {cur_size}/{total_size}") self.__file.seek(0) file = self.__file self.__file = None return file def __init__(self) -> None: self.__cache: dict[str, self.UploadingData] = {} # type: ignore self.__expires = 60 def remove_expired_cache_entries(self) -> None: for k in [k for k, v in self.__cache.items() if not v.is_active()]: self.__cache.pop(k, None) def handle_chunk_file(self, request: BaseRequest) -> tuple[str, IO[bytes]] | None: """Handle for a uploaded chunk file :param request: A HTTP request data. :return: The filename with the payload file when the last chunk is processed. Otherwise only the filename returns. """ files = list(request.files.getall("file")) if len(files) != 1: raise DemistoException("Only one file can handle in chunk mode.") file = files[0] # request.forms.dir doesn't give a correct unicode string dir_path = to_abs_path((request.forms.getall("dir")[0:1] or [""])[0]) abs_path = os.path.normpath(os.path.join(dir_path, os.path.basename(file.raw_filename))) chunk_index = int(request.forms.chunk_index) chunk_sid = request.forms.chunk_sid if udata := self.__cache.get(abs_path): if not udata.validate_session_id(chunk_sid): if chunk_index != 0: raise DemistoException("Session is invalid or another client is overwriting the file.") # overwrite with a new payload udata.close() self.__cache.pop(abs_path, None) udata = self.UploadingData(chunk_sid, file.file, self.__expires) self.__cache[abs_path] = udata elif not udata.update_session_time(): udata.close() self.__cache.pop(abs_path, None) raise DemistoException("Session is exipred.") else: udata.append_chunk(file.file, chunk_index) elif chunk_index == 0: udata = self.UploadingData(chunk_sid, file.file, self.__expires) self.__cache[abs_path] = udata else: raise DemistoException("Chunk data was not uploaded in order.") if argToBoolean(request.forms.last_chunk or "false"): self.__cache.pop(abs_path, None) return file.raw_filename, udata.finish(int(request.forms.file_size)) return None FILE_RECEIVER = FileReceiver() class Master: def __init__(self, storage_protection: STORAGE_PROTECTION) -> None: """Initialize the master DB manager :param storage_protection: The storage protection mode """ self.__repo: dict[str, str] | None = None self.__storage_protection = storage_protection self.__total_data_usage = None @property def storage_protection(self) -> STORAGE_PROTECTION: return self.__storage_protection def reset(self) -> None: """Wipe the repository on the normal mode, and Restore the repository on the sandbox mode.""" self.__repo = None if self.storage_protection == STORAGE_PROTECTION.READ_WRITE: set_integration_context({}) def get_full_repository(self) -> dict[str, str]: """Get the full context data from the integration context :return: The integration context. """ if self.storage_protection == STORAGE_PROTECTION.SANDBOX and self.__repo is not None: return self.__repo ctx = get_integration_context() if self.storage_protection == STORAGE_PROTECTION.SANDBOX: self.__repo = ctx elif self.__repo is None: self.__repo = {k: v for k, v in ctx.items() if k.startswith(os.sep)} return ctx def get_attrs_repository(self) -> dict[str, str]: """Get the file entries without payloads from the integration context. :return: The integration context without file payloads. (File payload can be included in the copy-on-write mode) """ if self.__repo is not None: return self.__repo else: return self.get_full_repository() def set_full_repository(self, repo: dict[str, str]) -> None: """Set the full context data to the integration context. :param repo: The integration context. """ if self.storage_protection == STORAGE_PROTECTION.SANDBOX: self.__repo = repo elif self.storage_protection == STORAGE_PROTECTION.READ_WRITE: self.__repo = {k: v for k, v in repo.items() if k.startswith(os.sep)} set_integration_context(repo) def total_data_usage(self) -> tuple[int, int]: """Get the data usage :return: The sum of all the saved sizes in the DB / on the file system. """ if self.__repo is not None and self.__total_data_usage is None: repo = get_integration_context() else: repo = self.get_attrs_repository() data_usage = 0 file_usage = 0 for k, v in repo.items(): if k.startswith(os.sep): attrs = json.loads(v) if attrs.get("data-type") == "gzip-file": file_usage += int(attrs.get("saved-size") or 0) else: data_usage += int(attrs.get("saved-size") or 0) if self.__total_data_usage is None or self.storage_protection != STORAGE_PROTECTION.SANDBOX: self.__total_data_usage = data_usage # type: ignore return data_usage, file_usage else: return self.__total_data_usage, file_usage MASTER_REPOSITORY = Master(storage_protection=SETTINGS.storage_protection) class AttrsRepository: def __init__(self, repo: dict[str, str]) -> None: self.repo = repo @staticmethod def __split_path_components(abs_path: str) -> list[str]: comps = [] path = os.path.normpath(to_abs_path(abs_path)) while path: parent, name = os.path.split(path) comps.append(name or parent) if parent == path: break path = parent return list(reversed(comps[:-1])) def is_file_type(self, data_type: str | None) -> bool: return data_type == "gzip-file" def list_file_entries(self, abs_dir: str, recursive: bool = False) -> dict[str, dict[str, Any]]: """List the file entries on a directory :param abs_dir: The directory path in absolute path on which to list file entries :param recursive: Set to True to list entries recursively, otherwise False. :return: The file path and attributes. """ abs_path = os.path.normpath(abs_dir) sub_path = abs_path if abs_path == os.sep else abs_path + os.sep ents = {} for path, eattrs in self.repo.items(): if path.startswith(sub_path): comps = self.__split_path_components(path[len(abs_path) :]) if len(comps) >= 1 and comps[0] not in ents: if recursive or len(comps) == 1: attrs = json.loads(eattrs) ents[path] = { "type": "F", "name": comps[-1], "path": path, "base": abs_path, "size": attrs.get("size") or 0, "last-modified": int(attrs.get("last-modified") or 0), } if len(comps) > 1: path = os.path.join(abs_path, comps[0]) ents[path] = { "type": "D", "name": comps[0], "path": path, "base": abs_path, "size": None, "last-modified": None, } if abs_path != os.sep: path = os.path.split(abs_path)[0] ents[path] = {"type": "P", "name": "..", "path": path, "base": abs_path, "size": None, "last-modified": None} return ents class FullRepository(AttrsRepository): @staticmethod def new_decoder(data_type: str | None, data: str) -> Iterator[bytes]: """Decode a file content in chunks :param data_type: The encoding mode of the payload. :param data: The data to decode """ if data_type is None: yield data.encode() elif data_type == "base85": yield base64.b85decode(data) elif data_type == "gzip+base85": with gzip.GzipFile(mode="rb", fileobj=io.BytesIO(base64.b85decode(data))) as g: while chunk := g.read(4096): yield chunk else: raise DemistoException(f"Unknown data type: {data_type}") @staticmethod def new_reader(data_type: str | None, path: str) -> Iterator[bytes]: """Read a file content in chunks :param data_type: The file type. :param path: The file path. """ if data_type == "gzip-file": with gzip.GzipFile(filename=path, mode="rb") as g: while chunk := g.read(4096): yield chunk else: raise DemistoException(f"Unknown data type: {data_type}") def __init__(self, repo: Master, data_usage_limit: int = 0, file_usage_limit: int = 0) -> None: """Initialize the instance. :param repo: The repository :param data_usage_limit: The maximum size of the total data usage of the repository. :param file_usage_limit: The maximum size of the total file usage of the filesystem. """ super().__init__(repo.get_full_repository()) self.__master = repo self.__data_usage_limit = data_usage_limit self.__file_usage_limit = file_usage_limit self.__total_data_usage, self.__total_file_usage = repo.total_data_usage() def remove_orphan_entries(self) -> None: """Remove unlinked data entries""" repo = self.repo keep_uuids = set() data_uuids = set() for key, eattrs in repo.items(): if key.startswith(os.sep): attrs = json.loads(eattrs) if not self.is_file_type(attrs.get("data-type")): keep_uuids.add(attrs.get("data-id")) else: data_uuids.add(key) for data_uuid in data_uuids - keep_uuids: repo.pop(data_uuid, None) def remove_entry(self, abs_path: str) -> None: """Remove the file/directory entry :param abs_path: The path in absolute path """ abs_path = os.path.normpath(abs_path) sub_path = abs_path if abs_path == os.sep else abs_path + os.sep # Remove file entries under the directory repo = self.repo for path in [path for path in repo if path.startswith(sub_path)]: attrs = json.loads(repo.pop(path, "{}")) if not self.is_file_type(attrs.get("data-type")): data = repo.pop((attrs.get("data-id") or ""), None) self.__total_data_usage -= len(data or "") else: if (path := attrs.get("data-id")) and os.path.isfile(path): os.unlink(path) self.__total_file_usage -= attrs.get("saved-size") or 0 # Remove the file entry attrs = json.loads(repo.pop(abs_path, "{}")) if not self.is_file_type(attrs.get("data-type")): data = repo.pop((attrs.get("data-id") or ""), None) self.__total_data_usage -= len(data or "") else: if (path := attrs.get("data-id")) and os.path.isfile(path): os.unlink(path) self.__total_file_usage -= attrs.get("saved-size") or 0 def save_file(self, abs_dir: str, name: str, data: IO[bytes]) -> dict[str, Any]: """Save a file :param abs_dir: The directory path in absolute path :param name: The name of the file :param data: The payload of the file :return: The file attributes. """ repo = self.repo abs_path = os.path.normpath(os.path.join(abs_dir, os.path.relpath(to_abs_path(name), os.sep))) # Remove conflict files in the directory hierarchy path, name = os.path.split(abs_path) while path and path != os.sep: if eattrs := repo.pop(path, None): attrs = json.loads(eattrs) if not self.is_file_type(attrs.get("data-type")): repo.pop((attrs.get("data-id") or ""), None) path, name = os.path.split(path) # Compress and encode the data sandbox = self.__master.storage_protection == STORAGE_PROTECTION.SANDBOX try: data_size = 0 with NamedTemporaryFile(delete=not sandbox) as gtmp: with gzip.GzipFile(mode="wb", fileobj=gtmp) as g: while chunk := data.read(4096): g.write(chunk) data_size += len(chunk) gtmp.flush() if not sandbox: if data_size > gtmp.tell(): gtmp.seek(0) out_data = base64.b85encode(gtmp.read()).decode() data_type = "gzip+base85" else: data.seek(0) out_data = base64.b85encode(data.read()).decode() data_type = "base85" saved_size = len(out_data) # Check the limit if self.__data_usage_limit > 0 and self.__data_usage_limit < self.__total_data_usage + saved_size: raise DemistoException("Repository data size limit exceeded") data_id = str(uuid.uuid4()) else: data_type = "gzip-file" data_id = gtmp.name # Check the limit saved_size = gtmp.tell() if self.__file_usage_limit > 0 and self.__file_usage_limit < self.__total_file_usage + saved_size: raise DemistoException("Sandbox data size limit exceeded") # Save the file attr = { "last-modified": int(datetime.now(timezone.utc).timestamp()), # noqa: UP017 "data-id": data_id, "data-type": data_type, "size": data_size, "saved-size": saved_size, } repo[abs_path] = json.dumps(attr) if not sandbox: repo[data_id] = out_data self.__total_data_usage += saved_size else: self.__total_file_usage += saved_size return attr except Exception: if sandbox: os.unlink(gtmp.name) raise def save_files(self, abs_dir: str, files: dict[str, IO[bytes]], extract: bool) -> None: """Save files :param abs_dir: The directory path in absolute path :param files: The name and payload of files :param extract: Set to True to extract archives if needed, otherwise False. """ for name, file in files.items(): if extract: lowername = name.lower() if lowername.endswith(".zip") and zipfile.is_zipfile(file): with zipfile.ZipFile(file, "r") as z: for filename in [i.filename for i in z.infolist()]: with z.open(filename) as zd: self.save_file(abs_dir, filename, zd) elif lowername.endswith((".tar", ".tar.gz", ".tar.bz2", ".tar.xz")): with tarfile.open(mode="r:*", fileobj=file) as t: for tinfo in t: if tinfo.isfile() and ((td := t.extractfile(tinfo)) is not None): self.save_file(abs_dir, tinfo.name, td) else: self.save_file(abs_dir, name, file) else: self.save_file(abs_dir, name, file) def read_file(self, abs_path: str) -> tuple[dict[str, Any], Iterator[bytes] | None]: """Read a file content with its attributes :param abs_path: The file path :return: Attributes of the file and the payload reader. """ repo = self.repo if eattrs := repo.get(os.path.normpath(abs_path)): attrs: dict[str, Any] = json.loads(eattrs) if data_id := attrs.get("data-id"): attrs["name"] = os.path.basename(abs_path) attrs["path"] = abs_path data_type = attrs.get("data-type") if self.is_file_type(data_type): return attrs, FullRepository.new_reader(data_type, data_id) else: data = repo.get(data_id) if data is not None: return attrs, FullRepository.new_decoder(data_type, data) return {}, None def archive_zip(self) -> Iterator[bytes]: """Build a zip stream in chunks by archiving all the files""" repo = self.repo with NamedTemporaryFile() as ztmp: with zipfile.ZipFile(ztmp, "w", compression=zipfile.ZIP_DEFLATED) as z: for path, eattrs in repo.items(): if path.startswith(os.sep): attrs = json.loads(eattrs) if data_id := attrs.get("data-id"): data_type = attrs.get("data-type") if self.is_file_type(data_type): # Add a file to the zip with NamedTemporaryFile() as tf: for chunk in FullRepository.new_reader(data_type, data_id): tf.write(chunk) tf.flush() z.write(tf.name, path[len(os.sep) :]) elif data := repo.get(data_id): # Add a file to the zip with NamedTemporaryFile() as tf: for chunk in FullRepository.new_decoder(data_type, data): tf.write(chunk) tf.flush() z.write(tf.name, path[len(os.sep) :]) ztmp.flush() ztmp.seek(0) while chunk := ztmp.read(4096): yield chunk def commit(self) -> None: """Write the cache modified by transactions to the master Note: In the copy-on-write mode, the master is not modified. """ self.__master.set_full_repository(self.repo) @bottle.error(404) def error404(error) -> str: return """ <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Not Found</title> </head> <body> <h1>Not Found</h1> <p>The requested URL was not found on this server.</p> </body> </html> """ class ServiceHandler: def __init__(self, settings: Settings, master: Master) -> None: self.__settings = settings self.__master = master def __validate_basic_auth(self, auth_value: str) -> set[PERMISSION]: """Checks whether the authentication is valid :param auth_value: Credentials given to the Authentication header :return: Aquired permissions. """ username, sep, password = base64.b64decode(auth_value.encode()).decode().partition(":") if sep == ":" and self.__settings.get_user_password(username) == password: return self.__settings.get_user_permissions(username) return set() def __validate_digest_auth( self, auth_value: str, request_method: str, realm: str, hash_name: tuple[str, str] ) -> tuple[VALIDATION, set[PERMISSION]]: """Checks whether the authentication is valid :param auth_value: Credentials given to the Authentication header :param request_method: The request method :param real: The realm :param hash_name: The digest algorithm name for the hashlib and the prorocol. :return: The result of the validation and the aquired permissions. """ params = urllib.request.parse_keqv_list(urllib.request.parse_http_list(auth_value)) username = params.get("username") if (password := self.__settings.get_user_password(username)) is None: return VALIDATION.FAILURE, set() username = username or "" hhash_name, phash_name = hash_name if ( params.get("algorithm", "MD5").upper() != phash_name or not (qnonce := params.get("nonce")) or not (quri := params.get("uri")) or not (qresponse := params.get("response")) or not (qcnonce := params.get("cnonce")) or not (qnc := params.get("nc")) ): return VALIDATION.FAILURE, set() if (result := NONCE_MANAGER.validate_nonce(qnonce)) != VALIDATION.SUCCESS: return result, set() a1 = hashlib.new(hhash_name, username.encode() + b":" + realm.encode() + b":" + password.encode()).hexdigest() a2 = hashlib.new(hhash_name, f"{request_method}:{quri}".encode()).hexdigest() oresponse = hashlib.new(hhash_name, f"{a1}:{qnonce}:{qnc}:{qcnonce}:auth:{a2}".encode()).hexdigest() if qresponse == oresponse: return VALIDATION.SUCCESS, self.__settings.get_user_permissions(username) else: return VALIDATION.FAILURE, set() def authenticate(self, request: BaseRequest, permission: PERMISSION) -> HTTPResponse | None: """Authenticate user to the required permission :param request: The request data :param permission: The required permission :return: Return None if the authentication has been successfully done, otherwise a HTTP response to request an authentication. """ required_auth_method = self.__settings.auth_method if permission == PERMISSION.READ and self.__settings.public_read_access: # Authentication is not required return None if not required_auth_method: # Authentication is not required return None realm = "protected area" auth_header = request.get_header("Authorization") or "" qauth_method, _, qauth_value = auth_header.partition(" ") response = HTTPResponse() response.status = 401 match required_auth_method: case "Basic": """ Basic Auth """ if qauth_method == "Basic" and permission in self.__validate_basic_auth(qauth_value): return None response.set_header("WWW-Authenticate", f'Basic realm="{realm}"') case "Digest-md5" | "Digest-sha256": """ Digest Auth """ _, _, hhash_name = required_auth_method.partition("-") rhash_name = { "md5": "MD5", "sha256": "SHA-256", }[hhash_name] result = VALIDATION.FAILURE if qauth_method == "Digest": result, permissions = self.__validate_digest_auth( qauth_value, request.method, realm, (hhash_name, rhash_name) ) if result == VALIDATION.SUCCESS and permission in permissions: return None nonce = NONCE_MANAGER.gen_nonce() auth_value = f'Digest realm="{realm}", nonce="{nonce}", algorithm={rhash_name}, qop=auth' if result == VALIDATION.NONCE_EXPIRED: auth_value += ", stale=true" response.set_header("WWW-Authenticate", auth_value) return response def __handle_get_resource(self, request: BaseRequest) -> HTTPResponse: global RESOURCES_DIC global RESOURCES_ZIP if RESOURCES_ZIP is None: RESOURCES_ZIP = zipfile.ZipFile(io.BytesIO(base64.b64decode(RESOURCES_ZIP_B64)), "r") body: str | bytes | None = None if request.query.name in RESOURCES_DIC: body = RESOURCES_DIC.get(request.query.name) elif request.query.name in RESOURCES_ZIP.namelist(): body = RESOURCES_ZIP.read(request.query.name) else: bottle.abort(404, "go to 404") _, ext = os.path.splitext(request.query.name) response = HTTPResponse(body) response.content_type = {".css": "text/css", ".js": "text/javascript", ".png": "image/png"}.get( ext, "application/octet-stream" ) return response def __handle_get_status(self) -> HTTPResponse: data_usage, file_usage = self.__master.total_data_usage() storage_protection = { STORAGE_PROTECTION.READ_WRITE: "read/write", STORAGE_PROTECTION.READ_ONLY: "read-only", STORAGE_PROTECTION.SANDBOX: "sandbox", }.get(self.__settings.storage_protection) resp = { "storage_protection": storage_protection, "max_storage_size": self.__settings.max_storage_size, "max_sandbox_size": self.__settings.max_sandbox_size, "storage_usage": data_usage, "sandbox_usage": file_usage, "server_ip": get_local_ip(), "server_port": self.__settings.docker_port, } response = HTTPResponse() response.content_type = "application/json" response.body = resp return response def __handle_get_ls(self, request: BaseRequest) -> HTTPResponse: dirpath = to_abs_path(request.query.dir) recursive = argToBoolean(request.query.recursive or "false") repo = AttrsRepository(self.__master.get_attrs_repository()) response = HTTPResponse() response.content_type = "application/json" response.body = {"data": list(repo.list_file_entries(dirpath, recursive).values())} return response def __handle_get_download(self, request: BaseRequest) -> HTTPResponse: path = to_abs_path(request.query.path) attrs, chunks = FullRepository(self.__master).read_file(to_abs_path(path)) if chunks is None: bottle.abort(404, "go to 404") encoded_name = urllib.parse.quote(attrs.get("name") or "file.dat", encoding="utf-8") response = HTTPResponse() response.content_type = "application/octet-stream" response.set_header("Content-Disposition", f"attachment; filename*=utf-8''{encoded_name}") response.body = chunks return response def __handle_get_archive_all(self) -> HTTPResponse: filename = datetime.now(timezone.utc).strftime("archive-%Y%m%d%H%M%S.zip") # noqa: UP017 response = HTTPResponse() response.content_type = "application/zip" response.set_header("Content-Disposition", f'attachment; filename="{filename}"') response.body = FullRepository(self.__master).archive_zip() return response def __handle_post_health(self, request: BaseRequest) -> HTTPResponse | None: if permission := request.json.get("permission"): return self.authenticate(request, PERMISSION.WRITE if permission == "write" else PERMISSION.READ) return None def __handle_post_cleanup(self) -> None: if self.__master.storage_protection == STORAGE_PROTECTION.READ_ONLY: raise DemistoException("The storage is read-only mode.") self.__master.set_full_repository({}) def __handle_post_reset(self) -> None: if self.__master.storage_protection == STORAGE_PROTECTION.READ_ONLY: raise DemistoException("The storage is read-only mode.") self.__master.reset() def __handle_post_delete(self, request: BaseRequest) -> None: if self.__master.storage_protection == STORAGE_PROTECTION.READ_ONLY: raise DemistoException("The storage is read-only mode.") if paths := request.json.get("path"): repo = FullRepository(self.__master) for path in paths: repo.remove_entry(to_abs_path(path)) repo.remove_orphan_entries() repo.commit() def __handle_post_upload(self, request: BaseRequest) -> None: def _save_files(request: BaseRequest, files: dict[str, IO[bytes]]) -> None: repo = FullRepository(self.__master, self.__settings.max_storage_size, self.__settings.max_sandbox_size) # request.forms.dir doesn't give a correct unicode string dir_path = to_abs_path((request.forms.getall("dir")[0:1] or [""])[0]) extract = argToBoolean(request.forms.extract or "false") repo.save_files(dir_path, files, extract) repo.remove_orphan_entries() repo.commit() if self.__master.storage_protection == STORAGE_PROTECTION.READ_ONLY: raise DemistoException("The storage is read-only mode.") FILE_RECEIVER.remove_expired_cache_entries() if request.forms.chunk_sid: if r := FILE_RECEIVER.handle_chunk_file(request): name, file = r with file: _save_files(request, {name: file}) else: if files := list(request.files.getall("file")): _save_files(request, {file.raw_filename: file.file for file in files}) def get(self, request: BaseRequest) -> HTTPResponse: if response := self.authenticate(request, PERMISSION.READ): return response if request.query.q == "resource": return self.__handle_get_resource(request) elif request.query.q == "status": return self.__handle_get_status() elif request.query.q == "ls": return self.__handle_get_ls(request) elif request.query.q == "download": return self.__handle_get_download(request) elif request.query.q == "archive-all": return self.__handle_get_archive_all() else: response = HTTPResponse() response.content_type = "text/html" response.body = HTML_MAIN return response def get_file(self, request: BaseRequest, path: str) -> HTTPResponse: if response := self.authenticate(request, PERMISSION.READ): return response attrs, chunks = FullRepository(self.__master).read_file(to_abs_path(path)) if chunks is None: bottle.abort(404, "go to 404") filename = attrs.get("name") or "" _, ext = os.path.splitext(filename) response = HTTPResponse() response.content_type = self.__settings.get_content_type_from_file_extension(ext) if self.__settings.is_attachment_file_extension(ext): encoded_name = urllib.parse.quote(filename, encoding="utf-8") response.set_header("Content-Disposition", f"attachment; filename*=utf-8''{encoded_name}") response.body = chunks return response def post(self, request: BaseRequest) -> HTTPResponse: response = HTTPResponse() response.content_type = "application/json" try: if request.content_type == "application/json": q = isinstance(request.json, dict) and request.json.get("q") match q: case "health": if resp := self.__handle_post_health(request): return resp case "cleanup": if resp := self.authenticate(request, PERMISSION.WRITE): return resp self.__handle_post_cleanup() case "reset": if resp := self.authenticate(request, PERMISSION.WRITE): return resp self.__handle_post_reset() case "delete": if resp := self.authenticate(request, PERMISSION.WRITE): return resp self.__handle_post_delete(request) case _: raise DemistoException("Unknown request") else: if request.forms.q == "upload": if resp := self.authenticate(request, PERMISSION.WRITE): return resp self.__handle_post_upload(request) else: raise DemistoException("Unknown request") response.body = {"success": True} except Exception as e: response.body = {"success": False, "message": str(e)} return response @bottle.route("/<path:path>", method="GET") def process_download_file(path): handler = ServiceHandler(settings=SETTINGS, master=MASTER_REPOSITORY) return handler.get_file(bottle.request, path) @bottle.route("/", method="POST") def process_root_post(): handler = ServiceHandler(settings=SETTINGS, master=MASTER_REPOSITORY) return handler.post(bottle.request) @bottle.route("/", method="GET") def process_root_get(): handler = ServiceHandler(settings=SETTINGS, master=MASTER_REPOSITORY) return handler.get(bottle.request) def run_long_running(settings: Settings, is_test: bool = False) -> None: if not is_test: bottle.run(host="0.0.0.0", port=settings.docker_port, debug=True) def test_module(args: dict[str, str], settings: Settings) -> str: """ Validates: """ run_long_running(settings, is_test=True) return "ok" def command_status(args: dict[str, str], settings: Settings) -> CommandResults: """Get the service status :param args: The parameters which were given to the command. :param settings: The instance settings. """ server_addr, server_port = detect_service_ip_port(settings) external_ip = get_default_gateway() or server_addr client = new_client((server_addr, server_port), settings) resp = client._http_request("GET", params={"q": "status"}, raise_on_status=True) outputs = assign_params( StorageUsage=resp.get("storage_usage"), SandboxUsage=resp.get("sandbox_usage"), StorageProtection=resp.get("storage_protection"), IntercommunicationIP=server_addr, IntercommunicationPort=server_port, ExternalIP=external_ip, ExternalPort=settings.host_port, ServerIP=resp.get("server_ip"), ServerPort=resp.get("server_port"), ) readable_outputs = { "Storage Usage": pretty_size(resp.get("storage_usage") or 0), "Sandbox Usage": pretty_size(resp.get("sandbox_usage") or 0), "Storage Protection": resp.get("storage_protection"), "Intercommunication IP": server_addr, "Intercommunication Port": server_port, "External IP": external_ip, "External Port": settings.host_port, "Server IP": resp.get("server_ip"), "Server Port": resp.get("server_port"), } return CommandResults( outputs_prefix="WebFileRepository.Status", outputs=outputs, readable_output=tblToMd("Service Status", readable_outputs, headers=readable_outputs.keys()), raw_response=outputs, ) def command_cleanup(args: dict[str, str], settings: Settings) -> str: """Remove all the files from the repository :param args: The parameters which were given to the command. :param settings: The instance settings. """ client = new_client(detect_service_ip_port(settings), settings) resp = client._http_request("POST", json_data={"q": "cleanup"}, raise_on_status=True) if not resp.get("success"): raise ValueError(f'Failed to clean up entries: {resp.get("message")}') return "Done." def command_reset(args: dict[str, str], settings: Settings) -> str: """Reset the repostiory data :param args: The parameters which were given to the command. :param settings: The instance settings. """ client = new_client(detect_service_ip_port(settings), settings) resp = client._http_request("POST", json_data={"q": "reset"}, raise_on_status=True) if not resp.get("success"): raise ValueError(f'Failed to reset the repository: {resp.get("message")}') return "Done." def command_upload_as_file(args: dict[str, str], settings: Settings) -> str: """Upload data as a file :param args: The parameters which were given to the command. :param settings: The instance settings. """ client = new_client(detect_service_ip_port(settings), settings) input_data = args.get("data", "") encoding = args.get("encoding", "utf-8") match encoding: case "utf-8": file_data = input_data.encode(encoding) case "base64": file_data = base64.b64decode(input_data) case _: raise ValueError(f"Invalid encoding name: {encoding}") files = [("file", [args.get("file_name"), file_data])] data = assign_params( q="upload", dir=args.get("upload_directory", "/"), extract=args.get("extract_archive", "false"), ) resp = client._http_request("POST", data=data, files=files, raise_on_status=True) if not resp.get("success"): raise ValueError(f'Failed to upload a file: {resp.get("message")}') return "Done." def command_upload_file(args: dict[str, str], settings: Settings) -> str: """Upload a file :param args: The parameters which were given to the command. :param settings: The instance settings. """ client = new_client(detect_service_ip_port(settings), settings) res = demisto.getFilePath(args.get("entry_id")) path = res["path"] name = args.get("file_name") if not name: name = res["name"] with open(path, "rb") as f: files = [("file", [name, f.read()])] data = assign_params( q="upload", dir=args.get("upload_directory", "/"), extract=args.get("extract_archive", "false"), ) resp = client._http_request("POST", data=data, files=files, raise_on_status=True) if not resp.get("success"): raise ValueError(f'Failed to upload a file: {resp.get("message")}') return "Done." def command_upload_files(args: dict[str, str], settings: Settings) -> str: """Upload files :param args: The parameters which were given to the command. :param settings: The instance settings. """ client = new_client(detect_service_ip_port(settings), settings) files = [] for ent_id in argToList(args.get("entry_ids", [])): res = demisto.getFilePath(ent_id) path = res["path"] name = res["name"] with open(path, "rb") as f: files.append(("file", [name, f.read()])) data = assign_params( q="upload", dir=args.get("upload_directory", "/"), extract=args.get("extract_archive", "false"), ) resp = client._http_request("POST", data=data, files=files, raise_on_status=True) if not resp.get("success"): raise ValueError(f'Failed to upload files: {resp.get("message")}') return "Done." def command_list_files(args: dict[str, str], settings: Settings) -> CommandResults: """List file entries in the repository :param args: The parameters which were given to the command. :param settings: The instance settings. """ class __MappingValue: def __init__(self, readable_value: Callable[[Any], Any], context_value: Callable[[Any], Any]) -> None: self.readable_value = readable_value self.context_value = context_value query_params = assign_params(q="ls", dir=args.get("directory", "/"), recursive=args.get("recursive", "false")) client = new_client(detect_service_ip_port(settings), settings) resp = client._http_request("GET", params=query_params, raise_on_status=True) ents = resp.get("data") if not isinstance(ents, list): raise ValueError("Failed to list file entries") file_ents = sorted([ent for ent in ents if ent.get("type") == "F"], key=lambda x: x["path"]) mapping = { "name": __MappingValue(lambda x: x or "", lambda x: x or ""), "path": __MappingValue(lambda x: x or "", lambda x: x or ""), "size": __MappingValue(lambda x: pretty_size(x or 0), lambda x: x or 0), "last-modified": __MappingValue( lambda x: datetime.fromtimestamp(int(x or 0), timezone.utc).strftime("%Y-%m-%d %H:%M:%S UTC"), # noqa: UP017 lambda x: datetime.fromtimestamp(int(x or 0), UTC).isoformat(), ), # noqa: UP017 } outputs = [{camelize_string(k, "-"): v.context_value(ent[k]) for k, v in mapping.items()} for ent in file_ents] return CommandResults( outputs_prefix="WebFileRepository.Files(val.Path === obj.Path)", outputs=outputs, readable_output=tblToMd( "File List", [{k: v.readable_value(ent[k]) for k, v in mapping.items()} for ent in file_ents], headers=mapping.keys(), headerTransform=lambda x: x.replace("-", " ").title(), ), raw_response=file_ents, ) def command_remove_files(args: dict[str, str], settings: Settings) -> str: """Remove files from the repository :param args: The parameters which were given to the command. :param settings: The instance settings. """ client = new_client(detect_service_ip_port(settings), settings) resp = client._http_request("POST", json_data={"q": "delete", "path": argToList(args.get("paths", []))}, raise_on_status=True) if not resp.get("success"): raise ValueError(f'Failed to remove files: {resp.get("message")}') return "Done." def command_download_file(args: dict[str, str], settings: Settings) -> dict[str, Any]: """Download a file from the repository :param args: The parameters which were given to the command. :param settings: The instance settings. """ if not (path := args.get("path")): raise DemistoException("A file path is required.") client = new_client(detect_service_ip_port(settings), settings) resp = client._http_request("GET", params={"q": "download", "path": path}, raise_on_status=True, resp_type="response") if not (filename := args.get("save_as")) and (content_disposition := resp.headers.get("Content-Disposition")): cdp = email_parser.Parser().parsestr(f"Content-Disposition: {content_disposition}", headersonly=True) filename = cdp.get_filename() return fileResult(filename or str(uuid.uuid4()), resp.content) def command_download_as_text(args: dict[str, str], settings: Settings) -> CommandResults: """Download a file from the repository, and set the data to the context :param args: The parameters which were given to the command. :param settings: The instance settings. """ if not (path := args.get("path")): raise DemistoException("A file path is required.") client = new_client(detect_service_ip_port(settings), settings) resp = client._http_request("GET", params={"q": "download", "path": path}, raise_on_status=True, resp_type="response") encoding = args.get("encoding", "utf-8") match encoding: case "utf-8": text = resp.content.decode(encoding) case "base64": text = base64.b64encode(resp.content).decode("utf-8") case _: raise ValueError(f"Invalid encoding name: {encoding}") raw_response = { "path": os.path.normpath(path if path.startswith("/") else "/" + path), "name": os.path.basename(path), "data": text, "size": len(resp.content), "encoding": encoding, } outputs = {camelize_string(k, "-"): v for k, v in raw_response.items()} if encoding not in ("base64"): readable_output = f"### {os.path.basename(path)}\n```\n{text}\n```\n" else: readable_output = tblToMd(os.path.basename(path), {"Path": raw_response["path"], "Size": pretty_size(len(resp.content))}) return CommandResults( outputs_prefix="WebFileRepository.Files(val.Path === obj.Path)", outputs=outputs, readable_output=readable_output, raw_response=raw_response, ) def command_archive_zip(args: dict[str, str], settings: Settings) -> dict[str, Any]: """Archive all the files into a zip file :param args: The parameters which were given to the command. :param settings: The instance settings. """ client = new_client(detect_service_ip_port(settings), settings) resp = client._http_request("GET", params={"q": "archive-all"}, raise_on_status=True, resp_type="response") if not (filename := args.get("save_as")) and (content_disposition := resp.headers.get("Content-Disposition")): cdp = email_parser.Parser().parsestr(f"Content-Disposition: {content_disposition}", headersonly=True) filename = cdp.get_filename() return fileResult(filename or str(uuid.uuid4()), resp.content) def main() -> None: """ Main """ command = demisto.command() demisto.debug(f"Command being called is {command}") commands = { "test-module": test_module, "wfr-status": command_status, "wfr-cleanup": command_cleanup, "wfr-reset": command_reset, "wfr-upload-file": command_upload_file, "wfr-upload-as-file": command_upload_as_file, "wfr-upload-files": command_upload_files, "wfr-list-files": command_list_files, "wfr-remove-files": command_remove_files, "wfr-download-file": command_download_file, "wfr-download-as-text": command_download_as_text, "wfr-archive-zip": command_archive_zip, } try: if command == "long-running-execution": run_long_running(SETTINGS) else: return_results(commands[command](assign_params(**demisto.args()), SETTINGS)) except Exception as e: return_error(f"Failed to execute {command} command.\nError:\n{e!s}") if __name__ in ("__main__", "__builtin__", "builtins"): main()