1 /** 2 * Copyright © DiamondMVC 2019 3 * License: MIT (https://github.com/DiamondMVC/Diamond/blob/master/LICENSE) 4 * Author: Jacob Jensen (bausshf) 5 */ 6 module diamond.core.webconfig; 7 8 import diamond.core.apptype; 9 10 static if (isWeb) 11 { 12 import vibe.data.serialization : optional; 13 14 /// Web configurations. 15 final class WebConfig 16 { 17 /// The name of the web application. 18 string name; 19 /// The routes that are mapped to static files. 20 @optional string[] staticFileRoutes; 21 /// The paths to white-list for file-access/directory-access. 22 @optional string[] whiteListPaths; 23 /// A list of hosts that the server accepts. 24 @optional string[] hostWhiteList; 25 /// The route that's mapped to the home page. 26 string homeRoute; 27 /// Boolean determining whether views can be accessed by their file name. 28 @optional bool allowFileRoute; 29 /// An array of addresses the web application is accessible by. 30 WebAddress[] addresses; 31 /// The default headers the web application uses. 32 WebHeaders defaultHeaders; 33 /// Boolean determining whether the access log should be redirected to the console. 34 @optional bool accessLogToConsole; 35 /// The time sessions are stored in memory. 36 @optional long sessionAliveTime; 37 // A special string representation that splits the root routes when checking ACL. 38 @optional string specialRouteSplitter; 39 /// Boolean determnining whether views can be cached or not. 40 @optional bool shouldCacheViews; 41 /// An array of global restricted ip addresses. 42 @optional string[] globalRestrictedIPs; 43 /// An array of restricted ip addresses. 44 @optional string[] restrictedIPs; 45 /// A collection of db connection configurations. 46 @optional WebDbConnections dbConnections; 47 /// Tn associative array of specialized routes. 48 @optional WebSpecialRoute[string] specializedRoutes; 49 /// A static web-page to display for maintenance. When specified the website will automatically be set to maintenance-mode. 50 @optional string maintenance; 51 /// An array of ips that can still access the site during maintenance. 52 @optional string[] maintenanceWhiteList; 53 /// Boolean determining whethere there's only one view to use for routing. The view must be named __view.dd 54 @optional bool viewOnly; 55 /// Configurations for mongo db. 56 @optional WebMongoDb mongoDb; 57 /// Configuration to disable privacy logging. When set to true, personal information etc. will be stored in the logging. 58 @optional bool disablePrivacyLogging; 59 /// Configuration for the ssl certificate file. 60 @optional string sslCertificateFile; 61 /// Configuration for the ssl private key file. 62 @optional string sslPrivateKeyFile; 63 /// The http header that contains the client's ip. Useful when using reverse proxies. 64 @optional string ipHeader; 65 /// Collection of webservices. 66 @optional WebService[] webservices; 67 /// An associative array of custom configurations; 68 @optional string[string] customConfig; 69 /// String of an url to redirect all connections that aren't ssl to. 70 @optional string forceSSLUrl; 71 /// An array of routes that shouldn't have logging for headers. 72 @optional string[] disableHeaderLoggingRoutes; 73 /// An associative array of mapped auth keys. 74 @optional string[string] mappedAuthKeys; 75 /// The maximum number of bytes a request can transfer. Defaults to 4,000,000 bytes. 76 @optional ulong maxRequestSize; 77 /// The maximum number of bytes a request header can be. Default is 8,192 bytes. 78 @optional ulong maxRequestHeaderSize; 79 /// Boolean determining whether authentication should run for static files or not. 80 @optional bool authenticateStaticFiles; 81 } 82 83 /// Wrapper around a webservice. 84 final class WebService 85 { 86 /// The name of the webservice. 87 string name; 88 89 /// The wsdl of the webservice. 90 string wsdl; 91 92 /// The module name of the webservice. 93 string moduleName; 94 } 95 96 /// A web address. 97 final class WebAddress 98 { 99 /// An array of ip addresses that the web address is bound to. 100 string[] ipAddresses; 101 /// The port the web address is bound to. 102 ushort port; 103 } 104 105 /// Web headers. 106 final class WebHeaders 107 { 108 /// Headers used for general purpose. 109 string[string] general; 110 /// Headers used for static files. 111 string[string] staticFiles; 112 /// Headers used for 404 responses. 113 string[string] notFound; 114 /// Headers used for error responses. 115 string[string] error; 116 } 117 118 /// Wrapper around db connection configurations. 119 final class WebDbConnections 120 { 121 @optional WebDbConnectionConfig[string] mysql; 122 @optional WebDbConnectionConfig[string] mssql; 123 @optional WebDbConnectionConfig[string] postgresql; 124 @optional WebDbConnectionConfig[string] sqlite; 125 } 126 127 /// Wrapper around a db connection configuration. 128 final class WebDbConnectionConfig 129 { 130 /// The host. 131 string host; 132 /// The port. 133 @optional ushort port; 134 /// The user. 135 string user; 136 /// The password. 137 string password; 138 /// The database. 139 @optional string database; 140 141 static if (hasMsSql) 142 { 143 string namedInstance; 144 } 145 } 146 147 /// Wrapper around a special route. 148 final class WebSpecialRoute 149 { 150 /// The type of the route. 151 string type; 152 /// The value of the route. 153 string value; 154 } 155 156 /// Wrapper around mongo db configurations. 157 final class WebMongoDb 158 { 159 /// The host of the mongo db. 160 string host; 161 /// The port of the mongo db. This should only be used if the host is an IP. 162 @optional ushort port; 163 } 164 165 /// The web configuration. 166 private static __gshared WebConfig _webConfig; 167 168 /// Gets the web configuration. 169 @property WebConfig webConfig() { return _webConfig; } 170 171 /// Loads the web configuration. 172 void loadWebConfig() 173 { 174 import vibe.d : deserializeJson; 175 import std.file : readText; 176 177 _webConfig = deserializeJson!WebConfig(readText("config/web.json")); 178 179 if (_webConfig.homeRoute[0] == '/') 180 { 181 _webConfig.homeRoute = _webConfig.homeRoute[1 .. $]; 182 } 183 184 if (_webConfig.homeRoute[$-1] == '/') 185 { 186 _webConfig.homeRoute = _webConfig.homeRoute[0 .. $-1]; 187 } 188 189 if (_webConfig.sessionAliveTime <= 0) 190 { 191 _webConfig.sessionAliveTime = 30; 192 } 193 194 if (!_webConfig.specialRouteSplitter) 195 { 196 _webConfig.specialRouteSplitter = "-"; 197 } 198 } 199 }