summaryrefslogtreecommitdiff
path: root/http-client/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'http-client/main.go')
-rw-r--r--http-client/main.go97
1 files changed, 80 insertions, 17 deletions
diff --git a/http-client/main.go b/http-client/main.go
index 14419e5..7d32e9b 100644
--- a/http-client/main.go
+++ b/http-client/main.go
@@ -1,6 +1,8 @@
package main
import (
+ "crypto/rsa"
+ "fmt"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/canvas"
@@ -13,10 +15,13 @@ import (
)
type UserData struct {
- Username string
+ Username string
+ ServerKey []byte
+ UserKey []byte
+ ParsedUserKey *rsa.PublicKey
}
-func chatLayout(window fyne.Window, user UserData, c chan string) {
+func chatLayout(window fyne.Window, user UserData) {
window.SetTitle("Сообщения")
storage.binding = binding.BindStringList(&storage.data)
go runClient(user)
@@ -31,7 +36,7 @@ func chatLayout(window fyne.Window, user UserData, c chan string) {
entry := widget.NewEntry()
submit := widget.NewButton("Отправить", func() {
- go sendMessage(user, entry.Text)
+ go sendMessage(user, entry.Text, user.ParsedUserKey)
entry.SetText("")
storage.RLock()
@@ -49,9 +54,11 @@ func chatLayout(window fyne.Window, user UserData, c chan string) {
))
}
-func loginLayout(window fyne.Window, c chan string) {
+func loginLayout(window fyne.Window, user UserData) {
window.SetTitle("Войти в чат")
+ keyIsSetup := false
+
label := canvas.NewText("Chat", color.White)
label.TextSize = 40
@@ -63,6 +70,7 @@ func loginLayout(window fyne.Window, c chan string) {
if closer == nil {
return
}
+
bufSize := 4096
data := make([]byte, 0)
buf := make([]byte, bufSize)
@@ -73,19 +81,43 @@ func loginLayout(window fyne.Window, c chan string) {
data = append(data, buf...)
}
+ user.ParsedUserKey, err = parseKey(data)
+ if err != nil {
+ dialog.ShowInformation("Ошибка", "Выбранный файл не является ключом", window)
+ return
+ }
+ user.UserKey = data
+ user.ServerKey = nil
+
+ keyIsSetup = true
+
_ = closer.Close()
}, window)
})
loginButton := widget.NewButton("Войти", func() {
- var user = UserData{
- Username: loginEntry.Text,
+ if !keyIsSetup {
+ dialog.ShowInformation("Ошибка", "Не выбран ключ", window)
+ return
}
- chatLayout(window, user, c)
+
+ if len(loginEntry.Text) == 0 {
+ dialog.ShowInformation("Ошибка", "Логин не может быть пустым", window)
+ return
+ }
+
+ user.Username = loginEntry.Text
+ _, err := tryAuth(user, user.ParsedUserKey)
+ if err != nil {
+ dialog.ShowInformation("Ошибка", fmt.Sprint(err), window)
+ return
+ }
+
+ chatLayout(window, user)
})
back := widget.NewButton("Назад", func() {
- startLayout(window, c)
+ startLayout(window, user)
})
mainContainer := container.NewCenter(container.NewVBox(
@@ -98,46 +130,77 @@ func loginLayout(window fyne.Window, c chan string) {
window.SetContent(mainContainer)
}
-func registerLayout(window fyne.Window, c chan string) {
+func registerLayout(window fyne.Window, user UserData) {
window.SetTitle("Регистрация")
+ keyIsSetup := false
+
label := canvas.NewText("Chat", color.White)
label.TextSize = 40
loginLabel := widget.NewLabel("Логин: ")
loginEntry := widget.NewEntry()
- generateKeys := widget.NewButton("Сгенерировать ключи подписи", func() {
+ generateKeysBtn := widget.NewButton("Сгенерировать ключи подписи", func() {
+ dialog.ShowFileSave(func(closer fyne.URIWriteCloser, err error) {
+ if closer == nil {
+ return
+ }
+ private, public, err := generateKeys()
+ if err != nil {
+ dialog.ShowInformation("Ошибка", fmt.Sprint(err), window)
+ return
+ }
+
+ user.ServerKey = private
+ user.UserKey = public
+ user.ParsedUserKey, _ = parseKey(user.UserKey)
+ keyIsSetup = true
+ _, _ = closer.Write(user.UserKey)
+ _ = closer.Close()
+ }, window)
})
registerButton := widget.NewButton("Зарегистрироваться", func() {
+ if !keyIsSetup {
+ dialog.ShowInformation("Ошибка", "Не выбран ключ", window)
+ return
+ }
+
+ user.Username = loginEntry.Text
+ _, err := register(user, string(user.ServerKey), user.ParsedUserKey)
+ if err != nil {
+ dialog.ShowInformation("Ошибка", fmt.Sprint(err), window)
+ return
+ }
+ chatLayout(window, user)
})
back := widget.NewButton("Назад", func() {
- startLayout(window, c)
+ startLayout(window, user)
})
window.SetContent(container.NewCenter(container.NewVBox(
container.NewCenter(label), layout.NewSpacer(),
container.NewBorder(nil, nil, loginLabel, nil, loginEntry),
- generateKeys,
+ generateKeysBtn,
registerButton,
back,
)))
}
-func startLayout(window fyne.Window, c chan string) {
+func startLayout(window fyne.Window, user UserData) {
window.SetTitle("Chat")
label := canvas.NewText("Chat", color.White)
label.TextSize = 40
login := widget.NewButton("Войти", func() {
- loginLayout(window, c)
+ loginLayout(window, user)
})
signup := widget.NewButton("Зарегистрироваться", func() {
- registerLayout(window, c)
+ registerLayout(window, user)
})
mainContainer := container.NewCenter(container.NewVBox(
@@ -148,8 +211,8 @@ func startLayout(window fyne.Window, c chan string) {
func main() {
myApp := app.New()
window := myApp.NewWindow("")
- channel := make(chan string)
+ var user UserData
- startLayout(window, channel)
+ startLayout(window, user)
window.ShowAndRun()
}