Пример #1
0
        /// <summary>
        ///     Checks if cert is from a trusted CA with a valid certificate chain.
        /// </summary>
        /// <param name="online">Check certificate chain online or off-line.</param>
        /// <returns>True of cert chain is valid and from a trusted CA.</returns>
        public bool IsValidCertChain(bool online)
        {
            if (!IsSigned)
                return false;

            return SignatureInformation.IsValidCertChain(PKCS7, online);
        }
        public SignatureHelp OnTextDocumentSignaureHelp(JToken arg)
        {
            Log("textDocument/signatureHelp", arg);

            var signatures = new List <SignatureInformation>();

            for (int i = 0; i < 2; ++i)
            {
                var signature = new SignatureInformation
                {
                    Documentation = "Signature documentation " + i,
                    Label         = "Signature " + i
                };

                var parameters = new List <ParameterInformation>();

                for (int j = 0; j < 3; ++j)
                {
                    var parameter = new ParameterInformation
                    {
                        Documentation = "Parameter documentation " + i,
                        Label         = "Parameter " + i
                    };
                }

                signature.Parameters = parameters.ToArray();

                signatures.Add(signature);
            }

            return(new SignatureHelp
            {
                Signatures = signatures.ToArray()
            });
        }
Пример #3
0
        /// <summary>
        ///     Checks if cert is from a trusted CA with a valid certificate chain.
        /// </summary>
        /// <param name="online">Check certificate chain online or off-line.</param>
        /// <returns>True of cert chain is valid and from a trusted CA.</returns>
        public bool IsValidCertChain(bool online)
        {
            if (!IsSigned)
            {
                return(false);
            }

            return(SignatureInformation.IsValidCertChain(PKCS7, online));
        }
Пример #4
0
        private static SignatureInformation GetSignatureFromDoc(string doc)
        {
            var si             = new SignatureInformation();
            var firstLineBreak = doc.IndexOfAny(new[] { '\r', '\n' });

            si.label         = firstLineBreak > 0 ? doc.Substring(0, firstLineBreak) : doc;
            si.documentation = doc.Substring(si.label.Length).TrimStart();
            si.parameters    = GetParametersFromDoc(si.label);
            return(si);
        }
Пример #5
0
        SignatureInformation GetFuncSignInfo(bhlParser.FuncDeclContext funcDecl)
        {
            SignatureInformation funcSignature = new SignatureInformation();

            string label = funcDecl.NAME().GetText() + "(";

            List <ParameterInformation> funcParameters = BHLSPUtil.GetInfoParams(funcDecl);

            if (funcParameters.Count > 0)
            {
                for (int k = 0; k < funcParameters.Count; k++)
                {
                    var funcParameter = funcParameters[k];
                    label += funcParameter.label.Value;
                    if (k != funcParameters.Count - 1)
                    {
                        label += ", ";
                    }
                }
            }
            else
            {
                label += "<no parameters>";
            }

            label += ")";

            if (funcDecl.retType() is bhlParser.RetTypeContext retType)
            {
                label += ":";

                var types = retType.type();
                for (int n = 0; n < types.Length; n++)
                {
                    var t = types[n];
                    if (t.exception != null)
                    {
                        continue;
                    }

                    label += t.NAME().GetText() + " ";
                }
            }
            else
            {
                label += ":void";
            }

            funcSignature.label      = label;
            funcSignature.parameters = funcParameters.ToArray();
            return(funcSignature);
        }
Пример #6
0
        protected async Task HandleSignatureHelpRequest(
            TextDocumentPosition textDocumentPosition,
            EditorSession editorSession,
            RequestContext <SignatureHelp, object> requestContext)
        {
            ScriptFile scriptFile =
                editorSession.Workspace.GetFile(
                    textDocumentPosition.Uri);

            ParameterSetSignatures parameterSets =
                await editorSession.LanguageService.FindParameterSetsInFile(
                    scriptFile,
                    textDocumentPosition.Position.Line + 1,
                    textDocumentPosition.Position.Character + 1);

            SignatureInformation[] signatures = null;
            int?activeParameter = null;
            int?activeSignature = 0;

            if (parameterSets != null)
            {
                signatures =
                    parameterSets
                    .Signatures
                    .Select(s =>
                {
                    return(new SignatureInformation
                    {
                        Label = parameterSets.CommandName + " " + s.SignatureText,
                        Documentation = null,
                        Parameters =
                            s.Parameters
                            .Select(CreateParameterInfo)
                            .ToArray()
                    });
                })
                    .ToArray();
            }
            else
            {
                signatures = new SignatureInformation[0];
            }

            await requestContext.SendResult(
                new SignatureHelp
            {
                Signatures      = signatures,
                ActiveParameter = activeParameter,
                ActiveSignature = activeSignature
            });
        }
        private static SignatureInformation BuildSignature(IMethodSymbol symbol)
        {
            var parameters = symbol.Parameters
                             .Select(parameter =>
                                     new ParameterInformation(
                                         label: parameter.Name,
                                         documentation: new FormattedValue("text/markdown", DocumentationConverter.ConvertDocumentation(parameter.GetDocumentationCommentXml(expandIncludes: true)))));

            var signatureInformation = new SignatureInformation(
                label: symbol.ToDisplayString(SymbolDisplayFormat.MinimallyQualifiedFormat),
                documentation: new FormattedValue("text/markdown", DocumentationConverter.ConvertDocumentation(symbol.GetDocumentationCommentXml(expandIncludes: true))),
                parameters: parameters.ToList());

            return(signatureInformation);
        }
Пример #8
0
        private SignatureHelpItem CreateSignatureHelpItem(SignatureInformation signatureInformation)
        {
            var signatureText = signatureInformation.Label;
            var emptyText     = ToTaggedText(string.Empty);

            var parameters = signatureInformation.Parameters.Select(parameter =>
            {
                Func <CancellationToken, IEnumerable <TaggedText> > paramDocumentationFactory = (ct) => ToTaggedText(parameter.Documentation?.Value);
                return(new SignatureHelpParameter((string)parameter.Label, false, paramDocumentationFactory, emptyText));
            });

            return(new SignatureHelpItem(false, DocumentationFactory, ToTaggedText(signatureInformation.Label), emptyText, emptyText, parameters, emptyText));

            // local functions
            IEnumerable <TaggedText> DocumentationFactory(CancellationToken ct) => ToTaggedText(signatureInformation.Documentation?.Value);
        }
Пример #9
0
        public async Task <SignatureHelp> Handle(SignatureHelpParams request, CancellationToken cancellationToken)
        {
            if (cancellationToken.IsCancellationRequested)
            {
                _logger.LogDebug("SignatureHelp request canceled for file: {0}", request.TextDocument.Uri);
                return(new SignatureHelp());
            }

            ScriptFile scriptFile = _workspaceService.GetFile(request.TextDocument.Uri);

            ParameterSetSignatures parameterSets =
                await _symbolsService.FindParameterSetsInFileAsync(
                    scriptFile,
                    (int)request.Position.Line + 1,
                    (int)request.Position.Character + 1,
                    _powerShellContextService).ConfigureAwait(false);

            if (parameterSets == null)
            {
                return(new SignatureHelp());
            }

            var signatures = new SignatureInformation[parameterSets.Signatures.Length];

            for (int i = 0; i < signatures.Length; i++)
            {
                var parameters = new List <ParameterInformation>();
                foreach (ParameterInfo param in parameterSets.Signatures[i].Parameters)
                {
                    parameters.Add(CreateParameterInfo(param));
                }

                signatures[i] = new SignatureInformation
                {
                    Label         = parameterSets.CommandName + " " + parameterSets.Signatures[i].SignatureText,
                    Documentation = null,
                    Parameters    = parameters,
                };
            }

            return(new SignatureHelp
            {
                Signatures = signatures,
                ActiveParameter = null,
                ActiveSignature = 0
            });
        }
