Example #1
0
        /// <summary>
        /// 新增标签日志
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public async Task <ActionOutput <string> > InsertSignatureLog(SignatureLogDto dto)
        {
            using (var uow = UnitOfWorkManager.Begin())
            {
                var output = new ActionOutput <string>();

                var log = new SignatureLog
                {
                    Name = dto.Name,
                    Type = dto.Type,
                    Url  = dto.Url,
                    Ip   = dto.Ip,
                    Time = DateTime.Now
                };

                var result = await _signatureLogRepository.InsertAsync(log);

                await uow.CompleteAsync();

                if (result.IsNull())
                {
                    output.AddError("新增标签出错了~~~");
                }
                else
                {
                    output.Result = "success";
                }

                return(output);
            }
        }
Example #2
0
        private static object[] GenerateSignatureLogWithMetadata()
        {
            var log = SignatureLog.Issue(true, NuGetLogCode.NU3000, string.Empty);

            log.ProjectPath = Guid.NewGuid().ToString();
            log.LibraryId   = Guid.NewGuid().ToString();

            return(new object[] { log });
        }
Example #3
0
 /// <summary>
 /// Converts an SignatureLog into a RestoreLogMessage.
 /// This is needed when an SignatureLog needs to be logged and loggers do not have visibility to SignatureLog.
 /// </summary>
 /// <param name="logMessage">SignatureLog to be converted.</param>
 /// <returns>RestoreLogMessage equivalent to the SignatureLog.</returns>
 public static RestoreLogMessage AsRestoreLogMessage(this SignatureLog logMessage)
 {
     return(new RestoreLogMessage(logMessage.Level, logMessage.Code, logMessage.Message)
     {
         ProjectPath = logMessage.ProjectPath,
         WarningLevel = logMessage.WarningLevel,
         LibraryId = logMessage.LibraryId
     });
 }
Example #4
0
            public async Task RejectsPackagesWithFullVerificationErrors()
            {
                // Arrange
                _packageStream = TestResources.GetResourceStream(TestResources.SignedPackageLeaf1);
                TestUtility.RequireSignedPackage(
                    _corePackageService,
                    TestResources.SignedPackageLeafId,
                    TestResources.SignedPackageLeaf1Version,
                    TestResources.Leaf1Thumbprint);
                _fullVerifyResult = new VerifySignaturesResult(
                    valid: false,
                    signed: true,
                    results: new[]
                {
                    new InvalidSignaturePackageVerificationResult(
                        SignatureVerificationStatus.Suspect,
                        new[]
                    {
                        SignatureLog.Issue(
                            fatal: true,
                            code: NuGetLogCode.NU3008,
                            message: "The package integrity check failed."),
                        SignatureLog.Issue(
                            fatal: false,
                            code: NuGetLogCode.NU3016,
                            message: "The package hash uses an unsupported hash algorithm."),
                        SignatureLog.Issue(
                            fatal: true,
                            code: NuGetLogCode.NU3000,
                            message: "Some other thing happened."),
                    })
                });
                _message = new SignatureValidationMessage(
                    TestResources.SignedPackageLeafId,
                    TestResources.SignedPackageLeaf1Version,
                    new Uri($"https://unit.test/{TestResources.SignedPackageLeaf1.ToLowerInvariant()}"),
                    Guid.NewGuid());

                // Act
                var result = await _target.ValidateAsync(
                    _packageKey,
                    _packageStream,
                    _message,
                    _cancellationToken);

                // Assert
                Validate(result, ValidationStatus.Failed, PackageSigningStatus.Invalid);
                Assert.Equal(2, result.Issues.Count);
                var issue1 = Assert.IsType <ClientSigningVerificationFailure>(result.Issues[0]);

                Assert.Equal("NU3008", issue1.ClientCode);
                Assert.Equal("The package integrity check failed.", issue1.ClientMessage);
                var issue2 = Assert.IsType <ClientSigningVerificationFailure>(result.Issues[1]);

                Assert.Equal("NU3000", issue2.ClientCode);
                Assert.Equal("Some other thing happened.", issue2.ClientMessage);
            }
