|
|
|
@ -27,6 +27,7 @@ import ( |
|
|
|
|
"errors" |
|
|
|
|
"fmt" |
|
|
|
|
"math/big" |
|
|
|
|
"regexp" |
|
|
|
|
"sort" |
|
|
|
|
"strings" |
|
|
|
|
"sync" |
|
|
|
@ -310,8 +311,10 @@ func (w *Wallet) Status() (string, error) { |
|
|
|
|
return fmt.Sprintf("Failed: %v", err), err |
|
|
|
|
} |
|
|
|
|
switch { |
|
|
|
|
case !w.session.verified && status.PinRetryCount == 0 && status.PukRetryCount == 0: |
|
|
|
|
return fmt.Sprintf("Bricked, waiting for full wipe"), nil |
|
|
|
|
case !w.session.verified && status.PinRetryCount == 0: |
|
|
|
|
return fmt.Sprintf("Blocked, waiting for PUK and new PIN"), nil |
|
|
|
|
return fmt.Sprintf("Blocked, waiting for PUK (%d attempts left) and new PIN", status.PukRetryCount), nil |
|
|
|
|
case !w.session.verified: |
|
|
|
|
return fmt.Sprintf("Locked, waiting for PIN (%d attempts left)", status.PinRetryCount), nil |
|
|
|
|
case !status.Initialized: |
|
|
|
@ -377,10 +380,18 @@ func (w *Wallet) Open(passphrase string) error { |
|
|
|
|
case passphrase == "": |
|
|
|
|
return ErrPINUnblockNeeded |
|
|
|
|
case status.PinRetryCount > 0: |
|
|
|
|
if !regexp.MustCompile(`^[0-9]{6,}$`).MatchString(passphrase) { |
|
|
|
|
w.log.Error("PIN needs to be at least 6 digits") |
|
|
|
|
return ErrPINNeeded |
|
|
|
|
} |
|
|
|
|
if err := w.session.verifyPin([]byte(passphrase)); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
default: |
|
|
|
|
if !regexp.MustCompile(`^[0-9]{12,}$`).MatchString(passphrase) { |
|
|
|
|
w.log.Error("PUK needs to be at least 12 digits") |
|
|
|
|
return ErrPINUnblockNeeded |
|
|
|
|
} |
|
|
|
|
if err := w.session.unblockPin([]byte(passphrase)); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|