Files
cmutton/core.go
T

142 lines
4.3 KiB
Go

package main
// #include <stdlib.h>
// #include "types.h"
import "C"
import (
"strings"
"time"
"github.com/rwinkhart/libmutton/core"
)
// EntryAddPrecheck returns:
// r0: err
//
// r1: status
//
//export EntryAddPrecheck
func EntryAddPrecheck(realPath C.PascalString) (*C.char, uint8) {
status, err := core.EntryAddPrecheck(C.GoStringN(realPath.data, realPath.len))
if err != nil {
return C.CString(err.Error()), status
}
return nil, status
}
// EntryIsNotEmpty returns:
// r0: notEmpty
//
//export EntryIsNotEmpty
func EntryIsNotEmpty(entryData C.PascalStringArray) bool {
notEmpty := core.EntryIsNotEmpty(getStringSliceFromCPascalStringArray(entryData))
return notEmpty
}
// EntryRefresh returns:
// r0: err
//
//export EntryRefresh
func EntryRefresh(oldRCWPassword, newRCWPassword C.PascalString, removeOldDir bool) *C.char {
err := core.EntryRefresh([]byte(C.GoStringN(oldRCWPassword.data, oldRCWPassword.len)), []byte(C.GoStringN(newRCWPassword.data, newRCWPassword.len)), removeOldDir)
if err != nil {
return C.CString(err.Error())
}
return nil
}
// GenTOTP returns:
// r0: err
//
// r1: token
//
//export GenTOTP
func GenTOTP(secret C.PascalString, unixTimestamp int64) (*C.char, C.PascalString) {
token, err := core.GenTOTP(C.GoStringN(secret.data, secret.len), time.Unix(unixTimestamp, 0))
if err != nil {
return C.CString(err.Error()), C.PascalString{data: nil, len: -1}
}
return nil, getPascalString(token)
}
// GetOldEntryData returns:
// r0: err
//
// r1: lines
//
//export GetOldEntryData
func GetOldEntryData(realPath C.PascalString, field int, rcwPassword C.PascalString) (*C.char, C.PascalStringArray) {
lines, err := core.GetOldEntryData(C.GoStringN(realPath.data, realPath.len), field, []byte(C.GoStringN(rcwPassword.data, rcwPassword.len)))
if err != nil {
return C.CString(err.Error()), C.PascalStringArray{}
}
return nil, getCPascalStringArrayFromStringSlice(lines)
}
// LibmuttonInit is a partial implementation that does not allow for client-specific config.
// Returns:
// r0: err
//
// Special requirement:
// An array of ordered responses to inputCB questions.
//
//export LibmuttonInit
func LibmuttonInit(configSSH, sshKeyPath, sshKeyProtected, sshUser, sshHost, sshPort, rcwPassword C.PascalString, appendMode bool, forceOfflineMode bool, deviceIDPrefix C.PascalString) *C.char {
supplyInputForInit := func(prompt string) string {
if strings.HasPrefix(prompt, "Configure SSH settings (for synchronization)? (Y/n)") {
return C.GoStringN(configSSH.data, configSSH.len)
} else if strings.HasPrefix(prompt, "SSH private identity file path (falls back to") {
return C.GoStringN(sshKeyPath.data, sshKeyPath.len)
} else if strings.HasPrefix(prompt, "Is the identity file password-protected? (y/N)") {
return C.GoStringN(sshKeyProtected.data, sshKeyProtected.len)
} else if strings.HasPrefix(prompt, "Remote SSH username:") {
return C.GoStringN(sshUser.data, sshUser.len)
} else if strings.HasPrefix(prompt, "Remote SSH IP/domain:") {
return C.GoStringN(sshHost.data, sshHost.len)
} else if strings.HasPrefix(prompt, "Remote SSH port:") {
return C.GoStringN(sshPort.data, sshPort.len)
}
return ""
}
if err := core.LibmuttonInit(supplyInputForInit, []byte(C.GoStringN(rcwPassword.data, rcwPassword.len)), appendMode, forceOfflineMode, C.GoStringN(deviceIDPrefix.data, deviceIDPrefix.len), nil); err != nil {
return C.CString(err.Error())
}
return nil
}
// RCWSanityCheckGen returns:
// r0: err
//
//export RCWSanityCheckGen
func RCWSanityCheckGen(password C.PascalString) *C.char {
err := core.RCWSanityCheckGen([]byte(C.GoStringN(password.data, password.len)))
if err != nil {
return C.CString(err.Error())
}
return nil
}
// VerifyEntries returns:
// r0: err
//
//export VerifyEntries
func VerifyEntries(rcwPassword C.PascalString) *C.char {
err := core.VerifyEntries([]byte(C.GoStringN(rcwPassword.data, rcwPassword.len)))
if err != nil {
return C.CString(err.Error())
}
return nil
}
// WriteEntry returns:
// r0: err
//
//export WriteEntry
func WriteEntry(realPath C.PascalString, decSlice C.PascalStringArray, passwordIsNew bool, rcwPassword C.PascalString) *C.char {
if err := core.WriteEntry(C.GoStringN(realPath.data, realPath.len), getStringSliceFromCPascalStringArray(decSlice), passwordIsNew, []byte(C.GoStringN(rcwPassword.data, rcwPassword.len))); err != nil {
return C.CString(err.Error())
}
return nil
}