1
0
mirror of https://github.com/bitwarden/server.git synced 2025-07-02 16:42:50 -05:00

Merge branch 'master' into feature/billing-obfuscation

# Conflicts:
#	src/Core/Enums/ReferenceEventType.cs
#	src/Core/Services/IMailService.cs
#	src/Core/Services/Implementations/HandlebarsMailService.cs
#	src/Core/Services/Implementations/OrganizationService.cs
#	src/Core/Services/NoopImplementations/NoopMailService.cs
This commit is contained in:
Rui Tome
2023-03-31 11:31:41 +01:00
118 changed files with 7963 additions and 4884 deletions

2
.github/CODEOWNERS vendored
View File

@ -2,5 +2,5 @@
# #
# https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners # https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners
**/SecretsManager @bitwarden/pod-sm-dev **/SecretsManager @bitwarden/team-secrets-manager-dev
**/Vault @bitwarden/team-vault-dev **/Vault @bitwarden/team-vault-dev

View File

@ -324,10 +324,7 @@ jobs:
IMAGE_TAG=$(echo "${GITHUB_REF:11}" | sed "s#/#-#g") # slash safe branch name IMAGE_TAG=$(echo "${GITHUB_REF:11}" | sed "s#/#-#g") # slash safe branch name
if [[ "$IMAGE_TAG" == "master" ]]; then if [[ "$IMAGE_TAG" == "master" ]]; then
IMAGE_TAG=dev IMAGE_TAG=dev
elif [[ "$IMAGE_TAG" == "rc" ]] || [[ "$IMAGE_TAG" == "hotfix-rc" ]]; then
IMAGE_TAG=beta
fi fi
echo "image_tag=$IMAGE_TAG" >> $GITHUB_OUTPUT echo "image_tag=$IMAGE_TAG" >> $GITHUB_OUTPUT
- name: Setup project name - name: Setup project name
@ -501,7 +498,7 @@ jobs:
dotnet restore dotnet restore
- name: Publish project - name: Publish project
run: dotnet publish -c "Release" -o obj/build-output/publish -r ${{ matrix.target }} --self-contained true run: dotnet publish -c "Release" -o obj/build-output/publish -r ${{ matrix.target }} -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true --self-contained true
- name: Upload project artifact Windows - name: Upload project artifact Windows
if: ${{ contains(matrix.target, 'win') == true }} if: ${{ contains(matrix.target, 'win') == true }}

View File

@ -3,7 +3,7 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>net6.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>
<!--2022.6.2--> <!--2022.6.2-->
<Version>2023.2.2</Version> <Version>2023.3.0</Version>
<RootNamespace>Bit.$(MSBuildProjectName)</RootNamespace> <RootNamespace>Bit.$(MSBuildProjectName)</RootNamespace>
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile> <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
@ -32,10 +32,6 @@
NuGet: https://www.nuget.org/packages/coverlet.collector/ NuGet: https://www.nuget.org/packages/coverlet.collector/
--> -->
<CoverletCollectorVersion>3.1.2</CoverletCollectorVersion> <CoverletCollectorVersion>3.1.2</CoverletCollectorVersion>
<!--
NuGet: https://www.nuget.org/packages/Swashbuckle.AspNetCore/
-->
<MicrosoftVisualStudioWebCodeGenerationDesignVersion>6.0.3</MicrosoftVisualStudioWebCodeGenerationDesignVersion>
<!-- <!--
NuGet: https://www.nuget.org/packages/NSubstitute/ NuGet: https://www.nuget.org/packages/NSubstitute/
--> -->

View File

@ -11,11 +11,13 @@ public class DeleteProjectCommand : IDeleteProjectCommand
{ {
private readonly IProjectRepository _projectRepository; private readonly IProjectRepository _projectRepository;
private readonly ICurrentContext _currentContext; private readonly ICurrentContext _currentContext;
private readonly ISecretRepository _secretRepository;
public DeleteProjectCommand(IProjectRepository projectRepository, ICurrentContext currentContext) public DeleteProjectCommand(IProjectRepository projectRepository, ICurrentContext currentContext, ISecretRepository secretRepository)
{ {
_projectRepository = projectRepository; _projectRepository = projectRepository;
_currentContext = currentContext; _currentContext = currentContext;
_secretRepository = secretRepository;
} }
public async Task<List<Tuple<Project, string>>> DeleteProjects(List<Guid> ids, Guid userId) public async Task<List<Tuple<Project, string>>> DeleteProjects(List<Guid> ids, Guid userId)
@ -25,7 +27,7 @@ public class DeleteProjectCommand : IDeleteProjectCommand
throw new ArgumentNullException(); throw new ArgumentNullException();
} }
var projects = (await _projectRepository.GetManyByIds(ids))?.ToList(); var projects = (await _projectRepository.GetManyWithSecretsByIds(ids))?.ToList();
if (projects?.Any() != true || projects.Count != ids.Count) if (projects?.Any() != true || projects.Count != ids.Count)
{ {
@ -72,9 +74,16 @@ public class DeleteProjectCommand : IDeleteProjectCommand
if (deleteIds.Count > 0) if (deleteIds.Count > 0)
{ {
var secretIds = results.SelectMany(projTuple => projTuple.Item1?.Secrets?.Select(s => s.Id) ?? Array.Empty<Guid>()).ToList();
if (secretIds.Count > 0)
{
await _secretRepository.UpdateRevisionDates(secretIds);
}
await _projectRepository.DeleteManyByIdAsync(deleteIds); await _projectRepository.DeleteManyByIdAsync(deleteIds);
} }
return results; return results;
} }
} }

View File

@ -2604,43 +2604,43 @@
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
} }
} }

View File

@ -1,7 +1,6 @@
using System.Linq.Expressions; using System.Linq.Expressions;
using AutoMapper; using AutoMapper;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.SecretsManager.Models.Data;
using Bit.Core.SecretsManager.Repositories; using Bit.Core.SecretsManager.Repositories;
using Bit.Infrastructure.EntityFramework.Repositories; using Bit.Infrastructure.EntityFramework.Repositories;
using Bit.Infrastructure.EntityFramework.SecretsManager.Models; using Bit.Infrastructure.EntityFramework.SecretsManager.Models;
@ -28,31 +27,6 @@ public class ProjectRepository : Repository<Core.SecretsManager.Entities.Project
} }
} }
public async Task<ProjectPermissionDetails> GetPermissionDetailsByIdAsync(Guid id, Guid userId)
{
using var scope = ServiceScopeFactory.CreateScope();
var dbContext = GetDatabaseContext(scope);
var project = await dbContext.Project
.Where(c => c.Id == id && c.DeletedDate == null)
.Select(p => new ProjectPermissionDetails
{
Id = p.Id,
OrganizationId = p.OrganizationId,
Name = p.Name,
CreationDate = p.CreationDate,
RevisionDate = p.RevisionDate,
DeletedDate = p.DeletedDate,
Read = p.UserAccessPolicies.Any(ap => ap.OrganizationUser.User.Id == userId && ap.Read)
|| p.GroupAccessPolicies.Any(ap =>
ap.Group.GroupUsers.Any(gu => gu.OrganizationUser.User.Id == userId && ap.Read)),
Write = p.UserAccessPolicies.Any(ap => ap.OrganizationUser.User.Id == userId && ap.Write) ||
p.GroupAccessPolicies.Any(ap =>
ap.Group.GroupUsers.Any(gu => gu.OrganizationUser.User.Id == userId && ap.Write)),
}).FirstOrDefaultAsync();
return project;
}
public async Task<IEnumerable<Core.SecretsManager.Entities.Project>> GetManyByOrganizationIdAsync(Guid organizationId, Guid userId, AccessClientType accessType) public async Task<IEnumerable<Core.SecretsManager.Entities.Project>> GetManyByOrganizationIdAsync(Guid organizationId, Guid userId, AccessClientType accessType)
{ {
using var scope = ServiceScopeFactory.CreateScope(); using var scope = ServiceScopeFactory.CreateScope();
@ -117,12 +91,13 @@ public class ProjectRepository : Repository<Core.SecretsManager.Entities.Project
} }
} }
public async Task<IEnumerable<Core.SecretsManager.Entities.Project>> GetManyByIds(IEnumerable<Guid> ids) public async Task<IEnumerable<Core.SecretsManager.Entities.Project>> GetManyWithSecretsByIds(IEnumerable<Guid> ids)
{ {
using (var scope = ServiceScopeFactory.CreateScope()) using (var scope = ServiceScopeFactory.CreateScope())
{ {
var dbContext = GetDatabaseContext(scope); var dbContext = GetDatabaseContext(scope);
var projects = await dbContext.Project var projects = await dbContext.Project
.Include(p => p.Secrets)
.Where(c => ids.Contains(c.Id) && c.DeletedDate == null) .Where(c => ids.Contains(c.Id) && c.DeletedDate == null)
.ToListAsync(); .ToListAsync();
return Mapper.Map<List<Core.SecretsManager.Entities.Project>>(projects); return Mapper.Map<List<Core.SecretsManager.Entities.Project>>(projects);
@ -182,4 +157,37 @@ public class ProjectRepository : Repository<Core.SecretsManager.Entities.Project
await dbContext.SaveChangesAsync(); await dbContext.SaveChangesAsync();
return projects; return projects;
} }
public async Task<(bool Read, bool Write)> AccessToProjectAsync(Guid id, Guid userId, AccessClientType accessType)
{
using var scope = ServiceScopeFactory.CreateScope();
var dbContext = GetDatabaseContext(scope);
var projectQuery = dbContext.Project
.Where(s => s.Id == id);
var query = accessType switch
{
AccessClientType.NoAccessCheck => projectQuery.Select(_ => new { Read = true, Write = true }),
AccessClientType.User => projectQuery.Select(p => new
{
Read = p.UserAccessPolicies.Any(ap => ap.OrganizationUser.User.Id == userId && ap.Read)
|| p.GroupAccessPolicies.Any(ap =>
ap.Group.GroupUsers.Any(gu => gu.OrganizationUser.User.Id == userId && ap.Read)),
Write = p.UserAccessPolicies.Any(ap => ap.OrganizationUser.User.Id == userId && ap.Write) ||
p.GroupAccessPolicies.Any(ap =>
ap.Group.GroupUsers.Any(gu => gu.OrganizationUser.User.Id == userId && ap.Write)),
}),
AccessClientType.ServiceAccount => projectQuery.Select(p => new
{
Read = p.ServiceAccountAccessPolicies.Any(ap => ap.ServiceAccountId == userId && ap.Read),
Write = p.ServiceAccountAccessPolicies.Any(ap => ap.ServiceAccountId == userId && ap.Write),
}),
_ => projectQuery.Select(_ => new { Read = false, Write = false }),
};
var policy = await query.FirstOrDefaultAsync();
return (policy.Read, policy.Write);
}
} }

View File

@ -1,6 +1,7 @@
using System.Linq.Expressions; using System.Linq.Expressions;
using AutoMapper; using AutoMapper;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.SecretsManager.Models.Data;
using Bit.Core.SecretsManager.Repositories; using Bit.Core.SecretsManager.Repositories;
using Bit.Infrastructure.EntityFramework; using Bit.Infrastructure.EntityFramework;
using Bit.Infrastructure.EntityFramework.Repositories; using Bit.Infrastructure.EntityFramework.Repositories;
@ -35,40 +36,25 @@ public class SecretRepository : Repository<Core.SecretsManager.Entities.Secret,
{ {
var dbContext = GetDatabaseContext(scope); var dbContext = GetDatabaseContext(scope);
var secrets = await dbContext.Secret var secrets = await dbContext.Secret
.Where(c => ids.Contains(c.Id) && c.DeletedDate == null) .Where(c => ids.Contains(c.Id) && c.DeletedDate == null)
.Include(c => c.Projects) .Include(c => c.Projects)
.ToListAsync(); .ToListAsync();
return Mapper.Map<List<Core.SecretsManager.Entities.Secret>>(secrets); return Mapper.Map<List<Core.SecretsManager.Entities.Secret>>(secrets);
} }
} }
private static Expression<Func<Secret, bool>> ServiceAccountHasReadAccessToSecret(Guid serviceAccountId) => s => public async Task<IEnumerable<SecretPermissionDetails>> GetManyByOrganizationIdAsync(Guid organizationId, Guid userId, AccessClientType accessType)
s.Projects.Any(p =>
p.ServiceAccountAccessPolicies.Any(ap => ap.ServiceAccount.Id == serviceAccountId && ap.Read));
private static Expression<Func<Secret, bool>> UserHasReadAccessToSecret(Guid userId) => s =>
s.Projects.Any(p =>
p.UserAccessPolicies.Any(ap => ap.OrganizationUser.UserId == userId && ap.Read) ||
p.GroupAccessPolicies.Any(ap =>
ap.Group.GroupUsers.Any(gu => gu.OrganizationUser.UserId == userId && ap.Read)));
public async Task<IEnumerable<Core.SecretsManager.Entities.Secret>> GetManyByOrganizationIdAsync(Guid organizationId, Guid userId, AccessClientType accessType)
{ {
using var scope = ServiceScopeFactory.CreateScope(); using var scope = ServiceScopeFactory.CreateScope();
var dbContext = GetDatabaseContext(scope); var dbContext = GetDatabaseContext(scope);
var query = dbContext.Secret.Include(c => c.Projects).Where(c => c.OrganizationId == organizationId && c.DeletedDate == null); var query = dbContext.Secret
.Include(c => c.Projects)
.Where(c => c.OrganizationId == organizationId && c.DeletedDate == null)
.OrderBy(s => s.RevisionDate);
query = accessType switch var secrets = SecretToPermissionDetails(query, userId, accessType);
{
AccessClientType.NoAccessCheck => query,
AccessClientType.User => query.Where(UserHasReadAccessToSecret(userId)),
AccessClientType.ServiceAccount => query.Where(ServiceAccountHasReadAccessToSecret(userId)),
_ => throw new ArgumentOutOfRangeException(nameof(accessType), accessType, null),
};
var secrets = await query.OrderBy(c => c.RevisionDate).ToListAsync(); return await secrets.ToListAsync();
return Mapper.Map<List<Core.SecretsManager.Entities.Secret>>(secrets);
} }
public async Task<IEnumerable<Core.SecretsManager.Entities.Secret>> GetManyByOrganizationIdInTrashByIdsAsync(Guid organizationId, IEnumerable<Guid> ids) public async Task<IEnumerable<Core.SecretsManager.Entities.Secret>> GetManyByOrganizationIdInTrashByIdsAsync(Guid organizationId, IEnumerable<Guid> ids)
@ -86,7 +72,7 @@ public class SecretRepository : Repository<Core.SecretsManager.Entities.Secret,
} }
} }
public async Task<IEnumerable<Core.SecretsManager.Entities.Secret>> GetManyByOrganizationIdInTrashAsync(Guid organizationId) public async Task<IEnumerable<SecretPermissionDetails>> GetManyByOrganizationIdInTrashAsync(Guid organizationId)
{ {
using (var scope = ServiceScopeFactory.CreateScope()) using (var scope = ServiceScopeFactory.CreateScope())
{ {
@ -97,29 +83,26 @@ public class SecretRepository : Repository<Core.SecretsManager.Entities.Secret,
.OrderBy(c => c.RevisionDate) .OrderBy(c => c.RevisionDate)
.ToListAsync(); .ToListAsync();
return Mapper.Map<List<Core.SecretsManager.Entities.Secret>>(secrets); // This should be changed if/when we allow non admins to access trashed items
return Mapper.Map<List<Core.SecretsManager.Entities.Secret>>(secrets).Select(s => new SecretPermissionDetails
{
Secret = s,
Read = true,
Write = true,
});
} }
} }
public async Task<IEnumerable<Core.SecretsManager.Entities.Secret>> GetManyByProjectIdAsync(Guid projectId, Guid userId, AccessClientType accessType) public async Task<IEnumerable<SecretPermissionDetails>> GetManyByProjectIdAsync(Guid projectId, Guid userId, AccessClientType accessType)
{ {
using (var scope = ServiceScopeFactory.CreateScope()) using var scope = ServiceScopeFactory.CreateScope();
{ var dbContext = GetDatabaseContext(scope);
var dbContext = GetDatabaseContext(scope); var query = dbContext.Secret.Include(s => s.Projects)
var query = dbContext.Secret.Include(s => s.Projects) .Where(s => s.Projects.Any(p => p.Id == projectId) && s.DeletedDate == null);
.Where(s => s.Projects.Any(p => p.Id == projectId) && s.DeletedDate == null);
query = accessType switch var secrets = SecretToPermissionDetails(query, userId, accessType);
{
AccessClientType.NoAccessCheck => query,
AccessClientType.User => query.Where(UserHasReadAccessToSecret(userId)),
AccessClientType.ServiceAccount => query.Where(ServiceAccountHasReadAccessToSecret(userId)),
_ => throw new ArgumentOutOfRangeException(nameof(accessType), accessType, null),
};
var secrets = await query.OrderBy(s => s.RevisionDate).ToListAsync(); return await secrets.ToListAsync();
return Mapper.Map<List<Core.SecretsManager.Entities.Secret>>(secrets);
}
} }
public override async Task<Core.SecretsManager.Entities.Secret> CreateAsync(Core.SecretsManager.Entities.Secret secret) public override async Task<Core.SecretsManager.Entities.Secret> CreateAsync(Core.SecretsManager.Entities.Secret secret)
@ -212,11 +195,13 @@ public class SecretRepository : Repository<Core.SecretsManager.Entities.Secret,
using (var scope = ServiceScopeFactory.CreateScope()) using (var scope = ServiceScopeFactory.CreateScope())
{ {
var dbContext = GetDatabaseContext(scope); var dbContext = GetDatabaseContext(scope);
var utcNow = DateTime.UtcNow;
var secrets = dbContext.Secret.Where(c => ids.Contains(c.Id)); var secrets = dbContext.Secret.Where(c => ids.Contains(c.Id));
await secrets.ForEachAsync(secret => await secrets.ForEachAsync(secret =>
{ {
dbContext.Attach(secret); dbContext.Attach(secret);
secret.DeletedDate = null; secret.DeletedDate = null;
secret.RevisionDate = utcNow;
}); });
await dbContext.SaveChangesAsync(); await dbContext.SaveChangesAsync();
} }
@ -252,4 +237,103 @@ public class SecretRepository : Repository<Core.SecretsManager.Entities.Secret,
} }
return secrets; return secrets;
} }
public async Task UpdateRevisionDates(IEnumerable<Guid> ids)
{
using (var scope = ServiceScopeFactory.CreateScope())
{
var dbContext = GetDatabaseContext(scope);
var utcNow = DateTime.UtcNow;
var secrets = dbContext.Secret.Where(s => ids.Contains(s.Id));
await secrets.ForEachAsync(secret =>
{
dbContext.Attach(secret);
secret.RevisionDate = utcNow;
});
await dbContext.SaveChangesAsync();
}
}
public async Task<(bool Read, bool Write)> AccessToSecretAsync(Guid id, Guid userId, AccessClientType accessType)
{
using var scope = ServiceScopeFactory.CreateScope();
var dbContext = GetDatabaseContext(scope);
var secret = dbContext.Secret
.Where(s => s.Id == id);
var query = accessType switch
{
AccessClientType.NoAccessCheck => secret.Select(_ => new { Read = true, Write = true }),
AccessClientType.User => secret.Select(s => new
{
Read = s.Projects.Any(p =>
p.UserAccessPolicies.Any(ap => ap.OrganizationUser.User.Id == userId && ap.Read) ||
p.GroupAccessPolicies.Any(ap =>
ap.Group.GroupUsers.Any(gu => gu.OrganizationUser.User.Id == userId && ap.Read))),
Write = s.Projects.Any(p =>
p.UserAccessPolicies.Any(ap => ap.OrganizationUser.User.Id == userId && ap.Write) ||
p.GroupAccessPolicies.Any(ap =>
ap.Group.GroupUsers.Any(gu => gu.OrganizationUser.User.Id == userId && ap.Write))),
}),
AccessClientType.ServiceAccount => secret.Select(s => new
{
Read = s.Projects.Any(p =>
p.ServiceAccountAccessPolicies.Any(ap => ap.ServiceAccountId == userId && ap.Read)),
Write = s.Projects.Any(p =>
p.ServiceAccountAccessPolicies.Any(ap => ap.ServiceAccountId == userId && ap.Write)),
}),
_ => secret.Select(_ => new { Read = false, Write = false }),
};
var policy = await query.FirstOrDefaultAsync();
return (policy.Read, policy.Write);
}
private IQueryable<SecretPermissionDetails> SecretToPermissionDetails(IQueryable<Secret> query, Guid userId, AccessClientType accessType)
{
var secrets = accessType switch
{
AccessClientType.NoAccessCheck => query.Select(s => new SecretPermissionDetails
{
Secret = Mapper.Map<Bit.Core.SecretsManager.Entities.Secret>(s),
Read = true,
Write = true,
}),
AccessClientType.User => query.Where(UserHasReadAccessToSecret(userId)).Select(SecretToPermissionsUser(userId, true)),
AccessClientType.ServiceAccount => query.Where(ServiceAccountHasReadAccessToSecret(userId)).Select(s =>
new SecretPermissionDetails
{
Secret = Mapper.Map<Bit.Core.SecretsManager.Entities.Secret>(s),
Read = true,
Write = false,
}),
_ => throw new ArgumentOutOfRangeException(nameof(accessType), accessType, null),
};
return secrets;
}
private Expression<Func<Secret, SecretPermissionDetails>> SecretToPermissionsUser(Guid userId, bool read) =>
s => new SecretPermissionDetails
{
Secret = Mapper.Map<Bit.Core.SecretsManager.Entities.Secret>(s),
Read = read,
Write = s.Projects.Any(p =>
p.UserAccessPolicies.Any(ap => ap.OrganizationUser.User.Id == userId && ap.Write) ||
p.GroupAccessPolicies.Any(ap =>
ap.Group.GroupUsers.Any(gu => gu.OrganizationUser.User.Id == userId && ap.Write))),
};
private static Expression<Func<Secret, bool>> ServiceAccountHasReadAccessToSecret(Guid serviceAccountId) => s =>
s.Projects.Any(p =>
p.ServiceAccountAccessPolicies.Any(ap => ap.ServiceAccount.Id == serviceAccountId && ap.Read));
private static Expression<Func<Secret, bool>> UserHasReadAccessToSecret(Guid userId) => s =>
s.Projects.Any(p =>
p.UserAccessPolicies.Any(ap => ap.OrganizationUser.UserId == userId && ap.Read) ||
p.GroupAccessPolicies.Any(ap =>
ap.Group.GroupUsers.Any(gu => gu.OrganizationUser.UserId == userId && ap.Read)));
} }

View File

@ -2777,56 +2777,56 @@
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
}, },
"infrastructure.entityframework": { "infrastructure.entityframework": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoMapper.Extensions.Microsoft.DependencyInjection": "[11.0.0, )", "AutoMapper.Extensions.Microsoft.DependencyInjection": "11.0.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Microsoft.EntityFrameworkCore.Relational": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Relational": "6.0.12",
"Microsoft.EntityFrameworkCore.SqlServer": "[6.0.12, )", "Microsoft.EntityFrameworkCore.SqlServer": "6.0.12",
"Microsoft.EntityFrameworkCore.Sqlite": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Sqlite": "6.0.12",
"Npgsql.EntityFrameworkCore.PostgreSQL": "[6.0.8, )", "Npgsql.EntityFrameworkCore.PostgreSQL": "6.0.8",
"Pomelo.EntityFrameworkCore.MySql": "[6.0.2, )", "Pomelo.EntityFrameworkCore.MySql": "6.0.2",
"linq2db.EntityFrameworkCore": "[6.11.0, )" "linq2db.EntityFrameworkCore": "6.11.0"
} }
} }
} }

View File

@ -5,10 +5,6 @@
<MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish> <MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="5.0.2" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\..\src\Core\Core.csproj" /> <ProjectReference Include="..\..\..\src\Core\Core.csproj" />
<ProjectReference Include="..\..\..\src\SharedWeb\SharedWeb.csproj" /> <ProjectReference Include="..\..\..\src\SharedWeb\SharedWeb.csproj" />

View File

@ -2,15 +2,6 @@
"version": 1, "version": 1,
"dependencies": { "dependencies": {
"net6.0": { "net6.0": {
"Microsoft.VisualStudio.Web.CodeGeneration.Design": {
"type": "Direct",
"requested": "[5.0.2, )",
"resolved": "5.0.2",
"contentHash": "9eTZV7W+S2iO2AJD03xXyXJZ+Nf71Y25gMXhqyXb8bB63jPfn+VQhV8I1lb6J+NR3jW98m5EB9QBftBSrjgiYQ==",
"dependencies": {
"Microsoft.VisualStudio.Web.CodeGenerators.Mvc": "5.0.2"
}
},
"AspNetCoreRateLimit": { "AspNetCoreRateLimit": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.0.2", "resolved": "4.0.2",
@ -199,14 +190,6 @@
"Microsoft.CSharp": "4.7.0" "Microsoft.CSharp": "4.7.0"
} }
}, },
"Humanizer.Core": {
"type": "Transitive",
"resolved": "2.2.0",
"contentHash": "rsYXB7+iUPP8AHgQ8JP2UZI2xK2KhjcdGr9E6zX3CsZaTLCaw8M35vaAJRo1rfxeaZEVMuXeaquLVCkZ7JcZ5Q==",
"dependencies": {
"NETStandard.Library": "1.6.1"
}
},
"IdentityModel": { "IdentityModel": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.4.0", "resolved": "4.4.0",
@ -401,14 +384,6 @@
"Microsoft.Extensions.Configuration.Abstractions": "2.1.0" "Microsoft.Extensions.Configuration.Abstractions": "2.1.0"
} }
}, },
"Microsoft.AspNetCore.Html.Abstractions": {
"type": "Transitive",
"resolved": "2.2.0",
"contentHash": "Y4rs5aMEXY8G7wJo5S3EEt6ltqyOTr/qOeZzfn+hw/fuQj5GppGckMY5psGLETo1U9hcT5MmAhaT5xtusM1b5g==",
"dependencies": {
"System.Text.Encodings.Web": "4.5.0"
}
},
"Microsoft.AspNetCore.Http.Abstractions": { "Microsoft.AspNetCore.Http.Abstractions": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.1.0", "resolved": "2.1.0",
@ -426,28 +401,6 @@
"Microsoft.Extensions.Primitives": "2.1.0" "Microsoft.Extensions.Primitives": "2.1.0"
} }
}, },
"Microsoft.AspNetCore.Razor": {
"type": "Transitive",
"resolved": "2.2.0",
"contentHash": "V54PIyDCFl8COnTp9gezNHpUNHk7F9UnerGeZy3UfbnwYvfzbo+ipqQmSgeoESH8e0JvKhRTyQyZquW2EPtCmg==",
"dependencies": {
"Microsoft.AspNetCore.Html.Abstractions": "2.2.0"
}
},
"Microsoft.AspNetCore.Razor.Language": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "6yOBBASGfXMx1fY6hyjvG+oM3eR8vovIehDdEZW7jAV4gKlY4xuAvTm7Iw1fEq7KPunh2VrJwo7oRK1XxUn1OQ=="
},
"Microsoft.AspNetCore.Razor.Runtime": {
"type": "Transitive",
"resolved": "2.2.0",
"contentHash": "7YqK+H61lN6yj9RiQUko7oaOhKtRR9Q/kBcoWNRemhJdTIWOh1OmdvJKzZrMWOlff3BAjejkPQm+0V0qXk+B1w==",
"dependencies": {
"Microsoft.AspNetCore.Html.Abstractions": "2.2.0",
"Microsoft.AspNetCore.Razor": "2.2.0"
}
},
"Microsoft.Azure.Amqp": { "Microsoft.Azure.Amqp": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.4.11", "resolved": "2.4.11",
@ -550,64 +503,6 @@
"resolved": "1.1.0", "resolved": "1.1.0",
"contentHash": "J2G1k+u5unBV+aYcwxo94ip16Rkp65pgWFb0R6zwJipzWNMgvqlWeuI7/+R+e8bob66LnSG+llLJ+z8wI94cHg==" "contentHash": "J2G1k+u5unBV+aYcwxo94ip16Rkp65pgWFb0R6zwJipzWNMgvqlWeuI7/+R+e8bob66LnSG+llLJ+z8wI94cHg=="
}, },
"Microsoft.CodeAnalysis.Analyzers": {
"type": "Transitive",
"resolved": "3.0.0",
"contentHash": "ojG5pGAhTPmjxRGTNvuszO3H8XPZqksDwr9xLd4Ae/JBjZZdl6GuoLk7uLMf+o7yl5wO0TAqoWcEKkEWqrZE5g=="
},
"Microsoft.CodeAnalysis.Common": {
"type": "Transitive",
"resolved": "3.8.0",
"contentHash": "8YTZ7GpsbTdC08DITx7/kwV0k4SC6cbBAFqc13cOm5vKJZcEIAh51tNSyGSkWisMgYCr96B2wb5Zri1bsla3+g==",
"dependencies": {
"Microsoft.CodeAnalysis.Analyzers": "3.0.0",
"System.Collections.Immutable": "5.0.0",
"System.Memory": "4.5.4",
"System.Reflection.Metadata": "5.0.0",
"System.Runtime.CompilerServices.Unsafe": "4.7.1",
"System.Text.Encoding.CodePages": "4.5.1",
"System.Threading.Tasks.Extensions": "4.5.4"
}
},
"Microsoft.CodeAnalysis.CSharp": {
"type": "Transitive",
"resolved": "3.8.0",
"contentHash": "hKqFCUSk9TIMBDjiYMF8/ZfK9p9mzpU+slM73CaCHu4ctfkoqJGHLQhyT8wvrYsIg+ufrUWBF8hcJYmyr5rc5Q==",
"dependencies": {
"Microsoft.CodeAnalysis.Common": "[3.8.0]"
}
},
"Microsoft.CodeAnalysis.CSharp.Workspaces": {
"type": "Transitive",
"resolved": "3.8.0",
"contentHash": "rdEBvPWqe/IIscsnp7OkZ4tQin8khxBcSLyV9tU+sHdw9uW9U0GKL+Dv2rD4voC1bZBaO18Hp+m4Vkyfmaz0OA==",
"dependencies": {
"Humanizer.Core": "2.2.0",
"Microsoft.CodeAnalysis.CSharp": "[3.8.0]",
"Microsoft.CodeAnalysis.Common": "[3.8.0]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[3.8.0]"
}
},
"Microsoft.CodeAnalysis.Razor": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "s4u/6z/MQ35y/egrXf4WgJlUZf5GGvuba9mZ700dH4XxLBrA9Fw9kFZ8uymoATry7hwz5owvFhBVo+2VnoiGRg==",
"dependencies": {
"Microsoft.AspNetCore.Razor.Language": "5.0.0",
"Microsoft.CodeAnalysis.CSharp": "3.7.0",
"Microsoft.CodeAnalysis.Common": "3.7.0"
}
},
"Microsoft.CodeAnalysis.Workspaces.Common": {
"type": "Transitive",
"resolved": "3.8.0",
"contentHash": "GPYVydsmOmScOWDJA1LFky7/MkoXpx1JI3lZJShxC+bvVUvL9zVKE8WDZMLsYJ5MAbry2xkZftdfeMpZ+kvLDQ==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "1.1.1",
"Microsoft.CodeAnalysis.Common": "[3.8.0]",
"System.Composition": "1.0.31"
}
},
"Microsoft.CSharp": { "Microsoft.CSharp": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.7.0", "resolved": "4.7.0",
@ -1056,72 +951,6 @@
"resolved": "1.0.0", "resolved": "1.0.0",
"contentHash": "N4KeF3cpcm1PUHym1RmakkzfkEv3GRMyofVv40uXsQhCQeglr2OHNcUk2WOG51AKpGO8ynGpo9M/kFXSzghwug==" "contentHash": "N4KeF3cpcm1PUHym1RmakkzfkEv3GRMyofVv40uXsQhCQeglr2OHNcUk2WOG51AKpGO8ynGpo9M/kFXSzghwug=="
}, },
"Microsoft.VisualStudio.Web.CodeGeneration": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "YUah81QG5q/ViVbr1BZcTbDLNJ5/k84fr+xx3/IoDVJR8KEUm89HmPAGM+FMMyWOjit+CIVpyOq7yEmRBBWXxQ==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "5.0.0",
"Microsoft.VisualStudio.Web.CodeGeneration.EntityFrameworkCore": "5.0.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.Contracts": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "34v6AkkRJykgFq7rHwNbzXBsLFquevLuegM9XDQl2j+wyOfj+ql1++jUR1WdZoPkv04WoM09mD47S3lMzJmHrQ==",
"dependencies": {
"Newtonsoft.Json": "11.0.2",
"System.Collections.Immutable": "1.7.0"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.Core": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "R7mrxvTtv/MiEH42OtHYi/3L0A/vaAH8mwg+3yAyQtVuy6v9CeeVyL30lfTQ7EYV4ezUmuQKFwfjcU6PP0/KSQ==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "5.0.0",
"Microsoft.VisualStudio.Web.CodeGeneration.Templating": "5.0.2",
"Newtonsoft.Json": "11.0.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.EntityFrameworkCore": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "f9XeBRS9ICosrCpbO9jnAVMd/ISLhaZgx388XNBjigiyBJuq577J6tQgQWZA8PQTiPj6MKe9HVIW2GnKXDiUrQ==",
"dependencies": {
"Microsoft.VisualStudio.Web.CodeGeneration.Core": "5.0.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.Templating": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "P3z/JZTGP5DhSc8ik4xrimWuCZ2ZaEZ6q7WGgfgmSVibfXxwh2Oo+dtdkiXwq8MNlkrcP0AZAo3+1wowYUzluA==",
"dependencies": {
"Microsoft.AspNetCore.Razor.Language": "5.0.0",
"Microsoft.AspNetCore.Razor.Runtime": "2.2.0",
"Microsoft.CodeAnalysis.CSharp": "3.8.0",
"Microsoft.CodeAnalysis.Razor": "5.0.0",
"Microsoft.VisualStudio.Web.CodeGeneration.Utils": "5.0.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.Utils": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "4zViWGIFeKsGxDmc5xpn2G8kWs2FSHiLOolw85ZPHihDXc2jiFKp7qjA3SRt8U23kR3zeb0vZiFlETxgTHwAUA==",
"dependencies": {
"Microsoft.CodeAnalysis.CSharp.Workspaces": "3.8.0",
"Microsoft.VisualStudio.Web.CodeGeneration.Contracts": "5.0.2",
"Newtonsoft.Json": "11.0.2"
}
},
"Microsoft.VisualStudio.Web.CodeGenerators.Mvc": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "W4Uk2y0oja+4E+XP5d5OFu+ViTEtlqm3a6nYuuC3tjA+lTK6dLaMf0G6WnO4BO18i0kM0l49XjTwwXd5XpjnAQ==",
"dependencies": {
"Microsoft.VisualStudio.Web.CodeGeneration": "5.0.2"
}
},
"Microsoft.Win32.Primitives": { "Microsoft.Win32.Primitives": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.3.0", "resolved": "4.3.0",
@ -1696,102 +1525,6 @@
"System.Threading": "4.0.11" "System.Threading": "4.0.11"
} }
}, },
"System.Composition": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "I+D26qpYdoklyAVUdqwUBrEIckMNjAYnuPJy/h9dsQItpQwVREkDFs4b4tkBza0kT2Yk48Lcfsv2QQ9hWsh9Iw==",
"dependencies": {
"System.Composition.AttributedModel": "1.0.31",
"System.Composition.Convention": "1.0.31",
"System.Composition.Hosting": "1.0.31",
"System.Composition.Runtime": "1.0.31",
"System.Composition.TypedParts": "1.0.31"
}
},
"System.Composition.AttributedModel": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "NHWhkM3ZkspmA0XJEsKdtTt1ViDYuojgSND3yHhTzwxepiwqZf+BCWuvCbjUt4fe0NxxQhUDGJ5km6sLjo9qnQ==",
"dependencies": {
"System.Reflection": "4.3.0",
"System.Runtime": "4.3.0"
}
},
"System.Composition.Convention": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "GLjh2Ju71k6C0qxMMtl4efHa68NmWeIUYh4fkUI8xbjQrEBvFmRwMDFcylT8/PR9SQbeeL48IkFxU/+gd0nYEQ==",
"dependencies": {
"System.Collections": "4.3.0",
"System.Composition.AttributedModel": "1.0.31",
"System.Diagnostics.Debug": "4.3.0",
"System.Diagnostics.Tools": "4.3.0",
"System.Globalization": "4.3.0",
"System.Linq": "4.3.0",
"System.Linq.Expressions": "4.3.0",
"System.Reflection": "4.3.0",
"System.Reflection.Extensions": "4.3.0",
"System.Resources.ResourceManager": "4.3.0",
"System.Runtime": "4.3.0",
"System.Threading": "4.3.0"
}
},
"System.Composition.Hosting": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "fN1bT4RX4vUqjbgoyuJFVUizAl2mYF5VAb+bVIxIYZSSc0BdnX+yGAxcavxJuDDCQ1K+/mdpgyEFc8e9ikjvrg==",
"dependencies": {
"System.Collections": "4.3.0",
"System.Composition.Runtime": "1.0.31",
"System.Diagnostics.Debug": "4.3.0",
"System.Diagnostics.Tools": "4.3.0",
"System.Globalization": "4.3.0",
"System.Linq": "4.3.0",
"System.Linq.Expressions": "4.3.0",
"System.ObjectModel": "4.3.0",
"System.Reflection": "4.3.0",
"System.Reflection.Extensions": "4.3.0",
"System.Resources.ResourceManager": "4.3.0",
"System.Runtime": "4.3.0",
"System.Threading": "4.3.0"
}
},
"System.Composition.Runtime": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "0LEJN+2NVM89CE4SekDrrk5tHV5LeATltkp+9WNYrR+Huiyt0vaCqHbbHtVAjPyeLWIc8dOz/3kthRBj32wGQg==",
"dependencies": {
"System.Collections": "4.3.0",
"System.Diagnostics.Debug": "4.3.0",
"System.Diagnostics.Tools": "4.3.0",
"System.Globalization": "4.3.0",
"System.Linq": "4.3.0",
"System.Reflection": "4.3.0",
"System.Resources.ResourceManager": "4.3.0",
"System.Runtime": "4.3.0"
}
},
"System.Composition.TypedParts": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "0Zae/FtzeFgDBBuILeIbC/T9HMYbW4olAmi8XqqAGosSOWvXfiQLfARZEhiGd0LVXaYgXr0NhxiU1LldRP1fpQ==",
"dependencies": {
"System.Collections": "4.3.0",
"System.Composition.AttributedModel": "1.0.31",
"System.Composition.Hosting": "1.0.31",
"System.Composition.Runtime": "1.0.31",
"System.Diagnostics.Debug": "4.3.0",
"System.Diagnostics.Tools": "4.3.0",
"System.Globalization": "4.3.0",
"System.Linq": "4.3.0",
"System.Linq.Expressions": "4.3.0",
"System.Reflection": "4.3.0",
"System.Reflection.Extensions": "4.3.0",
"System.Resources.ResourceManager": "4.3.0",
"System.Runtime": "4.3.0",
"System.Runtime.Extensions": "4.3.0"
}
},
"System.Configuration.ConfigurationManager": { "System.Configuration.ConfigurationManager": {
"type": "Transitive", "type": "Transitive",
"resolved": "6.0.0", "resolved": "6.0.0",
@ -2451,11 +2184,6 @@
"System.Runtime": "4.3.0" "System.Runtime": "4.3.0"
} }
}, },
"System.Reflection.Metadata": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ=="
},
"System.Reflection.Primitives": { "System.Reflection.Primitives": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.3.0", "resolved": "4.3.0",
@ -3053,71 +2781,71 @@
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
}, },
"infrastructure.dapper": { "infrastructure.dapper": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Dapper": "[2.0.123, )" "Dapper": "2.0.123"
} }
}, },
"infrastructure.entityframework": { "infrastructure.entityframework": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoMapper.Extensions.Microsoft.DependencyInjection": "[11.0.0, )", "AutoMapper.Extensions.Microsoft.DependencyInjection": "11.0.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Microsoft.EntityFrameworkCore.Relational": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Relational": "6.0.12",
"Microsoft.EntityFrameworkCore.SqlServer": "[6.0.12, )", "Microsoft.EntityFrameworkCore.SqlServer": "6.0.12",
"Microsoft.EntityFrameworkCore.Sqlite": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Sqlite": "6.0.12",
"Npgsql.EntityFrameworkCore.PostgreSQL": "[6.0.8, )", "Npgsql.EntityFrameworkCore.PostgreSQL": "6.0.8",
"Pomelo.EntityFrameworkCore.MySql": "[6.0.2, )", "Pomelo.EntityFrameworkCore.MySql": "6.0.2",
"linq2db.EntityFrameworkCore": "[6.11.0, )" "linq2db.EntityFrameworkCore": "6.11.0"
} }
}, },
"sharedweb": { "sharedweb": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Infrastructure.Dapper": "[2023.2.0, )", "Infrastructure.Dapper": "2023.2.2",
"Infrastructure.EntityFramework": "[2023.2.0, )" "Infrastructure.EntityFramework": "2023.2.2"
} }
} }
} }

View File

@ -2923,71 +2923,71 @@
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
}, },
"infrastructure.dapper": { "infrastructure.dapper": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Dapper": "[2.0.123, )" "Dapper": "2.0.123"
} }
}, },
"infrastructure.entityframework": { "infrastructure.entityframework": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoMapper.Extensions.Microsoft.DependencyInjection": "[11.0.0, )", "AutoMapper.Extensions.Microsoft.DependencyInjection": "11.0.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Microsoft.EntityFrameworkCore.Relational": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Relational": "6.0.12",
"Microsoft.EntityFrameworkCore.SqlServer": "[6.0.12, )", "Microsoft.EntityFrameworkCore.SqlServer": "6.0.12",
"Microsoft.EntityFrameworkCore.Sqlite": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Sqlite": "6.0.12",
"Npgsql.EntityFrameworkCore.PostgreSQL": "[6.0.8, )", "Npgsql.EntityFrameworkCore.PostgreSQL": "6.0.8",
"Pomelo.EntityFrameworkCore.MySql": "[6.0.2, )", "Pomelo.EntityFrameworkCore.MySql": "6.0.2",
"linq2db.EntityFrameworkCore": "[6.11.0, )" "linq2db.EntityFrameworkCore": "6.11.0"
} }
}, },
"sharedweb": { "sharedweb": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Infrastructure.Dapper": "[2023.2.0, )", "Infrastructure.Dapper": "2023.2.2",
"Infrastructure.EntityFramework": "[2023.2.0, )" "Infrastructure.EntityFramework": "2023.2.2"
} }
} }
} }

View File

@ -19,7 +19,7 @@ public class DeleteProjectCommandTests
public async Task DeleteProjects_Throws_NotFoundException(List<Guid> data, Guid userId, public async Task DeleteProjects_Throws_NotFoundException(List<Guid> data, Guid userId,
SutProvider<DeleteProjectCommand> sutProvider) SutProvider<DeleteProjectCommand> sutProvider)
{ {
sutProvider.GetDependency<IProjectRepository>().GetManyByIds(data).Returns(new List<Project>()); sutProvider.GetDependency<IProjectRepository>().GetManyWithSecretsByIds(data).Returns(new List<Project>());
await Assert.ThrowsAsync<NotFoundException>(() => sutProvider.Sut.DeleteProjects(data, userId)); await Assert.ThrowsAsync<NotFoundException>(() => sutProvider.Sut.DeleteProjects(data, userId));
@ -35,7 +35,7 @@ public class DeleteProjectCommandTests
{ {
Id = Guid.NewGuid() Id = Guid.NewGuid()
}; };
sutProvider.GetDependency<IProjectRepository>().GetManyByIds(data).Returns(new List<Project>() { project }); sutProvider.GetDependency<IProjectRepository>().GetManyWithSecretsByIds(data).Returns(new List<Project>() { project });
await Assert.ThrowsAsync<NotFoundException>(() => sutProvider.Sut.DeleteProjects(data, userId)); await Assert.ThrowsAsync<NotFoundException>(() => sutProvider.Sut.DeleteProjects(data, userId));
@ -51,7 +51,7 @@ public class DeleteProjectCommandTests
sutProvider.GetDependency<ICurrentContext>().AccessSecretsManager(organizationId).Returns(true); sutProvider.GetDependency<ICurrentContext>().AccessSecretsManager(organizationId).Returns(true);
sutProvider.GetDependency<ICurrentContext>().ClientType = ClientType.User; sutProvider.GetDependency<ICurrentContext>().ClientType = ClientType.User;
sutProvider.GetDependency<IProjectRepository>().GetManyByIds(data).Returns(projects); sutProvider.GetDependency<IProjectRepository>().GetManyWithSecretsByIds(data).Returns(projects);
sutProvider.GetDependency<IProjectRepository>().UserHasWriteAccessToProject(Arg.Any<Guid>(), userId).Returns(true); sutProvider.GetDependency<IProjectRepository>().UserHasWriteAccessToProject(Arg.Any<Guid>(), userId).Returns(true);
var results = await sutProvider.Sut.DeleteProjects(data, userId); var results = await sutProvider.Sut.DeleteProjects(data, userId);
@ -73,7 +73,7 @@ public class DeleteProjectCommandTests
sutProvider.GetDependency<ICurrentContext>().AccessSecretsManager(organizationId).Returns(true); sutProvider.GetDependency<ICurrentContext>().AccessSecretsManager(organizationId).Returns(true);
sutProvider.GetDependency<ICurrentContext>().ClientType = ClientType.User; sutProvider.GetDependency<ICurrentContext>().ClientType = ClientType.User;
sutProvider.GetDependency<IProjectRepository>().GetManyByIds(data).Returns(projects); sutProvider.GetDependency<IProjectRepository>().GetManyWithSecretsByIds(data).Returns(projects);
sutProvider.GetDependency<IProjectRepository>().UserHasWriteAccessToProject(userId, userId).Returns(false); sutProvider.GetDependency<IProjectRepository>().UserHasWriteAccessToProject(userId, userId).Returns(false);
var results = await sutProvider.Sut.DeleteProjects(data, userId); var results = await sutProvider.Sut.DeleteProjects(data, userId);
@ -95,7 +95,7 @@ public class DeleteProjectCommandTests
sutProvider.GetDependency<ICurrentContext>().AccessSecretsManager(organizationId).Returns(true); sutProvider.GetDependency<ICurrentContext>().AccessSecretsManager(organizationId).Returns(true);
sutProvider.GetDependency<ICurrentContext>().OrganizationAdmin(organizationId).Returns(true); sutProvider.GetDependency<ICurrentContext>().OrganizationAdmin(organizationId).Returns(true);
sutProvider.GetDependency<IProjectRepository>().GetManyByIds(data).Returns(projects); sutProvider.GetDependency<IProjectRepository>().GetManyWithSecretsByIds(data).Returns(projects);
var results = await sutProvider.Sut.DeleteProjects(data, userId); var results = await sutProvider.Sut.DeleteProjects(data, userId);

View File

@ -2855,75 +2855,75 @@
"commercial.core": { "commercial.core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )" "Core": "2023.2.2"
} }
}, },
"common": { "common": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoFixture.AutoNSubstitute": "[4.17.0, )", "AutoFixture.AutoNSubstitute": "4.17.0",
"AutoFixture.Xunit2": "[4.17.0, )", "AutoFixture.Xunit2": "4.17.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Kralizek.AutoFixture.Extensions.MockHttp": "[1.2.0, )", "Kralizek.AutoFixture.Extensions.MockHttp": "1.2.0",
"Microsoft.NET.Test.Sdk": "[17.1.0, )", "Microsoft.NET.Test.Sdk": "17.1.0",
"NSubstitute": "[4.3.0, )", "NSubstitute": "4.3.0",
"xunit": "[2.4.1, )" "xunit": "2.4.1"
} }
}, },
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
}, },
"core.test": { "core.test": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoFixture.AutoNSubstitute": "[4.17.0, )", "AutoFixture.AutoNSubstitute": "4.17.0",
"AutoFixture.Xunit2": "[4.17.0, )", "AutoFixture.Xunit2": "4.17.0",
"Common": "[2023.2.0, )", "Common": "2023.2.2",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Kralizek.AutoFixture.Extensions.MockHttp": "[1.2.0, )", "Kralizek.AutoFixture.Extensions.MockHttp": "1.2.0",
"Microsoft.NET.Test.Sdk": "[17.1.0, )", "Microsoft.NET.Test.Sdk": "17.1.0",
"Moq": "[4.17.2, )", "Moq": "4.17.2",
"NSubstitute": "[4.3.0, )", "NSubstitute": "4.3.0",
"xunit": "[2.4.1, )" "xunit": "2.4.1"
} }
} }
} }

View File

@ -296,14 +296,6 @@
"Microsoft.CSharp": "4.7.0" "Microsoft.CSharp": "4.7.0"
} }
}, },
"Humanizer.Core": {
"type": "Transitive",
"resolved": "2.2.0",
"contentHash": "rsYXB7+iUPP8AHgQ8JP2UZI2xK2KhjcdGr9E6zX3CsZaTLCaw8M35vaAJRo1rfxeaZEVMuXeaquLVCkZ7JcZ5Q==",
"dependencies": {
"NETStandard.Library": "1.6.1"
}
},
"IdentityModel": { "IdentityModel": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.4.0", "resolved": "4.4.0",
@ -507,14 +499,6 @@
"Microsoft.Extensions.Configuration.Abstractions": "2.1.0" "Microsoft.Extensions.Configuration.Abstractions": "2.1.0"
} }
}, },
"Microsoft.AspNetCore.Html.Abstractions": {
"type": "Transitive",
"resolved": "2.2.0",
"contentHash": "Y4rs5aMEXY8G7wJo5S3EEt6ltqyOTr/qOeZzfn+hw/fuQj5GppGckMY5psGLETo1U9hcT5MmAhaT5xtusM1b5g==",
"dependencies": {
"System.Text.Encodings.Web": "4.5.0"
}
},
"Microsoft.AspNetCore.Http.Abstractions": { "Microsoft.AspNetCore.Http.Abstractions": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.1.0", "resolved": "2.1.0",
@ -532,28 +516,6 @@
"Microsoft.Extensions.Primitives": "2.1.0" "Microsoft.Extensions.Primitives": "2.1.0"
} }
}, },
"Microsoft.AspNetCore.Razor": {
"type": "Transitive",
"resolved": "2.2.0",
"contentHash": "V54PIyDCFl8COnTp9gezNHpUNHk7F9UnerGeZy3UfbnwYvfzbo+ipqQmSgeoESH8e0JvKhRTyQyZquW2EPtCmg==",
"dependencies": {
"Microsoft.AspNetCore.Html.Abstractions": "2.2.0"
}
},
"Microsoft.AspNetCore.Razor.Language": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "6yOBBASGfXMx1fY6hyjvG+oM3eR8vovIehDdEZW7jAV4gKlY4xuAvTm7Iw1fEq7KPunh2VrJwo7oRK1XxUn1OQ=="
},
"Microsoft.AspNetCore.Razor.Runtime": {
"type": "Transitive",
"resolved": "2.2.0",
"contentHash": "7YqK+H61lN6yj9RiQUko7oaOhKtRR9Q/kBcoWNRemhJdTIWOh1OmdvJKzZrMWOlff3BAjejkPQm+0V0qXk+B1w==",
"dependencies": {
"Microsoft.AspNetCore.Html.Abstractions": "2.2.0",
"Microsoft.AspNetCore.Razor": "2.2.0"
}
},
"Microsoft.AspNetCore.TestHost": { "Microsoft.AspNetCore.TestHost": {
"type": "Transitive", "type": "Transitive",
"resolved": "6.0.5", "resolved": "6.0.5",
@ -664,64 +626,6 @@
"resolved": "1.1.0", "resolved": "1.1.0",
"contentHash": "J2G1k+u5unBV+aYcwxo94ip16Rkp65pgWFb0R6zwJipzWNMgvqlWeuI7/+R+e8bob66LnSG+llLJ+z8wI94cHg==" "contentHash": "J2G1k+u5unBV+aYcwxo94ip16Rkp65pgWFb0R6zwJipzWNMgvqlWeuI7/+R+e8bob66LnSG+llLJ+z8wI94cHg=="
}, },
"Microsoft.CodeAnalysis.Analyzers": {
"type": "Transitive",
"resolved": "3.0.0",
"contentHash": "ojG5pGAhTPmjxRGTNvuszO3H8XPZqksDwr9xLd4Ae/JBjZZdl6GuoLk7uLMf+o7yl5wO0TAqoWcEKkEWqrZE5g=="
},
"Microsoft.CodeAnalysis.Common": {
"type": "Transitive",
"resolved": "3.8.0",
"contentHash": "8YTZ7GpsbTdC08DITx7/kwV0k4SC6cbBAFqc13cOm5vKJZcEIAh51tNSyGSkWisMgYCr96B2wb5Zri1bsla3+g==",
"dependencies": {
"Microsoft.CodeAnalysis.Analyzers": "3.0.0",
"System.Collections.Immutable": "5.0.0",
"System.Memory": "4.5.4",
"System.Reflection.Metadata": "5.0.0",
"System.Runtime.CompilerServices.Unsafe": "4.7.1",
"System.Text.Encoding.CodePages": "4.5.1",
"System.Threading.Tasks.Extensions": "4.5.4"
}
},
"Microsoft.CodeAnalysis.CSharp": {
"type": "Transitive",
"resolved": "3.8.0",
"contentHash": "hKqFCUSk9TIMBDjiYMF8/ZfK9p9mzpU+slM73CaCHu4ctfkoqJGHLQhyT8wvrYsIg+ufrUWBF8hcJYmyr5rc5Q==",
"dependencies": {
"Microsoft.CodeAnalysis.Common": "[3.8.0]"
}
},
"Microsoft.CodeAnalysis.CSharp.Workspaces": {
"type": "Transitive",
"resolved": "3.8.0",
"contentHash": "rdEBvPWqe/IIscsnp7OkZ4tQin8khxBcSLyV9tU+sHdw9uW9U0GKL+Dv2rD4voC1bZBaO18Hp+m4Vkyfmaz0OA==",
"dependencies": {
"Humanizer.Core": "2.2.0",
"Microsoft.CodeAnalysis.CSharp": "[3.8.0]",
"Microsoft.CodeAnalysis.Common": "[3.8.0]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[3.8.0]"
}
},
"Microsoft.CodeAnalysis.Razor": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "s4u/6z/MQ35y/egrXf4WgJlUZf5GGvuba9mZ700dH4XxLBrA9Fw9kFZ8uymoATry7hwz5owvFhBVo+2VnoiGRg==",
"dependencies": {
"Microsoft.AspNetCore.Razor.Language": "5.0.0",
"Microsoft.CodeAnalysis.CSharp": "3.7.0",
"Microsoft.CodeAnalysis.Common": "3.7.0"
}
},
"Microsoft.CodeAnalysis.Workspaces.Common": {
"type": "Transitive",
"resolved": "3.8.0",
"contentHash": "GPYVydsmOmScOWDJA1LFky7/MkoXpx1JI3lZJShxC+bvVUvL9zVKE8WDZMLsYJ5MAbry2xkZftdfeMpZ+kvLDQ==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "1.1.1",
"Microsoft.CodeAnalysis.Common": "[3.8.0]",
"System.Composition": "1.0.31"
}
},
"Microsoft.CodeCoverage": { "Microsoft.CodeCoverage": {
"type": "Transitive", "type": "Transitive",
"resolved": "17.1.0", "resolved": "17.1.0",
@ -1307,80 +1211,6 @@
"Newtonsoft.Json": "9.0.1" "Newtonsoft.Json": "9.0.1"
} }
}, },
"Microsoft.VisualStudio.Web.CodeGeneration": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "YUah81QG5q/ViVbr1BZcTbDLNJ5/k84fr+xx3/IoDVJR8KEUm89HmPAGM+FMMyWOjit+CIVpyOq7yEmRBBWXxQ==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "5.0.0",
"Microsoft.VisualStudio.Web.CodeGeneration.EntityFrameworkCore": "5.0.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.Contracts": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "34v6AkkRJykgFq7rHwNbzXBsLFquevLuegM9XDQl2j+wyOfj+ql1++jUR1WdZoPkv04WoM09mD47S3lMzJmHrQ==",
"dependencies": {
"Newtonsoft.Json": "11.0.2",
"System.Collections.Immutable": "1.7.0"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.Core": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "R7mrxvTtv/MiEH42OtHYi/3L0A/vaAH8mwg+3yAyQtVuy6v9CeeVyL30lfTQ7EYV4ezUmuQKFwfjcU6PP0/KSQ==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "5.0.0",
"Microsoft.VisualStudio.Web.CodeGeneration.Templating": "5.0.2",
"Newtonsoft.Json": "11.0.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.Design": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "9eTZV7W+S2iO2AJD03xXyXJZ+Nf71Y25gMXhqyXb8bB63jPfn+VQhV8I1lb6J+NR3jW98m5EB9QBftBSrjgiYQ==",
"dependencies": {
"Microsoft.VisualStudio.Web.CodeGenerators.Mvc": "5.0.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.EntityFrameworkCore": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "f9XeBRS9ICosrCpbO9jnAVMd/ISLhaZgx388XNBjigiyBJuq577J6tQgQWZA8PQTiPj6MKe9HVIW2GnKXDiUrQ==",
"dependencies": {
"Microsoft.VisualStudio.Web.CodeGeneration.Core": "5.0.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.Templating": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "P3z/JZTGP5DhSc8ik4xrimWuCZ2ZaEZ6q7WGgfgmSVibfXxwh2Oo+dtdkiXwq8MNlkrcP0AZAo3+1wowYUzluA==",
"dependencies": {
"Microsoft.AspNetCore.Razor.Language": "5.0.0",
"Microsoft.AspNetCore.Razor.Runtime": "2.2.0",
"Microsoft.CodeAnalysis.CSharp": "3.8.0",
"Microsoft.CodeAnalysis.Razor": "5.0.0",
"Microsoft.VisualStudio.Web.CodeGeneration.Utils": "5.0.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.Utils": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "4zViWGIFeKsGxDmc5xpn2G8kWs2FSHiLOolw85ZPHihDXc2jiFKp7qjA3SRt8U23kR3zeb0vZiFlETxgTHwAUA==",
"dependencies": {
"Microsoft.CodeAnalysis.CSharp.Workspaces": "3.8.0",
"Microsoft.VisualStudio.Web.CodeGeneration.Contracts": "5.0.2",
"Newtonsoft.Json": "11.0.2"
}
},
"Microsoft.VisualStudio.Web.CodeGenerators.Mvc": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "W4Uk2y0oja+4E+XP5d5OFu+ViTEtlqm3a6nYuuC3tjA+lTK6dLaMf0G6WnO4BO18i0kM0l49XjTwwXd5XpjnAQ==",
"dependencies": {
"Microsoft.VisualStudio.Web.CodeGeneration": "5.0.2"
}
},
"Microsoft.Win32.Primitives": { "Microsoft.Win32.Primitives": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.3.0", "resolved": "4.3.0",
@ -2039,102 +1869,6 @@
"System.Threading": "4.3.0" "System.Threading": "4.3.0"
} }
}, },
"System.Composition": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "I+D26qpYdoklyAVUdqwUBrEIckMNjAYnuPJy/h9dsQItpQwVREkDFs4b4tkBza0kT2Yk48Lcfsv2QQ9hWsh9Iw==",
"dependencies": {
"System.Composition.AttributedModel": "1.0.31",
"System.Composition.Convention": "1.0.31",
"System.Composition.Hosting": "1.0.31",
"System.Composition.Runtime": "1.0.31",
"System.Composition.TypedParts": "1.0.31"
}
},
"System.Composition.AttributedModel": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "NHWhkM3ZkspmA0XJEsKdtTt1ViDYuojgSND3yHhTzwxepiwqZf+BCWuvCbjUt4fe0NxxQhUDGJ5km6sLjo9qnQ==",
"dependencies": {
"System.Reflection": "4.3.0",
"System.Runtime": "4.3.0"
}
},
"System.Composition.Convention": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "GLjh2Ju71k6C0qxMMtl4efHa68NmWeIUYh4fkUI8xbjQrEBvFmRwMDFcylT8/PR9SQbeeL48IkFxU/+gd0nYEQ==",
"dependencies": {
"System.Collections": "4.3.0",
"System.Composition.AttributedModel": "1.0.31",
"System.Diagnostics.Debug": "4.3.0",
"System.Diagnostics.Tools": "4.3.0",
"System.Globalization": "4.3.0",
"System.Linq": "4.3.0",
"System.Linq.Expressions": "4.3.0",
"System.Reflection": "4.3.0",
"System.Reflection.Extensions": "4.3.0",
"System.Resources.ResourceManager": "4.3.0",
"System.Runtime": "4.3.0",
"System.Threading": "4.3.0"
}
},
"System.Composition.Hosting": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "fN1bT4RX4vUqjbgoyuJFVUizAl2mYF5VAb+bVIxIYZSSc0BdnX+yGAxcavxJuDDCQ1K+/mdpgyEFc8e9ikjvrg==",
"dependencies": {
"System.Collections": "4.3.0",
"System.Composition.Runtime": "1.0.31",
"System.Diagnostics.Debug": "4.3.0",
"System.Diagnostics.Tools": "4.3.0",
"System.Globalization": "4.3.0",
"System.Linq": "4.3.0",
"System.Linq.Expressions": "4.3.0",
"System.ObjectModel": "4.3.0",
"System.Reflection": "4.3.0",
"System.Reflection.Extensions": "4.3.0",
"System.Resources.ResourceManager": "4.3.0",
"System.Runtime": "4.3.0",
"System.Threading": "4.3.0"
}
},
"System.Composition.Runtime": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "0LEJN+2NVM89CE4SekDrrk5tHV5LeATltkp+9WNYrR+Huiyt0vaCqHbbHtVAjPyeLWIc8dOz/3kthRBj32wGQg==",
"dependencies": {
"System.Collections": "4.3.0",
"System.Diagnostics.Debug": "4.3.0",
"System.Diagnostics.Tools": "4.3.0",
"System.Globalization": "4.3.0",
"System.Linq": "4.3.0",
"System.Reflection": "4.3.0",
"System.Resources.ResourceManager": "4.3.0",
"System.Runtime": "4.3.0"
}
},
"System.Composition.TypedParts": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "0Zae/FtzeFgDBBuILeIbC/T9HMYbW4olAmi8XqqAGosSOWvXfiQLfARZEhiGd0LVXaYgXr0NhxiU1LldRP1fpQ==",
"dependencies": {
"System.Collections": "4.3.0",
"System.Composition.AttributedModel": "1.0.31",
"System.Composition.Hosting": "1.0.31",
"System.Composition.Runtime": "1.0.31",
"System.Diagnostics.Debug": "4.3.0",
"System.Diagnostics.Tools": "4.3.0",
"System.Globalization": "4.3.0",
"System.Linq": "4.3.0",
"System.Linq.Expressions": "4.3.0",
"System.Reflection": "4.3.0",
"System.Reflection.Extensions": "4.3.0",
"System.Resources.ResourceManager": "4.3.0",
"System.Runtime": "4.3.0",
"System.Runtime.Extensions": "4.3.0"
}
},
"System.Configuration.ConfigurationManager": { "System.Configuration.ConfigurationManager": {
"type": "Transitive", "type": "Transitive",
"resolved": "6.0.0", "resolved": "6.0.0",
@ -2800,8 +2534,8 @@
}, },
"System.Reflection.Metadata": { "System.Reflection.Metadata": {
"type": "Transitive", "type": "Transitive",
"resolved": "5.0.0", "resolved": "1.6.0",
"contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ=="
}, },
"System.Reflection.Primitives": { "System.Reflection.Primitives": {
"type": "Transitive", "type": "Transitive",
@ -3445,109 +3179,108 @@
"common": { "common": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoFixture.AutoNSubstitute": "[4.17.0, )", "AutoFixture.AutoNSubstitute": "4.17.0",
"AutoFixture.Xunit2": "[4.17.0, )", "AutoFixture.Xunit2": "4.17.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Kralizek.AutoFixture.Extensions.MockHttp": "[1.2.0, )", "Kralizek.AutoFixture.Extensions.MockHttp": "1.2.0",
"Microsoft.NET.Test.Sdk": "[17.1.0, )", "Microsoft.NET.Test.Sdk": "17.1.0",
"NSubstitute": "[4.3.0, )", "NSubstitute": "4.3.0",
"xunit": "[2.4.1, )" "xunit": "2.4.1"
} }
}, },
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
}, },
"identity": { "identity": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"SharedWeb": "[2023.2.0, )", "SharedWeb": "2023.2.2",
"Swashbuckle.AspNetCore.SwaggerGen": "[6.5.0, )" "Swashbuckle.AspNetCore.SwaggerGen": "6.5.0"
} }
}, },
"infrastructure.dapper": { "infrastructure.dapper": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Dapper": "[2.0.123, )" "Dapper": "2.0.123"
} }
}, },
"infrastructure.entityframework": { "infrastructure.entityframework": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoMapper.Extensions.Microsoft.DependencyInjection": "[11.0.0, )", "AutoMapper.Extensions.Microsoft.DependencyInjection": "11.0.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Microsoft.EntityFrameworkCore.Relational": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Relational": "6.0.12",
"Microsoft.EntityFrameworkCore.SqlServer": "[6.0.12, )", "Microsoft.EntityFrameworkCore.SqlServer": "6.0.12",
"Microsoft.EntityFrameworkCore.Sqlite": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Sqlite": "6.0.12",
"Npgsql.EntityFrameworkCore.PostgreSQL": "[6.0.8, )", "Npgsql.EntityFrameworkCore.PostgreSQL": "6.0.8",
"Pomelo.EntityFrameworkCore.MySql": "[6.0.2, )", "Pomelo.EntityFrameworkCore.MySql": "6.0.2",
"linq2db.EntityFrameworkCore": "[6.11.0, )" "linq2db.EntityFrameworkCore": "6.11.0"
} }
}, },
"integrationtestcommon": { "integrationtestcommon": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Common": "[2023.2.0, )", "Common": "2023.2.2",
"Identity": "[2023.2.0, )", "Identity": "2023.2.2",
"Microsoft.AspNetCore.Mvc.Testing": "[6.0.5, )", "Microsoft.AspNetCore.Mvc.Testing": "6.0.5",
"Microsoft.EntityFrameworkCore.InMemory": "[6.0.5, )", "Microsoft.EntityFrameworkCore.InMemory": "6.0.5",
"Microsoft.Extensions.Configuration": "[6.0.1, )" "Microsoft.Extensions.Configuration": "6.0.1"
} }
}, },
"scim": { "scim": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Microsoft.VisualStudio.Web.CodeGeneration.Design": "[5.0.2, )", "SharedWeb": "2023.2.2"
"SharedWeb": "[2023.2.0, )"
} }
}, },
"sharedweb": { "sharedweb": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Infrastructure.Dapper": "[2023.2.0, )", "Infrastructure.Dapper": "2023.2.2",
"Infrastructure.EntityFramework": "[2023.2.0, )" "Infrastructure.EntityFramework": "2023.2.2"
} }
} }
} }

View File

@ -284,14 +284,6 @@
"Microsoft.CSharp": "4.7.0" "Microsoft.CSharp": "4.7.0"
} }
}, },
"Humanizer.Core": {
"type": "Transitive",
"resolved": "2.2.0",
"contentHash": "rsYXB7+iUPP8AHgQ8JP2UZI2xK2KhjcdGr9E6zX3CsZaTLCaw8M35vaAJRo1rfxeaZEVMuXeaquLVCkZ7JcZ5Q==",
"dependencies": {
"NETStandard.Library": "1.6.1"
}
},
"IdentityModel": { "IdentityModel": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.4.0", "resolved": "4.4.0",
@ -495,14 +487,6 @@
"Microsoft.Extensions.Configuration.Abstractions": "2.1.0" "Microsoft.Extensions.Configuration.Abstractions": "2.1.0"
} }
}, },
"Microsoft.AspNetCore.Html.Abstractions": {
"type": "Transitive",
"resolved": "2.2.0",
"contentHash": "Y4rs5aMEXY8G7wJo5S3EEt6ltqyOTr/qOeZzfn+hw/fuQj5GppGckMY5psGLETo1U9hcT5MmAhaT5xtusM1b5g==",
"dependencies": {
"System.Text.Encodings.Web": "4.5.0"
}
},
"Microsoft.AspNetCore.Http.Abstractions": { "Microsoft.AspNetCore.Http.Abstractions": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.1.0", "resolved": "2.1.0",
@ -520,28 +504,6 @@
"Microsoft.Extensions.Primitives": "2.1.0" "Microsoft.Extensions.Primitives": "2.1.0"
} }
}, },
"Microsoft.AspNetCore.Razor": {
"type": "Transitive",
"resolved": "2.2.0",
"contentHash": "V54PIyDCFl8COnTp9gezNHpUNHk7F9UnerGeZy3UfbnwYvfzbo+ipqQmSgeoESH8e0JvKhRTyQyZquW2EPtCmg==",
"dependencies": {
"Microsoft.AspNetCore.Html.Abstractions": "2.2.0"
}
},
"Microsoft.AspNetCore.Razor.Language": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "6yOBBASGfXMx1fY6hyjvG+oM3eR8vovIehDdEZW7jAV4gKlY4xuAvTm7Iw1fEq7KPunh2VrJwo7oRK1XxUn1OQ=="
},
"Microsoft.AspNetCore.Razor.Runtime": {
"type": "Transitive",
"resolved": "2.2.0",
"contentHash": "7YqK+H61lN6yj9RiQUko7oaOhKtRR9Q/kBcoWNRemhJdTIWOh1OmdvJKzZrMWOlff3BAjejkPQm+0V0qXk+B1w==",
"dependencies": {
"Microsoft.AspNetCore.Html.Abstractions": "2.2.0",
"Microsoft.AspNetCore.Razor": "2.2.0"
}
},
"Microsoft.Azure.Amqp": { "Microsoft.Azure.Amqp": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.4.11", "resolved": "2.4.11",
@ -644,64 +606,6 @@
"resolved": "1.1.0", "resolved": "1.1.0",
"contentHash": "J2G1k+u5unBV+aYcwxo94ip16Rkp65pgWFb0R6zwJipzWNMgvqlWeuI7/+R+e8bob66LnSG+llLJ+z8wI94cHg==" "contentHash": "J2G1k+u5unBV+aYcwxo94ip16Rkp65pgWFb0R6zwJipzWNMgvqlWeuI7/+R+e8bob66LnSG+llLJ+z8wI94cHg=="
}, },
"Microsoft.CodeAnalysis.Analyzers": {
"type": "Transitive",
"resolved": "3.0.0",
"contentHash": "ojG5pGAhTPmjxRGTNvuszO3H8XPZqksDwr9xLd4Ae/JBjZZdl6GuoLk7uLMf+o7yl5wO0TAqoWcEKkEWqrZE5g=="
},
"Microsoft.CodeAnalysis.Common": {
"type": "Transitive",
"resolved": "3.8.0",
"contentHash": "8YTZ7GpsbTdC08DITx7/kwV0k4SC6cbBAFqc13cOm5vKJZcEIAh51tNSyGSkWisMgYCr96B2wb5Zri1bsla3+g==",
"dependencies": {
"Microsoft.CodeAnalysis.Analyzers": "3.0.0",
"System.Collections.Immutable": "5.0.0",
"System.Memory": "4.5.4",
"System.Reflection.Metadata": "5.0.0",
"System.Runtime.CompilerServices.Unsafe": "4.7.1",
"System.Text.Encoding.CodePages": "4.5.1",
"System.Threading.Tasks.Extensions": "4.5.4"
}
},
"Microsoft.CodeAnalysis.CSharp": {
"type": "Transitive",
"resolved": "3.8.0",
"contentHash": "hKqFCUSk9TIMBDjiYMF8/ZfK9p9mzpU+slM73CaCHu4ctfkoqJGHLQhyT8wvrYsIg+ufrUWBF8hcJYmyr5rc5Q==",
"dependencies": {
"Microsoft.CodeAnalysis.Common": "[3.8.0]"
}
},
"Microsoft.CodeAnalysis.CSharp.Workspaces": {
"type": "Transitive",
"resolved": "3.8.0",
"contentHash": "rdEBvPWqe/IIscsnp7OkZ4tQin8khxBcSLyV9tU+sHdw9uW9U0GKL+Dv2rD4voC1bZBaO18Hp+m4Vkyfmaz0OA==",
"dependencies": {
"Humanizer.Core": "2.2.0",
"Microsoft.CodeAnalysis.CSharp": "[3.8.0]",
"Microsoft.CodeAnalysis.Common": "[3.8.0]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[3.8.0]"
}
},
"Microsoft.CodeAnalysis.Razor": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "s4u/6z/MQ35y/egrXf4WgJlUZf5GGvuba9mZ700dH4XxLBrA9Fw9kFZ8uymoATry7hwz5owvFhBVo+2VnoiGRg==",
"dependencies": {
"Microsoft.AspNetCore.Razor.Language": "5.0.0",
"Microsoft.CodeAnalysis.CSharp": "3.7.0",
"Microsoft.CodeAnalysis.Common": "3.7.0"
}
},
"Microsoft.CodeAnalysis.Workspaces.Common": {
"type": "Transitive",
"resolved": "3.8.0",
"contentHash": "GPYVydsmOmScOWDJA1LFky7/MkoXpx1JI3lZJShxC+bvVUvL9zVKE8WDZMLsYJ5MAbry2xkZftdfeMpZ+kvLDQ==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "1.1.1",
"Microsoft.CodeAnalysis.Common": "[3.8.0]",
"System.Composition": "1.0.31"
}
},
"Microsoft.CodeCoverage": { "Microsoft.CodeCoverage": {
"type": "Transitive", "type": "Transitive",
"resolved": "17.1.0", "resolved": "17.1.0",
@ -1173,80 +1077,6 @@
"Newtonsoft.Json": "9.0.1" "Newtonsoft.Json": "9.0.1"
} }
}, },
"Microsoft.VisualStudio.Web.CodeGeneration": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "YUah81QG5q/ViVbr1BZcTbDLNJ5/k84fr+xx3/IoDVJR8KEUm89HmPAGM+FMMyWOjit+CIVpyOq7yEmRBBWXxQ==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "5.0.0",
"Microsoft.VisualStudio.Web.CodeGeneration.EntityFrameworkCore": "5.0.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.Contracts": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "34v6AkkRJykgFq7rHwNbzXBsLFquevLuegM9XDQl2j+wyOfj+ql1++jUR1WdZoPkv04WoM09mD47S3lMzJmHrQ==",
"dependencies": {
"Newtonsoft.Json": "11.0.2",
"System.Collections.Immutable": "1.7.0"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.Core": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "R7mrxvTtv/MiEH42OtHYi/3L0A/vaAH8mwg+3yAyQtVuy6v9CeeVyL30lfTQ7EYV4ezUmuQKFwfjcU6PP0/KSQ==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "5.0.0",
"Microsoft.VisualStudio.Web.CodeGeneration.Templating": "5.0.2",
"Newtonsoft.Json": "11.0.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.Design": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "9eTZV7W+S2iO2AJD03xXyXJZ+Nf71Y25gMXhqyXb8bB63jPfn+VQhV8I1lb6J+NR3jW98m5EB9QBftBSrjgiYQ==",
"dependencies": {
"Microsoft.VisualStudio.Web.CodeGenerators.Mvc": "5.0.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.EntityFrameworkCore": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "f9XeBRS9ICosrCpbO9jnAVMd/ISLhaZgx388XNBjigiyBJuq577J6tQgQWZA8PQTiPj6MKe9HVIW2GnKXDiUrQ==",
"dependencies": {
"Microsoft.VisualStudio.Web.CodeGeneration.Core": "5.0.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.Templating": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "P3z/JZTGP5DhSc8ik4xrimWuCZ2ZaEZ6q7WGgfgmSVibfXxwh2Oo+dtdkiXwq8MNlkrcP0AZAo3+1wowYUzluA==",
"dependencies": {
"Microsoft.AspNetCore.Razor.Language": "5.0.0",
"Microsoft.AspNetCore.Razor.Runtime": "2.2.0",
"Microsoft.CodeAnalysis.CSharp": "3.8.0",
"Microsoft.CodeAnalysis.Razor": "5.0.0",
"Microsoft.VisualStudio.Web.CodeGeneration.Utils": "5.0.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.Utils": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "4zViWGIFeKsGxDmc5xpn2G8kWs2FSHiLOolw85ZPHihDXc2jiFKp7qjA3SRt8U23kR3zeb0vZiFlETxgTHwAUA==",
"dependencies": {
"Microsoft.CodeAnalysis.CSharp.Workspaces": "3.8.0",
"Microsoft.VisualStudio.Web.CodeGeneration.Contracts": "5.0.2",
"Newtonsoft.Json": "11.0.2"
}
},
"Microsoft.VisualStudio.Web.CodeGenerators.Mvc": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "W4Uk2y0oja+4E+XP5d5OFu+ViTEtlqm3a6nYuuC3tjA+lTK6dLaMf0G6WnO4BO18i0kM0l49XjTwwXd5XpjnAQ==",
"dependencies": {
"Microsoft.VisualStudio.Web.CodeGeneration": "5.0.2"
}
},
"Microsoft.Win32.Primitives": { "Microsoft.Win32.Primitives": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.3.0", "resolved": "4.3.0",
@ -1889,102 +1719,6 @@
"System.Threading": "4.3.0" "System.Threading": "4.3.0"
} }
}, },
"System.Composition": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "I+D26qpYdoklyAVUdqwUBrEIckMNjAYnuPJy/h9dsQItpQwVREkDFs4b4tkBza0kT2Yk48Lcfsv2QQ9hWsh9Iw==",
"dependencies": {
"System.Composition.AttributedModel": "1.0.31",
"System.Composition.Convention": "1.0.31",
"System.Composition.Hosting": "1.0.31",
"System.Composition.Runtime": "1.0.31",
"System.Composition.TypedParts": "1.0.31"
}
},
"System.Composition.AttributedModel": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "NHWhkM3ZkspmA0XJEsKdtTt1ViDYuojgSND3yHhTzwxepiwqZf+BCWuvCbjUt4fe0NxxQhUDGJ5km6sLjo9qnQ==",
"dependencies": {
"System.Reflection": "4.3.0",
"System.Runtime": "4.3.0"
}
},
"System.Composition.Convention": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "GLjh2Ju71k6C0qxMMtl4efHa68NmWeIUYh4fkUI8xbjQrEBvFmRwMDFcylT8/PR9SQbeeL48IkFxU/+gd0nYEQ==",
"dependencies": {
"System.Collections": "4.3.0",
"System.Composition.AttributedModel": "1.0.31",
"System.Diagnostics.Debug": "4.3.0",
"System.Diagnostics.Tools": "4.3.0",
"System.Globalization": "4.3.0",
"System.Linq": "4.3.0",
"System.Linq.Expressions": "4.3.0",
"System.Reflection": "4.3.0",
"System.Reflection.Extensions": "4.3.0",
"System.Resources.ResourceManager": "4.3.0",
"System.Runtime": "4.3.0",
"System.Threading": "4.3.0"
}
},
"System.Composition.Hosting": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "fN1bT4RX4vUqjbgoyuJFVUizAl2mYF5VAb+bVIxIYZSSc0BdnX+yGAxcavxJuDDCQ1K+/mdpgyEFc8e9ikjvrg==",
"dependencies": {
"System.Collections": "4.3.0",
"System.Composition.Runtime": "1.0.31",
"System.Diagnostics.Debug": "4.3.0",
"System.Diagnostics.Tools": "4.3.0",
"System.Globalization": "4.3.0",
"System.Linq": "4.3.0",
"System.Linq.Expressions": "4.3.0",
"System.ObjectModel": "4.3.0",
"System.Reflection": "4.3.0",
"System.Reflection.Extensions": "4.3.0",
"System.Resources.ResourceManager": "4.3.0",
"System.Runtime": "4.3.0",
"System.Threading": "4.3.0"
}
},
"System.Composition.Runtime": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "0LEJN+2NVM89CE4SekDrrk5tHV5LeATltkp+9WNYrR+Huiyt0vaCqHbbHtVAjPyeLWIc8dOz/3kthRBj32wGQg==",
"dependencies": {
"System.Collections": "4.3.0",
"System.Diagnostics.Debug": "4.3.0",
"System.Diagnostics.Tools": "4.3.0",
"System.Globalization": "4.3.0",
"System.Linq": "4.3.0",
"System.Reflection": "4.3.0",
"System.Resources.ResourceManager": "4.3.0",
"System.Runtime": "4.3.0"
}
},
"System.Composition.TypedParts": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "0Zae/FtzeFgDBBuILeIbC/T9HMYbW4olAmi8XqqAGosSOWvXfiQLfARZEhiGd0LVXaYgXr0NhxiU1LldRP1fpQ==",
"dependencies": {
"System.Collections": "4.3.0",
"System.Composition.AttributedModel": "1.0.31",
"System.Composition.Hosting": "1.0.31",
"System.Composition.Runtime": "1.0.31",
"System.Diagnostics.Debug": "4.3.0",
"System.Diagnostics.Tools": "4.3.0",
"System.Globalization": "4.3.0",
"System.Linq": "4.3.0",
"System.Linq.Expressions": "4.3.0",
"System.Reflection": "4.3.0",
"System.Reflection.Extensions": "4.3.0",
"System.Resources.ResourceManager": "4.3.0",
"System.Runtime": "4.3.0",
"System.Runtime.Extensions": "4.3.0"
}
},
"System.Configuration.ConfigurationManager": { "System.Configuration.ConfigurationManager": {
"type": "Transitive", "type": "Transitive",
"resolved": "6.0.0", "resolved": "6.0.0",
@ -2645,8 +2379,8 @@
}, },
"System.Reflection.Metadata": { "System.Reflection.Metadata": {
"type": "Transitive", "type": "Transitive",
"resolved": "5.0.0", "resolved": "1.6.0",
"contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ=="
}, },
"System.Reflection.Primitives": { "System.Reflection.Primitives": {
"type": "Transitive", "type": "Transitive",
@ -3290,91 +3024,90 @@
"common": { "common": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoFixture.AutoNSubstitute": "[4.17.0, )", "AutoFixture.AutoNSubstitute": "4.17.0",
"AutoFixture.Xunit2": "[4.17.0, )", "AutoFixture.Xunit2": "4.17.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Kralizek.AutoFixture.Extensions.MockHttp": "[1.2.0, )", "Kralizek.AutoFixture.Extensions.MockHttp": "1.2.0",
"Microsoft.NET.Test.Sdk": "[17.1.0, )", "Microsoft.NET.Test.Sdk": "17.1.0",
"NSubstitute": "[4.3.0, )", "NSubstitute": "4.3.0",
"xunit": "[2.4.1, )" "xunit": "2.4.1"
} }
}, },
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
}, },
"infrastructure.dapper": { "infrastructure.dapper": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Dapper": "[2.0.123, )" "Dapper": "2.0.123"
} }
}, },
"infrastructure.entityframework": { "infrastructure.entityframework": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoMapper.Extensions.Microsoft.DependencyInjection": "[11.0.0, )", "AutoMapper.Extensions.Microsoft.DependencyInjection": "11.0.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Microsoft.EntityFrameworkCore.Relational": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Relational": "6.0.12",
"Microsoft.EntityFrameworkCore.SqlServer": "[6.0.12, )", "Microsoft.EntityFrameworkCore.SqlServer": "6.0.12",
"Microsoft.EntityFrameworkCore.Sqlite": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Sqlite": "6.0.12",
"Npgsql.EntityFrameworkCore.PostgreSQL": "[6.0.8, )", "Npgsql.EntityFrameworkCore.PostgreSQL": "6.0.8",
"Pomelo.EntityFrameworkCore.MySql": "[6.0.2, )", "Pomelo.EntityFrameworkCore.MySql": "6.0.2",
"linq2db.EntityFrameworkCore": "[6.11.0, )" "linq2db.EntityFrameworkCore": "6.11.0"
} }
}, },
"scim": { "scim": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Microsoft.VisualStudio.Web.CodeGeneration.Design": "[5.0.2, )", "SharedWeb": "2023.2.2"
"SharedWeb": "[2023.2.0, )"
} }
}, },
"sharedweb": { "sharedweb": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Infrastructure.Dapper": "[2023.2.0, )", "Infrastructure.Dapper": "2023.2.2",
"Infrastructure.EntityFramework": "[2023.2.0, )" "Infrastructure.EntityFramework": "2023.2.2"
} }
} }
} }

View File

@ -1,4 +1,4 @@
COMPOSE_PROJECT_NAME=BitwardenServer COMPOSE_PROJECT_NAME=bitwardenserver
# Ensure the MSSQL_PASSWORD is complex and follows the password policy defined at # Ensure the MSSQL_PASSWORD is complex and follows the password policy defined at
# https://docs.microsoft.com/en-us/sql/relational-databases/security/password-policy?view=sql-server-ver15 # https://docs.microsoft.com/en-us/sql/relational-databases/security/password-policy?view=sql-server-ver15
MSSQL_PASSWORD=SET_A_PASSWORD_HERE_123 MSSQL_PASSWORD=SET_A_PASSWORD_HERE_123

View File

@ -4,7 +4,7 @@ services:
mssql: mssql:
image: mcr.microsoft.com/azure-sql-edge:latest image: mcr.microsoft.com/azure-sql-edge:latest
environment: environment:
ACCEPT_EULA: Y ACCEPT_EULA: "Y"
MSSQL_SA_PASSWORD: ${MSSQL_PASSWORD} MSSQL_SA_PASSWORD: ${MSSQL_PASSWORD}
MSSQL_PID: Developer MSSQL_PID: Developer
volumes: volumes:
@ -13,7 +13,7 @@ services:
- ./helpers/mssql:/mnt/helpers - ./helpers/mssql:/mnt/helpers
- ./.data/mssql:/mnt/data - ./.data/mssql:/mnt/data
ports: ports:
- '1433:1433' - "1433:1433"
profiles: profiles:
- cloud - cloud
- mssql - mssql
@ -90,8 +90,8 @@ services:
volumes: volumes:
- ./directory.ldif:/container/service/slapd/assets/config/bootstrap/ldif/output.ldif - ./directory.ldif:/container/service/slapd/assets/config/bootstrap/ldif/output.ldif
ports: ports:
- '389:389' - "389:389"
- '636:636' - "636:636"
profiles: profiles:
- ldap - ldap

View File

@ -2711,43 +2711,43 @@
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
} }
} }

View File

@ -23,7 +23,6 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.26.1" /> <PackageReference Include="Microsoft.Azure.Cosmos" Version="3.26.1" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="$(MicrosoftVisualStudioWebCodeGenerationDesignVersion)" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -27,6 +27,7 @@ public class ToolsController : Controller
private readonly IPaymentService _paymentService; private readonly IPaymentService _paymentService;
private readonly ITaxRateRepository _taxRateRepository; private readonly ITaxRateRepository _taxRateRepository;
private readonly IStripeAdapter _stripeAdapter; private readonly IStripeAdapter _stripeAdapter;
private readonly IWebHostEnvironment _environment;
public ToolsController( public ToolsController(
GlobalSettings globalSettings, GlobalSettings globalSettings,
@ -38,7 +39,8 @@ public class ToolsController : Controller
IOrganizationUserRepository organizationUserRepository, IOrganizationUserRepository organizationUserRepository,
ITaxRateRepository taxRateRepository, ITaxRateRepository taxRateRepository,
IPaymentService paymentService, IPaymentService paymentService,
IStripeAdapter stripeAdapter) IStripeAdapter stripeAdapter,
IWebHostEnvironment environment)
{ {
_globalSettings = globalSettings; _globalSettings = globalSettings;
_organizationRepository = organizationRepository; _organizationRepository = organizationRepository;
@ -50,6 +52,7 @@ public class ToolsController : Controller
_taxRateRepository = taxRateRepository; _taxRateRepository = taxRateRepository;
_paymentService = paymentService; _paymentService = paymentService;
_stripeAdapter = stripeAdapter; _stripeAdapter = stripeAdapter;
_environment = environment;
} }
public IActionResult ChargeBraintree() public IActionResult ChargeBraintree()
@ -450,11 +453,12 @@ public class ToolsController : Controller
subscriptions.FirstOrDefault()?.Id : subscriptions.FirstOrDefault()?.Id :
null; null;
var isProduction = _environment.IsProduction();
var model = new StripeSubscriptionsModel() var model = new StripeSubscriptionsModel()
{ {
Items = subscriptions.Select(s => new StripeSubscriptionRowModel(s)).ToList(), Items = subscriptions.Select(s => new StripeSubscriptionRowModel(s)).ToList(),
Prices = (await _stripeAdapter.PriceListAsync(new Stripe.PriceListOptions() { Limit = 100 })).Data, Prices = (await _stripeAdapter.PriceListAsync(new Stripe.PriceListOptions() { Limit = 100 })).Data,
TestClocks = await _stripeAdapter.TestClockListAsync(), TestClocks = isProduction ? new List<Stripe.TestHelpers.TestClock>() : await _stripeAdapter.TestClockListAsync(),
Filter = options Filter = options
}; };
return View(model); return View(model);
@ -465,8 +469,9 @@ public class ToolsController : Controller
{ {
if (!ModelState.IsValid) if (!ModelState.IsValid)
{ {
var isProduction = _environment.IsProduction();
model.Prices = (await _stripeAdapter.PriceListAsync(new Stripe.PriceListOptions() { Limit = 100 })).Data; model.Prices = (await _stripeAdapter.PriceListAsync(new Stripe.PriceListOptions() { Limit = 100 })).Data;
model.TestClocks = await _stripeAdapter.TestClockListAsync(); model.TestClocks = isProduction ? new List<Stripe.TestHelpers.TestClock>() : await _stripeAdapter.TestClockListAsync();
return View(model); return View(model);
} }

View File

@ -22,18 +22,6 @@
"System.ValueTuple": "4.5.0" "System.ValueTuple": "4.5.0"
} }
}, },
"Microsoft.VisualStudio.Web.CodeGeneration.Design": {
"type": "Direct",
"requested": "[6.0.3, )",
"resolved": "6.0.3",
"contentHash": "cqxm2k5KF7T0KejRlxt71aizeR+2a/9qk94c1p7/CCOjns4cgwL92IxyrhhpILn0U+kylslBE2O/AJoi28wkSA==",
"dependencies": {
"Microsoft.Build.Locator": "1.4.1",
"Microsoft.DotNet.Scaffolding.Shared": "6.0.3",
"Microsoft.VisualStudio.Web.CodeGenerators.Mvc": "6.0.3",
"System.Private.Uri": "4.3.2"
}
},
"AspNetCoreRateLimit": { "AspNetCoreRateLimit": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.0.2", "resolved": "4.0.2",
@ -241,14 +229,6 @@
"Microsoft.CSharp": "4.7.0" "Microsoft.CSharp": "4.7.0"
} }
}, },
"Humanizer.Core": {
"type": "Transitive",
"resolved": "2.2.0",
"contentHash": "rsYXB7+iUPP8AHgQ8JP2UZI2xK2KhjcdGr9E6zX3CsZaTLCaw8M35vaAJRo1rfxeaZEVMuXeaquLVCkZ7JcZ5Q==",
"dependencies": {
"NETStandard.Library": "1.6.1"
}
},
"IdentityModel": { "IdentityModel": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.4.0", "resolved": "4.4.0",
@ -374,30 +354,6 @@
"MimeKit": "3.2.0" "MimeKit": "3.2.0"
} }
}, },
"MessagePack": {
"type": "Transitive",
"resolved": "2.1.152",
"contentHash": "PlJ31qf42uGuJfwc61x/Pt4hJi01xh1rrBofj1MJSLzEot/2UAIRdSgxEHN/8qou5CV8OBeDM9HXKPi1Oj8rpQ==",
"dependencies": {
"MessagePack.Annotations": "2.1.152",
"Microsoft.Bcl.AsyncInterfaces": "1.0.0",
"System.Memory": "4.5.3",
"System.Reflection.Emit": "4.6.0",
"System.Reflection.Emit.Lightweight": "4.6.0",
"System.Runtime.CompilerServices.Unsafe": "4.5.2",
"System.Threading.Tasks.Extensions": "4.5.3"
}
},
"MessagePack.Annotations": {
"type": "Transitive",
"resolved": "2.1.152",
"contentHash": "RONktDA/HA641ds/2bfOqYSVew8o8EJMcQ1P4M1J77QGgbzWiWt3nBHvCAwlx0VfO6K9S8xq4b5OLD2CUnhtCg=="
},
"MessagePackAnalyzer": {
"type": "Transitive",
"resolved": "2.1.152",
"contentHash": "uJhZlGMkXDaFYsH8V9S6o1EyvsUqB9mpU4DVBXNr0DXZVzZMhuLP1IkLj5xK3EKlaAcvkFkZv3eSvuz360wb3Q=="
},
"Microsoft.AspNetCore.Authentication.JwtBearer": { "Microsoft.AspNetCore.Authentication.JwtBearer": {
"type": "Transitive", "type": "Transitive",
"resolved": "6.0.4", "resolved": "6.0.4",
@ -484,11 +440,6 @@
"Microsoft.Extensions.Primitives": "2.1.0" "Microsoft.Extensions.Primitives": "2.1.0"
} }
}, },
"Microsoft.AspNetCore.Razor.Language": {
"type": "Transitive",
"resolved": "6.0.0",
"contentHash": "yCtBr1GSGzJrrp1NJUb4ltwFYMKHw/tJLnIDvg9g/FnkGIEzmE19tbCQqXARIJv5kdtBgsoVIdGLL+zmjxvM/A=="
},
"Microsoft.Azure.Amqp": { "Microsoft.Azure.Amqp": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.4.11", "resolved": "2.4.11",
@ -563,196 +514,14 @@
}, },
"Microsoft.Bcl.AsyncInterfaces": { "Microsoft.Bcl.AsyncInterfaces": {
"type": "Transitive", "type": "Transitive",
"resolved": "5.0.0", "resolved": "1.1.1",
"contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ==" "contentHash": "yuvf07qFWFqtK3P/MRkEKLhn5r2UbSpVueRziSqj0yJQIKFwG1pq9mOayK3zE5qZCTs0CbrwL9M6R8VwqyGy2w=="
}, },
"Microsoft.Bcl.HashCode": { "Microsoft.Bcl.HashCode": {
"type": "Transitive", "type": "Transitive",
"resolved": "1.1.0", "resolved": "1.1.0",
"contentHash": "J2G1k+u5unBV+aYcwxo94ip16Rkp65pgWFb0R6zwJipzWNMgvqlWeuI7/+R+e8bob66LnSG+llLJ+z8wI94cHg==" "contentHash": "J2G1k+u5unBV+aYcwxo94ip16Rkp65pgWFb0R6zwJipzWNMgvqlWeuI7/+R+e8bob66LnSG+llLJ+z8wI94cHg=="
}, },
"Microsoft.Build": {
"type": "Transitive",
"resolved": "17.0.0",
"contentHash": "hCs9OzyCD/TYRid1LxPgghvUDqgXf+tEvV4qd8tBfOyp3zxAk+/rssgxtJnKLMZIu0CEZi3JegvfenaIXjEacQ==",
"dependencies": {
"Microsoft.Build.Framework": "17.0.0",
"Microsoft.NET.StringTools": "1.0.0",
"Microsoft.Win32.Registry": "4.3.0",
"System.Collections.Immutable": "5.0.0",
"System.Configuration.ConfigurationManager": "4.7.0",
"System.Reflection.Metadata": "1.6.0",
"System.Security.Principal.Windows": "4.7.0",
"System.Text.Encoding.CodePages": "4.0.1",
"System.Text.Json": "5.0.2",
"System.Threading.Tasks.Dataflow": "4.9.0"
}
},
"Microsoft.Build.Framework": {
"type": "Transitive",
"resolved": "17.0.0",
"contentHash": "XbFA0z+6Ws2pNeRXYcDF3lKlNgRoSGMm2Q5HKzZD+EbwYMKPKrl/BJnnkMuDJHU0KravYHfhzBnLLJpPeZ3E7A==",
"dependencies": {
"System.Security.Permissions": "4.7.0"
}
},
"Microsoft.Build.Locator": {
"type": "Transitive",
"resolved": "1.4.1",
"contentHash": "UfyGaxNTjw/r3uWMX/Cv1CPKELo7TCrR5VIahaSKL0WyqmbDT6og9pyjwuhyyUkxC9gk2ElB7oOEySL1OzTZ1g=="
},
"Microsoft.CodeAnalysis.Analyzers": {
"type": "Transitive",
"resolved": "3.3.2",
"contentHash": "7xt6zTlIEizUgEsYAIgm37EbdkiMmr6fP6J9pDoKEpiGM4pi32BCPGr/IczmSJI9Zzp0a6HOzpr9OvpMP+2veA=="
},
"Microsoft.CodeAnalysis.AnalyzerUtilities": {
"type": "Transitive",
"resolved": "3.3.0",
"contentHash": "gyQ70pJ4T7hu/s0+QnEaXtYfeG/JrttGnxHJlrhpxsQjRIUGuRhVwNBtkHHYOrUAZ/l47L98/NiJX6QmTwAyrg=="
},
"Microsoft.CodeAnalysis.Common": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "d02ybMhUJl1r/dI6SkJPHrTiTzXBYCZeJdOLMckV+jyoMU/GGkjqFX/sRbv1K0QmlpwwKuLTiYVQvfYC+8ox2g==",
"dependencies": {
"Microsoft.CodeAnalysis.Analyzers": "3.3.2",
"System.Collections.Immutable": "5.0.0",
"System.Memory": "4.5.4",
"System.Reflection.Metadata": "5.0.0",
"System.Runtime.CompilerServices.Unsafe": "5.0.0",
"System.Text.Encoding.CodePages": "4.5.1",
"System.Threading.Tasks.Extensions": "4.5.4"
}
},
"Microsoft.CodeAnalysis.CSharp": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "2UVTGtyQGgTCazvnT6t82f+7AV2L+kqJdyb61rT9GQed4yK+tVh5IkaKcsm70VqyZQhBbDqsfZFNHnY65xhrRw==",
"dependencies": {
"Microsoft.CodeAnalysis.Common": "[4.0.0]"
}
},
"Microsoft.CodeAnalysis.CSharp.Features": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "WOTeKJN0I4/AzylA+VuTtB7V7VvnM41GXqnyiiDRNa3QtKFAzJbQ7CwLG97pcme+oQLz708z+s4Nzd9g0irytw==",
"dependencies": {
"Humanizer.Core": "2.2.0",
"Microsoft.CodeAnalysis.CSharp": "[4.0.0]",
"Microsoft.CodeAnalysis.CSharp.Workspaces": "[4.0.0]",
"Microsoft.CodeAnalysis.Common": "[4.0.0]",
"Microsoft.CodeAnalysis.Features": "[4.0.0]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[4.0.0]"
}
},
"Microsoft.CodeAnalysis.CSharp.Scripting": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "Z8Y8Ye2snCqVQLLx7K6FcEs0hcvdPi4nTG2RDWdPpOfMH8ed1yxTabt252qAd4TH0jpyruuCnBfW4s6DXliMYg==",
"dependencies": {
"Microsoft.CSharp": "4.3.0",
"Microsoft.CodeAnalysis.CSharp": "[4.0.0]",
"Microsoft.CodeAnalysis.Common": "[4.0.0]",
"Microsoft.CodeAnalysis.Scripting.Common": "[4.0.0]"
}
},
"Microsoft.CodeAnalysis.CSharp.Workspaces": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "RQMc1+2cIRdOvY8vp6ygkzfBrvlYphnbmhhluKNh9+X+PpprQDKlbPrn9fLn6v9RlCsfa87joS3zJyGBEeWTXQ==",
"dependencies": {
"Humanizer.Core": "2.2.0",
"Microsoft.CodeAnalysis.CSharp": "[4.0.0]",
"Microsoft.CodeAnalysis.Common": "[4.0.0]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[4.0.0]"
}
},
"Microsoft.CodeAnalysis.Features": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "ci4pgjEgihb+fu2i1E12iOMGXU6GisYR3YrNd2aqt55ijjzLNqPV/+zt+cV3Qc0n08rJrIY2Bf6cTTMPY0bwJQ==",
"dependencies": {
"Microsoft.CodeAnalysis.AnalyzerUtilities": "3.3.0",
"Microsoft.CodeAnalysis.Common": "[4.0.0]",
"Microsoft.CodeAnalysis.Scripting.Common": "[4.0.0]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[4.0.0]",
"Microsoft.DiaSymReader": "1.3.0",
"Microsoft.VisualStudio.Debugger.Contracts": "17.2.0",
"System.Threading.Tasks.Extensions": "4.5.4"
}
},
"Microsoft.CodeAnalysis.Razor": {
"type": "Transitive",
"resolved": "6.0.0",
"contentHash": "uqdzuQXxD7XrJCbIbbwpI/LOv0PBJ9VIR0gdvANTHOfK5pjTaCir+XcwvYvBZ5BIzd0KGzyiamzlEWw1cK1q0w==",
"dependencies": {
"Microsoft.AspNetCore.Razor.Language": "6.0.0",
"Microsoft.CodeAnalysis.CSharp": "4.0.0",
"Microsoft.CodeAnalysis.Common": "4.0.0"
}
},
"Microsoft.CodeAnalysis.Scripting.Common": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "jU/ncoHSFnXU/L2iju9AFlOwmsAYByIxhCCpeLPNTguXwosJp1o13mtrboJOfkDhi7ebvzQmvcZ++yBu8cF4Sw==",
"dependencies": {
"Microsoft.CodeAnalysis.Common": "[4.0.0]"
}
},
"Microsoft.CodeAnalysis.VisualBasic": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "FK+OGUMUh9O6/GCwyIy4c/sOrarF36/yEY07BbXVYMql1qCqHGWfyWXyCQKQ6m/KqReCqW6aO4cK7kK/AYBpyA==",
"dependencies": {
"Microsoft.CodeAnalysis.Common": "[4.0.0]"
}
},
"Microsoft.CodeAnalysis.VisualBasic.Features": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "GEJsXFcMd7o+D6OYCLPui2ZvNsonTmdPSluGK0wC3EXVB+gnrro7Lr/sjtTSOwVeiXPlhXgprRuO7zJiMn1uzw==",
"dependencies": {
"Microsoft.CodeAnalysis.Common": "[4.0.0]",
"Microsoft.CodeAnalysis.Features": "[4.0.0]",
"Microsoft.CodeAnalysis.VisualBasic": "[4.0.0]",
"Microsoft.CodeAnalysis.VisualBasic.Workspaces": "[4.0.0]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[4.0.0]"
}
},
"Microsoft.CodeAnalysis.VisualBasic.Workspaces": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "ozmB/thXGX5MoP/oiV9w5ZVGS08mz7fK3lRXiRSHHBeuiXZW1ZCGARwG2YkhylzAl1LlEwSQmlgrr8Irlu+3qQ==",
"dependencies": {
"Microsoft.CodeAnalysis.Common": "[4.0.0]",
"Microsoft.CodeAnalysis.VisualBasic": "[4.0.0]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[4.0.0]"
}
},
"Microsoft.CodeAnalysis.Workspaces.Common": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "bEfHzx8PLmEN6aogVYHWmViHCWfms8emI43w9nNX+C8MLgtynOmVL/OJ4hbuONVp+4OuDAy5BDj69n5MnXQX8g==",
"dependencies": {
"Humanizer.Core": "2.2.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
"Microsoft.CodeAnalysis.Common": "[4.0.0]",
"System.Composition": "1.0.31",
"System.IO.Pipelines": "5.0.1"
}
},
"Microsoft.CodeAnalysis.Workspaces.MSBuild": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "0LYNKESZPK4AQmAXwn8l2e8UF/rYpT0pvceEhiTVjurjQ9Y7pGdUZ5E30r8knxYtT5/9ZESR7wKf/AU00r95Mw==",
"dependencies": {
"Microsoft.Build.Framework": "16.5.0",
"Microsoft.CodeAnalysis.Common": "[4.0.0]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[4.0.0]",
"System.Text.Json": "4.7.0"
}
},
"Microsoft.CSharp": { "Microsoft.CSharp": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.7.0", "resolved": "4.7.0",
@ -795,32 +564,6 @@
"SQLitePCLRaw.core": "2.1.2" "SQLitePCLRaw.core": "2.1.2"
} }
}, },
"Microsoft.DiaSymReader": {
"type": "Transitive",
"resolved": "1.3.0",
"contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==",
"dependencies": {
"NETStandard.Library": "1.6.1"
}
},
"Microsoft.DotNet.Scaffolding.Shared": {
"type": "Transitive",
"resolved": "6.0.3",
"contentHash": "MHPcl+Vm8tEyvCA0dSEMDd/DfEYW2VtkGs7DXEJBbeRToBmHoK/5djIQws4XWcdqcpuJNo1WqX+C35h7Y5G26w==",
"dependencies": {
"Microsoft.CodeAnalysis.CSharp.Features": "4.0.0",
"Microsoft.CodeAnalysis.CSharp.Scripting": "4.0.0",
"Microsoft.CodeAnalysis.CSharp.Workspaces": "4.0.0",
"Microsoft.CodeAnalysis.Features": "4.0.0",
"Microsoft.CodeAnalysis.VisualBasic.Features": "4.0.0",
"Microsoft.CodeAnalysis.VisualBasic.Workspaces": "4.0.0",
"Microsoft.CodeAnalysis.Workspaces.MSBuild": "4.0.0",
"Newtonsoft.Json": "13.0.1",
"NuGet.ProjectModel": "5.11.0",
"System.Collections.Immutable": "6.0.0",
"System.Private.Uri": "4.3.2"
}
},
"Microsoft.EntityFrameworkCore": { "Microsoft.EntityFrameworkCore": {
"type": "Transitive", "type": "Transitive",
"resolved": "6.0.12", "resolved": "6.0.12",
@ -1203,15 +946,6 @@
"System.Security.Cryptography.Cng": "4.5.0" "System.Security.Cryptography.Cng": "4.5.0"
} }
}, },
"Microsoft.NET.StringTools": {
"type": "Transitive",
"resolved": "1.0.0",
"contentHash": "ZYVcoDM0LnSyT5nWoRGfShYdOecCw2sOXWwP6j1Z0u48Xq3+BVvZ+EiPCX9/8Gz439giW+O1H1kWF9Eb/w6rVg==",
"dependencies": {
"System.Memory": "4.5.4",
"System.Runtime.CompilerServices.Unsafe": "5.0.0"
}
},
"Microsoft.NETCore.Platforms": { "Microsoft.NETCore.Platforms": {
"type": "Transitive", "type": "Transitive",
"resolved": "5.0.0", "resolved": "5.0.0",
@ -1246,84 +980,6 @@
"resolved": "1.0.0", "resolved": "1.0.0",
"contentHash": "N4KeF3cpcm1PUHym1RmakkzfkEv3GRMyofVv40uXsQhCQeglr2OHNcUk2WOG51AKpGO8ynGpo9M/kFXSzghwug==" "contentHash": "N4KeF3cpcm1PUHym1RmakkzfkEv3GRMyofVv40uXsQhCQeglr2OHNcUk2WOG51AKpGO8ynGpo9M/kFXSzghwug=="
}, },
"Microsoft.VisualStudio.Debugger.Contracts": {
"type": "Transitive",
"resolved": "17.2.0",
"contentHash": "br/qV/aHqLqVlqtcMKglCC8MHMMLey0yMkKSplnMl58F5gKjwnh7wjs8+g0j/vf4T6h4KK7JWrC0+oN70pbugg==",
"dependencies": {
"MessagePack": "2.1.152",
"MessagePackAnalyzer": "2.1.152",
"Microsoft.Bcl.AsyncInterfaces": "1.1.1",
"System.Collections.Immutable": "5.0.0"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration": {
"type": "Transitive",
"resolved": "6.0.3",
"contentHash": "rD1Lj6LljO7iEeZJuGtEp0O9rZHvr+tAZJx8QgwdmlrMReaYA0+KQCH/woEdcmBo+ifnwUUyNgG+9NUECYTT9g==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "6.0.0",
"Microsoft.VisualStudio.Web.CodeGeneration.EntityFrameworkCore": "6.0.3",
"System.Collections.Immutable": "6.0.0",
"System.Private.Uri": "4.3.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.Core": {
"type": "Transitive",
"resolved": "6.0.3",
"contentHash": "o+rN2+WrG4NTU4dzcExaMAGpQk84+SJMC8D3v7pe35f6DJQIXC3lc9V9npgNtiiD19aP+Pdto8L5nuwQ83dgTw==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "6.0.0",
"Microsoft.VisualStudio.Web.CodeGeneration.Templating": "6.0.3",
"Newtonsoft.Json": "13.0.1",
"System.Private.Uri": "4.3.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.EntityFrameworkCore": {
"type": "Transitive",
"resolved": "6.0.3",
"contentHash": "Mg0HpwFZyOJQHtW04gbCLekZ8Lt3VSs9s9JqgGm6DXoeTbAbaHhJGZohuT296Z+0MuFJgl9mD1/j1Zof8hPgcA==",
"dependencies": {
"Microsoft.DotNet.Scaffolding.Shared": "6.0.3",
"Microsoft.VisualStudio.Web.CodeGeneration.Core": "6.0.3",
"System.Private.Uri": "4.3.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.Templating": {
"type": "Transitive",
"resolved": "6.0.3",
"contentHash": "TMV1xzJSjNpiWCGkw6/8/XHmYF0HiimH/8kmPZfT/J+WBKABn4DRbZNpgTYNKmcuYxg4mKySFPVpblQ0XMf9Tg==",
"dependencies": {
"Microsoft.AspNetCore.Razor.Language": "6.0.0",
"Microsoft.CodeAnalysis.CSharp": "4.0.0",
"Microsoft.CodeAnalysis.Razor": "6.0.0",
"Microsoft.VisualStudio.Web.CodeGeneration.Utils": "6.0.3",
"System.Private.Uri": "4.3.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.Utils": {
"type": "Transitive",
"resolved": "6.0.3",
"contentHash": "M8k06jnZ0l7031mPYDbLaiiz20ju1MP+FJlpDKVilkAPOQVITSFRDm8Hhd2Pyd+BSj+nCzDC1ZMglK8z+lJ5ig==",
"dependencies": {
"Microsoft.Build": "17.0.0",
"Microsoft.Build.Locator": "1.4.1",
"Microsoft.CodeAnalysis.CSharp.Workspaces": "4.0.0",
"Microsoft.DotNet.Scaffolding.Shared": "6.0.3",
"Newtonsoft.Json": "13.0.1",
"System.Private.Uri": "4.3.2"
}
},
"Microsoft.VisualStudio.Web.CodeGenerators.Mvc": {
"type": "Transitive",
"resolved": "6.0.3",
"contentHash": "Oe3QkXildc2AFM33rN9WSLj53kzuQAPLAv7aduz+bnYc86SFBPA/qpYZ2ZJhlKYbrJUpztRqoWvLqGfDT6XkUw==",
"dependencies": {
"Microsoft.DotNet.Scaffolding.Shared": "6.0.3",
"Microsoft.VisualStudio.Web.CodeGeneration": "6.0.3",
"System.Private.Uri": "4.3.2"
}
},
"Microsoft.Win32.Primitives": { "Microsoft.Win32.Primitives": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.3.0", "resolved": "4.3.0",
@ -1445,79 +1101,6 @@
"libsodium": "[1.0.18.2, 1.0.19)" "libsodium": "[1.0.18.2, 1.0.19)"
} }
}, },
"NuGet.Common": {
"type": "Transitive",
"resolved": "5.11.0",
"contentHash": "WCHexQBfSqBDRqP3PSDSUw7YM+PwuvMHGAkT/sXI5UHze4T41yLE+VB/km2Fe0z9y3m2mudcr2djFZezivjMJw==",
"dependencies": {
"NuGet.Frameworks": "5.11.0"
}
},
"NuGet.Configuration": {
"type": "Transitive",
"resolved": "5.11.0",
"contentHash": "NqsQe198CTHoo7NMrKQL8utd6n9yVb9CPgJmpyF6kpEsLFo/9r0wqGL3ln8Mtcz8yuJpOPWFQEoOlzDzu3LfUg==",
"dependencies": {
"NuGet.Common": "5.11.0",
"System.Security.Cryptography.ProtectedData": "4.4.0"
}
},
"NuGet.DependencyResolver.Core": {
"type": "Transitive",
"resolved": "5.11.0",
"contentHash": "kkWhU0msuCRyiIJeoL95j6bXUQMc1mTk8wZ3mMxl+0VzOf39eXSObmxKuJ7eh+6zOMQyzd0TAXU5u5aQSxOVSg==",
"dependencies": {
"NuGet.LibraryModel": "5.11.0",
"NuGet.Protocol": "5.11.0"
}
},
"NuGet.Frameworks": {
"type": "Transitive",
"resolved": "5.11.0",
"contentHash": "eaiXkUjC4NPcquGWzAGMXjuxvLwc6XGKMptSyOGQeT0X70BUZObuybJFZLA0OfTdueLd3US23NBPTBb6iF3V1Q=="
},
"NuGet.LibraryModel": {
"type": "Transitive",
"resolved": "5.11.0",
"contentHash": "Iq0tbX3Rsl4837VlWy90fliA7T2+g2FPdz/s/lK6H9g/5RCta/7AZADV0l/A/f0HDCDlMxBN2ha1hsmgxe1sGQ==",
"dependencies": {
"NuGet.Common": "5.11.0",
"NuGet.Versioning": "5.11.0"
}
},
"NuGet.Packaging": {
"type": "Transitive",
"resolved": "5.11.0",
"contentHash": "knlpQuqTL8BEXUHTdZ9Wlz3pjck5nv0OYsCpSkaQAukl7fFcX4apAs8cwJgxHiEZjfWNG1npZOzpYdHG59v5xQ==",
"dependencies": {
"Newtonsoft.Json": "9.0.1",
"NuGet.Configuration": "5.11.0",
"NuGet.Versioning": "5.11.0",
"System.Security.Cryptography.Cng": "5.0.0",
"System.Security.Cryptography.Pkcs": "5.0.0"
}
},
"NuGet.ProjectModel": {
"type": "Transitive",
"resolved": "5.11.0",
"contentHash": "8q7mAwHHP1/Ua1r3FQDg+kXcFvRgBmCCXQeqTkTVQoO5t3G/AwxzJVt7Jii0eNrM17Wzm975U0gnkNqlp+gdsw==",
"dependencies": {
"NuGet.DependencyResolver.Core": "5.11.0"
}
},
"NuGet.Protocol": {
"type": "Transitive",
"resolved": "5.11.0",
"contentHash": "eS/sJLqMzPz6gonD1zaXIcpDME/1DuKqv0Hlag8RuJcboZJliA15qjfg7UvuQB8/ineOleaEvrTzMjpKE0FdbQ==",
"dependencies": {
"NuGet.Packaging": "5.11.0"
}
},
"NuGet.Versioning": {
"type": "Transitive",
"resolved": "5.11.0",
"contentHash": "mCv/GzvMk5iatWoZY41PoIShEbwVxq9CDCc1fV/uqPFKZ4DD/1JuKZ5AL/FJJRsTanvMR3EOXKYCLdQ7PFYn8Q=="
},
"Otp.NET": { "Otp.NET": {
"type": "Transitive", "type": "Transitive",
"resolved": "1.2.2", "resolved": "1.2.2",
@ -2011,102 +1594,6 @@
"System.Threading": "4.3.0" "System.Threading": "4.3.0"
} }
}, },
"System.Composition": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "I+D26qpYdoklyAVUdqwUBrEIckMNjAYnuPJy/h9dsQItpQwVREkDFs4b4tkBza0kT2Yk48Lcfsv2QQ9hWsh9Iw==",
"dependencies": {
"System.Composition.AttributedModel": "1.0.31",
"System.Composition.Convention": "1.0.31",
"System.Composition.Hosting": "1.0.31",
"System.Composition.Runtime": "1.0.31",
"System.Composition.TypedParts": "1.0.31"
}
},
"System.Composition.AttributedModel": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "NHWhkM3ZkspmA0XJEsKdtTt1ViDYuojgSND3yHhTzwxepiwqZf+BCWuvCbjUt4fe0NxxQhUDGJ5km6sLjo9qnQ==",
"dependencies": {
"System.Reflection": "4.3.0",
"System.Runtime": "4.3.0"
}
},
"System.Composition.Convention": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "GLjh2Ju71k6C0qxMMtl4efHa68NmWeIUYh4fkUI8xbjQrEBvFmRwMDFcylT8/PR9SQbeeL48IkFxU/+gd0nYEQ==",
"dependencies": {
"System.Collections": "4.3.0",
"System.Composition.AttributedModel": "1.0.31",
"System.Diagnostics.Debug": "4.3.0",
"System.Diagnostics.Tools": "4.3.0",
"System.Globalization": "4.3.0",
"System.Linq": "4.3.0",
"System.Linq.Expressions": "4.3.0",
"System.Reflection": "4.3.0",
"System.Reflection.Extensions": "4.3.0",
"System.Resources.ResourceManager": "4.3.0",
"System.Runtime": "4.3.0",
"System.Threading": "4.3.0"
}
},
"System.Composition.Hosting": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "fN1bT4RX4vUqjbgoyuJFVUizAl2mYF5VAb+bVIxIYZSSc0BdnX+yGAxcavxJuDDCQ1K+/mdpgyEFc8e9ikjvrg==",
"dependencies": {
"System.Collections": "4.3.0",
"System.Composition.Runtime": "1.0.31",
"System.Diagnostics.Debug": "4.3.0",
"System.Diagnostics.Tools": "4.3.0",
"System.Globalization": "4.3.0",
"System.Linq": "4.3.0",
"System.Linq.Expressions": "4.3.0",
"System.ObjectModel": "4.3.0",
"System.Reflection": "4.3.0",
"System.Reflection.Extensions": "4.3.0",
"System.Resources.ResourceManager": "4.3.0",
"System.Runtime": "4.3.0",
"System.Threading": "4.3.0"
}
},
"System.Composition.Runtime": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "0LEJN+2NVM89CE4SekDrrk5tHV5LeATltkp+9WNYrR+Huiyt0vaCqHbbHtVAjPyeLWIc8dOz/3kthRBj32wGQg==",
"dependencies": {
"System.Collections": "4.3.0",
"System.Diagnostics.Debug": "4.3.0",
"System.Diagnostics.Tools": "4.3.0",
"System.Globalization": "4.3.0",
"System.Linq": "4.3.0",
"System.Reflection": "4.3.0",
"System.Resources.ResourceManager": "4.3.0",
"System.Runtime": "4.3.0"
}
},
"System.Composition.TypedParts": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "0Zae/FtzeFgDBBuILeIbC/T9HMYbW4olAmi8XqqAGosSOWvXfiQLfARZEhiGd0LVXaYgXr0NhxiU1LldRP1fpQ==",
"dependencies": {
"System.Collections": "4.3.0",
"System.Composition.AttributedModel": "1.0.31",
"System.Composition.Hosting": "1.0.31",
"System.Composition.Runtime": "1.0.31",
"System.Diagnostics.Debug": "4.3.0",
"System.Diagnostics.Tools": "4.3.0",
"System.Globalization": "4.3.0",
"System.Linq": "4.3.0",
"System.Linq.Expressions": "4.3.0",
"System.Reflection": "4.3.0",
"System.Reflection.Extensions": "4.3.0",
"System.Resources.ResourceManager": "4.3.0",
"System.Runtime": "4.3.0",
"System.Runtime.Extensions": "4.3.0"
}
},
"System.Configuration.ConfigurationManager": { "System.Configuration.ConfigurationManager": {
"type": "Transitive", "type": "Transitive",
"resolved": "6.0.0", "resolved": "6.0.0",
@ -2733,8 +2220,15 @@
}, },
"System.Reflection.Emit": { "System.Reflection.Emit": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.6.0", "resolved": "4.3.0",
"contentHash": "qAo4jyXtC9i71iElngX7P2r+zLaiHzxKwf66sc3X91tL5Ks6fnQ1vxL04o7ZSm3sYfLExySL7GN8aTpNYpU1qw==" "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==",
"dependencies": {
"System.IO": "4.3.0",
"System.Reflection": "4.3.0",
"System.Reflection.Emit.ILGeneration": "4.3.0",
"System.Reflection.Primitives": "4.3.0",
"System.Runtime": "4.3.0"
}
}, },
"System.Reflection.Emit.ILGeneration": { "System.Reflection.Emit.ILGeneration": {
"type": "Transitive", "type": "Transitive",
@ -2748,8 +2242,14 @@
}, },
"System.Reflection.Emit.Lightweight": { "System.Reflection.Emit.Lightweight": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.6.0", "resolved": "4.3.0",
"contentHash": "j/V5HVvxvBQ7uubYD0PptQW2KGsi1Pc2kZ9yfwLixv3ADdjL/4M78KyC5e+ymW612DY8ZE4PFoZmWpoNmN2mqg==" "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==",
"dependencies": {
"System.Reflection": "4.3.0",
"System.Reflection.Emit.ILGeneration": "4.3.0",
"System.Reflection.Primitives": "4.3.0",
"System.Runtime": "4.3.0"
}
}, },
"System.Reflection.Extensions": { "System.Reflection.Extensions": {
"type": "Transitive", "type": "Transitive",
@ -2762,11 +2262,6 @@
"System.Runtime": "4.3.0" "System.Runtime": "4.3.0"
} }
}, },
"System.Reflection.Metadata": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ=="
},
"System.Reflection.Primitives": { "System.Reflection.Primitives": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.3.0", "resolved": "4.3.0",
@ -3205,11 +2700,6 @@
"System.Runtime": "4.3.0" "System.Runtime": "4.3.0"
} }
}, },
"System.Threading.Tasks.Dataflow": {
"type": "Transitive",
"resolved": "4.9.0",
"contentHash": "dTS+3D/GtG2/Pvc3E5YzVvAa7aQJgLDlZDIzukMOJjYudVOQOUXEU68y6Zi3Nn/jqIeB5kOCwrGbQFAKHVzXEQ=="
},
"System.Threading.Tasks.Extensions": { "System.Threading.Tasks.Extensions": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.5.4", "resolved": "4.5.4",
@ -3381,106 +2871,106 @@
"commercial.core": { "commercial.core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )" "Core": "2023.2.2"
} }
}, },
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
}, },
"infrastructure.dapper": { "infrastructure.dapper": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Dapper": "[2.0.123, )" "Dapper": "2.0.123"
} }
}, },
"infrastructure.entityframework": { "infrastructure.entityframework": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoMapper.Extensions.Microsoft.DependencyInjection": "[11.0.0, )", "AutoMapper.Extensions.Microsoft.DependencyInjection": "11.0.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Microsoft.EntityFrameworkCore.Relational": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Relational": "6.0.12",
"Microsoft.EntityFrameworkCore.SqlServer": "[6.0.12, )", "Microsoft.EntityFrameworkCore.SqlServer": "6.0.12",
"Microsoft.EntityFrameworkCore.Sqlite": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Sqlite": "6.0.12",
"Npgsql.EntityFrameworkCore.PostgreSQL": "[6.0.8, )", "Npgsql.EntityFrameworkCore.PostgreSQL": "6.0.8",
"Pomelo.EntityFrameworkCore.MySql": "[6.0.2, )", "Pomelo.EntityFrameworkCore.MySql": "6.0.2",
"linq2db.EntityFrameworkCore": "[6.11.0, )" "linq2db.EntityFrameworkCore": "6.11.0"
} }
}, },
"migrator": { "migrator": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Microsoft.Extensions.Logging": "[6.0.0, )", "Microsoft.Extensions.Logging": "6.0.0",
"dbup-sqlserver": "[5.0.8, )" "dbup-sqlserver": "5.0.8"
} }
}, },
"mysqlmigrations": { "mysqlmigrations": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Infrastructure.EntityFramework": "[2023.2.0, )" "Infrastructure.EntityFramework": "2023.2.2"
} }
}, },
"postgresmigrations": { "postgresmigrations": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Infrastructure.EntityFramework": "[2023.2.0, )" "Infrastructure.EntityFramework": "2023.2.2"
} }
}, },
"sharedweb": { "sharedweb": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Infrastructure.Dapper": "[2023.2.0, )", "Infrastructure.Dapper": "2023.2.2",
"Infrastructure.EntityFramework": "[2023.2.0, )" "Infrastructure.EntityFramework": "2023.2.2"
} }
}, },
"sqlitemigrations": { "sqlitemigrations": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Infrastructure.EntityFramework": "[2023.2.0, )" "Infrastructure.EntityFramework": "2023.2.2"
} }
} }
} }

View File

@ -107,8 +107,7 @@ public class AuthRequestsController : Controller
AccessCode = model.AccessCode, AccessCode = model.AccessCode,
PublicKey = model.PublicKey, PublicKey = model.PublicKey,
UserId = user.Id, UserId = user.Id,
Type = model.Type.Value, Type = model.Type.Value
RequestFingerprint = model.FingerprintPhrase
}; };
authRequest = await _authRequestRepository.CreateAsync(authRequest); authRequest = await _authRequestRepository.CreateAsync(authRequest);
await _pushNotificationService.PushAuthRequestAsync(authRequest); await _pushNotificationService.PushAuthRequestAsync(authRequest);

View File

@ -79,7 +79,7 @@ public class CollectionsController : Controller
[HttpGet("details")] [HttpGet("details")]
public async Task<ListResponseModel<CollectionAccessDetailsResponseModel>> GetManyWithDetails(Guid orgId) public async Task<ListResponseModel<CollectionAccessDetailsResponseModel>> GetManyWithDetails(Guid orgId)
{ {
if (!await ViewAtLeastOneCollectionAsync(orgId) && !await _currentContext.ManageUsers(orgId)) if (!await ViewAtLeastOneCollectionAsync(orgId) && !await _currentContext.ManageUsers(orgId) && !await _currentContext.ManageGroups(orgId))
{ {
throw new NotFoundException(); throw new NotFoundException();
} }
@ -204,12 +204,12 @@ public class CollectionsController : Controller
{ {
var orgId = new Guid(model.OrganizationId); var orgId = new Guid(model.OrganizationId);
var collectionIds = model.Ids.Select(i => new Guid(i)); var collectionIds = model.Ids.Select(i => new Guid(i));
if (!await _currentContext.DeleteAssignedCollections(orgId)) if (!await _currentContext.DeleteAssignedCollections(orgId) && !await _currentContext.DeleteAnyCollection(orgId))
{ {
throw new NotFoundException(); throw new NotFoundException();
} }
var userCollections = await _collectionRepository.GetManyByUserIdAsync(_currentContext.UserId.Value); var userCollections = await _collectionService.GetOrganizationCollections(orgId);
var filteredCollections = userCollections.Where(c => collectionIds.Contains(c.Id) && c.OrganizationId == orgId); var filteredCollections = userCollections.Where(c => collectionIds.Contains(c.Id) && c.OrganizationId == orgId);
if (!filteredCollections.Any()) if (!filteredCollections.Any())

View File

@ -1,4 +1,6 @@
using Bit.Api.Models.Response; using Bit.Api.Models.Response;
using Bit.Core.Context;
using Bit.Core.Services;
using Bit.Core.Settings; using Bit.Core.Settings;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
@ -9,15 +11,22 @@ namespace Bit.Api.Controllers;
public class ConfigController : Controller public class ConfigController : Controller
{ {
private readonly IGlobalSettings _globalSettings; private readonly IGlobalSettings _globalSettings;
private readonly ICurrentContext _currentContext;
private readonly IFeatureService _featureService;
public ConfigController(IGlobalSettings globalSettings) public ConfigController(
IGlobalSettings globalSettings,
ICurrentContext currentContext,
IFeatureService featureService)
{ {
_globalSettings = globalSettings; _globalSettings = globalSettings;
_currentContext = currentContext;
_featureService = featureService;
} }
[HttpGet("")] [HttpGet("")]
public ConfigResponseModel GetConfigs() public ConfigResponseModel GetConfigs()
{ {
return new ConfigResponseModel(_globalSettings); return new ConfigResponseModel(_globalSettings, _featureService.GetAll(_currentContext));
} }
} }

View File

@ -703,8 +703,11 @@ public class OrganizationsController : Controller
if (model.Enabled) if (model.Enabled)
{ {
var orgUser = await _organizationUserRepository.GetByOrganizationAsync(id, userId); var orgUser = await _organizationUserRepository.GetByOrganizationAsync(id, userId);
orgUser.AccessSecretsManager = true; if (orgUser != null)
await _organizationUserRepository.ReplaceAsync(orgUser); {
orgUser.AccessSecretsManager = true;
await _organizationUserRepository.ReplaceAsync(orgUser);
}
} }
} }
} }

View File

@ -17,8 +17,6 @@ public class AuthRequestCreateRequestModel
public string AccessCode { get; set; } public string AccessCode { get; set; }
[Required] [Required]
public AuthRequestType? Type { get; set; } public AuthRequestType? Type { get; set; }
[Required]
public string FingerprintPhrase { get; set; }
} }
public class AuthRequestUpdateRequestModel public class AuthRequestUpdateRequestModel

View File

@ -20,7 +20,6 @@ public class AuthRequestResponseModel : ResponseModel
RequestDeviceType = authRequest.RequestDeviceType.GetType().GetMember(authRequest.RequestDeviceType.ToString()) RequestDeviceType = authRequest.RequestDeviceType.GetType().GetMember(authRequest.RequestDeviceType.ToString())
.FirstOrDefault()?.GetCustomAttribute<DisplayAttribute>()?.GetName(); .FirstOrDefault()?.GetCustomAttribute<DisplayAttribute>()?.GetName();
RequestIpAddress = authRequest.RequestIpAddress; RequestIpAddress = authRequest.RequestIpAddress;
RequestFingerprint = authRequest.RequestFingerprint;
Key = authRequest.Key; Key = authRequest.Key;
MasterPasswordHash = authRequest.MasterPasswordHash; MasterPasswordHash = authRequest.MasterPasswordHash;
CreationDate = authRequest.CreationDate; CreationDate = authRequest.CreationDate;
@ -33,7 +32,6 @@ public class AuthRequestResponseModel : ResponseModel
public string PublicKey { get; set; } public string PublicKey { get; set; }
public string RequestDeviceType { get; set; } public string RequestDeviceType { get; set; }
public string RequestIpAddress { get; set; } public string RequestIpAddress { get; set; }
public string RequestFingerprint { get; set; }
public string Key { get; set; } public string Key { get; set; }
public string MasterPasswordHash { get; set; } public string MasterPasswordHash { get; set; }
public DateTime CreationDate { get; set; } public DateTime CreationDate { get; set; }

View File

@ -10,15 +10,19 @@ public class ConfigResponseModel : ResponseModel
public string GitHash { get; set; } public string GitHash { get; set; }
public ServerConfigResponseModel Server { get; set; } public ServerConfigResponseModel Server { get; set; }
public EnvironmentConfigResponseModel Environment { get; set; } public EnvironmentConfigResponseModel Environment { get; set; }
public IDictionary<string, object> FeatureStates { get; set; }
public ConfigResponseModel(string obj = "config") : base(obj) public ConfigResponseModel() : base("config")
{ {
Version = AssemblyHelpers.GetVersion(); Version = AssemblyHelpers.GetVersion();
GitHash = AssemblyHelpers.GetGitHash(); GitHash = AssemblyHelpers.GetGitHash();
Environment = new EnvironmentConfigResponseModel(); Environment = new EnvironmentConfigResponseModel();
FeatureStates = new Dictionary<string, object>();
} }
public ConfigResponseModel(IGlobalSettings globalSettings, string obj = "config") : base(obj) public ConfigResponseModel(
IGlobalSettings globalSettings,
IDictionary<string, object> featureStates) : base("config")
{ {
Version = AssemblyHelpers.GetVersion(); Version = AssemblyHelpers.GetVersion();
GitHash = AssemblyHelpers.GetGitHash(); GitHash = AssemblyHelpers.GetGitHash();
@ -30,6 +34,7 @@ public class ConfigResponseModel : ResponseModel
Notifications = globalSettings.BaseServiceUri.Notifications, Notifications = globalSettings.BaseServiceUri.Notifications,
Sso = globalSettings.BaseServiceUri.Sso Sso = globalSettings.BaseServiceUri.Sso
}; };
FeatureStates = featureStates;
} }
} }

View File

@ -28,6 +28,8 @@ public class ProfileOrganizationResponseModel : ResponseModel
UseSecretsManager = organization.UseSecretsManager; UseSecretsManager = organization.UseSecretsManager;
UsersGetPremium = organization.UsersGetPremium; UsersGetPremium = organization.UsersGetPremium;
UseCustomPermissions = organization.UseCustomPermissions; UseCustomPermissions = organization.UseCustomPermissions;
UseActivateAutofillPolicy = organization.PlanType == PlanType.EnterpriseAnnually ||
organization.PlanType == PlanType.EnterpriseMonthly;
SelfHost = organization.SelfHost; SelfHost = organization.SelfHost;
Seats = organization.Seats; Seats = organization.Seats;
MaxCollections = organization.MaxCollections; MaxCollections = organization.MaxCollections;
@ -78,6 +80,7 @@ public class ProfileOrganizationResponseModel : ResponseModel
public bool UseSecretsManager { get; set; } public bool UseSecretsManager { get; set; }
public bool UsersGetPremium { get; set; } public bool UsersGetPremium { get; set; }
public bool UseCustomPermissions { get; set; } public bool UseCustomPermissions { get; set; }
public bool UseActivateAutofillPolicy { get; set; }
public bool SelfHost { get; set; } public bool SelfHost { get; set; }
public int? Seats { get; set; } public int? Seats { get; set; }
public short? MaxCollections { get; set; } public short? MaxCollections { get; set; }

View File

@ -24,6 +24,8 @@ public class ProfileProviderOrganizationResponseModel : ProfileOrganizationRespo
UseResetPassword = organization.UseResetPassword; UseResetPassword = organization.UseResetPassword;
UsersGetPremium = organization.UsersGetPremium; UsersGetPremium = organization.UsersGetPremium;
UseCustomPermissions = organization.UseCustomPermissions; UseCustomPermissions = organization.UseCustomPermissions;
UseActivateAutofillPolicy = organization.PlanType == PlanType.EnterpriseAnnually ||
organization.PlanType == PlanType.EnterpriseMonthly;
SelfHost = organization.SelfHost; SelfHost = organization.SelfHost;
Seats = organization.Seats; Seats = organization.Seats;
MaxCollections = organization.MaxCollections; MaxCollections = organization.MaxCollections;

View File

@ -82,8 +82,7 @@ public class ProjectsController : Controller
[HttpGet("projects/{id}")] [HttpGet("projects/{id}")]
public async Task<ProjectPermissionDetailsResponseModel> GetAsync([FromRoute] Guid id) public async Task<ProjectPermissionDetailsResponseModel> GetAsync([FromRoute] Guid id)
{ {
var userId = _userService.GetProperUserId(User).Value; var project = await _projectRepository.GetByIdAsync(id);
var project = await _projectRepository.GetPermissionDetailsByIdAsync(id, userId);
if (project == null) if (project == null)
{ {
throw new NotFoundException(); throw new NotFoundException();
@ -94,41 +93,24 @@ public class ProjectsController : Controller
throw new NotFoundException(); throw new NotFoundException();
} }
var userId = _userService.GetProperUserId(User).Value;
var orgAdmin = await _currentContext.OrganizationAdmin(project.OrganizationId); var orgAdmin = await _currentContext.OrganizationAdmin(project.OrganizationId);
var accessClient = AccessClientHelper.ToAccessClient(_currentContext.ClientType, orgAdmin); var accessClient = AccessClientHelper.ToAccessClient(_currentContext.ClientType, orgAdmin);
bool hasAccess; var access = await _projectRepository.AccessToProjectAsync(id, userId, accessClient);
var read = project.Read;
var write = project.Write;
switch (accessClient) if (!access.Read)
{
case AccessClientType.NoAccessCheck:
hasAccess = true;
write = true;
read = true;
break;
case AccessClientType.User:
hasAccess = project.Read;
break;
default:
hasAccess = false;
break;
}
if (!hasAccess)
{ {
throw new NotFoundException(); throw new NotFoundException();
} }
return new ProjectPermissionDetailsResponseModel(project, read, write); return new ProjectPermissionDetailsResponseModel(project, access.Read, access.Write);
} }
[HttpPost("projects/delete")] [HttpPost("projects/delete")]
public async Task<ListResponseModel<BulkDeleteResponseModel>> BulkDeleteAsync([FromBody] List<Guid> ids) public async Task<ListResponseModel<BulkDeleteResponseModel>> BulkDeleteAsync([FromBody] List<Guid> ids)
{ {
var userId = _userService.GetProperUserId(User).Value; var userId = _userService.GetProperUserId(User).Value;
var results = await _deleteProjectCommand.DeleteProjects(ids, userId); var results = await _deleteProjectCommand.DeleteProjects(ids, userId);
var responses = results.Select(r => new BulkDeleteResponseModel(r.Item1.Id, r.Item2)); var responses = results.Select(r => new BulkDeleteResponseModel(r.Item1.Id, r.Item2));
return new ListResponseModel<BulkDeleteResponseModel>(responses); return new ListResponseModel<BulkDeleteResponseModel>(responses);

View File

@ -5,8 +5,9 @@ using Bit.Core.Context;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.Exceptions; using Bit.Core.Exceptions;
using Bit.Core.Identity; using Bit.Core.Identity;
using Bit.Core.Models.Business;
using Bit.Core.Repositories;
using Bit.Core.SecretsManager.Commands.Secrets.Interfaces; using Bit.Core.SecretsManager.Commands.Secrets.Interfaces;
using Bit.Core.SecretsManager.Entities;
using Bit.Core.SecretsManager.Repositories; using Bit.Core.SecretsManager.Repositories;
using Bit.Core.Services; using Bit.Core.Services;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
@ -21,30 +22,37 @@ public class SecretsController : Controller
private readonly ICurrentContext _currentContext; private readonly ICurrentContext _currentContext;
private readonly IProjectRepository _projectRepository; private readonly IProjectRepository _projectRepository;
private readonly ISecretRepository _secretRepository; private readonly ISecretRepository _secretRepository;
private readonly IOrganizationRepository _organizationRepository;
private readonly ICreateSecretCommand _createSecretCommand; private readonly ICreateSecretCommand _createSecretCommand;
private readonly IUpdateSecretCommand _updateSecretCommand; private readonly IUpdateSecretCommand _updateSecretCommand;
private readonly IDeleteSecretCommand _deleteSecretCommand; private readonly IDeleteSecretCommand _deleteSecretCommand;
private readonly IUserService _userService; private readonly IUserService _userService;
private readonly IEventService _eventService; private readonly IEventService _eventService;
private readonly IReferenceEventService _referenceEventService;
public SecretsController( public SecretsController(
ICurrentContext currentContext, ICurrentContext currentContext,
IProjectRepository projectRepository, IProjectRepository projectRepository,
ISecretRepository secretRepository, ISecretRepository secretRepository,
IOrganizationRepository organizationRepository,
ICreateSecretCommand createSecretCommand, ICreateSecretCommand createSecretCommand,
IUpdateSecretCommand updateSecretCommand, IUpdateSecretCommand updateSecretCommand,
IDeleteSecretCommand deleteSecretCommand, IDeleteSecretCommand deleteSecretCommand,
IUserService userService, IUserService userService,
IEventService eventService) IEventService eventService,
IReferenceEventService referenceEventService)
{ {
_currentContext = currentContext; _currentContext = currentContext;
_projectRepository = projectRepository; _projectRepository = projectRepository;
_secretRepository = secretRepository; _secretRepository = secretRepository;
_organizationRepository = organizationRepository;
_createSecretCommand = createSecretCommand; _createSecretCommand = createSecretCommand;
_updateSecretCommand = updateSecretCommand; _updateSecretCommand = updateSecretCommand;
_deleteSecretCommand = deleteSecretCommand; _deleteSecretCommand = deleteSecretCommand;
_userService = userService; _userService = userService;
_eventService = eventService; _eventService = eventService;
_referenceEventService = referenceEventService;
} }
[HttpGet("organizations/{organizationId}/secrets")] [HttpGet("organizations/{organizationId}/secrets")]
@ -74,7 +82,9 @@ public class SecretsController : Controller
var userId = _userService.GetProperUserId(User).Value; var userId = _userService.GetProperUserId(User).Value;
var result = await _createSecretCommand.CreateAsync(createRequest.ToSecret(organizationId), userId); var result = await _createSecretCommand.CreateAsync(createRequest.ToSecret(organizationId), userId);
return new SecretResponseModel(result);
// Creating a secret means you have read & write permission.
return new SecretResponseModel(result, true, true);
} }
[HttpGet("secrets/{id}")] [HttpGet("secrets/{id}")]
@ -87,18 +97,26 @@ public class SecretsController : Controller
throw new NotFoundException(); throw new NotFoundException();
} }
if (!await UserHasReadAccessToSecret(secret)) var userId = _userService.GetProperUserId(User).Value;
var orgAdmin = await _currentContext.OrganizationAdmin(secret.OrganizationId);
var accessClient = AccessClientHelper.ToAccessClient(_currentContext.ClientType, orgAdmin);
var access = await _secretRepository.AccessToSecretAsync(id, userId, accessClient);
if (!access.Read)
{ {
throw new NotFoundException(); throw new NotFoundException();
} }
if (_currentContext.ClientType == ClientType.ServiceAccount) if (_currentContext.ClientType == ClientType.ServiceAccount)
{ {
var userId = _userService.GetProperUserId(User).Value;
await _eventService.LogServiceAccountSecretEventAsync(userId, secret, EventType.Secret_Retrieved); await _eventService.LogServiceAccountSecretEventAsync(userId, secret, EventType.Secret_Retrieved);
var org = await _organizationRepository.GetByIdAsync(secret.OrganizationId);
await _referenceEventService.RaiseEventAsync(new ReferenceEvent(ReferenceEventType.SmServiceAccountAccessedSecret, org));
} }
return new SecretResponseModel(secret); return new SecretResponseModel(secret, access.Read, access.Write);
} }
[HttpGet("projects/{projectId}/secrets")] [HttpGet("projects/{projectId}/secrets")]
@ -125,7 +143,9 @@ public class SecretsController : Controller
var userId = _userService.GetProperUserId(User).Value; var userId = _userService.GetProperUserId(User).Value;
var secret = updateRequest.ToSecret(id); var secret = updateRequest.ToSecret(id);
var result = await _updateSecretCommand.UpdateAsync(secret, userId); var result = await _updateSecretCommand.UpdateAsync(secret, userId);
return new SecretResponseModel(result);
// Updating a secret means you have read & write permission.
return new SecretResponseModel(result, true, true);
} }
[HttpPost("secrets/delete")] [HttpPost("secrets/delete")]
@ -136,26 +156,4 @@ public class SecretsController : Controller
var responses = results.Select(r => new BulkDeleteResponseModel(r.Item1.Id, r.Item2)); var responses = results.Select(r => new BulkDeleteResponseModel(r.Item1.Id, r.Item2));
return new ListResponseModel<BulkDeleteResponseModel>(responses); return new ListResponseModel<BulkDeleteResponseModel>(responses);
} }
public async Task<bool> UserHasReadAccessToSecret(Secret secret)
{
var userId = _userService.GetProperUserId(User).Value;
var orgAdmin = await _currentContext.OrganizationAdmin(secret.OrganizationId);
var accessClient = AccessClientHelper.ToAccessClient(_currentContext.ClientType, orgAdmin);
var hasAccess = orgAdmin;
if (secret.Projects?.Count > 0)
{
Guid projectId = secret.Projects.FirstOrDefault().Id;
hasAccess = accessClient switch
{
AccessClientType.NoAccessCheck => true,
AccessClientType.User => await _projectRepository.UserHasReadAccessToProject(projectId, userId),
AccessClientType.ServiceAccount => await _projectRepository.ServiceAccountHasReadAccessToProject(projectId, userId),
_ => false,
};
}
return hasAccess;
}
} }

View File

@ -6,11 +6,13 @@ using Bit.Core.Exceptions;
using Bit.Core.SecretsManager.Commands.Porting.Interfaces; using Bit.Core.SecretsManager.Commands.Porting.Interfaces;
using Bit.Core.SecretsManager.Repositories; using Bit.Core.SecretsManager.Repositories;
using Bit.Core.Services; using Bit.Core.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace Bit.Api.SecretsManager.Controllers; namespace Bit.Api.SecretsManager.Controllers;
[SecretsManager] [SecretsManager]
[Authorize("secrets")]
public class SecretsManagerPortingController : Controller public class SecretsManagerPortingController : Controller
{ {
private readonly ISecretRepository _secretRepository; private readonly ISecretRepository _secretRepository;
@ -31,7 +33,7 @@ public class SecretsManagerPortingController : Controller
[HttpGet("sm/{organizationId}/export")] [HttpGet("sm/{organizationId}/export")]
public async Task<SMExportResponseModel> Export([FromRoute] Guid organizationId, [FromRoute] string format = "json") public async Task<SMExportResponseModel> Export([FromRoute] Guid organizationId, [FromRoute] string format = "json")
{ {
if (!await _currentContext.OrganizationAdmin(organizationId)) if (!await _currentContext.OrganizationAdmin(organizationId) || !_currentContext.AccessSecretsManager(organizationId))
{ {
throw new NotFoundException(); throw new NotFoundException();
} }
@ -45,13 +47,13 @@ public class SecretsManagerPortingController : Controller
throw new NotFoundException(); throw new NotFoundException();
} }
return new SMExportResponseModel(projects, secrets); return new SMExportResponseModel(projects, secrets.Select(s => s.Secret));
} }
[HttpPost("sm/{organizationId}/import")] [HttpPost("sm/{organizationId}/import")]
public async Task Import([FromRoute] Guid organizationId, [FromBody] SMImportRequestModel importRequest) public async Task Import([FromRoute] Guid organizationId, [FromBody] SMImportRequestModel importRequest)
{ {
if (!await _currentContext.OrganizationAdmin(organizationId)) if (!await _currentContext.OrganizationAdmin(organizationId) || !_currentContext.AccessSecretsManager(organizationId))
{ {
throw new NotFoundException(); throw new NotFoundException();
} }

View File

@ -5,7 +5,9 @@ namespace Bit.Api.SecretsManager.Models.Response;
public class AccessTokenResponseModel : ResponseModel public class AccessTokenResponseModel : ResponseModel
{ {
public AccessTokenResponseModel(ApiKey apiKey, string obj = "accessToken") private const string _objectName = "accessToken";
public AccessTokenResponseModel(ApiKey apiKey, string obj = _objectName)
: base(obj) : base(obj)
{ {
Id = apiKey.Id; Id = apiKey.Id;
@ -17,6 +19,10 @@ public class AccessTokenResponseModel : ResponseModel
RevisionDate = apiKey.RevisionDate; RevisionDate = apiKey.RevisionDate;
} }
public AccessTokenResponseModel() : base(_objectName)
{
}
public Guid Id { get; set; } public Guid Id { get; set; }
public string Name { get; set; } public string Name { get; set; }
public ICollection<string> Scopes { get; set; } public ICollection<string> Scopes { get; set; }

View File

@ -7,7 +7,7 @@ public class SecretResponseModel : ResponseModel
{ {
private const string _objectName = "secret"; private const string _objectName = "secret";
public SecretResponseModel(Secret secret) : base(_objectName) public SecretResponseModel(Secret secret, bool read, bool write) : base(_objectName)
{ {
if (secret == null) if (secret == null)
{ {
@ -22,6 +22,9 @@ public class SecretResponseModel : ResponseModel
CreationDate = secret.CreationDate; CreationDate = secret.CreationDate;
RevisionDate = secret.RevisionDate; RevisionDate = secret.RevisionDate;
Projects = secret.Projects?.Select(p => new InnerProject(p)); Projects = secret.Projects?.Select(p => new InnerProject(p));
Read = read;
Write = write;
} }
public SecretResponseModel() : base(_objectName) public SecretResponseModel() : base(_objectName)
@ -44,6 +47,10 @@ public class SecretResponseModel : ResponseModel
public IEnumerable<InnerProject> Projects { get; set; } public IEnumerable<InnerProject> Projects { get; set; }
public bool Read { get; set; }
public bool Write { get; set; }
public class InnerProject public class InnerProject
{ {
public InnerProject(Project project) public InnerProject(Project project)

View File

@ -1,5 +1,6 @@
using Bit.Core.Models.Api; using Bit.Core.Models.Api;
using Bit.Core.SecretsManager.Entities; using Bit.Core.SecretsManager.Entities;
using Bit.Core.SecretsManager.Models.Data;
namespace Bit.Api.SecretsManager.Models.Response; namespace Bit.Api.SecretsManager.Models.Response;
@ -7,10 +8,10 @@ public class SecretWithProjectsListResponseModel : ResponseModel
{ {
private const string _objectName = "SecretsWithProjectsList"; private const string _objectName = "SecretsWithProjectsList";
public SecretWithProjectsListResponseModel(IEnumerable<Secret> secrets) : base(_objectName) public SecretWithProjectsListResponseModel(IEnumerable<SecretPermissionDetails> secrets) : base(_objectName)
{ {
Secrets = secrets.Select(s => new InnerSecret(s)); Secrets = secrets.Select(s => new InnerSecret(s));
Projects = secrets.SelectMany(s => s.Projects).DistinctBy(p => p.Id).Select(p => new InnerProject(p)); Projects = secrets.SelectMany(s => s.Secret.Projects).DistinctBy(p => p.Id).Select(p => new InnerProject(p));
} }
public SecretWithProjectsListResponseModel() : base(_objectName) public SecretWithProjectsListResponseModel() : base(_objectName)
@ -38,14 +39,16 @@ public class SecretWithProjectsListResponseModel : ResponseModel
public class InnerSecret public class InnerSecret
{ {
public InnerSecret(Secret secret) public InnerSecret(SecretPermissionDetails secret)
{ {
Id = secret.Id.ToString(); Id = secret.Secret.Id.ToString();
OrganizationId = secret.OrganizationId.ToString(); OrganizationId = secret.Secret.OrganizationId.ToString();
Key = secret.Key; Key = secret.Secret.Key;
CreationDate = secret.CreationDate; CreationDate = secret.Secret.CreationDate;
RevisionDate = secret.RevisionDate; RevisionDate = secret.Secret.RevisionDate;
Projects = secret.Projects?.Select(p => new InnerProject(p)); Projects = secret.Secret.Projects?.Select(p => new InnerProject(p));
Read = secret.Read;
Write = secret.Write;
} }
public InnerSecret() public InnerSecret()
@ -63,6 +66,8 @@ public class SecretWithProjectsListResponseModel : ResponseModel
public DateTime RevisionDate { get; set; } public DateTime RevisionDate { get; set; }
public IEnumerable<InnerProject> Projects { get; set; } public IEnumerable<InnerProject> Projects { get; set; }
public bool Read { get; set; }
public bool Write { get; set; }
} }
} }

View File

@ -2835,85 +2835,85 @@
"commercial.core": { "commercial.core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )" "Core": "2023.2.2"
} }
}, },
"commercial.infrastructure.entityframework": { "commercial.infrastructure.entityframework": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoMapper.Extensions.Microsoft.DependencyInjection": "[11.0.0, )", "AutoMapper.Extensions.Microsoft.DependencyInjection": "11.0.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Infrastructure.EntityFramework": "[2023.2.0, )" "Infrastructure.EntityFramework": "2023.2.2"
} }
}, },
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
}, },
"infrastructure.dapper": { "infrastructure.dapper": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Dapper": "[2.0.123, )" "Dapper": "2.0.123"
} }
}, },
"infrastructure.entityframework": { "infrastructure.entityframework": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoMapper.Extensions.Microsoft.DependencyInjection": "[11.0.0, )", "AutoMapper.Extensions.Microsoft.DependencyInjection": "11.0.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Microsoft.EntityFrameworkCore.Relational": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Relational": "6.0.12",
"Microsoft.EntityFrameworkCore.SqlServer": "[6.0.12, )", "Microsoft.EntityFrameworkCore.SqlServer": "6.0.12",
"Microsoft.EntityFrameworkCore.Sqlite": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Sqlite": "6.0.12",
"Npgsql.EntityFrameworkCore.PostgreSQL": "[6.0.8, )", "Npgsql.EntityFrameworkCore.PostgreSQL": "6.0.8",
"Pomelo.EntityFrameworkCore.MySql": "[6.0.2, )", "Pomelo.EntityFrameworkCore.MySql": "6.0.2",
"linq2db.EntityFrameworkCore": "[6.11.0, )" "linq2db.EntityFrameworkCore": "6.11.0"
} }
}, },
"sharedweb": { "sharedweb": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Infrastructure.Dapper": "[2023.2.0, )", "Infrastructure.Dapper": "2023.2.2",
"Infrastructure.EntityFramework": "[2023.2.0, )" "Infrastructure.EntityFramework": "2023.2.2"
} }
} }
} }

View File

@ -10,8 +10,4 @@
<ProjectReference Include="..\Core\Core.csproj" /> <ProjectReference Include="..\Core\Core.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="$(MicrosoftVisualStudioWebCodeGenerationDesignVersion)" />
</ItemGroup>
</Project> </Project>

View File

@ -2,18 +2,6 @@
"version": 1, "version": 1,
"dependencies": { "dependencies": {
"net6.0": { "net6.0": {
"Microsoft.VisualStudio.Web.CodeGeneration.Design": {
"type": "Direct",
"requested": "[6.0.3, )",
"resolved": "6.0.3",
"contentHash": "cqxm2k5KF7T0KejRlxt71aizeR+2a/9qk94c1p7/CCOjns4cgwL92IxyrhhpILn0U+kylslBE2O/AJoi28wkSA==",
"dependencies": {
"Microsoft.Build.Locator": "1.4.1",
"Microsoft.DotNet.Scaffolding.Shared": "6.0.3",
"Microsoft.VisualStudio.Web.CodeGenerators.Mvc": "6.0.3",
"System.Private.Uri": "4.3.2"
}
},
"AspNetCoreRateLimit": { "AspNetCoreRateLimit": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.0.2", "resolved": "4.0.2",
@ -202,14 +190,6 @@
"Microsoft.CSharp": "4.7.0" "Microsoft.CSharp": "4.7.0"
} }
}, },
"Humanizer.Core": {
"type": "Transitive",
"resolved": "2.2.0",
"contentHash": "rsYXB7+iUPP8AHgQ8JP2UZI2xK2KhjcdGr9E6zX3CsZaTLCaw8M35vaAJRo1rfxeaZEVMuXeaquLVCkZ7JcZ5Q==",
"dependencies": {
"NETStandard.Library": "1.6.1"
}
},
"IdentityModel": { "IdentityModel": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.4.0", "resolved": "4.4.0",
@ -335,30 +315,6 @@
"MimeKit": "3.2.0" "MimeKit": "3.2.0"
} }
}, },
"MessagePack": {
"type": "Transitive",
"resolved": "2.1.152",
"contentHash": "PlJ31qf42uGuJfwc61x/Pt4hJi01xh1rrBofj1MJSLzEot/2UAIRdSgxEHN/8qou5CV8OBeDM9HXKPi1Oj8rpQ==",
"dependencies": {
"MessagePack.Annotations": "2.1.152",
"Microsoft.Bcl.AsyncInterfaces": "1.0.0",
"System.Memory": "4.5.3",
"System.Reflection.Emit": "4.6.0",
"System.Reflection.Emit.Lightweight": "4.6.0",
"System.Runtime.CompilerServices.Unsafe": "4.5.2",
"System.Threading.Tasks.Extensions": "4.5.3"
}
},
"MessagePack.Annotations": {
"type": "Transitive",
"resolved": "2.1.152",
"contentHash": "RONktDA/HA641ds/2bfOqYSVew8o8EJMcQ1P4M1J77QGgbzWiWt3nBHvCAwlx0VfO6K9S8xq4b5OLD2CUnhtCg=="
},
"MessagePackAnalyzer": {
"type": "Transitive",
"resolved": "2.1.152",
"contentHash": "uJhZlGMkXDaFYsH8V9S6o1EyvsUqB9mpU4DVBXNr0DXZVzZMhuLP1IkLj5xK3EKlaAcvkFkZv3eSvuz360wb3Q=="
},
"Microsoft.AspNetCore.Authentication.JwtBearer": { "Microsoft.AspNetCore.Authentication.JwtBearer": {
"type": "Transitive", "type": "Transitive",
"resolved": "6.0.4", "resolved": "6.0.4",
@ -445,11 +401,6 @@
"Microsoft.Extensions.Primitives": "2.1.0" "Microsoft.Extensions.Primitives": "2.1.0"
} }
}, },
"Microsoft.AspNetCore.Razor.Language": {
"type": "Transitive",
"resolved": "6.0.0",
"contentHash": "yCtBr1GSGzJrrp1NJUb4ltwFYMKHw/tJLnIDvg9g/FnkGIEzmE19tbCQqXARIJv5kdtBgsoVIdGLL+zmjxvM/A=="
},
"Microsoft.Azure.Amqp": { "Microsoft.Azure.Amqp": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.4.11", "resolved": "2.4.11",
@ -544,196 +495,14 @@
}, },
"Microsoft.Bcl.AsyncInterfaces": { "Microsoft.Bcl.AsyncInterfaces": {
"type": "Transitive", "type": "Transitive",
"resolved": "5.0.0", "resolved": "1.1.1",
"contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ==" "contentHash": "yuvf07qFWFqtK3P/MRkEKLhn5r2UbSpVueRziSqj0yJQIKFwG1pq9mOayK3zE5qZCTs0CbrwL9M6R8VwqyGy2w=="
}, },
"Microsoft.Bcl.HashCode": { "Microsoft.Bcl.HashCode": {
"type": "Transitive", "type": "Transitive",
"resolved": "1.1.0", "resolved": "1.1.0",
"contentHash": "J2G1k+u5unBV+aYcwxo94ip16Rkp65pgWFb0R6zwJipzWNMgvqlWeuI7/+R+e8bob66LnSG+llLJ+z8wI94cHg==" "contentHash": "J2G1k+u5unBV+aYcwxo94ip16Rkp65pgWFb0R6zwJipzWNMgvqlWeuI7/+R+e8bob66LnSG+llLJ+z8wI94cHg=="
}, },
"Microsoft.Build": {
"type": "Transitive",
"resolved": "17.0.0",
"contentHash": "hCs9OzyCD/TYRid1LxPgghvUDqgXf+tEvV4qd8tBfOyp3zxAk+/rssgxtJnKLMZIu0CEZi3JegvfenaIXjEacQ==",
"dependencies": {
"Microsoft.Build.Framework": "17.0.0",
"Microsoft.NET.StringTools": "1.0.0",
"Microsoft.Win32.Registry": "4.3.0",
"System.Collections.Immutable": "5.0.0",
"System.Configuration.ConfigurationManager": "4.7.0",
"System.Reflection.Metadata": "1.6.0",
"System.Security.Principal.Windows": "4.7.0",
"System.Text.Encoding.CodePages": "4.0.1",
"System.Text.Json": "5.0.2",
"System.Threading.Tasks.Dataflow": "4.9.0"
}
},
"Microsoft.Build.Framework": {
"type": "Transitive",
"resolved": "17.0.0",
"contentHash": "XbFA0z+6Ws2pNeRXYcDF3lKlNgRoSGMm2Q5HKzZD+EbwYMKPKrl/BJnnkMuDJHU0KravYHfhzBnLLJpPeZ3E7A==",
"dependencies": {
"System.Security.Permissions": "4.7.0"
}
},
"Microsoft.Build.Locator": {
"type": "Transitive",
"resolved": "1.4.1",
"contentHash": "UfyGaxNTjw/r3uWMX/Cv1CPKELo7TCrR5VIahaSKL0WyqmbDT6og9pyjwuhyyUkxC9gk2ElB7oOEySL1OzTZ1g=="
},
"Microsoft.CodeAnalysis.Analyzers": {
"type": "Transitive",
"resolved": "3.3.2",
"contentHash": "7xt6zTlIEizUgEsYAIgm37EbdkiMmr6fP6J9pDoKEpiGM4pi32BCPGr/IczmSJI9Zzp0a6HOzpr9OvpMP+2veA=="
},
"Microsoft.CodeAnalysis.AnalyzerUtilities": {
"type": "Transitive",
"resolved": "3.3.0",
"contentHash": "gyQ70pJ4T7hu/s0+QnEaXtYfeG/JrttGnxHJlrhpxsQjRIUGuRhVwNBtkHHYOrUAZ/l47L98/NiJX6QmTwAyrg=="
},
"Microsoft.CodeAnalysis.Common": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "d02ybMhUJl1r/dI6SkJPHrTiTzXBYCZeJdOLMckV+jyoMU/GGkjqFX/sRbv1K0QmlpwwKuLTiYVQvfYC+8ox2g==",
"dependencies": {
"Microsoft.CodeAnalysis.Analyzers": "3.3.2",
"System.Collections.Immutable": "5.0.0",
"System.Memory": "4.5.4",
"System.Reflection.Metadata": "5.0.0",
"System.Runtime.CompilerServices.Unsafe": "5.0.0",
"System.Text.Encoding.CodePages": "4.5.1",
"System.Threading.Tasks.Extensions": "4.5.4"
}
},
"Microsoft.CodeAnalysis.CSharp": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "2UVTGtyQGgTCazvnT6t82f+7AV2L+kqJdyb61rT9GQed4yK+tVh5IkaKcsm70VqyZQhBbDqsfZFNHnY65xhrRw==",
"dependencies": {
"Microsoft.CodeAnalysis.Common": "[4.0.0]"
}
},
"Microsoft.CodeAnalysis.CSharp.Features": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "WOTeKJN0I4/AzylA+VuTtB7V7VvnM41GXqnyiiDRNa3QtKFAzJbQ7CwLG97pcme+oQLz708z+s4Nzd9g0irytw==",
"dependencies": {
"Humanizer.Core": "2.2.0",
"Microsoft.CodeAnalysis.CSharp": "[4.0.0]",
"Microsoft.CodeAnalysis.CSharp.Workspaces": "[4.0.0]",
"Microsoft.CodeAnalysis.Common": "[4.0.0]",
"Microsoft.CodeAnalysis.Features": "[4.0.0]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[4.0.0]"
}
},
"Microsoft.CodeAnalysis.CSharp.Scripting": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "Z8Y8Ye2snCqVQLLx7K6FcEs0hcvdPi4nTG2RDWdPpOfMH8ed1yxTabt252qAd4TH0jpyruuCnBfW4s6DXliMYg==",
"dependencies": {
"Microsoft.CSharp": "4.3.0",
"Microsoft.CodeAnalysis.CSharp": "[4.0.0]",
"Microsoft.CodeAnalysis.Common": "[4.0.0]",
"Microsoft.CodeAnalysis.Scripting.Common": "[4.0.0]"
}
},
"Microsoft.CodeAnalysis.CSharp.Workspaces": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "RQMc1+2cIRdOvY8vp6ygkzfBrvlYphnbmhhluKNh9+X+PpprQDKlbPrn9fLn6v9RlCsfa87joS3zJyGBEeWTXQ==",
"dependencies": {
"Humanizer.Core": "2.2.0",
"Microsoft.CodeAnalysis.CSharp": "[4.0.0]",
"Microsoft.CodeAnalysis.Common": "[4.0.0]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[4.0.0]"
}
},
"Microsoft.CodeAnalysis.Features": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "ci4pgjEgihb+fu2i1E12iOMGXU6GisYR3YrNd2aqt55ijjzLNqPV/+zt+cV3Qc0n08rJrIY2Bf6cTTMPY0bwJQ==",
"dependencies": {
"Microsoft.CodeAnalysis.AnalyzerUtilities": "3.3.0",
"Microsoft.CodeAnalysis.Common": "[4.0.0]",
"Microsoft.CodeAnalysis.Scripting.Common": "[4.0.0]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[4.0.0]",
"Microsoft.DiaSymReader": "1.3.0",
"Microsoft.VisualStudio.Debugger.Contracts": "17.2.0",
"System.Threading.Tasks.Extensions": "4.5.4"
}
},
"Microsoft.CodeAnalysis.Razor": {
"type": "Transitive",
"resolved": "6.0.0",
"contentHash": "uqdzuQXxD7XrJCbIbbwpI/LOv0PBJ9VIR0gdvANTHOfK5pjTaCir+XcwvYvBZ5BIzd0KGzyiamzlEWw1cK1q0w==",
"dependencies": {
"Microsoft.AspNetCore.Razor.Language": "6.0.0",
"Microsoft.CodeAnalysis.CSharp": "4.0.0",
"Microsoft.CodeAnalysis.Common": "4.0.0"
}
},
"Microsoft.CodeAnalysis.Scripting.Common": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "jU/ncoHSFnXU/L2iju9AFlOwmsAYByIxhCCpeLPNTguXwosJp1o13mtrboJOfkDhi7ebvzQmvcZ++yBu8cF4Sw==",
"dependencies": {
"Microsoft.CodeAnalysis.Common": "[4.0.0]"
}
},
"Microsoft.CodeAnalysis.VisualBasic": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "FK+OGUMUh9O6/GCwyIy4c/sOrarF36/yEY07BbXVYMql1qCqHGWfyWXyCQKQ6m/KqReCqW6aO4cK7kK/AYBpyA==",
"dependencies": {
"Microsoft.CodeAnalysis.Common": "[4.0.0]"
}
},
"Microsoft.CodeAnalysis.VisualBasic.Features": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "GEJsXFcMd7o+D6OYCLPui2ZvNsonTmdPSluGK0wC3EXVB+gnrro7Lr/sjtTSOwVeiXPlhXgprRuO7zJiMn1uzw==",
"dependencies": {
"Microsoft.CodeAnalysis.Common": "[4.0.0]",
"Microsoft.CodeAnalysis.Features": "[4.0.0]",
"Microsoft.CodeAnalysis.VisualBasic": "[4.0.0]",
"Microsoft.CodeAnalysis.VisualBasic.Workspaces": "[4.0.0]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[4.0.0]"
}
},
"Microsoft.CodeAnalysis.VisualBasic.Workspaces": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "ozmB/thXGX5MoP/oiV9w5ZVGS08mz7fK3lRXiRSHHBeuiXZW1ZCGARwG2YkhylzAl1LlEwSQmlgrr8Irlu+3qQ==",
"dependencies": {
"Microsoft.CodeAnalysis.Common": "[4.0.0]",
"Microsoft.CodeAnalysis.VisualBasic": "[4.0.0]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[4.0.0]"
}
},
"Microsoft.CodeAnalysis.Workspaces.Common": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "bEfHzx8PLmEN6aogVYHWmViHCWfms8emI43w9nNX+C8MLgtynOmVL/OJ4hbuONVp+4OuDAy5BDj69n5MnXQX8g==",
"dependencies": {
"Humanizer.Core": "2.2.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
"Microsoft.CodeAnalysis.Common": "[4.0.0]",
"System.Composition": "1.0.31",
"System.IO.Pipelines": "5.0.1"
}
},
"Microsoft.CodeAnalysis.Workspaces.MSBuild": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "0LYNKESZPK4AQmAXwn8l2e8UF/rYpT0pvceEhiTVjurjQ9Y7pGdUZ5E30r8knxYtT5/9ZESR7wKf/AU00r95Mw==",
"dependencies": {
"Microsoft.Build.Framework": "16.5.0",
"Microsoft.CodeAnalysis.Common": "[4.0.0]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[4.0.0]",
"System.Text.Json": "4.7.0"
}
},
"Microsoft.CSharp": { "Microsoft.CSharp": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.7.0", "resolved": "4.7.0",
@ -776,32 +545,6 @@
"SQLitePCLRaw.core": "2.1.2" "SQLitePCLRaw.core": "2.1.2"
} }
}, },
"Microsoft.DiaSymReader": {
"type": "Transitive",
"resolved": "1.3.0",
"contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==",
"dependencies": {
"NETStandard.Library": "1.6.1"
}
},
"Microsoft.DotNet.Scaffolding.Shared": {
"type": "Transitive",
"resolved": "6.0.3",
"contentHash": "MHPcl+Vm8tEyvCA0dSEMDd/DfEYW2VtkGs7DXEJBbeRToBmHoK/5djIQws4XWcdqcpuJNo1WqX+C35h7Y5G26w==",
"dependencies": {
"Microsoft.CodeAnalysis.CSharp.Features": "4.0.0",
"Microsoft.CodeAnalysis.CSharp.Scripting": "4.0.0",
"Microsoft.CodeAnalysis.CSharp.Workspaces": "4.0.0",
"Microsoft.CodeAnalysis.Features": "4.0.0",
"Microsoft.CodeAnalysis.VisualBasic.Features": "4.0.0",
"Microsoft.CodeAnalysis.VisualBasic.Workspaces": "4.0.0",
"Microsoft.CodeAnalysis.Workspaces.MSBuild": "4.0.0",
"Newtonsoft.Json": "13.0.1",
"NuGet.ProjectModel": "5.11.0",
"System.Collections.Immutable": "6.0.0",
"System.Private.Uri": "4.3.2"
}
},
"Microsoft.EntityFrameworkCore": { "Microsoft.EntityFrameworkCore": {
"type": "Transitive", "type": "Transitive",
"resolved": "6.0.12", "resolved": "6.0.12",
@ -1174,15 +917,6 @@
"System.Security.Cryptography.Cng": "4.5.0" "System.Security.Cryptography.Cng": "4.5.0"
} }
}, },
"Microsoft.NET.StringTools": {
"type": "Transitive",
"resolved": "1.0.0",
"contentHash": "ZYVcoDM0LnSyT5nWoRGfShYdOecCw2sOXWwP6j1Z0u48Xq3+BVvZ+EiPCX9/8Gz439giW+O1H1kWF9Eb/w6rVg==",
"dependencies": {
"System.Memory": "4.5.4",
"System.Runtime.CompilerServices.Unsafe": "5.0.0"
}
},
"Microsoft.NETCore.Platforms": { "Microsoft.NETCore.Platforms": {
"type": "Transitive", "type": "Transitive",
"resolved": "5.0.0", "resolved": "5.0.0",
@ -1190,8 +924,8 @@
}, },
"Microsoft.NETCore.Targets": { "Microsoft.NETCore.Targets": {
"type": "Transitive", "type": "Transitive",
"resolved": "1.1.3", "resolved": "1.1.0",
"contentHash": "3Wrmi0kJDzClwAC+iBdUBpEKmEle8FQNsCs77fkiOIw/9oYA07bL1EZNX0kQ2OMN3xpwvl0vAtOCYY3ndDNlhQ==" "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg=="
}, },
"Microsoft.OData.Core": { "Microsoft.OData.Core": {
"type": "Transitive", "type": "Transitive",
@ -1217,84 +951,6 @@
"resolved": "1.0.0", "resolved": "1.0.0",
"contentHash": "N4KeF3cpcm1PUHym1RmakkzfkEv3GRMyofVv40uXsQhCQeglr2OHNcUk2WOG51AKpGO8ynGpo9M/kFXSzghwug==" "contentHash": "N4KeF3cpcm1PUHym1RmakkzfkEv3GRMyofVv40uXsQhCQeglr2OHNcUk2WOG51AKpGO8ynGpo9M/kFXSzghwug=="
}, },
"Microsoft.VisualStudio.Debugger.Contracts": {
"type": "Transitive",
"resolved": "17.2.0",
"contentHash": "br/qV/aHqLqVlqtcMKglCC8MHMMLey0yMkKSplnMl58F5gKjwnh7wjs8+g0j/vf4T6h4KK7JWrC0+oN70pbugg==",
"dependencies": {
"MessagePack": "2.1.152",
"MessagePackAnalyzer": "2.1.152",
"Microsoft.Bcl.AsyncInterfaces": "1.1.1",
"System.Collections.Immutable": "5.0.0"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration": {
"type": "Transitive",
"resolved": "6.0.3",
"contentHash": "rD1Lj6LljO7iEeZJuGtEp0O9rZHvr+tAZJx8QgwdmlrMReaYA0+KQCH/woEdcmBo+ifnwUUyNgG+9NUECYTT9g==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "6.0.0",
"Microsoft.VisualStudio.Web.CodeGeneration.EntityFrameworkCore": "6.0.3",
"System.Collections.Immutable": "6.0.0",
"System.Private.Uri": "4.3.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.Core": {
"type": "Transitive",
"resolved": "6.0.3",
"contentHash": "o+rN2+WrG4NTU4dzcExaMAGpQk84+SJMC8D3v7pe35f6DJQIXC3lc9V9npgNtiiD19aP+Pdto8L5nuwQ83dgTw==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "6.0.0",
"Microsoft.VisualStudio.Web.CodeGeneration.Templating": "6.0.3",
"Newtonsoft.Json": "13.0.1",
"System.Private.Uri": "4.3.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.EntityFrameworkCore": {
"type": "Transitive",
"resolved": "6.0.3",
"contentHash": "Mg0HpwFZyOJQHtW04gbCLekZ8Lt3VSs9s9JqgGm6DXoeTbAbaHhJGZohuT296Z+0MuFJgl9mD1/j1Zof8hPgcA==",
"dependencies": {
"Microsoft.DotNet.Scaffolding.Shared": "6.0.3",
"Microsoft.VisualStudio.Web.CodeGeneration.Core": "6.0.3",
"System.Private.Uri": "4.3.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.Templating": {
"type": "Transitive",
"resolved": "6.0.3",
"contentHash": "TMV1xzJSjNpiWCGkw6/8/XHmYF0HiimH/8kmPZfT/J+WBKABn4DRbZNpgTYNKmcuYxg4mKySFPVpblQ0XMf9Tg==",
"dependencies": {
"Microsoft.AspNetCore.Razor.Language": "6.0.0",
"Microsoft.CodeAnalysis.CSharp": "4.0.0",
"Microsoft.CodeAnalysis.Razor": "6.0.0",
"Microsoft.VisualStudio.Web.CodeGeneration.Utils": "6.0.3",
"System.Private.Uri": "4.3.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.Utils": {
"type": "Transitive",
"resolved": "6.0.3",
"contentHash": "M8k06jnZ0l7031mPYDbLaiiz20ju1MP+FJlpDKVilkAPOQVITSFRDm8Hhd2Pyd+BSj+nCzDC1ZMglK8z+lJ5ig==",
"dependencies": {
"Microsoft.Build": "17.0.0",
"Microsoft.Build.Locator": "1.4.1",
"Microsoft.CodeAnalysis.CSharp.Workspaces": "4.0.0",
"Microsoft.DotNet.Scaffolding.Shared": "6.0.3",
"Newtonsoft.Json": "13.0.1",
"System.Private.Uri": "4.3.2"
}
},
"Microsoft.VisualStudio.Web.CodeGenerators.Mvc": {
"type": "Transitive",
"resolved": "6.0.3",
"contentHash": "Oe3QkXildc2AFM33rN9WSLj53kzuQAPLAv7aduz+bnYc86SFBPA/qpYZ2ZJhlKYbrJUpztRqoWvLqGfDT6XkUw==",
"dependencies": {
"Microsoft.DotNet.Scaffolding.Shared": "6.0.3",
"Microsoft.VisualStudio.Web.CodeGeneration": "6.0.3",
"System.Private.Uri": "4.3.2"
}
},
"Microsoft.Win32.Primitives": { "Microsoft.Win32.Primitives": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.3.0", "resolved": "4.3.0",
@ -1416,79 +1072,6 @@
"libsodium": "[1.0.18.2, 1.0.19)" "libsodium": "[1.0.18.2, 1.0.19)"
} }
}, },
"NuGet.Common": {
"type": "Transitive",
"resolved": "5.11.0",
"contentHash": "WCHexQBfSqBDRqP3PSDSUw7YM+PwuvMHGAkT/sXI5UHze4T41yLE+VB/km2Fe0z9y3m2mudcr2djFZezivjMJw==",
"dependencies": {
"NuGet.Frameworks": "5.11.0"
}
},
"NuGet.Configuration": {
"type": "Transitive",
"resolved": "5.11.0",
"contentHash": "NqsQe198CTHoo7NMrKQL8utd6n9yVb9CPgJmpyF6kpEsLFo/9r0wqGL3ln8Mtcz8yuJpOPWFQEoOlzDzu3LfUg==",
"dependencies": {
"NuGet.Common": "5.11.0",
"System.Security.Cryptography.ProtectedData": "4.4.0"
}
},
"NuGet.DependencyResolver.Core": {
"type": "Transitive",
"resolved": "5.11.0",
"contentHash": "kkWhU0msuCRyiIJeoL95j6bXUQMc1mTk8wZ3mMxl+0VzOf39eXSObmxKuJ7eh+6zOMQyzd0TAXU5u5aQSxOVSg==",
"dependencies": {
"NuGet.LibraryModel": "5.11.0",
"NuGet.Protocol": "5.11.0"
}
},
"NuGet.Frameworks": {
"type": "Transitive",
"resolved": "5.11.0",
"contentHash": "eaiXkUjC4NPcquGWzAGMXjuxvLwc6XGKMptSyOGQeT0X70BUZObuybJFZLA0OfTdueLd3US23NBPTBb6iF3V1Q=="
},
"NuGet.LibraryModel": {
"type": "Transitive",
"resolved": "5.11.0",
"contentHash": "Iq0tbX3Rsl4837VlWy90fliA7T2+g2FPdz/s/lK6H9g/5RCta/7AZADV0l/A/f0HDCDlMxBN2ha1hsmgxe1sGQ==",
"dependencies": {
"NuGet.Common": "5.11.0",
"NuGet.Versioning": "5.11.0"
}
},
"NuGet.Packaging": {
"type": "Transitive",
"resolved": "5.11.0",
"contentHash": "knlpQuqTL8BEXUHTdZ9Wlz3pjck5nv0OYsCpSkaQAukl7fFcX4apAs8cwJgxHiEZjfWNG1npZOzpYdHG59v5xQ==",
"dependencies": {
"Newtonsoft.Json": "9.0.1",
"NuGet.Configuration": "5.11.0",
"NuGet.Versioning": "5.11.0",
"System.Security.Cryptography.Cng": "5.0.0",
"System.Security.Cryptography.Pkcs": "5.0.0"
}
},
"NuGet.ProjectModel": {
"type": "Transitive",
"resolved": "5.11.0",
"contentHash": "8q7mAwHHP1/Ua1r3FQDg+kXcFvRgBmCCXQeqTkTVQoO5t3G/AwxzJVt7Jii0eNrM17Wzm975U0gnkNqlp+gdsw==",
"dependencies": {
"NuGet.DependencyResolver.Core": "5.11.0"
}
},
"NuGet.Protocol": {
"type": "Transitive",
"resolved": "5.11.0",
"contentHash": "eS/sJLqMzPz6gonD1zaXIcpDME/1DuKqv0Hlag8RuJcboZJliA15qjfg7UvuQB8/ineOleaEvrTzMjpKE0FdbQ==",
"dependencies": {
"NuGet.Packaging": "5.11.0"
}
},
"NuGet.Versioning": {
"type": "Transitive",
"resolved": "5.11.0",
"contentHash": "mCv/GzvMk5iatWoZY41PoIShEbwVxq9CDCc1fV/uqPFKZ4DD/1JuKZ5AL/FJJRsTanvMR3EOXKYCLdQ7PFYn8Q=="
},
"Otp.NET": { "Otp.NET": {
"type": "Transitive", "type": "Transitive",
"resolved": "1.2.2", "resolved": "1.2.2",
@ -1942,102 +1525,6 @@
"System.Threading": "4.0.11" "System.Threading": "4.0.11"
} }
}, },
"System.Composition": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "I+D26qpYdoklyAVUdqwUBrEIckMNjAYnuPJy/h9dsQItpQwVREkDFs4b4tkBza0kT2Yk48Lcfsv2QQ9hWsh9Iw==",
"dependencies": {
"System.Composition.AttributedModel": "1.0.31",
"System.Composition.Convention": "1.0.31",
"System.Composition.Hosting": "1.0.31",
"System.Composition.Runtime": "1.0.31",
"System.Composition.TypedParts": "1.0.31"
}
},
"System.Composition.AttributedModel": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "NHWhkM3ZkspmA0XJEsKdtTt1ViDYuojgSND3yHhTzwxepiwqZf+BCWuvCbjUt4fe0NxxQhUDGJ5km6sLjo9qnQ==",
"dependencies": {
"System.Reflection": "4.3.0",
"System.Runtime": "4.3.0"
}
},
"System.Composition.Convention": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "GLjh2Ju71k6C0qxMMtl4efHa68NmWeIUYh4fkUI8xbjQrEBvFmRwMDFcylT8/PR9SQbeeL48IkFxU/+gd0nYEQ==",
"dependencies": {
"System.Collections": "4.3.0",
"System.Composition.AttributedModel": "1.0.31",
"System.Diagnostics.Debug": "4.3.0",
"System.Diagnostics.Tools": "4.3.0",
"System.Globalization": "4.3.0",
"System.Linq": "4.3.0",
"System.Linq.Expressions": "4.3.0",
"System.Reflection": "4.3.0",
"System.Reflection.Extensions": "4.3.0",
"System.Resources.ResourceManager": "4.3.0",
"System.Runtime": "4.3.0",
"System.Threading": "4.3.0"
}
},
"System.Composition.Hosting": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "fN1bT4RX4vUqjbgoyuJFVUizAl2mYF5VAb+bVIxIYZSSc0BdnX+yGAxcavxJuDDCQ1K+/mdpgyEFc8e9ikjvrg==",
"dependencies": {
"System.Collections": "4.3.0",
"System.Composition.Runtime": "1.0.31",
"System.Diagnostics.Debug": "4.3.0",
"System.Diagnostics.Tools": "4.3.0",
"System.Globalization": "4.3.0",
"System.Linq": "4.3.0",
"System.Linq.Expressions": "4.3.0",
"System.ObjectModel": "4.3.0",
"System.Reflection": "4.3.0",
"System.Reflection.Extensions": "4.3.0",
"System.Resources.ResourceManager": "4.3.0",
"System.Runtime": "4.3.0",
"System.Threading": "4.3.0"
}
},
"System.Composition.Runtime": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "0LEJN+2NVM89CE4SekDrrk5tHV5LeATltkp+9WNYrR+Huiyt0vaCqHbbHtVAjPyeLWIc8dOz/3kthRBj32wGQg==",
"dependencies": {
"System.Collections": "4.3.0",
"System.Diagnostics.Debug": "4.3.0",
"System.Diagnostics.Tools": "4.3.0",
"System.Globalization": "4.3.0",
"System.Linq": "4.3.0",
"System.Reflection": "4.3.0",
"System.Resources.ResourceManager": "4.3.0",
"System.Runtime": "4.3.0"
}
},
"System.Composition.TypedParts": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "0Zae/FtzeFgDBBuILeIbC/T9HMYbW4olAmi8XqqAGosSOWvXfiQLfARZEhiGd0LVXaYgXr0NhxiU1LldRP1fpQ==",
"dependencies": {
"System.Collections": "4.3.0",
"System.Composition.AttributedModel": "1.0.31",
"System.Composition.Hosting": "1.0.31",
"System.Composition.Runtime": "1.0.31",
"System.Diagnostics.Debug": "4.3.0",
"System.Diagnostics.Tools": "4.3.0",
"System.Globalization": "4.3.0",
"System.Linq": "4.3.0",
"System.Linq.Expressions": "4.3.0",
"System.Reflection": "4.3.0",
"System.Reflection.Extensions": "4.3.0",
"System.Resources.ResourceManager": "4.3.0",
"System.Runtime": "4.3.0",
"System.Runtime.Extensions": "4.3.0"
}
},
"System.Configuration.ConfigurationManager": { "System.Configuration.ConfigurationManager": {
"type": "Transitive", "type": "Transitive",
"resolved": "6.0.0", "resolved": "6.0.0",
@ -2641,15 +2128,6 @@
"System.Xml.XmlSerializer": "4.0.11" "System.Xml.XmlSerializer": "4.0.11"
} }
}, },
"System.Private.Uri": {
"type": "Transitive",
"resolved": "4.3.2",
"contentHash": "o1+7RJnu3Ik3PazR7Z7tJhjPdE000Eq2KGLLWhqJJKXj04wrS8lwb1OFtDF9jzXXADhUuZNJZlPc98uwwqmpFA==",
"dependencies": {
"Microsoft.NETCore.Platforms": "1.1.1",
"Microsoft.NETCore.Targets": "1.1.3"
}
},
"System.Reflection": { "System.Reflection": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.3.0", "resolved": "4.3.0",
@ -2664,8 +2142,15 @@
}, },
"System.Reflection.Emit": { "System.Reflection.Emit": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.6.0", "resolved": "4.3.0",
"contentHash": "qAo4jyXtC9i71iElngX7P2r+zLaiHzxKwf66sc3X91tL5Ks6fnQ1vxL04o7ZSm3sYfLExySL7GN8aTpNYpU1qw==" "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==",
"dependencies": {
"System.IO": "4.3.0",
"System.Reflection": "4.3.0",
"System.Reflection.Emit.ILGeneration": "4.3.0",
"System.Reflection.Primitives": "4.3.0",
"System.Runtime": "4.3.0"
}
}, },
"System.Reflection.Emit.ILGeneration": { "System.Reflection.Emit.ILGeneration": {
"type": "Transitive", "type": "Transitive",
@ -2679,8 +2164,14 @@
}, },
"System.Reflection.Emit.Lightweight": { "System.Reflection.Emit.Lightweight": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.6.0", "resolved": "4.3.0",
"contentHash": "j/V5HVvxvBQ7uubYD0PptQW2KGsi1Pc2kZ9yfwLixv3ADdjL/4M78KyC5e+ymW612DY8ZE4PFoZmWpoNmN2mqg==" "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==",
"dependencies": {
"System.Reflection": "4.3.0",
"System.Reflection.Emit.ILGeneration": "4.3.0",
"System.Reflection.Primitives": "4.3.0",
"System.Runtime": "4.3.0"
}
}, },
"System.Reflection.Extensions": { "System.Reflection.Extensions": {
"type": "Transitive", "type": "Transitive",
@ -2693,11 +2184,6 @@
"System.Runtime": "4.3.0" "System.Runtime": "4.3.0"
} }
}, },
"System.Reflection.Metadata": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ=="
},
"System.Reflection.Primitives": { "System.Reflection.Primitives": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.3.0", "resolved": "4.3.0",
@ -3124,11 +2610,6 @@
"System.Runtime": "4.3.0" "System.Runtime": "4.3.0"
} }
}, },
"System.Threading.Tasks.Dataflow": {
"type": "Transitive",
"resolved": "4.9.0",
"contentHash": "dTS+3D/GtG2/Pvc3E5YzVvAa7aQJgLDlZDIzukMOJjYudVOQOUXEU68y6Zi3Nn/jqIeB5kOCwrGbQFAKHVzXEQ=="
},
"System.Threading.Tasks.Extensions": { "System.Threading.Tasks.Extensions": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.5.4", "resolved": "4.5.4",
@ -3300,71 +2781,71 @@
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
}, },
"infrastructure.dapper": { "infrastructure.dapper": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Dapper": "[2.0.123, )" "Dapper": "2.0.123"
} }
}, },
"infrastructure.entityframework": { "infrastructure.entityframework": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoMapper.Extensions.Microsoft.DependencyInjection": "[11.0.0, )", "AutoMapper.Extensions.Microsoft.DependencyInjection": "11.0.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Microsoft.EntityFrameworkCore.Relational": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Relational": "6.0.12",
"Microsoft.EntityFrameworkCore.SqlServer": "[6.0.12, )", "Microsoft.EntityFrameworkCore.SqlServer": "6.0.12",
"Microsoft.EntityFrameworkCore.Sqlite": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Sqlite": "6.0.12",
"Npgsql.EntityFrameworkCore.PostgreSQL": "[6.0.8, )", "Npgsql.EntityFrameworkCore.PostgreSQL": "6.0.8",
"Pomelo.EntityFrameworkCore.MySql": "[6.0.2, )", "Pomelo.EntityFrameworkCore.MySql": "6.0.2",
"linq2db.EntityFrameworkCore": "[6.11.0, )" "linq2db.EntityFrameworkCore": "6.11.0"
} }
}, },
"sharedweb": { "sharedweb": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Infrastructure.Dapper": "[2023.2.0, )", "Infrastructure.Dapper": "2023.2.2",
"Infrastructure.EntityFramework": "[2023.2.0, )" "Infrastructure.EntityFramework": "2023.2.2"
} }
} }
} }

View File

@ -1,4 +1,6 @@
namespace Bit.Core; using System.Reflection;
namespace Bit.Core;
public static class Constants public static class Constants
{ {
@ -26,4 +28,13 @@ public static class AuthenticationSchemes
public static class FeatureFlagKeys public static class FeatureFlagKeys
{ {
public const string SecretsManager = "secrets-manager"; public const string SecretsManager = "secrets-manager";
public const string DisplayEuEnvironment = "display-eu-environment";
public static List<string> GetAllKeys()
{
return typeof(FeatureFlagKeys).GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy)
.Where(fi => fi.IsLiteral && !fi.IsInitOnly && fi.FieldType == typeof(string))
.Select(x => (string)x.GetRawConstantValue())
.ToList();
}
} }

View File

@ -13,7 +13,6 @@ public class AuthRequest : ITableObject<Guid>
public Enums.DeviceType RequestDeviceType { get; set; } public Enums.DeviceType RequestDeviceType { get; set; }
[MaxLength(50)] [MaxLength(50)]
public string RequestIpAddress { get; set; } public string RequestIpAddress { get; set; }
public string RequestFingerprint { get; set; }
public Guid? ResponseDeviceId { get; set; } public Guid? ResponseDeviceId { get; set; }
[MaxLength(25)] [MaxLength(25)]
public string AccessCode { get; set; } public string AccessCode { get; set; }

View File

@ -13,4 +13,5 @@ public enum PolicyType : byte
ResetPassword = 8, ResetPassword = 8,
MaximumVaultTimeout = 9, MaximumVaultTimeout = 9,
DisablePersonalVaultExport = 10, DisablePersonalVaultExport = 10,
ActivateAutofill = 11,
} }

View File

@ -41,5 +41,7 @@ public enum ReferenceEventType
[EnumMember(Value = "organization-edited-by-admin")] [EnumMember(Value = "organization-edited-by-admin")]
OrganizationEditedByAdmin, OrganizationEditedByAdmin,
[EnumMember(Value = "organization-created-by-admin")] [EnumMember(Value = "organization-created-by-admin")]
OrganizationCreatedByAdmin OrganizationCreatedByAdmin,
[EnumMember(Value = "sm-service-account-accessed-secret")]
SmServiceAccountAccessedSecret,
} }

View File

@ -5,7 +5,6 @@
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Bitwarden</title> <title>Bitwarden</title>
</head> </head>
<body style="-webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none; height: 100%; line-height: 25px; width: 100% !important; margin: 0;" bgcolor="#f6f6f6"> <body style="-webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none; height: 100%; line-height: 25px; width: 100% !important; margin: 0;" bgcolor="#f6f6f6">
<style type="text/css"> <style type="text/css">
 body {  body {
@ -47,7 +46,18 @@
background-color: #f6f6f6; background-color: #f6f6f6;
} }
@media only screen and (max-width: 600px) { .white-title {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
box-sizing: border-box;
font-size: 24px;
line-height: 32px;
font-weight: 700;
-webkit-font-smoothing: antialiased;
-webkit-text-size-adjust: none;
color: #ffffff;
}
@media only screen and (max-width: 350px) {
body { body {
padding: 0 !important; padding: 0 !important;
} }
@ -91,17 +101,60 @@
.indented { .indented {
padding-left: 10px; padding-left: 10px;
} }
.title-header-text {
width: 100%;
display: block;
padding-top: 75px;
padding-bottom: 0px;
padding-left: 35px;
padding-right: 20px;
}
.title-header-image {
width: 100%;
display: block;
}
.footer-image {
display: none;
}
.footer-text {
width: 100%;
}
} }
@media only screen and (min-width: 600px) { @media only screen and (min-width: 350px) {
.title-header-text {
width: 65%;
display: inline-block;
padding-top: 75px;
padding-bottom: 75px;
padding-left: 35px;
padding-right: 20px;
}
.title-header-image {
display: inline-block;
}
{{! Fix for Apple Mail }} {{! Fix for Apple Mail }}
.content-table { .content-table {
width: 600px !important; width: 600px !important;
} }
.footer-image {
display: block;
}
.footer-text {
width: 65%;
}
} }
/* Component styling - these are explicitly applied via classes so that they can be /* Component styling - these are explicitly applied via classes so that they can be
gradually introduced as we update templates.*/ gradually introduced as we update templates.*/
a.inline-link { a.inline-link {
font-weight: bold; font-weight: bold;
color: #175DDC; color: #175DDC;
@ -119,54 +172,58 @@
</style> </style>
{{! Yahoo center fix }} {{! Yahoo center fix }}
<table width="100%" cellpadding="0" cellspacing="0" bgcolor="#f6f6f6"><tr><td class="container" width="100%" align="center"> <table width="100%" cellpadding="0" cellspacing="0" bgcolor="#f6f6f6">
{{! 600px container }} <tr>
<table cellpadding="0" cellspacing="0" width="100%" class="content-table"> <td class="container" width="100%" align="center">
<tr> {{! 600px container }}
<td></td> {{! Left column (center fix) }} <table cellpadding="0" cellspacing="0" width="100%" class="content-table">
<td class="content" align="center" valign="top" width="600" style="padding-bottom: 20px;"> <tr>
<table class="header" cellpadding="0" cellspacing="0" width="100%"> <td></td> {{! Left column (center fix) }}
<tr> <td class="content" align="center" valign="top" width="600" style="padding-bottom: 20px;">
<td valign="middle" class="aligncenter middle logo" style="padding: 20px 0 10px;" align="center"> <table class="header" cellpadding="0" cellspacing="0" width="100%">
<img src="https://bitwarden.com/images/logo-horizontal-blue.png" alt="" width="250" height="39" /> <tr>
</td> <td valign="middle" class="aligncenter middle logo" style="padding: 20px 0 10px;" align="center">
</tr> <img src="https://bitwarden.com/images/logo-horizontal-blue.png" alt="" width="250" height="39" />
</table> </td>
<table class="main" cellpadding="0" cellspacing="0" style="border: 1px solid #e9e9e9; border-radius: 3px;" bgcolor="white"> </tr>
<tr> </table>
<td class="content-wrap" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 16px; color: #333; line-height: 25px; margin: 0; -webkit-font-smoothing: antialiased; padding: 20px; -webkit-text-size-adjust: none;" valign="top"> <table class="main" cellpadding="0" cellspacing="0" style="border: 1px solid #e9e9e9; border-radius: 3px;" bgcolor="white">
<tr>
<td class="content-wrap" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 16px; color: #333; line-height: 25px; margin: 0; -webkit-font-smoothing: antialiased; padding: 20px; -webkit-text-size-adjust: none;" valign="top">
{{>@partial-block}} {{>@partial-block}}
</td> </td>
</tr> </tr>
</table> </table>
<table class="footer" cellpadding="0" cellspacing="0" width="100%" style="margin: 0; width: 100%;"> <table class="footer" cellpadding="0" cellspacing="0" width="100%" style="margin: 0; width: 100%;">
<tr> <tr>
<td class="aligncenter social-icons" align="center" style="margin: 0; padding: 15px 0 0 0;" valign="top"> <td class="aligncenter social-icons" align="center" style="margin: 0; padding: 15px 0 0 0;" valign="top">
<table cellpadding="0" cellspacing="0" style="margin: 0 auto;"> <table cellpadding="0" cellspacing="0" style="margin: 0 auto;">
<tr> <tr>
<td style="margin: 0; padding: 0 10px;" valign="top"><a href="https://twitter.com/bitwarden" target="_blank"><img src="https://bitwarden.com/images/mail-twitter.png" alt="Twitter" width="30" height="30" /></a></td> <td style="margin: 0; padding: 0 10px;" valign="top"><a href="https://twitter.com/bitwarden" target="_blank"><img src="https://bitwarden.com/images/mail-twitter.png" alt="Twitter" width="30" height="30" /></a></td>
<td style="margin: 0; padding: 0 10px;" valign="top"><a href="https://www.reddit.com/r/Bitwarden/" target="_blank"><img src="https://bitwarden.com/images/mail-reddit.png" alt="Reddit" width="30" height="30" /></a></td> <td style="margin: 0; padding: 0 10px;" valign="top"><a href="https://www.reddit.com/r/Bitwarden/" target="_blank"><img src="https://bitwarden.com/images/mail-reddit.png" alt="Reddit" width="30" height="30" /></a></td>
<td style="margin: 0; padding: 0 10px;" valign="top"><a href="https://community.bitwarden.com/" target="_blank"><img src="https://bitwarden.com/images/mail-discourse.png" alt="CommunityForums" width="30" height="30" /></a></td> <td style="margin: 0; padding: 0 10px;" valign="top"><a href="https://community.bitwarden.com/" target="_blank"><img src="https://bitwarden.com/images/mail-discourse.png" alt="CommunityForums" width="30" height="30" /></a></td>
<td style="margin: 0; padding: 0 10px;" valign="top"><a href="https://github.com/bitwarden" target="_blank"><img src="https://bitwarden.com/images/mail-github.png" alt="GitHub" width="30" height="30" /></a></td> <td style="margin: 0; padding: 0 10px;" valign="top"><a href="https://github.com/bitwarden" target="_blank"><img src="https://bitwarden.com/images/mail-github.png" alt="GitHub" width="30" height="30" /></a></td>
<td style="margin: 0; padding: 0 10px;" valign="top"><a href="https://www.youtube.com/channel/UCId9a_jQqvJre0_dE2lE_Rw" target="_blank"><img src="https://bitwarden.com/images/mail-youtube.png" alt="Youtube" width="30" height="30" /></a></td> <td style="margin: 0; padding: 0 10px;" valign="top"><a href="https://www.youtube.com/channel/UCId9a_jQqvJre0_dE2lE_Rw" target="_blank"><img src="https://bitwarden.com/images/mail-youtube.png" alt="Youtube" width="30" height="30" /></a></td>
<td style="margin: 0; padding: 0 10px;" valign="top"><a href="https://www.linkedin.com/company/bitwarden1/" target="_blank"><img src="https://bitwarden.com/images/mail-linkedin.png" alt="LinkedIn" width="30" height="30" /></a></td> <td style="margin: 0; padding: 0 10px;" valign="top"><a href="https://www.linkedin.com/company/bitwarden1/" target="_blank"><img src="https://bitwarden.com/images/mail-linkedin.png" alt="LinkedIn" width="30" height="30" /></a></td>
<td style="margin: 0; padding: 0 10px;" valign="top"><a href="https://www.facebook.com/bitwarden/" target="_blank"><img src="https://bitwarden.com/images/mail-facebook.png" alt="Facebook" width="30" height="30" /></a></td> <td style="margin: 0; padding: 0 10px;" valign="top"><a href="https://www.facebook.com/bitwarden/" target="_blank"><img src="https://bitwarden.com/images/mail-facebook.png" alt="Facebook" width="30" height="30" /></a></td>
</tr> </tr>
</table> </table>
</td> </td>
</tr> </tr>
<tr> <tr>
<td class="content-block" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; color: #666666; line-height: 25px; margin: 0; -webkit-font-smoothing: antialiased; padding: 15px 0 0 0; -webkit-text-size-adjust: none; text-align: center;" valign="top"> <td class="content-block" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; color: #666666; line-height: 25px; margin: 0; -webkit-font-smoothing: antialiased; padding: 15px 0 0 0; -webkit-text-size-adjust: none; text-align: center;" valign="top">
&copy; {{CurrentYear}} Bitwarden Inc. &copy; {{CurrentYear}} Bitwarden Inc.
</td> </td>
</tr> </tr>
</table> </table>
</td> </td>
<td></td> {{! Right column (center fix) }} <td></td> {{! Right column (center fix) }}
</tr> </tr>
</table> </table>
</td></tr></table> </td>
</tr>
</table>
</body> </body>
</html> </html>

View File

@ -0,0 +1,26 @@
{{#>FullHtmlLayout}}
<div width="auto" cellpadding="0" cellspacing="0" style="padding:0; margin:-20px">
<div style="display: block; min-height: 204px; background-color: #175DDC; margin: 0;">
<div class="title-header-text" >
<div style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 24px; color: #ffffff; line-height: 32px; font-weight: 400; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;">
{{TitleFirst}}<b class="white-title">{{TitleSecondBold}}</b>{{TitleThird}}
</div>
</div>
<div class="title-header-image" style="margin-left: auto; margin-right: 0px; vertical-align: bottom;">
<img style="margin-left: auto; margin-right: 0px; display: block;" alt='' src='https://assets.bitwarden.com/email/v1/business.png' />
</div>
</div>
{{>@partial-block}}
<div style="display:block;background-color: #FBFBFB;">
<div class="footer-text" style="display: inline-block; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-style: normal; font-weight: 400; font-size: 16px; line-height: 24px; padding-left: 35px; padding-right: 35px; margin-top: 15px; margin-bottom: 20px; margin-left: auto; margin-right: auto; vertical-align: middle; ">
<p style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-style: normal; font-weight: 600; font-size: 20px; line-height: 28px;">Were here for you!</p>
If you have any questions, search the Bitwarden <a style="text-decoration: none; color: #175DDC; font-weight: 600;" href="https://bitwarden.com/help/">Help</a> site or <a style="text-decoration: none; color: #175DDC; font-weight: 600;" href="https://bitwarden.com/contact/">contact us</a>.
</div>
<div style="display: inline-block; width:33%; margin-left: auto; margin-right: auto; vertical-align: middle; ">
<img class="footer-image" src="https://assets.bitwarden.com/email/v1/chat.png" style="width: 94.73px; height: 77.25px; margin-left: auto; margin-right: 30px;" alt="" />
</div>
</div>
</div>
{{/FullHtmlLayout}}

View File

@ -0,0 +1,11 @@
{{#>FullTextLayout}}
{{TitleFirst}} {{TitleSecondBold}} {{TitleThird}}
{{>@partial-block}}
Were here for you!
If you have any questions, search the Bitwarden Help site or contact us.
- https://bitwarden.com/help/
- https://bitwarden.com/contact/
{{/FullTextLayout}}

View File

@ -1,14 +1,25 @@
{{#>FullHtmlLayout}} {{#>TitleContactUsHtmlLayout}}
<table width="100%" cellpadding="0" cellspacing="0" style="margin: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 16px; color: #333; line-height: 25px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;"> <div>
<tr style="margin: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 16px; color: #333; line-height: 25px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;"> <div style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-style: normal; font-weight: 400; font-size: 16px; line-height: 24px; margin-top: 30px; margin-bottom: 30px; margin-left: 35px; margin-right: 35px;">
<td class="content-block" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 16px; color: #333; line-height: 25px; margin: 0; -webkit-font-smoothing: antialiased; padding: 0 0 10px; -webkit-text-size-adjust: none;" valign="top"> You may now access logins and other items this organizations has shared with you from your Bitwarden vault.
This email is to notify you that you have been confirmed as a user of <b style="margin: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 16px; color: #333; line-height: 25px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;">{{OrganizationName}}</b>. </div>
</td> </div>
</tr> <div>
<tr style="margin: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 16px; color: #333; line-height: 25px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;"> <div style="display: block;" align="center">
<td class="content-block last" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 16px; color: #333; line-height: 25px; margin: 0; -webkit-font-smoothing: antialiased; padding: 0; -webkit-text-size-adjust: none;" valign="top"> <a href="https://vault.bitwarden.com/" clicktracking=off target="_blank" style="color: #ffffff; text-decoration: none; text-align: center; cursor: pointer; border-radius: 5px; background-color: #175DDC; border-color: #175DDC; border-style: solid; border-width: 10px 20px; margin: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 16px; line-height: 25px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;">
Any collections and logins being shared with you by this organization will now appear in your Bitwarden vault. Go to vault
</td> </a>
</tr> </div>
</table> </div>
{{/FullHtmlLayout}} <div>
<div style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-style: normal; font-weight: 400; font-size: 16px; line-height: 24px; margin-top: 30px; margin-bottom: 15px; margin-left: 35px; margin-right: 35px;">
<b>Tip: </b>Use the Bitwarden mobile app to quickly save logins and auto-fill forms. Download from the <a style="text-decoration: none; color: #175DDC; font-weight: 600;" href="https://apps.apple.com/us/app/bitwarden-password-manager/id1137397744">App Store</a> or <a style="text-decoration: none; color: #175DDC; font-weight: 600;" href="https://play.google.com/store/apps/details?id=com.x8bit.bitwarden">Google Play</a>.
</div>
</div>
<div style="margin-bottom: 15px;">
<div style="display: block; box-sizing: border-box; clear: both; text-align: center;">
<a href='https://play.google.com/store/apps/details?id=com.x8bit.bitwarden' target="_blank" style="display: inline-block; vertical-align: top; margin-left: 10px; margin-right: 10px; height: 60px; width: 150px; "><img style="height: 60px; width: 150px; display: inline-block;" alt='Android download' src='https://assets.bitwarden.com/email/v1/google-play-badge.png' /></a>
<a href="https://apps.apple.com/us/app/bitwarden-password-manager/id1137397744" target="_blank" style="display: inline-block; height: 40px; width: 135px; margin-top:10px"><img style="height: 40px; width: 135px; display: inline-block;" alt="iOS download" src="https://assets.bitwarden.com/email/v1/App-store.png" /></a>
</div>
</div>
{{/TitleContactUsHtmlLayout}}

View File

@ -1,5 +1,5 @@
{{#>BasicTextLayout}} {{#>TitleContactUsTextLayout}}
This email is to notify you that you have been confirmed as a user of {{OrganizationName}}. You may now access logins and other items this organizations has shared with you from your Bitwarden vault.
Any collections and logins being shared with you by this organization will now appear in your Bitwarden vault. Tip: Use the Bitwarden mobile app to quickly save logins and auto-fill forms. Download from the App Store or Google Play.
{{/BasicTextLayout}} {{/TitleContactUsTextLayout}}

View File

@ -1,24 +1,15 @@
{{#>FullHtmlLayout}} {{#>TitleContactUsHtmlLayout}}
<table width="100%" cellpadding="0" cellspacing="0" style="margin: 0; box-sizing: border-box; color: #333; line-height: 25px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;"> <div>
<tr style="margin: 0; box-sizing: border-box; color: #333; line-height: 25px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;"> <div style="display: block; margin-top: 35px;" align="center">
<td class="content-block" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 16px; color: #333; line-height: 25px; margin: 0; -webkit-font-smoothing: antialiased; padding: 0 0 10px; -webkit-text-size-adjust: none; text-align: left;" valign="top" align="center"> <a href="{{{Url}}}" clicktracking=off target="_blank" style="color: #ffffff; text-decoration: none; text-align: center; cursor: pointer; border-radius: 5px; background-color: #175DDC; border-color: #175DDC; border-style: solid; border-width: 10px 20px; margin: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 16px; line-height: 25px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;">
You have been invited to join the <b style="margin: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 16px; color: #333; line-height: 25px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;">{{OrganizationName}}</b> organization. This link expires on <b>{{ExpirationDate}}.</b> Join Organization Now
</td> </a>
</tr> </div>
<tr style="margin: 0; box-sizing: border-box; color: #333; line-height: 25px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;"> </div>
<td class="content-block last" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 16px; color: #333; line-height: 25px; margin: 0; -webkit-font-smoothing: antialiased; padding: 0; -webkit-text-size-adjust: none; text-align: left;" valign="top" align="center"> <div>
If you do not wish to join this organization, you can safely ignore this email. <div style="font-family:'Helvetica Neue', Helvetica, Arial, sans-serif; font-style: normal; font-weight: 400; font-size: 16px; line-height: 24px; margin-top: 30px; margin-bottom: 25px; margin-left: 35px; margin-right: 35px;">
<br style="margin: 0; box-sizing: border-box; color: #333; line-height: 25px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;" /> This invitation expires on <b>{{ExpirationDate}}</b>
<br style="margin: 0; box-sizing: border-box; color: #333; line-height: 25px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;" /> </div>
</td> </div>
</tr> {{/TitleContactUsHtmlLayout}}
<tr style="margin: 0; box-sizing: border-box; color: #333; line-height: 25px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;">
<td class="content-block" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 16px; color: #333; line-height: 25px; margin: 0; -webkit-font-smoothing: antialiased; padding: 0 0 10px; -webkit-text-size-adjust: none; text-align: center;" valign="top" align="center">
<a href="{{{Url}}}" clicktracking=off target="_blank" style="color: #ffffff; text-decoration: none; text-align: center; cursor: pointer; display: inline-block; border-radius: 5px; background-color: #175DDC; border-color: #175DDC; border-style: solid; border-width: 10px 20px; margin: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 16px; line-height: 25px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;">
Join Organization Now
</a>
<br style="margin: 0; box-sizing: border-box; color: #333; line-height: 25px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;" />
</td>
</tr>
</table>
{{/FullHtmlLayout}}

View File

@ -1,10 +1,5 @@
{{#>BasicTextLayout}} {{#>TitleContactUsTextLayout}}
You have been invited to join the {{OrganizationName}} organization.
This link expires on {{ExpirationDate}}.
If you do not wish to join this organization, you can safely ignore this email.
{{{Url}}} {{{Url}}}
{{/BasicTextLayout}} This invitation expires on {{ExpirationDate}}.
{{/TitleContactUsTextLayout}}

View File

@ -0,0 +1,9 @@
namespace Bit.Core.Models.Mail;
public class BaseTitleContactUsMailModel : BaseMailModel
{
public string TitleFirst { get; set; }
public string TitleSecondBold { get; set; }
public string TitleThird { get; set; }
}

View File

@ -1,6 +1,6 @@
namespace Bit.Core.Models.Mail; namespace Bit.Core.Models.Mail;
public class OrganizationUserConfirmedViewModel : BaseMailModel public class OrganizationUserConfirmedViewModel : BaseTitleContactUsMailModel
{ {
public string OrganizationName { get; set; } public string OrganizationName { get; set; }
} }

View File

@ -1,6 +1,6 @@
namespace Bit.Core.Models.Mail; namespace Bit.Core.Models.Mail;
public class OrganizationUserInvitedViewModel : BaseMailModel public class OrganizationUserInvitedViewModel : BaseTitleContactUsMailModel
{ {
public string OrganizationName { get; set; } public string OrganizationName { get; set; }
public string OrganizationId { get; set; } public string OrganizationId { get; set; }

View File

@ -0,0 +1,10 @@
using Bit.Core.SecretsManager.Entities;
namespace Bit.Core.SecretsManager.Models.Data;
public class SecretPermissionDetails
{
public Secret Secret;
public bool Read { get; set; }
public bool Write { get; set; }
}

View File

@ -1,6 +1,5 @@
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.SecretsManager.Entities; using Bit.Core.SecretsManager.Entities;
using Bit.Core.SecretsManager.Models.Data;
namespace Bit.Core.SecretsManager.Repositories; namespace Bit.Core.SecretsManager.Repositories;
@ -8,8 +7,7 @@ public interface IProjectRepository
{ {
Task<IEnumerable<Project>> GetManyByOrganizationIdAsync(Guid organizationId, Guid userId, AccessClientType accessType); Task<IEnumerable<Project>> GetManyByOrganizationIdAsync(Guid organizationId, Guid userId, AccessClientType accessType);
Task<IEnumerable<Project>> GetManyByOrganizationIdWriteAccessAsync(Guid organizationId, Guid userId, AccessClientType accessType); Task<IEnumerable<Project>> GetManyByOrganizationIdWriteAccessAsync(Guid organizationId, Guid userId, AccessClientType accessType);
Task<IEnumerable<Project>> GetManyByIds(IEnumerable<Guid> ids); Task<IEnumerable<Project>> GetManyWithSecretsByIds(IEnumerable<Guid> ids);
Task<ProjectPermissionDetails> GetPermissionDetailsByIdAsync(Guid id, Guid userId);
Task<Project> GetByIdAsync(Guid id); Task<Project> GetByIdAsync(Guid id);
Task<Project> CreateAsync(Project project); Task<Project> CreateAsync(Project project);
Task ReplaceAsync(Project project); Task ReplaceAsync(Project project);
@ -19,4 +17,5 @@ public interface IProjectRepository
Task<bool> UserHasWriteAccessToProject(Guid id, Guid userId); Task<bool> UserHasWriteAccessToProject(Guid id, Guid userId);
Task<bool> ServiceAccountHasWriteAccessToProject(Guid id, Guid userId); Task<bool> ServiceAccountHasWriteAccessToProject(Guid id, Guid userId);
Task<bool> ServiceAccountHasReadAccessToProject(Guid id, Guid userId); Task<bool> ServiceAccountHasReadAccessToProject(Guid id, Guid userId);
Task<(bool Read, bool Write)> AccessToProjectAsync(Guid id, Guid userId, AccessClientType accessType);
} }

View File

@ -1,15 +1,16 @@
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.SecretsManager.Entities; using Bit.Core.SecretsManager.Entities;
using Bit.Core.SecretsManager.Models.Data;
namespace Bit.Core.SecretsManager.Repositories; namespace Bit.Core.SecretsManager.Repositories;
public interface ISecretRepository public interface ISecretRepository
{ {
Task<IEnumerable<Secret>> GetManyByOrganizationIdAsync(Guid organizationId, Guid userId, AccessClientType accessType); Task<IEnumerable<SecretPermissionDetails>> GetManyByOrganizationIdAsync(Guid organizationId, Guid userId, AccessClientType accessType);
Task<IEnumerable<Secret>> GetManyByOrganizationIdInTrashAsync(Guid organizationId); Task<IEnumerable<SecretPermissionDetails>> GetManyByOrganizationIdInTrashAsync(Guid organizationId);
Task<IEnumerable<Secret>> GetManyByOrganizationIdInTrashByIdsAsync(Guid organizationId, IEnumerable<Guid> ids); Task<IEnumerable<Secret>> GetManyByOrganizationIdInTrashByIdsAsync(Guid organizationId, IEnumerable<Guid> ids);
Task<IEnumerable<Secret>> GetManyByIds(IEnumerable<Guid> ids); Task<IEnumerable<Secret>> GetManyByIds(IEnumerable<Guid> ids);
Task<IEnumerable<Secret>> GetManyByProjectIdAsync(Guid projectId, Guid userId, AccessClientType accessType); Task<IEnumerable<SecretPermissionDetails>> GetManyByProjectIdAsync(Guid projectId, Guid userId, AccessClientType accessType);
Task<Secret> GetByIdAsync(Guid id); Task<Secret> GetByIdAsync(Guid id);
Task<Secret> CreateAsync(Secret secret); Task<Secret> CreateAsync(Secret secret);
Task<Secret> UpdateAsync(Secret secret); Task<Secret> UpdateAsync(Secret secret);
@ -17,4 +18,6 @@ public interface ISecretRepository
Task HardDeleteManyByIdAsync(IEnumerable<Guid> ids); Task HardDeleteManyByIdAsync(IEnumerable<Guid> ids);
Task RestoreManyByIdAsync(IEnumerable<Guid> ids); Task RestoreManyByIdAsync(IEnumerable<Guid> ids);
Task<IEnumerable<Secret>> ImportAsync(IEnumerable<Secret> secrets); Task<IEnumerable<Secret>> ImportAsync(IEnumerable<Secret> secrets);
Task UpdateRevisionDates(IEnumerable<Guid> ids);
Task<(bool Read, bool Write)> AccessToSecretAsync(Guid id, Guid userId, AccessClientType accessType);
} }

View File

@ -36,4 +36,11 @@ public interface IFeatureService
/// <param name="defaultValue">The default value for the feature.</param> /// <param name="defaultValue">The default value for the feature.</param>
/// <returns>The feature variation value.</returns> /// <returns>The feature variation value.</returns>
string GetStringVariation(string key, ICurrentContext currentContext, string defaultValue = null); string GetStringVariation(string key, ICurrentContext currentContext, string defaultValue = null);
/// <summary>
/// Gets all feature values.
/// </summary>
/// <param name="currentContext">A context providing information that can be used to evaluate the feature values.</param>
/// <returns>A dictionary of feature keys and their values.</returns>
Dictionary<string, object> GetAll(ICurrentContext currentContext);
} }

View File

@ -15,8 +15,8 @@ public interface IMailService
Task SendTwoFactorEmailAsync(string email, string token); Task SendTwoFactorEmailAsync(string email, string token);
Task SendNoMasterPasswordHintEmailAsync(string email); Task SendNoMasterPasswordHintEmailAsync(string email);
Task SendMasterPasswordHintEmailAsync(string email, string hint); Task SendMasterPasswordHintEmailAsync(string email, string hint);
Task SendOrganizationInviteEmailAsync(string organizationName, OrganizationUser orgUser, ExpiringToken token, bool initOrganization = false); Task SendOrganizationInviteEmailAsync(string organizationName, OrganizationUser orgUser, ExpiringToken token, bool isFreeOrg, bool initOrganization = false);
Task BulkSendOrganizationInviteEmailAsync(string organizationName, IEnumerable<(OrganizationUser orgUser, ExpiringToken token)> invites, bool initOrganization = false); Task BulkSendOrganizationInviteEmailAsync(string organizationName, IEnumerable<(OrganizationUser orgUser, ExpiringToken token)> invites, bool isFreeOrg, bool initOrganization = false);
Task SendOrganizationMaxSeatLimitReachedEmailAsync(Organization organization, int maxSeatCount, IEnumerable<string> ownerEmails); Task SendOrganizationMaxSeatLimitReachedEmailAsync(Organization organization, int maxSeatCount, IEnumerable<string> ownerEmails);
Task SendOrganizationAutoscaledEmailAsync(Organization organization, int initialSeatCount, IEnumerable<string> ownerEmails); Task SendOrganizationAutoscaledEmailAsync(Organization organization, int initialSeatCount, IEnumerable<string> ownerEmails);
Task SendOrganizationAcceptedEmailAsync(Organization organization, string userIdentifier, IEnumerable<string> adminEmails); Task SendOrganizationAcceptedEmailAsync(Organization organization, string userIdentifier, IEnumerable<string> adminEmails);

View File

@ -97,7 +97,7 @@ public class CollectionService : ICollectionService
public async Task<IEnumerable<Collection>> GetOrganizationCollections(Guid organizationId) public async Task<IEnumerable<Collection>> GetOrganizationCollections(Guid organizationId)
{ {
if (!await _currentContext.ViewAllCollections(organizationId) && !await _currentContext.ManageUsers(organizationId)) if (!await _currentContext.ViewAllCollections(organizationId) && !await _currentContext.ManageUsers(organizationId) && !await _currentContext.ManageGroups(organizationId))
{ {
throw new NotFoundException(); throw new NotFoundException();
} }

View File

@ -191,6 +191,9 @@ public class HandlebarsMailService : IMailService
var message = CreateDefaultMessage($"You Have Been Confirmed To {organizationName}", email); var message = CreateDefaultMessage($"You Have Been Confirmed To {organizationName}", email);
var model = new OrganizationUserConfirmedViewModel var model = new OrganizationUserConfirmedViewModel
{ {
TitleFirst = "You're confirmed as a member of ",
TitleSecondBold = CoreHelpers.SanitizeForEmail(organizationName, false),
TitleThird = "!",
OrganizationName = CoreHelpers.SanitizeForEmail(organizationName, false), OrganizationName = CoreHelpers.SanitizeForEmail(organizationName, false),
WebVaultUrl = _globalSettings.BaseServiceUri.VaultWithHash, WebVaultUrl = _globalSettings.BaseServiceUri.VaultWithHash,
SiteName = _globalSettings.SiteName SiteName = _globalSettings.SiteName
@ -200,21 +203,24 @@ public class HandlebarsMailService : IMailService
await _mailDeliveryService.SendEmailAsync(message); await _mailDeliveryService.SendEmailAsync(message);
} }
public Task SendOrganizationInviteEmailAsync(string organizationName, OrganizationUser orgUser, ExpiringToken token, bool initOrganization = false) => public Task SendOrganizationInviteEmailAsync(string organizationName, OrganizationUser orgUser, ExpiringToken token, bool isFreeOrg, bool initOrganization = false) =>
BulkSendOrganizationInviteEmailAsync(organizationName, new[] { (orgUser, token) }, initOrganization); BulkSendOrganizationInviteEmailAsync(organizationName, new[] { (orgUser, token) }, isFreeOrg, initOrganization);
public async Task BulkSendOrganizationInviteEmailAsync(string organizationName, IEnumerable<(OrganizationUser orgUser, ExpiringToken token)> invites, bool initOrganization = false) public async Task BulkSendOrganizationInviteEmailAsync(string organizationName, IEnumerable<(OrganizationUser orgUser, ExpiringToken token)> invites, bool isFreeOrg, bool initOrganization = false)
{ {
MailQueueMessage CreateMessage(string email, object model) MailQueueMessage CreateMessage(string email, object model)
{ {
var message = CreateDefaultMessage($"Join {organizationName}", email); var message = CreateDefaultMessage($"Join {organizationName}", email);
return new MailQueueMessage(message, "OrganizationUserInvited", model); return new MailQueueMessage(message, "OrganizationUserInvited", model);
} }
var freeOrgTitle = "A Bitwarden member invited you to an organization. Join now to start securing your passwords!";
var messageModels = invites.Select(invite => CreateMessage(invite.orgUser.Email, var messageModels = invites.Select(invite => CreateMessage(invite.orgUser.Email,
new OrganizationUserInvitedViewModel new OrganizationUserInvitedViewModel
{ {
OrganizationName = CoreHelpers.SanitizeForEmail(organizationName, false), TitleFirst = isFreeOrg ? freeOrgTitle : "Join ",
TitleSecondBold = isFreeOrg ? string.Empty : CoreHelpers.SanitizeForEmail(organizationName, false),
TitleThird = isFreeOrg ? string.Empty : " on Bitwarden and start securing your passwords!",
OrganizationName = CoreHelpers.SanitizeForEmail(organizationName, false) + invite.orgUser.Status,
Email = WebUtility.UrlEncode(invite.orgUser.Email), Email = WebUtility.UrlEncode(invite.orgUser.Email),
OrganizationId = invite.orgUser.OrganizationId.ToString(), OrganizationId = invite.orgUser.OrganizationId.ToString(),
OrganizationUserId = invite.orgUser.Id.ToString(), OrganizationUserId = invite.orgUser.Id.ToString(),
@ -479,6 +485,10 @@ public class HandlebarsMailService : IMailService
Handlebars.RegisterTemplate("FullHtmlLayout", fullHtmlLayoutSource); Handlebars.RegisterTemplate("FullHtmlLayout", fullHtmlLayoutSource);
var fullTextLayoutSource = await ReadSourceAsync("Layouts.Full.text"); var fullTextLayoutSource = await ReadSourceAsync("Layouts.Full.text");
Handlebars.RegisterTemplate("FullTextLayout", fullTextLayoutSource); Handlebars.RegisterTemplate("FullTextLayout", fullTextLayoutSource);
var titleContactUsHtmlLayoutSource = await ReadSourceAsync("Layouts.TitleContactUs.html");
Handlebars.RegisterTemplate("TitleContactUsHtmlLayout", titleContactUsHtmlLayoutSource);
var titleContactUsTextLayoutSource = await ReadSourceAsync("Layouts.TitleContactUs.text");
Handlebars.RegisterTemplate("TitleContactUsTextLayout", titleContactUsTextLayoutSource);
Handlebars.RegisterHelper("date", (writer, context, parameters) => Handlebars.RegisterHelper("date", (writer, context, parameters) =>
{ {

View File

@ -8,6 +8,7 @@ namespace Bit.Core.Services;
public class LaunchDarklyFeatureService : IFeatureService, IDisposable public class LaunchDarklyFeatureService : IFeatureService, IDisposable
{ {
private readonly LdClient _client; private readonly LdClient _client;
private const string _anonymousUser = "25a15cac-58cf-4ac0-ad0f-b17c4bd92294";
public LaunchDarklyFeatureService( public LaunchDarklyFeatureService(
IGlobalSettings globalSettings) IGlobalSettings globalSettings)
@ -63,6 +64,38 @@ public class LaunchDarklyFeatureService : IFeatureService, IDisposable
return _client.StringVariation(key, BuildContext(currentContext), defaultValue); return _client.StringVariation(key, BuildContext(currentContext), defaultValue);
} }
public Dictionary<string, object> GetAll(ICurrentContext currentContext)
{
var results = new Dictionary<string, object>();
var keys = FeatureFlagKeys.GetAllKeys();
var values = _client.AllFlagsState(BuildContext(currentContext));
if (values.Valid)
{
foreach (var key in keys)
{
var value = values.GetFlagValueJson(key);
switch (value.Type)
{
case LaunchDarkly.Sdk.LdValueType.Bool:
results.Add(key, value.AsBool);
break;
case LaunchDarkly.Sdk.LdValueType.Number:
results.Add(key, value.AsInt);
break;
case LaunchDarkly.Sdk.LdValueType.String:
results.Add(key, value.AsString);
break;
}
}
}
return results;
}
public void Dispose() public void Dispose()
{ {
_client?.Dispose(); _client?.Dispose();
@ -72,18 +105,62 @@ public class LaunchDarklyFeatureService : IFeatureService, IDisposable
{ {
var builder = LaunchDarkly.Sdk.Context.MultiBuilder(); var builder = LaunchDarkly.Sdk.Context.MultiBuilder();
if (currentContext.UserId.HasValue) switch (currentContext.ClientType)
{ {
var user = LaunchDarkly.Sdk.Context.Builder(currentContext.UserId.Value.ToString()); case Identity.ClientType.User:
user.Kind(LaunchDarkly.Sdk.ContextKind.Default); {
builder.Add(user.Build()); LaunchDarkly.Sdk.ContextBuilder ldUser;
} if (currentContext.UserId.HasValue)
{
ldUser = LaunchDarkly.Sdk.Context.Builder(currentContext.UserId.Value.ToString());
}
else
{
// group all unauthenticated activity under one anonymous user key and mark as such
ldUser = LaunchDarkly.Sdk.Context.Builder(_anonymousUser);
ldUser.Anonymous(true);
}
if (currentContext.OrganizationId.HasValue) ldUser.Kind(LaunchDarkly.Sdk.ContextKind.Default);
{
var org = LaunchDarkly.Sdk.Context.Builder(currentContext.OrganizationId.Value.ToString()); if (currentContext.Organizations?.Any() ?? false)
org.Kind("org"); {
builder.Add(org.Build()); var ldOrgs = currentContext.Organizations.Select(o => LaunchDarkly.Sdk.LdValue.Of(o.Id.ToString()));
ldUser.Set("organizations", LaunchDarkly.Sdk.LdValue.ArrayFrom(ldOrgs));
}
builder.Add(ldUser.Build());
}
break;
case Identity.ClientType.Organization:
{
if (currentContext.OrganizationId.HasValue)
{
var ldOrg = LaunchDarkly.Sdk.Context.Builder(currentContext.OrganizationId.Value.ToString());
ldOrg.Kind("organization");
builder.Add(ldOrg.Build());
}
}
break;
case Identity.ClientType.ServiceAccount:
{
if (currentContext.UserId.HasValue)
{
var ldServiceAccount = LaunchDarkly.Sdk.Context.Builder(currentContext.UserId.Value.ToString());
ldServiceAccount.Kind("service-account");
builder.Add(ldServiceAccount.Build());
}
if (currentContext.OrganizationId.HasValue)
{
var ldOrg = LaunchDarkly.Sdk.Context.Builder(currentContext.OrganizationId.Value.ToString());
ldOrg.Kind("organization");
builder.Add(ldOrg.Build());
}
}
break;
} }
return builder.Build(); return builder.Build();

View File

@ -1196,7 +1196,7 @@ public class OrganizationService : IOrganizationService
_dataProtector.Protect($"OrganizationUserInvite {orgUser.Id} {orgUser.Email} {CoreHelpers.ToEpocMilliseconds(DateTime.UtcNow)}"); _dataProtector.Protect($"OrganizationUserInvite {orgUser.Id} {orgUser.Email} {CoreHelpers.ToEpocMilliseconds(DateTime.UtcNow)}");
await _mailService.BulkSendOrganizationInviteEmailAsync(organization.Name, await _mailService.BulkSendOrganizationInviteEmailAsync(organization.Name,
orgUsers.Select(o => (o, new ExpiringToken(MakeToken(o), DateTime.UtcNow.AddDays(5))))); orgUsers.Select(o => (o, new ExpiringToken(MakeToken(o), DateTime.UtcNow.AddDays(5)))), organization.PlanType == PlanType.Free);
} }
private async Task SendInviteAsync(OrganizationUser orgUser, Organization organization, bool initOrganization) private async Task SendInviteAsync(OrganizationUser orgUser, Organization organization, bool initOrganization)
@ -1205,8 +1205,7 @@ public class OrganizationService : IOrganizationService
var nowMillis = CoreHelpers.ToEpocMilliseconds(now); var nowMillis = CoreHelpers.ToEpocMilliseconds(now);
var token = _dataProtector.Protect( var token = _dataProtector.Protect(
$"OrganizationUserInvite {orgUser.Id} {orgUser.Email} {nowMillis}"); $"OrganizationUserInvite {orgUser.Id} {orgUser.Email} {nowMillis}");
await _mailService.SendOrganizationInviteEmailAsync(organization.Name, orgUser, new ExpiringToken(token, now.AddDays(5)), organization.PlanType == PlanType.Free, initOrganization);
await _mailService.SendOrganizationInviteEmailAsync(organization.Name, orgUser, new ExpiringToken(token, now.AddDays(5)), initOrganization);
} }
public async Task<OrganizationUser> AcceptUserAsync(Guid organizationUserId, User user, string token, public async Task<OrganizationUser> AcceptUserAsync(Guid organizationUserId, User user, string token,

View File

@ -73,6 +73,14 @@ public class PolicyService : IPolicyService
await DependsOnSingleOrgAsync(org); await DependsOnSingleOrgAsync(org);
} }
break; break;
// Activate Autofill is only available to Enterprise 2020-current plans
case PolicyType.ActivateAutofill:
if (policy.Enabled)
{
LockedTo2020Plan(org);
}
break;
} }
var now = DateTime.UtcNow; var now = DateTime.UtcNow;
@ -168,4 +176,12 @@ public class PolicyService : IPolicyService
throw new BadRequestException("Maximum Vault Timeout policy is enabled."); throw new BadRequestException("Maximum Vault Timeout policy is enabled.");
} }
} }
private void LockedTo2020Plan(Organization org)
{
if (org.PlanType != PlanType.EnterpriseAnnually && org.PlanType != PlanType.EnterpriseMonthly)
{
throw new BadRequestException("This policy is only available to 2020 Enterprise plans.");
}
}
} }

View File

@ -52,12 +52,12 @@ public class NoopMailService : IMailService
return Task.FromResult(0); return Task.FromResult(0);
} }
public Task SendOrganizationInviteEmailAsync(string organizationName, OrganizationUser orgUser, ExpiringToken token, bool initOrganization = false) public Task SendOrganizationInviteEmailAsync(string organizationName, OrganizationUser orgUser, ExpiringToken token, bool isFreeOrg, bool initOrganization = false)
{ {
return Task.FromResult(0); return Task.FromResult(0);
} }
public Task BulkSendOrganizationInviteEmailAsync(string organizationName, IEnumerable<(OrganizationUser orgUser, ExpiringToken token)> invites, bool initOrganization = false) public Task BulkSendOrganizationInviteEmailAsync(string organizationName, IEnumerable<(OrganizationUser orgUser, ExpiringToken token)> invites, bool isFreeOrg, bool initOrganization = false)
{ {
return Task.FromResult(0); return Task.FromResult(0);
} }

View File

@ -2781,71 +2781,71 @@
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
}, },
"infrastructure.dapper": { "infrastructure.dapper": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Dapper": "[2.0.123, )" "Dapper": "2.0.123"
} }
}, },
"infrastructure.entityframework": { "infrastructure.entityframework": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoMapper.Extensions.Microsoft.DependencyInjection": "[11.0.0, )", "AutoMapper.Extensions.Microsoft.DependencyInjection": "11.0.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Microsoft.EntityFrameworkCore.Relational": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Relational": "6.0.12",
"Microsoft.EntityFrameworkCore.SqlServer": "[6.0.12, )", "Microsoft.EntityFrameworkCore.SqlServer": "6.0.12",
"Microsoft.EntityFrameworkCore.Sqlite": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Sqlite": "6.0.12",
"Npgsql.EntityFrameworkCore.PostgreSQL": "[6.0.8, )", "Npgsql.EntityFrameworkCore.PostgreSQL": "6.0.8",
"Pomelo.EntityFrameworkCore.MySql": "[6.0.2, )", "Pomelo.EntityFrameworkCore.MySql": "6.0.2",
"linq2db.EntityFrameworkCore": "[6.11.0, )" "linq2db.EntityFrameworkCore": "6.11.0"
} }
}, },
"sharedweb": { "sharedweb": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Infrastructure.Dapper": "[2023.2.0, )", "Infrastructure.Dapper": "2023.2.2",
"Infrastructure.EntityFramework": "[2023.2.0, )" "Infrastructure.EntityFramework": "2023.2.2"
} }
} }
} }

View File

@ -2781,71 +2781,71 @@
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
}, },
"infrastructure.dapper": { "infrastructure.dapper": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Dapper": "[2.0.123, )" "Dapper": "2.0.123"
} }
}, },
"infrastructure.entityframework": { "infrastructure.entityframework": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoMapper.Extensions.Microsoft.DependencyInjection": "[11.0.0, )", "AutoMapper.Extensions.Microsoft.DependencyInjection": "11.0.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Microsoft.EntityFrameworkCore.Relational": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Relational": "6.0.12",
"Microsoft.EntityFrameworkCore.SqlServer": "[6.0.12, )", "Microsoft.EntityFrameworkCore.SqlServer": "6.0.12",
"Microsoft.EntityFrameworkCore.Sqlite": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Sqlite": "6.0.12",
"Npgsql.EntityFrameworkCore.PostgreSQL": "[6.0.8, )", "Npgsql.EntityFrameworkCore.PostgreSQL": "6.0.8",
"Pomelo.EntityFrameworkCore.MySql": "[6.0.2, )", "Pomelo.EntityFrameworkCore.MySql": "6.0.2",
"linq2db.EntityFrameworkCore": "[6.11.0, )" "linq2db.EntityFrameworkCore": "6.11.0"
} }
}, },
"sharedweb": { "sharedweb": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Infrastructure.Dapper": "[2023.2.0, )", "Infrastructure.Dapper": "2023.2.2",
"Infrastructure.EntityFramework": "[2023.2.0, )" "Infrastructure.EntityFramework": "2023.2.2"
} }
} }
} }

View File

@ -2791,71 +2791,71 @@
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
}, },
"infrastructure.dapper": { "infrastructure.dapper": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Dapper": "[2.0.123, )" "Dapper": "2.0.123"
} }
}, },
"infrastructure.entityframework": { "infrastructure.entityframework": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoMapper.Extensions.Microsoft.DependencyInjection": "[11.0.0, )", "AutoMapper.Extensions.Microsoft.DependencyInjection": "11.0.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Microsoft.EntityFrameworkCore.Relational": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Relational": "6.0.12",
"Microsoft.EntityFrameworkCore.SqlServer": "[6.0.12, )", "Microsoft.EntityFrameworkCore.SqlServer": "6.0.12",
"Microsoft.EntityFrameworkCore.Sqlite": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Sqlite": "6.0.12",
"Npgsql.EntityFrameworkCore.PostgreSQL": "[6.0.8, )", "Npgsql.EntityFrameworkCore.PostgreSQL": "6.0.8",
"Pomelo.EntityFrameworkCore.MySql": "[6.0.2, )", "Pomelo.EntityFrameworkCore.MySql": "6.0.2",
"linq2db.EntityFrameworkCore": "[6.11.0, )" "linq2db.EntityFrameworkCore": "6.11.0"
} }
}, },
"sharedweb": { "sharedweb": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Infrastructure.Dapper": "[2023.2.0, )", "Infrastructure.Dapper": "2023.2.2",
"Infrastructure.EntityFramework": "[2023.2.0, )" "Infrastructure.EntityFramework": "2023.2.2"
} }
} }
} }

View File

@ -2803,71 +2803,71 @@
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
}, },
"infrastructure.dapper": { "infrastructure.dapper": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Dapper": "[2.0.123, )" "Dapper": "2.0.123"
} }
}, },
"infrastructure.entityframework": { "infrastructure.entityframework": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoMapper.Extensions.Microsoft.DependencyInjection": "[11.0.0, )", "AutoMapper.Extensions.Microsoft.DependencyInjection": "11.0.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Microsoft.EntityFrameworkCore.Relational": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Relational": "6.0.12",
"Microsoft.EntityFrameworkCore.SqlServer": "[6.0.12, )", "Microsoft.EntityFrameworkCore.SqlServer": "6.0.12",
"Microsoft.EntityFrameworkCore.Sqlite": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Sqlite": "6.0.12",
"Npgsql.EntityFrameworkCore.PostgreSQL": "[6.0.8, )", "Npgsql.EntityFrameworkCore.PostgreSQL": "6.0.8",
"Pomelo.EntityFrameworkCore.MySql": "[6.0.2, )", "Pomelo.EntityFrameworkCore.MySql": "6.0.2",
"linq2db.EntityFrameworkCore": "[6.11.0, )" "linq2db.EntityFrameworkCore": "6.11.0"
} }
}, },
"sharedweb": { "sharedweb": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Infrastructure.Dapper": "[2023.2.0, )", "Infrastructure.Dapper": "2023.2.2",
"Infrastructure.EntityFramework": "[2023.2.0, )" "Infrastructure.EntityFramework": "2023.2.2"
} }
} }
} }

View File

@ -2610,43 +2610,43 @@
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
} }
} }

View File

@ -9,6 +9,8 @@ using LinqToDB.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
namespace Bit.Infrastructure.EntityFramework;
public static class EntityFrameworkServiceCollectionExtensions public static class EntityFrameworkServiceCollectionExtensions
{ {
public static void SetupEntityFramework(this IServiceCollection services, string connectionString, SupportedDatabaseProviders provider) public static void SetupEntityFramework(this IServiceCollection services, string connectionString, SupportedDatabaseProviders provider)

View File

@ -2783,43 +2783,43 @@
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
} }
} }

View File

@ -2831,71 +2831,71 @@
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
}, },
"infrastructure.dapper": { "infrastructure.dapper": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Dapper": "[2.0.123, )" "Dapper": "2.0.123"
} }
}, },
"infrastructure.entityframework": { "infrastructure.entityframework": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoMapper.Extensions.Microsoft.DependencyInjection": "[11.0.0, )", "AutoMapper.Extensions.Microsoft.DependencyInjection": "11.0.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Microsoft.EntityFrameworkCore.Relational": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Relational": "6.0.12",
"Microsoft.EntityFrameworkCore.SqlServer": "[6.0.12, )", "Microsoft.EntityFrameworkCore.SqlServer": "6.0.12",
"Microsoft.EntityFrameworkCore.Sqlite": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Sqlite": "6.0.12",
"Npgsql.EntityFrameworkCore.PostgreSQL": "[6.0.8, )", "Npgsql.EntityFrameworkCore.PostgreSQL": "6.0.8",
"Pomelo.EntityFrameworkCore.MySql": "[6.0.2, )", "Pomelo.EntityFrameworkCore.MySql": "6.0.2",
"linq2db.EntityFrameworkCore": "[6.11.0, )" "linq2db.EntityFrameworkCore": "6.11.0"
} }
}, },
"sharedweb": { "sharedweb": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Infrastructure.Dapper": "[2023.2.0, )", "Infrastructure.Dapper": "2023.2.2",
"Infrastructure.EntityFramework": "[2023.2.0, )" "Infrastructure.EntityFramework": "2023.2.2"
} }
} }
} }

View File

@ -18,6 +18,7 @@ using Bit.Core.Tokens;
using Bit.Core.Utilities; using Bit.Core.Utilities;
using Bit.Core.Vault.Services; using Bit.Core.Vault.Services;
using Bit.Infrastructure.Dapper; using Bit.Infrastructure.Dapper;
using Bit.Infrastructure.EntityFramework;
using IdentityModel; using IdentityModel;
using IdentityServer4.AccessTokenValidation; using IdentityServer4.AccessTokenValidation;
using IdentityServer4.Configuration; using IdentityServer4.Configuration;
@ -463,7 +464,7 @@ public static class ServiceCollectionExtensions
} }
public static GlobalSettings AddGlobalSettingsServices(this IServiceCollection services, public static GlobalSettings AddGlobalSettingsServices(this IServiceCollection services,
IConfiguration configuration, IWebHostEnvironment environment) IConfiguration configuration, IHostEnvironment environment)
{ {
var globalSettings = new GlobalSettings(); var globalSettings = new GlobalSettings();
ConfigurationBinder.Bind(configuration.GetSection("GlobalSettings"), globalSettings); ConfigurationBinder.Bind(configuration.GetSection("GlobalSettings"), globalSettings);

View File

@ -2781,63 +2781,63 @@
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
}, },
"infrastructure.dapper": { "infrastructure.dapper": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Dapper": "[2.0.123, )" "Dapper": "2.0.123"
} }
}, },
"infrastructure.entityframework": { "infrastructure.entityframework": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoMapper.Extensions.Microsoft.DependencyInjection": "[11.0.0, )", "AutoMapper.Extensions.Microsoft.DependencyInjection": "11.0.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Microsoft.EntityFrameworkCore.Relational": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Relational": "6.0.12",
"Microsoft.EntityFrameworkCore.SqlServer": "[6.0.12, )", "Microsoft.EntityFrameworkCore.SqlServer": "6.0.12",
"Microsoft.EntityFrameworkCore.Sqlite": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Sqlite": "6.0.12",
"Npgsql.EntityFrameworkCore.PostgreSQL": "[6.0.8, )", "Npgsql.EntityFrameworkCore.PostgreSQL": "6.0.8",
"Pomelo.EntityFrameworkCore.MySql": "[6.0.2, )", "Pomelo.EntityFrameworkCore.MySql": "6.0.2",
"linq2db.EntityFrameworkCore": "[6.11.0, )" "linq2db.EntityFrameworkCore": "6.11.0"
} }
} }
} }

View File

@ -5,7 +5,6 @@
@RequestDeviceIdentifier NVARCHAR(50), @RequestDeviceIdentifier NVARCHAR(50),
@RequestDeviceType TINYINT, @RequestDeviceType TINYINT,
@RequestIpAddress VARCHAR(50), @RequestIpAddress VARCHAR(50),
@RequestFingerprint VARCHAR(MAX),
@ResponseDeviceId UNIQUEIDENTIFIER, @ResponseDeviceId UNIQUEIDENTIFIER,
@AccessCode VARCHAR(25), @AccessCode VARCHAR(25),
@PublicKey VARCHAR(MAX), @PublicKey VARCHAR(MAX),
@ -27,7 +26,6 @@ BEGIN
[RequestDeviceIdentifier], [RequestDeviceIdentifier],
[RequestDeviceType], [RequestDeviceType],
[RequestIpAddress], [RequestIpAddress],
[RequestFingerprint],
[ResponseDeviceId], [ResponseDeviceId],
[AccessCode], [AccessCode],
[PublicKey], [PublicKey],
@ -46,7 +44,6 @@ BEGIN
@RequestDeviceIdentifier, @RequestDeviceIdentifier,
@RequestDeviceType, @RequestDeviceType,
@RequestIpAddress, @RequestIpAddress,
@RequestFingerprint,
@ResponseDeviceId, @ResponseDeviceId,
@AccessCode, @AccessCode,
@PublicKey, @PublicKey,

View File

@ -5,7 +5,6 @@
@RequestDeviceIdentifier NVARCHAR(50), @RequestDeviceIdentifier NVARCHAR(50),
@RequestDeviceType SMALLINT, @RequestDeviceType SMALLINT,
@RequestIpAddress VARCHAR(50), @RequestIpAddress VARCHAR(50),
@RequestFingerprint VARCHAR(MAX),
@ResponseDeviceId UNIQUEIDENTIFIER, @ResponseDeviceId UNIQUEIDENTIFIER,
@AccessCode VARCHAR(25), @AccessCode VARCHAR(25),
@PublicKey VARCHAR(MAX), @PublicKey VARCHAR(MAX),
@ -27,7 +26,6 @@ BEGIN
[RequestDeviceIdentifier] = @RequestDeviceIdentifier, [RequestDeviceIdentifier] = @RequestDeviceIdentifier,
[RequestDeviceType] = @RequestDeviceType, [RequestDeviceType] = @RequestDeviceType,
[RequestIpAddress] = @RequestIpAddress, [RequestIpAddress] = @RequestIpAddress,
[RequestFingerprint] = @RequestFingerprint,
[ResponseDeviceId] = @ResponseDeviceId, [ResponseDeviceId] = @ResponseDeviceId,
[AccessCode] = @AccessCode, [AccessCode] = @AccessCode,
[PublicKey] = @PublicKey, [PublicKey] = @PublicKey,

View File

@ -5,7 +5,6 @@
[RequestDeviceIdentifier] NVARCHAR(50) NOT NULL, [RequestDeviceIdentifier] NVARCHAR(50) NOT NULL,
[RequestDeviceType] SMALLINT NOT NULL, [RequestDeviceType] SMALLINT NOT NULL,
[RequestIpAddress] VARCHAR(50) NOT NULL, [RequestIpAddress] VARCHAR(50) NOT NULL,
[RequestFingerprint] VARCHAR(MAX) NOT NULL,
[ResponseDeviceId] UNIQUEIDENTIFIER NULL, [ResponseDeviceId] UNIQUEIDENTIFIER NULL,
[AccessCode] VARCHAR(25) NOT NULL, [AccessCode] VARCHAR(25) NOT NULL,
[PublicKey] VARCHAR(MAX) NOT NULL, [PublicKey] VARCHAR(MAX) NOT NULL,

View File

@ -0,0 +1,94 @@
using System.Net.Http.Headers;
using Bit.Api.IntegrationTest.Factories;
using Bit.Api.IntegrationTest.Helpers;
using Bit.Api.Models.Response;
using Bit.Core.Entities;
using Xunit;
namespace Bit.Api.IntegrationTest.Controllers;
public class ConfigControllerTests : IClassFixture<ApiApplicationFactory>, IAsyncLifetime
{
private readonly HttpClient _client;
private readonly ApiApplicationFactory _factory;
private string _email = null!;
public ConfigControllerTests(ApiApplicationFactory factory)
{
_factory = factory;
_client = _factory.CreateClient();
}
public async Task InitializeAsync()
{
_email = $"integration-test{Guid.NewGuid()}@bitwarden.com";
var tokens = await _factory.LoginWithNewAccount(_email);
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokens.Token);
}
public Task DisposeAsync()
{
_client.Dispose();
return Task.CompletedTask;
}
private async Task LoginAsync()
{
var tokens = await _factory.LoginAsync(_email);
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokens.Token);
}
[Fact]
public async Task GetConfigs_Unauthenticated()
{
_client.DefaultRequestHeaders.Authorization = null;
var response = await _client.GetAsync("/config");
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadFromJsonAsync<ConfigResponseModel>();
Assert.NotNull(result);
Assert.NotEmpty(result!.Version);
}
[Fact]
public async Task GetConfigs_Authenticated()
{
await LoginAsync();
var response = await _client.GetAsync("/config");
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadFromJsonAsync<ConfigResponseModel>();
Assert.NotNull(result);
Assert.NotEmpty(result!.Version);
}
[Theory]
[InlineData(1)]
[InlineData(3)]
public async Task GetConfigs_WithOrganizations(int orgCount)
{
for (var i = 0; i < orgCount; i++)
{
var ownerEmail = $"integration-test{Guid.NewGuid()}@bitwarden.com";
await _factory.LoginWithNewAccount(ownerEmail);
Organization org;
(org, _) = await OrganizationTestHelpers.SignUpAsync(_factory, plan: Core.Enums.PlanType.Free, ownerEmail: ownerEmail,
name: i.ToString(), billingEmail: ownerEmail, ownerKey: i.ToString());
await OrganizationTestHelpers.CreateUserAsync(_factory, org.Id, _email, Core.Enums.OrganizationUserType.User);
}
await LoginAsync();
var response = await _client.GetAsync("/config");
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadFromJsonAsync<ConfigResponseModel>();
Assert.NotNull(result);
Assert.NotEmpty(result!.Version);
}
}

View File

@ -13,7 +13,7 @@ using Xunit;
namespace Bit.Api.IntegrationTest.SecretsManager.Controllers; namespace Bit.Api.IntegrationTest.SecretsManager.Controllers;
public class AccessPoliciesControllerTest : IClassFixture<ApiApplicationFactory>, IAsyncLifetime public class AccessPoliciesControllerTests : IClassFixture<ApiApplicationFactory>, IAsyncLifetime
{ {
private const string _mockEncryptedString = private const string _mockEncryptedString =
"2.3Uk+WNBIoU5xzmVFNcoWzz==|1MsPIYuRfdOHfu/0uY6H2Q==|/98sp4wb6pHP1VTZ9JcNCYgQjEUMFPlqJgCwRk1YXKg="; "2.3Uk+WNBIoU5xzmVFNcoWzz==|1MsPIYuRfdOHfu/0uY6H2Q==|/98sp4wb6pHP1VTZ9JcNCYgQjEUMFPlqJgCwRk1YXKg=";
@ -27,7 +27,7 @@ public class AccessPoliciesControllerTest : IClassFixture<ApiApplicationFactory>
private string _email = null!; private string _email = null!;
private SecretsManagerOrganizationHelper _organizationHelper = null!; private SecretsManagerOrganizationHelper _organizationHelper = null!;
public AccessPoliciesControllerTest(ApiApplicationFactory factory) public AccessPoliciesControllerTests(ApiApplicationFactory factory)
{ {
_factory = factory; _factory = factory;
_client = _factory.CreateClient(); _client = _factory.CreateClient();

View File

@ -14,7 +14,7 @@ using Xunit;
namespace Bit.Api.IntegrationTest.SecretsManager.Controllers; namespace Bit.Api.IntegrationTest.SecretsManager.Controllers;
public class ProjectsControllerTest : IClassFixture<ApiApplicationFactory>, IAsyncLifetime public class ProjectsControllerTests : IClassFixture<ApiApplicationFactory>, IAsyncLifetime
{ {
private readonly string _mockEncryptedString = private readonly string _mockEncryptedString =
"2.3Uk+WNBIoU5xzmVFNcoWzz==|1MsPIYuRfdOHfu/0uY6H2Q==|/98sp4wb6pHP1VTZ9JcNCYgQjEUMFPlqJgCwRk1YXKg="; "2.3Uk+WNBIoU5xzmVFNcoWzz==|1MsPIYuRfdOHfu/0uY6H2Q==|/98sp4wb6pHP1VTZ9JcNCYgQjEUMFPlqJgCwRk1YXKg=";
@ -27,7 +27,7 @@ public class ProjectsControllerTest : IClassFixture<ApiApplicationFactory>, IAsy
private string _email = null!; private string _email = null!;
private SecretsManagerOrganizationHelper _organizationHelper = null!; private SecretsManagerOrganizationHelper _organizationHelper = null!;
public ProjectsControllerTest(ApiApplicationFactory factory) public ProjectsControllerTests(ApiApplicationFactory factory)
{ {
_factory = factory; _factory = factory;
_client = _factory.CreateClient(); _client = _factory.CreateClient();
@ -361,7 +361,7 @@ public class ProjectsControllerTest : IClassFixture<ApiApplicationFactory>, IAsy
results!.Data.Select(x => x.Id).OrderBy(x => x)); results!.Data.Select(x => x.Id).OrderBy(x => x));
Assert.DoesNotContain(results.Data, x => x.Error != null); Assert.DoesNotContain(results.Data, x => x.Error != null);
var projects = await _projectRepository.GetManyByIds(projectIds); var projects = await _projectRepository.GetManyWithSecretsByIds(projectIds);
Assert.Empty(projects); Assert.Empty(projects);
} }

View File

@ -13,7 +13,7 @@ using Xunit;
namespace Bit.Api.IntegrationTest.SecretsManager.Controllers; namespace Bit.Api.IntegrationTest.SecretsManager.Controllers;
public class SecretsControllerTest : IClassFixture<ApiApplicationFactory>, IAsyncLifetime public class SecretsControllerTests : IClassFixture<ApiApplicationFactory>, IAsyncLifetime
{ {
private readonly string _mockEncryptedString = private readonly string _mockEncryptedString =
"2.3Uk+WNBIoU5xzmVFNcoWzz==|1MsPIYuRfdOHfu/0uY6H2Q==|/98sp4wb6pHP1VTZ9JcNCYgQjEUMFPlqJgCwRk1YXKg="; "2.3Uk+WNBIoU5xzmVFNcoWzz==|1MsPIYuRfdOHfu/0uY6H2Q==|/98sp4wb6pHP1VTZ9JcNCYgQjEUMFPlqJgCwRk1YXKg=";
@ -27,7 +27,7 @@ public class SecretsControllerTest : IClassFixture<ApiApplicationFactory>, IAsyn
private string _email = null!; private string _email = null!;
private SecretsManagerOrganizationHelper _organizationHelper = null!; private SecretsManagerOrganizationHelper _organizationHelper = null!;
public SecretsControllerTest(ApiApplicationFactory factory) public SecretsControllerTests(ApiApplicationFactory factory)
{ {
_factory = factory; _factory = factory;
_client = _factory.CreateClient(); _client = _factory.CreateClient();
@ -244,7 +244,8 @@ public class SecretsControllerTest : IClassFixture<ApiApplicationFactory>, IAsyn
secretResponse.EnsureSuccessStatusCode(); secretResponse.EnsureSuccessStatusCode();
var secretResult = await secretResponse.Content.ReadFromJsonAsync<SecretResponseModel>(); var secretResult = await secretResponse.Content.ReadFromJsonAsync<SecretResponseModel>();
var secret = (await _secretRepository.GetManyByProjectIdAsync(project.Id, orgUserId, accessType)).First(); var result = (await _secretRepository.GetManyByProjectIdAsync(project.Id, orgUserId, accessType)).First();
var secret = result.Secret;
Assert.NotNull(secretResult); Assert.NotNull(secretResult);
Assert.Equal(secret.Id.ToString(), secretResult!.Id); Assert.Equal(secret.Id.ToString(), secretResult!.Id);
@ -331,6 +332,108 @@ public class SecretsControllerTest : IClassFixture<ApiApplicationFactory>, IAsyn
Assert.Equal(secret.CreationDate, result.CreationDate); Assert.Equal(secret.CreationDate, result.CreationDate);
} }
[Theory]
[InlineData(false, false)]
[InlineData(true, false)]
[InlineData(false, true)]
public async Task GetSecretsByProject_SmNotEnabled_NotFound(bool useSecrets, bool accessSecrets)
{
var (org, _) = await _organizationHelper.Initialize(useSecrets, accessSecrets);
await LoginAsync(_email);
var project = await _projectRepository.CreateAsync(new Project
{
OrganizationId = org.Id,
Name = _mockEncryptedString,
});
var response = await _client.GetAsync($"/projects/{project.Id}/secrets");
Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
}
[Fact]
public async Task GetSecretsByProject_UserWithNoPermission_EmptyList()
{
var (org, _) = await _organizationHelper.Initialize(true, true);
var (email, orgUser) = await _organizationHelper.CreateNewUser(OrganizationUserType.User, true);
await LoginAsync(email);
var project = await _projectRepository.CreateAsync(new Project()
{
Id = new Guid(),
OrganizationId = org.Id,
Name = _mockEncryptedString
});
var secret = await _secretRepository.CreateAsync(new Secret
{
OrganizationId = org.Id,
Key = _mockEncryptedString,
Value = _mockEncryptedString,
Note = _mockEncryptedString,
Projects = new List<Project> { project },
});
var response = await _client.GetAsync($"/projects/{project.Id}/secrets");
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadFromJsonAsync<SecretWithProjectsListResponseModel>();
Assert.NotNull(result);
Assert.Empty(result!.Secrets);
Assert.Empty(result!.Projects);
}
[Theory]
[InlineData(PermissionType.RunAsAdmin)]
[InlineData(PermissionType.RunAsUserWithPermission)]
public async Task GetSecretsByProject_Success(PermissionType permissionType)
{
var (org, _) = await _organizationHelper.Initialize(true, true);
await LoginAsync(_email);
var project = await _projectRepository.CreateAsync(new Project()
{
Id = new Guid(),
OrganizationId = org.Id,
Name = _mockEncryptedString
});
if (permissionType == PermissionType.RunAsUserWithPermission)
{
var (email, orgUser) = await _organizationHelper.CreateNewUser(OrganizationUserType.User, true);
await LoginAsync(email);
var accessPolicies = new List<BaseAccessPolicy>
{
new UserProjectAccessPolicy
{
GrantedProjectId = project.Id, OrganizationUserId = orgUser.Id, Read = true, Write = true,
},
};
await _accessPolicyRepository.CreateManyAsync(accessPolicies);
}
var secret = await _secretRepository.CreateAsync(new Secret
{
OrganizationId = org.Id,
Key = _mockEncryptedString,
Value = _mockEncryptedString,
Note = _mockEncryptedString,
Projects = new List<Project> { project },
});
var response = await _client.GetAsync($"/projects/{project.Id}/secrets");
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadFromJsonAsync<SecretWithProjectsListResponseModel>();
Assert.NotEmpty(result!.Secrets);
Assert.Equal(secret.Id.ToString(), result.Secrets.First().Id);
Assert.Equal(secret.OrganizationId.ToString(), result.Secrets.First().OrganizationId);
Assert.Equal(secret.Key, result.Secrets.First().Key);
Assert.Equal(secret.CreationDate, result.Secrets.First().CreationDate);
Assert.Equal(secret.RevisionDate, result.Secrets.First().RevisionDate);
Assert.Equal(secret.Projects!.First().Id, result.Projects.First().Id);
Assert.Equal(secret.Projects!.First().Name, result.Projects.First().Name);
}
[Theory] [Theory]
[InlineData(false, false)] [InlineData(false, false)]
[InlineData(true, false)] [InlineData(true, false)]

View File

@ -0,0 +1,79 @@
using System.Net;
using System.Net.Http.Headers;
using Bit.Api.IntegrationTest.Factories;
using Bit.Api.SecretsManager.Models.Request;
using Bit.Core.SecretsManager.Repositories;
using Xunit;
namespace Bit.Api.IntegrationTest.SecretsManager.Controllers;
public class SecretsManagerPortingControllerTests : IClassFixture<ApiApplicationFactory>, IAsyncLifetime
{
private readonly string _mockEncryptedString =
"2.3Uk+WNBIoU5xzmVFNcoWzz==|1MsPIYuRfdOHfu/0uY6H2Q==|/98sp4wb6pHP1VTZ9JcNCYgQjEUMFPlqJgCwRk1YXKg=";
private readonly HttpClient _client;
private readonly ApiApplicationFactory _factory;
private readonly IProjectRepository _projectRepository;
private readonly IAccessPolicyRepository _accessPolicyRepository;
private string _email = null!;
private SecretsManagerOrganizationHelper _organizationHelper = null!;
public SecretsManagerPortingControllerTests(ApiApplicationFactory factory)
{
_factory = factory;
_client = _factory.CreateClient();
_projectRepository = _factory.GetService<IProjectRepository>();
_accessPolicyRepository = _factory.GetService<IAccessPolicyRepository>();
}
public async Task InitializeAsync()
{
_email = $"integration-test{Guid.NewGuid()}@bitwarden.com";
await _factory.LoginWithNewAccount(_email);
_organizationHelper = new SecretsManagerOrganizationHelper(_factory, _email);
}
public Task DisposeAsync()
{
_client.Dispose();
return Task.CompletedTask;
}
private async Task LoginAsync(string email)
{
var tokens = await _factory.LoginAsync(email);
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokens.Token);
}
[Theory]
[InlineData(false, false)]
[InlineData(true, false)]
[InlineData(false, true)]
public async Task Import_SmNotEnabled_NotFound(bool useSecrets, bool accessSecrets)
{
var (org, _) = await _organizationHelper.Initialize(useSecrets, accessSecrets);
await LoginAsync(_email);
var projectsList = new List<SMImportRequestModel.InnerProjectImportRequestModel>();
var secretsList = new List<SMImportRequestModel.InnerSecretImportRequestModel>();
var request = new SMImportRequestModel { Projects = projectsList, Secrets = secretsList };
var response = await _client.PostAsJsonAsync($"sm/{org.Id}/import", request);
Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
}
[Theory]
[InlineData(false, false)]
[InlineData(true, false)]
[InlineData(false, true)]
public async Task Export_SmNotEnabled_NotFound(bool useSecrets, bool accessSecrets)
{
var (org, _) = await _organizationHelper.Initialize(useSecrets, accessSecrets);
await LoginAsync(_email);
var response = await _client.GetAsync($"sm/{org.Id}/export");
Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
}
}

View File

@ -9,7 +9,7 @@ using Secret = Bit.Core.SecretsManager.Entities.Secret;
namespace Bit.Api.IntegrationTest.SecretsManager.Controllers; namespace Bit.Api.IntegrationTest.SecretsManager.Controllers;
public class SecretsTrashControllerTest : IClassFixture<ApiApplicationFactory>, IAsyncLifetime public class SecretsTrashControllerTests : IClassFixture<ApiApplicationFactory>, IAsyncLifetime
{ {
private readonly string _mockEncryptedString = private readonly string _mockEncryptedString =
"2.3Uk+WNBIoU5xzmVFNcoWzz==|1MsPIYuRfdOHfu/0uY6H2Q==|/98sp4wb6pHP1VTZ9JcNCYgQjEUMFPlqJgCwRk1YXKg="; "2.3Uk+WNBIoU5xzmVFNcoWzz==|1MsPIYuRfdOHfu/0uY6H2Q==|/98sp4wb6pHP1VTZ9JcNCYgQjEUMFPlqJgCwRk1YXKg=";
@ -21,7 +21,7 @@ public class SecretsTrashControllerTest : IClassFixture<ApiApplicationFactory>,
private string _email = null!; private string _email = null!;
private SecretsManagerOrganizationHelper _organizationHelper = null!; private SecretsManagerOrganizationHelper _organizationHelper = null!;
public SecretsTrashControllerTest(ApiApplicationFactory factory) public SecretsTrashControllerTests(ApiApplicationFactory factory)
{ {
_factory = factory; _factory = factory;
_client = _factory.CreateClient(); _client = _factory.CreateClient();

View File

@ -14,7 +14,7 @@ using Xunit;
namespace Bit.Api.IntegrationTest.SecretsManager.Controllers; namespace Bit.Api.IntegrationTest.SecretsManager.Controllers;
public class ServiceAccountsControllerTest : IClassFixture<ApiApplicationFactory>, IAsyncLifetime public class ServiceAccountsControllerTests : IClassFixture<ApiApplicationFactory>, IAsyncLifetime
{ {
private const string _mockEncryptedString = private const string _mockEncryptedString =
"2.3Uk+WNBIoU5xzmVFNcoWzz==|1MsPIYuRfdOHfu/0uY6H2Q==|/98sp4wb6pHP1VTZ9JcNCYgQjEUMFPlqJgCwRk1YXKg="; "2.3Uk+WNBIoU5xzmVFNcoWzz==|1MsPIYuRfdOHfu/0uY6H2Q==|/98sp4wb6pHP1VTZ9JcNCYgQjEUMFPlqJgCwRk1YXKg=";
@ -32,7 +32,7 @@ public class ServiceAccountsControllerTest : IClassFixture<ApiApplicationFactory
private string _email = null!; private string _email = null!;
private SecretsManagerOrganizationHelper _organizationHelper = null!; private SecretsManagerOrganizationHelper _organizationHelper = null!;
public ServiceAccountsControllerTest(ApiApplicationFactory factory) public ServiceAccountsControllerTests(ApiApplicationFactory factory)
{ {
_factory = factory; _factory = factory;
_client = _factory.CreateClient(); _client = _factory.CreateClient();
@ -120,6 +120,83 @@ public class ServiceAccountsControllerTest : IClassFixture<ApiApplicationFactory
Assert.Equal(2, result.Data.Count()); Assert.Equal(2, result.Data.Count());
} }
[Theory]
[InlineData(false, false)]
[InlineData(true, false)]
[InlineData(false, true)]
public async Task GetByServiceAccountId_SmNotEnabled_NotFound(bool useSecrets, bool accessSecrets)
{
var (org, _) = await _organizationHelper.Initialize(useSecrets, accessSecrets);
await LoginAsync(_email);
var serviceAccount = await _serviceAccountRepository.CreateAsync(new ServiceAccount
{
OrganizationId = org.Id,
Name = _mockEncryptedString,
});
var response = await _client.GetAsync($"/service-accounts/{serviceAccount.Id}");
Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
}
[Fact]
public async Task GetByServiceAccountId_UserWithoutPermission_NotFound()
{
var (org, _) = await _organizationHelper.Initialize(true, true);
var (email, orgUser) = await _organizationHelper.CreateNewUser(OrganizationUserType.User, true);
await LoginAsync(email);
var serviceAccount = await _serviceAccountRepository.CreateAsync(new ServiceAccount
{
OrganizationId = org.Id,
Name = _mockEncryptedString,
});
var response = await _client.GetAsync($"/service-accounts/{serviceAccount.Id}");
Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
}
[Theory]
[InlineData(PermissionType.RunAsAdmin)]
[InlineData(PermissionType.RunAsUserWithPermission)]
public async Task GetByServiceAccountId_Success(PermissionType permissionType)
{
var (org, _) = await _organizationHelper.Initialize(true, true);
await LoginAsync(_email);
var serviceAccount = await _serviceAccountRepository.CreateAsync(new ServiceAccount
{
OrganizationId = org.Id,
Name = _mockEncryptedString,
});
if (permissionType == PermissionType.RunAsUserWithPermission)
{
var (email, orgUser) = await _organizationHelper.CreateNewUser(OrganizationUserType.User, true);
await LoginAsync(email);
await _accessPolicyRepository.CreateManyAsync(new List<BaseAccessPolicy> {
new UserServiceAccountAccessPolicy
{
GrantedServiceAccountId = serviceAccount.Id,
OrganizationUserId = orgUser.Id,
Write = true,
Read = true,
},
});
}
var response = await _client.GetAsync($"/service-accounts/{serviceAccount.Id}");
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadFromJsonAsync<ServiceAccountResponseModel>();
Assert.NotNull(result);
Assert.Equal(serviceAccount.Id.ToString(), result!.Id);
Assert.Equal(serviceAccount.OrganizationId.ToString(), result.OrganizationId);
Assert.Equal(serviceAccount.Name, result.Name);
Assert.Equal(serviceAccount.CreationDate, result.CreationDate);
Assert.Equal(serviceAccount.RevisionDate, result.RevisionDate);
}
[Theory] [Theory]
[InlineData(false, false)] [InlineData(false, false)]
[InlineData(true, false)] [InlineData(true, false)]
@ -361,6 +438,99 @@ public class ServiceAccountsControllerTest : IClassFixture<ApiApplicationFactory
Assert.Empty(sa); Assert.Empty(sa);
} }
[Theory]
[InlineData(false, false)]
[InlineData(true, false)]
[InlineData(false, true)]
public async Task GetAccessTokens_SmNotEnabled_NotFound(bool useSecrets, bool accessSecrets)
{
var (org, _) = await _organizationHelper.Initialize(useSecrets, accessSecrets);
await LoginAsync(_email);
var serviceAccount = await _serviceAccountRepository.CreateAsync(new ServiceAccount
{
OrganizationId = org.Id,
Name = _mockEncryptedString,
});
var response = await _client.GetAsync($"/service-accounts/{serviceAccount.Id}/access-tokens");
Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
}
[Fact]
public async Task GetAccessTokens_UserNoPermission_NotFound()
{
var (org, _) = await _organizationHelper.Initialize(true, true);
var (email, _) = await _organizationHelper.CreateNewUser(OrganizationUserType.User, true);
await LoginAsync(email);
var serviceAccount = await _serviceAccountRepository.CreateAsync(new ServiceAccount
{
OrganizationId = org.Id,
Name = _mockEncryptedString,
});
await _apiKeyRepository.CreateAsync(new ApiKey
{
ServiceAccountId = serviceAccount.Id,
Name = _mockEncryptedString,
ExpireAt = DateTime.UtcNow.AddDays(30),
});
var response = await _client.GetAsync($"/service-accounts/{serviceAccount.Id}/access-tokens");
Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
}
[Theory]
[InlineData(PermissionType.RunAsAdmin)]
[InlineData(PermissionType.RunAsUserWithPermission)]
public async Task GetAccessTokens_Success(PermissionType permissionType)
{
var (org, _) = await _organizationHelper.Initialize(true, true);
await LoginAsync(_email);
var serviceAccount = await _serviceAccountRepository.CreateAsync(new ServiceAccount
{
OrganizationId = org.Id,
Name = _mockEncryptedString,
});
if (permissionType == PermissionType.RunAsUserWithPermission)
{
var (email, orgUser) = await _organizationHelper.CreateNewUser(OrganizationUserType.User, true);
await LoginAsync(email);
await _accessPolicyRepository.CreateManyAsync(new List<BaseAccessPolicy> {
new UserServiceAccountAccessPolicy
{
GrantedServiceAccountId = serviceAccount.Id,
OrganizationUserId = orgUser.Id,
Write = true,
Read = true,
},
});
}
var accessToken = await _apiKeyRepository.CreateAsync(new ApiKey
{
ServiceAccountId = serviceAccount.Id,
Name = _mockEncryptedString,
ExpireAt = DateTime.UtcNow.AddDays(30),
});
var response = await _client.GetAsync($"/service-accounts/{serviceAccount.Id}/access-tokens");
response.EnsureSuccessStatusCode();
var results = await response.Content.ReadFromJsonAsync<ListResponseModel<AccessTokenResponseModel>>();
Assert.NotEmpty(results!.Data);
Assert.Equal(accessToken.Id, results.Data.First().Id);
Assert.Equal(accessToken.Name, results.Data.First().Name);
Assert.Equal(accessToken.GetScopes(), results.Data.First().Scopes);
Assert.Equal(accessToken.ExpireAt, results.Data.First().ExpireAt);
Assert.Equal(accessToken.CreationDate, results.Data.First().CreationDate);
Assert.Equal(accessToken.RevisionDate, results.Data.First().RevisionDate);
}
[Theory] [Theory]
[InlineData(false, false)] [InlineData(false, false)]
[InlineData(true, false)] [InlineData(true, false)]
@ -626,7 +796,7 @@ public class ServiceAccountsControllerTest : IClassFixture<ApiApplicationFactory
var accessToken = await _apiKeyRepository.CreateAsync(new ApiKey var accessToken = await _apiKeyRepository.CreateAsync(new ApiKey
{ {
ServiceAccountId = org.Id, ServiceAccountId = serviceAccount.Id,
Name = _mockEncryptedString, Name = _mockEncryptedString,
ExpireAt = DateTime.UtcNow.AddDays(30), ExpireAt = DateTime.UtcNow.AddDays(30),
}); });

View File

@ -3207,126 +3207,126 @@
"api": { "api": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Azure.Messaging.EventGrid": "[4.10.0, )", "Azure.Messaging.EventGrid": "4.10.0",
"Commercial.Core": "[2023.2.0, )", "Commercial.Core": "2023.2.2",
"Commercial.Infrastructure.EntityFramework": "[2023.2.0, )", "Commercial.Infrastructure.EntityFramework": "2023.2.2",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"SharedWeb": "[2023.2.0, )", "SharedWeb": "2023.2.2",
"Swashbuckle.AspNetCore": "[6.5.0, )" "Swashbuckle.AspNetCore": "6.5.0"
} }
}, },
"commercial.core": { "commercial.core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )" "Core": "2023.2.2"
} }
}, },
"commercial.infrastructure.entityframework": { "commercial.infrastructure.entityframework": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoMapper.Extensions.Microsoft.DependencyInjection": "[11.0.0, )", "AutoMapper.Extensions.Microsoft.DependencyInjection": "11.0.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Infrastructure.EntityFramework": "[2023.2.0, )" "Infrastructure.EntityFramework": "2023.2.2"
} }
}, },
"common": { "common": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoFixture.AutoNSubstitute": "[4.17.0, )", "AutoFixture.AutoNSubstitute": "4.17.0",
"AutoFixture.Xunit2": "[4.17.0, )", "AutoFixture.Xunit2": "4.17.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Kralizek.AutoFixture.Extensions.MockHttp": "[1.2.0, )", "Kralizek.AutoFixture.Extensions.MockHttp": "1.2.0",
"Microsoft.NET.Test.Sdk": "[17.1.0, )", "Microsoft.NET.Test.Sdk": "17.1.0",
"NSubstitute": "[4.3.0, )", "NSubstitute": "4.3.0",
"xunit": "[2.4.1, )" "xunit": "2.4.1"
} }
}, },
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
}, },
"identity": { "identity": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"SharedWeb": "[2023.2.0, )", "SharedWeb": "2023.2.2",
"Swashbuckle.AspNetCore.SwaggerGen": "[6.5.0, )" "Swashbuckle.AspNetCore.SwaggerGen": "6.5.0"
} }
}, },
"infrastructure.dapper": { "infrastructure.dapper": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Dapper": "[2.0.123, )" "Dapper": "2.0.123"
} }
}, },
"infrastructure.entityframework": { "infrastructure.entityframework": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoMapper.Extensions.Microsoft.DependencyInjection": "[11.0.0, )", "AutoMapper.Extensions.Microsoft.DependencyInjection": "11.0.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Microsoft.EntityFrameworkCore.Relational": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Relational": "6.0.12",
"Microsoft.EntityFrameworkCore.SqlServer": "[6.0.12, )", "Microsoft.EntityFrameworkCore.SqlServer": "6.0.12",
"Microsoft.EntityFrameworkCore.Sqlite": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Sqlite": "6.0.12",
"Npgsql.EntityFrameworkCore.PostgreSQL": "[6.0.8, )", "Npgsql.EntityFrameworkCore.PostgreSQL": "6.0.8",
"Pomelo.EntityFrameworkCore.MySql": "[6.0.2, )", "Pomelo.EntityFrameworkCore.MySql": "6.0.2",
"linq2db.EntityFrameworkCore": "[6.11.0, )" "linq2db.EntityFrameworkCore": "6.11.0"
} }
}, },
"integrationtestcommon": { "integrationtestcommon": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Common": "[2023.2.0, )", "Common": "2023.2.2",
"Identity": "[2023.2.0, )", "Identity": "2023.2.2",
"Microsoft.AspNetCore.Mvc.Testing": "[6.0.5, )", "Microsoft.AspNetCore.Mvc.Testing": "6.0.5",
"Microsoft.EntityFrameworkCore.InMemory": "[6.0.5, )", "Microsoft.EntityFrameworkCore.InMemory": "6.0.5",
"Microsoft.Extensions.Configuration": "[6.0.1, )" "Microsoft.Extensions.Configuration": "6.0.1"
} }
}, },
"sharedweb": { "sharedweb": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Infrastructure.Dapper": "[2023.2.0, )", "Infrastructure.Dapper": "2023.2.2",
"Infrastructure.EntityFramework": "[2023.2.0, )" "Infrastructure.EntityFramework": "2023.2.2"
} }
} }
} }

View File

@ -148,7 +148,7 @@ public class CollectionsControllerTests
OrganizationId = orgId.ToString() OrganizationId = orgId.ToString()
}; };
var collections = new List<CollectionDetails> var collections = new List<Collection>
{ {
new CollectionDetails new CollectionDetails
{ {
@ -170,8 +170,8 @@ public class CollectionsControllerTests
.UserId .UserId
.Returns(user.Id); .Returns(user.Id);
sutProvider.GetDependency<ICollectionRepository>() sutProvider.GetDependency<ICollectionService>()
.GetManyByUserIdAsync(user.Id) .GetOrganizationCollections(orgId)
.Returns(collections); .Returns(collections);
// Act // Act
@ -219,7 +219,7 @@ public class CollectionsControllerTests
OrganizationId = orgId.ToString() OrganizationId = orgId.ToString()
}; };
var collections = new List<CollectionDetails> var collections = new List<Collection>
{ {
new CollectionDetails new CollectionDetails
{ {
@ -236,8 +236,8 @@ public class CollectionsControllerTests
.UserId .UserId
.Returns(user.Id); .Returns(user.Id);
sutProvider.GetDependency<ICollectionRepository>() sutProvider.GetDependency<ICollectionService>()
.GetManyByUserIdAsync(user.Id) .GetOrganizationCollections(orgId)
.Returns(collections); .Returns(collections);
// Act // Act

View File

@ -0,0 +1,47 @@
using AutoFixture.Xunit2;
using Bit.Api.Controllers;
using Bit.Core.Context;
using Bit.Core.Services;
using Bit.Core.Settings;
using NSubstitute;
using Xunit;
namespace Bit.Api.Test.Controllers;
public class ConfigControllerTests : IDisposable
{
private readonly ConfigController _sut;
private readonly GlobalSettings _globalSettings;
private readonly IFeatureService _featureService;
private readonly ICurrentContext _currentContext;
public ConfigControllerTests()
{
_globalSettings = new GlobalSettings();
_currentContext = Substitute.For<ICurrentContext>();
_featureService = Substitute.For<IFeatureService>();
_sut = new ConfigController(
_globalSettings,
_currentContext,
_featureService
);
}
public void Dispose()
{
_sut?.Dispose();
}
[Theory, AutoData]
public void GetConfigs_WithFeatureStates(Dictionary<string, object> featureStates)
{
_featureService.GetAll(_currentContext).Returns(featureStates);
var response = _sut.GetConfigs();
Assert.NotNull(response);
Assert.NotNull(response.FeatureStates);
Assert.Equal(featureStates, response.FeatureStates);
}
}

View File

@ -6,7 +6,6 @@ using Bit.Core.Enums;
using Bit.Core.Exceptions; using Bit.Core.Exceptions;
using Bit.Core.SecretsManager.Commands.Projects.Interfaces; using Bit.Core.SecretsManager.Commands.Projects.Interfaces;
using Bit.Core.SecretsManager.Entities; using Bit.Core.SecretsManager.Entities;
using Bit.Core.SecretsManager.Models.Data;
using Bit.Core.SecretsManager.Repositories; using Bit.Core.SecretsManager.Repositories;
using Bit.Core.Services; using Bit.Core.Services;
using Bit.Core.Test.SecretsManager.AutoFixture.ProjectsFixture; using Bit.Core.Test.SecretsManager.AutoFixture.ProjectsFixture;
@ -199,13 +198,16 @@ public class ProjectsControllerTests
break; break;
} }
sutProvider.GetDependency<IProjectRepository>().GetPermissionDetailsByIdAsync(Arg.Is(data), Arg.Any<Guid>()) sutProvider.GetDependency<IProjectRepository>().GetByIdAsync(Arg.Is(data))
.ReturnsForAnyArgs(new ProjectPermissionDetails() { Id = data, OrganizationId = orgId, Read = true, Write = true }); .ReturnsForAnyArgs(new Project { Id = data, OrganizationId = orgId });
sutProvider.GetDependency<IProjectRepository>().AccessToProjectAsync(default, default, default)
.ReturnsForAnyArgs((true, false));
await sutProvider.Sut.GetAsync(data); await sutProvider.Sut.GetAsync(data);
await sutProvider.GetDependency<IProjectRepository>().Received(1) await sutProvider.GetDependency<IProjectRepository>().Received(1)
.GetPermissionDetailsByIdAsync(Arg.Is(data), Arg.Any<Guid>()); .GetByIdAsync(Arg.Is(data));
} }
[Theory] [Theory]

View File

@ -6,6 +6,7 @@ using Bit.Core.Enums;
using Bit.Core.Exceptions; using Bit.Core.Exceptions;
using Bit.Core.SecretsManager.Commands.Secrets.Interfaces; using Bit.Core.SecretsManager.Commands.Secrets.Interfaces;
using Bit.Core.SecretsManager.Entities; using Bit.Core.SecretsManager.Entities;
using Bit.Core.SecretsManager.Models.Data;
using Bit.Core.SecretsManager.Repositories; using Bit.Core.SecretsManager.Repositories;
using Bit.Core.Services; using Bit.Core.Services;
using Bit.Core.Test.SecretsManager.AutoFixture.SecretsFixture; using Bit.Core.Test.SecretsManager.AutoFixture.SecretsFixture;
@ -45,7 +46,11 @@ public class SecretsControllerTests
public async void GetSecretsByOrganization_Success(PermissionType permissionType, SutProvider<SecretsController> sutProvider, Core.SecretsManager.Entities.Secret resultSecret, Guid organizationId, Guid userId, Core.SecretsManager.Entities.Project mockProject, AccessClientType accessType) public async void GetSecretsByOrganization_Success(PermissionType permissionType, SutProvider<SecretsController> sutProvider, Core.SecretsManager.Entities.Secret resultSecret, Guid organizationId, Guid userId, Core.SecretsManager.Entities.Project mockProject, AccessClientType accessType)
{ {
sutProvider.GetDependency<ICurrentContext>().AccessSecretsManager(default).ReturnsForAnyArgs(true); sutProvider.GetDependency<ICurrentContext>().AccessSecretsManager(default).ReturnsForAnyArgs(true);
sutProvider.GetDependency<ISecretRepository>().GetManyByOrganizationIdAsync(default, default, default).ReturnsForAnyArgs(new List<Core.SecretsManager.Entities.Secret> { resultSecret }); sutProvider.GetDependency<ISecretRepository>().GetManyByOrganizationIdAsync(default, default, default)
.ReturnsForAnyArgs(new List<SecretPermissionDetails>
{
new() { Secret = resultSecret, Read = true, Write = true },
});
sutProvider.GetDependency<IUserService>().GetProperUserId(default).ReturnsForAnyArgs(userId); sutProvider.GetDependency<IUserService>().GetProperUserId(default).ReturnsForAnyArgs(userId);
if (permissionType == PermissionType.RunAsAdmin) if (permissionType == PermissionType.RunAsAdmin)
@ -95,6 +100,8 @@ public class SecretsControllerTests
resultSecret.OrganizationId = organizationId; resultSecret.OrganizationId = organizationId;
sutProvider.GetDependency<ISecretRepository>().GetByIdAsync(default).ReturnsForAnyArgs(resultSecret); sutProvider.GetDependency<ISecretRepository>().GetByIdAsync(default).ReturnsForAnyArgs(resultSecret);
sutProvider.GetDependency<ISecretRepository>().AccessToSecretAsync(default, default, default)
.ReturnsForAnyArgs(Task.FromResult((true, true)));
if (permissionType == PermissionType.RunAsAdmin) if (permissionType == PermissionType.RunAsAdmin)
{ {
@ -107,7 +114,7 @@ public class SecretsControllerTests
sutProvider.GetDependency<IProjectRepository>().UserHasReadAccessToProject(mockProject.Id, userId).Returns(true); sutProvider.GetDependency<IProjectRepository>().UserHasReadAccessToProject(mockProject.Id, userId).Returns(true);
} }
var result = await sutProvider.Sut.GetAsync(resultSecret.Id); await sutProvider.Sut.GetAsync(resultSecret.Id);
await sutProvider.GetDependency<ISecretRepository>().Received(1) await sutProvider.GetDependency<ISecretRepository>().Received(1)
.GetByIdAsync(Arg.Is(AssertHelper.AssertPropertyEqual(resultSecret.Id))); .GetByIdAsync(Arg.Is(AssertHelper.AssertPropertyEqual(resultSecret.Id)));

View File

@ -3086,122 +3086,122 @@
"api": { "api": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Azure.Messaging.EventGrid": "[4.10.0, )", "Azure.Messaging.EventGrid": "4.10.0",
"Commercial.Core": "[2023.2.0, )", "Commercial.Core": "2023.2.2",
"Commercial.Infrastructure.EntityFramework": "[2023.2.0, )", "Commercial.Infrastructure.EntityFramework": "2023.2.2",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"SharedWeb": "[2023.2.0, )", "SharedWeb": "2023.2.2",
"Swashbuckle.AspNetCore": "[6.5.0, )" "Swashbuckle.AspNetCore": "6.5.0"
} }
}, },
"commercial.core": { "commercial.core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )" "Core": "2023.2.2"
} }
}, },
"commercial.infrastructure.entityframework": { "commercial.infrastructure.entityframework": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoMapper.Extensions.Microsoft.DependencyInjection": "[11.0.0, )", "AutoMapper.Extensions.Microsoft.DependencyInjection": "11.0.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Infrastructure.EntityFramework": "[2023.2.0, )" "Infrastructure.EntityFramework": "2023.2.2"
} }
}, },
"common": { "common": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoFixture.AutoNSubstitute": "[4.17.0, )", "AutoFixture.AutoNSubstitute": "4.17.0",
"AutoFixture.Xunit2": "[4.17.0, )", "AutoFixture.Xunit2": "4.17.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Kralizek.AutoFixture.Extensions.MockHttp": "[1.2.0, )", "Kralizek.AutoFixture.Extensions.MockHttp": "1.2.0",
"Microsoft.NET.Test.Sdk": "[17.1.0, )", "Microsoft.NET.Test.Sdk": "17.1.0",
"NSubstitute": "[4.3.0, )", "NSubstitute": "4.3.0",
"xunit": "[2.4.1, )" "xunit": "2.4.1"
} }
}, },
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
}, },
"core.test": { "core.test": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoFixture.AutoNSubstitute": "[4.17.0, )", "AutoFixture.AutoNSubstitute": "4.17.0",
"AutoFixture.Xunit2": "[4.17.0, )", "AutoFixture.Xunit2": "4.17.0",
"Common": "[2023.2.0, )", "Common": "2023.2.2",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Kralizek.AutoFixture.Extensions.MockHttp": "[1.2.0, )", "Kralizek.AutoFixture.Extensions.MockHttp": "1.2.0",
"Microsoft.NET.Test.Sdk": "[17.1.0, )", "Microsoft.NET.Test.Sdk": "17.1.0",
"Moq": "[4.17.2, )", "Moq": "4.17.2",
"NSubstitute": "[4.3.0, )", "NSubstitute": "4.3.0",
"xunit": "[2.4.1, )" "xunit": "2.4.1"
} }
}, },
"infrastructure.dapper": { "infrastructure.dapper": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Dapper": "[2.0.123, )" "Dapper": "2.0.123"
} }
}, },
"infrastructure.entityframework": { "infrastructure.entityframework": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoMapper.Extensions.Microsoft.DependencyInjection": "[11.0.0, )", "AutoMapper.Extensions.Microsoft.DependencyInjection": "11.0.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Microsoft.EntityFrameworkCore.Relational": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Relational": "6.0.12",
"Microsoft.EntityFrameworkCore.SqlServer": "[6.0.12, )", "Microsoft.EntityFrameworkCore.SqlServer": "6.0.12",
"Microsoft.EntityFrameworkCore.Sqlite": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Sqlite": "6.0.12",
"Npgsql.EntityFrameworkCore.PostgreSQL": "[6.0.8, )", "Npgsql.EntityFrameworkCore.PostgreSQL": "6.0.8",
"Pomelo.EntityFrameworkCore.MySql": "[6.0.2, )", "Pomelo.EntityFrameworkCore.MySql": "6.0.2",
"linq2db.EntityFrameworkCore": "[6.11.0, )" "linq2db.EntityFrameworkCore": "6.11.0"
} }
}, },
"sharedweb": { "sharedweb": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Infrastructure.Dapper": "[2023.2.0, )", "Infrastructure.Dapper": "2023.2.2",
"Infrastructure.EntityFramework": "[2023.2.0, )" "Infrastructure.EntityFramework": "2023.2.2"
} }
} }
} }

View File

@ -285,14 +285,6 @@
"Microsoft.CSharp": "4.7.0" "Microsoft.CSharp": "4.7.0"
} }
}, },
"Humanizer.Core": {
"type": "Transitive",
"resolved": "2.2.0",
"contentHash": "rsYXB7+iUPP8AHgQ8JP2UZI2xK2KhjcdGr9E6zX3CsZaTLCaw8M35vaAJRo1rfxeaZEVMuXeaquLVCkZ7JcZ5Q==",
"dependencies": {
"NETStandard.Library": "1.6.1"
}
},
"IdentityModel": { "IdentityModel": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.4.0", "resolved": "4.4.0",
@ -427,30 +419,6 @@
"MimeKit": "3.2.0" "MimeKit": "3.2.0"
} }
}, },
"MessagePack": {
"type": "Transitive",
"resolved": "2.1.152",
"contentHash": "PlJ31qf42uGuJfwc61x/Pt4hJi01xh1rrBofj1MJSLzEot/2UAIRdSgxEHN/8qou5CV8OBeDM9HXKPi1Oj8rpQ==",
"dependencies": {
"MessagePack.Annotations": "2.1.152",
"Microsoft.Bcl.AsyncInterfaces": "1.0.0",
"System.Memory": "4.5.3",
"System.Reflection.Emit": "4.6.0",
"System.Reflection.Emit.Lightweight": "4.6.0",
"System.Runtime.CompilerServices.Unsafe": "4.5.2",
"System.Threading.Tasks.Extensions": "4.5.3"
}
},
"MessagePack.Annotations": {
"type": "Transitive",
"resolved": "2.1.152",
"contentHash": "RONktDA/HA641ds/2bfOqYSVew8o8EJMcQ1P4M1J77QGgbzWiWt3nBHvCAwlx0VfO6K9S8xq4b5OLD2CUnhtCg=="
},
"MessagePackAnalyzer": {
"type": "Transitive",
"resolved": "2.1.152",
"contentHash": "uJhZlGMkXDaFYsH8V9S6o1EyvsUqB9mpU4DVBXNr0DXZVzZMhuLP1IkLj5xK3EKlaAcvkFkZv3eSvuz360wb3Q=="
},
"Microsoft.AspNetCore.Authentication.JwtBearer": { "Microsoft.AspNetCore.Authentication.JwtBearer": {
"type": "Transitive", "type": "Transitive",
"resolved": "6.0.4", "resolved": "6.0.4",
@ -537,11 +505,6 @@
"Microsoft.Extensions.Primitives": "2.1.0" "Microsoft.Extensions.Primitives": "2.1.0"
} }
}, },
"Microsoft.AspNetCore.Razor.Language": {
"type": "Transitive",
"resolved": "6.0.0",
"contentHash": "yCtBr1GSGzJrrp1NJUb4ltwFYMKHw/tJLnIDvg9g/FnkGIEzmE19tbCQqXARIJv5kdtBgsoVIdGLL+zmjxvM/A=="
},
"Microsoft.Azure.Amqp": { "Microsoft.Azure.Amqp": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.4.11", "resolved": "2.4.11",
@ -636,196 +599,14 @@
}, },
"Microsoft.Bcl.AsyncInterfaces": { "Microsoft.Bcl.AsyncInterfaces": {
"type": "Transitive", "type": "Transitive",
"resolved": "5.0.0", "resolved": "1.1.1",
"contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ==" "contentHash": "yuvf07qFWFqtK3P/MRkEKLhn5r2UbSpVueRziSqj0yJQIKFwG1pq9mOayK3zE5qZCTs0CbrwL9M6R8VwqyGy2w=="
}, },
"Microsoft.Bcl.HashCode": { "Microsoft.Bcl.HashCode": {
"type": "Transitive", "type": "Transitive",
"resolved": "1.1.0", "resolved": "1.1.0",
"contentHash": "J2G1k+u5unBV+aYcwxo94ip16Rkp65pgWFb0R6zwJipzWNMgvqlWeuI7/+R+e8bob66LnSG+llLJ+z8wI94cHg==" "contentHash": "J2G1k+u5unBV+aYcwxo94ip16Rkp65pgWFb0R6zwJipzWNMgvqlWeuI7/+R+e8bob66LnSG+llLJ+z8wI94cHg=="
}, },
"Microsoft.Build": {
"type": "Transitive",
"resolved": "17.0.0",
"contentHash": "hCs9OzyCD/TYRid1LxPgghvUDqgXf+tEvV4qd8tBfOyp3zxAk+/rssgxtJnKLMZIu0CEZi3JegvfenaIXjEacQ==",
"dependencies": {
"Microsoft.Build.Framework": "17.0.0",
"Microsoft.NET.StringTools": "1.0.0",
"Microsoft.Win32.Registry": "4.3.0",
"System.Collections.Immutable": "5.0.0",
"System.Configuration.ConfigurationManager": "4.7.0",
"System.Reflection.Metadata": "1.6.0",
"System.Security.Principal.Windows": "4.7.0",
"System.Text.Encoding.CodePages": "4.0.1",
"System.Text.Json": "5.0.2",
"System.Threading.Tasks.Dataflow": "4.9.0"
}
},
"Microsoft.Build.Framework": {
"type": "Transitive",
"resolved": "17.0.0",
"contentHash": "XbFA0z+6Ws2pNeRXYcDF3lKlNgRoSGMm2Q5HKzZD+EbwYMKPKrl/BJnnkMuDJHU0KravYHfhzBnLLJpPeZ3E7A==",
"dependencies": {
"System.Security.Permissions": "4.7.0"
}
},
"Microsoft.Build.Locator": {
"type": "Transitive",
"resolved": "1.4.1",
"contentHash": "UfyGaxNTjw/r3uWMX/Cv1CPKELo7TCrR5VIahaSKL0WyqmbDT6og9pyjwuhyyUkxC9gk2ElB7oOEySL1OzTZ1g=="
},
"Microsoft.CodeAnalysis.Analyzers": {
"type": "Transitive",
"resolved": "3.3.2",
"contentHash": "7xt6zTlIEizUgEsYAIgm37EbdkiMmr6fP6J9pDoKEpiGM4pi32BCPGr/IczmSJI9Zzp0a6HOzpr9OvpMP+2veA=="
},
"Microsoft.CodeAnalysis.AnalyzerUtilities": {
"type": "Transitive",
"resolved": "3.3.0",
"contentHash": "gyQ70pJ4T7hu/s0+QnEaXtYfeG/JrttGnxHJlrhpxsQjRIUGuRhVwNBtkHHYOrUAZ/l47L98/NiJX6QmTwAyrg=="
},
"Microsoft.CodeAnalysis.Common": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "d02ybMhUJl1r/dI6SkJPHrTiTzXBYCZeJdOLMckV+jyoMU/GGkjqFX/sRbv1K0QmlpwwKuLTiYVQvfYC+8ox2g==",
"dependencies": {
"Microsoft.CodeAnalysis.Analyzers": "3.3.2",
"System.Collections.Immutable": "5.0.0",
"System.Memory": "4.5.4",
"System.Reflection.Metadata": "5.0.0",
"System.Runtime.CompilerServices.Unsafe": "5.0.0",
"System.Text.Encoding.CodePages": "4.5.1",
"System.Threading.Tasks.Extensions": "4.5.4"
}
},
"Microsoft.CodeAnalysis.CSharp": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "2UVTGtyQGgTCazvnT6t82f+7AV2L+kqJdyb61rT9GQed4yK+tVh5IkaKcsm70VqyZQhBbDqsfZFNHnY65xhrRw==",
"dependencies": {
"Microsoft.CodeAnalysis.Common": "[4.0.0]"
}
},
"Microsoft.CodeAnalysis.CSharp.Features": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "WOTeKJN0I4/AzylA+VuTtB7V7VvnM41GXqnyiiDRNa3QtKFAzJbQ7CwLG97pcme+oQLz708z+s4Nzd9g0irytw==",
"dependencies": {
"Humanizer.Core": "2.2.0",
"Microsoft.CodeAnalysis.CSharp": "[4.0.0]",
"Microsoft.CodeAnalysis.CSharp.Workspaces": "[4.0.0]",
"Microsoft.CodeAnalysis.Common": "[4.0.0]",
"Microsoft.CodeAnalysis.Features": "[4.0.0]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[4.0.0]"
}
},
"Microsoft.CodeAnalysis.CSharp.Scripting": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "Z8Y8Ye2snCqVQLLx7K6FcEs0hcvdPi4nTG2RDWdPpOfMH8ed1yxTabt252qAd4TH0jpyruuCnBfW4s6DXliMYg==",
"dependencies": {
"Microsoft.CSharp": "4.3.0",
"Microsoft.CodeAnalysis.CSharp": "[4.0.0]",
"Microsoft.CodeAnalysis.Common": "[4.0.0]",
"Microsoft.CodeAnalysis.Scripting.Common": "[4.0.0]"
}
},
"Microsoft.CodeAnalysis.CSharp.Workspaces": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "RQMc1+2cIRdOvY8vp6ygkzfBrvlYphnbmhhluKNh9+X+PpprQDKlbPrn9fLn6v9RlCsfa87joS3zJyGBEeWTXQ==",
"dependencies": {
"Humanizer.Core": "2.2.0",
"Microsoft.CodeAnalysis.CSharp": "[4.0.0]",
"Microsoft.CodeAnalysis.Common": "[4.0.0]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[4.0.0]"
}
},
"Microsoft.CodeAnalysis.Features": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "ci4pgjEgihb+fu2i1E12iOMGXU6GisYR3YrNd2aqt55ijjzLNqPV/+zt+cV3Qc0n08rJrIY2Bf6cTTMPY0bwJQ==",
"dependencies": {
"Microsoft.CodeAnalysis.AnalyzerUtilities": "3.3.0",
"Microsoft.CodeAnalysis.Common": "[4.0.0]",
"Microsoft.CodeAnalysis.Scripting.Common": "[4.0.0]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[4.0.0]",
"Microsoft.DiaSymReader": "1.3.0",
"Microsoft.VisualStudio.Debugger.Contracts": "17.2.0",
"System.Threading.Tasks.Extensions": "4.5.4"
}
},
"Microsoft.CodeAnalysis.Razor": {
"type": "Transitive",
"resolved": "6.0.0",
"contentHash": "uqdzuQXxD7XrJCbIbbwpI/LOv0PBJ9VIR0gdvANTHOfK5pjTaCir+XcwvYvBZ5BIzd0KGzyiamzlEWw1cK1q0w==",
"dependencies": {
"Microsoft.AspNetCore.Razor.Language": "6.0.0",
"Microsoft.CodeAnalysis.CSharp": "4.0.0",
"Microsoft.CodeAnalysis.Common": "4.0.0"
}
},
"Microsoft.CodeAnalysis.Scripting.Common": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "jU/ncoHSFnXU/L2iju9AFlOwmsAYByIxhCCpeLPNTguXwosJp1o13mtrboJOfkDhi7ebvzQmvcZ++yBu8cF4Sw==",
"dependencies": {
"Microsoft.CodeAnalysis.Common": "[4.0.0]"
}
},
"Microsoft.CodeAnalysis.VisualBasic": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "FK+OGUMUh9O6/GCwyIy4c/sOrarF36/yEY07BbXVYMql1qCqHGWfyWXyCQKQ6m/KqReCqW6aO4cK7kK/AYBpyA==",
"dependencies": {
"Microsoft.CodeAnalysis.Common": "[4.0.0]"
}
},
"Microsoft.CodeAnalysis.VisualBasic.Features": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "GEJsXFcMd7o+D6OYCLPui2ZvNsonTmdPSluGK0wC3EXVB+gnrro7Lr/sjtTSOwVeiXPlhXgprRuO7zJiMn1uzw==",
"dependencies": {
"Microsoft.CodeAnalysis.Common": "[4.0.0]",
"Microsoft.CodeAnalysis.Features": "[4.0.0]",
"Microsoft.CodeAnalysis.VisualBasic": "[4.0.0]",
"Microsoft.CodeAnalysis.VisualBasic.Workspaces": "[4.0.0]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[4.0.0]"
}
},
"Microsoft.CodeAnalysis.VisualBasic.Workspaces": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "ozmB/thXGX5MoP/oiV9w5ZVGS08mz7fK3lRXiRSHHBeuiXZW1ZCGARwG2YkhylzAl1LlEwSQmlgrr8Irlu+3qQ==",
"dependencies": {
"Microsoft.CodeAnalysis.Common": "[4.0.0]",
"Microsoft.CodeAnalysis.VisualBasic": "[4.0.0]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[4.0.0]"
}
},
"Microsoft.CodeAnalysis.Workspaces.Common": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "bEfHzx8PLmEN6aogVYHWmViHCWfms8emI43w9nNX+C8MLgtynOmVL/OJ4hbuONVp+4OuDAy5BDj69n5MnXQX8g==",
"dependencies": {
"Humanizer.Core": "2.2.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
"Microsoft.CodeAnalysis.Common": "[4.0.0]",
"System.Composition": "1.0.31",
"System.IO.Pipelines": "5.0.1"
}
},
"Microsoft.CodeAnalysis.Workspaces.MSBuild": {
"type": "Transitive",
"resolved": "4.0.0",
"contentHash": "0LYNKESZPK4AQmAXwn8l2e8UF/rYpT0pvceEhiTVjurjQ9Y7pGdUZ5E30r8knxYtT5/9ZESR7wKf/AU00r95Mw==",
"dependencies": {
"Microsoft.Build.Framework": "16.5.0",
"Microsoft.CodeAnalysis.Common": "[4.0.0]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[4.0.0]",
"System.Text.Json": "4.7.0"
}
},
"Microsoft.CodeCoverage": { "Microsoft.CodeCoverage": {
"type": "Transitive", "type": "Transitive",
"resolved": "17.1.0", "resolved": "17.1.0",
@ -873,32 +654,6 @@
"SQLitePCLRaw.core": "2.1.2" "SQLitePCLRaw.core": "2.1.2"
} }
}, },
"Microsoft.DiaSymReader": {
"type": "Transitive",
"resolved": "1.3.0",
"contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==",
"dependencies": {
"NETStandard.Library": "1.6.1"
}
},
"Microsoft.DotNet.Scaffolding.Shared": {
"type": "Transitive",
"resolved": "6.0.3",
"contentHash": "MHPcl+Vm8tEyvCA0dSEMDd/DfEYW2VtkGs7DXEJBbeRToBmHoK/5djIQws4XWcdqcpuJNo1WqX+C35h7Y5G26w==",
"dependencies": {
"Microsoft.CodeAnalysis.CSharp.Features": "4.0.0",
"Microsoft.CodeAnalysis.CSharp.Scripting": "4.0.0",
"Microsoft.CodeAnalysis.CSharp.Workspaces": "4.0.0",
"Microsoft.CodeAnalysis.Features": "4.0.0",
"Microsoft.CodeAnalysis.VisualBasic.Features": "4.0.0",
"Microsoft.CodeAnalysis.VisualBasic.Workspaces": "4.0.0",
"Microsoft.CodeAnalysis.Workspaces.MSBuild": "4.0.0",
"Newtonsoft.Json": "13.0.1",
"NuGet.ProjectModel": "5.11.0",
"System.Collections.Immutable": "6.0.0",
"System.Private.Uri": "4.3.2"
}
},
"Microsoft.EntityFrameworkCore": { "Microsoft.EntityFrameworkCore": {
"type": "Transitive", "type": "Transitive",
"resolved": "6.0.12", "resolved": "6.0.12",
@ -1271,15 +1026,6 @@
"System.Security.Cryptography.Cng": "4.5.0" "System.Security.Cryptography.Cng": "4.5.0"
} }
}, },
"Microsoft.NET.StringTools": {
"type": "Transitive",
"resolved": "1.0.0",
"contentHash": "ZYVcoDM0LnSyT5nWoRGfShYdOecCw2sOXWwP6j1Z0u48Xq3+BVvZ+EiPCX9/8Gz439giW+O1H1kWF9Eb/w6rVg==",
"dependencies": {
"System.Memory": "4.5.4",
"System.Runtime.CompilerServices.Unsafe": "5.0.0"
}
},
"Microsoft.NETCore.Platforms": { "Microsoft.NETCore.Platforms": {
"type": "Transitive", "type": "Transitive",
"resolved": "5.0.0", "resolved": "5.0.0",
@ -1287,8 +1033,8 @@
}, },
"Microsoft.NETCore.Targets": { "Microsoft.NETCore.Targets": {
"type": "Transitive", "type": "Transitive",
"resolved": "1.1.3", "resolved": "1.1.0",
"contentHash": "3Wrmi0kJDzClwAC+iBdUBpEKmEle8FQNsCs77fkiOIw/9oYA07bL1EZNX0kQ2OMN3xpwvl0vAtOCYY3ndDNlhQ==" "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg=="
}, },
"Microsoft.OData.Core": { "Microsoft.OData.Core": {
"type": "Transitive", "type": "Transitive",
@ -1332,95 +1078,6 @@
"Newtonsoft.Json": "9.0.1" "Newtonsoft.Json": "9.0.1"
} }
}, },
"Microsoft.VisualStudio.Debugger.Contracts": {
"type": "Transitive",
"resolved": "17.2.0",
"contentHash": "br/qV/aHqLqVlqtcMKglCC8MHMMLey0yMkKSplnMl58F5gKjwnh7wjs8+g0j/vf4T6h4KK7JWrC0+oN70pbugg==",
"dependencies": {
"MessagePack": "2.1.152",
"MessagePackAnalyzer": "2.1.152",
"Microsoft.Bcl.AsyncInterfaces": "1.1.1",
"System.Collections.Immutable": "5.0.0"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration": {
"type": "Transitive",
"resolved": "6.0.3",
"contentHash": "rD1Lj6LljO7iEeZJuGtEp0O9rZHvr+tAZJx8QgwdmlrMReaYA0+KQCH/woEdcmBo+ifnwUUyNgG+9NUECYTT9g==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "6.0.0",
"Microsoft.VisualStudio.Web.CodeGeneration.EntityFrameworkCore": "6.0.3",
"System.Collections.Immutable": "6.0.0",
"System.Private.Uri": "4.3.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.Core": {
"type": "Transitive",
"resolved": "6.0.3",
"contentHash": "o+rN2+WrG4NTU4dzcExaMAGpQk84+SJMC8D3v7pe35f6DJQIXC3lc9V9npgNtiiD19aP+Pdto8L5nuwQ83dgTw==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "6.0.0",
"Microsoft.VisualStudio.Web.CodeGeneration.Templating": "6.0.3",
"Newtonsoft.Json": "13.0.1",
"System.Private.Uri": "4.3.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.Design": {
"type": "Transitive",
"resolved": "6.0.3",
"contentHash": "cqxm2k5KF7T0KejRlxt71aizeR+2a/9qk94c1p7/CCOjns4cgwL92IxyrhhpILn0U+kylslBE2O/AJoi28wkSA==",
"dependencies": {
"Microsoft.Build.Locator": "1.4.1",
"Microsoft.DotNet.Scaffolding.Shared": "6.0.3",
"Microsoft.VisualStudio.Web.CodeGenerators.Mvc": "6.0.3",
"System.Private.Uri": "4.3.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.EntityFrameworkCore": {
"type": "Transitive",
"resolved": "6.0.3",
"contentHash": "Mg0HpwFZyOJQHtW04gbCLekZ8Lt3VSs9s9JqgGm6DXoeTbAbaHhJGZohuT296Z+0MuFJgl9mD1/j1Zof8hPgcA==",
"dependencies": {
"Microsoft.DotNet.Scaffolding.Shared": "6.0.3",
"Microsoft.VisualStudio.Web.CodeGeneration.Core": "6.0.3",
"System.Private.Uri": "4.3.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.Templating": {
"type": "Transitive",
"resolved": "6.0.3",
"contentHash": "TMV1xzJSjNpiWCGkw6/8/XHmYF0HiimH/8kmPZfT/J+WBKABn4DRbZNpgTYNKmcuYxg4mKySFPVpblQ0XMf9Tg==",
"dependencies": {
"Microsoft.AspNetCore.Razor.Language": "6.0.0",
"Microsoft.CodeAnalysis.CSharp": "4.0.0",
"Microsoft.CodeAnalysis.Razor": "6.0.0",
"Microsoft.VisualStudio.Web.CodeGeneration.Utils": "6.0.3",
"System.Private.Uri": "4.3.2"
}
},
"Microsoft.VisualStudio.Web.CodeGeneration.Utils": {
"type": "Transitive",
"resolved": "6.0.3",
"contentHash": "M8k06jnZ0l7031mPYDbLaiiz20ju1MP+FJlpDKVilkAPOQVITSFRDm8Hhd2Pyd+BSj+nCzDC1ZMglK8z+lJ5ig==",
"dependencies": {
"Microsoft.Build": "17.0.0",
"Microsoft.Build.Locator": "1.4.1",
"Microsoft.CodeAnalysis.CSharp.Workspaces": "4.0.0",
"Microsoft.DotNet.Scaffolding.Shared": "6.0.3",
"Newtonsoft.Json": "13.0.1",
"System.Private.Uri": "4.3.2"
}
},
"Microsoft.VisualStudio.Web.CodeGenerators.Mvc": {
"type": "Transitive",
"resolved": "6.0.3",
"contentHash": "Oe3QkXildc2AFM33rN9WSLj53kzuQAPLAv7aduz+bnYc86SFBPA/qpYZ2ZJhlKYbrJUpztRqoWvLqGfDT6XkUw==",
"dependencies": {
"Microsoft.DotNet.Scaffolding.Shared": "6.0.3",
"Microsoft.VisualStudio.Web.CodeGeneration": "6.0.3",
"System.Private.Uri": "4.3.2"
}
},
"Microsoft.Win32.Primitives": { "Microsoft.Win32.Primitives": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.3.0", "resolved": "4.3.0",
@ -1542,79 +1199,11 @@
"libsodium": "[1.0.18.2, 1.0.19)" "libsodium": "[1.0.18.2, 1.0.19)"
} }
}, },
"NuGet.Common": {
"type": "Transitive",
"resolved": "5.11.0",
"contentHash": "WCHexQBfSqBDRqP3PSDSUw7YM+PwuvMHGAkT/sXI5UHze4T41yLE+VB/km2Fe0z9y3m2mudcr2djFZezivjMJw==",
"dependencies": {
"NuGet.Frameworks": "5.11.0"
}
},
"NuGet.Configuration": {
"type": "Transitive",
"resolved": "5.11.0",
"contentHash": "NqsQe198CTHoo7NMrKQL8utd6n9yVb9CPgJmpyF6kpEsLFo/9r0wqGL3ln8Mtcz8yuJpOPWFQEoOlzDzu3LfUg==",
"dependencies": {
"NuGet.Common": "5.11.0",
"System.Security.Cryptography.ProtectedData": "4.4.0"
}
},
"NuGet.DependencyResolver.Core": {
"type": "Transitive",
"resolved": "5.11.0",
"contentHash": "kkWhU0msuCRyiIJeoL95j6bXUQMc1mTk8wZ3mMxl+0VzOf39eXSObmxKuJ7eh+6zOMQyzd0TAXU5u5aQSxOVSg==",
"dependencies": {
"NuGet.LibraryModel": "5.11.0",
"NuGet.Protocol": "5.11.0"
}
},
"NuGet.Frameworks": { "NuGet.Frameworks": {
"type": "Transitive", "type": "Transitive",
"resolved": "5.11.0", "resolved": "5.11.0",
"contentHash": "eaiXkUjC4NPcquGWzAGMXjuxvLwc6XGKMptSyOGQeT0X70BUZObuybJFZLA0OfTdueLd3US23NBPTBb6iF3V1Q==" "contentHash": "eaiXkUjC4NPcquGWzAGMXjuxvLwc6XGKMptSyOGQeT0X70BUZObuybJFZLA0OfTdueLd3US23NBPTBb6iF3V1Q=="
}, },
"NuGet.LibraryModel": {
"type": "Transitive",
"resolved": "5.11.0",
"contentHash": "Iq0tbX3Rsl4837VlWy90fliA7T2+g2FPdz/s/lK6H9g/5RCta/7AZADV0l/A/f0HDCDlMxBN2ha1hsmgxe1sGQ==",
"dependencies": {
"NuGet.Common": "5.11.0",
"NuGet.Versioning": "5.11.0"
}
},
"NuGet.Packaging": {
"type": "Transitive",
"resolved": "5.11.0",
"contentHash": "knlpQuqTL8BEXUHTdZ9Wlz3pjck5nv0OYsCpSkaQAukl7fFcX4apAs8cwJgxHiEZjfWNG1npZOzpYdHG59v5xQ==",
"dependencies": {
"Newtonsoft.Json": "9.0.1",
"NuGet.Configuration": "5.11.0",
"NuGet.Versioning": "5.11.0",
"System.Security.Cryptography.Cng": "5.0.0",
"System.Security.Cryptography.Pkcs": "5.0.0"
}
},
"NuGet.ProjectModel": {
"type": "Transitive",
"resolved": "5.11.0",
"contentHash": "8q7mAwHHP1/Ua1r3FQDg+kXcFvRgBmCCXQeqTkTVQoO5t3G/AwxzJVt7Jii0eNrM17Wzm975U0gnkNqlp+gdsw==",
"dependencies": {
"NuGet.DependencyResolver.Core": "5.11.0"
}
},
"NuGet.Protocol": {
"type": "Transitive",
"resolved": "5.11.0",
"contentHash": "eS/sJLqMzPz6gonD1zaXIcpDME/1DuKqv0Hlag8RuJcboZJliA15qjfg7UvuQB8/ineOleaEvrTzMjpKE0FdbQ==",
"dependencies": {
"NuGet.Packaging": "5.11.0"
}
},
"NuGet.Versioning": {
"type": "Transitive",
"resolved": "5.11.0",
"contentHash": "mCv/GzvMk5iatWoZY41PoIShEbwVxq9CDCc1fV/uqPFKZ4DD/1JuKZ5AL/FJJRsTanvMR3EOXKYCLdQ7PFYn8Q=="
},
"Otp.NET": { "Otp.NET": {
"type": "Transitive", "type": "Transitive",
"resolved": "1.2.2", "resolved": "1.2.2",
@ -2131,102 +1720,6 @@
"System.Threading": "4.3.0" "System.Threading": "4.3.0"
} }
}, },
"System.Composition": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "I+D26qpYdoklyAVUdqwUBrEIckMNjAYnuPJy/h9dsQItpQwVREkDFs4b4tkBza0kT2Yk48Lcfsv2QQ9hWsh9Iw==",
"dependencies": {
"System.Composition.AttributedModel": "1.0.31",
"System.Composition.Convention": "1.0.31",
"System.Composition.Hosting": "1.0.31",
"System.Composition.Runtime": "1.0.31",
"System.Composition.TypedParts": "1.0.31"
}
},
"System.Composition.AttributedModel": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "NHWhkM3ZkspmA0XJEsKdtTt1ViDYuojgSND3yHhTzwxepiwqZf+BCWuvCbjUt4fe0NxxQhUDGJ5km6sLjo9qnQ==",
"dependencies": {
"System.Reflection": "4.3.0",
"System.Runtime": "4.3.0"
}
},
"System.Composition.Convention": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "GLjh2Ju71k6C0qxMMtl4efHa68NmWeIUYh4fkUI8xbjQrEBvFmRwMDFcylT8/PR9SQbeeL48IkFxU/+gd0nYEQ==",
"dependencies": {
"System.Collections": "4.3.0",
"System.Composition.AttributedModel": "1.0.31",
"System.Diagnostics.Debug": "4.3.0",
"System.Diagnostics.Tools": "4.3.0",
"System.Globalization": "4.3.0",
"System.Linq": "4.3.0",
"System.Linq.Expressions": "4.3.0",
"System.Reflection": "4.3.0",
"System.Reflection.Extensions": "4.3.0",
"System.Resources.ResourceManager": "4.3.0",
"System.Runtime": "4.3.0",
"System.Threading": "4.3.0"
}
},
"System.Composition.Hosting": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "fN1bT4RX4vUqjbgoyuJFVUizAl2mYF5VAb+bVIxIYZSSc0BdnX+yGAxcavxJuDDCQ1K+/mdpgyEFc8e9ikjvrg==",
"dependencies": {
"System.Collections": "4.3.0",
"System.Composition.Runtime": "1.0.31",
"System.Diagnostics.Debug": "4.3.0",
"System.Diagnostics.Tools": "4.3.0",
"System.Globalization": "4.3.0",
"System.Linq": "4.3.0",
"System.Linq.Expressions": "4.3.0",
"System.ObjectModel": "4.3.0",
"System.Reflection": "4.3.0",
"System.Reflection.Extensions": "4.3.0",
"System.Resources.ResourceManager": "4.3.0",
"System.Runtime": "4.3.0",
"System.Threading": "4.3.0"
}
},
"System.Composition.Runtime": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "0LEJN+2NVM89CE4SekDrrk5tHV5LeATltkp+9WNYrR+Huiyt0vaCqHbbHtVAjPyeLWIc8dOz/3kthRBj32wGQg==",
"dependencies": {
"System.Collections": "4.3.0",
"System.Diagnostics.Debug": "4.3.0",
"System.Diagnostics.Tools": "4.3.0",
"System.Globalization": "4.3.0",
"System.Linq": "4.3.0",
"System.Reflection": "4.3.0",
"System.Resources.ResourceManager": "4.3.0",
"System.Runtime": "4.3.0"
}
},
"System.Composition.TypedParts": {
"type": "Transitive",
"resolved": "1.0.31",
"contentHash": "0Zae/FtzeFgDBBuILeIbC/T9HMYbW4olAmi8XqqAGosSOWvXfiQLfARZEhiGd0LVXaYgXr0NhxiU1LldRP1fpQ==",
"dependencies": {
"System.Collections": "4.3.0",
"System.Composition.AttributedModel": "1.0.31",
"System.Composition.Hosting": "1.0.31",
"System.Composition.Runtime": "1.0.31",
"System.Diagnostics.Debug": "4.3.0",
"System.Diagnostics.Tools": "4.3.0",
"System.Globalization": "4.3.0",
"System.Linq": "4.3.0",
"System.Linq.Expressions": "4.3.0",
"System.Reflection": "4.3.0",
"System.Reflection.Extensions": "4.3.0",
"System.Resources.ResourceManager": "4.3.0",
"System.Runtime": "4.3.0",
"System.Runtime.Extensions": "4.3.0"
}
},
"System.Configuration.ConfigurationManager": { "System.Configuration.ConfigurationManager": {
"type": "Transitive", "type": "Transitive",
"resolved": "6.0.0", "resolved": "6.0.0",
@ -2829,15 +2322,6 @@
"System.Xml.XmlSerializer": "4.0.11" "System.Xml.XmlSerializer": "4.0.11"
} }
}, },
"System.Private.Uri": {
"type": "Transitive",
"resolved": "4.3.2",
"contentHash": "o1+7RJnu3Ik3PazR7Z7tJhjPdE000Eq2KGLLWhqJJKXj04wrS8lwb1OFtDF9jzXXADhUuZNJZlPc98uwwqmpFA==",
"dependencies": {
"Microsoft.NETCore.Platforms": "1.1.1",
"Microsoft.NETCore.Targets": "1.1.3"
}
},
"System.Reflection": { "System.Reflection": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.3.0", "resolved": "4.3.0",
@ -2852,8 +2336,15 @@
}, },
"System.Reflection.Emit": { "System.Reflection.Emit": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.6.0", "resolved": "4.3.0",
"contentHash": "qAo4jyXtC9i71iElngX7P2r+zLaiHzxKwf66sc3X91tL5Ks6fnQ1vxL04o7ZSm3sYfLExySL7GN8aTpNYpU1qw==" "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==",
"dependencies": {
"System.IO": "4.3.0",
"System.Reflection": "4.3.0",
"System.Reflection.Emit.ILGeneration": "4.3.0",
"System.Reflection.Primitives": "4.3.0",
"System.Runtime": "4.3.0"
}
}, },
"System.Reflection.Emit.ILGeneration": { "System.Reflection.Emit.ILGeneration": {
"type": "Transitive", "type": "Transitive",
@ -2867,8 +2358,14 @@
}, },
"System.Reflection.Emit.Lightweight": { "System.Reflection.Emit.Lightweight": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.6.0", "resolved": "4.3.0",
"contentHash": "j/V5HVvxvBQ7uubYD0PptQW2KGsi1Pc2kZ9yfwLixv3ADdjL/4M78KyC5e+ymW612DY8ZE4PFoZmWpoNmN2mqg==" "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==",
"dependencies": {
"System.Reflection": "4.3.0",
"System.Reflection.Emit.ILGeneration": "4.3.0",
"System.Reflection.Primitives": "4.3.0",
"System.Runtime": "4.3.0"
}
}, },
"System.Reflection.Extensions": { "System.Reflection.Extensions": {
"type": "Transitive", "type": "Transitive",
@ -2883,8 +2380,8 @@
}, },
"System.Reflection.Metadata": { "System.Reflection.Metadata": {
"type": "Transitive", "type": "Transitive",
"resolved": "5.0.0", "resolved": "1.6.0",
"contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ=="
}, },
"System.Reflection.Primitives": { "System.Reflection.Primitives": {
"type": "Transitive", "type": "Transitive",
@ -3312,11 +2809,6 @@
"System.Runtime": "4.3.0" "System.Runtime": "4.3.0"
} }
}, },
"System.Threading.Tasks.Dataflow": {
"type": "Transitive",
"resolved": "4.9.0",
"contentHash": "dTS+3D/GtG2/Pvc3E5YzVvAa7aQJgLDlZDIzukMOJjYudVOQOUXEU68y6Zi3Nn/jqIeB5kOCwrGbQFAKHVzXEQ=="
},
"System.Threading.Tasks.Extensions": { "System.Threading.Tasks.Extensions": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.5.4", "resolved": "4.5.4",
@ -3533,91 +3025,90 @@
"billing": { "billing": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Microsoft.VisualStudio.Web.CodeGeneration.Design": "[6.0.3, )", "SharedWeb": "2023.2.2"
"SharedWeb": "[2023.2.0, )"
} }
}, },
"common": { "common": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoFixture.AutoNSubstitute": "[4.17.0, )", "AutoFixture.AutoNSubstitute": "4.17.0",
"AutoFixture.Xunit2": "[4.17.0, )", "AutoFixture.Xunit2": "4.17.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Kralizek.AutoFixture.Extensions.MockHttp": "[1.2.0, )", "Kralizek.AutoFixture.Extensions.MockHttp": "1.2.0",
"Microsoft.NET.Test.Sdk": "[17.1.0, )", "Microsoft.NET.Test.Sdk": "17.1.0",
"NSubstitute": "[4.3.0, )", "NSubstitute": "4.3.0",
"xunit": "[2.4.1, )" "xunit": "2.4.1"
} }
}, },
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
}, },
"infrastructure.dapper": { "infrastructure.dapper": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Dapper": "[2.0.123, )" "Dapper": "2.0.123"
} }
}, },
"infrastructure.entityframework": { "infrastructure.entityframework": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoMapper.Extensions.Microsoft.DependencyInjection": "[11.0.0, )", "AutoMapper.Extensions.Microsoft.DependencyInjection": "11.0.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Microsoft.EntityFrameworkCore.Relational": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Relational": "6.0.12",
"Microsoft.EntityFrameworkCore.SqlServer": "[6.0.12, )", "Microsoft.EntityFrameworkCore.SqlServer": "6.0.12",
"Microsoft.EntityFrameworkCore.Sqlite": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Sqlite": "6.0.12",
"Npgsql.EntityFrameworkCore.PostgreSQL": "[6.0.8, )", "Npgsql.EntityFrameworkCore.PostgreSQL": "6.0.8",
"Pomelo.EntityFrameworkCore.MySql": "[6.0.2, )", "Pomelo.EntityFrameworkCore.MySql": "6.0.2",
"linq2db.EntityFrameworkCore": "[6.11.0, )" "linq2db.EntityFrameworkCore": "6.11.0"
} }
}, },
"sharedweb": { "sharedweb": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Infrastructure.Dapper": "[2023.2.0, )", "Infrastructure.Dapper": "2023.2.2",
"Infrastructure.EntityFramework": "[2023.2.0, )" "Infrastructure.EntityFramework": "2023.2.2"
} }
} }
} }

View File

@ -2844,43 +2844,43 @@
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
} }
} }

View File

@ -91,4 +91,18 @@ public class LaunchDarklyFeatureServiceTests
Assert.Null(sutProvider.Sut.GetStringVariation(FeatureFlagKeys.SecretsManager, currentContext)); Assert.Null(sutProvider.Sut.GetStringVariation(FeatureFlagKeys.SecretsManager, currentContext));
} }
[Fact(Skip = "For local development")]
public void GetAll()
{
var sutProvider = GetSutProvider(new Core.Settings.GlobalSettings());
var currentContext = Substitute.For<ICurrentContext>();
currentContext.UserId.Returns(Guid.NewGuid());
var results = sutProvider.Sut.GetAll(currentContext);
Assert.NotNull(results);
Assert.NotEmpty(results);
}
} }

View File

@ -64,7 +64,7 @@ public class OrganizationServiceTests
.CreateManyAsync(Arg.Is<IEnumerable<OrganizationUser>>(users => users.Count() == expectedNewUsersCount)); .CreateManyAsync(Arg.Is<IEnumerable<OrganizationUser>>(users => users.Count() == expectedNewUsersCount));
await sutProvider.GetDependency<IMailService>().Received(1) await sutProvider.GetDependency<IMailService>().Received(1)
.BulkSendOrganizationInviteEmailAsync(org.Name, .BulkSendOrganizationInviteEmailAsync(org.Name,
Arg.Is<IEnumerable<(OrganizationUser, ExpiringToken)>>(messages => messages.Count() == expectedNewUsersCount)); Arg.Is<IEnumerable<(OrganizationUser, ExpiringToken)>>(messages => messages.Count() == expectedNewUsersCount), org.PlanType == PlanType.Free);
// Send events // Send events
await sutProvider.GetDependency<IEventService>().Received(1) await sutProvider.GetDependency<IEventService>().Received(1)
@ -122,7 +122,7 @@ public class OrganizationServiceTests
.CreateManyAsync(Arg.Is<IEnumerable<OrganizationUser>>(users => users.Count() == expectedNewUsersCount)); .CreateManyAsync(Arg.Is<IEnumerable<OrganizationUser>>(users => users.Count() == expectedNewUsersCount));
await sutProvider.GetDependency<IMailService>().Received(1) await sutProvider.GetDependency<IMailService>().Received(1)
.BulkSendOrganizationInviteEmailAsync(org.Name, .BulkSendOrganizationInviteEmailAsync(org.Name,
Arg.Is<IEnumerable<(OrganizationUser, ExpiringToken)>>(messages => messages.Count() == expectedNewUsersCount)); Arg.Is<IEnumerable<(OrganizationUser, ExpiringToken)>>(messages => messages.Count() == expectedNewUsersCount), org.PlanType == PlanType.Free);
// Sent events // Sent events
await sutProvider.GetDependency<IEventService>().Received(1) await sutProvider.GetDependency<IEventService>().Received(1)
@ -217,7 +217,7 @@ public class OrganizationServiceTests
await sutProvider.GetDependency<IMailService>().Received(1) await sutProvider.GetDependency<IMailService>().Received(1)
.BulkSendOrganizationInviteEmailAsync(organization.Name, .BulkSendOrganizationInviteEmailAsync(organization.Name,
Arg.Is<IEnumerable<(OrganizationUser, ExpiringToken)>>(v => v.Count() == invite.Emails.Distinct().Count())); Arg.Is<IEnumerable<(OrganizationUser, ExpiringToken)>>(v => v.Count() == invite.Emails.Distinct().Count()), organization.PlanType == PlanType.Free);
} }
[Theory] [Theory]
@ -460,7 +460,7 @@ public class OrganizationServiceTests
await sutProvider.GetDependency<IMailService>().Received(1) await sutProvider.GetDependency<IMailService>().Received(1)
.BulkSendOrganizationInviteEmailAsync(organization.Name, .BulkSendOrganizationInviteEmailAsync(organization.Name,
Arg.Is<IEnumerable<(OrganizationUser, ExpiringToken)>>(v => v.Count() == invites.SelectMany(i => i.invite.Emails).Count())); Arg.Is<IEnumerable<(OrganizationUser, ExpiringToken)>>(v => v.Count() == invites.SelectMany(i => i.invite.Emails).Count()), organization.PlanType == PlanType.Free);
await sutProvider.GetDependency<IEventService>().Received(1).LogOrganizationUserEventsAsync(Arg.Any<IEnumerable<(OrganizationUser, EventType, DateTime?)>>()); await sutProvider.GetDependency<IEventService>().Received(1).LogOrganizationUserEventsAsync(Arg.Any<IEnumerable<(OrganizationUser, EventType, DateTime?)>>());
} }
@ -494,7 +494,7 @@ public class OrganizationServiceTests
await sutProvider.GetDependency<IMailService>().Received(1) await sutProvider.GetDependency<IMailService>().Received(1)
.BulkSendOrganizationInviteEmailAsync(organization.Name, .BulkSendOrganizationInviteEmailAsync(organization.Name,
Arg.Is<IEnumerable<(OrganizationUser, ExpiringToken)>>(v => v.Count() == invites.SelectMany(i => i.invite.Emails).Count())); Arg.Is<IEnumerable<(OrganizationUser, ExpiringToken)>>(v => v.Count() == invites.SelectMany(i => i.invite.Emails).Count()), organization.PlanType == PlanType.Free);
await sutProvider.GetDependency<IEventService>().Received(1).LogOrganizationUserEventsAsync(Arg.Any<IEnumerable<(OrganizationUser, EventType, EventSystemUser, DateTime?)>>()); await sutProvider.GetDependency<IEventService>().Received(1).LogOrganizationUserEventsAsync(Arg.Any<IEnumerable<(OrganizationUser, EventType, EventSystemUser, DateTime?)>>());
} }

View File

@ -2860,55 +2860,55 @@
"common": { "common": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoFixture.AutoNSubstitute": "[4.17.0, )", "AutoFixture.AutoNSubstitute": "4.17.0",
"AutoFixture.Xunit2": "[4.17.0, )", "AutoFixture.Xunit2": "4.17.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Kralizek.AutoFixture.Extensions.MockHttp": "[1.2.0, )", "Kralizek.AutoFixture.Extensions.MockHttp": "1.2.0",
"Microsoft.NET.Test.Sdk": "[17.1.0, )", "Microsoft.NET.Test.Sdk": "17.1.0",
"NSubstitute": "[4.3.0, )", "NSubstitute": "4.3.0",
"xunit": "[2.4.1, )" "xunit": "2.4.1"
} }
}, },
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
} }
} }

View File

@ -2966,79 +2966,79 @@
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
}, },
"icons": { "icons": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AngleSharp": "[0.16.1, )", "AngleSharp": "0.16.1",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"SharedWeb": "[2023.2.0, )" "SharedWeb": "2023.2.2"
} }
}, },
"infrastructure.dapper": { "infrastructure.dapper": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Dapper": "[2.0.123, )" "Dapper": "2.0.123"
} }
}, },
"infrastructure.entityframework": { "infrastructure.entityframework": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoMapper.Extensions.Microsoft.DependencyInjection": "[11.0.0, )", "AutoMapper.Extensions.Microsoft.DependencyInjection": "11.0.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Microsoft.EntityFrameworkCore.Relational": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Relational": "6.0.12",
"Microsoft.EntityFrameworkCore.SqlServer": "[6.0.12, )", "Microsoft.EntityFrameworkCore.SqlServer": "6.0.12",
"Microsoft.EntityFrameworkCore.Sqlite": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Sqlite": "6.0.12",
"Npgsql.EntityFrameworkCore.PostgreSQL": "[6.0.8, )", "Npgsql.EntityFrameworkCore.PostgreSQL": "6.0.8",
"Pomelo.EntityFrameworkCore.MySql": "[6.0.2, )", "Pomelo.EntityFrameworkCore.MySql": "6.0.2",
"linq2db.EntityFrameworkCore": "[6.11.0, )" "linq2db.EntityFrameworkCore": "6.11.0"
} }
}, },
"sharedweb": { "sharedweb": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Infrastructure.Dapper": "[2023.2.0, )", "Infrastructure.Dapper": "2023.2.2",
"Infrastructure.EntityFramework": "[2023.2.0, )" "Infrastructure.EntityFramework": "2023.2.2"
} }
} }
} }

View File

@ -3179,101 +3179,101 @@
"common": { "common": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoFixture.AutoNSubstitute": "[4.17.0, )", "AutoFixture.AutoNSubstitute": "4.17.0",
"AutoFixture.Xunit2": "[4.17.0, )", "AutoFixture.Xunit2": "4.17.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Kralizek.AutoFixture.Extensions.MockHttp": "[1.2.0, )", "Kralizek.AutoFixture.Extensions.MockHttp": "1.2.0",
"Microsoft.NET.Test.Sdk": "[17.1.0, )", "Microsoft.NET.Test.Sdk": "17.1.0",
"NSubstitute": "[4.3.0, )", "NSubstitute": "4.3.0",
"xunit": "[2.4.1, )" "xunit": "2.4.1"
} }
}, },
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
}, },
"identity": { "identity": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"SharedWeb": "[2023.2.0, )", "SharedWeb": "2023.2.2",
"Swashbuckle.AspNetCore.SwaggerGen": "[6.5.0, )" "Swashbuckle.AspNetCore.SwaggerGen": "6.5.0"
} }
}, },
"infrastructure.dapper": { "infrastructure.dapper": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Dapper": "[2.0.123, )" "Dapper": "2.0.123"
} }
}, },
"infrastructure.entityframework": { "infrastructure.entityframework": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoMapper.Extensions.Microsoft.DependencyInjection": "[11.0.0, )", "AutoMapper.Extensions.Microsoft.DependencyInjection": "11.0.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Microsoft.EntityFrameworkCore.Relational": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Relational": "6.0.12",
"Microsoft.EntityFrameworkCore.SqlServer": "[6.0.12, )", "Microsoft.EntityFrameworkCore.SqlServer": "6.0.12",
"Microsoft.EntityFrameworkCore.Sqlite": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Sqlite": "6.0.12",
"Npgsql.EntityFrameworkCore.PostgreSQL": "[6.0.8, )", "Npgsql.EntityFrameworkCore.PostgreSQL": "6.0.8",
"Pomelo.EntityFrameworkCore.MySql": "[6.0.2, )", "Pomelo.EntityFrameworkCore.MySql": "6.0.2",
"linq2db.EntityFrameworkCore": "[6.11.0, )" "linq2db.EntityFrameworkCore": "6.11.0"
} }
}, },
"integrationtestcommon": { "integrationtestcommon": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Common": "[2023.2.0, )", "Common": "2023.2.2",
"Identity": "[2023.2.0, )", "Identity": "2023.2.2",
"Microsoft.AspNetCore.Mvc.Testing": "[6.0.5, )", "Microsoft.AspNetCore.Mvc.Testing": "6.0.5",
"Microsoft.EntityFrameworkCore.InMemory": "[6.0.5, )", "Microsoft.EntityFrameworkCore.InMemory": "6.0.5",
"Microsoft.Extensions.Configuration": "[6.0.1, )" "Microsoft.Extensions.Configuration": "6.0.1"
} }
}, },
"sharedweb": { "sharedweb": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Infrastructure.Dapper": "[2023.2.0, )", "Infrastructure.Dapper": "2023.2.2",
"Infrastructure.EntityFramework": "[2023.2.0, )" "Infrastructure.EntityFramework": "2023.2.2"
} }
} }
} }

View File

@ -3046,91 +3046,91 @@
"common": { "common": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoFixture.AutoNSubstitute": "[4.17.0, )", "AutoFixture.AutoNSubstitute": "4.17.0",
"AutoFixture.Xunit2": "[4.17.0, )", "AutoFixture.Xunit2": "4.17.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Kralizek.AutoFixture.Extensions.MockHttp": "[1.2.0, )", "Kralizek.AutoFixture.Extensions.MockHttp": "1.2.0",
"Microsoft.NET.Test.Sdk": "[17.1.0, )", "Microsoft.NET.Test.Sdk": "17.1.0",
"NSubstitute": "[4.3.0, )", "NSubstitute": "4.3.0",
"xunit": "[2.4.1, )" "xunit": "2.4.1"
} }
}, },
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
}, },
"identity": { "identity": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"SharedWeb": "[2023.2.0, )", "SharedWeb": "2023.2.2",
"Swashbuckle.AspNetCore.SwaggerGen": "[6.5.0, )" "Swashbuckle.AspNetCore.SwaggerGen": "6.5.0"
} }
}, },
"infrastructure.dapper": { "infrastructure.dapper": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Dapper": "[2.0.123, )" "Dapper": "2.0.123"
} }
}, },
"infrastructure.entityframework": { "infrastructure.entityframework": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoMapper.Extensions.Microsoft.DependencyInjection": "[11.0.0, )", "AutoMapper.Extensions.Microsoft.DependencyInjection": "11.0.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Microsoft.EntityFrameworkCore.Relational": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Relational": "6.0.12",
"Microsoft.EntityFrameworkCore.SqlServer": "[6.0.12, )", "Microsoft.EntityFrameworkCore.SqlServer": "6.0.12",
"Microsoft.EntityFrameworkCore.Sqlite": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Sqlite": "6.0.12",
"Npgsql.EntityFrameworkCore.PostgreSQL": "[6.0.8, )", "Npgsql.EntityFrameworkCore.PostgreSQL": "6.0.8",
"Pomelo.EntityFrameworkCore.MySql": "[6.0.2, )", "Pomelo.EntityFrameworkCore.MySql": "6.0.2",
"linq2db.EntityFrameworkCore": "[6.11.0, )" "linq2db.EntityFrameworkCore": "6.11.0"
} }
}, },
"sharedweb": { "sharedweb": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Infrastructure.Dapper": "[2023.2.0, )", "Infrastructure.Dapper": "2023.2.2",
"Infrastructure.EntityFramework": "[2023.2.0, )" "Infrastructure.EntityFramework": "2023.2.2"
} }
} }
} }

View File

@ -12,8 +12,7 @@ public class AuthRequestCompare : IEqualityComparer<AuthRequest>
x.PublicKey == y.PublicKey && x.PublicKey == y.PublicKey &&
x.RequestDeviceIdentifier == y.RequestDeviceIdentifier && x.RequestDeviceIdentifier == y.RequestDeviceIdentifier &&
x.RequestDeviceType == y.RequestDeviceType && x.RequestDeviceType == y.RequestDeviceType &&
x.RequestIpAddress == y.RequestIpAddress && x.RequestIpAddress == y.RequestIpAddress;
x.RequestFingerprint == y.RequestFingerprint;
} }
public int GetHashCode([DisallowNull] AuthRequest obj) public int GetHashCode([DisallowNull] AuthRequest obj)

View File

@ -3036,89 +3036,89 @@
"common": { "common": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoFixture.AutoNSubstitute": "[4.17.0, )", "AutoFixture.AutoNSubstitute": "4.17.0",
"AutoFixture.Xunit2": "[4.17.0, )", "AutoFixture.Xunit2": "4.17.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Kralizek.AutoFixture.Extensions.MockHttp": "[1.2.0, )", "Kralizek.AutoFixture.Extensions.MockHttp": "1.2.0",
"Microsoft.NET.Test.Sdk": "[17.1.0, )", "Microsoft.NET.Test.Sdk": "17.1.0",
"NSubstitute": "[4.3.0, )", "NSubstitute": "4.3.0",
"xunit": "[2.4.1, )" "xunit": "2.4.1"
} }
}, },
"core": { "core": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AWSSDK.SQS": "[3.7.2.47, )", "AWSSDK.SQS": "3.7.2.47",
"AWSSDK.SimpleEmail": "[3.7.0.150, )", "AWSSDK.SimpleEmail": "3.7.0.150",
"AspNetCoreRateLimit": "[4.0.2, )", "AspNetCoreRateLimit": "4.0.2",
"AspNetCoreRateLimit.Redis": "[1.0.1, )", "AspNetCoreRateLimit.Redis": "1.0.1",
"Azure.Extensions.AspNetCore.DataProtection.Blobs": "[1.2.1, )", "Azure.Extensions.AspNetCore.DataProtection.Blobs": "1.2.1",
"Azure.Storage.Blobs": "[12.14.1, )", "Azure.Storage.Blobs": "12.14.1",
"Azure.Storage.Queues": "[12.12.0, )", "Azure.Storage.Queues": "12.12.0",
"BitPay.Light": "[1.0.1907, )", "BitPay.Light": "1.0.1907",
"Braintree": "[5.12.0, )", "Braintree": "5.12.0",
"DnsClient": "[1.7.0, )", "DnsClient": "1.7.0",
"Fido2.AspNet": "[3.0.1, )", "Fido2.AspNet": "3.0.1",
"Handlebars.Net": "[2.1.2, )", "Handlebars.Net": "2.1.2",
"IdentityServer4": "[4.1.2, )", "IdentityServer4": "4.1.2",
"IdentityServer4.AccessTokenValidation": "[3.0.1, )", "IdentityServer4.AccessTokenValidation": "3.0.1",
"LaunchDarkly.ServerSdk": "[7.0.0, )", "LaunchDarkly.ServerSdk": "7.0.0",
"MailKit": "[3.2.0, )", "MailKit": "3.2.0",
"Microsoft.AspNetCore.Authentication.JwtBearer": "[6.0.4, )", "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.4",
"Microsoft.Azure.Cosmos.Table": "[1.0.8, )", "Microsoft.Azure.Cosmos.Table": "1.0.8",
"Microsoft.Azure.NotificationHubs": "[4.1.0, )", "Microsoft.Azure.NotificationHubs": "4.1.0",
"Microsoft.Azure.ServiceBus": "[5.2.0, )", "Microsoft.Azure.ServiceBus": "5.2.0",
"Microsoft.Data.SqlClient": "[5.0.1, )", "Microsoft.Data.SqlClient": "5.0.1",
"Microsoft.Extensions.Caching.StackExchangeRedis": "[6.0.6, )", "Microsoft.Extensions.Caching.StackExchangeRedis": "6.0.6",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "[6.0.1, )", "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "[6.0.1, )", "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1",
"Microsoft.Extensions.Identity.Stores": "[6.0.4, )", "Microsoft.Extensions.Identity.Stores": "6.0.4",
"Newtonsoft.Json": "[13.0.1, )", "Newtonsoft.Json": "13.0.1",
"Otp.NET": "[1.2.2, )", "Otp.NET": "1.2.2",
"Quartz": "[3.4.0, )", "Quartz": "3.4.0",
"SendGrid": "[9.27.0, )", "SendGrid": "9.27.0",
"Sentry.Serilog": "[3.16.0, )", "Sentry.Serilog": "3.16.0",
"Serilog.AspNetCore": "[5.0.0, )", "Serilog.AspNetCore": "5.0.0",
"Serilog.Extensions.Logging": "[3.1.0, )", "Serilog.Extensions.Logging": "3.1.0",
"Serilog.Extensions.Logging.File": "[2.0.0, )", "Serilog.Extensions.Logging.File": "2.0.0",
"Serilog.Sinks.AzureCosmosDB": "[2.0.0, )", "Serilog.Sinks.AzureCosmosDB": "2.0.0",
"Serilog.Sinks.SyslogMessages": "[2.0.6, )", "Serilog.Sinks.SyslogMessages": "2.0.6",
"Stripe.net": "[40.0.0, )", "Stripe.net": "40.0.0",
"YubicoDotNetClient": "[1.2.0, )" "YubicoDotNetClient": "1.2.0"
} }
}, },
"core.test": { "core.test": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoFixture.AutoNSubstitute": "[4.17.0, )", "AutoFixture.AutoNSubstitute": "4.17.0",
"AutoFixture.Xunit2": "[4.17.0, )", "AutoFixture.Xunit2": "4.17.0",
"Common": "[2023.2.0, )", "Common": "2023.2.2",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Kralizek.AutoFixture.Extensions.MockHttp": "[1.2.0, )", "Kralizek.AutoFixture.Extensions.MockHttp": "1.2.0",
"Microsoft.NET.Test.Sdk": "[17.1.0, )", "Microsoft.NET.Test.Sdk": "17.1.0",
"Moq": "[4.17.2, )", "Moq": "4.17.2",
"NSubstitute": "[4.3.0, )", "NSubstitute": "4.3.0",
"xunit": "[2.4.1, )" "xunit": "2.4.1"
} }
}, },
"infrastructure.dapper": { "infrastructure.dapper": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Dapper": "[2.0.123, )" "Dapper": "2.0.123"
} }
}, },
"infrastructure.entityframework": { "infrastructure.entityframework": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"AutoMapper.Extensions.Microsoft.DependencyInjection": "[11.0.0, )", "AutoMapper.Extensions.Microsoft.DependencyInjection": "11.0.0",
"Core": "[2023.2.0, )", "Core": "2023.2.2",
"Microsoft.EntityFrameworkCore.Relational": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Relational": "6.0.12",
"Microsoft.EntityFrameworkCore.SqlServer": "[6.0.12, )", "Microsoft.EntityFrameworkCore.SqlServer": "6.0.12",
"Microsoft.EntityFrameworkCore.Sqlite": "[6.0.12, )", "Microsoft.EntityFrameworkCore.Sqlite": "6.0.12",
"Npgsql.EntityFrameworkCore.PostgreSQL": "[6.0.8, )", "Npgsql.EntityFrameworkCore.PostgreSQL": "6.0.8",
"Pomelo.EntityFrameworkCore.MySql": "[6.0.2, )", "Pomelo.EntityFrameworkCore.MySql": "6.0.2",
"linq2db.EntityFrameworkCore": "[6.11.0, )" "linq2db.EntityFrameworkCore": "6.11.0"
} }
} }
} }

Some files were not shown because too many files have changed in this diff Show More