Skip to content

Commit c3b8dfa

Browse files
Merge pull request #18 from bunq/release/0.12.0
Merge branch 'release/0.12.0'
2 parents 6235950 + 824b017 commit c3b8dfa

File tree

6 files changed

+302
-2
lines changed

6 files changed

+302
-2
lines changed

TinkerSrc/CreateOauthClient.cs

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using Bunq.Sdk.Context;
5+
using Bunq.Sdk.Exception;
6+
using Bunq.Sdk.Json;
7+
using Bunq.Sdk.Model.Core;
8+
using Bunq.Sdk.Model.Generated.Endpoint;
9+
using Mono.Options;
10+
using Tinker.Utils;
11+
12+
namespace TinkerSrc
13+
{
14+
public class CreateOauthClient : ITinker
15+
{
16+
/// <summary>
17+
/// API constants.
18+
/// </summary>
19+
protected const string OPTION_CONTEXT = "context=";
20+
protected const string OPTION_REDIRECT_URI = "redirect=";
21+
22+
/**
23+
* File constants.
24+
*/
25+
protected const string FILE_OAUTH_CONFIGURATION = "oauth.conf";
26+
27+
/**
28+
* Error constants.
29+
*/
30+
protected const string ERROR_MISSING_MANDATORY_OPTION = "Missing mandatory option.";
31+
32+
public void Run(string[] args)
33+
{
34+
Dictionary<string, string> allOption = AssertMandatoryOptions(args);
35+
36+
BunqContext.LoadApiContext(
37+
ApiContext.Restore(allOption[OPTION_CONTEXT])
38+
);
39+
40+
OauthClient oauthClient;
41+
if (File.Exists(FILE_OAUTH_CONFIGURATION))
42+
{
43+
oauthClient = OauthClient.CreateFromJsonString(File.ReadAllText(FILE_OAUTH_CONFIGURATION));
44+
}
45+
else
46+
{
47+
int oauthClientId = OauthClient.Create().Value;
48+
49+
OauthCallbackUrl.Create(oauthClientId, allOption[OPTION_REDIRECT_URI]);
50+
oauthClient = OauthClient.Get(oauthClientId).Value;
51+
52+
String serializedClient = BunqJsonConvert.SerializeObject(oauthClient);
53+
File.WriteAllText(FILE_OAUTH_CONFIGURATION, serializedClient);
54+
}
55+
56+
OauthAuthorizationUri authorizationUri = OauthAuthorizationUri.Create(
57+
OauthResponseType.CODE,
58+
allOption[OPTION_REDIRECT_URI],
59+
oauthClient
60+
);
61+
62+
Console.WriteLine(" | Created oauth client. Stored in {0}.", FILE_OAUTH_CONFIGURATION);
63+
Console.WriteLine(" | Point your user to {0} to obtain an Authorization code.", authorizationUri.AuthorizationUri);
64+
}
65+
66+
private Dictionary<string, string> AssertMandatoryOptions(string[] allArgument)
67+
{
68+
Dictionary<string, string> allOption = new Dictionary<string, string>();
69+
70+
new OptionSet
71+
{
72+
{OPTION_CONTEXT, value => allOption.Add(OPTION_CONTEXT, value)},
73+
{OPTION_REDIRECT_URI, value => allOption.Add(OPTION_REDIRECT_URI, value)}
74+
}.Parse(allArgument);
75+
76+
if (allOption[OPTION_CONTEXT] != null &&
77+
allOption[OPTION_REDIRECT_URI] != null) {
78+
return allOption;
79+
}
80+
81+
throw new BunqException(ERROR_MISSING_MANDATORY_OPTION);
82+
}
83+
}
84+
}

