Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduce export: keePassHTTP -> KeePassHTTP #2

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 39 additions & 39 deletions keepasshttp/keepasshttp.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Package keepasshttp provide tools to see and manipulate KeePass credentials through keePassHTTP plugin.
// Package keepasshttp provide tools to see and manipulate KeePass credentials through KeePassHTTP plugin.
package keepasshttp

import (
Expand Down Expand Up @@ -26,15 +26,15 @@ type Credential struct {
Uuid string
StringFields map[string]string

kph *keePassHTTP
kph *KeePassHTTP
}

// Commit update an existing entry in KeePass database.
// It won't work on a newly created Credential, use use `kph.update(credential)` instead.
func (credential *Credential) Commit() error {
if credential.kph == nil {
return fmt.Errorf(
"credential is not bound to a keePassHTTP instance, use `kph.update(credential)` instead")
"credential is not bound to a KeePassHTTP instance, use `kph.update(credential)` instead")
}
return credential.kph.Update(credential)
}
Expand All @@ -47,9 +47,9 @@ type Filter struct {
Realm string
}

// keePassHTTP is a class to manipulate KeePass credentials using keePassHTTP protocol.
type keePassHTTP struct {
// Url is the listening keePassHTTP's server address.
// KeePassHTTP is a class to manipulate KeePass credentials using KeePassHTTP protocol.
type KeePassHTTP struct {
// Url is the listening KeePassHTTP's server address.
Url string
// Storage is the file path to store private association key (default to "~/.python_keepass_http").
Storage string
Expand All @@ -69,9 +69,9 @@ type httpClient interface {
Do(req *http.Request) (*http.Response, error)
}

// New creates a keePassHTTP instance with default values
func New() *keePassHTTP {
kph := new(keePassHTTP)
// New creates a KeePassHTTP instance with default values
func New() *KeePassHTTP {
kph := new(KeePassHTTP)

// replace mock fields
kph.httpClient = &http.Client{Timeout: time.Second * 30}
Expand All @@ -82,7 +82,7 @@ func New() *keePassHTTP {

// List all entries that look like an url.
// Passwords are omitted.
func (kph *keePassHTTP) List() (credentials []*Credential, err error) {
func (kph *KeePassHTTP) List() (credentials []*Credential, err error) {
result, err := kph.request(&body{
RequestType: "get-all-logins",
})
Expand All @@ -94,7 +94,7 @@ func (kph *keePassHTTP) List() (credentials []*Credential, err error) {

// Count entries for a given `Filter`.
// Filtering is done the same as `Search` method.
func (kph *keePassHTTP) Count(filter *Filter) (credentialsCount int, err error) {
func (kph *KeePassHTTP) Count(filter *Filter) (credentialsCount int, err error) {
result, err := kph.request(&body{
RequestType: "get-logins-count",
Url: filter.Url,
Expand All @@ -112,7 +112,7 @@ func (kph *keePassHTTP) Count(filter *Filter) (credentialsCount int, err error)
// For every entry, the Levenshtein Distance of his Entry-URL (or Title, if Entry-URL is not set)
// to the `Url` is calculated.
// Only the entries with the minimal distance are returned.
func (kph *keePassHTTP) Search(filter *Filter) (credentials []*Credential, err error) {
func (kph *KeePassHTTP) Search(filter *Filter) (credentials []*Credential, err error) {
result, err := kph.request(&body{
RequestType: "get-logins",
Url: filter.Url,
Expand All @@ -129,7 +129,7 @@ func (kph *keePassHTTP) Search(filter *Filter) (credentials []*Credential, err e
// For every entry, the Levenshtein Distance of his Entry-URL (or Title, if Entry-URL is not set)
// to the ``key`` is calculated.
// Only the entry with the minimal distance is returned
func (kph *keePassHTTP) Get(filter *Filter) (credential *Credential, err error) {
func (kph *KeePassHTTP) Get(filter *Filter) (credential *Credential, err error) {
credentials, err := kph.Search(filter)
if err == nil && len(credentials) > 0 {
credential = credentials[0]
Expand All @@ -138,7 +138,7 @@ func (kph *keePassHTTP) Get(filter *Filter) (credential *Credential, err error)
}

// Create a new credential into KeePass
func (kph *keePassHTTP) Create(credential *Credential) (err error) {
func (kph *KeePassHTTP) Create(credential *Credential) (err error) {
_, err = kph.request(&body{
RequestType: "set-login",
Url: credential.Url,
Expand All @@ -152,7 +152,7 @@ func (kph *keePassHTTP) Create(credential *Credential) (err error) {

// Update a credential into KeePass.
// KeePass will prompt for validation only when a change is detected.
func (kph *keePassHTTP) Update(credential *Credential) (err error) {
func (kph *KeePassHTTP) Update(credential *Credential) (err error) {
if credential.Uuid == "" {
return fmt.Errorf("cannot update a credential without its uuid")
}
Expand All @@ -166,7 +166,7 @@ func (kph *keePassHTTP) Update(credential *Credential) (err error) {
return
}

func (kph *keePassHTTP) mockError(currentError string, err *error) (raiseError bool) {
func (kph *KeePassHTTP) mockError(currentError string, err *error) (raiseError bool) {
// used for mocking error that are difficult to trigger or test
// it always returns false unless a specific error is manually set to be raised
if currentError != kph.mockErrorExpected {
Expand All @@ -176,7 +176,7 @@ func (kph *keePassHTTP) mockError(currentError string, err *error) (raiseError b
return true
}

func (kph *keePassHTTP) getCredentials(result *body, credentials *[]*Credential) {
func (kph *KeePassHTTP) getCredentials(result *body, credentials *[]*Credential) {
if result == nil {
return
}
Expand All @@ -195,7 +195,7 @@ func (kph *keePassHTTP) getCredentials(result *body, credentials *[]*Credential)
}
}

func (kph *keePassHTTP) setDefaults() (err error) {
func (kph *KeePassHTTP) setDefaults() (err error) {
if kph.Storage == "" {
var usr *user.User
usr, err = user.Current()
Expand All @@ -210,7 +210,7 @@ func (kph *keePassHTTP) setDefaults() (err error) {
return
}

func (kph *keePassHTTP) loadCreate() (err error) {
func (kph *KeePassHTTP) loadCreate() (err error) {
kph.key, err = kph.randBytes(32)
if err != nil {
return
Expand Down Expand Up @@ -239,7 +239,7 @@ func (kph *keePassHTTP) loadCreate() (err error) {
return
}

func (kph *keePassHTTP) loadOpen() (err error) {
func (kph *KeePassHTTP) loadOpen() (err error) {
var fd *os.File
fd, err = os.OpenFile(kph.Storage, os.O_RDONLY, 0600)
if err != nil || kph.mockError("os.OpenFile", &err) {
Expand Down Expand Up @@ -279,7 +279,7 @@ func (kph *keePassHTTP) loadOpen() (err error) {
return
}

func (kph *keePassHTTP) load() (err error) {
func (kph *KeePassHTTP) load() (err error) {
err = kph.setDefaults()
if err != nil {
return
Expand All @@ -302,7 +302,7 @@ func (kph *keePassHTTP) load() (err error) {
return err
}

func (kph *keePassHTTP) register() (uid string, dbHash string, err error) {
func (kph *KeePassHTTP) register() (uid string, dbHash string, err error) {
data, err := kph.request(&body{
RequestType: "associate",
Key: base64.StdEncoding.EncodeToString(kph.key),
Expand All @@ -319,16 +319,16 @@ func (kph *keePassHTTP) register() (uid string, dbHash string, err error) {
return
}

func (kph *keePassHTTP) registerValidate(data *body) (err error) {
func (kph *KeePassHTTP) registerValidate(data *body) (err error) {
if data.Id == "" {
err = fmt.Errorf("fail to associate with keePassHTTP, no app id returned")
err = fmt.Errorf("fail to associate with KeePassHTTP, no app id returned")
} else if data.Hash == "" {
err = fmt.Errorf("fail to associate with keePassHTTP, no app database hash returned")
err = fmt.Errorf("fail to associate with KeePassHTTP, no app database hash returned")
}
return
}

func (kph *keePassHTTP) authenticate() (err error) {
func (kph *KeePassHTTP) authenticate() (err error) {
_, err = kph.request(&body{
RequestType: "test-associate",
TriggerUnlock: true,
Expand All @@ -345,7 +345,7 @@ func (kph *keePassHTTP) authenticate() (err error) {
return
}

func (kph *keePassHTTP) request(requestData *body) (responseData *body, err error) {
func (kph *KeePassHTTP) request(requestData *body) (responseData *body, err error) {
if kph.key == nil {
err = kph.load()
if err != nil {
Expand All @@ -365,7 +365,7 @@ func (kph *keePassHTTP) request(requestData *body) (responseData *body, err erro
return
}

func (kph *keePassHTTP) requestPrepare(requestData *body) (jsonRequestData []byte, err error) {
func (kph *KeePassHTTP) requestPrepare(requestData *body) (jsonRequestData []byte, err error) {
aes, err := NewAES256CBCPksc7(kph.key, nil)
if err != nil {
return
Expand All @@ -385,7 +385,7 @@ func (kph *keePassHTTP) requestPrepare(requestData *body) (jsonRequestData []byt
return
}

func (kph *keePassHTTP) requestSend(jsonRequestData []byte) (responseData *body, err error) {
func (kph *KeePassHTTP) requestSend(jsonRequestData []byte) (responseData *body, err error) {
httpRequest, err := http.NewRequest("POST", kph.Url, bytes.NewBuffer(jsonRequestData))
if err != nil || kph.mockError("http.NewRequest", &err) {
return
Expand All @@ -404,29 +404,29 @@ func (kph *keePassHTTP) requestSend(jsonRequestData []byte) (responseData *body,
}

if response.StatusCode != 200 {
err = fmt.Errorf("keePassHTTP returned an error (detail: %#v)", responseText)
err = fmt.Errorf("KeePassHTTP returned an error (detail: %#v)", responseText)
return
}

err = json.Unmarshal(responseText, &responseData)
return
}

func (kph *keePassHTTP) responseValidate(responseData *body) (err error) {
func (kph *KeePassHTTP) responseValidate(responseData *body) (err error) {
if !responseData.Success {
return fmt.Errorf("keePassHTTP returned an error (detail: %#v)", responseData.Error)
return fmt.Errorf("KeePassHTTP returned an error (detail: %#v)", responseData.Error)
}

if responseData.Nonce == "" {
return fmt.Errorf("keePassHTTP does not have returned a Nonce")
return fmt.Errorf("KeePassHTTP does not have returned a Nonce")
}
responseIv, err := base64.StdEncoding.DecodeString(responseData.Nonce)
if err != nil {
return
}

if responseData.Verifier == "" {
return fmt.Errorf("keePassHTTP does not have returned a Verifier")
return fmt.Errorf("KeePassHTTP does not have returned a Verifier")
}
responseVerifier, err := base64.StdEncoding.DecodeString(responseData.Verifier)
if err != nil {
Expand All @@ -449,21 +449,21 @@ func (kph *keePassHTTP) responseValidate(responseData *body) (err error) {
**/

if responseData.Nonce != string(signatureIv) {
return fmt.Errorf("keePassHTTP invalid signature")
return fmt.Errorf("KeePassHTTP invalid signature")
}

if responseData.Id == "" {
return fmt.Errorf("keePassHTTP does not have returned an appId")
return fmt.Errorf("KeePassHTTP does not have returned an appId")
}
if kph.uid != "" && kph.uid != responseData.Id {
return fmt.Errorf("keePassHTTP application id mismatch")
return fmt.Errorf("KeePassHTTP application id mismatch")
}

if responseData.Hash == "" {
return fmt.Errorf("keePassHTTP does not have returned a Hash")
return fmt.Errorf("KeePassHTTP does not have returned a Hash")
}
if kph.dbHash != "" && kph.dbHash != responseData.Hash {
return fmt.Errorf("keePassHTTP database id mismatch")
return fmt.Errorf("KeePassHTTP database id mismatch")
}

err = kph.decryptBody(aes, responseData)
Expand Down
Loading