1 module konnexengine.crypto.utilities;
2 
3 import std.conv : to;
4 import std.json;
5 import std.digest: toHexString;
6 import vibe.http.client : requestHTTP, HTTPMethod;
7 import vibe.data.json : Json, parseJsonString;
8 import vibe.stream.operations : readAllUTF8;
9 import vibe.core.log : logInfo, logWarn, logCritical;
10 
11 import dauth: makeHash, toPassword, randomSalt, isSameHash, parseHash, Salt;
12 import dotenv : Env;
13 
14 string hashPassword(string plaintext)
15 {
16 	char[] input = cast(char[]) plaintext;
17 	auto pass = toPassword(input);
18 	auto hash = makeHash(pass).toString();
19 	return hash;
20 }
21 
22 bool checkPassword(string hashString, string password)
23 {
24 	char[] input = cast(char[]) password;
25 	auto p = toPassword(input);
26 	return isSameHash(p, parseHash(hashString));
27 }
28 
29 string generateToken(string ns, string id, string name, string created)
30 {
31 	struct TokenRequest
32 	{
33 
34 		this(string ns, string id, string name, string created)
35 		{
36 			this.namespace = ns;
37 			this.user_id = id;
38 			this.username = name;
39 			this.created_at = created;
40 		}
41 
42 		string namespace;
43 		string user_id;
44 		string username;
45 		string created_at;
46 	}
47 
48 	string token = "";
49 	// logInfo(ns);
50 	auto request = TokenRequest(ns, id, name, created);
51 	// logInfo(request.namespace);
52 	Env.load(".env", false);
53 	// string authUrl = Env["AUTH_SERVICE_URL"];
54 	string authUrl = "http://0.0.0.0:8099/login";
55 
56 	logInfo("\nTrying URL: " ~ authUrl);
57 
58 	requestHTTP(authUrl, (scope req) {
59 
60 		req.method = HTTPMethod.POST;
61 		req.contentType = "application/json";
62 
63 		req.writeJsonBody([
64 				"namespace": JSONValue(request.namespace.to!string),
65 				"user_id": JSONValue(request.user_id.to!string),
66 				"username": JSONValue(request.username.to!string),
67 				"created_at": JSONValue(request.created_at.to!string)
68 			]);
69 
70 	}, (scope res) {
71 
72 		token = res.bodyReader.readAllUTF8();
73 		// logWarn("\nAuthService --- Response: %s\n", parseJsonString(token).toPrettyString());
74 
75 	});
76 	return token;
77 }
78 
79 Json decodeToken(T)(T t)
80 {
81 	import fastjwt.jwt : decodeJWTToken, JWTAlgorithm;
82 	import stringbuffer : StringBuffer;
83 
84 	string secret = "SuperStrongPassword";
85 	JWTAlgorithm algo = JWTAlgorithm.HS512;
86 	StringBuffer header;
87 	StringBuffer payload;
88 
89 	const ulong rslt = decodeJWTToken(t["token"].get!string, secret, algo, header, payload);
90 
91 	if (rslt > 0)
92 	{
93 		return Json(["message": Json("Your token was not OK")]);
94 	}
95 
96 	return parseJsonString(payload.getData());
97 }