Пример #10
0
        static SignatureHelp CreateMethodGroupSignatureHelp(
            ExpressionSyntax expression,
            ArgumentListSyntax argumentList,
            int position,
            SemanticModel semanticModel)
        {
            var signatureHelp = new SignatureHelp();

            // Happens for object initializers with no preceding parens, as soon as user types comma
            if (argumentList == null)
            {
                return(signatureHelp);
            }

            int currentArg;

            if (TryGetCurrentArgumentIndex(argumentList, position, out currentArg))
            {
                signatureHelp.ActiveParameter = currentArg;
            }

            var symbolInfo      = semanticModel.GetSymbolInfo(expression);
            var bestGuessMethod = symbolInfo.Symbol as IMethodSymbol;

            var methods = semanticModel
                          .GetMemberGroup(expression)
                          .OfType <IMethodSymbol> ()
                          .ToArray();

            var signatures = new List <SignatureInformation> ();

            for (var i = 0; i < methods.Length; i++)
            {
                if (methods [i] == bestGuessMethod)
                {
                    signatureHelp.ActiveSignature = i;
                }

                var signatureInfo = new SignatureInformation(methods [i]);

                signatures.Add(signatureInfo);
            }

            signatureHelp.Signatures = signatures.ToArray();

            return(signatureHelp);
        }
        public async Task <SignatureHelp> Handle(SignatureHelpParams request, CancellationToken cancellationToken)
        {
            ScriptFile scriptFile =
                _workspaceService.GetFile(
                    request.TextDocument.Uri.ToString());

            ParameterSetSignatures parameterSets =
                await _symbolsService.FindParameterSetsInFileAsync(
                    scriptFile,
                    (int)request.Position.Line + 1,
                    (int)request.Position.Character + 1,
                    _powerShellContextService);

            SignatureInformation[] signatures = s_emptySignatureResult;

            if (parameterSets != null)
            {
                signatures = new SignatureInformation[parameterSets.Signatures.Length];
                for (int i = 0; i < signatures.Length; i++)
                {
                    var parameters = new ParameterInformation[parameterSets.Signatures[i].Parameters.Count()];
                    int j          = 0;
                    foreach (ParameterInfo param in parameterSets.Signatures[i].Parameters)
                    {
                        parameters[j] = CreateParameterInfo(param);
                        j++;
                    }

                    signatures[i] = new SignatureInformation
                    {
                        Label         = parameterSets.CommandName + " " + parameterSets.Signatures[i].SignatureText,
                        Documentation = null,
                        Parameters    = parameters,
                    };
                }
            }

            return(new SignatureHelp
            {
                Signatures = signatures,
                ActiveParameter = null,
                ActiveSignature = 0
            });
        }
Пример #12
0
        private SignatureInformation ToSignatureInformation(IOverloadResult overload)
        {
            var si = new SignatureInformation {
                parameters = overload.Parameters.MaybeEnumerate().Select(p => new ParameterInformation {
                    label         = p.Name,
                    documentation = string.IsNullOrEmpty(p.Documentation) ? null : p.Documentation,
                    _type         = p.Type,
                    _defaultValue = p.DefaultValue
                }).ToArray(),

                _returnTypes = overload.ReturnType.OrderBy(k => k).ToArray()
            };

            if (_clientCaps?.textDocument?.signatureHelp?.signatureInformation?._shortLabel ?? false)
            {
                si.label = overload.Name;
            }
            else
            {
                var doc = overload.Documentation;
                // Some function contain signature in the documentation. Example: print.
                // We want to use that signature in VS Code since it contains all arguments.
                if (si.parameters.Length == 0 && !string.IsNullOrEmpty(doc) && doc.StartsWithOrdinal($"{overload.Name}("))
                {
                    return(GetSignatureFromDoc(doc));
                }
                si.label = "{0}({1})".FormatInvariant(
                    overload.Name,
                    string.Join(", ", overload.Parameters.Select(FormatParameter))
                    );
            }

            si.documentation = string.IsNullOrEmpty(overload.Documentation) ? null : overload.Documentation;
            var formatSetting = _clientCaps?.textDocument?.signatureHelp?.signatureInformation?.documentationFormat;

            si.documentation = GetMarkupContent(si.documentation.value, formatSetting);
            foreach (var p in si.parameters)
            {
                p.documentation = GetMarkupContent(p.documentation.value, formatSetting);
            }

            return(si);
        }
Пример #13
0
        /// <summary>Main method for validating a signature</summary>
        /// <param name="signature"></param>
        /// <param name="referenceTime"></param>
        /// <returns>the report part pertaining to the signature</returns>
        protected internal virtual SignatureInformation ValidateSignature(AdvancedSignature
                                                                          signature, DateTime referenceTime)
        {
            if (signature.GetSigningCertificate() == null)
            {
                LOG.Error("There is no signing certificate");
                return(null);
            }
            QCStatementInformation qcStatementInformation = VerifyQStatement(signature.GetSigningCertificate
                                                                                 ());
            SignatureVerification signatureVerification = new SignatureVerification(new Result
                                                                                        (signature.CheckIntegrity(this.ExternalContent)), signature.GetSignatureAlgorithm
                                                                                        ());

            try
            {
                ValidationContext ctx = CertificateVerifier.ValidateCertificate(signature.GetSigningCertificate
                                                                                    (), referenceTime, signature.GetCertificateSource(), signature.GetCRLSource(), signature
                                                                                .GetOCSPSource());
                TrustedListInformation info = new TrustedListInformation(ctx.GetRelevantServiceInfo
                                                                             ());
                CertPathRevocationAnalysis path             = new CertPathRevocationAnalysis(ctx, info);
                SignatureLevelXL           signatureLevelXL = VerifyLevelXL(signature, referenceTime, ctx);
                SignatureLevelC            signatureLevelC  = VerifyLevelC(signature, referenceTime, ctx, signatureLevelXL
                                                                           != null ? signatureLevelXL.GetLevelReached().IsValid() : false);
                SignatureLevelAnalysis signatureLevelAnalysis = new SignatureLevelAnalysis(signature
                                                                                           , VerifyLevelBES(signature, referenceTime, ctx), VerifyLevelEPES(signature, referenceTime
                                                                                                                                                            , ctx), VerifyLevelT(signature, referenceTime, ctx), signatureLevelC, VerifyLevelX
                                                                                               (signature, referenceTime, ctx), signatureLevelXL, VerifyLevelA(signature, referenceTime
                                                                                                                                                               , ctx), VerifyLevelLTV(signature, referenceTime, ctx));
                QualificationsVerification qualificationsVerification = VerifyQualificationsElement
                                                                            (signature, referenceTime, ctx);
                SignatureInformation signatureInformation = new SignatureInformation(signatureVerification
                                                                                     , path, signatureLevelAnalysis, qualificationsVerification, qcStatementInformation
                                                                                     );
                return(signatureInformation);
            }
            catch (IOException e)
            {
                throw new RuntimeException("Cannot read signature file", e);
            }
        }
