Ejemplo n.º 1
0
    private async Task <string> FileUpload(TesterFiles input, string baseLocation, bool verify = false)
    {
        if (input.IsEmpty())
        {
            return("WARNING: No files were found, nothing was uploaded!");
        }
        if (!input.IsLikelyValid())
        {
            return(Fail(400, ">:[ not nice"));
        }

        if (!await this.VerifySession(_manager) || !await this.VerifyAdmin(_query))
        {
            Fail(403, "Authentication required!");
        }

        var test = await _query.GetTest(input.TestID);

        var output = new StringBuilder();

        for (var i = 0; i < input.Files.Count; i++)
        {
            var file = input.Files[i];

            var fileName   = input.FileNames[i] ?? Path.GetFileName(file.FileName);
            var sourcePath = Path.Join(baseLocation, "" + input.TestID);
            Directory.CreateDirectory(sourcePath);
            var outputPath = Path.Combine(sourcePath, fileName);
            var backupPath = outputPath;
            if (System.IO.File.Exists(backupPath))
            {
                var counter = 0;
                do
                {
                    counter++;
                    backupPath = Path.Combine(sourcePath, $"old-{counter}-{fileName}");
                } while (System.IO.File.Exists(backupPath));
                System.IO.File.Move(outputPath, backupPath);
                output.AppendLine($"WARNING: {fileName} existed already, made a copy at {backupPath}.");
            }

            if (verify && test != null && test.RequiredFiles.Contains(fileName))
            {
                output.AppendLine(
                    $"WARNING: {fileName} is a required file; it will not be copied during stipulation!");
            }
            await using var stream = new FileStream(outputPath, FileMode.Create);
            await file.CopyToAsync(stream);

            output.AppendLine($"Successfully uploaded {fileName} to {outputPath}!");
        }

        return(output.ToString());
    }
Ejemplo n.º 2
0
 [RequestSizeLimit(33554432)] // 32 MiB max
 public async Task <string> FileUploadSource([FromForm] TesterFiles input)
 => await FileUpload(input, _config.SourceLocation, true);
Ejemplo n.º 3
0
 [RequestSizeLimit(33554432)] // 32 MiB max
 public async Task <string> FileUploadInclude([FromForm] TesterFiles input)
 => await FileUpload(input, _config.IncludeLocation);
Ejemplo n.º 4
0
    [RequestSizeLimit(8388608)] // 8 MiB
    public async Task <string> FileUpload([FromForm] TesterFiles input)
    {
        if (input == null || !input.IsLikelyValid())
        {
            return(Fail(400, ">:[ not nice"));
        }

        if (!await this.VerifySession(_manager))
        {
            return(Fail(403, "Login needed!"));
        }

        if (!await _captcha.VerifyCaptcha(input.CaptchaToken))
        {
            return(Fail(403, "reCAPTCHA token invalid!"));
        }

        var user = await _query.ResolveUser(this.GetLoginCookie());

        if (_config.TimeoutAttempts >= 1 && user.TestsRemaining <= 0)
        {
            return(Fail(403, "You are on a cooldown!"));
        }

        var test = await _query.GetTest(input.TestID);

        if (test == null)
        {
            return(Fail(404, "Failed to find Test ID!"));
        }

        var path      = _java.GetDummyFolder();
        var inputPath = Path.Join(path, "source");

        Directory.CreateDirectory(inputPath);
        for (var i = 0; i < input.Files.Count; i++)
        {
            var file = input.Files[i];
            if (file.Length > 8 * 1024 * 1024)
            {
                continue;
            }
            var fileName   = input.FileNames[i];
            var outputPath = Path.Combine(inputPath, fileName);
            await using var stream = new FileStream(outputPath, FileMode.Create);
            await file.CopyToAsync(stream);
        }

        foreach (var file in test.TesterFiles)
        {
            var sourcePath = Path.Join(_config.SourceLocation, "" + input.TestID);
            var tester     = Path.Combine(sourcePath, file);
            var testerOut  = Path.Combine(inputPath, file);
            if (!System.IO.File.Exists(tester) || System.IO.File.Exists(testerOut))
            {
                continue;
            }
            System.IO.File.Copy(tester, testerOut);
            input.FileNames.Add(file);
        }

        var output = _java.DockerTest(path, input.ConnectionID, test.TesterFiles.ToArray());
        await _query.DecrementAttempts(user.ID);

        return(output);
    }