// DeleteItem removes a Item func DeleteItem(item Item) error { cfDict, err := ConvertMapToCFDictionary(item.attr) if err != nil { return err } defer Release(C.CFTypeRef(cfDict)) errCode := C.SecItemDelete(cfDict) return checkError(errCode) }
// DeleteItem removes a Item func DeleteItem(item Item) error { cfDict, err := convertAttr(item.attr) if err != nil { return err } defer C.CFRelease(C.CFTypeRef(cfDict)) errCode := C.SecItemDelete(cfDict) return checkError(errCode) }
func (k *keychain) Remove(key string) error { if _, err := os.Stat(k.Path); os.IsNotExist(err) { return ErrKeyNotFound } serviceRef, err := _UTF8StringToCFString(k.Service) if err != nil { return err } defer C.CFRelease(C.CFTypeRef(serviceRef)) accountRef, err := _UTF8StringToCFString(key) if err != nil { return err } defer C.CFRelease(C.CFTypeRef(serviceRef)) query := map[C.CFTypeRef]C.CFTypeRef{ C.CFTypeRef(C.kSecClass): C.CFTypeRef(C.kSecClassGenericPassword), C.CFTypeRef(C.kSecAttrService): C.CFTypeRef(serviceRef), C.CFTypeRef(C.kSecAttrAccount): C.CFTypeRef(accountRef), C.CFTypeRef(C.kSecMatchLimit): C.CFTypeRef(C.kSecMatchLimitOne), } kref, err := openKeychain(k.Path) if err != nil { return err } searchArray := arrayToCFArray([]C.CFTypeRef{C.CFTypeRef(kref)}) defer C.CFRelease(C.CFTypeRef(searchArray)) query[C.CFTypeRef(C.kSecMatchSearchList)] = C.CFTypeRef(searchArray) queryDict := mapToCFDictionary(query) defer C.CFRelease(C.CFTypeRef(queryDict)) log.Printf("Removing keychain item service=%q, account=%q from osx keychain %q", k.Service, key, k.Path) return newKeychainError(C.SecItemDelete(queryDict)) }