Skip to content
Merged
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
16 changes: 16 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Tunnel Client",
"type": "go",
"request": "launch",
"mode": "debug",
"args": ["--dev"],
"program": "${workspaceFolder}/servers/tunnel-client/main.go"
},
{
"name": "Soham Client Release Server",
"type": "go",
Expand All @@ -20,6 +28,14 @@
"args": ["--dev"],
"program": "${workspaceFolder}/apps/sohan/whatsapp/main.go"
},
{
"name": "Run File Server",
"type": "go",
"request": "launch",
"mode": "auto",
"args": ["--dev"],
"program": "${workspaceFolder}/servers/file-server-middleware/main.go"
},
{
"name": "Run Telegram Server",
"type": "go",
Expand Down
4 changes: 4 additions & 0 deletions apps/sohan/whatsapp/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
whatsapp-client*
*.lock
*.json
*.db
6 changes: 6 additions & 0 deletions apps/sohan/whatsapp/FyneApp12333.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Website = "https://rpso.in"
Details = "A description of your application"
Name = "WABOT"
ID = "in.rpso.wabot"
Icon = "icon.ico"
Version = "1.0.0"
Binary file removed apps/sohan/whatsapp/WhatsappSuperSecrete.db
Binary file not shown.
25 changes: 14 additions & 11 deletions apps/sohan/whatsapp/auto-download/index.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,14 @@ import (
"log"
"net/http"
"os"
"path/filepath"
"runtime"
"time"

"fyne.io/fyne/v2"
"fyne.io/fyne/v2/widget"
soham_whatsapp_gui_config "github.com/rpsoftech/golang-servers/apps/sohan/whatsapp/config"
sohan_whatsapp_keys "github.com/rpsoftech/golang-servers/apps/sohan/whatsapp/keys"
utility_functions_gzip "github.com/rpsoftech/golang-servers/utility/functions/gzip"
)

const VersionFileName = "client-version.json"
Expand Down Expand Up @@ -112,6 +114,7 @@ func CheckAndDownload(progress *widget.ProgressBar, win fyne.Window) string {
if runtime.GOOS == "windows" {
serverBinary = "whatsapp-client.exe"
}
serverBinary = filepath.Join(sohan_whatsapp_keys.ConfigDir, serverBinary)
if checkAndRunCalled {
return serverBinary
}
Expand All @@ -135,7 +138,7 @@ func CheckAndDownload(progress *widget.ProgressBar, win fyne.Window) string {
json.Unmarshal(data, &local)
}

tmpFile := serverBinary + ".tmp"
gzipFile := serverBinary + ".gz"

needDownload := false

Expand All @@ -148,11 +151,11 @@ func CheckAndDownload(progress *widget.ProgressBar, win fyne.Window) string {
}

if needDownload {
os.Remove(tmpFile)
os.Remove(gzipFile)
fyne.DoAndWait(func() {
win.Show()
})
err := downloadFileWithProgress(cloud.URL, tmpFile, progress)
err := downloadFileWithProgress(cloud.URL, gzipFile, progress)
if err != nil {
if _, err := os.Stat(serverBinary); os.IsNotExist(err) {
panic(fmt.Errorf("File Downloading Failed"))
Expand All @@ -161,16 +164,16 @@ func CheckAndDownload(progress *widget.ProgressBar, win fyne.Window) string {
return serverBinary
}

hash, err := sha256File(tmpFile)
hash, err := sha256File(gzipFile)
if err != nil {
return serverBinary
}

if hash != cloud.SHA256 {
os.Remove(tmpFile)
os.Remove(gzipFile)
return serverBinary
}
err = replaceBinarySafe(tmpFile, serverBinary)
err = replaceBinarySafe(gzipFile, serverBinary)
if err != nil {
log.Println("Binary replace failed:", err)
return serverBinary
Expand Down Expand Up @@ -219,9 +222,9 @@ func downloadFileWithProgress(url string, filepath string, progress *widget.Prog
func replaceBinarySafe(tmpFile string, serverBinary string) error {

// stop server first
if soham_whatsapp_gui_config.ServerCmd != nil && soham_whatsapp_gui_config.ServerCmd.Process != nil {
soham_whatsapp_gui_config.ServerCmd.Process.Kill()
time.Sleep(1 * time.Second)
if sohan_whatsapp_keys.ServerCmd != nil && sohan_whatsapp_keys.ServerCmd.Process != nil {
sohan_whatsapp_keys.ServerCmd.Process.Kill()
time.Sleep(3 * time.Second)
}

// backup existing binary
Expand All @@ -234,7 +237,7 @@ func replaceBinarySafe(tmpFile string, serverBinary string) error {
}

// move new binary
err := os.Rename(tmpFile, serverBinary)
err := utility_functions_gzip.GzipDecompressFile(tmpFile, serverBinary)
if err != nil {
return err
}
Expand Down
1 change: 0 additions & 1 deletion apps/sohan/whatsapp/client-version.json

This file was deleted.

159 changes: 146 additions & 13 deletions apps/sohan/whatsapp/config/index.go
Original file line number Diff line number Diff line change
@@ -1,39 +1,61 @@
package soham_whatsapp_gui_config

import (
"bytes"
"encoding/base64"
"encoding/json"
"errors"
"fmt"
"image"
"io"
"log"
"net/http"
"os"
"os/exec"
"path/filepath"
"strings"

"github.com/rpsoftech/golang-servers/env"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/canvas"
"github.com/google/uuid"
sohan_whatsapp_keys "github.com/rpsoftech/golang-servers/apps/sohan/whatsapp/keys"
whatsapp_config "github.com/rpsoftech/golang-servers/functions/whatsapp/config"
whatsapp_interfaces "github.com/rpsoftech/golang-servers/interfaces/whatsapp"
utility_functions "github.com/rpsoftech/golang-servers/utility/functions"
"github.com/rpsoftech/golang-servers/validator"
)

var ServerConfigFilePath = ""
var ServerCmd *exec.Cmd
type LoginStatusApiReponse struct {
Status int `json:"status"`
}

type QrCodeApiCallResponse struct {
QrCode string `json:"qrCode"`
QrCodeData string `json:"qrCodeData"`
}

func init() {
CurrentDirectory := env.FindAndReturnCurrentDir()
ServerConfigFilePath = filepath.Join(CurrentDirectory, whatsapp_config.ServerConfigFileName)
// CurrentDirectory := env.FindAndReturnCurrentDir()
dirname, err := os.UserHomeDir()
if err != nil {
log.Fatal(err)
}
// fmt.Println(dirname)
sohan_whatsapp_keys.HomeDir = dirname
sohan_whatsapp_keys.ConfigDir = filepath.Join(dirname, ".wabot_service")
sohan_whatsapp_keys.ServerConfigFilePath = filepath.Join(sohan_whatsapp_keys.ConfigDir, whatsapp_config.ServerConfigFileName)
}

func ValidateConfig() bool {
if _, err := utility_functions.Exist(ServerConfigFilePath); errors.Is(err, os.ErrNotExist) {
panic(fmt.Errorf("CONFIG_NOT_EXIST_ON_PATH %s", ServerConfigFilePath))
func ValidateConfig() (bool, *whatsapp_interfaces.IServerConfig) {
if _, err := utility_functions.Exist(sohan_whatsapp_keys.ServerConfigFilePath); errors.Is(err, os.ErrNotExist) {
// panic(fmt.Errorf("CONFIG_NOT_EXIST_ON_PATH %s", sohan_whatsapp_keys.ServerConfigFilePath))
return false, nil
}
_, err := readConfigFileAndReturniserverConfig(ServerConfigFilePath)
config, err := readConfigFileAndReturniserverConfig(sohan_whatsapp_keys.ServerConfigFilePath)
if err != nil {
return false
return false, nil
// panic(err)
}
return true
return true, config
}

func readConfigFileAndReturniserverConfig(configFilePath string) (*whatsapp_interfaces.IServerConfig, error) {
Expand All @@ -50,7 +72,15 @@ func readConfigFileAndReturniserverConfig(configFilePath string) (*whatsapp_inte
return nil, err
}
if errs := validator.Validator.Validate(config); len(errs) > 0 {
panic(fmt.Errorf("CONFIG_ERROR %#v", errs))
return nil, fmt.Errorf("CONFIG_ERROR %#v", errs)
}
if len(config.Tokens) == 0 {
return nil, errors.New("NO_TOKENS")
}
for token := range config.Tokens {
if _, err := ValidUUID(token); err != "" {
return nil, errors.New(err)
}
}
if config.JID == nil {
config.JID = make(map[string]string)
Expand All @@ -69,3 +99,106 @@ func SaveConfig(config *whatsapp_interfaces.IServerConfig) {
log.Fatal(err)
}
}

func CreateQRFromBase64(base64Str string) (*canvas.Image, error) {

data, err := base64.StdEncoding.DecodeString(base64Str)
if err != nil {
return nil, err
}

img, _, err := image.Decode(bytes.NewReader(data))
if err != nil {
return nil, err
}

qr := canvas.NewImageFromImage(img)

qr.FillMode = canvas.ImageFillContain

qr.SetMinSize(
fyne.NewSize(200, 200),
)

return qr, nil
}

//////////////////////////////////////////////////////
// UUID VALIDATION
//////////////////////////////////////////////////////

func ValidUUID(uuidstring string) (bool, string) {
u, err := uuid.Parse(uuidstring)
if err != nil {
return false, fmt.Sprintf("String %q is invalid: %v\n", uuidstring, err)
}
// Check if it is specifically version 5
if u.Version() == 5 {
return true, ""
} else {
return false, fmt.Sprintf("It is UUID Version %d.\n", u.Version())
}
}

func QrCodeApiCall(token string) (bool, string) {
req, err := http.NewRequest("GET", sohan_whatsapp_keys.QRCODEURL, nil)

if err != nil {
fmt.Println(err)
return false, ""
}
req.Header.Add("X-Api-Token", token)
res, err := http.DefaultClient.Do(req)
if err != nil {
fmt.Println(err)
return false, ""
}
defer res.Body.Close()
body, err := io.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
return false, ""
}
if strings.Contains(string(body), "success") {
return false, ""
}
qrcodeRespo := new(QrCodeApiCallResponse)
err = json.Unmarshal(body, qrcodeRespo)
if err != nil {
fmt.Println(err)
return false, ""
}
return true, qrcodeRespo.QrCode
}
func LoginApiCall(token string) (bool, error) {
req, err := http.NewRequest("GET", sohan_whatsapp_keys.LoginStatusURL, nil)

if err != nil {
fmt.Println(err)
return false, err
}
req.Header.Add("X-Api-Token", token)
res, err := http.DefaultClient.Do(req)
if err != nil {
fmt.Println(err)
return false, err
}
defer res.Body.Close()
body, err := io.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
return false, err
}
statusRespo := new(LoginStatusApiReponse)
err = json.Unmarshal(body, statusRespo)
if err != nil {
fmt.Println(err)
return false, err
}
if statusRespo.Status == 1 {
return true, nil
} else {
return false, nil

}
}
1 change: 0 additions & 1 deletion apps/sohan/whatsapp/gui.lock

This file was deleted.

16 changes: 16 additions & 0 deletions apps/sohan/whatsapp/icon.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file added apps/sohan/whatsapp/icon.ico
Binary file not shown.
11 changes: 11 additions & 0 deletions apps/sohan/whatsapp/keys/index.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package sohan_whatsapp_keys

import "os/exec"

var ServerConfigFilePath = ""
var ServerCmd *exec.Cmd
var HomeDir string
var ConfigDir string

const QRCODEURL = "http://localhost:4000/v1/qr_code"
const LoginStatusURL = "http://localhost:4000/v1/status"
Loading
Loading