checking in for tests

This commit is contained in:
brent s. 2021-12-25 02:54:18 -05:00
parent 1f6cfd5883
commit 07c38ce23e
Signed by: bts
GPG Key ID: 8C004C2F93481F6B
16 changed files with 444 additions and 107 deletions

4
TODO
View File

@ -2,6 +2,8 @@
-- compat with kwalletmanager
--- Will require conversion to different struct model.

- walletCheck on all items' operations?
- walletCheck on all items' and folders' operations?

- close Dbus.Conn

- TESTS

View File

@ -12,7 +12,7 @@ import (
func NewBlob(f *Folder, keyName string, recursion *RecurseOpts) (blob *Blob, err error) {

if !f.isInit {
err = ErrNotInitialized
err = ErrInitFolder
return
}

@ -26,6 +26,7 @@ func NewBlob(f *Folder, keyName string, recursion *RecurseOpts) (blob *Blob, err
folder: f,
isInit: false,
}
blob.isInit = true

if blob.Recurse.AllWalletItems || blob.Recurse.Blobs {
if err = blob.Update(); err != nil {
@ -65,11 +66,16 @@ func (b *Blob) SetValue(newValue []byte) (err error) {
// Update fetches a Blob's Blob.Value.
func (b *Blob) Update() (err error) {

var call *dbus.Call
var v dbus.Variant

if err = b.Dbus.Call(
if call = b.Dbus.Call(
DbusWMReadEntry, 0, b.folder.wallet.handle, b.folder.Name, b.Name, b.folder.wallet.wm.AppID,
).Store(&v); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&v); err != nil {
return
}


View File

@ -1 +1,20 @@
package gokwallet

import (
"testing"
)

func TestNewBlob(t *testing.T) {

var err error
var f *Folder
var b *Blob

if _, _, f, err = getTestEnv(t); err != nil {
t.Fatalf("failure getting test env: %v", err)
}

// if b, err = NewBlob(f)
_ = f
_ = b
}

15
consts_test.go Normal file
View File

@ -0,0 +1,15 @@
package gokwallet

import (
"github.com/google/uuid"
)

// Strings.
const (
appIdTest string = "GoKwallet_Test"
)

var (
walletTest uuid.UUID = uuid.New()
folderTest uuid.UUID = uuid.New()
)

29
errs.go
View File

@ -11,14 +11,17 @@ var (
this would lead to a Wallet missing a handler).
It is intended as a safety check (so that you don't accidentally delete a wallet with e.g. a handler of 0 when
trying to delete a different wallet).
It's mostly a placeholder for more specific errors.
*/
ErrNotInitialized error = errors.New("object not properly initialized")
/*
ErrOperationFailed is a generic failure message that will occur of a Dbus operation returns non-success.
It is a placeholder for more specific messages.
*/
ErrOperationFailed error = errors.New("a Dbus operation has failed to execute successfully")
/*
ErrNoCreate is triggered if attempting to create an item (Folder, Password, etc.) but it fails.
It is a placeholder for more specific messages.
*/
ErrNoCreate error = errors.New("failed to create an object")
// ErrNoDisconnect can occur if trying to disconnect a Wallet from a WalletManager/application and a failure occurs.
@ -26,3 +29,29 @@ var (
// ErrInvalidMap will get triggered if a populated map[string]string (even an empty one) is expected but a nil is received.
ErrInvalidMap error = errors.New("invalid map; cannot be nil")
)

// Dbus Operation failures.
var (
// ErrDbusOpfailNoHandle returns when attempting to open a Wallet and assign to Wallet.handle but received a nil handle.
ErrDbusOpfailNoHandle error = errors.New("a wallet handler request returned nil")
// ErrDbusOpfailRemoveFolder occurs when attempting to delete/remove a Folder from a Wallet but it did not complete successfully.
ErrDbusOpfailRemoveFolder error = errors.New("failed to remove/delete a Folder from a Wallet")
)

// Initialization errors. They are more "detailed" ErrNotInitialized errors.
var (
// ErrInitWM occurs if a WalletManager is not initialized properly.
ErrInitWM error = errors.New("a WalletManager was not properly initialized")
// ErrInitWallet occurs if a Wallet is not initialized properly.
ErrInitWallet error = errors.New("a Wallet was not properly initialized")
// ErrInitFolder occurs if a Folder is not initialized properly.
ErrInitFolder error = errors.New("a Folder was not properly initialized")
// ErrInitBlob occurs if a Blob is not initialized properly.
ErrInitBlob error = errors.New("a Blob was not properly initialized")
// ErrInitMap occurs if a Map is not initialized properly.
ErrInitMap error = errors.New("a Map was not properly initialized")
// ErrInitPassword occurs if a Password is not initialized properly.
ErrInitPassword error = errors.New("a Password was not properly initialized")
// ErrInitUnknownItem occurs if an UnknownItem is not initialized properly.
ErrInitUnknownItem error = errors.New("an UnknownItem was not properly initialized")
)

View File

@ -12,7 +12,7 @@ import (
func NewFolder(w *Wallet, name string, recursion *RecurseOpts) (folder *Folder, err error) {

if !w.isInit {
err = ErrNotInitialized
err = ErrInitWallet
return
}

@ -29,6 +29,8 @@ func NewFolder(w *Wallet, name string, recursion *RecurseOpts) (folder *Folder,
isInit: false,
}

folder.isInit = true

if folder.Recurse.AllWalletItems ||
folder.Recurse.Passwords ||
folder.Recurse.Maps ||
@ -62,9 +64,15 @@ func (f *Folder) Delete() (err error) {
// HasEntry specifies if a Folder has an entry (WalletItem item) by the give entryName.
func (f *Folder) HasEntry(entryName string) (hasEntry bool, err error) {

if err = f.Dbus.Call(
var call *dbus.Call

if call = f.Dbus.Call(
DbusWMHasEntry, 0, f.wallet.handle, f.Name, entryName, f.wallet.wm.AppID,
).Store(&hasEntry); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&hasEntry); err != nil {
return
}

@ -78,9 +86,15 @@ func (f *Folder) HasEntry(entryName string) (hasEntry bool, err error) {
*/
func (f *Folder) KeyNotExist(entryName string) (doesNotExist bool, err error) {

if err = f.Dbus.Call(
var call *dbus.Call

if call = f.Dbus.Call(
DbusWMKeyNotExist, 0, f.wallet.Name, f.Name, entryName,
).Store(&doesNotExist); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&doesNotExist); err != nil {
return
}

@ -90,9 +104,15 @@ func (f *Folder) KeyNotExist(entryName string) (doesNotExist bool, err error) {
// ListEntries lists all entries (WalletItem items) in a Folder (regardless of type) by name.
func (f *Folder) ListEntries() (entryNames []string, err error) {

if err = f.Dbus.Call(
var call *dbus.Call

if call = f.Dbus.Call(
DbusWMEntryList, 0, f.wallet.handle, f.Name, f.wallet.wm.AppID,
).Store(&entryNames); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&entryNames); err != nil {
return
}

@ -102,11 +122,16 @@ func (f *Folder) ListEntries() (entryNames []string, err error) {
// RemoveEntry removes a WalletItem from a Folder given its entryName (key).
func (f *Folder) RemoveEntry(entryName string) (err error) {

var call *dbus.Call
var rslt int32

if err = f.Dbus.Call(
if call = f.Dbus.Call(
DbusWMRemoveEntry, 0, f.wallet.handle, f.Name, entryName, f.wallet.wm.AppID,
).Store(&rslt); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&rslt); err != nil {
return
}

@ -118,11 +143,16 @@ func (f *Folder) RemoveEntry(entryName string) (err error) {
// RenameEntry renames a WalletItem in a Folder from entryName to newEntryName.
func (f *Folder) RenameEntry(entryName, newEntryName string) (err error) {

var call *dbus.Call
var rslt int32

if err = f.Dbus.Call(
if call = f.Dbus.Call(
DbusWMRenameEntry, 0, f.wallet.handle, f.Name, entryName, newEntryName, f.wallet.wm.AppID,
).Store(&rslt); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&rslt); err != nil {
return
}

@ -171,19 +201,24 @@ func (f *Folder) Update() (err error) {
// UpdateBlobs updates (populates) a Folder's Folder.BinaryData.
func (f *Folder) UpdateBlobs() (err error) {

var call *dbus.Call
var mapKeys []string
var isBlob bool
var variant dbus.Variant
var errs []error = make([]error, 0)

if !f.isInit {
err = ErrNotInitialized
err = ErrInitFolder
return
}

if err = f.Dbus.Call(
if call = f.Dbus.Call(
DbusWMEntriesList, 0, f.wallet.handle, f.Name, f.wallet.wm.AppID,
).Store(&variant); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&variant); err != nil {
return
}

@ -218,13 +253,18 @@ func (f *Folder) UpdateBlobs() (err error) {
// UpdateMaps updates (populates) a Folder's Folder.Maps.
func (f *Folder) UpdateMaps() (err error) {

var call *dbus.Call
var mapKeys []string
var variant dbus.Variant
var errs []error = make([]error, 0)

if err = f.Dbus.Call(
if call = f.Dbus.Call(
DbusWMMapList, 0, f.wallet.handle, f.Name, f.wallet.wm.AppID,
).Store(&variant); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&variant); err != nil {
return
}

@ -250,18 +290,23 @@ func (f *Folder) UpdateMaps() (err error) {
// UpdatePasswords updates (populates) a Folder's Folder.Passwords.
func (f *Folder) UpdatePasswords() (err error) {

var call *dbus.Call
var mapKeys []string
var variant dbus.Variant
var errs []error = make([]error, 0)

if !f.isInit {
err = ErrNotInitialized
err = ErrInitFolder
return
}

if err = f.Dbus.Call(
if call = f.Dbus.Call(
DbusWMPasswordList, 0, f.wallet.handle, f.Name, f.wallet.wm.AppID,
).Store(&variant); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&variant); err != nil {
return
}

@ -287,19 +332,24 @@ func (f *Folder) UpdatePasswords() (err error) {
// UpdateUnknowns updates (populates) a Folder's Folder.Unknown.
func (f *Folder) UpdateUnknowns() (err error) {

var call *dbus.Call
var mapKeys []string
var isUnknown bool
var variant dbus.Variant
var errs []error = make([]error, 0)

if !f.isInit {
err = ErrNotInitialized
err = ErrInitFolder
return
}

if err = f.Dbus.Call(
if call = f.Dbus.Call(
DbusWMEntriesList, 0, f.wallet.handle, f.Name, f.wallet.wm.AppID,
).Store(&variant); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&variant); err != nil {
return
}

@ -352,6 +402,7 @@ func (f *Folder) WriteBlob(entryName string, entryValue []byte) (b *Blob, err er
*/
func (f *Folder) WriteEntry(entryName string, entryType kwalletdEnumType, entryValue []byte) (err error) {

var call *dbus.Call
var rslt int32

if entryType == KwalletdEnumTypeUnused {
@ -359,9 +410,13 @@ func (f *Folder) WriteEntry(entryName string, entryType kwalletdEnumType, entryV
return
}

if err = f.Dbus.Call(
if call = f.Dbus.Call(
DbusWMWriteEntry, 0, f.wallet.handle, f.Name, entryName, entryValue, int32(entryType), f.wallet.wm.AppID,
).Store(&rslt); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&rslt); err != nil {
return
}

@ -373,6 +428,7 @@ func (f *Folder) WriteEntry(entryName string, entryType kwalletdEnumType, entryV
// WriteMap adds or replaces a Map to/in a Folder.
func (f *Folder) WriteMap(entryName string, entryValue map[string]string) (m *Map, err error) {

var call *dbus.Call
var rslt int32
var b []byte

@ -380,9 +436,13 @@ func (f *Folder) WriteMap(entryName string, entryValue map[string]string) (m *Ma
return
}

if err = f.Dbus.Call(
if call = f.Dbus.Call(
DbusWMWriteMap, 0, f.wallet.handle, f.Name, entryName, b, f.wallet.wm.AppID,
).Store(&rslt); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&rslt); err != nil {
return
}

@ -398,11 +458,16 @@ func (f *Folder) WriteMap(entryName string, entryValue map[string]string) (m *Ma
// WritePassword adds or replaces a Password to/in a Folder.
func (f *Folder) WritePassword(entryName, entryValue string) (p *Password, err error) {

var call *dbus.Call
var rslt int32

if err = f.Dbus.Call(
if call = f.Dbus.Call(
DbusWMWritePassword, 0, f.wallet.handle, f.Name, entryName, entryValue, f.wallet.wm.AppID,
).Store(&rslt); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&rslt); err != nil {
return
}

@ -432,11 +497,16 @@ func (f *Folder) WriteUnknown(entryName string, entryValue []byte) (u *UnknownIt
// isType checks if a certain key keyName is of type typeCheck (via KwalletdEnumType*).
func (f *Folder) isType(keyName string, typeCheck kwalletdEnumType) (isOfType bool, err error) {

var call *dbus.Call
var entryType int32

if err = f.Dbus.Call(
if call = f.Dbus.Call(
DbusWMEntryType, 0, f.wallet.handle, f.Name, keyName, f.wallet.wm.AppID,
).Store(&entryType); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&entryType); err != nil {
return
}


5
go.mod
View File

@ -2,4 +2,7 @@ module r00t2.io/gokwallet

go 1.17

require github.com/godbus/dbus/v5 v5.0.6
require (
github.com/godbus/dbus/v5 v5.0.6
github.com/google/uuid v1.3.0
)

2
go.sum
View File

@ -1,2 +1,4 @@
github.com/godbus/dbus/v5 v5.0.6 h1:mkgN1ofwASrYnJ5W6U/BxG15eXXXjirgZc7CLqkcaro=
github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=

View File

@ -1,5 +1,9 @@
package gokwallet

import (
"github.com/godbus/dbus/v5"
)

/*
NewMap returns a Map. It requires a RecurseOpts
(you can use DefaultRecurseOpts, call NewRecurseOpts, or provide your own RecurseOpts struct).
@ -8,7 +12,7 @@ package gokwallet
func NewMap(f *Folder, keyName string, recursion *RecurseOpts) (m *Map, err error) {

if !f.isInit {
err = ErrNotInitialized
err = ErrInitFolder
return
}

@ -23,6 +27,8 @@ func NewMap(f *Folder, keyName string, recursion *RecurseOpts) (m *Map, err erro
isInit: false,
}

m.isInit = true

if m.Recurse.AllWalletItems || m.Recurse.Maps {
if err = m.Update(); err != nil {
return
@ -61,11 +67,16 @@ func (m *Map) SetValue(newValue map[string]string) (err error) {
// Update fetches a Map's Map.Value.
func (m *Map) Update() (err error) {

var call *dbus.Call
var b []byte

if err = m.Dbus.Call(
if call = m.Dbus.Call(
DbusWMReadMap, 0, m.folder.wallet.handle, m.folder.Name, m.Name, m.folder.wallet.wm.AppID,
).Store(&b); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&b); err != nil {
return
}


View File

@ -48,7 +48,7 @@ func (e *MultiError) Error() (errStr string) {

for idx, err := range e.Errors {
if (idx + 1) < numErrs {
errStr += fmt.Sprintf(err.Error(), e.ErrorSep)
errStr += fmt.Sprintf("%v%v", err.Error(), e.ErrorSep)
} else {
errStr += err.Error()
}

View File

@ -1,5 +1,9 @@
package gokwallet

import (
"github.com/godbus/dbus/v5"
)

/*
NewPassword returns a Password. It requires a RecurseOpts
(you can use DefaultRecurseOpts, call NewRecurseOpts, or provide your own RecurseOpts struct).
@ -8,7 +12,7 @@ package gokwallet
func NewPassword(f *Folder, keyName string, recursion *RecurseOpts) (password *Password, err error) {

if !f.isInit {
err = ErrNotInitialized
err = ErrInitFolder
return
}

@ -23,6 +27,8 @@ func NewPassword(f *Folder, keyName string, recursion *RecurseOpts) (password *P
isInit: false,
}

password.isInit = true

if password.Recurse.AllWalletItems || password.Recurse.Passwords {
if err = password.Update(); err != nil {
return
@ -61,11 +67,16 @@ func (p *Password) SetValue(newValue string) (err error) {
// Update fetches a Password's Password.Value.
func (p *Password) Update() (err error) {

var call *dbus.Call
var b []byte

if err = p.Dbus.Call(
if call = p.Dbus.Call(
DbusWMReadPassword, 0, p.folder.wallet.handle, p.folder.Name, p.Name, p.folder.wallet.wm.AppID,
).Store(&b); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&b); err != nil {
return
}


View File

@ -86,8 +86,10 @@ type Wallet struct {
wm *WalletManager
// handle is this Wallet's handler number.
handle int32
// isInit flags whether this is "properly" set up (i.e. has a handle).
// isInit flags whether this is "properly" set up.
isInit bool
// hasHandle specifies if this Wallet's Wallet.handle has been explicitly set yet.
hasHandle bool
}

// Folder contains secret object collections of Password, Map, Blob, and UnknownItem objects.

View File

@ -12,7 +12,7 @@ import (
func NewUnknownItem(f *Folder, keyName string, recursion *RecurseOpts) (unknown *UnknownItem, err error) {

if !f.isInit {
err = ErrNotInitialized
err = ErrInitFolder
return
}

@ -27,6 +27,8 @@ func NewUnknownItem(f *Folder, keyName string, recursion *RecurseOpts) (unknown
isInit: false,
}

unknown.isInit = true

if unknown.Recurse.AllWalletItems || unknown.Recurse.UnknownItems {
if err = unknown.Update(); err != nil {
return
@ -65,11 +67,16 @@ func (u *UnknownItem) SetValue(newValue []byte) (err error) {
// Update fetches an UnknownItem's UnknownItem.Value.
func (u *UnknownItem) Update() (err error) {

var call *dbus.Call
var v dbus.Variant

if err = u.Dbus.Call(
if call = u.Dbus.Call(
DbusWMReadEntry, 0, u.folder.wallet.handle, u.folder.Name, u.Name, u.folder.wallet.wm.AppID,
).Store(&v); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&v); err != nil {
return
}


View File

@ -1 +1,29 @@
package gokwallet

import (
"testing"
)

func getTestEnv(t *testing.T) (wm *WalletManager, w *Wallet, f *Folder, err error) {

var r *RecurseOpts = DefaultRecurseOpts

r.AllWalletItems = true

if wm, err = NewWalletManager(r, appIdTest); err != nil {
t.Errorf("failure when getting WalletManager '%v': %v", appIdTest, err)
return
}

if w, err = NewWallet(wm, walletTest.String(), wm.Recurse); err != nil {
t.Errorf("failure when getting Wallet '%v:%v': %v", appIdTest, walletTest.String(), err)
return
}

if f, err = NewFolder(w, folderTest.String(), w.Recurse); err != nil {
t.Errorf("failure when getting Folder '%v:%v:%v': %v", appIdTest, walletTest.String(), folderTest.String(), err)
return
}

return
}

View File

@ -12,7 +12,7 @@ import (
func NewWallet(wm *WalletManager, name string, recursion *RecurseOpts) (wallet *Wallet, err error) {

if !wm.isInit {
err = ErrNotInitialized
err = ErrInitWM
return
}

@ -26,6 +26,8 @@ func NewWallet(wm *WalletManager, name string, recursion *RecurseOpts) (wallet *
isInit: false,
}

wallet.isInit = true

// TODO: remove this and leave to caller, since it might use PamOpen instead? Fail back to it?
if err = wallet.walletCheck(); err != nil {
return
@ -45,15 +47,20 @@ func NewWallet(wm *WalletManager, name string, recursion *RecurseOpts) (wallet *
// Disconnect disconnects this Wallet from its parent WalletManager.
func (w *Wallet) Disconnect() (err error) {

var call *dbus.Call
var ok bool

if err = w.walletCheck(); err != nil {
return
}

if err = w.Dbus.Call(
if call = w.Dbus.Call(
DbusWMDisconnectApp, 0, w.Name, w.wm.AppID,
).Store(&ok); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&ok); err != nil {
return
}

@ -67,15 +74,20 @@ func (w *Wallet) Disconnect() (err error) {
// DisconnectApplication disconnects this Wallet from a specified WalletManager/application (see Wallet.Connections).
func (w *Wallet) DisconnectApplication(appName string) (err error) {

var call *dbus.Call
var ok bool

if err = w.walletCheck(); err != nil {
return
}

if err = w.Dbus.Call(
if call = w.Dbus.Call(
DbusWMDisconnectApp, 0, appName, w.wm.AppID,
).Store(&ok); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&ok); err != nil {
return
}

@ -88,7 +100,8 @@ func (w *Wallet) DisconnectApplication(appName string) (err error) {

/*
ChangePassword will change (or set) the password for a Wallet.
Note that this *must* be done via the windowing layer.
Note that this *must* be done via the windowing/graphical layer.
There is no way to change a Wallet's password via the Dbus API.
*/
func (w *Wallet) ChangePassword() (err error) {

@ -98,11 +111,12 @@ func (w *Wallet) ChangePassword() (err error) {
return
}

call = w.Dbus.Call(
if call = w.Dbus.Call(
DbusWMChangePassword, 0, w.Name, DefaultWindowID, w.wm.AppID,
)

err = call.Err
); call.Err != nil {
err = call.Err
return
}

return
}
@ -110,6 +124,7 @@ func (w *Wallet) ChangePassword() (err error) {
// Close closes a Wallet.
func (w *Wallet) Close() (err error) {

var call *dbus.Call
var rslt int32

if err = w.walletCheck(); err != nil {
@ -117,9 +132,13 @@ func (w *Wallet) Close() (err error) {
}

// Using a handler allows us to close access for this particular parent WalletManager.
if err = w.Dbus.Call(
if call = w.Dbus.Call(
DbusWMClose, 0, w.handle, false, w.wm.AppID,
).Store(&rslt); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&rslt); err != nil {
return
}

@ -131,13 +150,19 @@ func (w *Wallet) Close() (err error) {
// Connections lists the application names for connections to ("users of") this Wallet.
func (w *Wallet) Connections() (connList []string, err error) {

var call *dbus.Call

if err = w.walletCheck(); err != nil {
return
}

if err = w.Dbus.Call(
if call = w.Dbus.Call(
DbusWMUsers, 0, w.Name,
).Store(&connList); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&connList); err != nil {
return
}

@ -147,15 +172,20 @@ func (w *Wallet) Connections() (connList []string, err error) {
// CreateFolder creates a new Folder in a Wallet.
func (w *Wallet) CreateFolder(name string) (err error) {

var call *dbus.Call
var ok bool

if err = w.walletCheck(); err != nil {
return
}

if err = w.Dbus.Call(
if call = w.Dbus.Call(
DbusWMCreateFolder, 0, w.handle, name, w.wm.AppID,
).Store(&ok); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&ok); err != nil {
return
}

@ -169,15 +199,20 @@ func (w *Wallet) CreateFolder(name string) (err error) {
// Delete deletes a Wallet.
func (w *Wallet) Delete() (err error) {

var call *dbus.Call
var rslt int32

if err = w.walletCheck(); err != nil {
return
}

if err = w.Dbus.Call(
if call = w.Dbus.Call(
DbusWMDeleteWallet, 0, w.Name,
).Store(&rslt); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&rslt); err != nil {
return
}

@ -191,13 +226,18 @@ func (w *Wallet) Delete() (err error) {
// FolderExists indicates if a Folder exists in a Wallet or not.
func (w *Wallet) FolderExists(folderName string) (exists bool, err error) {

var call *dbus.Call
var notExists bool

// We don't need a walletcheck here since we don't need a handle.

if err = w.Dbus.Call(
if call = w.Dbus.Call(
DbusWMFolderNotExist, 0, w.Name, folderName,
).Store(&notExists); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&notExists); err != nil {
return
}

@ -212,6 +252,7 @@ func (w *Wallet) FolderExists(folderName string) (exists bool, err error) {
*/
func (w *Wallet) ForceClose() (err error) {

var call *dbus.Call
var rslt int32

if err = w.walletCheck(); err != nil {
@ -219,9 +260,13 @@ func (w *Wallet) ForceClose() (err error) {
}

// Using a handler allows us to close access for this particular parent WalletManager.
if err = w.Dbus.Call(
if call = w.Dbus.Call(
DbusWMClose, 0, w.handle, true, w.wm.AppID,
).Store(&rslt); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&rslt); err != nil {
return
}

@ -233,13 +278,19 @@ func (w *Wallet) ForceClose() (err error) {
// HasFolder indicates if a Wallet has a Folder in it named folderName.
func (w *Wallet) HasFolder(folderName string) (hasFolder bool, err error) {

var call *dbus.Call

if err = w.walletCheck(); err != nil {
return
}

if err = w.Dbus.Call(
if call = w.Dbus.Call(
DbusWMHasFolder, 0, w.handle, folderName, w.wm.AppID,
).Store(&hasFolder); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&hasFolder); err != nil {
return
}

@ -249,12 +300,22 @@ func (w *Wallet) HasFolder(folderName string) (hasFolder bool, err error) {
// IsOpen returns whether a Wallet is open ("unlocked") or not (as well as updates Wallet.IsOpen).
func (w *Wallet) IsOpen() (isOpen bool, err error) {

var call *dbus.Call

// We don't call walletcheck here because this method is called by a walletcheck.
if !w.isInit {
err = ErrInitWallet
return
}

// We can call the same method with w.handle instead of w.Name. We don't have a handler yet though.
if err = w.Dbus.Call(
if call = w.Dbus.Call(
DbusWMIsOpen, 0, w.Name,
).Store(&w.IsUnlocked); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&w.IsUnlocked); err != nil {
return
}

@ -266,13 +327,19 @@ func (w *Wallet) IsOpen() (isOpen bool, err error) {
// ListFolders lists all Folder names in a Wallet.
func (w *Wallet) ListFolders() (folderList []string, err error) {

var call *dbus.Call

if err = w.walletCheck(); err != nil {
return
}

if err = w.Dbus.Call(
if call = w.Dbus.Call(
DbusWMFolderList, 0, w.handle, w.wm.AppID,
).Store(&folderList); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&folderList); err != nil {
return
}

@ -285,27 +352,35 @@ func (w *Wallet) ListFolders() (folderList []string, err error) {
*/
func (w *Wallet) Open() (err error) {

var handler *int32
var call *dbus.Call
var handler *int32 = new(int32)

if err = w.walletCheck(); err != nil {
// We don't call walletcheck here because this method is called by a walletcheck.
if !w.isInit {
err = ErrInitWallet
return
}

if !w.IsUnlocked {
if err = w.Dbus.Call(
DbusWMOpen, 0,
).Store(handler); err != nil {
if !w.IsUnlocked || !w.hasHandle {
if call = w.Dbus.Call(
DbusWMOpen, 0, w.Name, DefaultWindowID, w.wm.AppID,
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(handler); err != nil {
return
}
}

if handler == nil {
err = ErrOperationFailed
err = ErrDbusOpfailNoHandle
return
} else {
w.handle = *handler
}

w.hasHandle = true
w.IsUnlocked = true

return
@ -317,20 +392,25 @@ func (w *Wallet) Open() (err error) {
*/
func (w *Wallet) RemoveFolder(folderName string) (err error) {

var call *dbus.Call
var success bool

if err = w.walletCheck(); err != nil {
return
}

if err = w.Dbus.Call(
if call = w.Dbus.Call(
DbusWMRemoveFolder, 0, w.handle, folderName, w.wm.AppID,
).Store(&success); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&success); err != nil {
return
}

if !success {
err = ErrOperationFailed
err = ErrDbusOpfailRemoveFolder
return
}

@ -373,7 +453,7 @@ func (w *Wallet) Update() (err error) {
func (w *Wallet) walletCheck() (err error) {

if !w.isInit {
err = ErrNotInitialized
err = ErrInitWallet
return
}

@ -381,7 +461,7 @@ func (w *Wallet) walletCheck() (err error) {
return
}

if !w.IsUnlocked {
if !w.IsUnlocked || !w.hasHandle {
if err = w.Open(); err != nil {
return
}

View File

@ -80,17 +80,23 @@ func NewWalletManagerFiles(recursion *RecurseOpts, appId string, filePaths ...st
for the specified Wallet - not just this WalletManager.
*/
func (wm *WalletManager) CloseWallet(walletName string) (err error) {

var call *dbus.Call
var rslt int32

if !wm.isInit {
err = ErrNotInitialized
err = ErrInitWM
return
}

// Using a handler allows us to close access for this particular parent WalletManager.
if err = wm.Dbus.Call(
if call = wm.Dbus.Call(
DbusWMClose, 0, walletName, false,
).Store(&rslt); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&rslt); err != nil {
return
}

@ -106,17 +112,22 @@ func (wm *WalletManager) CloseWallet(walletName string) (err error) {
*/
func (wm *WalletManager) ForceCloseWallet(walletName string) (err error) {

var call *dbus.Call
var rslt int32

if !wm.isInit {
err = ErrNotInitialized
err = ErrInitWM
return
}

// Using a handler allows us to close access for this particular parent WalletManager.
if err = wm.Dbus.Call(
if call = wm.Dbus.Call(
DbusWMClose, 0, walletName, false,
).Store(&rslt); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&rslt); err != nil {
return
}

@ -125,20 +136,25 @@ func (wm *WalletManager) ForceCloseWallet(walletName string) (err error) {
return
}

// CloseAllWallets closes all Wallet objects. They do *not* need to be part of WalletManager.Wallets.
/*
CloseAllWallets closes all Wallet objects. They do *not* need to be part of WalletManager.Wallets.
"All wallets" really means *all* wallets.
*/
func (wm *WalletManager) CloseAllWallets() (err error) {

var call *dbus.Call

if !wm.isInit {
err = ErrNotInitialized
err = ErrInitWM
return
}

call = wm.Dbus.Call(
if call = wm.Dbus.Call(
DbusWMCloseAllWallets, 0,
)
err = call.Err
); call.Err != nil {
err = call.Err
return
}

return
}
@ -146,14 +162,20 @@ func (wm *WalletManager) CloseAllWallets() (err error) {
// IsEnabled returns whether KWallet is enabled or not (and also updates WalletManager.Enabled).
func (wm *WalletManager) IsEnabled() (enabled bool, err error) {

var call *dbus.Call

if !wm.isInit {
err = ErrNotInitialized
err = ErrInitWM
return
}

if err = wm.Dbus.Call(
if call = wm.Dbus.Call(
DbusWMIsEnabled, 0,
).Store(&wm.Enabled); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&wm.Enabled); err != nil {
return
}

@ -165,11 +187,21 @@ func (wm *WalletManager) IsEnabled() (enabled bool, err error) {
// LocalWallet returns the "local" wallet (and updates WalletManager.Local).
func (wm *WalletManager) LocalWallet() (w *Wallet, err error) {

var call *dbus.Call
var wn string

if err = wm.Dbus.Call(
if !wm.isInit {
err = ErrInitWM
return
}

if call = wm.Dbus.Call(
DbusWMLocalWallet, 0,
).Store(&wn); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&wn); err != nil {
return
}

@ -185,11 +217,21 @@ func (wm *WalletManager) LocalWallet() (w *Wallet, err error) {
// NetworkWallet returns the "network" wallet (and updates WalletManager.Network).
func (wm *WalletManager) NetworkWallet() (w *Wallet, err error) {

var call *dbus.Call
var wn string

if err = wm.Dbus.Call(
if !wm.isInit {
err = ErrInitWM
return
}

if call = wm.Dbus.Call(
DbusWMNetWallet, 0,
).Store(&wn); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&wn); err != nil {
return
}

@ -205,9 +247,15 @@ func (wm *WalletManager) NetworkWallet() (w *Wallet, err error) {
// WalletNames returns a list of existing Wallet names.
func (wm *WalletManager) WalletNames() (wallets []string, err error) {

if err = wm.Dbus.Call(
var call *dbus.Call

if call = wm.Dbus.Call(
DbusWMWallets, 0,
).Store(&wallets); err != nil {
); call.Err != nil {
err = call.Err
return
}
if err = call.Store(&wallets); err != nil {
return
}

@ -221,7 +269,7 @@ func (wm *WalletManager) Update() (err error) {
var errs []error = make([]error, 0)

if !wm.isInit {
err = ErrNotInitialized
err = ErrInitWM
return
}

@ -268,6 +316,10 @@ func newWM(appId string, recursion *RecurseOpts, filePaths ...string) (wm *Walle

wm.isInit = true

if _, err = wm.IsEnabled(); err != nil {
return
}

if wm.Recurse.All || wm.Recurse.Wallets {
if err = wm.Update(); err != nil {
return