diff --git a/controller/authorizationUsersController.go b/controller/authorizationUsersController.go new file mode 100644 index 0000000..120373d --- /dev/null +++ b/controller/authorizationUsersController.go @@ -0,0 +1,260 @@ +package controller + +import ( + "fmt" + "httpTable/model" + "httpTable/user_session" + "net/http" +) + +// AuthorizationUsersController cтруктура используется для конструктора контроллер +type AuthorizationUsersController struct { + modelUser *model.AuthorizationUsersModel + modelTable *model.TableModel +} + +// NewAuthorizationUsersController конструктор контроллера, возращающий экземпляр структуры AuthorizationUsersController +// со свойствами modelTable и modelUser контроллера модели +func NewAuthorizationUsersController() *AuthorizationUsersController { + return &AuthorizationUsersController{ + modelUser: model.NewAuthorizationUsersModel(), + modelTable: model.NewTableModel(), + } +} + +//readURL приватная функция считывающая имя и пароль пользователя +func readURL(res http.ResponseWriter, req *http.Request) (string, string) { + req.ParseForm() + name := req.FormValue("username") + password := req.FormValue("password") + return name, password +} + +// GetAuthorizationUsers метод контроллера при авторизации +func (aut *AuthorizationUsersController) GetAuthorizationUsers(res http.ResponseWriter, req *http.Request) int { + //получение имени и пароля пользователя из URL строки + name, password := readURL(res, req) + //если пароль и пользователь пустой выводит сообщение + if name == `` && password == `` { + + messageUser := ` + + + Введите свои данные + + +

Введите свои данные

+
+
+

+
+

+ + РЕГИСТРАЦИЯ +
+ + ` + html := []byte(messageUser) + res.Write(html) + return 0 + } + name, err := aut.modelUser.GetAuthorizationUsers(name, password) + //если пароль и имя пользователя не совпадает выводит сообщение + if err != nil { + messageUserError := + ` + + + Извините, пароль или имя с ошибкой, введите еще раз или пройдите <a href="../register">РЕГИСТРАЦИЮ</a> + + +

Извините, пароль или имя с ошибкой, введите еще раз или пройдите РЕГИСТРАЦИЮ

+
+
+

+
+

+ + РЕГИСТРАЦИЯ +
+ + ` + + Errhtml := []byte(messageUserError) + res.Write(Errhtml) + return 0 + } + token, err := TokenGet(res, req) + if err != nil { + fmt.Printf("Ошибка в полученном токене", err) + } + user_session.SetFirstNameToken(name, token) + user_session.Set(token, 0, 0) + return 1 + +} + +// AddNewUser метод контроллера по добавлению новых пользователей +func (aut *AuthorizationUsersController) AddNewUser(res http.ResponseWriter, req *http.Request) int { + //получение имени и пароля пользователя из URL строки + name, password := readURL(res, req) + //если пароль и имя не заданы выводит сообщение + if name == `` && password == `` { + messageUser := + ` + + + Для регистрации,введите свои данные + + +

Для регистрации,введите свои данные

+
+
+

+
+

+
+

+ +
+ + ` + + html := []byte(messageUser) + res.Write(html) + + return 0 + } + req.ParseForm() + repeatPassword := req.FormValue("repeatpassword") + if repeatPassword != password { + messageUser := + ` + + + Пароль, не совпадает с паролем подтверждения введите свои данные повторно + + +

Пароль, не совпадает с паролем подтверждения введите свои данные повторно

+
+
+

+
+

+
+

+ +
+ + ` + + html := []byte(messageUser) + res.Write(html) + return 0 + } + //проверка имени на отсутсвие повторений + name, err := aut.modelUser.AddNewUser(name, password, ``) + if err != nil { + messageUserError := ` + + + Извините такой пользователь уже существует, введите свои данные снова + + +

Извините такой пользователь уже существует, введите свои данные снова

+
+
+

+
+

+
+

