mirror of
https://github.com/bitwarden/server.git
synced 2025-07-04 17:42:49 -05:00
72 lines
2.7 KiB
C#
72 lines
2.7 KiB
C#
using Bit.Api.SecretsManager.Models.Request;
|
|
using Bit.Api.SecretsManager.Models.Response;
|
|
using Bit.Core.Context;
|
|
using Bit.Core.Enums;
|
|
using Bit.Core.Exceptions;
|
|
using Bit.Core.SecretsManager.Commands.Porting.Interfaces;
|
|
using Bit.Core.SecretsManager.Repositories;
|
|
using Bit.Core.Services;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
namespace Bit.Api.SecretsManager.Controllers;
|
|
|
|
[SecretsManager]
|
|
public class SecretsManagerPortingController : Controller
|
|
{
|
|
private readonly ISecretRepository _secretRepository;
|
|
private readonly IProjectRepository _projectRepository;
|
|
private readonly IUserService _userService;
|
|
private readonly IImportCommand _importCommand;
|
|
private readonly ICurrentContext _currentContext;
|
|
|
|
public SecretsManagerPortingController(ISecretRepository secretRepository, IProjectRepository projectRepository, IUserService userService, IImportCommand importCommand, ICurrentContext currentContext)
|
|
{
|
|
_secretRepository = secretRepository;
|
|
_projectRepository = projectRepository;
|
|
_userService = userService;
|
|
_importCommand = importCommand;
|
|
_currentContext = currentContext;
|
|
}
|
|
|
|
[HttpGet("sm/{organizationId}/export")]
|
|
public async Task<SMExportResponseModel> Export([FromRoute] Guid organizationId, [FromRoute] string format = "json")
|
|
{
|
|
if (!await _currentContext.OrganizationAdmin(organizationId))
|
|
{
|
|
throw new NotFoundException();
|
|
}
|
|
|
|
var userId = _userService.GetProperUserId(User).Value;
|
|
var projects = await _projectRepository.GetManyByOrganizationIdAsync(organizationId, userId, AccessClientType.NoAccessCheck);
|
|
var secrets = await _secretRepository.GetManyByOrganizationIdAsync(organizationId, userId, AccessClientType.NoAccessCheck);
|
|
|
|
if (projects == null && secrets == null)
|
|
{
|
|
throw new NotFoundException();
|
|
}
|
|
|
|
return new SMExportResponseModel(projects, secrets);
|
|
}
|
|
|
|
[HttpPost("sm/{organizationId}/import")]
|
|
public async Task Import([FromRoute] Guid organizationId, [FromBody] SMImportRequestModel importRequest)
|
|
{
|
|
if (!await _currentContext.OrganizationAdmin(organizationId))
|
|
{
|
|
throw new NotFoundException();
|
|
}
|
|
|
|
if (importRequest.Projects?.Count() > 1000 || importRequest.Secrets?.Count() > 6000)
|
|
{
|
|
throw new BadRequestException("You cannot import this much data at once, the limit is 1000 projects and 6000 secrets.");
|
|
}
|
|
|
|
if (importRequest.Secrets.Any(s => s.ProjectIds.Count() > 1))
|
|
{
|
|
throw new BadRequestException("A secret can only be in one project at a time.");
|
|
}
|
|
|
|
await _importCommand.ImportAsync(organizationId, importRequest.ToSMImport());
|
|
}
|
|
}
|