Пример #14
0
        /// <summary>
        /// Opens temporary PDF and appends signature and ocsp and crl information (if available)
        /// </summary>
        /// <param name="signatureInformation">Information required for finding the temporary PDF</param>
        public void SignIntermediatePdf(SignatureInformation signatureInformation)
        {
            var document = new PdfDocument(new PdfReader(signatureInformation.PathToIntermediaryPdf));

            using var writer = new FileStream(signatureInformation.pathToSignedPdf, FileMode.Create);


            var crlBytesList  = GetCrlByteList();
            var ocspBytesList = GetOcspBytesList();


            var container = new InjectAmaSignatureContainer(signatureInformation.Signature,
                                                            _userCertificateChain,
                                                            signatureInformation.NakedHashFromIntermediaryPdf,
                                                            crlBytesList,
                                                            ocspBytesList,
                                                            _tsaClient);

            PdfSigner.SignDeferred(document, _signatureFieldname, writer, container);
        }
Пример #15
0
        public void SimpleTest(string expected)
        {
            var model = new SignatureInformation {
                Documentation = "ab",
                Label         = "ab",
                Parameters    = new[] {
                    new ParameterInformation {
                        Documentation = "param",
                        Label         = "param"
                    }
                }
            };
            var result = Fixture.SerializeObject(model);

            result.Should().Be(expected);

            var deresult = new Serializer(ClientVersion.Lsp3).DeserializeObject <SignatureInformation>(expected);

            deresult.Should().BeEquivalentTo(model);
        }
        /// <summary>
        /// To Template signature information.
        /// </summary>
        public static SignatureInformation ToSignatureInformation(this PageInfo pageInfo, PageInfo redirectSource)
        {
            if (pageInfo == null)
            {
                throw new ArgumentNullException(nameof(pageInfo));
            }
            var labelBuilder = new StringBuilder("{{");

            labelBuilder.Append(pageInfo.TransclusionName);
            var sig = new SignatureInformation();

            if (pageInfo.Arguments.Count > 0)
            {
                sig.Parameters = pageInfo.Arguments.Select(a => a.ToParameterInformation(pageInfo.Type))
                                 .ToImmutableArray();
                foreach (var a in pageInfo.Arguments)
                {
                    if (pageInfo.Type == PageType.MagicWord)
                    {
                        labelBuilder.AppendFormat(" |<{0}>", a.Name);
                    }
                    else
                    {
                        labelBuilder.AppendFormat(" |{0}=…", a.Name);
                    }
                }
            }
            labelBuilder.Append("}}");
            sig.Label         = labelBuilder.ToString();
            sig.Documentation = pageInfo.Summary;
            if (redirectSource != null)
            {
                sig.Documentation = string.Format("{0}{1} -> {2}\r\n", Prompts.RedirectColon, redirectSource, pageInfo)
                                    + sig.Documentation;
            }
            return(sig);
        }
        public SignatureHelp OnTextDocumentSignaureHelp(JToken arg)
        {
            Log(Methods.TextDocumentSignatureHelpName, arg);

            var signatures = new List <SignatureInformation>();

            for (int i = 0; i < 2; ++i)
            {
                var signature = new SignatureInformation
                {
                    Documentation = CreateMarkupContent("Signature documentation " + i),
                    Label         = "Signature " + i,
                };

                var parameters = new List <ParameterInformation>();

                for (int j = 0; j < 3; ++j)
                {
                    var parameter = new ParameterInformation
                    {
                        Documentation = CreateMarkupContent("Parameter documentation " + i),
                        Label         = "Parameter " + i
                    };
                    parameters.Add(parameter);
                }

                signature.Parameters = parameters.ToArray();

                signatures.Add(signature);
            }

            return(new SignatureHelp
            {
                Signatures = signatures.ToArray()
            });
        }
        public void MarkupContentTest(string expected)
        {
            var model = new SignatureInformation()
            {
                Documentation = "ab",
                Label         = "ab",
                Parameters    = new[] { new ParameterInformation()
                                        {
                                            Documentation = new MarkupContent()
                                            {
                                                Kind  = MarkupKind.Markdown,
                                                Value = "### Value"
                                            },
                                            Label = "param"
                                        } }
            };
            var result = Fixture.SerializeObject(model);

            result.Should().Be(expected);

            var deresult = new Serializer(ClientVersion.Lsp3).DeserializeObject <SignatureInformation>(expected);

            deresult.ShouldBeEquivalentTo(model);
        }
Пример #19
0
 public void GeneratesKey()
 {
     _signatureInfo = Generator.Generate();
 }
Пример #20
0
        internal IntellisenseResult(IIntellisenseData data, List <IntellisenseSuggestion> suggestions, Exception exception = null)
        {
            Contracts.AssertValue(suggestions);

            _script = data.Script;
            Contracts.CheckValue(_script, "script");
            ReplacementStartIndex = data.ReplacementStartIndex;
            Contracts.CheckParam(0 <= data.ReplacementStartIndex, "replacementStartIndex");

            ReplacementLength = data.ReplacementLength;
            Contracts.CheckParam(0 <= data.ReplacementLength, "replacementLength");

            var argIndex = data.ArgIndex;
            var argCount = data.ArgCount;

            Contracts.CheckParam(0 <= argIndex, "argIndex");
            Contracts.CheckParam(0 <= argCount, "argCount");
            Contracts.Check(argIndex <= argCount, "argIndex out of bounds.");

            var func = data.CurFunc;

            Contracts.CheckValueOrNull(func);

            _suggestions        = suggestions;
            _functionSignatures = new List <SignatureInformation>();
            _functionOverloads  = new List <IntellisenseSuggestion>();

            CurrentFunctionOverloadIndex = -1;
            _currentArgumentIndex        = argIndex;
            Exception = exception;

            if (func == null)
            {
                IsFunctionScope = false;
            }
            else
            {
                IsFunctionScope = true;
                int highlightStart      = -1;
                int highlightEnd        = -1;
                int minMatchingArgCount = int.MaxValue;
                foreach (var signature in func.GetSignatures(argCount))
                {
                    int           signatureIndex    = 0;
                    string        argumentSeparator = string.Empty;
                    string        highlightedFuncParamDescription = string.Empty;
                    string        listSep           = TexlLexer.LocalizedInstance.LocalizedPunctuatorListSeparator + " ";
                    StringBuilder funcDisplayString = new StringBuilder(func.Name);
                    funcDisplayString.Append('(');

                    var parameters = new List <ParameterInformation>();
                    while (signatureIndex < signature.Count())
                    {
                        Contracts.AssertValue(signature[signatureIndex]);
                        funcDisplayString.Append(argumentSeparator);

                        // We need to change the highlight information if the argument should be highlighted, but
                        // otherwise we still want to collect parameter information
                        var unalteredParamName = signature[signatureIndex]();
                        var invariantParamName = signature[signatureIndex]("en-US");
                        (var paramName, var parameterHighlightStart, var parameterHighlightEnd, var funcParamDescription) = GetParameterHighlightAndDescription(data, unalteredParamName, invariantParamName, funcDisplayString);
                        parameters.Add(new ParameterInformation()
                        {
                            Documentation = funcParamDescription,
                            Label         = paramName
                        });

                        if (ArgNeedsHighlight(func, argCount, argIndex, signature.Count(), signatureIndex))
                        {
                            (highlightStart, highlightEnd, highlightedFuncParamDescription) = (parameterHighlightStart, parameterHighlightEnd, funcParamDescription);
                        }

                        // For variadic function, we want to generate FuncName(arg1,arg1,...,arg1,...) as description.
                        if (func.SignatureConstraint != null && argCount > func.SignatureConstraint.RepeatTopLength && canParamOmit(func, argCount, argIndex, signature.Count(), signatureIndex))
                        {
                            funcDisplayString.Append("...");
                            signatureIndex += func.SignatureConstraint.RepeatSpan;
                        }
                        else
                        {
                            funcDisplayString.Append(signature[signatureIndex]());
                            signatureIndex++;
                        }
                        argumentSeparator = listSep;
                    }

                    if (func.MaxArity > func.MinArity && func.MaxArity > argCount)
                    {
                        funcDisplayString.Append(argumentSeparator + "...");
                    }

                    funcDisplayString.Append(')');
                    var signatureInformation = new SignatureInformation()
                    {
                        Documentation = func.Description,
                        Label         = CreateFunctionSignature(func.Name, parameters),
                        Parameters    = parameters.ToArray()
                    };
                    _functionSignatures.Add(signatureInformation);
                    _functionOverloads.Add(new IntellisenseSuggestion(new UIString(funcDisplayString.ToString(), highlightStart, highlightEnd), SuggestionKind.Function, SuggestionIconKind.Function, func.ReturnType, signatureIndex, func.Description, func.Name, highlightedFuncParamDescription));

                    if ((signatureIndex >= argCount || (func.SignatureConstraint != null && argCount > func.SignatureConstraint.RepeatTopLength)) && minMatchingArgCount > signatureIndex)
                    {
                        // _functionOverloads has at least one item at this point.
                        CurrentFunctionOverloadIndex = _functionOverloads.Count - 1;
                        minMatchingArgCount          = signatureIndex;
                    }
                }

                // Handling of case where the function does not take any arguments.
                if (_functionOverloads.Count == 0 && func.MinArity == 0)
                {
                    var signatureInformation = new SignatureInformation()
                    {
                        Documentation = func.Description,
                        Label         = CreateFunctionSignature(func.Name),
                        Parameters    = new ParameterInformation[0]
                    };
                    _functionSignatures.Add(signatureInformation);
                    _functionOverloads.Add(new IntellisenseSuggestion(new UIString(func.Name + "()", 0, func.Name.Length + 1), SuggestionKind.Function, SuggestionIconKind.Function, func.ReturnType, string.Empty, 0, func.Description, func.Name));
                    CurrentFunctionOverloadIndex = 0;
                }
            }

            Contracts.Assert(_functionSignatures.Count == _functionOverloads.Count);
        }
 public static SignatureInformationAssertions Should(this SignatureInformation signatureInformation)
 => new SignatureInformationAssertions(signatureInformation);