Example #5
0
        private void Serialize(ref MessagePackWriter writer, SignatureLog logMessage, MessagePackSerializerOptions options)
        {
            writer.WriteMapHeader(count: 8);

            SerializeCommonProperties(ref writer, logMessage, options);

            writer.Write(LibraryIdPropertyName);
            writer.Write(logMessage.LibraryId);
        }
Example #6
0
        public void Equals_OtherIsSame_ReturnsTrue()
        {
            // Arrange
            var log = SignatureLog.Error(NuGetLogCode.NU3000, "unit_test_message");

            // Act
            var equals = log.Equals(log);

            // Assert
            equals.Should().BeTrue();
        }
Example #7
0
        public void Issue_InitializesProperties(bool fatal, NuGetLogCode code, string message)
        {
            // Arrange
            var expectedLevel = fatal ? LogLevel.Error : LogLevel.Warning;

            // Act
            var log = SignatureLog.Issue(fatal, code, message);

            // Assert
            log.Message.Should().Be(message);
            log.Code.Should().Be(code);
            log.Level.Should().Be(expectedLevel);
        }
Example #8
0
        public void DebugLog_InitializesProperties()
        {
            // Arrange
            var message = "unit_test_message";

            // Act
            var log = SignatureLog.DebugLog(message);

            // Assert
            log.Message.Should().Be(message);
            log.Code.Should().Be(NuGetLogCode.Undefined);
            log.Level.Should().Be(LogLevel.Debug);
        }
Example #9
0
        public void Equals_OtherIsNull_ReturnsFalse()
        {
            // Arrange
            var message = "unit_test_message";
            var code    = NuGetLogCode.NU3000;
            var log     = SignatureLog.Error(code, message);

            // Act
            var equals = log.Equals(null);

            // Assert
            equals.Should().BeFalse();
        }
Example #10
0
        private static SignatureLog CreateSignatureLog()
        {
            SignatureLog signatureLog = SignatureLog.Error(NuGetLogCode.NU3031, Message);

            signatureLog.Code         = NuGetLogCode.NU3017;
            signatureLog.Level        = LogLevel.Verbose;
            signatureLog.LibraryId    = "b";
            signatureLog.ProjectPath  = "c";
            signatureLog.Time         = DateTimeOffset.UtcNow;
            signatureLog.WarningLevel = WarningLevel.Important;

            return(signatureLog);
        }
Example #11
0
        public void Error_InitializesProperties()
        {
            // Arrange
            var message = "unit_test_message";
            var code    = NuGetLogCode.NU3000;

            // Act
            var log = SignatureLog.Error(code, message);

            // Assert
            log.Message.Should().Be(message);
            log.Code.Should().Be(code);
            log.Level.Should().Be(LogLevel.Error);
        }
Example #12
0
        public void Equals_OtherIsDifferent_ReturnsFalse(SignatureLog other)
        {
            // Arrange
            var log = SignatureLog.Error(NuGetLogCode.NU3000, "unit_test_message");

            log.ProjectPath = Guid.NewGuid().ToString();
            log.LibraryId   = Guid.NewGuid().ToString();

            // Act
            var equals = log.Equals(other);

            // Assert
            equals.Should().BeFalse();
        }
Example #13
0
        public void Equals_OtherIsEquivalent_ReturnsFalse()
        {
            // Arrange
            var log = SignatureLog.Error(NuGetLogCode.NU3000, "unit_test_message");

            log.ProjectPath = "unit_test_project_path";
            log.LibraryId   = "unit_test_library_id";

            var other = SignatureLog.Error(NuGetLogCode.NU3000, "unit_test_message");

            other.ProjectPath = "unit_test_project_path";
            other.LibraryId   = "unit_test_library_id";

            // Act
            var equals = log.Equals(log);

            // Assert
            equals.Should().BeTrue();
        }
