1 /// Provides connection parameters for memgraph. 2 module memgraph.params; 3 4 import std..string, std.conv; 5 6 import memgraph.mgclient; 7 8 /// An object containing connection parameters for `Client.connect(Params)`. 9 struct Params { 10 /// DNS resolvable name of host to connect to. Either one of host or 11 /// address parameters must be specified (defaults to `127.0.0.1`). 12 string host = "127.0.0.1"; 13 /// Port number to connect to at the server host (defaults to 7687). 14 ushort port = 7687; 15 /// Numeric IP address of host to connect to. This should be in the 16 /// standard IPv4 address format. You can also use IPv6 if your machine 17 /// supports it. Either one of host or address parameters must be 18 /// specified. 19 string address; 20 /// Username, if authentication is required. 21 string username; 22 /// Password to be used if the server demands password authentication. 23 string password; 24 /// This option determines whether a secure connection will be negotiated 25 /// with the server. There are 2 possible values: 26 /// - `MG_SSLMODE_DISABLE` 27 /// Only try a non-SSL connection (default). 28 /// - `MG_SSLMODE_REQUIRE` 29 /// Only try an SSL connection. 30 mg_sslmode sslMode = mg_sslmode.MG_SSLMODE_DISABLE; 31 /// This parameter specifies the file name of the client SSL certificate. 32 /// It is ignored in case an SSL connection is not made. 33 string sslCert; 34 /// This parameter specifies the location of the secret key used for the 35 /// client certificate. This parameter is ignored in case an SSL connection 36 /// is not made. 37 string sslKey; 38 /// Useragent used when connecting to memgraph, defaults to 39 /// Alternate name and version of the client to send to server. Default is 40 /// "memgraph-d/major.minor.patch". 41 string userAgent; 42 /// A pointer to a function of prototype `mg_trust_callback_type`: 43 /// int trust_callback(const char *hostname, const char *ip_address, 44 /// const char *key_type, const char *fingerprint, 45 /// void *trust_data); 46 /// 47 /// After performing the SSL handshake, `mg_connect` will call this 48 /// function providing the hostname, IP address, public key type and 49 /// fingerprint and user provided data. If the function returns a non-zero 50 /// value, SSL connection will be immediately terminated. This can be used 51 /// to implement TOFU (trust on first use) mechanism. 52 /// It might happen that hostname can not be determined, in that case the 53 /// trust callback will be called with hostname="undefined". 54 mg_trust_callback_type sslTrustCallback; 55 /// Additional data that will be provided to the sslTrustCallback function. 56 void *sslTrustData; 57 58 /// Destructor, destroys the internal session parameters. 59 ~this() { 60 if (ptr_) 61 mg_session_params_destroy(ptr_); 62 } 63 64 package: 65 const (mg_session_params *) ptr() { 66 if (!ptr_) 67 ptr_ = mg_session_params_make(); 68 if (host.length) 69 mg_session_params_set_host(ptr_, toStringz(host)); 70 if (address.length) 71 mg_session_params_set_address(ptr_, toStringz(address)); 72 if (port) 73 mg_session_params_set_port(ptr_, port); 74 if (username.length) 75 mg_session_params_set_username(ptr_, toStringz(username)); 76 if (password.length) 77 mg_session_params_set_password(ptr_, toStringz(password)); 78 79 if (!userAgent.length) 80 userAgent = to!string("memgraph-d/" ~ fromStringz(mg_client_version())); 81 mg_session_params_set_user_agent(ptr_, toStringz(userAgent)); 82 83 mg_session_params_set_sslmode(ptr_, sslMode); 84 if (sslCert.length) 85 mg_session_params_set_sslcert(ptr_, toStringz(sslCert)); 86 if (sslKey.length) 87 mg_session_params_set_sslkey(ptr_, toStringz(sslKey)); 88 89 if (sslTrustCallback) 90 mg_session_params_set_trust_callback(ptr_, sslTrustCallback); 91 if (sslTrustData) 92 mg_session_params_set_trust_data(ptr_, sslTrustData); 93 94 return ptr_; 95 } 96 97 private: 98 /// Pointer to private `mg_session_params` instance that 99 /// contains all parameters for this `Params` structure. 100 mg_session_params *ptr_; 101 } 102 103 unittest { 104 Params p; 105 106 assert(p.host == "127.0.0.1"); 107 assert(p.port == 7687); 108 assert(p.sslMode == mg_sslmode.MG_SSLMODE_DISABLE); 109 110 p.address = "127.0.0.1"; 111 p.username = "sini"; 112 p.password = "whatever"; 113 114 p.sslCert = "someCertFile"; 115 p.sslKey = "someKeyFile"; 116 117 ubyte[] trustData = cast(ubyte[])"trustData"; 118 p.sslTrustData = cast(void*)trustData; 119 p.sslTrustCallback = (hostname, ip_address, key_type, fingerprint, trust_data) { return 0; }; 120 121 assert(p.ptr() != null); 122 }