summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
Diffstat (limited to 'server')
-rw-r--r--server/main.go120
1 files changed, 120 insertions, 0 deletions
diff --git a/server/main.go b/server/main.go
new file mode 100644
index 0000000..ec848ad
--- /dev/null
+++ b/server/main.go
@@ -0,0 +1,120 @@
+package main
+
+import (
+ "encoding/json"
+ "fmt"
+ "log"
+ "net"
+)
+
+const (
+ MESSAGE = "message"
+ AUTHENTICATE = "authenticate"
+ RENAME = "rename"
+)
+
+const (
+ SUCCESS = "success"
+ FAILURE = "failure"
+)
+
+type Message struct {
+ Type string
+ Data string
+ User string
+}
+
+type Response struct {
+ Status string
+ Data string
+}
+
+func parseMessage(data []byte) Message {
+ var m Message
+ // TODO(andrew): Добавить обработку ошибок
+ json.Unmarshal(data, &m)
+ return m
+}
+
+func handleConnection(conn net.Conn) {
+ defer conn.Close()
+
+ maxAuthAttempts := 5
+ authAttempts := 0
+ authenticated := false
+ buf := make([]byte, 4096)
+
+ for {
+ if authAttempts >= maxAuthAttempts {
+ resp, _ := json.Marshal(Response{
+ Status: FAILURE,
+ Data: "Превышено количество неавторизованных запросов",
+ })
+ _, _ = conn.Write(resp)
+ break
+ }
+
+ readLen, err := conn.Read(buf)
+ if err != nil {
+ break
+ }
+
+ message := parseMessage(buf[:readLen])
+ if message.Type == AUTHENTICATE {
+ // TODO(andrew): Добавить процесс аутентификации
+ if true {
+ authenticated = true
+ }
+ }
+
+ if !authenticated {
+ resp, _ := json.Marshal(Response{
+ Status: FAILURE,
+ Data: "Для работы с сервером необходима аутентификация",
+ })
+ _, err = conn.Write(resp)
+ if err != nil {
+ conn.Close()
+ break
+ } else {
+ authAttempts += 1
+ continue
+ }
+ }
+
+ if message.Data == "exit" {
+ break
+ }
+
+ fmt.Println(message.Data)
+ resp, _ := json.Marshal(Response{
+ Status: SUCCESS,
+ Data: "some data",
+ })
+ _, err = conn.Write(resp)
+ if err != nil {
+ err = conn.Close()
+ break
+ }
+ }
+}
+
+func main() {
+ sock, err := net.Listen("tcp", "localhost:8080")
+ handleError(err)
+
+ for {
+ conn, err := sock.Accept()
+ if err == nil {
+ go handleConnection(conn)
+ } else {
+ break
+ }
+ }
+}
+
+func handleError(err error) {
+ if err != nil {
+ log.Fatal(err)
+ }
+}