Example #14
0
            public async Task RejectsPackagesWithMimimalVerificationErrors()
            {
                // Arrange
                _packageStream       = TestResources.GetResourceStream(TestResources.SignedPackageLeaf1);
                _minimalVerifyResult = new VerifySignaturesResult(
                    valid: false,
                    signed: true,
                    results: new[]
                {
                    new InvalidSignaturePackageVerificationResult(
                        SignatureVerificationStatus.Suspect,
                        new[]
                    {
                        SignatureLog.Issue(
                            fatal: true,
                            code: NuGetLogCode.NU3000,
                            message: "The package signature is invalid."),
                    })
                });
                _message = new SignatureValidationMessage(
                    TestResources.SignedPackageLeafId,
                    TestResources.SignedPackageLeaf1Version,
                    new Uri($"https://unit.test/{TestResources.SignedPackageLeaf1.ToLowerInvariant()}"),
                    Guid.NewGuid());

                // Act
                var result = await _target.ValidateAsync(
                    _packageKey,
                    _packageStream,
                    _message,
                    _cancellationToken);

                // Assert
                Validate(result, ValidationStatus.Failed, PackageSigningStatus.Invalid);
                Assert.Single(result.Issues);
                var issue = Assert.IsType <ClientSigningVerificationFailure>(result.Issues[0]);

                Assert.Equal("NU3000", issue.ClientCode);
                Assert.Equal("The package signature is invalid.", issue.ClientMessage);
            }
Example #15
0
        public static IEnumerable <object[]> SignatureLogCombinations()
        {
            yield return(new object[]
                         { SignatureLog.DebugLog(string.Empty) });

            yield return(new object[]
                         { SignatureLog.InformationLog(string.Empty) });

            yield return(new object[]
                         { SignatureLog.DetailedLog(string.Empty) });

            yield return(new object[]
                         { SignatureLog.Issue(false, NuGetLogCode.NU1000, string.Empty) });

            yield return(new object[]
                         { SignatureLog.Issue(true, NuGetLogCode.NU1000, string.Empty) });

            yield return(new object[]
                         { SignatureLog.Issue(true, NuGetLogCode.NU3000, string.Empty) });

            yield return(GenerateSignatureLogWithMetadata());
        }
Example #16
0
        public async Task <Response <string> > GenerateSignatureAsync(string name, int id)
        {
            var response = new Response <string>();

            if (name.Length > 4)
            {
                response.Msg = "名字只支持1-4个字符";
                return(response);
            }

            var type = Extension.EnumToList <SignatureEnum>().FirstOrDefault(x => x.Value.Equals(id))?.Description;

            if (string.IsNullOrEmpty(type))
            {
                response.Msg = "不存在的签名类型";
                return(response);
            }

            var signatureLog = await _context.SignatureLogs.FirstOrDefaultAsync(x => x.Name.Equals(name) && x.Type.Equals(type));

            if (null != signatureLog)
            {
                response.Result = signatureLog.Url;
                return(response);
            }

            var ip = HttpContext.Request.Headers["X-Forwarded-For"].FirstOrDefault();

            if (string.IsNullOrEmpty(ip))
            {
                ip = Request.HttpContext.Connection.RemoteIpAddress.ToString();
            }

            var url = $"{(name + id).ToMd5()}.png";

            #region 生成签名

            var signatureUrl = AppSettings.Signature.Urls.OrderBy(x => Guid.NewGuid()).Select(x => new
            {
                Url       = x.Key,
                Parameter = string.Format(x.Value, name, id)
            }).FirstOrDefault();

            var content = new StringContent(signatureUrl.Parameter);
            content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");

            using var client = _httpClient.CreateClient();
            client.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0");
            var httpResponse = await client.PostAsync(signatureUrl.Url, content);

            var result = await httpResponse.Content.ReadAsStringAsync();

            var regex  = new Regex(@"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>", RegexOptions.IgnoreCase);
            var imgUrl = regex.Match(result).Groups["imgUrl"].Value;

            // 生成签名路径
            var signaturePath = Path.Combine(AppSettings.Signature.Path, url);

            // 下载签名图片至本地
            await DownloadImg(client, signaturePath, imgUrl);

            // 添加水印并且保存图片
            await AddWatermarkSaveItAsync(signaturePath);

            #endregion

            var entity = new SignatureLog
            {
                Name = name,
                Type = type,
                Url  = url,
                Ip   = ip,
                Date = DateTime.Now
            };
            await _context.SignatureLogs.AddAsync(entity);

            await _context.SaveChangesAsync();

            response.Result = url;
            return(response);
        }
