.NET 8 migration
This commit is contained in:
+10
-7
@@ -1,20 +1,21 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Security.Cryptography;
|
// using System.Security.Cryptography;
|
||||||
|
|
||||||
using Microsoft.IdentityModel.Tokens;
|
using Microsoft.IdentityModel.Tokens;
|
||||||
using Org.BouncyCastle.Crypto.Parameters;
|
using Org.BouncyCastle.Crypto.Parameters;
|
||||||
using Org.BouncyCastle.OpenSsl;
|
using Org.BouncyCastle.OpenSsl;
|
||||||
|
// using BouncyCastle.Crypto;
|
||||||
|
|
||||||
|
|
||||||
namespace Icarus.Certs;
|
namespace Icarus.Certs;
|
||||||
|
|
||||||
public class SigningIssuerCertificate : IDisposable
|
public class SigningIssuerCertificate : IDisposable
|
||||||
{
|
{
|
||||||
private readonly RSACryptoServiceProvider _rsa;
|
private readonly System.Security.Cryptography.RSACryptoServiceProvider _rsa;
|
||||||
|
|
||||||
public SigningIssuerCertificate()
|
public SigningIssuerCertificate()
|
||||||
{
|
{
|
||||||
_rsa = new RSACryptoServiceProvider();
|
_rsa = new System.Security.Cryptography.RSACryptoServiceProvider();
|
||||||
}
|
}
|
||||||
|
|
||||||
public RsaSecurityKey GetIssuerSigningKey(string publicKeyPath)
|
public RsaSecurityKey GetIssuerSigningKey(string publicKeyPath)
|
||||||
@@ -26,7 +27,7 @@ public class SigningIssuerCertificate : IDisposable
|
|||||||
{
|
{
|
||||||
var pem = new PemReader(reader);
|
var pem = new PemReader(reader);
|
||||||
var o = (RsaKeyParameters)pem.ReadObject();
|
var o = (RsaKeyParameters)pem.ReadObject();
|
||||||
var parameters = new RSAParameters();
|
var parameters = new System.Security.Cryptography.RSAParameters();
|
||||||
parameters.Modulus = o.Modulus.ToByteArray();
|
parameters.Modulus = o.Modulus.ToByteArray();
|
||||||
parameters.Exponent = o.Exponent.ToByteArray();
|
parameters.Exponent = o.Exponent.ToByteArray();
|
||||||
_rsa.ImportParameters(parameters);
|
_rsa.ImportParameters(parameters);
|
||||||
@@ -45,11 +46,11 @@ public class SigningIssuerCertificate : IDisposable
|
|||||||
|
|
||||||
public class SigningAudienceCertificate : IDisposable
|
public class SigningAudienceCertificate : IDisposable
|
||||||
{
|
{
|
||||||
private readonly RSACryptoServiceProvider _rsa;
|
private readonly System.Security.Cryptography.RSACryptoServiceProvider _rsa;
|
||||||
|
|
||||||
public SigningAudienceCertificate()
|
public SigningAudienceCertificate()
|
||||||
{
|
{
|
||||||
_rsa = new RSACryptoServiceProvider();
|
_rsa = new System.Security.Cryptography.RSACryptoServiceProvider();
|
||||||
}
|
}
|
||||||
|
|
||||||
public SigningCredentials GetAudienceSigningKey(string keyPath)
|
public SigningCredentials GetAudienceSigningKey(string keyPath)
|
||||||
@@ -60,8 +61,10 @@ public class SigningAudienceCertificate : IDisposable
|
|||||||
using (var reader = System.IO.File.OpenText(file))
|
using (var reader = System.IO.File.OpenText(file))
|
||||||
{
|
{
|
||||||
var pem = new PemReader(reader);
|
var pem = new PemReader(reader);
|
||||||
|
// var pem = new Org.BouncyCastle.Utilities.IO.Pem.PemReader(reader);
|
||||||
|
// var pem = new BouncyCastle.OpenSsl.PemReader(reader);
|
||||||
var o = (RsaKeyParameters)pem.ReadObject();
|
var o = (RsaKeyParameters)pem.ReadObject();
|
||||||
var parameters = new RSAParameters();
|
var parameters = new System.Security.Cryptography.RSAParameters();
|
||||||
parameters.Modulus = o.Modulus.ToByteArray();
|
parameters.Modulus = o.Modulus.ToByteArray();
|
||||||
parameters.Exponent = o.Exponent.ToByteArray();
|
parameters.Exponent = o.Exponent.ToByteArray();
|
||||||
_rsa.ImportParameters(parameters);
|
_rsa.ImportParameters(parameters);
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
namespace Icarus.Constants;
|
||||||
|
|
||||||
|
public class FileExtensions
|
||||||
|
{
|
||||||
|
// Contains file extension with period at the beginning
|
||||||
|
public static string MP3_EXTENSION = ".mp3";
|
||||||
|
|
||||||
|
// Contains file extension with period at the beginning
|
||||||
|
public static string WAV_EXTENSION = ".wav";
|
||||||
|
|
||||||
|
// Contains file extension with period at the beginning
|
||||||
|
public static string JPG_EXTENSION = ".jpg";
|
||||||
|
}
|
||||||
@@ -243,10 +243,10 @@ public class SongManager : BaseManager
|
|||||||
var coverMgr = new CoverArtManager(_config);
|
var coverMgr = new CoverArtManager(_config);
|
||||||
var meta = new MetadataRetriever();
|
var meta = new MetadataRetriever();
|
||||||
var coverArt = coverMgr.SaveCoverArt(coverArtData, song);
|
var coverArt = coverMgr.SaveCoverArt(coverArtData, song);
|
||||||
meta.UpdateCoverArt(song, coverArt);
|
// meta.UpdateCoverArt(song, coverArt);
|
||||||
song.Duration = meta.RetrieveSongDuration(song.SongPath());
|
// song.Duration = meta.RetrieveSongDuration(song.SongPath());
|
||||||
|
|
||||||
meta.UpdateMetadata(song, song);
|
// meta.UpdateMetadata(song, song);
|
||||||
|
|
||||||
|
|
||||||
DirectoryManager dirMgr = new DirectoryManager(_config, song);
|
DirectoryManager dirMgr = new DirectoryManager(_config, song);
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ public class TokenManager : BaseManager
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
[Obsolete("Asymmetric key signing for tokens have been deprecated")]
|
[Obsolete("Asymmetric key signing for tokens have been deprecated")]
|
||||||
public LoginResult LogIn(User user)
|
public LoginResult LogIn(User user)
|
||||||
{
|
{
|
||||||
@@ -115,6 +116,7 @@ public class TokenManager : BaseManager
|
|||||||
Message = "Successfully retrieved token"
|
Message = "Successfully retrieved token"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
public LoginResult LoginSymmetric(User user)
|
public LoginResult LoginSymmetric(User user)
|
||||||
{
|
{
|
||||||
@@ -124,6 +126,7 @@ public class TokenManager : BaseManager
|
|||||||
var payload = Payload();
|
var payload = Payload();
|
||||||
payload.Add(new System.Security.Claims.Claim("user_id", user.UserID.ToString(), ClaimValueTypes.Integer));
|
payload.Add(new System.Security.Claims.Claim("user_id", user.UserID.ToString(), ClaimValueTypes.Integer));
|
||||||
|
|
||||||
|
/*
|
||||||
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["JWT:Secret"]));
|
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["JWT:Secret"]));
|
||||||
var signIn = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
|
var signIn = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
|
||||||
var token = new JwtSecurityToken(
|
var token = new JwtSecurityToken(
|
||||||
@@ -132,8 +135,28 @@ public class TokenManager : BaseManager
|
|||||||
payload,
|
payload,
|
||||||
expires: DateTime.UtcNow.AddMinutes(30),
|
expires: DateTime.UtcNow.AddMinutes(30),
|
||||||
signingCredentials: signIn);
|
signingCredentials: signIn);
|
||||||
|
*/
|
||||||
|
|
||||||
tokenResult.AccessToken = new JwtSecurityTokenHandler().WriteToken(token);
|
var tokenHandler = new JwtSecurityTokenHandler();
|
||||||
|
var key = Encoding.ASCII.GetBytes(_config["JWT:Secret"]);
|
||||||
|
var tokenDescriptor = new SecurityTokenDescriptor
|
||||||
|
{
|
||||||
|
Subject = new ClaimsIdentity(new Claim[]
|
||||||
|
{
|
||||||
|
new Claim("user_id", user.UserID.ToString(), ClaimValueTypes.Integer)
|
||||||
|
// Add more claims as needed
|
||||||
|
}),
|
||||||
|
Expires = DateTime.UtcNow.AddHours(1),
|
||||||
|
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature),
|
||||||
|
Issuer = _config["Jwt:Issuer"], // Add this line
|
||||||
|
Audience = _config["Jwt:Audience"]
|
||||||
|
};
|
||||||
|
|
||||||
|
var token = tokenHandler.CreateToken(tokenDescriptor);
|
||||||
|
|
||||||
|
|
||||||
|
// tokenResult.AccessToken = new JwtSecurityTokenHandler().WriteToken(token);
|
||||||
|
tokenResult.AccessToken = tokenHandler.WriteToken(token);
|
||||||
|
|
||||||
var expClaim = payload.FirstOrDefault(cl =>
|
var expClaim = payload.FirstOrDefault(cl =>
|
||||||
{
|
{
|
||||||
@@ -152,6 +175,7 @@ public class TokenManager : BaseManager
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
[Obsolete("Asymmetric key signing for tokens have been deprecated")]
|
[Obsolete("Asymmetric key signing for tokens have been deprecated")]
|
||||||
public bool IsTokenValid(string scope, string accessToken)
|
public bool IsTokenValid(string scope, string accessToken)
|
||||||
{
|
{
|
||||||
@@ -204,6 +228,7 @@ public class TokenManager : BaseManager
|
|||||||
|
|
||||||
return tok;
|
return tok;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
private string AllScopes()
|
private string AllScopes()
|
||||||
@@ -266,6 +291,7 @@ public class TokenManager : BaseManager
|
|||||||
return claim;
|
return claim;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
[Obsolete("Asymmetric key signing for tokens have been deprecated")]
|
[Obsolete("Asymmetric key signing for tokens have been deprecated")]
|
||||||
private string CreateToken(List<Claim> claims, string privateKey)
|
private string CreateToken(List<Claim> claims, string privateKey)
|
||||||
{
|
{
|
||||||
@@ -331,7 +357,7 @@ public class TokenManager : BaseManager
|
|||||||
{
|
{
|
||||||
using (var tr = new System.IO.StringReader(publicKey))
|
using (var tr = new System.IO.StringReader(publicKey))
|
||||||
{
|
{
|
||||||
var pemReader = new PemReader(tr);
|
var pemReader = new Org.BouncyCastle.Crypto.PemReader(tr);
|
||||||
var publicKeyParams = pemReader.ReadObject() as RsaKeyParameters;
|
var publicKeyParams = pemReader.ReadObject() as RsaKeyParameters;
|
||||||
if (publicKeyParams == null)
|
if (publicKeyParams == null)
|
||||||
{
|
{
|
||||||
@@ -340,6 +366,7 @@ public class TokenManager : BaseManager
|
|||||||
return DotNetUtilities.ToRSAParameters(publicKeyParams);
|
return DotNetUtilities.ToRSAParameters(publicKeyParams);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
private async Task<string> ReadKeyContent(string filepath)
|
private async Task<string> ReadKeyContent(string filepath)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ public class SongCompression
|
|||||||
Console.WriteLine(exMsg);
|
Console.WriteLine(exMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (songDetails.Filename.Contains(".mp3"))
|
if (songDetails.Filename.Contains(Constants.FileExtensions.WAV_EXTENSION))
|
||||||
{
|
{
|
||||||
_compressedSongFilename = StripMP3Extension(songDetails.Filename);
|
_compressedSongFilename = StripMP3Extension(songDetails.Filename);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ public class BaseController : ControllerBase
|
|||||||
return token;
|
return token;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
[ApiExplorerSettings(IgnoreApi = true)]
|
[ApiExplorerSettings(IgnoreApi = true)]
|
||||||
[Obsolete("Asymmetric key signing for tokens have been deprecated")]
|
[Obsolete("Asymmetric key signing for tokens have been deprecated")]
|
||||||
protected bool IsTokenValid(string scope)
|
protected bool IsTokenValid(string scope)
|
||||||
@@ -48,5 +49,6 @@ public class BaseController : ControllerBase
|
|||||||
|
|
||||||
return tokMgr.IsTokenValid(scope, token);
|
return tokMgr.IsTokenValid(scope, token);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,7 +53,12 @@ public class SongStreamController : BaseController
|
|||||||
|
|
||||||
var stream = new FileStream(song.SongPath(), FileMode.Open, FileAccess.Read);
|
var stream = new FileStream(song.SongPath(), FileMode.Open, FileAccess.Read);
|
||||||
stream.Position = 0;
|
stream.Position = 0;
|
||||||
var filename = $"{song.Title}.mp3";
|
var filename = song.Filename;
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(song.Filename))
|
||||||
|
{
|
||||||
|
filename = song.GenerateFilename();
|
||||||
|
}
|
||||||
|
|
||||||
_logger.LogInformation("Starting to stream song...>");
|
_logger.LogInformation("Starting to stream song...>");
|
||||||
Console.WriteLine("Starting to streamsong...");
|
Console.WriteLine("Starting to streamsong...");
|
||||||
|
|||||||
+11
-10
@@ -1,32 +1,33 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net6</TargetFramework>
|
<TargetFramework>net8</TargetFramework>
|
||||||
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
|
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
|
||||||
<Version>0.1.10</Version>
|
<Version>0.1.10</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="BCrypt.Net-Next" Version="4.0.2" />
|
<PackageReference Include="BCrypt.Net-Next" Version="4.0.2" />
|
||||||
|
<PackageReference Include="BouncyCastle.Cryptography" Version="2.4.0" />
|
||||||
<PackageReference Include="DotNetZip" Version="1.15.0" />
|
<PackageReference Include="DotNetZip" Version="1.15.0" />
|
||||||
<PackageReference Include="EntityFramework" Version="6.4.4" />
|
<PackageReference Include="EntityFramework" Version="6.4.4" />
|
||||||
<PackageReference Include="ID3" Version="0.6.0" />
|
<PackageReference Include="ID3" Version="0.6.0" />
|
||||||
<PackageReference Include="JWT" Version="9.0.3" />
|
<PackageReference Include="JWT" Version="10.1.1" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.1" />
|
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.6" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.1" />
|
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.6" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.8" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.6" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.8">
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.6">
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="MySql.EntityFrameworkCore" Version="5.0.8" />
|
<PackageReference Include="MySql.EntityFrameworkCore" Version="8.0.2" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||||
<PackageReference Include="NLog.Web.AspNetCore" Version="4.14.0" />
|
<PackageReference Include="NLog.Web.AspNetCore" Version="4.14.0" />
|
||||||
<PackageReference Include="Portable.BouncyCastle" Version="1.9.0" />
|
|
||||||
<PackageReference Include="RestSharp" Version="106.15.0" />
|
<PackageReference Include="RestSharp" Version="106.15.0" />
|
||||||
<PackageReference Include="SevenZip" Version="19.0.0" />
|
<PackageReference Include="SevenZip" Version="19.0.0" />
|
||||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
|
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
|
||||||
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.15.0" />
|
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.6.0" />
|
||||||
|
<PackageReference Include="system.text.encoding.codepages" Version="8.0.0" />
|
||||||
<PackageReference Include="taglib" Version="2.1.0" />
|
<PackageReference Include="taglib" Version="2.1.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
+1
-1
@@ -34,7 +34,7 @@ public class CoverArt
|
|||||||
var random = new Random();
|
var random = new Random();
|
||||||
var filename = new string(Enumerable.Repeat(chars, length).Select(s =>
|
var filename = new string(Enumerable.Repeat(chars, length).Select(s =>
|
||||||
s[random.Next(s.Length)]).ToArray());
|
s[random.Next(s.Length)]).ToArray());
|
||||||
var extension = ".mp3";
|
var extension = Icarus.Constants.FileExtensions.JPG_EXTENSION;
|
||||||
|
|
||||||
return (flag == 0) ? filename : $"{filename}{extension}";
|
return (flag == 0) ? filename : $"{filename}{extension}";
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -78,7 +78,7 @@ public class Song
|
|||||||
var random = new Random();
|
var random = new Random();
|
||||||
var filename = new string(Enumerable.Repeat(chars, length).Select(s =>
|
var filename = new string(Enumerable.Repeat(chars, length).Select(s =>
|
||||||
s[random.Next(s.Length)]).ToArray());
|
s[random.Next(s.Length)]).ToArray());
|
||||||
var extension = ".mp3";
|
var extension = Icarus.Constants.FileExtensions.WAV_EXTENSION;
|
||||||
|
|
||||||
return flag == 0 ? filename : $"{filename}{extension}";
|
return flag == 0 ? filename : $"{filename}{extension}";
|
||||||
}
|
}
|
||||||
@@ -86,7 +86,7 @@ public class Song
|
|||||||
{
|
{
|
||||||
const int length = 25;
|
const int length = 25;
|
||||||
const string chars = "ABCDEF0123456789";
|
const string chars = "ABCDEF0123456789";
|
||||||
var extension = ".mp3";
|
var extension = Icarus.Constants.FileExtensions.WAV_EXTENSION;
|
||||||
var random = new Random();
|
var random = new Random();
|
||||||
var filename = await Task.Run(() =>
|
var filename = await Task.Run(() =>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -41,5 +41,9 @@ public class Program
|
|||||||
.ConfigureWebHostDefaults(webBuilder =>
|
.ConfigureWebHostDefaults(webBuilder =>
|
||||||
{
|
{
|
||||||
webBuilder.UseStartup<Startup>();
|
webBuilder.UseStartup<Startup>();
|
||||||
|
webBuilder.UseKestrel(options =>
|
||||||
|
{
|
||||||
|
options.Limits.MaxRequestBodySize = 262144000;
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-1
@@ -16,7 +16,7 @@ using Microsoft.OpenApi.Models;
|
|||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using NLog;
|
using NLog;
|
||||||
using NLog.Web;
|
using NLog.Web;
|
||||||
using NLog.Web.AspNetCore;
|
// using NLog.Web.AspNetCore;
|
||||||
|
|
||||||
using Icarus.Database.Contexts;
|
using Icarus.Database.Contexts;
|
||||||
|
|
||||||
@@ -55,6 +55,8 @@ public class Startup
|
|||||||
{
|
{
|
||||||
ValidateIssuer = true,
|
ValidateIssuer = true,
|
||||||
ValidateAudience = true,
|
ValidateAudience = true,
|
||||||
|
ValidateIssuerSigningKey = true,
|
||||||
|
ValidateLifetime = true,
|
||||||
ValidAudience = Configuration["JWT:Audience"],
|
ValidAudience = Configuration["JWT:Audience"],
|
||||||
ValidIssuer = Configuration["JWT:Issuer"],
|
ValidIssuer = Configuration["JWT:Issuer"],
|
||||||
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JWT:Secret"]))
|
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JWT:Secret"]))
|
||||||
|
|||||||
Reference in New Issue
Block a user