diff --git a/src/Lib/default/local_tool_connectors/CommonConnectorTools.php b/src/Lib/default/local_tool_connectors/CommonConnectorTools.php index 13184c5..b4924ee 100644 --- a/src/Lib/default/local_tool_connectors/CommonConnectorTools.php +++ b/src/Lib/default/local_tool_connectors/CommonConnectorTools.php @@ -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; + } } ?> diff --git a/src/Lib/default/local_tool_connectors/MispConnector.php b/src/Lib/default/local_tool_connectors/MispConnector.php index be202e5..5a7467a 100644 --- a/src/Lib/default/local_tool_connectors/MispConnector.php +++ b/src/Lib/default/local_tool_connectors/MispConnector.php @@ -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']; } } diff --git a/src/Model/Entity/RemoteToolConnection.php b/src/Model/Entity/RemoteToolConnection.php new file mode 100644 index 0000000..164ddd8 --- /dev/null +++ b/src/Model/Entity/RemoteToolConnection.php @@ -0,0 +1,11 @@ +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' => + ]; } } diff --git a/src/Model/Table/RemoteToolConnectionsTable.php b/src/Model/Table/RemoteToolConnectionsTable.php new file mode 100644 index 0000000..7e8cf21 --- /dev/null +++ b/src/Model/Table/RemoteToolConnectionsTable.php @@ -0,0 +1,27 @@ +BelongsTo( + 'LocalTools' + ); + $this->setDisplayField('id'); + } + + public function validationDefault(Validator $validator): Validator + { + return $validator; + } +} diff --git a/templates/LocalTools/brood_tools.php b/templates/LocalTools/brood_tools.php index ae41159..9b73ae9 100644 --- a/templates/LocalTools/brood_tools.php +++ b/templates/LocalTools/brood_tools.php @@ -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' ]