Added support chat. Added resource service. Added server backups
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Moonlight.App.Http.Requests.Wings;
|
||||
using Moonlight.App.Repositories;
|
||||
using Moonlight.App.Repositories.Servers;
|
||||
using Moonlight.App.Services;
|
||||
|
||||
namespace Moonlight.App.Http.Controllers.Api.Remote;
|
||||
|
||||
[Route("api/remote/backups")]
|
||||
[ApiController]
|
||||
public class BackupController : Controller
|
||||
{
|
||||
private readonly ServerBackupRepository ServerBackupRepository;
|
||||
private readonly MessageService MessageService;
|
||||
private readonly NodeRepository NodeRepository;
|
||||
|
||||
public BackupController(
|
||||
ServerBackupRepository serverBackupRepository,
|
||||
NodeRepository nodeRepository,
|
||||
MessageService messageService)
|
||||
{
|
||||
ServerBackupRepository = serverBackupRepository;
|
||||
NodeRepository = nodeRepository;
|
||||
MessageService = messageService;
|
||||
}
|
||||
|
||||
[HttpGet("{uuid}")]
|
||||
public ActionResult<string> Download(Guid uuid)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
[HttpPost("{uuid}")]
|
||||
public async Task<ActionResult> SetStatus([FromRoute] Guid uuid, [FromBody] ReportBackupCompleteRequest request)
|
||||
{
|
||||
var tokenData = Request.Headers.Authorization.ToString().Replace("Bearer ", "");
|
||||
var id = tokenData.Split(".")[0];
|
||||
var token = tokenData.Split(".")[1];
|
||||
|
||||
var node = NodeRepository.Get().FirstOrDefault(x => x.TokenId == id);
|
||||
|
||||
if (node == null)
|
||||
return NotFound();
|
||||
|
||||
if (token != node.Token)
|
||||
return Unauthorized();
|
||||
|
||||
var backup = ServerBackupRepository.Get().FirstOrDefault(x => x.Uuid == uuid);
|
||||
|
||||
if (backup == null)
|
||||
return NotFound();
|
||||
|
||||
if (request.Successful)
|
||||
{
|
||||
backup.Created = true;
|
||||
backup.Bytes = request.Size;
|
||||
|
||||
ServerBackupRepository.Update(backup);
|
||||
|
||||
await MessageService.Emit($"wings.backups.create", backup);
|
||||
}
|
||||
else
|
||||
{
|
||||
await MessageService.Emit($"wings.backups.createfailed", backup);
|
||||
ServerBackupRepository.Delete(backup);
|
||||
}
|
||||
|
||||
return NoContent();
|
||||
}
|
||||
|
||||
[HttpPost("{uuid}/restore")]
|
||||
public async Task<ActionResult> SetRestoreStatus([FromRoute] Guid uuid)
|
||||
{
|
||||
var tokenData = Request.Headers.Authorization.ToString().Replace("Bearer ", "");
|
||||
var id = tokenData.Split(".")[0];
|
||||
var token = tokenData.Split(".")[1];
|
||||
|
||||
var node = NodeRepository.Get().FirstOrDefault(x => x.TokenId == id);
|
||||
|
||||
if (node == null)
|
||||
return NotFound();
|
||||
|
||||
if (token != node.Token)
|
||||
return Unauthorized();
|
||||
|
||||
var backup = ServerBackupRepository.Get().FirstOrDefault(x => x.Uuid == uuid);
|
||||
|
||||
if (backup == null)
|
||||
return NotFound();
|
||||
|
||||
await MessageService.Emit($"wings.backups.restore", backup);
|
||||
|
||||
return NoContent();
|
||||
}
|
||||
}
|
||||
115
Moonlight/App/Http/Controllers/Api/Remote/SftpAuthController.cs
Normal file
115
Moonlight/App/Http/Controllers/Api/Remote/SftpAuthController.cs
Normal file
@@ -0,0 +1,115 @@
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Moonlight.App.Http.Requests.Wings;
|
||||
using Moonlight.App.Http.Resources.Wings;
|
||||
using Moonlight.App.Repositories;
|
||||
using Moonlight.App.Services;
|
||||
|
||||
namespace Moonlight.App.Http.Controllers.Api.Remote;
|
||||
|
||||
[ApiController]
|
||||
[Route("api/remote/sftp/auth")]
|
||||
public class SftpAuthController : Controller
|
||||
{
|
||||
private readonly ServerService ServerService;
|
||||
private readonly NodeRepository NodeRepository;
|
||||
|
||||
public SftpAuthController(
|
||||
ServerService serverService,
|
||||
NodeRepository nodeRepository)
|
||||
{
|
||||
ServerService = serverService;
|
||||
NodeRepository = nodeRepository;
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public async Task<ActionResult<SftpLoginResult>> Login(SftpLoginRequest request)
|
||||
{
|
||||
var tokenData = Request.Headers.Authorization.ToString().Replace("Bearer ", "");
|
||||
var tokenId = tokenData.Split(".")[0];
|
||||
var token = tokenData.Split(".")[1];
|
||||
|
||||
var node = NodeRepository.Get().FirstOrDefault(x => x.TokenId == tokenId);
|
||||
|
||||
if (node == null)
|
||||
return NotFound();
|
||||
|
||||
if (token != node.Token)
|
||||
return Unauthorized();
|
||||
|
||||
if (request.Type == "public_key") // Deny public key authentication, because moonlight does not implement that
|
||||
{
|
||||
return StatusCode(403);
|
||||
}
|
||||
|
||||
// Parse the username
|
||||
var parts = request.Username.Split(".");
|
||||
|
||||
if (parts.Length < 2)
|
||||
return BadRequest();
|
||||
|
||||
if (!int.TryParse(parts[0], out int id))
|
||||
return BadRequest();
|
||||
|
||||
if (!int.TryParse(parts[1], out int serverId))
|
||||
return BadRequest();
|
||||
|
||||
try
|
||||
{
|
||||
var server = await ServerService.SftpServerLogin(serverId, id, request.Password);
|
||||
|
||||
return Ok(new SftpLoginResult()
|
||||
{
|
||||
Server = server.Uuid.ToString(),
|
||||
User = "",
|
||||
Permissions = new()
|
||||
{
|
||||
"control.console",
|
||||
"control.start",
|
||||
"control.stop",
|
||||
"control.restart",
|
||||
"websocket.connect",
|
||||
"file.create",
|
||||
"file.read",
|
||||
"file.read-content",
|
||||
"file.update",
|
||||
"file.delete",
|
||||
"file.archive",
|
||||
"file.sftp",
|
||||
"user.create",
|
||||
"user.read",
|
||||
"user.update",
|
||||
"user.delete",
|
||||
"backup.create",
|
||||
"backup.read",
|
||||
"backup.delete",
|
||||
"backup.download",
|
||||
"backup.restore",
|
||||
"allocation.read",
|
||||
"allocation.create",
|
||||
"allocation.update",
|
||||
"allocation.delete",
|
||||
"startup.read",
|
||||
"startup.update",
|
||||
"startup.docker-image",
|
||||
"database.create",
|
||||
"database.read",
|
||||
"database.update",
|
||||
"database.delete",
|
||||
"database.view_password",
|
||||
"schedule.create",
|
||||
"schedule.read",
|
||||
"schedule.update",
|
||||
"schedule.delete",
|
||||
"settings.rename",
|
||||
"settings.reinstall"
|
||||
}
|
||||
});
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
// Most of the exception here will be because of stuff like a invalid server id and simular things
|
||||
// so we ignore them and return 403
|
||||
return StatusCode(403);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user