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()); }
[RequestSizeLimit(33554432)] // 32 MiB max public async Task <string> FileUploadSource([FromForm] TesterFiles input) => await FileUpload(input, _config.SourceLocation, true);
[RequestSizeLimit(33554432)] // 32 MiB max public async Task <string> FileUploadInclude([FromForm] TesterFiles input) => await FileUpload(input, _config.IncludeLocation);
[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); }