diff --git a/TODO b/TODO index 8dec54c..f5ebb6a 100644 --- a/TODO +++ b/TODO @@ -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 diff --git a/blob_funcs.go b/blob_funcs.go index 5d585e4..8aaabb0 100644 --- a/blob_funcs.go +++ b/blob_funcs.go @@ -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 } diff --git a/blob_funcs_test.go b/blob_funcs_test.go index 240e6ee..eb3d671 100644 --- a/blob_funcs_test.go +++ b/blob_funcs_test.go @@ -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 +} diff --git a/consts_test.go b/consts_test.go new file mode 100644 index 0000000..d4c8340 --- /dev/null +++ b/consts_test.go @@ -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() +) diff --git a/errs.go b/errs.go index 2b5d190..a760b3a 100644 --- a/errs.go +++ b/errs.go @@ -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") +) diff --git a/folder_funcs.go b/folder_funcs.go index 12e0c05..ff549d8 100644 --- a/folder_funcs.go +++ b/folder_funcs.go @@ -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 } diff --git a/go.mod b/go.mod index 9b8411b..89416e3 100644 --- a/go.mod +++ b/go.mod @@ -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 +) diff --git a/go.sum b/go.sum index aeec758..4c667d8 100644 --- a/go.sum +++ b/go.sum @@ -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= diff --git a/map_funcs.go b/map_funcs.go index a1ebee8..55773ff 100644 --- a/map_funcs.go +++ b/map_funcs.go @@ -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 } diff --git a/multierror_funcs.go b/multierror_funcs.go index b5d96b4..e53f97a 100644 --- a/multierror_funcs.go +++ b/multierror_funcs.go @@ -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() } diff --git a/password_funcs.go b/password_funcs.go index 3bd1eb8..8fe45f1 100644 --- a/password_funcs.go +++ b/password_funcs.go @@ -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 } diff --git a/types.go b/types.go index a6901f3..e09e71a 100644 --- a/types.go +++ b/types.go @@ -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. diff --git a/unknownitem_funcs.go b/unknownitem_funcs.go index 2d4b54a..d21617f 100644 --- a/unknownitem_funcs.go +++ b/unknownitem_funcs.go @@ -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 } diff --git a/utils_test.go b/utils_test.go index 240e6ee..977fd53 100644 --- a/utils_test.go +++ b/utils_test.go @@ -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 +} diff --git a/wallet_funcs.go b/wallet_funcs.go index bee868f..60ea213 100644 --- a/wallet_funcs.go +++ b/wallet_funcs.go @@ -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(¬Exists); err != nil { + ); call.Err != nil { + err = call.Err + return + } + if err = call.Store(¬Exists); 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 } diff --git a/walletmanager_funcs.go b/walletmanager_funcs.go index 167e8c6..22c36b0 100644 --- a/walletmanager_funcs.go +++ b/walletmanager_funcs.go @@ -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