chg: [wip] localtools
parent
7f58c34e02
commit
551ca0d83f
|
@ -12,6 +12,10 @@ class CommonConnectorTools
|
|||
];
|
||||
public $version = '???';
|
||||
|
||||
const STATE_INITIAL = 'Request issued';
|
||||
const STATE_ACCEPT = 'Request accepted';
|
||||
const STATE_CONNECTED = 'Connected';
|
||||
|
||||
public function addExposedFunction(string $functionName): void
|
||||
{
|
||||
$this->exposedFunctions[] = $functionName;
|
||||
|
@ -49,11 +53,57 @@ class CommonConnectorTools
|
|||
return true;
|
||||
}
|
||||
|
||||
public function encodeConnection(array $params): array
|
||||
public function remoteToolConnectionStatus(array $params, string $status): void
|
||||
{
|
||||
$result = $this->encodeConnection($params);
|
||||
$remoteToolConnections = \Cake\ORM\TableRegistry::getTableLocator()->get('RemoteToolConnections');
|
||||
$remoteToolConnection = $remoteToolConnections->find()->where(
|
||||
[
|
||||
'local_tool_id' => $params['connection']['id'],
|
||||
'remote_tool_id' => $params['remote_tool']['id'],
|
||||
'brood_id' => $params['remote_cerebrate']['id']
|
||||
]
|
||||
)->first();
|
||||
if (empty($remoteToolConnection)) {
|
||||
$data = $remoteToolConnections->newEmptyEntity();
|
||||
$entry = [
|
||||
'local_tool_id' => $params['connection']['id'],
|
||||
'remote_tool_id' => $params['remote_tool']['id'],
|
||||
'remote_tool_name' => $params['remote_tool']['name'],
|
||||
'brood_id' => $params['remote_cerebrate']['id'],
|
||||
'name' => '',
|
||||
'settings' => '',
|
||||
'status' => $status,
|
||||
'created' => time(),
|
||||
'modified' => time()
|
||||
];
|
||||
debug($entry);
|
||||
$data = $remoteToolConnections->patchEntity($data, $entry);
|
||||
$remoteToolConnections->save($data);
|
||||
} else {
|
||||
$data = $remoteToolConnections->patchEntity($remoteToolConnection, ['status' => $status, 'modified' => time()]);
|
||||
$remoteToolConnections->save($data);
|
||||
}
|
||||
}
|
||||
|
||||
public function initiateConnectionWrapper(array $params): array
|
||||
{
|
||||
$result = $this->initiateConnection($params);
|
||||
$this->remoteToolConnectionStatus($params, self::STATE_INITIAL);
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function acceptConnectionWrapper(array $params): array
|
||||
{
|
||||
$result = $this->acceptConnection($params);
|
||||
$this->remoteToolConnectionStatus($params, self::STATE_ACCEPT);
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function finaliseConnectionWrapper(array $params): bool
|
||||
{
|
||||
$this->remoteToolConnectionStatus($params, self::STATE_CONNECTED);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
|
@ -540,18 +540,46 @@ class MispConnector extends CommonConnectorTools
|
|||
if ($response->getStatusCode() == 200) {
|
||||
return ['success' => 1, 'message' => __('Setting saved.')];
|
||||
} else {
|
||||
return ['success' => 0, 'message' => __('Could not save the setting.')];
|
||||
return ['success' => 0, 'message' => __('Could not update.')];
|
||||
}
|
||||
}
|
||||
throw new MethodNotAllowedException(__('Invalid http request type for the given action.'));
|
||||
}
|
||||
|
||||
public function encodeConnectionAction(array $params): array
|
||||
public function initiateConnection(array $params): array
|
||||
{
|
||||
if (empty($params['org_uuid'])) {
|
||||
throw new MethodNotAllowedException(__('No org uuid passed, cannot encode connection.'));
|
||||
}
|
||||
return [];
|
||||
$params['connection_settings'] = json_decode($params['connection']['settings'], true);
|
||||
$params['misp_organisation'] = $this->getSetOrg($params);
|
||||
$params['sync_user'] = $this->createSyncUser($params);
|
||||
return [
|
||||
'email' => $params['sync_user']['email'],
|
||||
'authkey' => $params['sync_user']['authkey'],
|
||||
'url' => $params['connection_settings']['url']
|
||||
];
|
||||
}
|
||||
|
||||
public function acceptConnection(array $params): array
|
||||
{
|
||||
$params['sync_user_enabled'] = true;
|
||||
$params['connection_settings'] = json_decode($params['connection']['settings'], true);
|
||||
$params['misp_organisation'] = $this->getSetOrg($params);
|
||||
$params['sync_user'] = $this->createSyncUser($params);
|
||||
$params['sync_connection'] = $this->addServer([
|
||||
'authkey' => $params['remote_tool']['authkey'],
|
||||
'url' => $params['remote_tool']['url'],
|
||||
'name' => $params['remote_tool']['name'],
|
||||
'remote_org_id' => $params['misp_organisation']['id']
|
||||
]);
|
||||
return [
|
||||
'email' => $params['sync_user']['email'],
|
||||
'authkey' => $params['sync_user']['authkey'],
|
||||
'url' => $params['connection_settings']['url']
|
||||
];
|
||||
}
|
||||
|
||||
public function finaliseConnection(array $params): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
private function getSetOrg(array $params): array
|
||||
|
@ -586,36 +614,48 @@ class MispConnector extends CommonConnectorTools
|
|||
private function createSyncUser(array $params): array
|
||||
{
|
||||
$params['softError'] = 1;
|
||||
$username = sprintf(
|
||||
'sync_%s@%s',
|
||||
\Cake\Utility\Security::randomString(8),
|
||||
parse_url($params['remote_cerebrate']['url'])['host']
|
||||
);
|
||||
$params['body'] = [
|
||||
'email' => $username,
|
||||
$user = [
|
||||
'email' => 'sync_%s@' . parse_url($params['remote_cerebrate']['url'])['host'],
|
||||
'org_id' => $params['misp_organisation']['id'],
|
||||
'role_id' => empty($params['connection_settings']['role_id']) ? 5 : $params['connection_settings']['role_id'],
|
||||
'disabled' => 1,
|
||||
'change_pw' => 0,
|
||||
'termsaccepted' => 1
|
||||
];
|
||||
$response = $this->postData('/admin/users/add', $params);
|
||||
if (!$response->isOk()) {
|
||||
throw new MethodNotAllowedException(__('Could not update the organisation in MISP.'));
|
||||
}
|
||||
return $response->getJson()['User'];
|
||||
return $this->createUser($user, $params);
|
||||
}
|
||||
|
||||
public function connectToRemoteTool(array $params): array
|
||||
private function addServer(array $params): array
|
||||
{
|
||||
$params['connection_settings'] = json_decode($params['connection']['settings'], true);
|
||||
$params['misp_organisation'] = $this->getSetOrg($params);
|
||||
$params['sync_user'] = $this->createSyncUser($params);
|
||||
return [
|
||||
'email' => $params['sync_user']['email'],
|
||||
'authkey' => $params['sync_user']['authkey'],
|
||||
'url' => $params['connection_settings']['url']
|
||||
];
|
||||
if (
|
||||
empty($params['authkey']) ||
|
||||
empty($params['url']) ||
|
||||
empty($params['remote_org_id']) ||
|
||||
empty($params['name'])
|
||||
) {
|
||||
throw new MethodNotAllowedException(__('Required data missing from the sync connection object. The following fields are required: [name, url, authkey, org_id].'));
|
||||
}
|
||||
$response = $this->postData('/servers/add', $params);
|
||||
if (!$response->isOk()) {
|
||||
throw new MethodNotAllowedException(__('Could not add Server in MISP.'));
|
||||
}
|
||||
return $response->getJson()['Server'];
|
||||
}
|
||||
|
||||
private function createUser(array $user, array $params): array
|
||||
{
|
||||
if (strpos($user['email'], '%s') !== false) {
|
||||
$user['email'] = sprintf(
|
||||
$user['email'],
|
||||
\Cake\Utility\Security::randomString(8)
|
||||
);
|
||||
}
|
||||
$params['body'] = $user;
|
||||
$response = $this->postData('/admin/users/add', $params);
|
||||
if (!$response->isOk()) {
|
||||
throw new MethodNotAllowedException(__('Could not add the user in MISP.'));
|
||||
}
|
||||
return $response->getJson()['User'];
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
<?php
|
||||
|
||||
namespace App\Model\Entity;
|
||||
|
||||
use App\Model\Entity\AppModel;
|
||||
use Cake\ORM\Entity;
|
||||
|
||||
class RemoteToolConnection extends AppModel
|
||||
{
|
||||
|
||||
}
|
|
@ -197,6 +197,13 @@ class LocalToolsTable extends AppTable
|
|||
}
|
||||
|
||||
public function encodeConnection(array $params): array
|
||||
{
|
||||
$params = $this->buildConnectionParams($params);
|
||||
$result = $params['connector'][$params['remote_tool']['connector']]->initiateConnectionWrapper($params);
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function buildConnectionParams(array $params): array
|
||||
{
|
||||
$remote_tool = $this->getRemoteToolById($params);
|
||||
$broods = \Cake\ORM\TableRegistry::getTableLocator()->get('Broods');
|
||||
|
@ -207,13 +214,13 @@ class LocalToolsTable extends AppTable
|
|||
if (empty($connector[$remote_tool['connector']])) {
|
||||
throw new NotFoundException(__('No valid connector found for the remote tool.'));
|
||||
}
|
||||
$result = $connector[$remote_tool['connector']]->connectToRemoteTool([
|
||||
return [
|
||||
'remote_cerebrate' => $remote_cerebrate,
|
||||
'remote_org' => $remote_org,
|
||||
'remote_tool' => $remote_tool,
|
||||
'connector' => $connector,
|
||||
'connection' => $connection
|
||||
]);
|
||||
return $result;
|
||||
'connection' => $connection,
|
||||
//'message' =>
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
namespace App\Model\Table;
|
||||
|
||||
use App\Model\Table\AppTable;
|
||||
use Cake\ORM\Table;
|
||||
use Cake\Validation\Validator;
|
||||
use Cake\Http\Client;
|
||||
use Cake\ORM\TableRegistry;
|
||||
use Cake\Error\Debugger;
|
||||
|
||||
class RemoteToolConnectionsTable extends AppTable
|
||||
{
|
||||
public function initialize(array $config): void
|
||||
{
|
||||
parent::initialize($config);
|
||||
$this->BelongsTo(
|
||||
'LocalTools'
|
||||
);
|
||||
$this->setDisplayField('id');
|
||||
}
|
||||
|
||||
public function validationDefault(Validator $validator): Validator
|
||||
{
|
||||
return $validator;
|
||||
}
|
||||
}
|
|
@ -37,8 +37,8 @@ echo $this->element('genericElements/IndexTable/index_table', [
|
|||
'skip_pagination' => 1,
|
||||
'actions' => [
|
||||
[
|
||||
'url' => '/localTools/connectionRequest',
|
||||
'url_params_data_paths' => ['id'],
|
||||
'open_modal' => sprintf('/localTools/connectionRequest/%s/[onclick_params_data_path]', h($id)),
|
||||
'modal_params_data_path' => 'id',
|
||||
'title' => 'Issue a connection request',
|
||||
'icon' => 'plug'
|
||||
]
|
||||
|
|
Loading…
Reference in New Issue