Esempio n. 1
0
        public async Task <IActionResult> Save(string id, DocumentSubmissionModel submissionModel)
        {
            submissionModel.AntecedentIdBase64 = submissionModel.AntecedentIdBase64 ?? Enumerable.Empty <string>();

            if (submissionModel.AntecedentIdBase64.Any() && !submissionModel.AntecedentIdBase64.Contains(id))
            {
                logger.LogWarning("Document rejected; The given id is a member of the given antecedents; Origin: {0}", HttpContext.GetRemoteAddress());
                return(BadRequest());
            }

            if (submissionModel.AntecedentIdBase64.Count() > 2)
            {
                logger.LogWarning("Document rejected; More than two antecedents; Origin: {0}", HttpContext.GetRemoteAddress());
                return(BadRequest());
            }

            if (submissionModel.AntecedentIdBase64.Any(_id => _id.FalsifyAsIdentifier()))
            {
                logger.LogWarning("Document rejected; Invalid antecents; Origin: {0}", HttpContext.GetRemoteAddress());
                return(BadRequest());
            }

            submissionModel.Title = submissionModel.Title ?? string.Empty;
            submissionModel.Body  = submissionModel.Body ?? string.Empty;

            submissionModel.Title = submissionModel.Title.Trim();
            submissionModel.Body  = submissionModel.Body.Trim();

            if (submissionModel.Title.Length > inputConfiguration.TitleLengthLimit)
            {
                logger.LogWarning("Document rejected; Title too long; Origin: {0}", HttpContext.GetRemoteAddress());
                return(StatusCode(413));
            }

            if (submissionModel.Body.Length > inputConfiguration.BodyLengthLimit)
            {
                logger.LogWarning("Document rejected; Body too long; Origin: {0}", HttpContext.GetRemoteAddress());
                return(StatusCode(413));
            }

            var antecedantIds = ImmutableArray.CreateRange(submissionModel.AntecedentIdBase64.Select(s => new MD5Sum(WebEncoders.Base64UrlDecode(s))));

            Guid authorId;

            {
                var nameIdentifierClaim = User.Claims.First(c => c.Type == ClaimTypes.NameIdentifier);

                authorId = Guid.Parse(nameIdentifierClaim.Value);
            }

            var submissionId = await databaseService.AddDocumentAsync(authorId, submissionModel.Body, submissionModel.Title, antecedantIds);

            logger.LogInformation("Document saved; Key: {1}; Origin: {0}", HttpContext.GetRemoteAddress(), submissionId.ToString());

            return(RedirectToAction(nameof(GetDocument), new { id = submissionId.ToString() }));
        }