TinkerSrc/CreatePsd2Configuration.cs

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Security.Cryptography.X509Certificates;
4+
using Bunq.Sdk.Context;
5+
using Bunq.Sdk.Exception;
6+
using Bunq.Sdk.Model.Generated.Object;
7+
using Bunq.Sdk.Security;
8+
using Mono.Options;
9+
using Tinker.Utils;
10+
using TinkerSrc.Lib;
11+
12+
namespace TinkerSrc
13+
{
14+
public class CreatePsd2Configuration : ITinker
15+
{
16+
/// <summary>
17+
/// API constants.
18+
/// </summary>
19+
protected const string API_DEVICE_DESCRIPTION = "##### YOUR DEVICE DESCRIPTION #####";
20+
21+
/// <summary>
22+
/// Option constants.
23+
/// </summary>
24+
protected const string OPTION_CREDENTIALS = "credentials=";
25+
protected const string OPTION_CERTIFICATE_CHAIN = "chain=";
26+
protected const string OPTION_PASSPHRASE = "pass=";
27+
28+
/// <summary>
29+
/// Error constants.
30+
/// </summary>
31+
protected const string ERROR_MISSING_MANDATORY_OPTION = "Missing mandatory option.";
32+
33+
/// <summary>
34+
/// File constants.
35+
/// </summary>
36+
protected const string FILE_CONTEXT = "bunq-psd2.conf";
37+
38+
public void Run(string[] args)
39+
{
40+
Dictionary<string, string> allOption = AssertMandatoryOptions(args);
41+
42+
ApiContext apiContext = ApiContext.CreateForPsd2(
43+
ShareLib.DetermineEnvironmentType(args),
44+
SecurityUtils.GetCertificateFromFile(allOption[OPTION_CREDENTIALS], allOption[OPTION_PASSPHRASE]),
45+
new X509CertificateCollection () {
46+
SecurityUtils.GetCertificateFromFile(allOption[OPTION_CERTIFICATE_CHAIN])
47+
},
48+
API_DEVICE_DESCRIPTION,
49+
new List<string>()
50+
);
51+
52+
apiContext.Save(FILE_CONTEXT);
53+
}
54+
55+
private Dictionary<string, string> AssertMandatoryOptions(string[] allArgument)
56+
{
57+
Dictionary<string, string> allOption = new Dictionary<string, string>();
58+
59+
new OptionSet
60+
{
61+
{OPTION_CREDENTIALS, value => allOption.Add(OPTION_CREDENTIALS, value)},
62+
{OPTION_CERTIFICATE_CHAIN, value => allOption.Add(OPTION_CERTIFICATE_CHAIN, value)},
63+
{OPTION_PASSPHRASE, value => allOption.Add(OPTION_PASSPHRASE, value)}
64+
}.Parse(allArgument);
65+
66+
if (allOption[OPTION_CERTIFICATE_CHAIN] != null &&
67+
allOption[OPTION_CREDENTIALS] != null &&
68+
allOption[OPTION_PASSPHRASE] != null) {
69+
return allOption;
70+
}
71+
72+
throw new BunqException(ERROR_MISSING_MANDATORY_OPTION);
73+
}
74+
}
75+
}

TinkerSrc/TestOauth.cs

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using System.Threading.Tasks;
5+
using Bunq.Sdk.Context;
6+
using Bunq.Sdk.Exception;
7+
using Bunq.Sdk.Model.Core;
8+
using Bunq.Sdk.Model.Generated.Endpoint;
9+
using Mono.Options;
10+
using Tinker.Utils;
11+
using TinkerSrc.Lib;
12+
13+
namespace TinkerSrc
14+
{
15+
public class TestOauth : ITinker
16+
{
17+
/// <summary>
18+
/// Option constants.
19+
/// </summary>
20+
protected const string OPTION_AUTH_CODE = "code=";
21+
protected const string OPTION_CLIENT_CONFIGURATION = "configuration=";
22+
protected const string OPTION_REDIRECT = "redirect=";
23+
protected const string OPTION_CONTEXT = "context=";
24+
25+
/// <summary>
26+
/// API constants.
27+
/// </summary>
28+
protected const string API_DEVICE_DESCRIPTION = "##### YOUR DEVICE DESCRIPTION #####";
29+
30+
/// <summary>
31+
/// Error constants.
32+
/// </summary>
33+
protected const string ERROR_MISSING_MANDATORY_OPTION = "Missing mandatory option.";
34+
35+
public void Run(string[] args)
36+
{
37+
Dictionary<string, string> allOption = AssertMandatoryOptions(args);
38+
39+
ApiContext apiContext = ApiContext.Restore(allOption[OPTION_CONTEXT]);
40+
BunqContext.LoadApiContext(apiContext);
41+
42+
OauthAccessToken accessToken = OauthAccessToken.Create(
43+
OauthGrantType.AUTHORIZATION_CODE,
44+
allOption[OPTION_AUTH_CODE],
45+
allOption[OPTION_REDIRECT],
46+
CreateOauthClientFromFile(allOption[OPTION_CLIENT_CONFIGURATION])
47+
);
48+
49+
apiContext = CreateApiContextByOauthToken(
50+
accessToken,
51+
ShareLib.DetermineEnvironmentType(args)
52+
);
53+
BunqContext.LoadApiContext(apiContext);
54+
55+
(new UserOverview()).Run(new String[]{});
56+
}
57+
58+
59+
private Dictionary<string, string> AssertMandatoryOptions(string[] allArgument)
60+
{
61+
Dictionary<string, string> allOption = new Dictionary<string, string>();
62+
63+
new OptionSet
64+
{
65+
{OPTION_AUTH_CODE, value => allOption.Add(OPTION_AUTH_CODE, value)},
66+
{OPTION_REDIRECT, value => allOption.Add(OPTION_REDIRECT, value)},
67+
{OPTION_CONTEXT, value => allOption.Add(OPTION_CONTEXT, value)},
68+
{OPTION_CLIENT_CONFIGURATION, value => allOption.Add(OPTION_CLIENT_CONFIGURATION, value)}
69+
}.Parse(allArgument);
70+
71+
if (allOption[OPTION_AUTH_CODE] != null &&
72+
allOption[OPTION_REDIRECT] != null &&
73+
allOption[OPTION_CONTEXT] != null &&
74+
allOption[OPTION_CLIENT_CONFIGURATION] != null) {
75+
return allOption;
76+
}
77+
78+
throw new BunqException(ERROR_MISSING_MANDATORY_OPTION);
79+
}
80+
81+
private OauthClient CreateOauthClientFromFile(String path)
82+
{
83+
return OauthClient.CreateFromJsonString(
84+
File.ReadAllText(path)
85+
);
86+
}
87+
88+
private static ApiContext CreateApiContextByOauthToken(OauthAccessToken token, ApiEnvironmentType environmentType)
89+
{
90+
return ApiContext.Create(
91+
environmentType,
92+
token.Token,
93+
API_DEVICE_DESCRIPTION
94+
);
95+
}
96+
}
97+
}

