Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 84 additions & 0 deletions TinkerSrc/CreateOauthClient.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
using System;
using System.Collections.Generic;
using System.IO;
using Bunq.Sdk.Context;
using Bunq.Sdk.Exception;
using Bunq.Sdk.Json;
using Bunq.Sdk.Model.Core;
using Bunq.Sdk.Model.Generated.Endpoint;
using Mono.Options;
using Tinker.Utils;

namespace TinkerSrc
{
public class CreateOauthClient : ITinker
{
/// <summary>
/// API constants.
/// </summary>
protected const string OPTION_CONTEXT = "context=";
protected const string OPTION_REDIRECT_URI = "redirect=";

/**
* File constants.
*/
protected const string FILE_OAUTH_CONFIGURATION = "oauth.conf";

/**
* Error constants.
*/
protected const string ERROR_MISSING_MANDATORY_OPTION = "Missing mandatory option.";

public void Run(string[] args)
{
Dictionary<string, string> allOption = AssertMandatoryOptions(args);

BunqContext.LoadApiContext(
ApiContext.Restore(allOption[OPTION_CONTEXT])
);

OauthClient oauthClient;
if (File.Exists(FILE_OAUTH_CONFIGURATION))
{
oauthClient = OauthClient.CreateFromJsonString(File.ReadAllText(FILE_OAUTH_CONFIGURATION));
}
else
{
int oauthClientId = OauthClient.Create().Value;

OauthCallbackUrl.Create(oauthClientId, allOption[OPTION_REDIRECT_URI]);
oauthClient = OauthClient.Get(oauthClientId).Value;

String serializedClient = BunqJsonConvert.SerializeObject(oauthClient);
File.WriteAllText(FILE_OAUTH_CONFIGURATION, serializedClient);
}

OauthAuthorizationUri authorizationUri = OauthAuthorizationUri.Create(
OauthResponseType.CODE,
allOption[OPTION_REDIRECT_URI],
oauthClient
);

Console.WriteLine(" | Created oauth client. Stored in {0}.", FILE_OAUTH_CONFIGURATION);
Console.WriteLine(" | Point your user to {0} to obtain an Authorization code.", authorizationUri.AuthorizationUri);
}

private Dictionary<string, string> AssertMandatoryOptions(string[] allArgument)
{
Dictionary<string, string> allOption = new Dictionary<string, string>();

new OptionSet
{
{OPTION_CONTEXT, value => allOption.Add(OPTION_CONTEXT, value)},
{OPTION_REDIRECT_URI, value => allOption.Add(OPTION_REDIRECT_URI, value)}
}.Parse(allArgument);

if (allOption[OPTION_CONTEXT] != null &&
allOption[OPTION_REDIRECT_URI] != null) {
return allOption;
}

throw new BunqException(ERROR_MISSING_MANDATORY_OPTION);
}
}
}
75 changes: 75 additions & 0 deletions TinkerSrc/CreatePsd2Configuration.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
using System;
using System.Collections.Generic;
using System.Security.Cryptography.X509Certificates;
using Bunq.Sdk.Context;
using Bunq.Sdk.Exception;
using Bunq.Sdk.Model.Generated.Object;
using Bunq.Sdk.Security;
using Mono.Options;
using Tinker.Utils;
using TinkerSrc.Lib;

