
* Moved the data connection for the Database out of appsettings.json and hardcoded it. This will allow for more customization and cleaner update process. * Removed unneeded code * Updated pdf viewer to 15.0.0 (pdf 2.6), which now supports east-asian fonts * Fixed up some regex parsing for volumes that have a float number. * Fixed a bug where the tooltip for Publication Status wouldn't show * Fixed some weird parsing rules where v1.1 would parse as volume 1 chapter 1 * Fixed a bug where bookmarking button was hidden for admins without bookmark role (due to migration) * Unified the star rating component in series detail to match metadata filter. * Fixed a bug in the bulk selection code when using shift selection, where the inverse of what was selected would be toggled. * Fixed some old code where if on all series page, only English as a language would return. We now return all languages of all libraries. * Updated api/metadata/languages documentation * Refactored some bookmark api names: get-bookmarks -> chapter-bookmarks, get-all-bookmarks -> all-bookmarks, get-series-bookmarks -> series-bookmarks, etc. * Refactored all cases of createSeriesFilter to filterUtiltityService. Added ability to search for a series on Bookmarks page. Fixed a bug where people filters wouldn't respect the disable flag froms ettings. * Cleaned up a bit of the circular downloader code. * Implemented Russian Parsing * Fixed an issue where some users that had a missing theme entry wouldn't be able to update their user preferences. * Refactored normalization to exclude !, thus allowing series with ! to be different from each other. * Fixed a migration exit case * Fixed broken unit test
187 lines
4.8 KiB
C#
187 lines
4.8 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text.Json;
|
|
using Kavita.Common.EnvironmentInfo;
|
|
using Microsoft.Extensions.Hosting;
|
|
|
|
namespace Kavita.Common;
|
|
|
|
public static class Configuration
|
|
{
|
|
public static readonly string AppSettingsFilename = Path.Join("config", GetAppSettingFilename());
|
|
|
|
public static string Branch
|
|
{
|
|
get => GetBranch(GetAppSettingFilename());
|
|
set => SetBranch(GetAppSettingFilename(), value);
|
|
}
|
|
|
|
public static int Port
|
|
{
|
|
get => GetPort(GetAppSettingFilename());
|
|
set => SetPort(GetAppSettingFilename(), value);
|
|
}
|
|
|
|
public static string JwtToken
|
|
{
|
|
get => GetJwtToken(GetAppSettingFilename());
|
|
set => SetJwtToken(GetAppSettingFilename(), value);
|
|
}
|
|
|
|
private static string GetAppSettingFilename()
|
|
{
|
|
if (!string.IsNullOrEmpty(AppSettingsFilename))
|
|
{
|
|
return AppSettingsFilename;
|
|
}
|
|
|
|
var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
|
|
var isDevelopment = environment == Environments.Development;
|
|
return "appsettings" + (isDevelopment ? ".Development" : string.Empty) + ".json";
|
|
}
|
|
|
|
#region JWT Token
|
|
|
|
private static string GetJwtToken(string filePath)
|
|
{
|
|
try
|
|
{
|
|
var json = File.ReadAllText(filePath);
|
|
var jsonObj = JsonSerializer.Deserialize<dynamic>(json);
|
|
const string key = "TokenKey";
|
|
|
|
if (jsonObj.TryGetProperty(key, out JsonElement tokenElement))
|
|
{
|
|
return tokenElement.GetString();
|
|
}
|
|
|
|
return string.Empty;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("Error reading app settings: " + ex.Message);
|
|
}
|
|
|
|
return string.Empty;
|
|
}
|
|
|
|
private static void SetJwtToken(string filePath, string token)
|
|
{
|
|
try
|
|
{
|
|
var currentToken = GetJwtToken(filePath);
|
|
var json = File.ReadAllText(filePath)
|
|
.Replace("\"TokenKey\": \"" + currentToken, "\"TokenKey\": \"" + token);
|
|
File.WriteAllText(filePath, json);
|
|
}
|
|
catch (Exception)
|
|
{
|
|
/* Swallow exception */
|
|
}
|
|
}
|
|
|
|
public static bool CheckIfJwtTokenSet()
|
|
{
|
|
try
|
|
{
|
|
return GetJwtToken(GetAppSettingFilename()) != "super secret unguessable key";
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("Error writing app settings: " + ex.Message);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Port
|
|
|
|
private static void SetPort(string filePath, int port)
|
|
{
|
|
if (new OsInfo(Array.Empty<IOsVersionAdapter>()).IsDocker)
|
|
{
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
var currentPort = GetPort(filePath);
|
|
var json = File.ReadAllText(filePath).Replace("\"Port\": " + currentPort, "\"Port\": " + port);
|
|
File.WriteAllText(filePath, json);
|
|
}
|
|
catch (Exception)
|
|
{
|
|
/* Swallow Exception */
|
|
}
|
|
}
|
|
|
|
private static int GetPort(string filePath)
|
|
{
|
|
const int defaultPort = 5000;
|
|
if (new OsInfo(Array.Empty<IOsVersionAdapter>()).IsDocker)
|
|
{
|
|
return defaultPort;
|
|
}
|
|
|
|
try
|
|
{
|
|
var json = File.ReadAllText(filePath);
|
|
var jsonObj = JsonSerializer.Deserialize<dynamic>(json);
|
|
const string key = "Port";
|
|
|
|
if (jsonObj.TryGetProperty(key, out JsonElement tokenElement))
|
|
{
|
|
return tokenElement.GetInt32();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("Error writing app settings: " + ex.Message);
|
|
}
|
|
|
|
return defaultPort;
|
|
}
|
|
|
|
#endregion
|
|
|
|
private static string GetBranch(string filePath)
|
|
{
|
|
const string defaultBranch = "main";
|
|
|
|
try
|
|
{
|
|
var json = File.ReadAllText(filePath);
|
|
var jsonObj = JsonSerializer.Deserialize<dynamic>(json);
|
|
const string key = "Branch";
|
|
|
|
if (jsonObj.TryGetProperty(key, out JsonElement tokenElement))
|
|
{
|
|
return tokenElement.GetString();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("Error reading app settings: " + ex.Message);
|
|
}
|
|
|
|
return defaultBranch;
|
|
}
|
|
|
|
private static void SetBranch(string filePath, string updatedBranch)
|
|
{
|
|
try
|
|
{
|
|
var currentBranch = GetBranch(filePath);
|
|
var json = File.ReadAllText(filePath)
|
|
.Replace("\"Branch\": " + currentBranch, "\"Branch\": " + updatedBranch);
|
|
File.WriteAllText(filePath, json);
|
|
}
|
|
catch (Exception)
|
|
{
|
|
/* Swallow Exception */
|
|
}
|
|
}
|
|
}
|