Пример #22
0
        public override Task <SignatureHelp> Handle(SignatureHelpParams request, CancellationToken cancellationToken)
        {
            var currentHash = Hash.StringHash(request.TextDocument.Uri.GetFileSystemPath());

            var pos = request.Position;

            TreeSitter.GetSignature(currentHash, pos.Line, pos.Character, out var signatureArrayPtr, out var parameterCount, out var activeParameter, out var errorCount, out var errorRanges);

            if (signatureArrayPtr.ToInt64() == 0)
            {
                return(Task.FromResult(new SignatureHelp()));
            }

            var signaturePtr = System.Runtime.InteropServices.Marshal.ReadIntPtr(signatureArrayPtr);
            var signature    = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(signaturePtr);


            SignatureInformation info = new SignatureInformation();

            info.Label = signature;


            var paramList = new List <ParameterInformation>();

            if (parameterCount > 0)
            {
                for (int i = 0; i < parameterCount; i++)
                {
                    var paramInfo = new ParameterInformation();
                    var paramPtr  = System.Runtime.InteropServices.Marshal.ReadIntPtr(signatureArrayPtr + 8 * (i + 1));;
                    paramInfo.Label = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(paramPtr);
                    paramList.Add(paramInfo);
                }
            }

            info.Parameters = new Container <ParameterInformation>(paramList);


            SignatureHelp help = new SignatureHelp();

            help.Signatures      = new Container <SignatureInformation>(info);
            help.ActiveParameter = activeParameter;
            help.ActiveSignature = 0;


            if (errorCount > 0)
            {
                List <Diagnostic>        diagnostics       = new List <Diagnostic>();
                PublishDiagnosticsParams diagnosticsParams = new PublishDiagnosticsParams();
                diagnosticsParams.Uri = request.TextDocument.Uri;
                unsafe
                {
                    for (int i = 0; i < errorCount; i++)
                    {
                        Range *    errors     = (Range *)errorRanges;
                        var        error      = errors[i];
                        Diagnostic diagnostic = new Diagnostic();
                        diagnostic.Message = "Extra argument";
                        diagnostic.Range   = new OmniSharp.Extensions.LanguageServer.Protocol.Models.Range(
                            new Position(error.startLine, error.startCol),
                            new Position(error.endLine, error.endCol));
                        diagnostics.Add(diagnostic);
                    }
                }

                diagnoser.Add(request.TextDocument.Uri, 1, diagnostics);
            }
            else
            {
                diagnoser.Add(request.TextDocument.Uri, 1, new List <Diagnostic>());
            }

            return(Task.FromResult(help));
        }
Пример #23
0
        static SignatureHelp CreateMethodGroupSignatureHelp(
            ExpressionSyntax expression,
            ArgumentListSyntax argumentList,
            int position,
            SemanticModel semanticModel)
        {
            var signatureHelp = new SignatureHelp();

            // Happens for object initializers with no preceding parens, as soon as user types comma
            if (argumentList == null)
            {
                return(signatureHelp);
            }

            int currentArg;

            if (TryGetCurrentArgumentIndex(argumentList, position, out currentArg))
            {
                signatureHelp.ActiveParameter = currentArg;
            }

            var symbolInfo      = semanticModel.GetSymbolInfo(expression);
            var bestGuessMethod = symbolInfo.Symbol as IMethodSymbol;

            // Include everything by default (global eval context)
            var includeInstance = true;
            var includeStatic   = true;

            ITypeSymbol throughType = null;

            // When accessing method via some member, only show static methods in static context and vice versa for instance methods.
            // This block based on https://github.com/dotnet/roslyn/blob/3b6536f4a616e5f3b8ede940c63663a828e68b5d/src/Features/CSharp/Portable/SignatureHelp/InvocationExpressionSignatureHelpProvider_MethodGroup.cs#L44-L50
            if (expression is MemberAccessExpressionSyntax memberAccessExpression)
            {
                var throughExpression = (memberAccessExpression).Expression;
                if (!(throughExpression is BaseExpressionSyntax))
                {
                    throughType = semanticModel.GetTypeInfo(throughExpression).Type;
                }
                var throughSymbolInfo = semanticModel.GetSymbolInfo(throughExpression);
                var throughSymbol     = throughSymbolInfo.Symbol ?? throughSymbolInfo.CandidateSymbols.FirstOrDefault();

                includeInstance = !throughExpression.IsKind(SyntaxKind.IdentifierName) ||
                                  semanticModel.LookupSymbols(throughExpression.SpanStart, name: throughSymbol.Name).Any(s => !(s is INamedTypeSymbol)) ||
                                  (!(throughSymbol is INamespaceOrTypeSymbol) && semanticModel.LookupSymbols(throughExpression.SpanStart, throughSymbol.ContainingType).Any(s => !(s is INamedTypeSymbol)));
                includeStatic = throughSymbol is INamedTypeSymbol ||
                                (throughExpression.IsKind(SyntaxKind.IdentifierName) &&
                                 semanticModel.LookupNamespacesAndTypes(throughExpression.SpanStart, name: throughSymbol.Name).Any(t => t.GetSymbolType() == throughType));
            }

            // TODO: Start taking CT in here? Most calls in this method have optional CT arg. Could make this async.
            var within = semanticModel.GetEnclosingNamedTypeOrAssembly(position, CancellationToken.None);

            var methods = semanticModel
                          .GetMemberGroup(expression)
                          .OfType <IMethodSymbol> ()
                          .Where(m => (m.IsStatic && includeStatic) || (!m.IsStatic && includeInstance))
                          .Where(m => m.IsAccessibleWithin(within, throughTypeOpt: throughType))
                          .ToArray();

            var signatures = new List <SignatureInformation> ();

            for (var i = 0; i < methods.Length; i++)
            {
                if (methods [i] == bestGuessMethod)
                {
                    signatureHelp.ActiveSignature = i;
                }

                var signatureInfo = new SignatureInformation(methods [i]);

                signatures.Add(signatureInfo);
            }

            signatureHelp.Signatures = signatures.ToArray();

            return(signatureHelp);
        }