TinkerSrc/TinkerSrc.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
33
<OutputType>Exe</OutputType>
4-
<TargetFramework>netcoreapp1.1</TargetFramework>
4+
<TargetFramework>netcoreapp2.2</TargetFramework>
55
</PropertyGroup>
66
<ItemGroup>
7-
<PackageReference Include="Bunq.Sdk" Version="1.1.0" />
7+
<PackageReference Include="Bunq.Sdk" Version="1.12.1" />
88
<PackageReference Include="Mono.Options" Version="5.3.0.1" />
99
</ItemGroup>
1010
</Project>

go-pro

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,28 @@ USAGE="\
2222
┌───────────────────────┬────────────────────────────────────────────────────────────┐
2323
│ │ Run │
2424
├───────────────────────┼────────────────────────────────────────────────────────────┤
25+
│ 🔐 Create PSD2 Provider! │ ${ANSI_FORMAT_VERBOSE}dotnet Tinker/TinkerSrc.dll CreatePsd2Configuration${ANSI_FORMAT_CLEAR}
26+
│ │ │
27+
│ │ ${ANSI_FORMAT_DIM}Required parameters:${ANSI_FORMAT_CLEAR}
28+
│ │ ${ANSI_FORMAT_DIM}--env [SANDBOX/PRODUCTION]${ANSI_FORMAT_CLEAR}
29+
│ │ ${ANSI_FORMAT_DIM}--certificate [path]${ANSI_FORMAT_CLEAR}
30+
│ │ ${ANSI_FORMAT_DIM}--chain [path]${ANSI_FORMAT_CLEAR}
31+
│ │ ${ANSI_FORMAT_DIM}--key [path]${ANSI_FORMAT_CLEAR}
32+
├───────────────────────┼────────────────────────────────────────────────────────────┤
33+
│ 🔒 Create PSD2 OAuth Client │ ${ANSI_FORMAT_VERBOSE}dotnet Tinker/TinkerSrc.dll CreateOauthClient${ANSI_FORMAT_CLEAR}
34+
│ │ │
35+
│ │ ${ANSI_FORMAT_DIM}Required parameters:${ANSI_FORMAT_CLEAR}
36+
│ │ ${ANSI_FORMAT_DIM}--context [path]${ANSI_FORMAT_CLEAR}
37+
│ │ ${ANSI_FORMAT_DIM}--redirect [uri]${ANSI_FORMAT_CLEAR}
38+
├───────────────────────┼────────────────────────────────────────────────────────────┤
39+
│ 🔓 Test PSD2 OAuth │ ${ANSI_FORMAT_VERBOSE}dotnet Tinker/TinkerSrc.dll TestOauth${ANSI_FORMAT_CLEAR}
40+
│ │ │
41+
│ │ ${ANSI_FORMAT_DIM}Required parameters:${ANSI_FORMAT_CLEAR}
42+
│ │ ${ANSI_FORMAT_DIM}--env [SANDBOX/PRODUCTION]${ANSI_FORMAT_CLEAR}
43+
│ │ ${ANSI_FORMAT_DIM}--code [authcode]${ANSI_FORMAT_CLEAR}
44+
│ │ ${ANSI_FORMAT_DIM}--configuration [path]${ANSI_FORMAT_CLEAR}
45+
│ │ ${ANSI_FORMAT_DIM}--redirect [uri]${ANSI_FORMAT_CLEAR}
46+
|───────────────────────┼────────────────────────────────────────────────────────────┤
2547
│ ✅ Show Overview │ ${ANSI_FORMAT_VERBOSE}dotnet Tinker/TinkerSrc.dll UserOverview --production${ANSI_FORMAT_CLEAR}
2648
├───────────────────────┼────────────────────────────────────────────────────────────┤
2749
│ 🔼 Make a payment │ ${ANSI_FORMAT_VERBOSE}dotnet Tinker/TinkerSrc.dll MakePayment --production${ANSI_FORMAT_CLEAR}

