@@ -135,9 +135,9 @@ void SettingsData::initialize(const Path& profileDir)
135135{
136136 assert (!profileDir.empty ());
137137
138- auto configDir = profileDir / MSRV_PATH_LITERAL (MSRV_PROJECT_ID);
138+ baseDir = profileDir / MSRV_PATH_LITERAL (MSRV_PROJECT_ID);
139139
140- loadFromFile (configDir / MSRV_PATH_LITERAL (MSRV_CONFIG_FILE));
140+ loadFromFile (baseDir / MSRV_PATH_LITERAL (MSRV_CONFIG_FILE));
141141
142142 auto envConfigFile = getEnvAsPath (MSRV_CONFIG_FILE_ENV);
143143 if (!envConfigFile.empty ())
@@ -148,38 +148,73 @@ void SettingsData::initialize(const Path& profileDir)
148148 logError (" ignoring non-absolute config file path: %s" , envConfigFile.c_str ());
149149 }
150150
151+ webRoot = resolvePath (pathFromUtf8 (webRootOrig)).lexically_normal ();
152+
151153 if (webRoot.empty ())
152154 {
153- webRoot = pathToUtf8 ( getDefaultWebRoot () );
155+ webRoot = getDefaultWebRoot ();
154156 }
155157
156- clientConfigDir = pathFromUtf8 (clientConfigDirStr). lexically_normal (). make_preferred ();
158+ clientConfigDir = resolvePath ( pathFromUtf8 (clientConfigDirOrig)). lexically_normal ();
157159
158- if (! clientConfigDir.empty () && !clientConfigDir. is_absolute ())
160+ if (clientConfigDir.empty ())
159161 {
160- logError (" ignoring non-absolute client config dir: %s" , clientConfigDirStr.c_str ());
161- clientConfigDir.clear ();
162+ clientConfigDir = baseDir / MSRV_PATH_LITERAL (MSRV_CLIENT_CONFIG_DIR);
162163 }
163164
164- if (clientConfigDir.empty ())
165+ musicDirs.clear ();
166+ musicDirs.reserve (musicDirsOrig.size ());
167+
168+ auto index = 0 ;
169+ for (const auto & dir : musicDirsOrig)
165170 {
166- clientConfigDir = configDir / MSRV_PATH_LITERAL (MSRV_CLIENT_CONFIG_DIR);
171+ if (dir.empty ())
172+ {
173+ logError (" skipping empty music directory at index %d" , index);
174+ continue ;
175+ }
176+
177+ auto path = resolvePath (pathFromUtf8 (dir)).lexically_normal ();
178+ musicDirs.emplace_back (std::move (path));
179+ index++;
167180 }
168181
169- musicDirs .clear ();
170- musicDirs .reserve (musicDirsStr .size ());
182+ urlMappings .clear ();
183+ urlMappings .reserve (urlMappingsOrig .size ());
171184
172- for (const auto & dir : musicDirsStr )
185+ for (const auto & kv : urlMappingsOrig )
173186 {
174- auto path = pathFromUtf8 (dir).lexically_normal ().make_preferred ();
187+ if (kv.first .find (' :' ) != std::string::npos)
188+ {
189+ logError (" url mapping '%s' contains reserved character ':'" , kv.first .c_str ());
190+ continue ;
191+ }
175192
176- if (!path. is_absolute () )
193+ if (kv. first . empty () || kv. first == " / " )
177194 {
178- logError (" ignoring non-absolute music dir: %s " , dir. c_str () );
195+ logError (" root url mapping is not allowed, use 'webRoot' instead " );
179196 continue ;
180197 }
181198
182- musicDirs.emplace_back (std::move (path));
199+ if (kv.second .empty ())
200+ {
201+ logError (" url mapping '%s' has empty target" , kv.first .c_str ());
202+ continue ;
203+ }
204+
205+ std::string prefix (kv.first );
206+
207+ if (prefix.front () != ' /' )
208+ prefix.insert (0 , 1 , ' /' );
209+
210+ if (prefix.back () != ' /' )
211+ prefix.push_back (' /' );
212+
213+ auto path = resolvePath (pathFromUtf8 (kv.second )).lexically_normal ();
214+
215+ logInfo (" using url mapping '%s' -> '%s'" , kv.first .c_str (), kv.second .c_str ());
216+
217+ urlMappings[std::move (prefix)] = std::move (path);
183218 }
184219}
185220
@@ -206,13 +241,14 @@ void SettingsData::loadFromJson(const Json& json)
206241
207242 loadValue (json, &port, " port" );
208243 loadValue (json, &allowRemote, " allowRemote" );
209- loadValue (json, &musicDirsStr , " musicDirs" );
210- loadValue (json, &webRoot , " webRoot" );
244+ loadValue (json, &musicDirsOrig , " musicDirs" );
245+ loadValue (json, &webRootOrig , " webRoot" );
211246 loadValue (json, &authRequired, " authRequired" );
212247 loadValue (json, &authUser, " authUser" );
213248 loadValue (json, &authPassword, " authPassword" );
214249 loadValue (json, &responseHeaders, " responseHeaders" );
215- loadValue (json, &urlMappings, " urlMappings" );
250+ loadValue (json, &urlMappingsOrig, " urlMappings" );
251+ loadValue (json, &clientConfigDirOrig, " clientConfigDir" );
216252 loadPermissions (json);
217253}
218254
0 commit comments