Пример #24
0
 /// <summary>
 ///     Checks if cert is from a trusted CA with a valid certificate chain.
 /// </summary>
 /// <param name="online">Check certificate chain online or off-line.</param>
 /// <returns>True of cert chain is valid and from a trusted CA.</returns>
 public bool IsValidCertChain(bool online)
 {
     return(IsSigned && SignatureInformation.IsValidCertChain(PKCS7, online));
 }
Пример #25
0
        /// <summary>
        /// Returns the signature help information for a call expression if there is such an expression at the specified position.
        /// Returns null if some parameters are unspecified (null),
        /// or if the specified position is not a valid position within the currently processed file content,
        /// or if no call expression exists at the specified position at this time,
        /// or if no signature help information can be provided for the call expression at the specified position.
        /// </summary>
        public static SignatureHelp?SignatureHelp(
            this FileContentManager file,
            CompilationUnit compilation,
            Position?position,
            MarkupKind format = MarkupKind.PlainText)
        {
            // getting the relevant token (if any)

            var fragment = file?.TryGetFragmentAt(position, out var _, includeEnd: true);

            if (file is null || position is null || fragment?.Kind == null || compilation == null)
            {
                return(null);
            }
            var fragmentStart = fragment.Range.Start;

            // getting the overlapping call expressions (if any), and determine the header of the called callable

            bool OverlapsWithPosition(Range symRange) => (fragmentStart + symRange).ContainsEnd(position);

            var overlappingEx = fragment.Kind.CallExpressions().Where(ex => ex.Range.IsValue && OverlapsWithPosition(ex.Range.Item)).ToList();

            if (!overlappingEx.Any())
            {
                return(null);
            }
            overlappingEx.Sort((ex1, ex2) => // for nested call expressions, the last expressions (by range) is always the closest one
            {
                var(x, y)  = (ex1.Range.Item, ex2.Range.Item);
                int result = x.Start.CompareTo(y.Start);
                return(result == 0 ? x.End.CompareTo(y.End) : result);
            });

            var nsName = file.TryGetNamespaceAt(position);

            var(method, args) = overlappingEx.Last().Expression is QsExpressionKind <QsExpression, QsSymbol, QsType> .CallLikeExpression c ? (c.Item1, c.Item2) : (null, null);
            if (nsName == null || method == null || args == null)
            {
                return(null);
            }

            // getting the called identifier as well as what functors have been applied to it

            List <QsFunctor> FunctorApplications(ref QsExpression ex)
            {
                var(next, inner) =
                    ex.Expression is QsExpressionKind <QsExpression, QsSymbol, QsType> .AdjointApplication adj ? (QsFunctor.Adjoint, adj.Item) :
                    ex.Expression is QsExpressionKind <QsExpression, QsSymbol, QsType> .ControlledApplication ctl ? (QsFunctor.Controlled, ctl.Item) :
                    (null, null);
                var fs = inner == null ? new List <QsFunctor>() : FunctorApplications(ref inner);

                if (next != null)
                {
                    fs.Add(next);
                }
                ex = inner ?? ex;
                return(fs);
            }

            var functors = FunctorApplications(ref method);
            var id       = method.Expression as QsExpressionKind <QsExpression, QsSymbol, QsType> .Identifier;

            if (id == null)
            {
                return(null);
            }

            // extracting and adapting the relevant information for the called callable

            ResolutionResult <CallableDeclarationHeader> .Found?methodDecl = null;
            if (id.Item1.Symbol is QsSymbolKind <QsSymbol> .Symbol sym)
            {
                methodDecl =
                    compilation.GlobalSymbols.TryResolveAndGetCallable(
                        sym.Item,
                        nsName,
                        file.FileName)
                    as ResolutionResult <CallableDeclarationHeader> .Found;
            }
            else if (id.Item1.Symbol is QsSymbolKind <QsSymbol> .QualifiedSymbol qualSym)
            {
                methodDecl =
                    compilation.GlobalSymbols.TryGetCallable(
                        new QsQualifiedName(qualSym.Item1, qualSym.Item2),
                        nsName,
                        file.FileName)
                    as ResolutionResult <CallableDeclarationHeader> .Found;
            }

            if (methodDecl == null)
            {
                return(null);
            }

            var(documentation, argTuple) = (methodDecl.Item.Documentation, methodDecl.Item.ArgumentTuple);
            var nrCtlApplications = functors.Where(f => f.Equals(QsFunctor.Controlled)).Count();

            while (nrCtlApplications-- > 0)
            {
                var ctlQsName = QsLocalSymbol.NewValidName(nrCtlApplications == 0 ? "cs" : $"cs{nrCtlApplications}");
                argTuple = SyntaxGenerator.WithControlQubits(argTuple, QsNullable <Position> .Null, ctlQsName, QsNullable <Range> .Null);
            }

            // now that we now what callable is called we need to check which argument should come next

            bool BeforePosition(Range symRange) => fragmentStart + symRange.End < position;

            IEnumerable <(Range?, string?)> ExtractParameterRanges(
                QsExpression?ex, QsTuple <LocalVariableDeclaration <QsLocalSymbol> > decl)
            {
                var @null = ((Range?)null, (string?)null);

                IEnumerable <(Range?, string?)> SingleItem(string paramName)
                {
                    var arg = ex?.Range == null ? ((Range?)null, paramName)
                        : ex.Range.IsValue ? (ex.Range.Item, paramName)
                        : @null; // no signature help if there are invalid expressions

                    return(new[] { arg });
                }

                if (decl is QsTuple <LocalVariableDeclaration <QsLocalSymbol> > .QsTupleItem dItem)
                {
                    return(SingleItem(dItem.Item.VariableName is QsLocalSymbol.ValidName n ? n.Item : "__argName__"));
                }

                var declItems = decl as QsTuple <LocalVariableDeclaration <QsLocalSymbol> > .QsTuple;
                var exItems   = ex?.Expression as QsExpressionKind <QsExpression, QsSymbol, QsType> .ValueTuple;

                if (declItems == null)
                {
                    return(new[] { @null });
                }
                if (exItems == null && declItems.Item.Length > 1)
                {
                    return(SingleItem(decl.PrintArgumentTuple()));
                }

                var argItems = exItems != null
                    ? exItems.Item.ToImmutableArray <QsExpression?>()
                    : ex == null
                    ? ImmutableArray <QsExpression?> .Empty
                    : ImmutableArray.Create <QsExpression?>(ex);

                return(argItems.AddRange(Enumerable.Repeat <QsExpression?>(null, declItems.Item.Length - argItems.Length))
                       .Zip(declItems.Item, (e, d) => (e, d))
                       .SelectMany(arg => ExtractParameterRanges(arg.Item1, arg.Item2)));
            }

            var callArgs = ExtractParameterRanges(args, argTuple).ToArray();

            if (id == null || callArgs == null || callArgs.Any(item => item.Item2 == null))
            {
                return(null); // no signature help if there are invalid expressions
            }

            // finally we can build the signature help information

            MarkupContent AsMarkupContent(string str) => new MarkupContent
            {
                Kind = format, Value = str
            };
            ParameterInformation AsParameterInfo(string?paramName) => new ParameterInformation
            {
                Label         = paramName,
                Documentation = AsMarkupContent(documentation.ParameterDescription(paramName))
            };

            var signatureLabel = $"{methodDecl.Item.QualifiedName.Name} {argTuple.PrintArgumentTuple()}";

            foreach (var f in functors)
            {
                if (f.IsAdjoint)
                {
                    signatureLabel = $"{Keywords.qsAdjointFunctor.id} {signatureLabel}";
                }
                if (f.IsControlled)
                {
                    signatureLabel = $"{Keywords.qsControlledFunctor.id} {signatureLabel}";
                }
            }

            var doc  = documentation.PrintSummary(format == MarkupKind.Markdown).Trim();
            var info = new SignatureInformation
            {
                Documentation = AsMarkupContent(doc),
                Label         = signatureLabel, // Note: the label needs to be expressed in a way that the active parameter is detectable
                Parameters    = callArgs.Select(d => d.Item2).Select(AsParameterInfo).ToArray()
            };
            var precedingArgs = callArgs
                                .TakeWhile(item => item.Item1 == null || BeforePosition(item.Item1)) // skip args that have already been typed or - in the case of inner items - are missing
                                .Reverse().SkipWhile(item => item.Item1 == null);                    // don't count missing, i.e. not yet typed items, of the relevant inner argument tuple

            return(new SignatureHelp
            {
                Signatures = new[] { info }, // since we don't support overloading there is just one signature here
                ActiveSignature = 0,
                ActiveParameter = precedingArgs.Count()
            });
        }
        public SignatureHelp GetSignature(IDocumentAnalysis analysis, SourceLocation location)
        {
            if (analysis is EmptyAnalysis)
            {
                return(null);
            }

            ExpressionLocator.FindExpression(analysis.Ast, location,
                                             FindExpressionOptions.Hover, out var node, out var statement, out var scope);

            IMember     value    = null;
            IPythonType selfType = null;
            string      name     = null;
            var         call     = node as CallExpression;

            if (call != null)
            {
                using (analysis.ExpressionEvaluator.OpenScope(analysis.Document, scope)) {
                    switch (call.Target)
                    {
                    case MemberExpression mex:
                        var v = analysis.ExpressionEvaluator.GetValueFromExpression(mex.Target);
                        selfType = v?.GetPythonType();
                        name     = mex.Name;
                        break;

                    case NameExpression ne:
                        name = ne.Name;
                        break;
                    }

                    value = analysis.ExpressionEvaluator.GetValueFromExpression(call.Target);
                }
            }

            var ft = value.TryGetFunctionType();

            if (ft == null)
            {
                return(null);
            }

            var signatures = new SignatureInformation[ft.Overloads.Count];

            for (var i = 0; i < ft.Overloads.Count; i++)
            {
                var o = ft.Overloads[i];

                var signatureLabel = _docSource.GetSignatureString(ft, selfType, out var parameterSpans, i, name);

                var parameterInfo = new ParameterInformation[parameterSpans.Length];
                for (var j = 0; j < parameterSpans.Length; j++)
                {
                    var(ps, p) = parameterSpans[j];

                    parameterInfo[j] = new ParameterInformation {
                        label         = _labelOffsetSupport ? new[] { ps.Start, ps.End } : (object)p.Name,
                        documentation = _docSource.FormatParameterDocumentation(p)
                    };
                }

                signatures[i] = new SignatureInformation {
                    label         = signatureLabel,
                    documentation = _docSource.FormatDocumentation(ft.Documentation),
                    parameters    = parameterInfo
                };
            }

            var index = location.ToIndex(analysis.Ast);

            if (call.GetArgumentAtIndex(analysis.Ast, index, out var activeParameter) && activeParameter < 0)
            {
                // Returned 'true' and activeParameter == -1 means that we are after
                // the trailing comma, so assume partially typed expression such as 'pow(x, y, |)
                activeParameter = call.Args.Count;
            }

            var activeSignature = -1;

            if (activeParameter >= 0)
            {
                // TODO: Better selection of active signature by argument set
                activeSignature = signatures
                                  .Select((s, i) => Tuple.Create(s, i))
                                  .OrderBy(t => t.Item1.parameters.Length)
                                  .FirstOrDefault(t => t.Item1.parameters.Length > activeParameter)
                                  ?.Item2 ?? -1;
            }

            activeSignature = activeSignature >= 0
                ? activeSignature
                : (signatures.Length > 0 ? 0 : -1);

            return(new SignatureHelp {
                signatures = signatures.ToArray(),
                activeSignature = activeSignature,
                activeParameter = activeParameter
            });
        }