namespace TinkerSrc
{
public class CreatePsd2Configuration : ITinker
{
/// <summary>
/// API constants.
/// </summary>
protected const string API_DEVICE_DESCRIPTION = "##### YOUR DEVICE DESCRIPTION #####";

/// <summary>
/// Option constants.
/// </summary>
protected const string OPTION_CREDENTIALS = "credentials=";
protected const string OPTION_CERTIFICATE_CHAIN = "chain=";
protected const string OPTION_PASSPHRASE = "pass=";

/// <summary>
/// Error constants.
/// </summary>
protected const string ERROR_MISSING_MANDATORY_OPTION = "Missing mandatory option.";

/// <summary>
/// File constants.
/// </summary>
protected const string FILE_CONTEXT = "bunq-psd2.conf";

public void Run(string[] args)
{
Dictionary<string, string> allOption = AssertMandatoryOptions(args);

ApiContext apiContext = ApiContext.CreateForPsd2(
ShareLib.DetermineEnvironmentType(args),
SecurityUtils.GetCertificateFromFile(allOption[OPTION_CREDENTIALS], allOption[OPTION_PASSPHRASE]),
new X509CertificateCollection () {
SecurityUtils.GetCertificateFromFile(allOption[OPTION_CERTIFICATE_CHAIN])
},
API_DEVICE_DESCRIPTION,
new List<string>()
);

apiContext.Save(FILE_CONTEXT);
}

private Dictionary<string, string> AssertMandatoryOptions(string[] allArgument)
{
Dictionary<string, string> allOption = new Dictionary<string, string>();

new OptionSet
{
{OPTION_CREDENTIALS, value => allOption.Add(OPTION_CREDENTIALS, value)},
{OPTION_CERTIFICATE_CHAIN, value => allOption.Add(OPTION_CERTIFICATE_CHAIN, value)},
{OPTION_PASSPHRASE, value => allOption.Add(OPTION_PASSPHRASE, value)}
}.Parse(allArgument);

if (allOption[OPTION_CERTIFICATE_CHAIN] != null &&
allOption[OPTION_CREDENTIALS] != null &&
allOption[OPTION_PASSPHRASE] != null) {
return allOption;
}

throw new BunqException(ERROR_MISSING_MANDATORY_OPTION);
}
}
}
97 changes: 97 additions & 0 deletions TinkerSrc/TestOauth.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using Bunq.Sdk.Context;
using Bunq.Sdk.Exception;
using Bunq.Sdk.Model.Core;
using Bunq.Sdk.Model.Generated.Endpoint;
using Mono.Options;
using Tinker.Utils;
using TinkerSrc.Lib;

