package internal import ( "bufio" "crypto/hmac" "crypto/sha256" "csctl/config" // "csctl/config" "encoding/hex" "encoding/json" "net" "strings" "time" ) // TCPData is a struct of information to be sent over to the CS daemon type TCPData struct { Username, Type, Message string } // Account struct for user account information type Account struct { Username string `json:"username"` UserID string `json:"userID"` EmailAddress string `json:"emailAddress"` CreatedBy string `json:"createdBy"` CreatedAt time.Time `json:"createdAt"` Locked bool `json:"locked"` Tier int `json:"tier"` SupportKey string `json:"supportKey"` ReferralCode string `json:"referralCode"` TotalReferrals int `json:"totalReferrals"` Root bool `json:"root"` } // FetchAccount is a helper function that fetches account information from CSD func FetchAccount(username string) (*Account, error) { data, err := ContactSR(&TCPData{ Username: username, Type: "userinfo", }) if err != nil { return nil, err } var account Account if err := json.Unmarshal([]byte(data), &account); err != nil { return nil, err } return &account, nil } // Contact one way contact function, sends message to CSD. Doesn't expect response back. func Contact(data *TCPData) error { conn, err := net.Dial("tcp", "localhost:8124") if err != nil { return err } newHmac := hmac.New(sha256.New, config.FetchHMACKey()) jsonMarshal, err := json.Marshal(data) if err != nil { return err } newHmac.Write(jsonMarshal) encoded := hex.EncodeToString(newHmac.Sum(nil)) write := string(jsonMarshal) + "$" + encoded conn.Write([]byte(write)) conn.Close() return nil } // ContactSR two-way communication with CSD func ContactSR(data *TCPData) (string, error) { conn, err := net.Dial("tcp", "localhost:8124") if err != nil { return "", err } newHmac := hmac.New(sha256.New, config.FetchHMACKey()) jsonMarshal, err := json.Marshal(data) if err != nil { return "", err } newHmac.Write(jsonMarshal) encoded := hex.EncodeToString(newHmac.Sum(nil)) write := string(jsonMarshal) + "$" + encoded conn.Write([]byte(write)) message, err := bufio.NewReader(conn).ReadString('\n') if err != nil { return "", err } defer conn.Close() return strings.ReplaceAll(message, "\n", ""), nil }