Пример #27
0
        static void Main(string[] args)
        {
            string pathToSign      = Path.Combine("Resources", "test.pdf");
            string pathCertificate = Path.Combine("Resources", "test.p12");
            string pathSigned      = "test.pdf.p7m";

            Document             toBeSigned = new FileDocument(pathToSign);
            Pkcs12SignatureToken token      = new Pkcs12SignatureToken("password", pathCertificate);
            IDssPrivateKeyEntry  privateKey = token.GetKeys()[0];

            SignatureParameters parameters = new SignatureParameters();

            parameters.SignaturePackaging = SignaturePackaging.ENVELOPING;
            parameters.SigningCertificate = privateKey.GetCertificate();
            parameters.CertificateChain   = privateKey.GetCertificateChain();
            parameters.SigningDate        = DateTime.Now;
            parameters.DigestAlgorithm    = DigestAlgorithm.SHA256;

            CAdESService service = new CAdESService();

            parameters.SignatureFormat = EU.Europa.EC.Markt.Dss.Signature.SignatureFormat.CAdES_BES;

            /* CERTIFIED TIMESTAMP
             * var ocspSource1 = new OnlineOcspSource();
             * var crlSource1 = new FileCacheCrlSource();
             * var crlOnline1 = new OnlineCrlSource();
             * crlOnline1.IntermediateAcUrl = @"http://www.eci.bce.ec/CRL/cacrl.crl";
             * crlSource1.CachedSource = crlOnline1;
             * var verifier1 = new OCSPAndCRLCertificateVerifier(crlSource1, ocspSource1);
             * var estado = verifier1.Check(privateKey.GetCertificate(), privateKey.GetCertificateChain()[1], DateTime.Now);
             */

            /*
             * //parameters.SignatureFormat = SignatureFormat.CAdES_T; //Se añade TSA.
             * parameters.SignatureFormat = EU.Europa.EC.Markt.Dss.Signature.SignatureFormat.CAdES_C; //Se añade CRL y OCSP.
             * //parameters.SignatureFormat = SignatureFormat.CAdES_X; //No se añade nada más al código.
             * //parameters.SignatureFormat = EU.Europa.EC.Markt.Dss.Signature.SignatureFormat.CAdES_XL; //No se añade nada más al código.
             *
             * string urlTss = @"http://tsp.iaik.tugraz.at/tsp/TspRequest";
             * string username = "";
             * string password = "";
             *
             *
             * OnlineTspSource tspSource = new OnlineTspSource(urlTss, username, password);
             * service.TspSource = tspSource;
             *
             * OnlineOcspSource ocspSource = new OnlineOcspSource();
             * TrustedListCertificateVerifier verifier = new TrustedListCertificateVerifier();
             * FileCacheCrlSource crlSource = new FileCacheCrlSource();
             * OnlineCrlSource crlOnline = new OnlineCrlSource();
             * crlOnline.IntermediateAcUrl = @"http://www.eci.bce.ec/CRL/cacrl.crl";
             * //@"http://www.eci.bce.ec/CRL/pruebas/cacrl.crl"
             *
             * crlSource.CachedSource = crlOnline;
             * verifier.CrlSource = crlSource;
             * verifier.OcspSource = ocspSource;
             *
             * ValidationContext validationContext = verifier.ValidateCertificate(parameters.SigningCertificate, DateTime.Now,
             *  new EU.Europa.EC.Markt.Dss.Validation.Certificate.CompositeCertificateSource(
             *      new EU.Europa.EC.Markt.Dss.Validation.Certificate.ListCertificateSource(parameters.CertificateChain)), null, null);
             *
             * service.Verifier = verifier;
             */

            /* DOUBLE-SIGN
             * Document contentInCMS = null;
             *
             * try
             * {
             *  CmsSignedData cmsData = new CmsSignedData(toBeSigned.OpenStream());
             *  if (cmsData != null && cmsData.SignedContent != null
             *      && cmsData.SignedContent.GetContent() != null)
             *  {
             *      Stream buf = new MemoryStream();
             *      cmsData.SignedContent.Write(buf);
             *      buf.Seek(0, SeekOrigin.Begin);
             *      contentInCMS = new InMemoryDocument(Streams.ReadAll(buf));
             *  }
             * }
             * catch (CmsException)
             * {
             * }
             *
             * Stream iStream = service.ToBeSigned(contentInCMS ?? toBeSigned, parameters);
             * byte[] signatureValue = token.Sign(iStream, parameters.DigestAlgorithm, privateKey);
             *
             * // We invoke the service to sign the document with the signature value obtained in the previous step.
             * Document signedDocument = contentInCMS != null
             *  ? service.AddASignatureToDocument(toBeSigned, parameters, signatureValue)
             *  : service.SignDocument(toBeSigned, parameters, signatureValue);
             *
             * FileStream fs = new FileStream(pathParaFirmado, FileMode.OpenOrCreate);
             * Streams.PipeAll(signedDocument.OpenStream(), fs);
             * fs.Close();
             * return;
             */

            Document signedDocument = service.SignDocument(toBeSigned, parameters,
                                                           (hashbytes) => privateKey.Encrypt(hashbytes));

            FileStream fs = new FileStream(pathSigned, FileMode.OpenOrCreate);

            Streams.PipeAll(signedDocument.OpenStream(), fs);
            fs.Close();

            return;

            // Already signed document
            Document document = new FileDocument(pathSigned);

            SignedDocumentValidator validator;

            validator = SignedDocumentValidator.FromDocument(document);
            //validator.CertificateVerifier = verifier;
            validator.ExternalContent = document;

            ValidationReport     report = validator.ValidateDocument();
            SignatureInformation info   = report.SignatureInformationList[0];

            Console.WriteLine("--> Final_Conclusion: ");
            Console.WriteLine(info.FinalConclusion); // --> AdES
            Console.ReadKey();
        }
