File: pin.go

package info (click to toggle)
golang-github-mitch000001-go-hbci 0.4.0-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 2,468 kB
  • sloc: java: 1,092; makefile: 5
file content (122 lines) | stat: -rw-r--r-- 3,889 bytes parent folder | download
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package element

import (
	"bytes"
	"fmt"

	"github.com/mitch000001/go-hbci/internal"
)

const defaultPinTan = "\x00\x00\x00\x00\x00\x00\x00\x00"

// NewCustomSignature returns a new CustomSignatureDataElement for the pin and
// tan
func NewCustomSignature(pin, tan string) *CustomSignatureDataElement {
	p := &PinTanDataElement{
		PIN: NewAlphaNumeric(pin, 99),
	}
	if tan != "" {
		p.TAN = NewAlphaNumeric(tan, 99)
	}
	p.DataElement = NewDataElementGroup(pinTanDEG, 2, p)
	cust := &CustomSignatureDataElement{
		PinTanDataElement: p,
	}
	return cust
}

// CustomSignatureDataElement represents a custom signature
type CustomSignatureDataElement struct {
	*PinTanDataElement
}

// NewPinTan returns a new PinTanDataElement for pin and tan
func NewPinTan(pin, tan string) *PinTanDataElement {
	p := &PinTanDataElement{
		PIN: NewAlphaNumeric(pin, 6),
	}
	if tan != "" {
		p.TAN = NewAlphaNumeric(tan, 35)
	}
	p.DataElement = NewDataElementGroup(pinTanDEG, 2, p)
	return p
}

// PinTanDataElement represents a DataElement which contains the PIN and the
// TAN for a transaction
type PinTanDataElement struct {
	DataElement
	PIN *AlphaNumericDataElement
	TAN *AlphaNumericDataElement
}

// GroupDataElements returns the grouped DataElements
func (p *PinTanDataElement) GroupDataElements() []DataElement {
	return []DataElement{
		p.PIN,
		p.TAN,
	}
}

type PinTanSpecificParamDataElement struct {
	DataElement
	PinMinLength                 *NumberDataElement                   `yaml:"PinMinLength"`
	PinMaxLength                 *NumberDataElement                   `yaml:"PinMaxLength"`
	TanMaxLength                 *NumberDataElement                   `yaml:"TanMaxLength"`
	UserIDText                   *AlphaNumericDataElement             `yaml:"UserIDText"`
	CustomerIDText               *AlphaNumericDataElement             `yaml:"CustomerIDText"`
	JobSpecificPinTanInformation *PinTanBusinessTransactionParameters `yaml:"JobSpecificPinTanInformation"`
}

// Elements returns the grouped DataElements
func (p *PinTanSpecificParamDataElement) Elements() []DataElement {
	return []DataElement{
		p.PinMinLength,
		p.PinMaxLength,
		p.TanMaxLength,
		p.UserIDText,
		p.CustomerIDText,
		p.JobSpecificPinTanInformation,
	}
}

// UnmarshalHBCI unmarshals value
func (t *PinTanSpecificParamDataElement) UnmarshalHBCI(value []byte) error {
	elements, err := ExtractElements(value)
	if err != nil {
		return err
	}
	iter := internal.NewIterator(elements)
	var PinMinLength NumberDataElement
	if err := PinMinLength.UnmarshalHBCI(iter.Next()); err != nil {
		return fmt.Errorf("error unmarshaling PinMinLength: %v", err)
	}
	t.PinMinLength = &PinMinLength
	var PinMaxLength NumberDataElement
	if err := PinMaxLength.UnmarshalHBCI(iter.Next()); err != nil {
		return fmt.Errorf("error unmarshaling PinMaxLength: %v", err)
	}
	t.PinMaxLength = &PinMaxLength
	var TanMaxLength NumberDataElement
	if err := TanMaxLength.UnmarshalHBCI(iter.Next()); err != nil {
		return fmt.Errorf("error unmarshaling TanMaxLength: %v", err)
	}
	t.TanMaxLength = &TanMaxLength
	var UserIDText AlphaNumericDataElement
	if err := UserIDText.UnmarshalHBCI(iter.Next()); err != nil {
		return fmt.Errorf("error unmarshaling UserIDText: %v", err)
	}
	t.UserIDText = &UserIDText
	var CustomerIDText AlphaNumericDataElement
	if err := CustomerIDText.UnmarshalHBCI(iter.Next()); err != nil {
		return fmt.Errorf("error unmarshaling CustomerIDText: %v", err)
	}
	t.CustomerIDText = &CustomerIDText
	var JobSpecificPinTanInformation PinTanBusinessTransactionParameters
	if err := JobSpecificPinTanInformation.UnmarshalHBCI(bytes.Join(iter.Remainder(), []byte(":"))); err != nil {
		return fmt.Errorf("error unmarshaling JobSpecificPinTanInformation: %v", err)
	}
	t.JobSpecificPinTanInformation = &JobSpecificPinTanInformation
	t.DataElement = NewGroupDataElementGroup(pinTanSpecificParamDataElementDEG, 2, t)
	return nil
}