From c4a7ba97400a523bc31ff14652d9cbc69d306326 Mon Sep 17 00:00:00 2001 From: Michael Wagner Date: Sun, 27 Mar 2022 11:51:14 +0200 Subject: [PATCH 1/7] refac(element): rename files to reflect content --- element/{segment.go => segment_header.go} | 36 +++++++++---------- ...segment_test.go => segment_header_test.go} | 0 2 files changed, 18 insertions(+), 18 deletions(-) rename element/{segment.go => segment_header.go} (73%) rename element/{segment_test.go => segment_header_test.go} (100%) diff --git a/element/segment.go b/element/segment_header.go similarity index 73% rename from element/segment.go rename to element/segment_header.go index db12a42..0d62608 100644 --- a/element/segment.go +++ b/element/segment_header.go @@ -4,18 +4,18 @@ import "fmt" // NewReferencingSegmentHeader returns a new SegmentHeader with a reference to // another segment -func NewReferencingSegmentHeader(id string, number, version, reference int) *SegmentHeader { - header := NewSegmentHeader(id, number, version) +func NewReferencingSegmentHeader(id string, position, version, reference int) *SegmentHeader { + header := NewSegmentHeader(id, position, version) header.Ref = NewNumber(reference, 3) return header } -// NewSegmentHeader returns a new SegmentHeader for the id, number and version -func NewSegmentHeader(id string, number, version int) *SegmentHeader { +// NewSegmentHeader returns a new SegmentHeader for the id, position and version +func NewSegmentHeader(id string, position, version int) *SegmentHeader { header := &SegmentHeader{ - ID: NewAlphaNumeric(id, 6), - Number: NewNumber(number, 3), - Version: NewNumber(version, 3), + ID: NewAlphaNumeric(id, 6), + Position: NewNumber(position, 3), + Version: NewNumber(version, 3), } header.DataElement = NewDataElementGroup(segmentHeaderDEG, 4, header) return header @@ -24,10 +24,10 @@ func NewSegmentHeader(id string, number, version int) *SegmentHeader { // A SegmentHeader represents the metadata of a given segment such as ID or version type SegmentHeader struct { DataElement - ID *AlphaNumericDataElement - Number *NumberDataElement - Version *NumberDataElement - Ref *NumberDataElement + ID *AlphaNumericDataElement + Position *NumberDataElement + Version *NumberDataElement + Ref *NumberDataElement } // Type returns the DataElementType of s @@ -35,9 +35,9 @@ func (s *SegmentHeader) Type() DataElementType { return segmentHeaderDEG } -// SetNumber sets the number of the segment -func (s *SegmentHeader) SetNumber(number int) { - *s.Number = *NewNumber(number, 3) +// SetPosition sets the number of the segment +func (s *SegmentHeader) SetPosition(pos int) { + *s.Position = *NewNumber(pos, 3) } // SetReference sets the reference to another segment @@ -56,7 +56,7 @@ func (s *SegmentHeader) ReferencingSegment() int { // IsValid returns true if the DataElement and all its grouped elements // are valid, false otherwise func (s *SegmentHeader) IsValid() bool { - if s.ID == nil || s.Number == nil || s.Version == nil { + if s.ID == nil || s.Position == nil || s.Version == nil { return false } return s.DataElement.IsValid() @@ -66,7 +66,7 @@ func (s *SegmentHeader) IsValid() bool { func (s *SegmentHeader) GroupDataElements() []DataElement { return []DataElement{ s.ID, - s.Number, + s.Position, s.Version, s.Ref, } @@ -90,8 +90,8 @@ func (s *SegmentHeader) UnmarshalHBCI(value []byte) error { } } if len(elements) > 1 { - s.Number = &NumberDataElement{} - err = s.Number.UnmarshalHBCI(elements[1]) + s.Position = &NumberDataElement{} + err = s.Position.UnmarshalHBCI(elements[1]) if err != nil { return fmt.Errorf("Malformed segment header number: %v", err) } diff --git a/element/segment_test.go b/element/segment_header_test.go similarity index 100% rename from element/segment_test.go rename to element/segment_header_test.go From bf2d4d2fc16713703b736442fffc433e76921201 Mon Sep 17 00:00:00 2001 From: Michael Wagner Date: Sun, 27 Mar 2022 12:04:57 +0200 Subject: [PATCH 2/7] refac(generator): clean up flag names --- cmd/unmarshaler/unmarshaler_generator.go | 26 +++++++++++++----------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/cmd/unmarshaler/unmarshaler_generator.go b/cmd/unmarshaler/unmarshaler_generator.go index 636bf87..576224c 100644 --- a/cmd/unmarshaler/unmarshaler_generator.go +++ b/cmd/unmarshaler/unmarshaler_generator.go @@ -15,17 +15,19 @@ import ( "github.com/mitch000001/go-hbci/generator" ) -var segmentFlag = flag.String("segment", "", "'MyAwesomeSegment'") -var segmentInterfaceFlag = flag.String("segment_interface", "Segment", "'MyAwesomeInterface'") -var segmentVersionsFlag segmentVersions +var segmentName string +var segmentInterface string +var segmentVersions segmentVersionsFlag func init() { - flag.Var(&segmentVersionsFlag, "segment_versions", "'MyAwesomeSegmentVersion1:1,MyAwesomeSegmentVersion2:2'") + flag.StringVar(&segmentName, "segment", "", "'MyAwesomeSegment'") + flag.StringVar(&segmentInterface, "segment_interface", "Segment", "'MyAwesomeInterface'") + flag.Var(&segmentVersions, "segment_versions", "'MyAwesomeSegmentVersion1:1,MyAwesomeSegmentVersion2:2'") } func main() { flag.Parse() - if *segmentFlag == "" { + if segmentName == "" { fmt.Printf("You must provide a segment to generate the unmarshaler\n") os.Exit(1) } @@ -37,12 +39,12 @@ func main() { fmt.Println(err) } segment := generator.SegmentIdentifier{ - Name: *segmentFlag, - InterfaceName: *segmentInterfaceFlag, - Versions: segmentVersionsFlag, + Name: segmentName, + InterfaceName: segmentInterface, + Versions: segmentVersions, } var generated io.Reader - if len(segmentVersionsFlag) != 0 { + if len(segmentVersions) != 0 { segmentGenerator := generator.NewVersionedSegmentUnmarshaler(segment, packageName, fileSet, f) generated, err = segmentGenerator.Generate() } else { @@ -71,9 +73,9 @@ func main() { } } -type segmentVersions []generator.SegmentIdentifier +type segmentVersionsFlag []generator.SegmentIdentifier -func (s *segmentVersions) String() string { +func (s *segmentVersionsFlag) String() string { var buf bytes.Buffer for _, version := range *s { fmt.Fprintf(&buf, "%s:%d:%s", version.Name, version.Version, version.InterfaceName) @@ -81,7 +83,7 @@ func (s *segmentVersions) String() string { return buf.String() } -func (s *segmentVersions) Set(in string) error { +func (s *segmentVersionsFlag) Set(in string) error { unquoted, err := strconv.Unquote(in) if err != nil { return fmt.Errorf("Invalid input: %q (%v)", in, err) From 8cc9ce55ee06faf534756322a35ebbdcbf8c9010 Mon Sep 17 00:00:00 2001 From: Michael Wagner Date: Sun, 27 Mar 2022 12:38:13 +0200 Subject: [PATCH 3/7] refac: replace magic numbers/strings with meaningful names --- dialog/dialog.go | 22 ++++++++++++++++------ dialog/pin_tan_dialog.go | 12 ++++++------ domain/key.go | 27 ++++++++++++++++++--------- element/signature.go | 4 ++-- message/signature.go | 2 +- 5 files changed, 43 insertions(+), 24 deletions(-) diff --git a/dialog/dialog.go b/dialog/dialog.go index facbd8c..987749e 100644 --- a/dialog/dialog.go +++ b/dialog/dialog.go @@ -25,9 +25,13 @@ type Dialog interface { SendMessage(message.HBCIMessage) (message.BankMessage, error) } -const initialDialogID = "0" -const initialClientSystemID = "0" -const anonymousClientID = "9999999999" +const ( + initialDialogID = "0" + initialClientSystemID = "0" + initialBankParameterDataVersion = 0 + initialUserParameterDataVersion = 0 + anonymousClientID = "9999999999" +) func newDialog( bankID domain.BankID, @@ -134,7 +138,9 @@ func (d *dialog) SendMessage(clientMessage message.HBCIMessage) (message.BankMes func (d *dialog) SyncClientSystemID() (string, error) { syncMessage := message.NewSynchronisationMessage(d.hbciVersion) syncMessage.Identification = segment.NewIdentificationSegment(d.BankID, d.clientID, initialClientSystemID, true) - syncMessage.ProcessingPreparation = segment.NewProcessingPreparationSegment(0, 0, 1) + syncMessage.ProcessingPreparation = segment.NewProcessingPreparationSegment( + initialBankParameterDataVersion, initialUserParameterDataVersion, domain.German, + ) syncMessage.Sync = d.hbciVersion.SynchronisationRequest(segment.SyncModeAquireClientID) syncMessage.BasicMessage = d.newBasicMessage(syncMessage) signedSyncMessage, err := syncMessage.Sign(d.signatureProvider) @@ -233,7 +239,9 @@ func (d *dialog) anonymousInit() error { d.messageCount = 0 initMessage := message.NewDialogInitializationClientMessage(d.hbciVersion) initMessage.Identification = segment.NewIdentificationSegment(d.BankID, anonymousClientID, initialClientSystemID, false) - initMessage.ProcessingPreparation = segment.NewProcessingPreparationSegment(d.BankParameterDataVersion(), d.UserParameterDataVersion(), d.Language) + initMessage.ProcessingPreparation = segment.NewProcessingPreparationSegment( + d.BankParameterDataVersion(), d.UserParameterDataVersion(), d.Language, + ) initMessage.BasicMessage = d.newBasicMessage(initMessage) initMessage.SetNumbers() bankMessage, err := d.request(initMessage) @@ -314,7 +322,9 @@ func (d *dialog) init() error { d.messageCount = 0 initMessage := message.NewDialogInitializationClientMessage(d.hbciVersion) initMessage.Identification = segment.NewIdentificationSegment(d.BankID, d.clientID, d.ClientSystemID, true) - initMessage.ProcessingPreparation = segment.NewProcessingPreparationSegment(d.BankParameterDataVersion(), d.UserParameterDataVersion(), d.Language) + initMessage.ProcessingPreparation = segment.NewProcessingPreparationSegment( + d.BankParameterDataVersion(), d.UserParameterDataVersion(), d.Language, + ) initMessage.BasicMessage = d.newBasicMessage(initMessage) signedInitMessage, err := initMessage.Sign(d.signatureProvider) if err != nil { diff --git a/dialog/pin_tan_dialog.go b/dialog/pin_tan_dialog.go index f35fa89..b67df66 100644 --- a/dialog/pin_tan_dialog.go +++ b/dialog/pin_tan_dialog.go @@ -23,10 +23,10 @@ type Config struct { // NewPinTanDialog creates a new dialog to use for pin/tan transport func NewPinTanDialog(config Config) *PinTanDialog { - pinKey := domain.NewPinKey("", domain.NewPinTanKeyName(config.BankID, config.UserID, "S")) - signatureProvider := message.NewPinTanSignatureProvider(pinKey, "0") - pinKey = domain.NewPinKey("", domain.NewPinTanKeyName(config.BankID, config.UserID, "V")) - cryptoProvider := message.NewPinTanCryptoProvider(pinKey, "0") + pinKey := domain.NewPinKey("", domain.NewPinTanKeyName(config.BankID, config.UserID, domain.KeyTypeSigning)) + signatureProvider := message.NewPinTanSignatureProvider(pinKey, initialClientSystemID) + pinKey = domain.NewPinKey("", domain.NewPinTanKeyName(config.BankID, config.UserID, domain.KeyTypeEncryption)) + cryptoProvider := message.NewPinTanCryptoProvider(pinKey, initialClientSystemID) d := &PinTanDialog{ dialog: newDialog( config.BankID, @@ -57,8 +57,8 @@ type PinTanDialog struct { // SetPin lets the user reset the pin after creation func (d *PinTanDialog) SetPin(pin string) { - pinKey := domain.NewPinKey(pin, domain.NewPinTanKeyName(d.BankID, d.UserID, "S")) + pinKey := domain.NewPinKey(pin, domain.NewPinTanKeyName(d.BankID, d.UserID, domain.KeyTypeSigning)) d.signatureProvider = message.NewPinTanSignatureProvider(pinKey, d.ClientSystemID) - pinKey = domain.NewPinKey(pin, domain.NewPinTanKeyName(d.BankID, d.UserID, "V")) + pinKey = domain.NewPinKey(pin, domain.NewPinTanKeyName(d.BankID, d.UserID, domain.KeyTypeEncryption)) d.cryptoProvider = message.NewPinTanCryptoProvider(pinKey, d.ClientSystemID) } diff --git a/domain/key.go b/domain/key.go index a2fe55b..696c712 100644 --- a/domain/key.go +++ b/domain/key.go @@ -24,10 +24,19 @@ type Key interface { CanEncrypt() bool } -const initialKeyVersion = 999 +const ( + initialKeyNumber = 999 + initialKeyVersion = 999 + KeyTypeSigning = KeyType("S") + KeyTypeEncryption = KeyType("V") +) + +type KeyType string + +func (k KeyType) String() string { return string(k) } // NewPinTanKeyName returns a new KeyName for the pin/tan flow -func NewPinTanKeyName(bankID BankID, userID string, keyType string) *KeyName { +func NewPinTanKeyName(bankID BankID, userID string, keyType KeyType) *KeyName { return &KeyName{ BankID: bankID, UserID: userID, @@ -38,13 +47,13 @@ func NewPinTanKeyName(bankID BankID, userID string, keyType string) *KeyName { } // NewInitialKeyName represents a KeyName ready to use for initial communication -func NewInitialKeyName(countryCode int, bankID, userID string, keyType string) *KeyName { +func NewInitialKeyName(countryCode int, bankID, userID string, keyType KeyType) *KeyName { return &KeyName{ BankID: BankID{CountryCode: countryCode, ID: bankID}, UserID: userID, KeyType: keyType, - KeyNumber: 999, - KeyVersion: 999, + KeyNumber: initialKeyNumber, + KeyVersion: initialKeyVersion, } } @@ -52,20 +61,20 @@ func NewInitialKeyName(countryCode int, bankID, userID string, keyType string) * type KeyName struct { BankID BankID UserID string - KeyType string + KeyType KeyType KeyNumber int KeyVersion int } // IsInitial returns true if the KeyName represents an initial KeyName, false otherwise func (k *KeyName) IsInitial() bool { - return k.KeyNumber == 999 && k.KeyVersion == 999 + return k.KeyNumber == initialKeyNumber && k.KeyVersion == initialKeyVersion } // SetInitial resets the KeyName to reflect an initial KeyName func (k *KeyName) SetInitial() { - k.KeyNumber = 999 - k.KeyVersion = 999 + k.KeyNumber = initialKeyNumber + k.KeyVersion = initialKeyVersion } // NewPinKey returns a new PinKey diff --git a/element/signature.go b/element/signature.go index 8a2885c..13b60dc 100644 --- a/element/signature.go +++ b/element/signature.go @@ -200,7 +200,7 @@ func NewKeyName(keyName domain.KeyName) *KeyNameDataElement { a := &KeyNameDataElement{ Bank: NewBankIdentification(keyName.BankID), UserID: NewIdentification(keyName.UserID), - KeyType: NewAlphaNumeric(keyName.KeyType, 1), + KeyType: NewAlphaNumeric(string(keyName.KeyType), 1), KeyNumber: NewNumber(keyName.KeyNumber, 3), KeyVersion: NewNumber(keyName.KeyVersion, 3), } @@ -227,7 +227,7 @@ func (k *KeyNameDataElement) Val() domain.KeyName { CountryCode: k.Bank.CountryCode.Val(), ID: k.Bank.BankID.Val()}, UserID: k.UserID.Val(), - KeyType: k.KeyType.Val(), + KeyType: domain.KeyType(k.KeyType.Val()), KeyNumber: k.KeyNumber.Val(), KeyVersion: k.KeyVersion.Val(), } diff --git a/message/signature.go b/message/signature.go index 6bf9fa5..ba47d6c 100644 --- a/message/signature.go +++ b/message/signature.go @@ -40,7 +40,7 @@ func generateControlReference(key domain.Key) string { io.WriteString(h, fmt.Sprintf("%d", keyName.BankID.CountryCode)) io.WriteString(h, keyName.BankID.ID) io.WriteString(h, keyName.UserID) - io.WriteString(h, keyName.KeyType) + io.WriteString(h, string(keyName.KeyType)) io.WriteString(h, fmt.Sprintf("%d", keyName.KeyNumber)) io.WriteString(h, fmt.Sprintf("%d", keyName.KeyVersion)) return fmt.Sprintf("%x", h.Sum(nil)) From 8126fe4ec878a7da9c09c347c21474f08d68e5fe Mon Sep 17 00:00:00 2001 From: Michael Wagner Date: Sun, 27 Mar 2022 12:41:15 +0200 Subject: [PATCH 4/7] refac(segment): push IDs into consts --- dialog/dialog.go | 16 ++++++++-------- segment/bank_announcement.go | 4 +++- segment/basic_account_information.go | 8 +++++--- segment/business_transaction.go | 6 +++++- segment/common_bank_parameter_data.go | 4 +++- segment/message_header.go | 4 +++- segment/segment_index.go | 22 +++++++++++----------- segment/user_parameter_data.go | 8 +++++--- 8 files changed, 43 insertions(+), 29 deletions(-) diff --git a/dialog/dialog.go b/dialog/dialog.go index 987749e..feab2fd 100644 --- a/dialog/dialog.go +++ b/dialog/dialog.go @@ -264,7 +264,7 @@ func (d *dialog) anonymousInit() error { return err } - bankInfoMessage := bankMessage.FindSegment("HIKIM") + bankInfoMessage := bankMessage.FindSegment(segment.BankAnnouncementID) if bankInfoMessage != nil { bankInfoSegment := bankInfoMessage.(*segment.BankAnnouncementSegment) internal.Info.Printf("INFO:\n%s\n%s\n", bankInfoSegment.Subject.Val(), bankInfoSegment.Body.Val()) @@ -355,7 +355,7 @@ func (d *dialog) init() error { return err } - bankInfoMessage := decryptedMessage.FindSegment("HIKIM") + bankInfoMessage := decryptedMessage.FindSegment(segment.BankAnnouncementID) if bankInfoMessage != nil { bankInfoSegment := bankInfoMessage.(*segment.BankAnnouncementSegment) internal.Info.Printf("INFO:\n%s\n%s\n", bankInfoSegment.Subject.Val(), bankInfoSegment.Body.Val()) @@ -439,12 +439,12 @@ func (d *dialog) newBasicMessage(hbciMessage message.HBCIMessage) *message.Basic } func (d *dialog) parseBankParameterData(bankMessage message.BankMessage) error { - bankParamData := bankMessage.FindSegment("HIBPA") + bankParamData := bankMessage.FindSegment(segment.CommonBankParameterID) if bankParamData != nil { paramSegment := bankParamData.(segment.CommonBankParameter) d.BankParameterData = paramSegment.BankParameterData() } - pinTanTransactions := bankMessage.FindSegment("DIPINS") + pinTanTransactions := bankMessage.FindSegment(segment.PinTanBusinessTransactionParamsID) if pinTanTransactions != nil { pinTanTransactionSegment := pinTanTransactions.(segment.PinTanBusinessTransactionParams) pinTransactions := make(map[string]bool) @@ -457,14 +457,14 @@ func (d *dialog) parseBankParameterData(bankMessage message.BankMessage) error { } func (d *dialog) parseUserParameterData(bankMessage message.BankMessage) error { - userParamData := bankMessage.FindSegment("HIUPA") + userParamData := bankMessage.FindSegment(segment.CommonUserParameterDataID) if userParamData != nil { paramSegment := userParamData.(segment.CommonUserParameterData) d.UserParameterData = paramSegment.UserParameterData() d.clientID = d.UserParameterData.UserID } - accountData := bankMessage.FindSegments("HIUPD") + accountData := bankMessage.FindSegments(segment.AccountInformationID) if accountData != nil { for _, acc := range accountData { infoSegment := acc.(segment.AccountInformation) @@ -527,7 +527,7 @@ func (d *dialog) request(clientMessage message.ClientMessage) (message.BankMessa } func (d *dialog) extractEncryptedMessage(response *transport.Response) (*message.EncryptedMessage, error) { - messageHeader := response.FindSegment("HNHBK") + messageHeader := response.FindSegment(segment.MessageHeaderID) if messageHeader == nil { return nil, fmt.Errorf("Malformed response: missing Message Header") } @@ -556,7 +556,7 @@ func (d *dialog) extractEncryptedMessage(response *transport.Response) (*message } func extractUnencryptedMessage(response *transport.Response) (message.BankMessage, error) { - messageHeader := response.FindSegment("HNHBK") + messageHeader := response.FindSegment(segment.MessageHeaderID) if messageHeader == nil { return nil, fmt.Errorf("Malformed response: missing Message Header") } diff --git a/segment/bank_announcement.go b/segment/bank_announcement.go index ec6d8c1..595fbb5 100644 --- a/segment/bank_announcement.go +++ b/segment/bank_announcement.go @@ -4,6 +4,8 @@ import "github.com/mitch000001/go-hbci/element" //go:generate go run ../cmd/unmarshaler/unmarshaler_generator.go -segment BankAnnouncementSegment +const BankAnnouncementID = "HIKIM" + type BankAnnouncementSegment struct { Segment Subject *element.AlphaNumericDataElement @@ -11,7 +13,7 @@ type BankAnnouncementSegment struct { } func (b *BankAnnouncementSegment) Version() int { return 2 } -func (b *BankAnnouncementSegment) ID() string { return "HIKIM" } +func (b *BankAnnouncementSegment) ID() string { return BankAnnouncementID } func (b *BankAnnouncementSegment) referencedId() string { return "" } func (b *BankAnnouncementSegment) sender() string { return senderBank } diff --git a/segment/basic_account_information.go b/segment/basic_account_information.go index 19b0299..9f04a02 100644 --- a/segment/basic_account_information.go +++ b/segment/basic_account_information.go @@ -5,6 +5,8 @@ import ( "github.com/mitch000001/go-hbci/element" ) +const AccountInformationID string = "HIUPD" + type AccountInformation interface { BankSegment Account() domain.AccountInformation @@ -34,7 +36,7 @@ type AccountInformationV4 struct { } func (a *AccountInformationV4) Version() int { return 4 } -func (a *AccountInformationV4) ID() string { return "HIUPD" } +func (a *AccountInformationV4) ID() string { return AccountInformationID } func (a *AccountInformationV4) referencedId() string { return "HKVVB" } func (a *AccountInformationV4) sender() string { return senderBank } @@ -89,7 +91,7 @@ type AccountInformationV5 struct { } func (a *AccountInformationV5) Version() int { return 5 } -func (a *AccountInformationV5) ID() string { return "HIUPD" } +func (a *AccountInformationV5) ID() string { return AccountInformationID } func (a *AccountInformationV5) referencedId() string { return "HKVVB" } func (a *AccountInformationV5) sender() string { return senderBank } @@ -150,7 +152,7 @@ type AccountInformationV6 struct { } func (a *AccountInformationV6) Version() int { return 6 } -func (a *AccountInformationV6) ID() string { return "HIUPD" } +func (a *AccountInformationV6) ID() string { return AccountInformationID } func (a *AccountInformationV6) referencedId() string { return "HKVVB" } func (a *AccountInformationV6) sender() string { return senderBank } diff --git a/segment/business_transaction.go b/segment/business_transaction.go index d3d0cb8..b2e2b5f 100644 --- a/segment/business_transaction.go +++ b/segment/business_transaction.go @@ -57,6 +57,8 @@ func (b *BusinessTransactionParamsSegment) UnmarshalHBCI(value []byte) error { return nil } +const PinTanBusinessTransactionParamsID string = "DIPINS" + type PinTanBusinessTransactionParams interface { BankSegment PinTanBusinessTransactions() []domain.PinTanBusinessTransaction @@ -67,7 +69,9 @@ type PinTanBusinessTransactionParamsSegment struct { } func (p *PinTanBusinessTransactionParamsSegment) Version() int { return 1 } -func (p *PinTanBusinessTransactionParamsSegment) ID() string { return "DIPINS" } +func (p *PinTanBusinessTransactionParamsSegment) ID() string { + return PinTanBusinessTransactionParamsID +} func (p *PinTanBusinessTransactionParamsSegment) UnmarshalHBCI(value []byte) error { businessTransactionSegment := &BusinessTransactionParamsSegment{} diff --git a/segment/common_bank_parameter_data.go b/segment/common_bank_parameter_data.go index b3391e1..5bfab54 100644 --- a/segment/common_bank_parameter_data.go +++ b/segment/common_bank_parameter_data.go @@ -5,6 +5,8 @@ import ( "github.com/mitch000001/go-hbci/element" ) +const CommonBankParameterID string = "HIBPA" + type CommonBankParameter interface { BankSegment BankParameterData() domain.BankParameterData @@ -33,7 +35,7 @@ type CommonBankParameterV2 struct { } func (c *CommonBankParameterV2) Version() int { return 2 } -func (c *CommonBankParameterV2) ID() string { return "HIBPA" } +func (c *CommonBankParameterV2) ID() string { return CommonBankParameterID } func (c *CommonBankParameterV2) referencedId() string { return "HKVVB" } func (c *CommonBankParameterV2) sender() string { return senderBank } diff --git a/segment/message_header.go b/segment/message_header.go index 084f4dc..1087b3f 100644 --- a/segment/message_header.go +++ b/segment/message_header.go @@ -5,6 +5,8 @@ import ( "github.com/mitch000001/go-hbci/element" ) +const MessageHeaderID string = "HNHBK" + func NewReferencingMessageHeaderSegment(size int, hbciVersion int, dialogId string, number int, referencingMessage domain.ReferencingMessage) *MessageHeaderSegment { m := NewMessageHeaderSegment(size, hbciVersion, dialogId, number) m.Ref = element.NewReferencingMessage(referencingMessage.DialogID, referencingMessage.MessageNumber) @@ -34,7 +36,7 @@ type MessageHeaderSegment struct { } func (m *MessageHeaderSegment) Version() int { return 3 } -func (m *MessageHeaderSegment) ID() string { return "HNHBK" } +func (m *MessageHeaderSegment) ID() string { return MessageHeaderID } func (m *MessageHeaderSegment) referencedId() string { return "" } func (m *MessageHeaderSegment) sender() string { return senderBoth } diff --git a/segment/segment_index.go b/segment/segment_index.go index 7f31466..78533be 100644 --- a/segment/segment_index.go +++ b/segment/segment_index.go @@ -62,7 +62,7 @@ func (s *SegmentIndex) mustAddToIndex(segmentIdentifier VersionedSegment, segmen var KnownSegments = SegmentIndex{segmentMap: make(map[VersionedSegment]func() Segment)} func init() { - KnownSegments.mustAddToIndex(VersionedSegment{"HNHBK", 3}, func() Segment { return &MessageHeaderSegment{} }) + KnownSegments.mustAddToIndex(VersionedSegment{MessageHeaderID, 3}, func() Segment { return &MessageHeaderSegment{} }) KnownSegments.mustAddToIndex(VersionedSegment{"HNHBS", 1}, func() Segment { return &MessageEndSegment{} }) KnownSegments.mustAddToIndex(VersionedSegment{EncryptionHeaderSegmentID, 2}, func() Segment { return &EncryptionHeaderV2{} }) KnownSegments.mustAddToIndex(VersionedSegment{EncryptionHeaderSegmentID, 3}, func() Segment { return &EncryptionHeaderSegmentV3{} }) @@ -71,16 +71,16 @@ func init() { KnownSegments.mustAddToIndex(VersionedSegment{"HIRMS", 2}, func() Segment { return &SegmentAcknowledgement{} }) KnownSegments.mustAddToIndex(VersionedSegment{"HISYN", 3}, func() Segment { return &SynchronisationResponseSegmentV3{} }) KnownSegments.mustAddToIndex(VersionedSegment{"HISYN", 4}, func() Segment { return &SynchronisationResponseSegmentV4{} }) - KnownSegments.mustAddToIndex(VersionedSegment{"HIKIM", 2}, func() Segment { return &BankAnnouncementSegment{} }) - KnownSegments.mustAddToIndex(VersionedSegment{"HIBPA", 2}, func() Segment { return &CommonBankParameterV2{} }) - KnownSegments.mustAddToIndex(VersionedSegment{"HIBPA", 3}, func() Segment { return &CommonBankParameterV3{} }) - KnownSegments.mustAddToIndex(VersionedSegment{"DIPINS", 1}, func() Segment { return &PinTanBusinessTransactionParamsSegment{} }) - KnownSegments.mustAddToIndex(VersionedSegment{"HIUPA", 2}, func() Segment { return &CommonUserParameterDataV2{} }) - KnownSegments.mustAddToIndex(VersionedSegment{"HIUPA", 3}, func() Segment { return &CommonUserParameterDataV3{} }) - KnownSegments.mustAddToIndex(VersionedSegment{"HIUPA", 4}, func() Segment { return &CommonUserParameterDataV4{} }) - KnownSegments.mustAddToIndex(VersionedSegment{"HIUPD", 4}, func() Segment { return &AccountInformationV4{} }) - KnownSegments.mustAddToIndex(VersionedSegment{"HIUPD", 5}, func() Segment { return &AccountInformationV5{} }) - KnownSegments.mustAddToIndex(VersionedSegment{"HIUPD", 6}, func() Segment { return &AccountInformationV6{} }) + KnownSegments.mustAddToIndex(VersionedSegment{BankAnnouncementID, 2}, func() Segment { return &BankAnnouncementSegment{} }) + KnownSegments.mustAddToIndex(VersionedSegment{CommonBankParameterID, 2}, func() Segment { return &CommonBankParameterV2{} }) + KnownSegments.mustAddToIndex(VersionedSegment{CommonBankParameterID, 3}, func() Segment { return &CommonBankParameterV3{} }) + KnownSegments.mustAddToIndex(VersionedSegment{PinTanBusinessTransactionParamsID, 1}, func() Segment { return &PinTanBusinessTransactionParamsSegment{} }) + KnownSegments.mustAddToIndex(VersionedSegment{CommonUserParameterDataID, 2}, func() Segment { return &CommonUserParameterDataV2{} }) + KnownSegments.mustAddToIndex(VersionedSegment{CommonUserParameterDataID, 3}, func() Segment { return &CommonUserParameterDataV3{} }) + KnownSegments.mustAddToIndex(VersionedSegment{CommonUserParameterDataID, 4}, func() Segment { return &CommonUserParameterDataV4{} }) + KnownSegments.mustAddToIndex(VersionedSegment{AccountInformationID, 4}, func() Segment { return &AccountInformationV4{} }) + KnownSegments.mustAddToIndex(VersionedSegment{AccountInformationID, 5}, func() Segment { return &AccountInformationV5{} }) + KnownSegments.mustAddToIndex(VersionedSegment{AccountInformationID, 6}, func() Segment { return &AccountInformationV6{} }) KnownSegments.mustAddToIndex(VersionedSegment{"HISAL", 5}, func() Segment { return &AccountBalanceResponseSegment{} }) KnownSegments.mustAddToIndex(VersionedSegment{"HIKIF", 1}, func() Segment { return &AccountInformationResponseSegment{} }) KnownSegments.mustAddToIndex(VersionedSegment{"HIKAZ", 5}, func() Segment { return &AccountTransactionResponseSegmentV5{} }) diff --git a/segment/user_parameter_data.go b/segment/user_parameter_data.go index c663bf8..ba7435c 100644 --- a/segment/user_parameter_data.go +++ b/segment/user_parameter_data.go @@ -5,6 +5,8 @@ import ( "github.com/mitch000001/go-hbci/element" ) +const CommonUserParameterDataID string = "HIUPA" + //go:generate go run ../cmd/unmarshaler/unmarshaler_generator.go -segment CommonUserParameterDataSegment -segment_interface commonUserParameterDataSegment -segment_versions="CommonUserParameterDataV2:2:Segment,CommonUserParameterDataV3:3:Segment,CommonUserParameterDataV4:4:Segment" type CommonUserParameterData interface { @@ -37,7 +39,7 @@ type CommonUserParameterDataV2 struct { } func (c *CommonUserParameterDataV2) Version() int { return 2 } -func (c *CommonUserParameterDataV2) ID() string { return "HIUPA" } +func (c *CommonUserParameterDataV2) ID() string { return CommonUserParameterDataID } func (c *CommonUserParameterDataV2) referencedId() string { return "HKVVB" } func (c *CommonUserParameterDataV2) sender() string { return senderBank } @@ -75,7 +77,7 @@ type CommonUserParameterDataV3 struct { } func (c *CommonUserParameterDataV3) Version() int { return 3 } -func (c *CommonUserParameterDataV3) ID() string { return "HIUPA" } +func (c *CommonUserParameterDataV3) ID() string { return CommonUserParameterDataID } func (c *CommonUserParameterDataV3) referencedId() string { return "HKVVB" } func (c *CommonUserParameterDataV3) sender() string { return senderBank } @@ -115,7 +117,7 @@ type CommonUserParameterDataV4 struct { } func (c *CommonUserParameterDataV4) Version() int { return 4 } -func (c *CommonUserParameterDataV4) ID() string { return "HIUPA" } +func (c *CommonUserParameterDataV4) ID() string { return CommonUserParameterDataID } func (c *CommonUserParameterDataV4) referencedId() string { return "HKVVB" } func (c *CommonUserParameterDataV4) sender() string { return senderBank } From bba884f6b377453f52413ebd2f0fb0f2eb0cb6e8 Mon Sep 17 00:00:00 2001 From: Michael Wagner Date: Tue, 29 Mar 2022 15:33:12 +0200 Subject: [PATCH 5/7] refac: rename segment number to 'position' This communicates the real purpose of having the number in it. --- dialog/dialog.go | 6 +++--- element/acknowledgement.go | 22 +++++++++++----------- element/segment_header.go | 4 ++-- message/decryption.go | 4 ++-- message/message.go | 32 ++++++++++++++++---------------- segment/acknowledgement.go | 4 ++-- segment/key_management.go | 4 ++-- segment/segment.go | 14 +++++++------- 8 files changed, 45 insertions(+), 45 deletions(-) diff --git a/dialog/dialog.go b/dialog/dialog.go index feab2fd..f657564 100644 --- a/dialog/dialog.go +++ b/dialog/dialog.go @@ -213,7 +213,7 @@ func (d *dialog) SendAnonymousMessage(clientMessage message.HBCIMessage) (messag defer func() { logErr(d.anonymousEnd()) }() // TODO: add checks if job needs signature or not requestMessage := d.newBasicMessage(clientMessage) - requestMessage.SetNumbers() + requestMessage.SetSegmentPositions() bankMessage, err := d.request(requestMessage) if err != nil { return nil, err @@ -243,7 +243,7 @@ func (d *dialog) anonymousInit() error { d.BankParameterDataVersion(), d.UserParameterDataVersion(), d.Language, ) initMessage.BasicMessage = d.newBasicMessage(initMessage) - initMessage.SetNumbers() + initMessage.SetSegmentPositions() bankMessage, err := d.request(initMessage) if err != nil { return err @@ -289,7 +289,7 @@ func (d *dialog) anonymousInit() error { func (d *dialog) anonymousEnd() error { dialogEnd := message.NewDialogFinishingMessage(d.hbciVersion, d.dialogID) dialogEnd.BasicMessage = d.newBasicMessage(dialogEnd) - dialogEnd.SetNumbers() + dialogEnd.SetSegmentPositions() decryptedMessage, err := d.request(dialogEnd) if err != nil { diff --git a/element/acknowledgement.go b/element/acknowledgement.go index a96ec4c..df20e58 100644 --- a/element/acknowledgement.go +++ b/element/acknowledgement.go @@ -31,13 +31,13 @@ func NewAcknowledgement(acknowledgement domain.Acknowledgement) *Acknowledgement // transmit information from the bank institute to the client. type AcknowledgementDataElement struct { DataElement - Code *DigitDataElement - ReferenceDataElement *AlphaNumericDataElement - Text *AlphaNumericDataElement - Params *ParamsDataElement - referencingMessage domain.ReferencingMessage - referencingSegmentNumber int - typ string + Code *DigitDataElement + ReferenceDataElement *AlphaNumericDataElement + Text *AlphaNumericDataElement + Params *ParamsDataElement + referencingMessage domain.ReferencingMessage + referencingSegmentPosition int + typ string } // SetReferencingMessage is used by MessageAcknowledgements to set the reference @@ -47,10 +47,10 @@ func (a *AcknowledgementDataElement) SetReferencingMessage(reference domain.Refe a.referencingMessage = reference } -// SetReferencingSegmentNumber is a setter for setting the Segment number this +// SetReferencingSegmentPosition is a setter for setting the Segment position this // Acknowledgement is referring to. -func (a *AcknowledgementDataElement) SetReferencingSegmentNumber(number int) { - a.referencingSegmentNumber = number +func (a *AcknowledgementDataElement) SetReferencingSegmentPosition(position int) { + a.referencingSegmentPosition = position } // SetType sets the type of the Acknowledgement. There are only two types of @@ -71,7 +71,7 @@ func (a *AcknowledgementDataElement) Val() domain.Acknowledgement { Params: a.Params.Val(), Type: a.typ, ReferencingMessage: a.referencingMessage, - ReferencingSegmentNumber: a.referencingSegmentNumber, + ReferencingSegmentNumber: a.referencingSegmentPosition, } } diff --git a/element/segment_header.go b/element/segment_header.go index 0d62608..a18eeb7 100644 --- a/element/segment_header.go +++ b/element/segment_header.go @@ -4,9 +4,9 @@ import "fmt" // NewReferencingSegmentHeader returns a new SegmentHeader with a reference to // another segment -func NewReferencingSegmentHeader(id string, position, version, reference int) *SegmentHeader { +func NewReferencingSegmentHeader(id string, position, version, referencePosition int) *SegmentHeader { header := NewSegmentHeader(id, position, version) - header.Ref = NewNumber(reference, 3) + header.Ref = NewNumber(referencePosition, 3) return header } diff --git a/message/decryption.go b/message/decryption.go index 5ade72a..b742c32 100644 --- a/message/decryption.go +++ b/message/decryption.go @@ -82,7 +82,7 @@ func (d *decryptedMessage) FindSegments(segmentID string) []segment.Segment { return d.unmarshaler.SegmentsByID(segmentID) } -func (d *decryptedMessage) SegmentNumber(segmentID string) int { +func (d *decryptedMessage) SegmentPosition(segmentID string) int { seg := d.unmarshaler.MarshaledSegmentByID(segmentID) if len(seg) == 0 { return -1 @@ -96,7 +96,7 @@ func (d *decryptedMessage) SegmentNumber(segmentID string) int { if err != nil { return -1 } - return header.Number.Val() + return header.Position.Val() } func (d *decryptedMessage) HBCISegments() []segment.ClientSegment { diff --git a/message/message.go b/message/message.go index c149ca6..fc04b12 100644 --- a/message/message.go +++ b/message/message.go @@ -17,7 +17,7 @@ type Message interface { FindMarshaledSegments(segmentID string) [][]byte FindSegment(segmentID string) segment.Segment FindSegments(segmentID string) []segment.Segment - SegmentNumber(segmentID string) int + SegmentPosition(segmentID string) int } // ClientMessage represents a message composed by the client @@ -44,7 +44,7 @@ type HBCIMessage interface { // A SignedHBCIMessage represents a HBCI message that can be signed type SignedHBCIMessage interface { HBCIMessage - SetNumbers() + SetSegmentPositions() SetSignatureHeader(*segment.SignatureHeaderSegment) SetSignatureEnd(*segment.SignatureEndSegment) } @@ -107,8 +107,8 @@ type BasicMessage struct { marshaledContent []byte } -// SetNumbers sets the message number on every segment within the message -func (b *BasicMessage) SetNumbers() { +// SetSegmentPositions sets the message number on every segment within the message +func (b *BasicMessage) SetSegmentPositions() { if b.HBCIMessage == nil { panic(fmt.Errorf("HBCIMessage must be set")) } @@ -117,19 +117,19 @@ func (b *BasicMessage) SetNumbers() { n++ return n } - b.Header.SetNumber(num) + b.Header.SetPosition(num) if b.SignatureBegin != nil { - b.SignatureBegin.SetNumber(num) + b.SignatureBegin.SetPosition(num) } for _, segment := range b.HBCIMessage.HBCISegments() { if !reflect.ValueOf(segment).IsNil() { - segment.SetNumber(num) + segment.SetPosition(num) } } if b.SignatureEnd != nil { - b.SignatureEnd.SetNumber(num) + b.SignatureEnd.SetPosition(num) } - b.End.SetNumber(num) + b.End.SetPosition(num) } // SetSize writes the size of the marshaled message into the message header @@ -238,7 +238,7 @@ func (b *BasicMessage) Sign(provider SignatureProvider) (*BasicSignedMessage, er b.SignatureBegin = b.hbciVersion.SignatureHeader() provider.WriteSignatureHeader(b.SignatureBegin) b.SignatureEnd = b.hbciVersion.SignatureEnd() - b.SetNumbers() + b.SetSegmentPositions() var buffer bytes.Buffer buffer.WriteString(b.SignatureBegin.String()) for _, segment := range b.HBCIMessage.HBCISegments() { @@ -350,8 +350,8 @@ func (b *BasicMessage) FindMarshaledSegments(segmentID string) [][]byte { return segments } -// SegmentNumber returns the segment number for the given segmentID -func (b *BasicMessage) SegmentNumber(segmentID string) int { +// SegmentPosition returns the segment position for the given segmentID +func (b *BasicMessage) SegmentPosition(segmentID string) int { idx := -1 // TODO: implement //for i, segment := range b.HBCIMessage.HBCISegments() { @@ -373,12 +373,12 @@ type BasicSignedMessage struct { message *BasicMessage } -// SetNumbers sets the message numbers in all segments -func (b *BasicSignedMessage) SetNumbers() { +// SetSegmentPositions sets the message numbers in all segments +func (b *BasicSignedMessage) SetSegmentPositions() { if b.message.SignatureBegin == nil || b.message.SignatureEnd == nil { - panic(fmt.Errorf("Cannot call set Numbers when signature is not set")) + panic(fmt.Errorf("Cannot set segment positions when signature is not set")) } - b.message.SetNumbers() + b.message.SetSegmentPositions() } // SetSignatureHeader sets the SignatureHeader diff --git a/segment/acknowledgement.go b/segment/acknowledgement.go index 834e20d..13719ba 100644 --- a/segment/acknowledgement.go +++ b/segment/acknowledgement.go @@ -40,7 +40,7 @@ func (m *MessageAcknowledgement) UnmarshalHBCI(value []byte) error { return err } if segmentRef := seg.Header().ReferencingSegment(); segmentRef != -1 { - ack.SetReferencingSegmentNumber(segmentRef) + ack.SetReferencingSegmentPosition(segmentRef) } ack.SetReferencingMessage(m.referencingMessage) ack.SetType(domain.MessageAcknowledgement) @@ -105,7 +105,7 @@ func (s *SegmentAcknowledgement) UnmarshalHBCI(value []byte) error { if err != nil { return err } - ack.SetReferencingSegmentNumber(seg.Header().ReferencingSegment()) + ack.SetReferencingSegmentPosition(seg.Header().ReferencingSegment()) ack.SetReferencingMessage(s.referencingMessage) ack.SetType(domain.SegmentAcknowledgement) acknowledgements[i] = ack diff --git a/segment/key_management.go b/segment/key_management.go index 94e2a6e..50acade 100644 --- a/segment/key_management.go +++ b/segment/key_management.go @@ -96,7 +96,7 @@ func NewPublicKeyTransmissionSegment(dialogId string, number int, messageReferen KeyName: element.NewKeyName(keyName), PublicKey: element.NewPublicKey(pubKey), } - header := element.NewReferencingSegmentHeader("HIISA", number, 2, refSegment.Header().Number.Val()) + header := element.NewReferencingSegmentHeader("HIISA", number, 2, refSegment.Header().Position.Val()) p.Segment = NewBasicSegmentWithHeader(header, p) return p } @@ -205,7 +205,7 @@ func NewPublicKeyRevocationConfirmationSegment(dialogId string, number int, mess RevocationReason: element.NewAlphaNumeric(reason, 3), Date: element.NewSecurityDate(element.SecurityTimestamp, time.Now()), } - header := element.NewReferencingSegmentHeader("HISSP", number, 2, refSegment.Header().Number.Val()) + header := element.NewReferencingSegmentHeader("HISSP", number, 2, refSegment.Header().Position.Val()) p.Segment = NewBasicSegmentWithHeader(header, p) return p } diff --git a/segment/segment.go b/segment/segment.go index 5943fe4..b814b55 100644 --- a/segment/segment.go +++ b/segment/segment.go @@ -17,7 +17,7 @@ const ( type Segment interface { Header() *element.SegmentHeader - SetNumber(func() int) + SetPosition(func() int) String() string } @@ -62,13 +62,13 @@ func SegmentFromHeaderBytes(headerBytes []byte, seg basicSegment) (*segment, err return NewBasicSegmentWithHeader(header, seg), nil } -func NewReferencingBasicSegment(number int, ref int, seg basicSegment) *segment { - header := element.NewReferencingSegmentHeader(seg.ID(), number, seg.Version(), ref) +func NewReferencingBasicSegment(position int, ref int, seg basicSegment) *segment { + header := element.NewReferencingSegmentHeader(seg.ID(), position, seg.Version(), ref) return NewBasicSegmentWithHeader(header, seg) } -func NewBasicSegment(number int, seg basicSegment) *segment { - header := element.NewSegmentHeader(seg.ID(), number, seg.Version()) +func NewBasicSegment(position int, seg basicSegment) *segment { + header := element.NewSegmentHeader(seg.ID(), position, seg.Version()) return NewBasicSegmentWithHeader(header, seg) } @@ -135,8 +135,8 @@ func (s *segment) Version() int { return s.header.Version.Val() } -func (s *segment) SetNumber(numberFn func() int) { - s.header.SetNumber(numberFn()) +func (s *segment) SetPosition(positionFn func() int) { + s.header.SetPosition(positionFn()) } func (s *segment) SetReference(ref int) { From 70655cca6e8915979d299134c4b944e4d2d1ba9b Mon Sep 17 00:00:00 2001 From: Michael Wagner Date: Tue, 29 Mar 2022 15:35:05 +0200 Subject: [PATCH 6/7] refac: make type name more speaking This should communicate better that the thing we're dealing with is not a full message but just some sort of pointer to a message in terms of the domain/protocol as such. --- domain/acknowledgement.go | 2 +- domain/message.go | 4 ++-- element/acknowledgement.go | 4 ++-- element/message.go | 4 ++-- segment/acknowledgement.go | 8 ++++---- segment/message_header.go | 6 +++--- segment/message_header_test.go | 2 +- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/domain/acknowledgement.go b/domain/acknowledgement.go index 2258fa8..e8bc244 100644 --- a/domain/acknowledgement.go +++ b/domain/acknowledgement.go @@ -43,7 +43,7 @@ type Acknowledgement struct { ReferenceDataElement string Text string Params []string - ReferencingMessage ReferencingMessage + ReferencingMessage MessageReference ReferencingSegmentNumber int } diff --git a/domain/message.go b/domain/message.go index f8a7d27..3e85284 100644 --- a/domain/message.go +++ b/domain/message.go @@ -1,8 +1,8 @@ package domain -// ReferencingMessage represents a reference to another message within a given +// MessageReference represents a reference to another message within a given // dialog -type ReferencingMessage struct { +type MessageReference struct { DialogID string MessageNumber int } diff --git a/element/acknowledgement.go b/element/acknowledgement.go index df20e58..c28ff54 100644 --- a/element/acknowledgement.go +++ b/element/acknowledgement.go @@ -35,7 +35,7 @@ type AcknowledgementDataElement struct { ReferenceDataElement *AlphaNumericDataElement Text *AlphaNumericDataElement Params *ParamsDataElement - referencingMessage domain.ReferencingMessage + referencingMessage domain.MessageReference referencingSegmentPosition int typ string } @@ -43,7 +43,7 @@ type AcknowledgementDataElement struct { // SetReferencingMessage is used by MessageAcknowledgements to set the reference // to the previously sent message. This is needed to identify the message within // an ongoing dialog. -func (a *AcknowledgementDataElement) SetReferencingMessage(reference domain.ReferencingMessage) { +func (a *AcknowledgementDataElement) SetReferencingMessage(reference domain.MessageReference) { a.referencingMessage = reference } diff --git a/element/message.go b/element/message.go index afbca16..4b1c409 100644 --- a/element/message.go +++ b/element/message.go @@ -28,8 +28,8 @@ type ReferencingMessageDataElement struct { } // Val returns the value of r as domain.ReferencingMessage -func (r *ReferencingMessageDataElement) Val() domain.ReferencingMessage { - return domain.ReferencingMessage{ +func (r *ReferencingMessageDataElement) Val() domain.MessageReference { + return domain.MessageReference{ DialogID: r.DialogID.Val(), MessageNumber: r.MessageNumber.Val(), } diff --git a/segment/acknowledgement.go b/segment/acknowledgement.go index 13719ba..a9e6ec6 100644 --- a/segment/acknowledgement.go +++ b/segment/acknowledgement.go @@ -10,7 +10,7 @@ import ( type MessageAcknowledgement struct { Segment acknowledgements []*element.AcknowledgementDataElement - referencingMessage domain.ReferencingMessage + referencingMessage domain.MessageReference } func (m *MessageAcknowledgement) Version() int { return 2 } @@ -50,7 +50,7 @@ func (m *MessageAcknowledgement) UnmarshalHBCI(value []byte) error { return nil } -func (m *MessageAcknowledgement) SetReferencingMessage(reference domain.ReferencingMessage) { +func (m *MessageAcknowledgement) SetReferencingMessage(reference domain.MessageReference) { m.referencingMessage = reference } @@ -76,7 +76,7 @@ func (m *MessageAcknowledgement) elements() []element.DataElement { type SegmentAcknowledgement struct { Segment acknowledgements []*element.AcknowledgementDataElement - referencingMessage domain.ReferencingMessage + referencingMessage domain.MessageReference } func (s *SegmentAcknowledgement) Version() int { return 2 } @@ -114,7 +114,7 @@ func (s *SegmentAcknowledgement) UnmarshalHBCI(value []byte) error { return nil } -func (s *SegmentAcknowledgement) SetReferencingMessage(reference domain.ReferencingMessage) { +func (s *SegmentAcknowledgement) SetReferencingMessage(reference domain.MessageReference) { s.referencingMessage = reference } diff --git a/segment/message_header.go b/segment/message_header.go index 1087b3f..b41e2e5 100644 --- a/segment/message_header.go +++ b/segment/message_header.go @@ -7,7 +7,7 @@ import ( const MessageHeaderID string = "HNHBK" -func NewReferencingMessageHeaderSegment(size int, hbciVersion int, dialogId string, number int, referencingMessage domain.ReferencingMessage) *MessageHeaderSegment { +func NewReferencingMessageHeaderSegment(size int, hbciVersion int, dialogId string, number int, referencingMessage domain.MessageReference) *MessageHeaderSegment { m := NewMessageHeaderSegment(size, hbciVersion, dialogId, number) m.Ref = element.NewReferencingMessage(referencingMessage.DialogID, referencingMessage.MessageNumber) return m @@ -40,8 +40,8 @@ func (m *MessageHeaderSegment) ID() string { return MessageHeaderID } func (m *MessageHeaderSegment) referencedId() string { return "" } func (m *MessageHeaderSegment) sender() string { return senderBoth } -func (m *MessageHeaderSegment) ReferencingMessage() domain.ReferencingMessage { - var reference domain.ReferencingMessage +func (m *MessageHeaderSegment) ReferencingMessage() domain.MessageReference { + var reference domain.MessageReference if m.Ref != nil { reference = m.Ref.Val() } diff --git a/segment/message_header_test.go b/segment/message_header_test.go index 66a45a5..99632a4 100644 --- a/segment/message_header_test.go +++ b/segment/message_header_test.go @@ -37,7 +37,7 @@ func TestMessageHeaderSegmentUnmarshalHBCI(t *testing.T) { } expected = NewReferencingMessageHeaderSegment( - 123, 220, "dialogID", 3, domain.ReferencingMessage{DialogID: "abcde", MessageNumber: 1}, + 123, 220, "dialogID", 3, domain.MessageReference{DialogID: "abcde", MessageNumber: 1}, ).String() actual = header.String() From 924fd4bd7f5d3f491612129d22828dcdfb048a49 Mon Sep 17 00:00:00 2001 From: Michael Wagner Date: Wed, 30 Mar 2022 15:09:26 +0200 Subject: [PATCH 7/7] chore(segment): annotate generated files --- cmd/unmarshaler/unmarshaler_generator.go | 2 +- generator/segment_unmarshaler.go | 22 +++++++++++++++++-- ...t_segment_custom_interfaces_unmarshaler.go | 2 ++ ...iple_versioned_test_segment_unmarshaler.go | 2 ++ .../test_files/test_segment_unmarshaler.go | 2 ++ ...st_segment_custom_interface_unmarshaler.go | 2 ++ .../versioned_test_segment_unmarshaler.go | 2 ++ segment/account_balance_unmarshaler.go | 2 ++ segment/account_information_unmarshaler.go | 2 ++ segment/account_transaction_unmarshaler.go | 2 ++ segment/bank_announcement_unmarshaler.go | 2 ++ .../basic_account_information_unmarshaler.go | 2 ++ .../common_bank_parameter_data_unmarshaler.go | 2 ++ segment/communication_access_unmarshaler.go | 2 ++ segment/encrypted_data_unmarshaler.go | 2 ++ segment/encryption_header_unmarshaler.go | 2 ++ segment/message_end_unmarshaler.go | 2 ++ segment/message_header_unmarshaler.go | 2 ++ segment/signature_header_unmarshaler.go | 2 ++ segment/status_protocol_unmarshaler.go | 2 ++ ...upported_compression_method_unmarshaler.go | 2 ++ .../supported_security_method_unmarshaler.go | 2 ++ segment/sync_unmarshaler.go | 2 ++ segment/user_parameter_data_unmarshaler.go | 2 ++ 24 files changed, 65 insertions(+), 3 deletions(-) diff --git a/cmd/unmarshaler/unmarshaler_generator.go b/cmd/unmarshaler/unmarshaler_generator.go index 576224c..d33b62b 100644 --- a/cmd/unmarshaler/unmarshaler_generator.go +++ b/cmd/unmarshaler/unmarshaler_generator.go @@ -63,7 +63,7 @@ func main() { } defer file.Close() fileSet = token.NewFileSet() - newAstFile, err := parser.ParseFile(fileSet, newFileName, generated, 0) + newAstFile, err := parser.ParseFile(fileSet, newFileName, generated, parser.ParseComments) if err != nil { fmt.Println(err) } diff --git a/generator/segment_unmarshaler.go b/generator/segment_unmarshaler.go index edac764..60fcbda 100644 --- a/generator/segment_unmarshaler.go +++ b/generator/segment_unmarshaler.go @@ -46,6 +46,7 @@ func (s *SegmentUnmarshalerGenerator) Generate() (io.Reader, error) { r, _ := utf8.DecodeRuneInString(s.segment.Name) nameVar := string(unicode.ToLower(r)) templObj := &segmentTemplateObject{ + CodeGenerator: fmt.Sprintf("%T", s), Package: s.packageName, Name: s.segment.Name, NameVar: nameVar, @@ -92,6 +93,7 @@ func (v *VersionedSegmentUnmarshalerGenerator) Generate() (io.Reader, error) { r, _ := utf8.DecodeRuneInString(version.Name) nameVar := string(unicode.ToLower(r)) templObj := &segmentTemplateObject{ + CodeGenerator: fmt.Sprintf("%T", v), Package: v.packageName, Name: version.Name, NameVar: nameVar, @@ -104,6 +106,7 @@ func (v *VersionedSegmentUnmarshalerGenerator) Generate() (io.Reader, error) { r, _ := utf8.DecodeRuneInString(v.segment.Name) nameVar := string(unicode.ToLower(r)) templObj := &segmentTemplateObject{ + CodeGenerator: fmt.Sprintf("%T", v), Package: v.packageName, Name: v.segment.Name, NameVar: nameVar, @@ -138,6 +141,10 @@ func (s *segmentTemplateExecutor) execute() (io.Reader, error) { if err != nil { return nil, fmt.Errorf("Error while parsing template: %v", err) } + t, err = t.Parse(generationNoticeTemplate) + if err != nil { + return nil, fmt.Errorf("Error while parsing template: %v", err) + } var buf bytes.Buffer err = t.Execute(&buf, s.templateObject) if err != nil { @@ -147,6 +154,7 @@ func (s *segmentTemplateExecutor) execute() (io.Reader, error) { } type segmentTemplateObject struct { + CodeGenerator string Package string Name string NameVar string @@ -219,7 +227,12 @@ func (s *structVisitor) Visit(node ast.Node) ast.Visitor { return s } -const segmentExecutorTemplate = `{{template "package_declaration" .}} +const generationNoticeTemplate = `{{ define "generation_notice" }}// Code generated by {{ .CodeGenerator }}; DO NOT EDIT. +{{ end }} +` + +const segmentExecutorTemplate = `{{template "generation_notice" .}} +{{template "package_declaration" .}} {{template "segment" .}} ` @@ -291,6 +304,10 @@ func (v *versionedSegmentTemplateExecutor) execute() (io.Reader, error) { if err != nil { return nil, fmt.Errorf("Error while parsing template: %v", err) } + t, err = t.Parse(generationNoticeTemplate) + if err != nil { + return nil, fmt.Errorf("Error while parsing template: %v", err) + } var buf bytes.Buffer err = t.Execute(&buf, v.templateObject) if err != nil { @@ -299,7 +316,8 @@ func (v *versionedSegmentTemplateExecutor) execute() (io.Reader, error) { return &buf, nil } -const versionedSegmentExecutorTemplate = `{{template "package_declaration" .}} +const versionedSegmentExecutorTemplate = `{{template "generation_notice" .}} +{{template "package_declaration" .}} {{template "versioned_segment" .}} ` diff --git a/generator/test_files/multiple_versioned_test_segment_custom_interfaces_unmarshaler.go b/generator/test_files/multiple_versioned_test_segment_custom_interfaces_unmarshaler.go index 8072428..814f456 100644 --- a/generator/test_files/multiple_versioned_test_segment_custom_interfaces_unmarshaler.go +++ b/generator/test_files/multiple_versioned_test_segment_custom_interfaces_unmarshaler.go @@ -1,3 +1,5 @@ +// Code generated by *generator.VersionedSegmentUnmarshalerGenerator; DO NOT EDIT. + package test_files import ( diff --git a/generator/test_files/multiple_versioned_test_segment_unmarshaler.go b/generator/test_files/multiple_versioned_test_segment_unmarshaler.go index 2247f85..e203628 100644 --- a/generator/test_files/multiple_versioned_test_segment_unmarshaler.go +++ b/generator/test_files/multiple_versioned_test_segment_unmarshaler.go @@ -1,3 +1,5 @@ +// Code generated by *generator.VersionedSegmentUnmarshalerGenerator; DO NOT EDIT. + package test_files import ( diff --git a/generator/test_files/test_segment_unmarshaler.go b/generator/test_files/test_segment_unmarshaler.go index 63f3b92..87dc5b5 100644 --- a/generator/test_files/test_segment_unmarshaler.go +++ b/generator/test_files/test_segment_unmarshaler.go @@ -1,3 +1,5 @@ +// Code generated by *generator.SegmentUnmarshalerGenerator; DO NOT EDIT. + package test_files import ( diff --git a/generator/test_files/versioned_test_segment_custom_interface_unmarshaler.go b/generator/test_files/versioned_test_segment_custom_interface_unmarshaler.go index 2d52647..46a129b 100644 --- a/generator/test_files/versioned_test_segment_custom_interface_unmarshaler.go +++ b/generator/test_files/versioned_test_segment_custom_interface_unmarshaler.go @@ -1,3 +1,5 @@ +// Code generated by *generator.VersionedSegmentUnmarshalerGenerator; DO NOT EDIT. + package test_files import ( diff --git a/generator/test_files/versioned_test_segment_unmarshaler.go b/generator/test_files/versioned_test_segment_unmarshaler.go index 37fb011..cff7023 100644 --- a/generator/test_files/versioned_test_segment_unmarshaler.go +++ b/generator/test_files/versioned_test_segment_unmarshaler.go @@ -1,3 +1,5 @@ +// Code generated by *generator.VersionedSegmentUnmarshalerGenerator; DO NOT EDIT. + package test_files import ( diff --git a/segment/account_balance_unmarshaler.go b/segment/account_balance_unmarshaler.go index 613708e..af68e0b 100644 --- a/segment/account_balance_unmarshaler.go +++ b/segment/account_balance_unmarshaler.go @@ -1,3 +1,5 @@ +// Code generated by *generator.SegmentUnmarshalerGenerator; DO NOT EDIT. + package segment import ( diff --git a/segment/account_information_unmarshaler.go b/segment/account_information_unmarshaler.go index 275ffc4..677231a 100644 --- a/segment/account_information_unmarshaler.go +++ b/segment/account_information_unmarshaler.go @@ -1,3 +1,5 @@ +// Code generated by *generator.SegmentUnmarshalerGenerator; DO NOT EDIT. + package segment import ( diff --git a/segment/account_transaction_unmarshaler.go b/segment/account_transaction_unmarshaler.go index 6ce68f4..e2aa71d 100644 --- a/segment/account_transaction_unmarshaler.go +++ b/segment/account_transaction_unmarshaler.go @@ -1,3 +1,5 @@ +// Code generated by *generator.VersionedSegmentUnmarshalerGenerator; DO NOT EDIT. + package segment import ( diff --git a/segment/bank_announcement_unmarshaler.go b/segment/bank_announcement_unmarshaler.go index d7038c6..bb73f5c 100644 --- a/segment/bank_announcement_unmarshaler.go +++ b/segment/bank_announcement_unmarshaler.go @@ -1,3 +1,5 @@ +// Code generated by *generator.SegmentUnmarshalerGenerator; DO NOT EDIT. + package segment import ( diff --git a/segment/basic_account_information_unmarshaler.go b/segment/basic_account_information_unmarshaler.go index cd91896..b4d8bf6 100644 --- a/segment/basic_account_information_unmarshaler.go +++ b/segment/basic_account_information_unmarshaler.go @@ -1,3 +1,5 @@ +// Code generated by *generator.VersionedSegmentUnmarshalerGenerator; DO NOT EDIT. + package segment import ( diff --git a/segment/common_bank_parameter_data_unmarshaler.go b/segment/common_bank_parameter_data_unmarshaler.go index d744f17..e923d12 100644 --- a/segment/common_bank_parameter_data_unmarshaler.go +++ b/segment/common_bank_parameter_data_unmarshaler.go @@ -1,3 +1,5 @@ +// Code generated by *generator.VersionedSegmentUnmarshalerGenerator; DO NOT EDIT. + package segment import ( diff --git a/segment/communication_access_unmarshaler.go b/segment/communication_access_unmarshaler.go index 13094c7..b9aac04 100644 --- a/segment/communication_access_unmarshaler.go +++ b/segment/communication_access_unmarshaler.go @@ -1,3 +1,5 @@ +// Code generated by *generator.SegmentUnmarshalerGenerator; DO NOT EDIT. + package segment import ( diff --git a/segment/encrypted_data_unmarshaler.go b/segment/encrypted_data_unmarshaler.go index 0050d22..452e276 100644 --- a/segment/encrypted_data_unmarshaler.go +++ b/segment/encrypted_data_unmarshaler.go @@ -1,3 +1,5 @@ +// Code generated by *generator.SegmentUnmarshalerGenerator; DO NOT EDIT. + package segment import ( diff --git a/segment/encryption_header_unmarshaler.go b/segment/encryption_header_unmarshaler.go index 4febc4f..6f2640f 100644 --- a/segment/encryption_header_unmarshaler.go +++ b/segment/encryption_header_unmarshaler.go @@ -1,3 +1,5 @@ +// Code generated by *generator.VersionedSegmentUnmarshalerGenerator; DO NOT EDIT. + package segment import ( diff --git a/segment/message_end_unmarshaler.go b/segment/message_end_unmarshaler.go index 4491862..c57b0bd 100644 --- a/segment/message_end_unmarshaler.go +++ b/segment/message_end_unmarshaler.go @@ -1,3 +1,5 @@ +// Code generated by *generator.SegmentUnmarshalerGenerator; DO NOT EDIT. + package segment import ( diff --git a/segment/message_header_unmarshaler.go b/segment/message_header_unmarshaler.go index 4b4dfcb..c5bd9dc 100644 --- a/segment/message_header_unmarshaler.go +++ b/segment/message_header_unmarshaler.go @@ -1,3 +1,5 @@ +// Code generated by *generator.SegmentUnmarshalerGenerator; DO NOT EDIT. + package segment import ( diff --git a/segment/signature_header_unmarshaler.go b/segment/signature_header_unmarshaler.go index 24f5d62..8f80dec 100644 --- a/segment/signature_header_unmarshaler.go +++ b/segment/signature_header_unmarshaler.go @@ -1,3 +1,5 @@ +// Code generated by *generator.VersionedSegmentUnmarshalerGenerator; DO NOT EDIT. + package segment import ( diff --git a/segment/status_protocol_unmarshaler.go b/segment/status_protocol_unmarshaler.go index b540ac9..d946475 100644 --- a/segment/status_protocol_unmarshaler.go +++ b/segment/status_protocol_unmarshaler.go @@ -1,3 +1,5 @@ +// Code generated by *generator.VersionedSegmentUnmarshalerGenerator; DO NOT EDIT. + package segment import ( diff --git a/segment/supported_compression_method_unmarshaler.go b/segment/supported_compression_method_unmarshaler.go index d43e005..4bfdb40 100644 --- a/segment/supported_compression_method_unmarshaler.go +++ b/segment/supported_compression_method_unmarshaler.go @@ -1,3 +1,5 @@ +// Code generated by *generator.SegmentUnmarshalerGenerator; DO NOT EDIT. + package segment import ( diff --git a/segment/supported_security_method_unmarshaler.go b/segment/supported_security_method_unmarshaler.go index 2726f25..d87c4bb 100644 --- a/segment/supported_security_method_unmarshaler.go +++ b/segment/supported_security_method_unmarshaler.go @@ -1,3 +1,5 @@ +// Code generated by *generator.SegmentUnmarshalerGenerator; DO NOT EDIT. + package segment import ( diff --git a/segment/sync_unmarshaler.go b/segment/sync_unmarshaler.go index 674dddf..ebc92ae 100644 --- a/segment/sync_unmarshaler.go +++ b/segment/sync_unmarshaler.go @@ -1,3 +1,5 @@ +// Code generated by *generator.VersionedSegmentUnmarshalerGenerator; DO NOT EDIT. + package segment import ( diff --git a/segment/user_parameter_data_unmarshaler.go b/segment/user_parameter_data_unmarshaler.go index 006e1e7..2140a81 100644 --- a/segment/user_parameter_data_unmarshaler.go +++ b/segment/user_parameter_data_unmarshaler.go @@ -1,3 +1,5 @@ +// Code generated by *generator.VersionedSegmentUnmarshalerGenerator; DO NOT EDIT. + package segment import (