go-tinker

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,28 @@ USAGE="\
1919
┌───────────────────────┬──────────────────────────────────────────────┐
2020
│ │ Run │
2121
├───────────────────────┼──────────────────────────────────────────────┤
22+
│ 🔐 Create PSD2 Provider! │ ${ANSI_FORMAT_VERBOSE}dotnet Tinker/TinkerSrc.dll CreatePsd2Configuration${ANSI_FORMAT_CLEAR}
23+
│ │ │
24+
│ │ ${ANSI_FORMAT_DIM}Required parameters:${ANSI_FORMAT_CLEAR}
25+
│ │ ${ANSI_FORMAT_DIM}--env [SANDBOX/PRODUCTION]${ANSI_FORMAT_CLEAR}
26+
│ │ ${ANSI_FORMAT_DIM}--certificate [path]${ANSI_FORMAT_CLEAR}
27+
│ │ ${ANSI_FORMAT_DIM}--chain [path]${ANSI_FORMAT_CLEAR}
28+
│ │ ${ANSI_FORMAT_DIM}--key [path]${ANSI_FORMAT_CLEAR}
29+
├───────────────────────┼──────────────────────────────────────────────┤
30+
│ 🔒 Create PSD2 OAuth Client │ ${ANSI_FORMAT_VERBOSE}dotnet Tinker/TinkerSrc.dll CreateOauthClient${ANSI_FORMAT_CLEAR}
31+
│ │ │
32+
│ │ ${ANSI_FORMAT_DIM}Required parameters:${ANSI_FORMAT_CLEAR}
33+
│ │ ${ANSI_FORMAT_DIM}--context [path]${ANSI_FORMAT_CLEAR}
34+
│ │ ${ANSI_FORMAT_DIM}--redirect [uri]${ANSI_FORMAT_CLEAR}
35+
├───────────────────────┼──────────────────────────────────────────────┤
36+
│ 🔓 Test PSD2 OAuth │ ${ANSI_FORMAT_VERBOSE}dotnet Tinker/TinkerSrc.dll TestOauth${ANSI_FORMAT_CLEAR}
37+
│ │ │
38+
│ │ ${ANSI_FORMAT_DIM}Required parameters:${ANSI_FORMAT_CLEAR}
39+
│ │ ${ANSI_FORMAT_DIM}--env [SANDBOX/PRODUCTION]${ANSI_FORMAT_CLEAR}
40+
│ │ ${ANSI_FORMAT_DIM}--code [authcode]${ANSI_FORMAT_CLEAR}
41+
│ │ ${ANSI_FORMAT_DIM}--configuration [path]${ANSI_FORMAT_CLEAR}
42+
│ │ ${ANSI_FORMAT_DIM}--redirect [uri]${ANSI_FORMAT_CLEAR}
43+
├───────────────────────┼──────────────────────────────────────────────┤
2244
│ ✅ Show Overview │ ${ANSI_FORMAT_VERBOSE}dotnet Tinker/TinkerSrc.dll UserOverview${ANSI_FORMAT_CLEAR}
2345
├───────────────────────┼──────────────────────────────────────────────┤
2446
│ 🔼 Make a payment │ ${ANSI_FORMAT_VERBOSE}dotnet Tinker/TinkerSrc.dll MakePayment${ANSI_FORMAT_CLEAR}

0 commit comments

Comments
 (0)