private string GetBuildExtention(RelayBuildRequest request) { if (request.Type == Build.BinaryType.Shellcode) { switch (request.Donut?.format) { case DonutLibrary.OutputFormat.BINARY: return("bin"); case DonutLibrary.OutputFormat.BASE64: return("b64"); case DonutLibrary.OutputFormat.RUBY: return("rb"); case DonutLibrary.OutputFormat.C: return("c"); case DonutLibrary.OutputFormat.PYTHON: return("py"); case DonutLibrary.OutputFormat.POWERSHELL: return("ps1"); case DonutLibrary.OutputFormat.CSHARP: return("cs"); case DonutLibrary.OutputFormat.HEX: return("hex"); default: throw new ArgumentException("Unrecognized output format"); } } else { return(request.Type.ToString().ToLower()); } }
public async Task <IActionResult> Customize([FromBody] RelayBuildRequest request, [FromServices] ICustomizer customizer) { RelayBuild newBuild = null; System.Action cleanupBuild = () => { if (newBuild != null) { try { context.RelayBuilds.Remove(newBuild); context.SaveChanges(); } catch (Exception) { } } }; try { newBuild = Convert(request); byte[] output; { context.RelayBuilds.Add(newBuild); context.SaveChanges(); } output = await customizer.CustomizeNodeRelay(newBuild); var buildName = String.IsNullOrEmpty(newBuild.Name) ? "" : $"_{newBuild.Name}"; return(File(output, "application/octet-stream", $"Relay_{newBuild.Arch.ToString().ToLower()}_{newBuild.BuildId:x}{buildName}.{newBuild.Type.ToString().ToLower()}")); } catch (TimeoutException e) { cleanupBuild(); return(StatusCode(StatusCodes.Status408RequestTimeout, e.Message)); } catch (CommandQueues.InvalidGateway e) { cleanupBuild(); return(StatusCode(StatusCodes.Status410Gone, $"Failed to add build, because {e.Message}. Try restarting gateway.")); } catch (Exception e) when(e is CustomizerError || e is GatewayResponseError) { cleanupBuild(); return(BadRequest(e.Message)); } catch (Exception e) { cleanupBuild(); return(StatusCode(StatusCodes.Status500InternalServerError, $"Unknown error. {e.Message}")); } }
private Models.RelayBuild Convert(RelayBuildRequest request) { var gatewayAgentId = context.Gateways.First(g => g.BuildId == request.ParentGatewayBuildId).AgentId; var gatewayBuild = context.GatewayBuilds.Single(g => g.BuildId == request.ParentGatewayBuildId); return(new RelayBuild { Arch = request.Architecture, Type = request.Type, Name = request.Name, StartupCommands = request.StartupCommands, BroadcastKey = gatewayBuild.BroadcastKey, PublicKey = gatewayBuild.PublicKey, Channels = gatewayBuild.Channels, Commands = gatewayBuild.RelayCommands["commands"], Peripherals = gatewayBuild.Peripherals, ParentGatwayAgentId = gatewayAgentId, }); }