api-reference-examples/php/BaseUpload.php (134 lines of code) (raw):
<?php
/*
* Copyright (c) 2014-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
if (!defined('__ROOT__')) {
define('__ROOT__', realpath(dirname(__FILE__)));
}
require_once(__ROOT__.'/ThreatExchangeConfig.php');
ThreatExchangeConfig::init();
abstract class BaseUpload {
private $fields = null;
public abstract function getEndpoint();
protected abstract function getTypeSpecificFields();
protected abstract function getPostDataFromCSV($data_row);
public function getFields() {
if (!$this->fields) {
$this->fields = array(
'confidence',
'description',
'privacy_type',
'privacy_members',
'severity',
'share_level',
'status',
);
$this->fields = array_merge(
$this->fields,
$this->getTypeSpecificFields()
);
}
return $this->fields;
}
public static function getUploader($name) {
switch ($name) {
case 'indicators':
return new IndicatorUpload();
case 'malware':
case 'families':
throw new Exception(
'Malware and Malware Family uploads are not supported yet.'
);
default:
throw new Exception(
'Search type (-t) must be one of: families, indicators or malware'
);
}
}
public function getUsage() {
return "\t-f file containing data to upload (CSV format)\n".
"\t-d default description, if none provided\n".
"\t-g tag to prepend to all descriptions\n".
"\t-m default members for privacy, if none provided\n".
"\t-p default privacy, if none provided\n";
}
public function hasValidOptions($options) {
return !isset($options['h']) && isset($options['f']);
}
public function parseDataFile($file_name, $options) {
if (!file_exists($file_name)) {
throw new Exception(
"ERROR: Unable to find/read file '$file_name'\n"
);
}
$fh = fopen($file_name, "r");
$header = null;
$entries = array();
$def_privacy_data = $this->getPrivacyDataFromOptions($options);
$def_description = (isset($options['d']))
? $options['d']
: 'No description provided';
$def_tag = (isset($options['g'])) ? $options['g'] : '';
while (($row = fgetcsv($fh)) !== FALSE) {
if (!count($row) || (count($row) === 1 && !trim($row[0]))) {
continue; // skip empty rows / queries
}
if (strpos($row[0], '#') === 0) {
continue; // skip lines with comments
}
if (!$header) {
$header = $row;
continue;
}
$post_data = $this->getPostDataFromCSV(array_combine($header, $row));
// fold in the defaults provided
if (!isset($post_data['description'])) {
$post_data['description'] = $def_description;
}
if ($def_tag) {
$post_data['description'] = '['.$def_tag.'] '.$post_data['description'];
}
if (!isset($post_data['privacy_type']) && count($def_privacy_data) > 0) {
$post_data = array_merge($post_data, $def_privacy_data);
}
$entries[] = $post_data;
}
return $entries;
}
private function getPrivacyDataFromOptions($options) {
$privacy_data = array();
if (isset($options['p'])) {
switch(strtoupper(trim($options['p']))) {
case 'HAS_WHITELIST':
case 'WHITELIST':
$privacy_data['privacy_type'] = 'HAS_WHITELIST';
break;
default:
throw new Exception(
'You must set a privacy type!'
);
break;
}
}
if (isset($options['m'])) {
$privacy_data['privacy_members'] = $options['m'];
}
return $privacy_data;
}
public function buildAPIUploadRequest() {
$uri = ThreatExchangeConfig::FACEBOOK_SERVER.$this->getEndpoint().'/?';
// build the param array
$params = array (
'access_token' => ThreatExchangeConfig::getAccessToken(),
);
$param_str = http_build_query($params);
$uri .= $param_str;
return $uri;
}
public function getResultsAsCSV($results) {
$csv = "# ThreatExchange Results - uploaded at ".strftime('%F %T (%z)').
"\nid,error\n";
foreach ($results as $result) {
$csv .= isset($result['id']) ? $result['id'] : 'NO_ID';
$csv .= ',';
$csv .= isset($result['error']) ? $result['error'] : 'OK';
$csv .= "\n";
}
return $csv;
}
}