示例#1
0
        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());
            }
        }
示例#2
0
        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}"));
            }
        }
示例#3
0
        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,
            });
        }