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
}
|