-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtransform.go
106 lines (88 loc) · 2.11 KB
/
transform.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package xmldsig
import (
"context"
"github.com/beevik/etree"
"github.com/deb-ict/go-xmldsig/transform"
)
type Transform struct {
Algorithm string
XPath string
transforms *Transforms
cachedXml *etree.Element
Transform transform.Transform
}
func newTransform(transforms *Transforms) *Transform {
return &Transform{
transforms: transforms,
}
}
func (xml *Transform) transformXmlElement(ctx context.Context, el *etree.Element) ([]byte, error) {
err := xml.ensureTransform()
if err != nil {
return nil, err
}
return xml.Transform.TransformXmlElement(ctx, el)
}
func (xml *Transform) transformData(ctx context.Context, data []byte) ([]byte, error) {
err := xml.ensureTransform()
if err != nil {
return nil, err
}
return xml.Transform.TransformData(ctx, data)
}
func (xml *Transform) root() *SignedXml {
return xml.transforms.root()
}
func (xml *Transform) loadXml(el *etree.Element) error {
err := validateElement(el, "Transform", XmlDSigNamespaceUri)
if err != nil {
return err
}
xml.Algorithm = el.SelectAttrValue("Algorithm", "")
xpathElement, err := getOptionalSingleChildElement(el, "XPath", XmlDSigNamespaceUri)
if err != nil {
return err
}
if xpathElement != nil {
xml.XPath = xpathElement.Text()
}
err = xml.ensureTransform()
if err != nil {
return err
}
err = xml.Transform.ReadXml(el)
if err != nil {
return err
}
xml.cachedXml = el
return nil
}
func (xml *Transform) getXml() (*etree.Element, error) {
el := etree.NewElement("Transform")
el.Space = xml.root().getElementSpace(XmlDSigNamespaceUri)
el.CreateAttr("Algorithm", xml.Algorithm)
if xml.XPath != "" {
xpathEl := el.CreateElement("XPath")
xpathEl.Space = xml.root().getElementSpace(XmlDSigNamespaceUri)
xpathEl.SetText(xml.XPath)
}
err := xml.ensureTransform()
if err != nil {
return nil, err
}
err = xml.Transform.WriteXml(el)
if err != nil {
return nil, err
}
return el, nil
}
func (xml *Transform) ensureTransform() error {
if xml.Transform == nil {
Transform, err := transform.GetTransform(xml.Algorithm)
if err != nil {
return err
}
xml.Transform = Transform
}
return nil
}