+ +
+ + ` + + Errhtml := []byte(messageUserError) + res.Write(Errhtml) + return 0 + } + //создание и отправка cookie файлов + token, err := TokenGet(res, req) + if err != nil { + fmt.Printf("Ошибка в полученном токене", err) + } + _, err = aut.modelUser.AddNewUser(name, password, token) + return 1 +} + +// DeleteUser удаляет пользователя из БД при вводе правильных: пароля и имени +func (aut *AuthorizationUsersController) DeleteUser(res http.ResponseWriter, req *http.Request) { + //получение имени и пароля пользователя из URL строки + name, password := readURL(res, req) + //если пароль и имя пользователя пустые выводит сообщение + if name == `` && password == `` { + messageUser := ` + + + Если Вы, хотите удалить пользователя, введите свои данные + + +

Если Вы, хотите удалить пользователя, введите свои данные

+
+
+

+
+

+ +
+ + ` + html := []byte(messageUser) + res.Write(html) + return + } + //проверка имени и пароля, в случае ошибки, вывод сообщения + name, err := aut.modelUser.DeleteUser(name, password) + if err != nil { + messageUserError := + ` + + + Извините, пароль или имя с ошибкой, введите свои данные снова + + +

Извините, пароль или имя с ошибкой, введите свои данные снова

+
+
+

+
+

