status-go/server/pairing/config.go

150 lines
4.7 KiB
Go

package pairing
import (
"crypto/ecdsa"
"crypto/tls"
"net"
"github.com/status-im/status-go/api"
"github.com/status-im/status-go/multiaccounts"
"github.com/status-im/status-go/protocol/requests"
)
type SenderConfig struct {
// SenderConfig.KeystorePath must end with keyUID
KeystorePath string `json:"keystorePath" validate:"required,keystorepath"`
// DeviceType SendPairInstallation need this information
DeviceType string `json:"deviceType" validate:"required"`
KeyUID string `json:"keyUID" validate:"required,keyuid"`
Password string `json:"password" validate:"required"`
ChatKey string `json:"chatKey"` // set only in case of a Keycard user, otherwise empty
DB *multiaccounts.Database `json:"-"`
}
type ReceiverConfig struct {
CreateAccount *requests.CreateAccount `json:"createAccount" validate:"required"`
// DeviceType SendPairInstallation need this information
// Deprecated: This field will be automatically overridden with runtime.GOOS and can be omitted by client.
// The field will be removed in https://github.com/status-im/status-go/issues/3351 is fully implemented.
DeviceType string `json:"-"`
DB *multiaccounts.Database `json:"-"`
LoggedInKeyUID string `json:"-"`
}
type KeystoreFilesConfig struct {
KeystorePath string `json:"keystorePath" validate:"required,keystorepath"`
LoggedInKeyUID string `json:"loggedInKeyUid" validate:"required,keyuid"`
Password string `json:"password" validate:"required"`
}
type KeystoreFilesSenderConfig struct {
KeystoreFilesConfig
KeypairsToExport []string `json:"keypairsToExport" validate:"required"`
}
type KeystoreFilesReceiverConfig struct {
KeystoreFilesConfig
KeypairsToImport []string `json:"keypairsToImport" validate:"required"`
}
type ServerConfig struct {
// Timeout the number of milliseconds after which the pairing server will automatically terminate
Timeout uint `json:"timeout" validate:"omitempty,gte=0"`
// Connection fields, not json (un)marshalled
// Required for the server, but MUST NOT come from client
PK *ecdsa.PublicKey `json:"-"`
EK []byte `json:"-"`
Cert *tls.Certificate `json:"-"`
ListenIP net.IP `json:"-"`
IPAddresses []net.IP `json:"-"`
InstallationID string `json:"-"`
KeyUID string `json:"-"`
}
type ClientConfig struct{}
type SenderServerConfig struct {
SenderConfig *SenderConfig `json:"senderConfig" validate:"required"`
ServerConfig *ServerConfig `json:"serverConfig" validate:"omitempty,dive"`
}
type KeystoreFilesSenderServerConfig struct {
SenderConfig *KeystoreFilesSenderConfig `json:"senderConfig" validate:"required"`
ServerConfig *ServerConfig `json:"serverConfig" validate:"omitempty,dive"`
}
type SenderClientConfig struct {
SenderConfig *SenderConfig `json:"senderConfig" validate:"required"`
ClientConfig *ClientConfig `json:"clientConfig"`
}
type ReceiverClientConfig struct {
ReceiverConfig *ReceiverConfig `json:"receiverConfig" validate:"required"`
ClientConfig *ClientConfig `json:"clientConfig"`
}
type KeystoreFilesReceiverClientConfig struct {
ReceiverConfig *KeystoreFilesReceiverConfig `json:"receiverConfig" validate:"required"`
ClientConfig *ClientConfig `json:"clientConfig"`
}
type ReceiverServerConfig struct {
ReceiverConfig *ReceiverConfig `json:"receiverConfig" validate:"required"`
ServerConfig *ServerConfig `json:"serverConfig" validate:"omitempty,dive"`
}
func NewSenderServerConfig() *SenderServerConfig {
return &SenderServerConfig{
SenderConfig: new(SenderConfig),
ServerConfig: new(ServerConfig),
}
}
func NewKeystoreFilesSenderServerConfig() *KeystoreFilesSenderServerConfig {
return &KeystoreFilesSenderServerConfig{
SenderConfig: new(KeystoreFilesSenderConfig),
ServerConfig: new(ServerConfig),
}
}
func NewSenderClientConfig() *SenderClientConfig {
return &SenderClientConfig{
SenderConfig: new(SenderConfig),
ClientConfig: new(ClientConfig),
}
}
func NewReceiverClientConfig() *ReceiverClientConfig {
return &ReceiverClientConfig{
ReceiverConfig: new(ReceiverConfig),
ClientConfig: new(ClientConfig),
}
}
func NewKeystoreFilesReceiverClientConfig() *KeystoreFilesReceiverClientConfig {
return &KeystoreFilesReceiverClientConfig{
ReceiverConfig: new(KeystoreFilesReceiverConfig),
ClientConfig: new(ClientConfig),
}
}
func NewReceiverServerConfig() *ReceiverServerConfig {
return &ReceiverServerConfig{
ReceiverConfig: new(ReceiverConfig),
ServerConfig: new(ServerConfig),
}
}
func (c *ReceiverConfig) AbsoluteKeystorePath() string {
// Follow the same path as in InitKeyStoreDirWithAccount
// Keep keyUID empty as it's unknown yet
_, path := api.DefaultKeystorePath(c.CreateAccount.RootDataDir, "")
return path
}