@@ -17,6 +17,7 @@ import (
17
17
18
18
decodepay "github.com/nbd-wtf/ln-decodepay"
19
19
"github.com/sirupsen/logrus"
20
+ "github.com/tyler-smith/go-bip32"
20
21
"golang.org/x/oauth2"
21
22
"gorm.io/gorm"
22
23
@@ -723,46 +724,58 @@ func (svc *albyOAuthService) ConsumeEvent(ctx context.Context, event *events.Eve
723
724
}
724
725
}
725
726
726
- func (svc * albyOAuthService ) backupChannels (ctx context.Context , event * events.Event ) error {
727
- bkpEvent , ok := event .Properties .(* events.StaticChannelsBackupEvent )
728
- if ! ok {
729
- return fmt .Errorf ("invalid nwc_backup_channels event properties, could not cast to the expected type: %+v" , event .Properties )
727
+ type channelsBackup struct {
728
+ Description string `json:"description"`
729
+ Data string `json:"data"`
730
+ }
731
+
732
+ func (svc * albyOAuthService ) createEncryptedChannelBackup (event * events.StaticChannelsBackupEvent ) (* channelsBackup , error ) {
733
+
734
+ eventData := bytes .NewBuffer ([]byte {})
735
+ err := json .NewEncoder (eventData ).Encode (event )
736
+ if err != nil {
737
+ return nil , fmt .Errorf ("failed to encode channels backup data: %w" , err )
730
738
}
731
739
732
- token , err := svc .fetchUserToken (ctx )
740
+ path := []uint32 {bip32 .FirstHardenedChild }
741
+ backupKey , err := svc .keys .DeriveKey (path )
733
742
if err != nil {
734
- return fmt .Errorf ("failed to fetch user token: %w" , err )
743
+ logger .Logger .WithError (err ).Error ("Failed to generate channels backup key" )
744
+ return nil , err
735
745
}
736
746
737
- client := svc .oauthConf .Client (ctx , token )
747
+ encrypted , err := config .AesGcmEncryptWithKey (eventData .String (), backupKey .Key )
748
+ if err != nil {
749
+ return nil , fmt .Errorf ("failed to encrypt channels backup data: %w" , err )
750
+ }
738
751
739
- type channelsBackup struct {
740
- Description string `json:"description"`
741
- Data string `json:"data"`
752
+ backup := & channelsBackup {
753
+ Description : "channels_v2" ,
754
+ Data : encrypted ,
742
755
}
756
+ return backup , nil
757
+ }
743
758
744
- eventData := bytes . NewBuffer ([] byte {})
745
- err = json . NewEncoder ( eventData ). Encode ( bkpEvent )
746
- if err != nil {
747
- return fmt .Errorf ("failed to encode channels backup data: %w " , err )
759
+ func ( svc * albyOAuthService ) backupChannels ( ctx context. Context , event * events. Event ) error {
760
+ bkpEvent , ok := event . Properties .( * events. StaticChannelsBackupEvent )
761
+ if ! ok {
762
+ return fmt .Errorf ("invalid nwc_backup_channels event properties, could not cast to the expected type: %+v " , event . Properties )
748
763
}
749
764
750
- // use the encrypted mnemonic as the password to encrypt the backup data
751
- encryptedMnemonic , err := svc .cfg .Get ("Mnemonic" , "" )
765
+ backup , err := svc .createEncryptedChannelBackup (bkpEvent )
752
766
if err != nil {
753
- return fmt .Errorf ("failed to fetch encryption key : %w" , err )
767
+ return fmt .Errorf ("failed to encrypt channel backup : %w" , err )
754
768
}
755
769
756
- encrypted , err := config . AesGcmEncrypt ( eventData . String (), encryptedMnemonic )
770
+ token , err := svc . fetchUserToken ( ctx )
757
771
if err != nil {
758
- return fmt .Errorf ("failed to encrypt channels backup data : %w" , err )
772
+ return fmt .Errorf ("failed to fetch user token : %w" , err )
759
773
}
760
774
775
+ client := svc .oauthConf .Client (ctx , token )
776
+
761
777
body := bytes .NewBuffer ([]byte {})
762
- err = json .NewEncoder (body ).Encode (& channelsBackup {
763
- Description : "channels" ,
764
- Data : encrypted ,
765
- })
778
+ err = json .NewEncoder (body ).Encode (backup )
766
779
if err != nil {
767
780
return fmt .Errorf ("failed to encode channels backup request payload: %w" , err )
768
781
}
0 commit comments