diff --git a/app/Http/Controllers/Import/BankController.php b/app/Http/Controllers/Import/BankController.php
index d78620c9e3..17af47128c 100644
--- a/app/Http/Controllers/Import/BankController.php
+++ b/app/Http/Controllers/Import/BankController.php
@@ -14,17 +14,54 @@ namespace FireflyIII\Http\Controllers\Import;
use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Support\Import\Prerequisites\PrerequisitesInterface;
+use Illuminate\Http\Request;
+use Log;
+use Session;
class BankController extends Controller
{
- public function postPrerequisites()
+ public function form()
{
}
+ /**
+ * @param Request $request
+ * @param string $bank
+ *
+ * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+ */
+ public function postPrerequisites(Request $request, string $bank)
+ {
+ Log::debug(sprintf('Now in postPrerequisites for %s', $bank));
+ $class = config(sprintf('firefly.import_pre.%s', $bank));
+ /** @var PrerequisitesInterface $object */
+ $object = app($class);
+ $object->setUser(auth()->user());
+ if (!$object->hasPrerequisites()) {
+ //Log::debug(sprintf('No more prerequisites for %s, move to form.', $bank));
+ //return redirect(route('import.bank.form', [$bank]));
+ }
+ Log::debug('Going to store entered preprerequisites.');
+ // store post data
+ $result = $object->storePrerequisites($request);
+ echo 'done with prereq';
+ exit;
+
+ if ($result->count() > 0) {
+ Session::flash('error', $result->first());
+
+ return redirect(route('import.bank.prerequisites', [$bank]));
+ }
+
+ return redirect(route('import.bank.form', [$bank]));
+ }
+
/**
* @param string $bank
+ *
+ * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View
*/
public function prerequisites(string $bank)
{
@@ -33,17 +70,16 @@ class BankController extends Controller
$object = app($class);
$object->setUser(auth()->user());
- if ($object->hasPrerequisites()) {
+ //if ($object->hasPrerequisites()) {
$view = $object->getView();
$parameters = $object->getViewParameters();
return view($view, $parameters);
- }
+ //}
if (!$object->hasPrerequisites()) {
- echo 'redirect to import form.';
+ return redirect(route('import.bank.form', [$bank]));
}
-
}
}
diff --git a/app/Models/Preference.php b/app/Models/Preference.php
index 7b7922b4e0..4bacffea77 100644
--- a/app/Models/Preference.php
+++ b/app/Models/Preference.php
@@ -14,6 +14,7 @@ declare(strict_types=1);
namespace FireflyIII\Models;
use Crypt;
+use Exception;
use FireflyIII\Exceptions\FireflyException;
use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Database\Eloquent\Model;
@@ -56,7 +57,15 @@ class Preference extends Model
sprintf('Could not decrypt preference #%d. If this error persists, please run "php artisan cache:clear" on the command line.', $this->id)
);
}
-
+ $unserialized = false;
+ try {
+ $unserialized = unserialize($data);
+ } catch (Exception $e) {
+ // don't care, assume is false.
+ }
+ if (!($unserialized === false)) {
+ return $unserialized;
+ }
return json_decode($data, true);
}
@@ -66,7 +75,7 @@ class Preference extends Model
*/
public function setDataAttribute($value)
{
- $this->attributes['data'] = Crypt::encrypt(json_encode($value));
+ $this->attributes['data'] = Crypt::encrypt(serialize($value));
}
/**
diff --git a/app/Services/Bunq/Object/DeviceServer.php b/app/Services/Bunq/Object/DeviceServer.php
new file mode 100644
index 0000000000..35d1dd712b
--- /dev/null
+++ b/app/Services/Bunq/Object/DeviceServer.php
@@ -0,0 +1,63 @@
+setId($data['id']);
+ $this->id = $id;
+ $this->created = Carbon::createFromFormat('Y-m-d H:i:s.u', $data['created']);
+ $this->updated = Carbon::createFromFormat('Y-m-d H:i:s.u', $data['updated']);
+ $this->ip = $data['ip'];
+ $this->description = $data['description'];
+ $this->status = $data['status'];
+ }
+
+ /**
+ * @return DeviceServerId
+ */
+ public function getId(): DeviceServerId
+ {
+ return $this->id;
+ }
+
+ /**
+ * @return string
+ */
+ public function getIp(): string
+ {
+ return $this->ip;
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/Services/Bunq/Request/BunqRequest.php b/app/Services/Bunq/Request/BunqRequest.php
index 4226204f0e..6712f178d6 100644
--- a/app/Services/Bunq/Request/BunqRequest.php
+++ b/app/Services/Bunq/Request/BunqRequest.php
@@ -12,10 +12,10 @@ declare(strict_types=1);
namespace FireflyIII\Services\Bunq\Request;
-use Bunq\Object\ServerPublicKey;
use Exception;
-use Monolog\Handler\StreamHandler;
-use Monolog\Logger;
+use FireflyIII\Exceptions\FireflyException;
+use FireflyIII\Services\Bunq\Object\ServerPublicKey;
+use Log;
use Requests;
use Requests_Exception;
@@ -26,12 +26,8 @@ use Requests_Exception;
*/
abstract class BunqRequest
{
- /** @var bool */
- protected $fake = false;
/** @var string */
protected $secret = '';
- /** @var Logger */
- private $logger;
/** @var string */
private $privateKey = '';
/** @var string */
@@ -44,14 +40,11 @@ abstract class BunqRequest
'x-bunq-client-request-id' => 'X-Bunq-Client-Request-Id',
];
+ /**
+ * BunqRequest constructor.
+ */
public function __construct()
{
-
-
- // create a log channel
- $this->logger = new Logger('bunq-request');
- $this->logger->pushHandler(new StreamHandler('logs/bunq.log', Logger::DEBUG));
- $this->logger->debug('Hallo dan');
}
/**
@@ -75,14 +68,6 @@ abstract class BunqRequest
$this->server = $server;
}
- /**
- * @param bool $fake
- */
- public function setFake(bool $fake)
- {
- $this->fake = $fake;
- }
-
/**
* @param string $privateKey
*/
@@ -142,12 +127,36 @@ abstract class BunqRequest
return $signature;
}
+ /**
+ * @param string $key
+ * @param array $response
+ *
+ * @return array
+ */
+ protected function getArrayFromResponse(string $key, array $response): array
+ {
+ $result = [];
+ if (isset($response['Response'])) {
+ foreach ($response['Response'] as $entry) {
+ $currentKey = key($entry);
+ $data = current($entry);
+ if ($currentKey === $key) {
+ $result[] = $data;
+ }
+ }
+ }
+
+ return $result;
+ }
+
protected function getDefaultHeaders(): array
{
+ $userAgent = sprintf('FireflyIII v%s', config('firefly.version'));
+
return [
- 'X-Bunq-Client-Request-Id' => uniqid('sander'),
+ 'X-Bunq-Client-Request-Id' => uniqid('FFIII'),
'Cache-Control' => 'no-cache',
- 'User-Agent' => 'pre-Firefly III test thing',
+ 'User-Agent' => $userAgent,
'X-Bunq-Language' => 'en_US',
'X-Bunq-Region' => 'nl_NL',
'X-Bunq-Geolocation' => '0 0 0 0 NL',
@@ -186,7 +195,7 @@ abstract class BunqRequest
protected function sendSignedBunqGet(string $uri, array $data, array $headers): array
{
if (strlen($this->server) === 0) {
- throw new Exception('No bunq server defined');
+ throw new FireflyException('No bunq server defined');
}
$body = json_encode($data);
@@ -207,7 +216,7 @@ abstract class BunqRequest
$responseHeaders = $response->headers->getAll();
$statusCode = $response->status_code;
if (!$this->verifyServerSignature($body, $responseHeaders, $statusCode)) {
- throw new Exception(sprintf('Could not verify signature for request to "%s"', $uri));
+ throw new FireflyException(sprintf('Could not verify signature for request to "%s"', $uri));
}
$array['ResponseHeaders'] = $responseHeaders;
@@ -242,7 +251,7 @@ abstract class BunqRequest
$responseHeaders = $response->headers->getAll();
$statusCode = $response->status_code;
if (!$this->verifyServerSignature($body, $responseHeaders, $statusCode)) {
- throw new Exception(sprintf('Could not verify signature for request to "%s"', $uri));
+ throw new FireflyException(sprintf('Could not verify signature for request to "%s"', $uri));
}
$array['ResponseHeaders'] = $responseHeaders;
@@ -298,14 +307,13 @@ abstract class BunqRequest
*/
private function throwResponseError(array $response)
{
- echo '
' . print_r($response, true) . '
';
$message = [];
if (isset($response['Error'])) {
foreach ($response['Error'] as $error) {
$message[] = $error['error_description'];
}
}
- throw new Exception(join(', ', $message));
+ throw new FireflyException(join(', ', $message));
}
/**
@@ -318,17 +326,16 @@ abstract class BunqRequest
*/
private function verifyServerSignature(string $body, array $headers, int $statusCode): bool
{
- $this->logger->debug('Going to verify signature for body+headers+status');
+ Log::debug('Going to verify signature for body+headers+status');
$dataToVerify = $statusCode . "\n";
$verifyHeaders = [];
// false when no public key is present
if (is_null($this->serverPublicKey)) {
- $this->logger->error('No public key present in class, so return FALSE.');
+ Log::error('No public key present in class, so return FALSE.');
return false;
}
- //$this->logger->debug('Given headers', $headers);
foreach ($headers as $header => $value) {
// skip non-bunq headers or signature
@@ -337,7 +344,7 @@ abstract class BunqRequest
}
// need to have upper case variant of header:
if (!isset($this->upperCaseHeaders[$header])) {
- throw new Exception(sprintf('No upper case variant for header "%s"', $header));
+ throw new FireflyException(sprintf('No upper case variant for header "%s"', $header));
}
$header = $this->upperCaseHeaders[$header];
$verifyHeaders[$header] = $value[0];
@@ -345,8 +352,6 @@ abstract class BunqRequest
// sort verification headers:
ksort($verifyHeaders);
- //$this->logger->debug('Final headers for verification', $verifyHeaders);
-
// add them to data to sign:
foreach ($verifyHeaders as $header => $value) {
$dataToVerify .= $header . ': ' . trim($value) . "\n";
@@ -354,20 +359,17 @@ abstract class BunqRequest
$signature = $headers['x-bunq-server-signature'][0];
$dataToVerify .= "\n" . $body;
-
- //$this->logger->debug(sprintf('Signature to verify: "%s"', $signature));
-
- $result = openssl_verify($dataToVerify, base64_decode($signature), $this->serverPublicKey->getPublicKey(), OPENSSL_ALGO_SHA256);
+ $result = openssl_verify($dataToVerify, base64_decode($signature), $this->serverPublicKey->getPublicKey(), OPENSSL_ALGO_SHA256);
if (is_int($result) && $result < 1) {
- $this->logger->error(sprintf('Result of verification is %d, return false.', $result));
+ Log::error(sprintf('Result of verification is %d, return false.', $result));
return false;
}
if (!is_int($result)) {
- $this->logger->error(sprintf('Result of verification is a boolean (%d), return false.', $result));
+ Log::error(sprintf('Result of verification is a boolean (%d), return false.', $result));
}
- $this->logger->info('Signature is a match, return true.');
+ Log::info('Signature is a match, return true.');
return true;
}
diff --git a/app/Services/Bunq/Request/DeviceServerRequest.php b/app/Services/Bunq/Request/DeviceServerRequest.php
new file mode 100644
index 0000000000..d997064656
--- /dev/null
+++ b/app/Services/Bunq/Request/DeviceServerRequest.php
@@ -0,0 +1,82 @@
+ $this->description, 'secret' => $this->secret, 'permitted_ips' => $this->permittedIps];
+ $headers = $this->getDefaultHeaders();
+ $headers['X-Bunq-Client-Authentication'] = $this->installationToken->getToken();
+ $response = $this->sendSignedBunqPost($uri, $data, $headers);
+ $deviceServerId = new DeviceServerId;
+ $deviceServerId->setId(intval($response['Response'][0]['Id']['id']));
+ $this->deviceServerId = $deviceServerId;
+
+ return;
+ }
+
+ /**
+ * @return DeviceServerId
+ */
+ public function getDeviceServerId(): DeviceServerId
+ {
+ return $this->deviceServerId;
+ }
+
+ /**
+ * @param string $description
+ */
+ public function setDescription(string $description)
+ {
+ $this->description = $description;
+ }
+
+ /**
+ * @param InstallationToken $installationToken
+ */
+ public function setInstallationToken(InstallationToken $installationToken)
+ {
+ $this->installationToken = $installationToken;
+ }
+
+ /**
+ * @param array $permittedIps
+ */
+ public function setPermittedIps(array $permittedIps)
+ {
+ $this->permittedIps = $permittedIps;
+ }
+}
\ No newline at end of file
diff --git a/app/Services/Bunq/Request/InstallationTokenRequest.php b/app/Services/Bunq/Request/InstallationTokenRequest.php
index d23e573a18..d941e09a6c 100644
--- a/app/Services/Bunq/Request/InstallationTokenRequest.php
+++ b/app/Services/Bunq/Request/InstallationTokenRequest.php
@@ -13,6 +13,9 @@ declare(strict_types=1);
namespace FireflyIII\Services\Bunq\Request;
use FireflyIII\Services\Bunq\Id\InstallationId;
+use FireflyIII\Services\Bunq\Object\ServerPublicKey;
+use FireflyIII\Services\Bunq\Token\InstallationToken;
+use Log;
/**
* Class InstallationTokenRequest
@@ -38,22 +41,17 @@ class InstallationTokenRequest extends BunqRequest
$uri = '/v1/installation';
$data = ['client_public_key' => $this->publicKey,];
$headers = $this->getDefaultHeaders();
- $response = [];
- if ($this->fake) {
- $response = json_decode(
- '{"Response":[{"Id":{"id":875936}},{"Token":{"id":13172597,"created":"2017-08-05 11:46:07.061740","updated":"2017-08-05 11:46:07.061740","token":"35278fcc8b0615261fe23285e6d2e6ccd05ac4c93454981bd5e985ec453e5b5d"}},{"ServerPublicKey":{"server_public_key":"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAon5y6OZGvTN8kIqPBdro\ndG8TWVw6sl34hAWI47NK6Pi7gmnTtd\/k9gfwq56iI4Er8uMM5e4QmjD++XrBIqcw\nHohDVK03li3xsyJPZ4EBSUOkv4VKXKL\/quqlSgDmPnxtT39BowUZl1um5QbTm0hW\npGI\/0bK7jQk7mbEan9yDOpXnczKgfNlo4o+zbFquPdUfA5LE8R8X057dB6ab7eqA\n9Aybo+I6xyrsOOztufg3Yfe5RA6a0Sikqe\/L8HCP+9TJByUI2pwydPou3KONfYhK\n1NQJZ+RCZ6V+jmcuzKe2vq0jhBZd26wNscl48Sm7etJeuBOpHE+MgO24JiTEYlLS\nVQIDAQAB\n-----END PUBLIC KEY-----\n"}}]}',
- true
- );
- }
- if (!$this->fake) {
- $response = $this->sendUnsignedBunqPost($uri, $data, $headers);
- }
- //echo '
' . json_encode($response) . '
';
+ $response = $this->sendUnsignedBunqPost($uri, $data, $headers);
+ Log::debug('Installation request response', $response);
$this->installationId = $this->extractInstallationId($response);
$this->serverPublicKey = $this->extractServerPublicKey($response);
$this->installationToken = $this->extractInstallationToken($response);
+ Log::debug(sprintf('Installation ID: %s', serialize($this->installationId)));
+ Log::debug(sprintf('Installation token: %s', serialize($this->installationToken)));
+ Log::debug(sprintf('server public key: %s', serialize($this->serverPublicKey)));
+
return;
}
diff --git a/app/Services/Bunq/Request/ListDeviceServerRequest.php b/app/Services/Bunq/Request/ListDeviceServerRequest.php
new file mode 100644
index 0000000000..ee9548b74a
--- /dev/null
+++ b/app/Services/Bunq/Request/ListDeviceServerRequest.php
@@ -0,0 +1,74 @@
+devices = new Collection;
+ }
+
+ /**
+ * @return Collection
+ */
+ public function getDevices(): Collection
+ {
+ return $this->devices;
+ }
+
+
+ /**
+ *
+ */
+ public function call(): void
+ {
+ $uri = '/v1/device-server';
+ $data = [];
+ $headers = $this->getDefaultHeaders();
+ $headers['X-Bunq-Client-Authentication'] = $this->installationToken->getToken();
+ $response = $this->sendSignedBunqGet($uri, $data, $headers);
+
+ // create device server objects:
+ $raw = $this->getArrayFromResponse('DeviceServer', $response);
+ /** @var array $entry */
+ foreach ($raw as $entry) {
+ $this->devices->push(new DeviceServer($entry));
+ }
+
+ return;
+ }
+
+ /**
+ * @param InstallationToken $installationToken
+ */
+ public function setInstallationToken(InstallationToken $installationToken)
+ {
+ $this->installationToken = $installationToken;
+ }
+}
\ No newline at end of file
diff --git a/app/Support/Import/Prerequisites/BunqPrerequisites.php b/app/Support/Import/Prerequisites/BunqPrerequisites.php
index f0cd1ed377..48e46c7717 100644
--- a/app/Support/Import/Prerequisites/BunqPrerequisites.php
+++ b/app/Support/Import/Prerequisites/BunqPrerequisites.php
@@ -11,8 +11,21 @@ declare(strict_types=1);
namespace FireflyIII\Support\Import\Prerequisites;
+use FireflyIII\Exceptions\FireflyException;
+use FireflyIII\Services\Bunq\Id\DeviceServerId;
+use FireflyIII\Services\Bunq\Object\DeviceServer;
+use FireflyIII\Services\Bunq\Object\ServerPublicKey;
+use FireflyIII\Services\Bunq\Request\DeviceServerRequest;
+use FireflyIII\Services\Bunq\Request\InstallationTokenRequest;
+use FireflyIII\Services\Bunq\Request\ListDeviceServerRequest;
+use FireflyIII\Services\Bunq\Token\InstallationToken;
use FireflyIII\User;
+use Illuminate\Http\Request;
+use Illuminate\Support\MessageBag;
+use Log;
use Preferences;
+use Requests;
+use Requests_Exception;
/**
* Class BunqPrerequisites
@@ -68,4 +81,232 @@ class BunqPrerequisites implements PrerequisitesInterface
return;
}
+
+ /**
+ * @param Request $request
+ *
+ * @return MessageBag
+ */
+ public function storePrerequisites(Request $request): MessageBag
+ {
+ $apiKey = $request->get('api_key');
+ Log::debug('Storing bunq API key');
+ Preferences::setForUser($this->user, 'bunq_api_key', $apiKey);
+ // register Firefly III as a new device.
+ $serverId = $this->registerDevice();
+
+
+ return new MessageBag;
+ }
+
+ /**
+ *
+ */
+ private function createKeyPair(): void
+ {
+ Log::debug('Generate new key pair for user.');
+ $keyConfig = [
+ "digest_alg" => "sha512",
+ "private_key_bits" => 2048,
+ "private_key_type" => OPENSSL_KEYTYPE_RSA,
+ ];
+ // Create the private and public key
+ $res = openssl_pkey_new($keyConfig);
+
+ // Extract the private key from $res to $privKey
+ $privKey = '';
+ openssl_pkey_export($res, $privKey);
+
+ // Extract the public key from $res to $pubKey
+ $pubKey = openssl_pkey_get_details($res);
+
+ Preferences::setForUser($this->user, 'bunq_private_key', $privKey);
+ Preferences::setForUser($this->user, 'bunq_public_key', $pubKey['key']);
+ Log::debug('Created key pair');
+
+ return;
+
+ }
+
+ /**
+ * Get a list of servers and return the one that is this FF instance, if one can be found.
+ *
+ * @return DeviceServerId
+ * @throws FireflyException
+ */
+ private function getExistingDevice(): DeviceServerId
+ {
+ $installationToken = $this->getInstallationToken();
+ $serverPublicKey = $this->getServerPublicKey();
+ $request = new ListDeviceServerRequest;
+ $remoteIp = $this->getRemoteIp();
+ $request->setInstallationToken($installationToken);
+ $request->setServerPublicKey($serverPublicKey);
+ $request->setPrivateKey($this->getPrivateKey());
+ $request->setServer(config('firefly.bunq.server'));
+ $request->call();
+ $devices = $request->getDevices();
+ /** @var DeviceServer $device */
+ foreach ($devices as $device) {
+ if ($device->getIp() === $remoteIp) {
+ return $device->getId();
+ }
+ }
+ throw new FireflyException('Cannot find existing Server Device that can be used by this instance of Firefly III.');
+ }
+
+ /**
+ * Get the installation token, either from the users preferences or from Bunq.
+ *
+ * @return InstallationToken
+ */
+ private function getInstallationToken(): InstallationToken
+ {
+ Log::debug('Get installation token.');
+ $token = Preferences::getForUser($this->user, 'bunq_installation_token', null);
+ if (!is_null($token)) {
+ return $token->data;
+ }
+ Log::debug('Have no token, request one.');
+
+ // verify bunq api code:
+ $publicKey = $this->getPublicKey();
+ $request = new InstallationTokenRequest;
+ $request->setServer(strval(config('firefly.bunq.server')));
+ $request->setPublicKey($publicKey);
+ $request->call();
+ Log::debug('Sent request');
+
+ $installationToken = $request->getInstallationToken();
+ $installationId = $request->getInstallationId();
+ $serverPublicKey = $request->getServerPublicKey();
+
+ Preferences::setForUser($this->user, 'bunq_installation_token', $installationToken);
+ Preferences::setForUser($this->user, 'bunq_installation_id', $installationId);
+ Preferences::setForUser($this->user, 'bunq_server_public_key', $serverPublicKey);
+
+ exit;
+ }
+
+ /**
+ * Get the private key from the users preferences.
+ *
+ * @return string
+ */
+ private function getPrivateKey(): string
+ {
+ Log::debug('get private key');
+ $preference = Preferences::getForUser($this->user, 'bunq_private_key', null);
+ if (is_null($preference)) {
+ Log::debug('private key is null');
+ // create key pair
+ $this->createKeyPair();
+ }
+ $preference = Preferences::getForUser($this->user, 'bunq_private_key', null);
+ Log::debug('Return private key for user');
+
+ return $preference->data;
+ }
+
+ /**
+ * Get a public key from the users preferences.
+ *
+ * @return string
+ */
+ private function getPublicKey(): string
+ {
+ Log::debug('get public key');
+ $preference = Preferences::getForUser($this->user, 'bunq_public_key', null);
+ if (is_null($preference)) {
+ Log::debug('public key is null');
+ // create key pair
+ $this->createKeyPair();
+ }
+ $preference = Preferences::getForUser($this->user, 'bunq_public_key', null);
+ Log::debug('Return public key for user');
+
+ return $preference->data;
+ }
+
+ /**
+ * Let's assume this value will not change any time soon.
+ */
+ private function getRemoteIp(): string
+ {
+ $preference = Preferences::getForUser($this->user, 'external_ip', null);
+ if (is_null($preference)) {
+ try {
+ $response = Requests::get('https://api.ipify.org');
+ } catch (Requests_Exception $e) {
+ throw new FireflyException(sprintf('Could not retrieve external IP: %s', $e->getMessage()));
+ }
+ if ($response->status_code !== 200) {
+ throw new FireflyException(sprintf('Could not retrieve external IP: %d %s', $response->status_code, $response->body));
+ }
+ $ip = $response->body;
+ Preferences::setForUser($this->user, 'external_ip', $ip);
+
+ return $ip;
+ }
+
+ return $preference->data;
+ }
+
+ /**
+ * @return ServerPublicKey
+ */
+ private function getServerPublicKey(): ServerPublicKey
+ {
+ return Preferences::getForUser($this->user, 'bunq_server_public_key', null)->data;
+ }
+
+ /**
+ * To install Firefly III as a new device:
+ * - Send an installation token request.
+ * - Use this token to send a device server request
+ * - Store the installation token
+ * - Use the installation token each time we need a session.
+ */
+ private function registerDevice(): DeviceServerId
+ {
+ Log::debug('Now in registerDevice');
+ $deviceServerId = Preferences::getForUser($this->user, 'bunq_device_server_id', null);
+ $serverIp = $this->getRemoteIp();
+ if (!is_null($deviceServerId)) {
+ Log::debug('Have device server ID.');
+
+ return $deviceServerId->data;
+ }
+ Log::debug('Device server id is null, do register.');
+ $installationToken = $this->getInstallationToken();
+ $serverPublicKey = $this->getServerPublicKey();
+ $apiKey = Preferences::getForUser($this->user, 'bunq_api_key', '');
+ $request = new DeviceServerRequest;
+ $request->setServer(strval(config('firefly.bunq.server')));
+ $request->setPrivateKey($this->getPrivateKey());
+ $request->setDescription('Firefly III v' . config('firefly.version') . ' for ' . $this->user->email);
+ $request->setSecret($apiKey->data);
+ $request->setPermittedIps([$serverIp]);
+ $request->setInstallationToken($installationToken);
+ $request->setServerPublicKey($serverPublicKey);
+ $deviceServerId = null;
+ // try to register device:
+ try {
+ $request->call();
+ $deviceServerId = $request->getDeviceServerId();
+ } catch (FireflyException $e) {
+ Log::error($e->getMessage());
+ }
+ if (is_null($deviceServerId)) {
+ // try get the current from a list:
+ $deviceServerId = $this->getExistingDevice();
+ }
+
+ Preferences::setForUser($this->user, 'bunq_device_server_id', $deviceServerId);
+ Log::debug(sprintf('Server ID: %s', serialize($deviceServerId)));
+ var_dump($deviceServerId);
+ var_dump($installationToken);
+ exit;
+ }
+
}
diff --git a/app/Support/Import/Prerequisites/PrerequisitesInterface.php b/app/Support/Import/Prerequisites/PrerequisitesInterface.php
index 803ee90e7e..393a3d82a5 100644
--- a/app/Support/Import/Prerequisites/PrerequisitesInterface.php
+++ b/app/Support/Import/Prerequisites/PrerequisitesInterface.php
@@ -13,6 +13,8 @@ namespace FireflyIII\Support\Import\Prerequisites;
use FireflyIII\User;
+use Illuminate\Http\Request;
+use Illuminate\Support\MessageBag;
interface PrerequisitesInterface
{
@@ -30,6 +32,13 @@ interface PrerequisitesInterface
*/
public function getViewParameters(): array;
+ /**
+ * @param Request $request
+ *
+ * @return MessageBag
+ */
+ public function storePrerequisites(Request $request): MessageBag;
+
/**
* Returns if this import method has any special prerequisites such as config
* variables or other things.
diff --git a/resources/views/import/bunq/prerequisites.twig b/resources/views/import/bunq/prerequisites.twig
index 88872997a9..aafe01c93d 100644
--- a/resources/views/import/bunq/prerequisites.twig
+++ b/resources/views/import/bunq/prerequisites.twig
@@ -10,13 +10,13 @@
- {{ trans('bank.prerequisites_for_import_text') }}
+ {{ trans('bank.bunq_prerequisites_text') }}
diff --git a/routes/web.php b/routes/web.php
index 0b0cba2265..13aa3714cf 100755
--- a/routes/web.php
+++ b/routes/web.php
@@ -401,6 +401,8 @@ Route::group(
// banks:
Route::get('bank/{bank}/prerequisites', ['uses' => 'Import\BankController@prerequisites', 'as' => 'bank.prerequisites']);
Route::post('bank/{bank}/prerequisites', ['uses' => 'Import\BankController@postPrerequisites', 'as' => 'bank.prerequisites.post']);
+
+ Route::get('bank/{bank}/form', ['uses' => 'Import\BankController@form', 'as' => 'bank.form']);
}
);