Example #17
0
        public ILogMessage?Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options)
        {
            if (reader.TryReadNil())
            {
                return(null);
            }

            // stack overflow mitigation - see https://github.com/neuecc/MessagePack-CSharp/security/advisories/GHSA-7q36-4xx7-xcxf
            options.Security.DepthStep(ref reader);

            try
            {
                NuGetLogCode?  code              = null;
                int?           endColumnNumber   = null;
                int?           endLineNumber     = null;
                string?        filePath          = null;
                string?        libraryId         = null;
                LogLevel?      logLevel          = null;
                string?        message           = null;
                string?        projectPath       = null;
                bool?          shouldDisplay     = null;
                int?           startColumnNumber = null;
                int?           startLineNumber   = null;
                List <string>? targetGraphs      = null;
                DateTimeOffset?time              = null;
                string?        typeName          = null;
                WarningLevel?  warningLevel      = null;

                int propertyCount = reader.ReadMapHeader();

                for (var propertyIndex = 0; propertyIndex < propertyCount; ++propertyIndex)
                {
                    switch (reader.ReadString())
                    {
                    case CodePropertyName:
                        code = options.Resolver.GetFormatter <NuGetLogCode>().Deserialize(ref reader, options);
                        break;

                    case EndColumnNumberPropertyName:
                        endColumnNumber = reader.ReadInt32();
                        break;

                    case EndLineNumberPropertyName:
                        endLineNumber = reader.ReadInt32();
                        break;

                    case FilePathPropertyName:
                        filePath = reader.ReadString();
                        break;

                    case LevelPropertyName:
                        logLevel = options.Resolver.GetFormatter <LogLevel>().Deserialize(ref reader, options);
                        break;

                    case LibraryIdPropertyName:
                        libraryId = reader.ReadString();
                        break;

                    case MessagePropertyName:
                        message = reader.ReadString();
                        break;

                    case ProjectPathPropertyName:
                        projectPath = reader.ReadString();
                        break;

                    case ShouldDisplayPropertyName:
                        shouldDisplay = reader.ReadBoolean();
                        break;

                    case StartColumnNumberPropertyName:
                        startColumnNumber = reader.ReadInt32();
                        break;

                    case StartLineNumberPropertyName:
                        startLineNumber = reader.ReadInt32();
                        break;

                    case TargetGraphsPropertyName:
                        if (!reader.TryReadNil())
                        {
                            targetGraphs = new List <string>();

                            int targetGraphsCount = reader.ReadArrayHeader();

                            for (var i = 0; i < targetGraphsCount; ++i)
                            {
                                string targetGraph = reader.ReadString();

                                targetGraphs.Add(targetGraph);
                            }
                        }
                        break;

                    case TimePropertyName:
                        time = options.Resolver.GetFormatter <DateTimeOffset>().Deserialize(ref reader, options);
                        break;

                    case TypeNamePropertyName:
                        typeName = reader.ReadString();
                        break;

                    case WarningLevelPropertyName:
                        warningLevel = options.Resolver.GetFormatter <WarningLevel>().Deserialize(ref reader, options);
                        break;

                    default:
                        reader.Skip();
                        break;
                    }
                }

                Assumes.NotNullOrEmpty(typeName);
                Assumes.True(code.HasValue);
                Assumes.True(logLevel.HasValue);
                Assumes.NotNull(message);
                Assumes.True(time.HasValue);
                Assumes.True(warningLevel.HasValue);

                ILogMessage?logMessage = null;

                if (typeName == LogMessageTypeName)
                {
                    logMessage = new LogMessage(logLevel.Value, message)
                    {
                        Code         = code.Value,
                        ProjectPath  = projectPath,
                        Time         = time.Value,
                        WarningLevel = warningLevel.Value
                    };
                }
                else if (typeName == PackagingLogMessageTypeName)
                {
                    Assumes.True(endColumnNumber.HasValue);
                    Assumes.True(endLineNumber.HasValue);
                    Assumes.True(startColumnNumber.HasValue);
                    Assumes.True(startLineNumber.HasValue);

                    PackagingLogMessage packagingLogMessage = PackagingLogMessage.CreateError(message, code.Value);

                    packagingLogMessage.Code              = code.Value;
                    packagingLogMessage.EndColumnNumber   = endColumnNumber.Value;
                    packagingLogMessage.EndLineNumber     = endLineNumber.Value;
                    packagingLogMessage.FilePath          = filePath;
                    packagingLogMessage.Level             = logLevel.Value;
                    packagingLogMessage.ProjectPath       = projectPath;
                    packagingLogMessage.StartColumnNumber = startColumnNumber.Value;
                    packagingLogMessage.StartLineNumber   = startLineNumber.Value;
                    packagingLogMessage.Time              = time.Value;
                    packagingLogMessage.WarningLevel      = warningLevel.Value;

                    logMessage = packagingLogMessage;
                }
                else if (typeName == RestoreLogMessageTypeName)
                {
                    Assumes.True(endColumnNumber.HasValue);
                    Assumes.True(endLineNumber.HasValue);
                    Assumes.True(shouldDisplay.HasValue);
                    Assumes.True(startColumnNumber.HasValue);
                    Assumes.True(startLineNumber.HasValue);

                    logMessage = new RestoreLogMessage(logLevel.Value, message)
                    {
                        Code              = code.Value,
                        EndColumnNumber   = endColumnNumber.Value,
                        EndLineNumber     = endLineNumber.Value,
                        FilePath          = filePath,
                        Level             = logLevel.Value,
                        LibraryId         = libraryId,
                        Message           = message,
                        ProjectPath       = projectPath,
                        ShouldDisplay     = shouldDisplay.Value,
                        StartColumnNumber = startColumnNumber.Value,
                        StartLineNumber   = startLineNumber.Value,
                        TargetGraphs      = targetGraphs,
                        Time              = time.Value,
                        WarningLevel      = warningLevel.Value
                    };
                }
                else if (typeName == SignatureLogTypeName)
                {
                    SignatureLog signatureLog = SignatureLog.Error(code.Value, message);

                    signatureLog.Code         = code.Value;
                    signatureLog.Level        = logLevel.Value;
                    signatureLog.LibraryId    = libraryId;
                    signatureLog.ProjectPath  = projectPath;
                    signatureLog.Time         = time.Value;
                    signatureLog.WarningLevel = warningLevel.Value;

                    logMessage = signatureLog;
                }
                else
                {
                    throw new InvalidOperationException();
                }

                return(logMessage);
            }
            finally
            {
                // stack overflow mitigation - see https://github.com/neuecc/MessagePack-CSharp/security/advisories/GHSA-7q36-4xx7-xcxf
                reader.Depth--;
            }
        }
Example #18
0
 /// <summary>
 /// Adds a package ID and package source as a prefix to log messages and adds package ID to the message.LibraryId.
 /// </summary>
 /// <param name="source">package source.</param>
 /// <param name="package">package identity.</param>
 /// <param name="message">ILogMessage to be modified.</param>
 private static void AddPackageIdentityToSignatureLog(string source, PackageIdentity package, SignatureLog message)
 {
     message.LibraryId = package.Id;
     message.Message   = string.Format(CultureInfo.CurrentCulture, Strings.ExtractionLog_InformationPrefix, package.Id, package.Version, source, message.Message);
 }