diff options
Diffstat (limited to 'http-client/main.go')
| -rw-r--r-- | http-client/main.go | 97 |
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() } |