Пример #28
0
        public void SetDigSignature(PeFile peFile)
        {
            // Clear all fields.
            cbCertIsSigned.IsChecked     = false;
            cbCertIsValid.IsChecked      = false;
            cbCertIsValidChain.IsChecked = false;
            tbCertLength.Text            = string.Empty;
            tbCertRevision.Text          = string.Empty;
            tbCertType.Text = string.Empty;

            cbX509Archived.IsChecked      = false;
            cbX509HasPrivateKey.IsChecked = false;
            tbX509FriendlyName.Text       = string.Empty;
            tbX509Issuer.Text             = string.Empty;
            tbX509Thumbprint.Text         = string.Empty;
            tbX509Version.Text            = string.Empty;
            tbX509NotAfter.Text           = string.Empty;
            tbX509NotBefore.Text          = string.Empty;
            tbX509SerialNumber.Text       = string.Empty;
            tbX509SignatureAlgorithm.Text = string.Empty;
            tbX509Subject.Text            = string.Empty;
            tbX509PrivateKey.Text         = string.Empty;
            tbX509PublicKey.Text          = string.Empty;
            tbX509Extensions.Text         = string.Empty;
            tbX509CrlUrls.Text            = string.Empty;

            if (!peFile.IsSigned)
            {
                return;
            }

            cbCertIsValid.IsChecked      = SignatureInformation.IsSignatureValid(peFile.FileLocation);
            cbCertIsSigned.IsChecked     = peFile.IsSigned;
            cbCertIsValidChain.IsChecked = peFile.IsValidCertChain(true);
            tbCertLength.Text            = peFile.WinCertificate.dwLength.ToHexString();
            tbCertRevision.Text          = peFile.WinCertificate.wRevision.ToHexString();
            tbCertType.Text = peFile.WinCertificate.wCertificateType.ToHexString();

            cbX509Archived.IsChecked      = peFile.PKCS7.Archived;
            cbX509HasPrivateKey.IsChecked = peFile.PKCS7.HasPrivateKey;
            tbX509FriendlyName.Text       = peFile.PKCS7.FriendlyName;
            tbX509Issuer.Text             = peFile.PKCS7.Issuer.Replace(", ", "\n");
            tbX509Thumbprint.Text         = peFile.PKCS7.Thumbprint;
            tbX509Version.Text            = peFile.PKCS7.Version.ToString();
            tbX509NotBefore.Text          = peFile.PKCS7.NotBefore.ToLongDateString();
            tbX509NotAfter.Text           = peFile.PKCS7.NotAfter.ToLongDateString();
            tbX509SerialNumber.Text       = peFile.PKCS7.SerialNumber;
            tbX509SignatureAlgorithm.Text = peFile.PKCS7.SignatureAlgorithm.FriendlyName;
            tbX509Subject.Text            = peFile.PKCS7.Subject.Replace(", ", "\n");
            tbX509PublicKey.Text          = peFile.PKCS7.PublicKey.EncodedKeyValue.Format(true);
            tbX509PrivateKey.Text         = peFile.PKCS7.PrivateKey?.ToXmlString(false);

            foreach (var x509Extension in peFile.PKCS7.Extensions)
            {
                tbX509Extensions.Text += $"{x509Extension.Format(true)}\n";
            }

            foreach (var url in peFile.GetCrlUrlList().Urls)
            {
                tbX509CrlUrls.Text += $"{url}\n";
            }
        }