+ +
+ + ` + Errhtml := []byte(messageUserError) + res.Write(Errhtml) + return + } + messageUserError := ` + + Ваш пользователь удален с сайта САЙТ` + Errhtml := []byte(messageUserError) + res.Write(Errhtml) +} + +// LogOutUser метод контроллера по сбросу куки файлов и выходу из текущей сессии +func (aut *AuthorizationUsersController) LogOutUser(res http.ResponseWriter, req *http.Request) { + token, err := TokenVerification(res, req) + fmt.Printf("Токен из GetAuthorizationUsers контроллера", token) + if err != nil { + fmt.Printf("Ошибка такого токена нет в БД") + } + aut.modelUser.LogOutUser(token) + messageUserError := ` + + Вы успешно вышли из текущей сессии, для продолжения работы прошу авторизоваться АВТОРИЗАЦИЯ` + Errhtml := []byte(messageUserError) + res.Write(Errhtml) +} diff --git a/controller/tableController.go b/controller/tableController.go index e61c7fa..1c698a9 100644 --- a/controller/tableController.go +++ b/controller/tableController.go @@ -1,11 +1,15 @@ package controller import ( + "fmt" + "httpTable/cookies" "httpTable/model" "net/http" "strconv" ) +const nameCookie = "html-table_coookie" + // TableController cтруктура используется для конструктора контроллер type TableController struct { model *model.TableModel @@ -18,6 +22,8 @@ func NewTableController() *TableController { model: model.NewTableModel(), } } + +//приватный метод для вывода повторяющихся частей таблицы на печать func (t *TableController) tableMiddle(row int, column int) string { var numberRow int var tableMain string @@ -39,75 +45,149 @@ func (t *TableController) tableMiddle(row int, column int) string { } // ResertTable метод сброса таблицы до состояния 2х2 -func (t *TableController) ResetTable(res http.ResponseWriter, req *http.Request) { - t.model.ResetTable() - row, column := t.model.GetCurrentTable() +func (t *TableController) ResetTable(res http.ResponseWriter, req *http.Request) error { + value, err := TokenVerification(res, req) + if err != nil { + fmt.Sprintf("Проблема с токеном в контроллера в методе ResetTable", err) + return err + } + t.model.ResetTable(value) + row, column, name := t.model.GetCurrentTable(value) //заголовок таблицы tableHTML := ` - + ` tableMidle := t.tableMiddle(row, column) - tableHTML = tableHTML + tableMidle + tableFinish := + ` ДОБАВЛЕНИЕ СТРОК + ДОБАВЛЕНИЕ КОЛОНОК + ТЕКУЩЕЕ СОСТОЯНИЕ ТАБЛИЦЫ + СБРОС ТАБЛИЦЫ ` + tableHTML = tableHTML + tableMidle + tableFinish //отправка таблицы в браузер res.Header().Set("Content-Type", "text/html") html := []byte(tableHTML) res.Write(html) + return err } // AddRow метод контроллера по выводу таблицы с добавлением при каждом клике дополнительной строки -func (t *TableController) AddRow(res http.ResponseWriter, req *http.Request) { - t.model.AddRow() - row, column := t.model.GetCurrentTable() +func (t *TableController) AddRow(res http.ResponseWriter, req *http.Request) error { + value, err := TokenVerification(res, req) + if err != nil { + fmt.Sprintf("Проблема с токеном в контроллере в методе AddRow", err) + return err + } + t.model.AddRow(value) + row, column, name := t.model.GetCurrentTable(value) //заголовок таблицы tableHTML := `
СБРОС ТАБЛИЦЫСБРОС ТАБЛИЦЫ ` + name + `
- + - ` + ` //цикл по конкотинации таблицы в зависимости от количества строк и столбцов tableMain := t.tableMiddle(row, column) - table := tableHTML + tableMain + tableFinish := + ` ДОБАВЛЕНИЕ СТРОК + ДОБАВЛЕНИЕ КОЛОНОК + ТЕКУЩЕЕ СОСТОЯНИЕ ТАБЛИЦЫ + СБРОС ТАБЛИЦЫ ` + + table := tableHTML + tableMain + tableFinish //отправка таблицы в браузер res.Header().Set("Content-Type", "text/html") html := []byte(table) res.Write(html) + return nil } //AddColoms метод контроллера по выводу таблицы с добавлением при каждом клике дополнительной строки -func (t *TableController) AddColumn(res http.ResponseWriter, req *http.Request) { - t.model.AddColumns() - row, column := t.model.GetCurrentTable() +func (t *TableController) AddColumn(res http.ResponseWriter, req *http.Request) error { + value, err := TokenVerification(res, req) + if err != nil { + fmt.Sprintf("Проблема с токеном в контроллера в методе AddColumn", err) + return err + } + t.model.AddColumns(value) + row, column, name := t.model.GetCurrentTable(value) //начало таблицы tableHTML := `
ТАБЛИЦА КОГДА ПРИБАВЛЯЕТСЯ СТРОКАДОБАВЛЕНИЕ СТРОК ` + name + `
- + - ` + ` tableMain := t.tableMiddle(row, column) - table := tableHTML + tableMain + tableFinish := + `ДОБАВЛЕНИЕ СТРОК + ДОБАВЛЕНИЕ КОЛОНОК + ТЕКУЩЕЕ СОСТОЯНИЕ ТАБЛИЦЫ + СБРОС ТАБЛИЦЫ ` + + table := tableHTML + tableMain + tableFinish //отправка таблицы в браузер res.Header().Set("Content-Type", "text/html") html := []byte(table) res.Write(html) + return nil } // GetCurrentTable метод контроллера по выводу таблицы в текущем состоянии -func (t *TableController) GetCurrentTable(res http.ResponseWriter, req *http.Request) { - row, column := t.model.GetCurrentTable() +func (t *TableController) GetCurrentTable(res http.ResponseWriter, req *http.Request) error { + value, err := TokenVerification(res, req) + if err != nil { + fmt.Sprintf("Проблема с токеном в контроллере в методе GetCurrentTable", err) + return err + } + row, column, name := t.model.GetCurrentTable(value) tableHTML := `
ТАБЛИЦА КОГДА ПРИБАВЛЯЕТСЯ КОЛОНКАДОБАВЛЕНИЕ СТОЛБЦОВ ` + name + `
- + - ` + ` tableMain := t.tableMiddle(row, column) - table := tableHTML + tableMain + tableFinish := + `ДОБАВЛЕНИЕ СТРОК + ДОБАВЛЕНИЕ КОЛОНОК + ТЕКУЩЕЕ СОСТОЯНИЕ ТАБЛИЦЫ + СБРОС ТАБЛИЦЫ ` + + table := tableHTML + tableMain + tableFinish + + if value == "" { + table = "" + } //отправка таблицы в браузер res.Header().Set("Content-Type", "text/html") html := []byte(table) res.Write(html) + return nil +} + +// TokenVerification функция для проверки соответсвия куки файлам- файлам пользователя +func TokenVerification(res http.ResponseWriter, req *http.Request) (string, error) { + token, err := cookies.GetCookie(req, nameCookie) + if err != nil { + fmt.Printf("Нет cookies файлов или неправильный токен метод tokenVerification") + return "", err + } + return token, err +} + +// TokenGet метод для полученияТокенов и имен файлов- cookie +func TokenGet(res http.ResponseWriter, req *http.Request) (string, error) { + cookie := &http.Cookie{Name: nameCookie} + value, err := cookies.SetCookie(res, *cookie) + if err != nil { + fmt.Printf("Проблема с токеном в контроллере в методе tokenVerification%v\n\t", err) + return value, err + } else { + fmt.Printf("ВСЕ ХОРОШО") + } + return value, err } diff --git a/cookies/cookiesMethods.go b/cookies/cookiesMethods.go new file mode 100644 index 0000000..868303e --- /dev/null +++ b/cookies/cookiesMethods.go @@ -0,0 +1,39 @@ +package cookies + +import ( + "fmt" + "httpTable/user_session" + "net/http" +) + +// Cookie структура cookie-файлов +type Cookie struct { + Name string + Value string +} + +//переменная доступа с структуре Cookie +var cookies *Cookie + +// SetCookie функция установка cookie файлов для нового пользователя +func SetCookie(res http.ResponseWriter, cookie http.Cookie) (string, error) { + cookie.Value = user_session.SetCookie() + http.SetCookie(res, &cookie) + return cookie.Value, nil +} + +// GetCookie функция по получению значения имени и значения Токена с браузера +func GetCookie(res *http.Request, name string) (string, error) { + cookie, err := res.Cookie(name) + if err != nil { + fmt.Printf("Ошибка в имени cookie-файла в контроллере функции Get ", err) + return ``, err + } + _, _, _, err = user_session.Get(cookie.Value) + if err != nil { + fmt.Printf("Ошибка в имени cookie-файла в контроллере функции Get", err) + + return ``, err + } + return cookie.Value, nil +} diff --git a/go.mod b/go.mod index aaf703b..c728062 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,8 @@ module httpTable go 1.18 -require github.com/gorilla/mux v1.8.0 // indirect +require ( + github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect + github.com/golang-jwt/jwt/v4 v4.4.3 // indirect + github.com/gorilla/mux v1.8.0 // indirect +) diff --git a/go.sum b/go.sum index 5350288..0f568e9 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,6 @@ +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/golang-jwt/jwt/v4 v4.4.3 h1:Hxl6lhQFj4AnOX6MLrsCb/+7tCj7DxP7VA+2rDIq5AU= +github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= diff --git a/main.go b/main.go index d7a4e01..4ffab39 100644 --- a/main.go +++ b/main.go @@ -5,11 +5,17 @@ import ( "fmt" "github.com/gorilla/mux" "httpTable/controller" + "httpTable/userData" + "httpTable/user_session" "log" "net/http" ) func main() { + //инициализация map-пользователей при запуске приложения + userData.UsersInitializationData() + //инициация map-cookies при начале работы приложения + user_session.InitializationSession() router := mux.NewRouter() fmt.Println("Сервер запустился") //router.HandleFunc регистрация первого маршрута, с URL оканчивающимся на "/reset" и методом GET, создает новый экземпляр конструктора @@ -17,9 +23,12 @@ func main() { router.HandleFunc( "/reset", func(res http.ResponseWriter, req *http.Request) { - //userCtrl := controller.NewUserCtrl() table := controller.NewTableController() - table.ResetTable(res, req) + err := table.ResetTable(res, req) + if err != nil { + http.Redirect(res, req, "/auth", http.StatusSeeOther) + return + } }, ).Methods("GET") //router.HandleFunc регистрация первого маршрута, с URL оканчивающимся на "/add_row" и методом GET, создает новый экземпляр конструктора @@ -27,9 +36,12 @@ func main() { router.HandleFunc( "/add_row", func(res http.ResponseWriter, req *http.Request) { - //userCtrl := controller.NewUserCtrl() table := controller.NewTableController() - table.AddRow(res, req) + err := table.AddRow(res, req) + if err != nil { + http.Redirect(res, req, "/auth", http.StatusSeeOther) + return + } }, ).Methods("GET") //router.HandleFunc регистрация первого маршрута, с URL оканчивающимся на "/add_col" и методом GET, создает новый экземпляр конструктора @@ -37,9 +49,12 @@ func main() { router.HandleFunc( "/add_col", func(res http.ResponseWriter, req *http.Request) { - //userCtrl := controller.NewUserCtrl() table := controller.NewTableController() - table.AddColumn(res, req) + err := table.AddColumn(res, req) + if err != nil { + http.Redirect(res, req, "/auth", http.StatusSeeOther) + return + } }, ).Methods("GET") //router.HandleFunc регистрация первого маршрута, с URL оканчивающимся на "/" и методом GET, создает новый экземпляр конструктора @@ -47,11 +62,61 @@ func main() { router.HandleFunc( "/", func(res http.ResponseWriter, req *http.Request) { - //userCtrl := controller.NewUserCtrl() table := controller.NewTableController() - table.GetCurrentTable(res, req) + err := table.GetCurrentTable(res, req) + if err != nil { + http.Redirect(res, req, "/auth", http.StatusSeeOther) + return + } }, ).Methods("GET") + //router.HandleFunc регистрация первого маршрута, с URL оканчивающимся на "/auth" и методом GET, создает новый экземпляр конструктора + //контроллера, прием-передача параметров функции контроллера GetAuthorizationUsers + router.HandleFunc( + "/auth", + func(res http.ResponseWriter, req *http.Request) { + table := controller.NewAuthorizationUsersController() + num := table.GetAuthorizationUsers(res, req) + //перенаправление на другой роут в случае если пользовать зарегистрировался + if num == 1 { + http.Redirect(res, req, "/", http.StatusSeeOther) + return + } + }, + ).Methods("GET") + //router.HandleFunc регистрация первого маршрута, с URL оканчивающимся на "/register" и методом GET, создает новый экземпляр конструктора + //контроллера, прием-передача параметров функции контроллера AddNewUser + router.HandleFunc( + "/register", + func(res http.ResponseWriter, req *http.Request) { + table := controller.NewAuthorizationUsersController() + num := table.AddNewUser(res, req) + //перенаправление на другой роут в случае если пользовать зарегистрировался + if num == 1 { + http.Redirect(res, req, "/", http.StatusSeeOther) + return + } + }, + ).Methods("GET") + //router.HandleFunc регистрация первого маршрута, с URL оканчивающимся на "/delete" и методом GET, создает новый экземпляр конструктора + //контроллера, прием-передача параметров функции контроллера DeleteUser + router.HandleFunc( + "/delete", + func(res http.ResponseWriter, req *http.Request) { + table := controller.NewAuthorizationUsersController() + table.DeleteUser(res, req) + }, + ).Methods("GET") + //router.HandleFunc регистрация первого маршрута, с URL оканчивающимся на "/logout" и методом GET, создает новый экземпляр конструктора + //контроллера, прием-передача параметров функции контроллера LogOutUser + router.HandleFunc( + "/logout", + func(res http.ResponseWriter, req *http.Request) { + table := controller.NewAuthorizationUsersController() + table.LogOutUser(res, req) + }, + ).Methods("GET") + log.Println("Starting HTTP server on :4000") log.Fatal(http.ListenAndServe(":4000", router)) } diff --git a/model/authorizationUsersModel.go b/model/authorizationUsersModel.go new file mode 100644 index 0000000..ab0e705 --- /dev/null +++ b/model/authorizationUsersModel.go @@ -0,0 +1,60 @@ +package model + +import ( + "fmt" + "httpTable/userData" + "httpTable/user_session" +) + +// TableModel труктура используется для конструктора контроллер +type AuthorizationUsersModel struct { + module *TableModel +} + +// NewTableModel конструктор контроллера, возращающий экземпляр структуры TableModel +// со свойством model контроллера модели +func NewAuthorizationUsersModel() *AuthorizationUsersModel { + return &AuthorizationUsersModel{ + NewTableModel(), + } +} + +// GetAuthorizationUsers метод модели по входу на сайт +func (aut *AuthorizationUsersModel) GetAuthorizationUsers(name string, password string) (string, error) { + name, err := userData.Get(name, password) + if err != nil { + fmt.Println("Ошибка в имени или пароле пользователя метода GetAuthorizationUsers модели", err) + } + return name, err +} + +// AddNewUser метод модели по добавлению нового пользователя +func (aut *AuthorizationUsersModel) AddNewUser(name string, password string, token string) (string, error) { + var err error + if token == `` { + name, err := userData.Add(name, password) + if err != nil { + fmt.Println("Ошибка в имени или пароле пользователя метода AddNewUser модели", err) + } + return name, err + } else { + user_session.SetFirstNameToken(name, token) + user_session.Set(token, 0, 0) + } + return name, err +} + +// DeleteUser метод модели по удалению пользователя, после ввода пароля и имени пользователя +func (aut *AuthorizationUsersModel) DeleteUser(name string, password string) (string, error) { + name, err := userData.Delete(name, password) + if err != nil { + fmt.Println("Ошибка в имени или пароле пользователя метода AddNewUser модели", err) + } + return name, err +} + +// LogOutUser метод модели по удалению текущей сессии пользователя +func (aut *AuthorizationUsersModel) LogOutUser(token string) { + user_session.LogOutToken(token) + +} diff --git a/model/tableModel.go b/model/tableModel.go index a18deac..3c3b5b1 100644 --- a/model/tableModel.go +++ b/model/tableModel.go @@ -1,7 +1,7 @@ package model import ( - "httpTable/table_metadata" + "httpTable/user_session" ) // TableModel труктура используется для конструктора контроллер @@ -15,22 +15,32 @@ func NewTableModel() *TableModel { } // ResetTable метод модели возвращающие параметры таблицы 2х2 -func (t *TableModel) ResetTable() { - table_metadata.TableInf.Row = 2 - table_metadata.TableInf.Column = 2 +func (t *TableModel) ResetTable(value string) { + user_session.Set(value, user_session.Row, user_session.Column) } // AddRow метод модели добавляющий 1 строку после каждого обновления URL -func (t *TableModel) AddRow() { - table_metadata.TableInf.Row++ +func (t *TableModel) AddRow(value string) { + row, column, value, _ := user_session.Get(value) + row++ + user_session.Set(value, row, column) } // AddColumns AddRow метод модели добавляющий 1 колонку после каждого обновления URL -func (t *TableModel) AddColumns() { - table_metadata.TableInf.Column++ +func (t *TableModel) AddColumns(value string) { + row, column, value, _ := user_session.Get(value) + column++ + user_session.Set(value, row, column) } // GetCurrentTable метод возвращающий текущие параметры таблицы без изменения -func (t *TableModel) GetCurrentTable() (row int, colum int) { - return table_metadata.TableInf.Row, table_metadata.TableInf.Column +func (t *TableModel) GetCurrentTable(value string) (int, int, string) { + row, column, valueNon, _ := user_session.Get(value) + if valueNon == `` { + row = user_session.Row + column = user_session.Column + } + nameUser, _ := user_session.GetName(value) + user_session.Set(value, row, column) + return row, column, nameUser } diff --git a/table_metadata/tableMetaData.go b/table_metadata/tableMetaData.go index e8bdb4f..7c4fd05 100644 --- a/table_metadata/tableMetaData.go +++ b/table_metadata/tableMetaData.go @@ -1,8 +1,7 @@ package table_metadata +// TableMetaData структура таблицы type TableMetaData struct { Row int Column int } - -var TableInf = TableMetaData{Row: 2, Column: 2} diff --git a/userData/userSession.go b/userData/userSession.go new file mode 100644 index 0000000..8bd2232 --- /dev/null +++ b/userData/userSession.go @@ -0,0 +1,15 @@ +package userData + +import ( + "httpTable/user_data" + "sync" +) + +// UserVerification структура хранения Имени пользователя-пароля +type UserVerification struct { + userVerif map[string]user_data.UserDataVerification + lock sync.RWMutex +} + +//переменная доступа к структуре UserVerification +var user UserVerification diff --git "a/userData/\321\201onfigUser.go" "b/userData/\321\201onfigUser.go" new file mode 100644 index 0000000..48b2bec --- /dev/null +++ "b/userData/\321\201onfigUser.go" @@ -0,0 +1,74 @@ +package userData + +import ( + "errors" + "fmt" + "httpTable/user_data" + "httpTable/user_session" +) + +// UsersInitializationData запускается при запуске приложения создает map Имя пользователя-пароль +func UsersInitializationData() { + user.userVerif = make(map[string]user_data.UserDataVerification) +} + +// Get функция проверяет соответсвие Имени-пользователя -пароля +func Get(name string, password string) (string, error) { + var err error + user.lock.Lock() + defer user.lock.Unlock() + if valueMap, ok := user.userVerif[name]; ok { + if password == valueMap.Password { + return name, nil + fmt.Printf("Совпало полностью") + } else { + fmt.Printf("Необходимо создать новый токен") + err = errors.New("Такого пароля нет в базе данных ошибка метода Get userData") + return "", err + } + } else { + err = errors.New("Такого пользователя нет в базе данных ошибка метода Get userData") + return "", err + + } + return name, err +} + +// Add функция добавляет нового пользователя и его пароль +func Add(name string, password string) (string, error) { + var err error + user.lock.Lock() + defer user.lock.Unlock() + if _, ok := user.userVerif[name]; ok { + err := errors.New("Пользователь с таким именем уже существует, укажите другое имя") + return "", err + } else { + user.userVerif[name] = user_data.UserDataVerification{password} + return name, nil + } + + return name, err +} + +// Delete функция удаляет пользователя и его пароль из БД +func Delete(name string, password string) (string, error) { + var err error + user.lock.Lock() + defer user.lock.Unlock() + if valueMap, ok := user.userVerif[name]; ok { + if password == valueMap.Password { + delete(user.userVerif, name) + user_session.DeleteToken(name) + fmt.Printf("Совпало полностью") + return name, nil + + } else { + err = errors.New("Такого пароля нет в базе данных ошибка метода Delete userData") + return "", nil + } + } else { + err := errors.New("Пользователь с таким именем уже существует, укажите другое имя") + return name, err + } + return name, err +} diff --git a/user_data/userDataVerification.go b/user_data/userDataVerification.go new file mode 100644 index 0000000..3bda3bf --- /dev/null +++ b/user_data/userDataVerification.go @@ -0,0 +1,6 @@ +package user_data + +// UserDataVerification структура необходимая для хранения соответсвия имени пользователя-пароля +type UserDataVerification struct { + Password string +} diff --git a/user_session/config.go b/user_session/config.go new file mode 100644 index 0000000..f9aa1ea --- /dev/null +++ b/user_session/config.go @@ -0,0 +1,132 @@ +package user_session + +import ( + "crypto/md5" + "encoding/hex" + "errors" + "fmt" + "httpTable/table_metadata" + "strconv" +) + +// Row начальные значения таблицы +const Row = 2 +const Column = 2 + +// InitializationSession -функция запускающаяся когда первый раз запустили приложение для инициализации карт +//Имени пользователя-пароля и Имени пользователя-токенов, Токен-имя пользователя +func InitializationSession() { + session.userInfo = make(map[string]table_metadata.TableMetaData) + userName.infoName = make(map[string][]string) + tokenName.tokenName = make(map[string]string) +} + +// SetFirstNameToken функция для осуществления первого входа пользователя после регистрации +func SetFirstNameToken(name string, token string) { + tokenName.lock.Lock() + defer tokenName.lock.Unlock() + if _, ok := tokenName.tokenName[token]; ok { + fmt.Printf("Такой токен есть") + } else { + tokenName.tokenName[token] = name + } + userName.lock.Lock() + defer userName.lock.Unlock() + if _, ok := userName.infoName[name]; ok { + userName.infoName[name] = append(userName.infoName[name], token) + } else { + userName.infoName[name] = append(userName.infoName[name], token) + } +} + +// LogOutToken функция сброса текущей сессии удаляет запись в map +func LogOutToken(token string) { + session.lock.Lock() + defer session.lock.Unlock() + + if _, ok := session.userInfo[token]; ok { + delete(session.userInfo, token) + } +} + +// DeleteToken функция удаления сессии пользователя +func DeleteToken(name string) { + userName.lock.Lock() + defer userName.lock.Unlock() + if valueMap, ok := userName.infoName[name]; ok { + delete(userName.infoName, name) + for _, value := range valueMap { + fmt.Printf("value", value) + if _, ok := userName.infoName[value]; ok { + fmt.Printf("userName.infoName[value]", userName.infoName[value]) + delete(userName.infoName, value) + } + session.lock.Lock() + defer session.lock.Unlock() + if _, ok := session.userInfo[value]; ok { + delete(session.userInfo, value) + } + } + } +} + +//функция получения имени пользователя по токену +func GetName(value string) (string, error) { + var err error + if valueToken, ok := tokenName.tokenName[value]; ok { + name := valueToken + return name, nil + } else { + err = errors.New("Токена нет в базе данных ошибка метода GetName config") + } + return "", err +} + +// Get функция получение строк и колонок из map по Токену +func Get(value string) (int, int, string, error) { + var rows int + var columns int + var err error + session.lock.Lock() + defer session.lock.Unlock() + if valueMap, ok := session.userInfo[value]; ok { + rows = valueMap.Row + columns = valueMap.Column + } else { + fmt.Printf("Токена нет в базе данных ошибка метода Get config") + err := errors.New("Токена нет в базе данных ошибка метода Get config") + return 0, 0, ``, err + } + return rows, columns, value, err +} + +//полусение нового уникального id для генерации токена под нового пользователя +func SetCookie() string { + token.lock.Lock() + defer token.lock.Unlock() + token.id++ + token := createToken(token.id) + return token +} + +// Set функция присвоения нового значения map по значению Токена +func Set(value string, row int, column int) { + session.lock.Lock() + defer session.lock.Unlock() + + if _, ok := session.userInfo[value]; ok { + session.userInfo[value] = table_metadata.TableMetaData{row, column} + } else { + session.userInfo[value] = table_metadata.TableMetaData{Row, Column} + } + fmt.Printf("session.userInfo из config", session.userInfo) +} + +//createJWTToken-функция создания нового Токена для нового пользователя +func createToken(id int) string { + idString := strconv.Itoa(id) + tokenString := key + idString + tokenByte := md5.Sum([]byte(tokenString)) + token := hex.EncodeToString(tokenByte[:]) + return token +} diff --git a/user_session/userSession.go b/user_session/userSession.go new file mode 100644 index 0000000..d1b62c4 --- /dev/null +++ b/user_session/userSession.go @@ -0,0 +1,45 @@ +package user_session + +import ( + "httpTable/table_metadata" + "sync" +) + +// UserSession структура состаящая из map значение токена-ключ, количество строк и столбцов структура +type UserSession struct { + userInfo map[string]table_metadata.TableMetaData + lock sync.RWMutex +} + +//переменная для доступа к структуре UserSession +var session UserSession + +// UserName структура хранящая Имя пользователя-токены с которых пользователь заходит +type UserName struct { + infoName map[string][]string + lock sync.RWMutex +} + +//переменная для доступа к структуре UserName +var userName UserName + +// TokenName структура хранящая Токен-имя пользователя +type TokenName struct { + tokenName map[string]string + lock sync.RWMutex +} + +//переменная для доступа к структуре TokenName +var tokenName TokenName + +// Token структура токена, для инициализации уникального токена +type Token struct { + id int + key string + lock sync.RWMutex +} + +//переменная для доступа к структуре Token +var token Token + +const key = "my new token for table api"
ТЕКУЩАЯ ТАБЛИЦАТЕКУЩАЯ ТАБЛИЦА ` + name + `