namespace TinkerSrc
{
public class TestOauth : ITinker
{
/// <summary>
/// Option constants.
/// </summary>
protected const string OPTION_AUTH_CODE = "code=";
protected const string OPTION_CLIENT_CONFIGURATION = "configuration=";
protected const string OPTION_REDIRECT = "redirect=";
protected const string OPTION_CONTEXT = "context=";

/// <summary>
/// API constants.
/// </summary>
protected const string API_DEVICE_DESCRIPTION = "##### YOUR DEVICE DESCRIPTION #####";

/// <summary>
/// Error constants.
/// </summary>
protected const string ERROR_MISSING_MANDATORY_OPTION = "Missing mandatory option.";

public void Run(string[] args)
{
Dictionary<string, string> allOption = AssertMandatoryOptions(args);

ApiContext apiContext = ApiContext.Restore(allOption[OPTION_CONTEXT]);
BunqContext.LoadApiContext(apiContext);

OauthAccessToken accessToken = OauthAccessToken.Create(
OauthGrantType.AUTHORIZATION_CODE,
allOption[OPTION_AUTH_CODE],
allOption[OPTION_REDIRECT],
CreateOauthClientFromFile(allOption[OPTION_CLIENT_CONFIGURATION])
);

apiContext = CreateApiContextByOauthToken(
accessToken,
ShareLib.DetermineEnvironmentType(args)
);
BunqContext.LoadApiContext(apiContext);

(new UserOverview()).Run(new String[]{});
}


private Dictionary<string, string> AssertMandatoryOptions(string[] allArgument)
{
Dictionary<string, string> allOption = new Dictionary<string, string>();

new OptionSet
{
{OPTION_AUTH_CODE, value => allOption.Add(OPTION_AUTH_CODE, value)},
{OPTION_REDIRECT, value => allOption.Add(OPTION_REDIRECT, value)},
{OPTION_CONTEXT, value => allOption.Add(OPTION_CONTEXT, value)},
{OPTION_CLIENT_CONFIGURATION, value => allOption.Add(OPTION_CLIENT_CONFIGURATION, value)}
}.Parse(allArgument);

if (allOption[OPTION_AUTH_CODE] != null &&
allOption[OPTION_REDIRECT] != null &&
allOption[OPTION_CONTEXT] != null &&
allOption[OPTION_CLIENT_CONFIGURATION] != null) {
return allOption;
}

throw new BunqException(ERROR_MISSING_MANDATORY_OPTION);
}

private OauthClient CreateOauthClientFromFile(String path)
{
return OauthClient.CreateFromJsonString(
File.ReadAllText(path)
);
}

private static ApiContext CreateApiContextByOauthToken(OauthAccessToken token, ApiEnvironmentType environmentType)
{
return ApiContext.Create(
environmentType,
token.Token,
API_DEVICE_DESCRIPTION
);
}
}
}
4 changes: 2 additions & 2 deletions TinkerSrc/TinkerSrc.csproj
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp1.1</TargetFramework>
<TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Bunq.Sdk" Version="1.1.0" />
<PackageReference Include="Bunq.Sdk" Version="1.12.0" />
<PackageReference Include="Mono.Options" Version="5.3.0.1" />
</ItemGroup>
</Project>
22 changes: 22 additions & 0 deletions go-pro
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,28 @@ USAGE="\
┌───────────────────────┬────────────────────────────────────────────────────────────┐
│ │ Run │
├───────────────────────┼────────────────────────────────────────────────────────────┤
│ 🔐 Create PSD2 Provider! │ ${ANSI_FORMAT_VERBOSE}dotnet Tinker/TinkerSrc.dll CreatePsd2Configuration${ANSI_FORMAT_CLEAR} │
│ │ │
│ │ ${ANSI_FORMAT_DIM}Required parameters:${ANSI_FORMAT_CLEAR} │
│ │ ${ANSI_FORMAT_DIM}--env [SANDBOX/PRODUCTION]${ANSI_FORMAT_CLEAR} │
│ │ ${ANSI_FORMAT_DIM}--certificate [path]${ANSI_FORMAT_CLEAR} │
│ │ ${ANSI_FORMAT_DIM}--chain [path]${ANSI_FORMAT_CLEAR} │
│ │ ${ANSI_FORMAT_DIM}--key [path]${ANSI_FORMAT_CLEAR} │
├───────────────────────┼────────────────────────────────────────────────────────────┤
│ 🔒 Create PSD2 OAuth Client │ ${ANSI_FORMAT_VERBOSE}dotnet Tinker/TinkerSrc.dll CreateOauthClient${ANSI_FORMAT_CLEAR} │
│ │ │
│ │ ${ANSI_FORMAT_DIM}Required parameters:${ANSI_FORMAT_CLEAR} │
│ │ ${ANSI_FORMAT_DIM}--context [path]${ANSI_FORMAT_CLEAR} │
│ │ ${ANSI_FORMAT_DIM}--redirect [uri]${ANSI_FORMAT_CLEAR} │
├───────────────────────┼────────────────────────────────────────────────────────────┤
│ 🔓 Test PSD2 OAuth │ ${ANSI_FORMAT_VERBOSE}dotnet Tinker/TinkerSrc.dll TestOauth${ANSI_FORMAT_CLEAR} │
│ │ │
│ │ ${ANSI_FORMAT_DIM}Required parameters:${ANSI_FORMAT_CLEAR} │
│ │ ${ANSI_FORMAT_DIM}--env [SANDBOX/PRODUCTION]${ANSI_FORMAT_CLEAR} │
│ │ ${ANSI_FORMAT_DIM}--code [authcode]${ANSI_FORMAT_CLEAR} │
│ │ ${ANSI_FORMAT_DIM}--configuration [path]${ANSI_FORMAT_CLEAR} │
│ │ ${ANSI_FORMAT_DIM}--redirect [uri]${ANSI_FORMAT_CLEAR} │
|───────────────────────┼────────────────────────────────────────────────────────────┤
│ ✅ Show Overview │ ${ANSI_FORMAT_VERBOSE}dotnet Tinker/TinkerSrc.dll UserOverview --production${ANSI_FORMAT_CLEAR} │
├───────────────────────┼────────────────────────────────────────────────────────────┤
│ 🔼 Make a payment │ ${ANSI_FORMAT_VERBOSE}dotnet Tinker/TinkerSrc.dll MakePayment --production${ANSI_FORMAT_CLEAR} │
Expand Down
22 changes: 22 additions & 0 deletions go-tinker
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,28 @@ USAGE="\
┌───────────────────────┬──────────────────────────────────────────────┐
│ │ Run │
├───────────────────────┼──────────────────────────────────────────────┤
│ 🔐 Create PSD2 Provider! │ ${ANSI_FORMAT_VERBOSE}dotnet Tinker/TinkerSrc.dll CreatePsd2Configuration${ANSI_FORMAT_CLEAR} │
│ │ │
│ │ ${ANSI_FORMAT_DIM}Required parameters:${ANSI_FORMAT_CLEAR} │
│ │ ${ANSI_FORMAT_DIM}--env [SANDBOX/PRODUCTION]${ANSI_FORMAT_CLEAR} │
│ │ ${ANSI_FORMAT_DIM}--certificate [path]${ANSI_FORMAT_CLEAR} │
│ │ ${ANSI_FORMAT_DIM}--chain [path]${ANSI_FORMAT_CLEAR} │
│ │ ${ANSI_FORMAT_DIM}--key [path]${ANSI_FORMAT_CLEAR} │
├───────────────────────┼──────────────────────────────────────────────┤
│ 🔒 Create PSD2 OAuth Client │ ${ANSI_FORMAT_VERBOSE}dotnet Tinker/TinkerSrc.dll CreateOauthClient${ANSI_FORMAT_CLEAR} │
│ │ │
│ │ ${ANSI_FORMAT_DIM}Required parameters:${ANSI_FORMAT_CLEAR} │
│ │ ${ANSI_FORMAT_DIM}--context [path]${ANSI_FORMAT_CLEAR} │
│ │ ${ANSI_FORMAT_DIM}--redirect [uri]${ANSI_FORMAT_CLEAR} │
├───────────────────────┼──────────────────────────────────────────────┤
│ 🔓 Test PSD2 OAuth │ ${ANSI_FORMAT_VERBOSE}dotnet Tinker/TinkerSrc.dll TestOauth${ANSI_FORMAT_CLEAR} │
│ │ │
│ │ ${ANSI_FORMAT_DIM}Required parameters:${ANSI_FORMAT_CLEAR} │
│ │ ${ANSI_FORMAT_DIM}--env [SANDBOX/PRODUCTION]${ANSI_FORMAT_CLEAR} │
│ │ ${ANSI_FORMAT_DIM}--code [authcode]${ANSI_FORMAT_CLEAR} │
│ │ ${ANSI_FORMAT_DIM}--configuration [path]${ANSI_FORMAT_CLEAR} │
│ │ ${ANSI_FORMAT_DIM}--redirect [uri]${ANSI_FORMAT_CLEAR} │
├───────────────────────┼──────────────────────────────────────────────┤
│ ✅ Show Overview │ ${ANSI_FORMAT_VERBOSE}dotnet Tinker/TinkerSrc.dll UserOverview${ANSI_FORMAT_CLEAR} │
├───────────────────────┼──────────────────────────────────────────────┤
│ 🔼 Make a payment │ ${ANSI_FORMAT_VERBOSE}dotnet Tinker/TinkerSrc.dll MakePayment${ANSI_FORMAT_CLEAR} │
Expand Down