Пример #29
0
    public async Task <SignatureHelp> Handle(SignatureHelpParams request, CancellationToken cancellationToken)
    {
        var documentPath = DocumentUri.GetFileSystemPath(request.TextDocument.Uri);

        if (string.IsNullOrEmpty(documentPath))
        {
            return(new SignatureHelp());
        }
        var(rootScope, tc) = buffers.GetScope(documentPath);
        if (rootScope == null)
        {
            return(new SignatureHelp());
        }

        var scope = GetCurrentScope(rootScope, (int)request.Position.Character, (int)request.Position.Line, documentPath);

        var text    = buffers.GetBuffer(documentPath);
        var charIdx = (int)request.Position.Character;
        var lineIdx = (int)request.Position.Line;
        var lines   = text.Split(System.Environment.NewLine);
        var line    = default(string);

        if (lineIdx >= 0 && lineIdx < lines.Length)
        {
            line = lines[lineIdx];
        }
        if (line == null)
        {
            return(new SignatureHelp());
        }

        charIdx = System.Math.Clamp(charIdx, 0, line.Length - 1);
        int activeParam = 0;

        while (charIdx >= 0 && line[charIdx] != '(')
        {
            if (line[charIdx] == ',')
            {
                activeParam++;
            }
            charIdx--;
        }
        if (charIdx >= 0 && charIdx < line.Length)
        {
            if (line[charIdx] == '(')
            {
                charIdx--;
            }
        }
        List <string> query = new List <string>();

        while (true)
        {
            var current = "";
            while (charIdx >= 0 && Token.isIdentifierChar(line[charIdx]))
            {
                current = line[charIdx] + current;
                charIdx--;
            }
            if (string.IsNullOrWhiteSpace(current))
            {
                break;
            }
            else
            {
                query.Add(current);
            }
            while (charIdx >= 0 && char.IsWhiteSpace(line[charIdx]))
            {
                charIdx--;
            }
            if (charIdx <= 0 || line[charIdx] != '.')
            {
                break;
            }
            charIdx--;
        }
        List <string> modPath = new List <string>();

        if (line.ElementAtOrDefault(charIdx) == ':' && line.ElementAtOrDefault(charIdx - 1) == ':')
        {
            charIdx -= 2;

            while (true)
            {
                var current = "";
                while (charIdx >= 0 && Token.isIdentifierChar(line[charIdx]))
                {
                    current = line[charIdx] + current;
                    charIdx--;
                }
                if (string.IsNullOrWhiteSpace(current))
                {
                    break;
                }
                else
                {
                    modPath.Add(current);
                }
                while (charIdx >= 0 && char.IsWhiteSpace(line[charIdx]))
                {
                    charIdx--;
                }
                if (charIdx <= 1 || line[charIdx] != ':' || line[charIdx - 1] != ':')
                {
                    break;
                }
                charIdx -= 2;
            }
        }

        if (query.Count > 0)
        {
            Scope.OverloadedVariableDefinition vd = null;
            FrontendStructType st = null;
            for (int i = query.Count - 1; i >= 0; --i)
            {
                var          current = query[i];
                FrontendType vt;
                if (i == query.Count - 1)
                {
                    if (modPath.Count > 0)
                    {
                        scope = scope.GetModule(modPath)?.scope;
                        if (scope == null)
                        {
                            break;
                        }
                    }
                    if (i == 0)
                    {
                        vd = scope.GetVar(current, Token.Undefined);
                    }
                    else
                    {
                        var v = scope.GetVar(current, Token.Undefined)?.First;
                        if (v == null)
                        {
                            st = null;
                            break;
                        }
                        if (v.node == null)
                        {
                            vt = v.type;
                        }
                        else
                        {
                            vt = tc.GetNodeType(v.node);
                        }
                        st = vt as FrontendStructType;
                        if (st == null && vt is FrontendPointerType pt)
                        {
                            st = pt.elementType as FrontendStructType;
                        }
                        if (st == null)
                        {
                            break;
                        }
                    }
                }
                else
                {
                    if (i == 0)
                    {
                        vd = scope.GetVar(current, Token.Undefined);
                    }
                    else
                    {
                        var f = st.fields.Where(f => f.name == current).FirstOrDefault();
                        if (f == null)
                        {
                            st = null;
                            break;
                        }
                        vt = f.type;
                        st = vt as FrontendStructType;
                        if (st == null && vt is FrontendPointerType pt)
                        {
                            st = pt.elementType as FrontendStructType;
                        }
                        if (st == null)
                        {
                            break;
                        }
                    }
                }
            }
            if (vd != null)
            {
                var infos = new List <SignatureInformation>();
                foreach (var v in vd.variables)
                {
                    FrontendFunctionType ft;
                    if (v.node == null)
                    {
                        ft = v.type as FrontendFunctionType;
                    }
                    else
                    {
                        ft = tc.GetNodeType(v.node) as FrontendFunctionType;
                    }
                    if (ft != null)
                    {
                        var info        = new SignatureInformation();
                        var parameInfos = new List <ParameterInformation>();
                        var funName     = ft.funName;
                        if (string.IsNullOrEmpty(funName))
                        {
                            funName = v.name;
                        }
                        var funString = $"{funName}(";
                        for (int i = 0; i < ft.parameters.Count; ++i)
                        {
                            var p           = ft.parameters[i];
                            var paramString = $"{p.name}: {p.type}";

                            parameInfos.Add(
                                new ParameterInformation()
                            {
                                Label = paramString,
                            }
                                );
                            funString += paramString;
                            if (i < ft.parameters.Count - 1)
                            {
                                funString += "; ";
                            }
                        }
                        funString      += $") => {ft.returnType}";
                        info.Label      = funString;
                        info.Parameters = parameInfos;
                        infos.Add(info);
                    }
                }
                var result = new SignatureHelp
                {
                    ActiveParameter = activeParam,
                    Signatures      = new Container <SignatureInformation>(infos)
                };
                return(result);
            }
        }
        return(new SignatureHelp());
    }
Пример #30
0
        public override RpcResult SignatureHelp(SignatureHelpParams args)
        {
            BHLSPWorkspace.self.TryAddDocument(args.textDocument.uri);
            if (BHLSPWorkspace.self.FindDocument(args.textDocument.uri) is BHLTextDocument document)
            {
                int line      = (int)args.position.line;
                int character = (int)args.position.character;

                int start = document.GetIndex(line);
                int stop  = document.GetIndex(line, character);
                var text  = document.text;

                var    txtLine         = text.Substring(start, stop - start);
                string funcName        = string.Empty;
                uint   activeParameter = 0;

                if (txtLine.IndexOf("func", StringComparison.Ordinal) == -1)
                {
                    string          pattern = @"[a-zA-Z_][a-zA-Z_0-9]*\({1}.*?";
                    MatchCollection matches = Regex.Matches(txtLine, pattern, RegexOptions.Multiline);
                    for (int i = matches.Count - 1; i >= 0; i--)
                    {
                        var m = matches[i];
                        if (m.Index < character)
                        {
                            string v   = m.Value;
                            int    len = v.Length - 1;

                            if (len > 0)
                            {
                                funcName = txtLine.Substring(m.Index, len);
                                var funcDeclStr = txtLine.Substring(m.Index, Math.Max(0, character - m.Index));
                                activeParameter = (uint)Math.Max(0, funcDeclStr.Split(',').Length - 1);
                                break;
                            }
                        }
                    }
                }

                bhlParser.FuncDeclContext funcDecl = null;
                if (!string.IsNullOrEmpty(funcName))
                {
                    foreach (var doc in BHLSPWorkspace.self.ForEachBhlImports(document))
                    {
                        if (doc.FuncDecls.ContainsKey(funcName))
                        {
                            funcDecl = doc.FuncDecls[funcName];
                            break;
                        }
                    }
                }

                if (funcDecl != null)
                {
                    SignatureInformation signInfo = GetFuncSignInfo(funcDecl);
                    signInfo.activeParameter = activeParameter;

                    var result = new SignatureHelp();
                    result.activeSignature = 0;
                    result.signatures      = new[] { signInfo };
                    result.activeParameter = signInfo.activeParameter;

                    return(RpcResult.Success(result));
                }
            }

            return(RpcResult.Success());
        }