referenceform.cpp

来自「著名的SecureBlackBox控件完整源码」· C++ 代码 · 共 453 行

CPP
453
字号
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "ReferenceForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmReference *frmReference;
//---------------------------------------------------------------------------
__fastcall TfrmReference::TfrmReference(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TfrmReference::btnAddTransformClick(TObject *Sender)
{
    TElXMLC14NTransform* C14N;
    TElXMLXPathTransform* XPathTransform;
    XMLString s;
    XMLString t;
    int i;

    if (cmbTransform->Text == "Base64 transform")
        FReference->TransformChain->Add(new TElXMLBase64Transform);
    else if (cmbTransform->Text == "Enveloped signature transform")
        FReference->TransformChain->Add(new TElXMLEnvelopedSignatureTransform);
    else if (cmbTransform->Text == "XPath transform")
    {
        XPathTransform = new TElXMLXPathTransform;
        XPathTransform->XPath = edXPath->Text;

        s = Trim(edXPathNSMap->Text);
        while(s != XMLString(""))
        {
            i = s.Pos(",");
            if (i > 0)
            {
                t = Trim(s.SubString(1, i - 1));
                s = Trim(s.SubString(i + 1, MaxInt));
            }
            else
            {
                t = s;
                s = "";
            }

            i = t.Pos("=");
            if (i > 0)
                XPathTransform->NamespaceMap->AddNamespace(Trim(t.SubString(1, i - 1)), Trim(t.SubString(i + 1, MaxInt)));
        }

        FReference->TransformChain->Add(XPathTransform);
    }
    else
    {
        C14N = new TElXMLC14NTransform;
        if (cmbTransform->Text == "Canonical transform")
        {
            C14N->CanonicalizationMethod = xcmCanon;
            FReference->TransformChain->Add(C14N);
        }
        else if (cmbTransform->Text == "Canonical with comments transform")
        {
            C14N->CanonicalizationMethod = xcmCanonComment;
            FReference->TransformChain->Add(C14N);
        }
        else if (cmbTransform->Text == "Minimal canonical transform")
        {
            C14N->CanonicalizationMethod = xcmMinCanon;
            FReference->TransformChain->Add(C14N);
        }
        else
            delete C14N;
    }

    UpdateDigestValue();
    UpdateTransformChain();
}
//---------------------------------------------------------------------------
void __fastcall TfrmReference::btnDeleteTransformClick(TObject *Sender)
{
    for (int i = 0; i<lbTransforms->Items->Count; i++)
    {
        if (lbTransforms->Selected[i])
        {
            FReference->TransformChain->Delete(i);
            break;;
        }
    }
    UpdateDigestValue();
    UpdateTransformChain();
}
//---------------------------------------------------------------------------
void __fastcall TfrmReference::btnVerifyClick(TObject *Sender)
{
    ByteArray dv;

    dv = FReference->DigestValue;
    FReference->UpdateDigestValue();
    if (Sbutils::CompareMem(FReference->DigestValue, dv))
        MessageDlg("Verified OK", mtInformation, TMsgDlgButtons()<<mbOK, 0);
    else
        MessageDlg("BAD digest or data", mtError, TMsgDlgButtons()<<mbOK, 0);

    FReference->DigestValue = dv;
}
//---------------------------------------------------------------------------
void __fastcall TfrmReference::cmbDigestMethodChange(TObject *Sender)
{
    switch(cmbDigestMethod->ItemIndex)
    {
        case 0:
            FReference->DigestMethod = xdmMD5;
            break;
        case 1:
            FReference->DigestMethod = xdmSHA1;
            break;
        case 2:
            FReference->DigestMethod = xdmSHA224;
            break;
        case 3:
            FReference->DigestMethod = xdmSHA256;
            break;
        case 4:
            FReference->DigestMethod = xdmSHA384;
            break;
        case 5:
            FReference->DigestMethod = xdmSHA512;
            break;
        case 6:
            FReference->DigestMethod = xdmRIPEMD160;
            break;
        default:
            FReference->DigestMethod = xdmSHA1;
    }
    UpdateDigestValue();
}
//---------------------------------------------------------------------------
void __fastcall TfrmReference::cmbTransformChange(TObject *Sender)
{
    edXPath->Enabled = (cmbTransform->Text == "XPath transform");
    lbXPath->Enabled = edXPath->Enabled;
    lbXPathNS->Enabled = edXPath->Enabled;
    edXPathNSMap->Enabled = edXPath->Enabled;
}
//---------------------------------------------------------------------------
void __fastcall TfrmReference::edURINodeExit(TObject *Sender)
{
    ExtractURINode();
    if (rbURINode->Checked)
    {
        FReference->URINode = FURINode;
        UpdateDigestValue();
    }
}
//---------------------------------------------------------------------------
void TfrmReference::ExtractURINode(void)
{
    TElXMLNodeSet* NodeSet;
    TElXMLNamespaceMap* NSMap;
    XMLString s;
    XMLString t;
    int i;

    if (edNSMap->Text == "")
        NodeSet = FDocument->SelectNodes(edURINode->Text);
    else
    {
        NSMap = new TElXMLNamespaceMap;
        try
        {
            s = Trim(edNSMap->Text);
            while (s != XMLString(""))
            {
                i = s.Pos(",");
                if (i > 0)
                {
                    t = Trim(s.SubString(1, i - 1));
                    s = Trim(s.SubString(i + 1, MaxInt));
                }
                else
                {
                    t = s;
                    s = "";
                }

                i = t.Pos("=");
                if (i > 0)
                    NSMap->AddNamespace(Trim(t.SubString(1, i - 1)), Trim(t.SubString(i + 1, MaxInt)));
            }

            NodeSet = FDocument->SelectNodes(edURINode->Text, NSMap);
        }
        __finally
        {
            delete NSMap;
        }
    }

    try
    {
        if (NodeSet->Count > 0)
            FURINode = NodeSet->Node[0];
        else
          FURINode = NULL;
    }
    __finally
    {
        delete NodeSet;
    }
}
//---------------------------------------------------------------------------
TElXMLReference* TfrmReference::GetReference(void)
{
    FReference->ID = edID->Text;
    FReference->URI = edURI->Text;

    return FReference;
}
//---------------------------------------------------------------------------
void __fastcall TfrmReference::mmDataExit(TObject *Sender)
{
    FReference->URIData = BytesOfString(mmData->Text);
    UpdateDigestValue();
}
//---------------------------------------------------------------------------
void __fastcall TfrmReference::rbURIDataClick(TObject *Sender)
{
    rbURINode->Checked = !rbURIData->Checked;
    if (rbURINode->Checked)
        FReference->URINode = FURINode;
    else
        FReference->URINode = NULL;
    UpdateDigestValue();
}
//---------------------------------------------------------------------------
void __fastcall TfrmReference::rbURINodeClick(TObject *Sender)
{
    rbURIData->Checked = !rbURINode->Checked;
    if (rbURINode->Checked)
        FReference->URINode = FURINode;
    else
        FReference->URINode = NULL;
    UpdateDigestValue();
}
//---------------------------------------------------------------------------
void TfrmReference::SetReference(const TElXMLReference* Value)
{
    FReference = (TElXMLReference*)Value;
    edID->Text = FReference->ID;
    edURI->Text = FReference->URI;

    switch(FReference->DigestMethod)
    {
        case xdmMD5:
            cmbDigestMethod->ItemIndex = 0;
            break;
        case xdmSHA1:
            cmbDigestMethod->ItemIndex = 1;
            break;
        case xdmSHA224:
            cmbDigestMethod->ItemIndex = 2;
            break;
        case xdmSHA256:
            cmbDigestMethod->ItemIndex = 3;
            break;
        case xdmSHA384:
            cmbDigestMethod->ItemIndex = 4;
            break;
        case xdmSHA512:
            cmbDigestMethod->ItemIndex = 5;
            break;
        case xdmRIPEMD160:
            cmbDigestMethod->ItemIndex = 6;
            break;
    }

    FURINode = FReference->URINode;
    UpdateURINode(FURINode);
    mmData->Text = StringOfBytes(FReference->URIData);

    rbURINode->Checked = (FURINode!=NULL);

    if (Verify)
    {
        if (FReference->DigestValue.Length > 0)
            edDigestValue->Text = BinaryToString(&(FReference->DigestValue[0]), FReference->DigestValue.Length);
        else
            edDigestValue->Text = "";
    }
    else
        UpdateDigestValue();
    UpdateTransformChain();
}
//---------------------------------------------------------------------------
void TfrmReference::SetVerify(const bool Value)
{
    FVerify = Value;
    btnAddTransform->Enabled = !FVerify;
    btnDeleteTransform->Enabled = !FVerify;
    edID->ReadOnly = FVerify;
    edURI->ReadOnly = FVerify;
    btnVerify->Visible = FVerify;
}
//---------------------------------------------------------------------------
AnsiString TfrmReference::TransformToStr(TElXMLTransform* Transform)
{
    AnsiString Result = "Unknown transform";
    if (AnsiString(Transform->ClassName()) == "TElXMLBase64Transform")
        Result = "Base64 transform";
    else if (AnsiString(Transform->ClassName()) == "TElXMLC14NTransform")
    {
      if (((TElXMLC14NTransform*)Transform)->CanonicalizationMethod == xcmCanon)
          Result = "Canonical transform";
      else if (((TElXMLC14NTransform*)Transform)->CanonicalizationMethod == xcmCanonComment)
          Result = "Canonical with comments transform";
      else if (((TElXMLC14NTransform*)Transform)->CanonicalizationMethod == xcmMinCanon)
          Result = "Minimal canonical transform";
    }
    else if (AnsiString(Transform->ClassName()) == "TElXMLEnvelopedSignatureTransform")
        Result = "Enveloped signature transform";
    else if (AnsiString(Transform->ClassName()) == "TElXMLXPathTransform")
        Result = "XPath transform";
    return Result;
}
//---------------------------------------------------------------------------
void TfrmReference::UpdateDigestValue(void)
{
    if (Verify)
        return;

    try
    {
      FReference->UpdateDigestValue();
      if (FReference->DigestValue.Length > 0)
          edDigestValue->Text = BinaryToString(&(FReference->DigestValue[0]), FReference->DigestValue.Length);
      else
          edDigestValue->Text = "";
    }
    catch(Exception &e)
    {
        edDigestValue->Text = "";
    }
}
//---------------------------------------------------------------------------
void TfrmReference::UpdateTransformChain(void)
{
    lbTransforms->Clear();
    for (int i = 0;i<FReference->TransformChain->Count; i++)
        lbTransforms->Items->AddObject(TransformToStr(FReference->TransformChain->Transforms[i]), FReference->TransformChain->Transforms[i]);

    edXPath->Enabled = (cmbTransform->Text == "XPath transform");
    lbXPath->Enabled = edXPath->Enabled;
    lbXPathNS->Enabled = edXPath->Enabled;
    edXPathNSMap->Enabled = edXPath->Enabled;
}
//---------------------------------------------------------------------------
void TfrmReference::UpdateURINode(TElXMLDOMNode* Node)
{
    TElXMLDOMNode* PrevNode;
    TElXMLNamespaceMap* NSMap;
    XMLString s;
    XMLString p;
    XMLString Path;
    int i, k;

    if (Node == NULL)
    {
        edURINode->Text = "";
        edNSMap->Text = "";
        return;
    }

    NSMap = new TElXMLNamespaceMap;
    Path = "";
    while (AnsiString(Node->ClassName()) != "TElXMLDOMDocument")
    {
        i = 0;
        PrevNode = Node->PreviousSibling;
        while (PrevNode != NULL)
        {
            if ((PrevNode->NodeName == Node->NodeName) &&
                (PrevNode->NamespaceURI == Node->NamespaceURI))
                i++;
            PrevNode = PrevNode->PreviousSibling;
        }

        s = Node->NodeName;
        if (Node->NamespaceURI != XMLString(""))
        {
            p = "";
            if (Node->Prefix != XMLString(""))
                p = Node->Prefix;
            else
            {
                for (k = 0; k< NSMap->Count;k++)
                {
                    if (NSMap->URI[k] == Node->NamespaceURI)
                    {
                        p = NSMap->Prefix[k];
                        break;
                    }
                }

                if (p == XMLString(""))
                {
                    p = "x";
                    k = 1;
                    while (NSMap->FindNamespace(p) != XMLString(""))
                    {
                        k++;
                        p = XMLString("x") + IntToStr(k);
                    }
                }

                NSMap->AddNamespace(p, Node->NamespaceURI);
            }

            s = p + ":" + s;
        }

        if (i > 0)
            Path = "/" + s + "[" + IntToStr(i + 1) + "]" + Path;
        else
            Path = "/" + s + Path;

        Node = Node->ParentNode;
    }

    if (Path == XMLString(""))
        Path = "/";

    s = "";
    for (i = 0;i<NSMap->Count;i++)
    {
        if ((NSMap->Prefix[i] != XMLString("")) && (NSMap->Prefix[i] != XMLString("xml")))
        {
            if (s != XMLString(""))
                s = s + ", ";
            s = s + NSMap->Prefix[i] + "=" + NSMap->URI[i];
        }
    }

    delete NSMap;

    edURINode->Text = Path;
    edNSMap->Text = s;
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?