
Eto
13.06.2016
13:30:11
А что ООП уже не в моде?
Речь не о моде. Речь о смысле. Я пока что знаю только одну задачу, где ООП прекрасно ложится. Во всё остальном он просто лишний.

Dmitry
13.06.2016
13:30:20
ГУИ?

Oleg
13.06.2016
13:30:20
@DmitryBubnenkov если hash( login + pass ) не присутствуют в базе, то значит кто-то что-то не правильно ввёл

Dmitry
13.06.2016
13:30:47
Ну я хочу расширенную инфу давать. Типа юзер есть, пароль не верен

Google

Eto
13.06.2016
13:30:57
ГУИ?
Нет, я говорил о модели данных Telegram.

Oleg
13.06.2016
13:31:35
@DmitryBubnenkov это потенциальная уязвимость
@sigod не думаю что стоит разводить этот спор

Dmitry
13.06.2016
13:32:04
Я понимаю, но тут пока задача сделать именно простую систему.

Pavel
13.06.2016
13:32:06

Oleg
13.06.2016
13:32:32
правильная архитектура всегда сокращает время разработки, а неправильная губит всю разработку

Pavel
13.06.2016
13:32:34
Иначе есть уязвимость к проверке, зарегистрирован ли твой друг в системе

Max
13.06.2016
13:32:54

Dmitry
13.06.2016
13:33:43
Блин. Пока надо вообще чтобы все открытым текстом хранилось. Я пишу онлайн тест очень простенький и там просто тестируемым будут выдаваться логины и пароли готовые. И нужно если что пароль иметь возможность посмотреть и новый скинуть если юзер его забудет

Oleg
13.06.2016
13:34:45
@DmitryBubnenkov прости, но это дичь... не понимаю что собственно этим можно протестировать
систему прав?

Pavel
13.06.2016
13:35:10
студентов протестировать)

Eto
13.06.2016
13:35:26

Google

Dmitry
13.06.2016
13:35:40
Типа того... только не студенты, а раз в пол года разные гаврики

Oleg
13.06.2016
13:36:10
@sigod ООП — это модель мышления разработчика

Dmitry
13.06.2016
13:36:15
там ни регистрации ничего не будет — просто готовые пароли юзерм раздадут и все

Oleg
13.06.2016
13:36:30
если ты хорошо мыслишь в других категориях, значит используй их, раз инструмент позволяет

Pavel
13.06.2016
13:36:47
Конечно после мира webdev php писать веб проекты на D очень тяжело из-за отсутствия практически всех инструментов.

Max
13.06.2016
13:37:36

Oleg
13.06.2016
13:38:33
@DmitryBubnenkov что за гаврики? где будет стоять сервер (какой доступ)? насколько ценна информация на нём?

Dmitry
13.06.2016
13:38:44
Ценность нулевая

Oleg
13.06.2016
13:38:58
тогда зачем вообще логины и пароли?

Dmitry
13.06.2016
13:39:09
Начальство так тупо хочет

Oleg
13.06.2016
13:39:18
хм...
сервер локальный?

Dmitry
13.06.2016
13:39:50
минувшая онлайн система тестирования занимала 30 мегабайт и падала если юзер вместо цифры букву вводил

Oleg
13.06.2016
13:40:09
тестирования кого?

Dmitry
13.06.2016
13:40:15
причем падала от слова совсем — тоесть только чистка БД помогала

Oleg
13.06.2016
13:40:24
ох

Dmitry
13.06.2016
13:41:23
У нас в конторе иногда проводят разную пежню типа обучения кого-то. Нужно узнать на сколько люди адекватны. И что они вообще на старте знают, чтобы программу под них адаптировать

Oleg
13.06.2016
13:41:59
тоесть это не те люди, которые могут ради результатов попробовать взломать сервер?

Dmitry
13.06.2016
13:42:09
не вообще не тот случай
тупо чтобы excel не слать всем с просьбой заполнить

Google

Oleg
13.06.2016
13:43:33
тогда...
`auto a = db.filter(u=>u.login==login);
if( a.empty ) { /* нет пользователя такого */ }
auto user = a.front;
if( user.pass != pass ) { /* введён не верный пароль */ }
это самый простой вариант
но так плохо делать
восклицательный знак потерял
после filter

Pavel
13.06.2016
13:47:01
auto a = db.filter(u=>u.login==login);
а это как работает на уровне БД ? Выбираются все пользователи и потом в памяти фильтруется ?

Dmitry
13.06.2016
13:47:04
ок пасибо
Павел, ну получается что да

Oleg
13.06.2016
13:47:37
@chebotarevp я без малейшего понятия)) это псевдокод))
у каждой orm свои закидоны
а кто-нибудь тут есть, кто давно пользуется D и лазил в код dub?

Dmitry
13.06.2016
13:51:27
Я лазил, только наверно меня спрашивать толку мало)

Oleg
13.06.2016
13:52:07
https://github.com/dlang/dub/issues/50
наверняка кто-то же пробовал реализовать
3 года так то уже весит
и на вскидку не так сложно
особенно учитывая последний комментарий Людвига
почему никто не взялся, не могу понять
может быть на самом деле это сложно?

Google

Oleg
13.06.2016
13:53:31
и существует масса подводных камней?

Max
13.06.2016
14:04:07
почему никто не взялся, не могу понять
Потому что некому. Посмотри на кол-во DIP-ов на wiki.dlang.org, которые даже не ревьювнуты.
Вальтер с Александерску на последнем dconf уже открыто звали людей помогать


Dmitry
13.06.2016
14:15:13
Так. Предположим у меня есть структура:
struct userCredentials // info from DB
{
bool isExists; // to set up flag if user exists in DB
bool isAdmin;
bool passwordOK; //set to true if password from login == password from DB
}
Которую я заполняю так:
userCredentials checkCurrentUserСredentials(string login, string password) // проверяем того кто логинится на основании данных в БД
{
userCredentials usercredentials;
if (usersFromDB.filter!(u=>u.login == login && u.password != password))
{
usercredentials.isExists = true;
usercredentials.passwordOK = false;
}
if (usersFromDB.filter!(u=>u.login == login && u.password == password))
{
usercredentials.passwordOK = true;
if (usersFromDB.filter!(u=>u.usergroup == "admins"))
usercredentials.isAdmin = true;
}
return usercredentials;
}
Далее в коде идет функция login() {}
и мне нужно внутри нее как-то проверить, что мне checkCurrentUserСredentials вернул. Могу я через точку обращаться типа так: checkCurrentUserСredentials.isExists ? Или как это сделать?


Oleg
13.06.2016
14:35:45
логика не правильная
вот как-то совсем не нравится

Pavel
13.06.2016
14:43:11
Мне это не нравится тем, что ты заводишь структуру отдельную и потом используешь ее только в одном месте.
Вместо булевых переменных можно кидать исключения.
Тогда ты в конце кода просто ловишь любое исключение логина и выводишь его если оно есть.

Oleg
13.06.2016
15:03:20
if (usersFromDB.filter!(u=>u.login == login && u.password != password)) мне вот это не нравится
неявное приведение результата фильтрации к bool
хоть длину проверь...
или лучше свойство empty
вопрос выставления куков решён?
просто логиниться при каждом обновлении страницы это не очень

Pavel
13.06.2016
15:09:07
Я думаю что про куки там еще далеко) В vibe.d все вручную

Dmitry
13.06.2016
15:26:15
Да с куками норм все
Я там сессию поднимаю. И с куками напрямую не взаимодействую
Если не заводить булевых переменных ради одного места то как еще быть?

Pavel
13.06.2016
15:37:56
Я вижу смешивание различной логики в одном месте. 1) Поля isExists и passwordOK относятся к аутентификации. Причем если isExists == false то нет смысла сверять правильность пароля.
2) isAdmin это авторизация. Операция проверки применяется к уже открытой сессии которая хранится в куках.

Dmitry
13.06.2016
15:38:38
isAdmin это флаг админской группы

Google

Pavel
13.06.2016
15:38:51
Таким образом, тебе нужно в действии логина лишь проверить логин и пароль последовательно. Если что-то не то, то бросить исключение и написать ошибку. Для этого не нужны переменные вообще.
А вот когда ты уже успешно залогинил пользователя, стартовал ему сессию, то там можно и isAdmin проверять.
Это такая логика во всех фреймворках реализована.

Dmitry
13.06.2016
15:41:20
Хорошо, я примерно понял что у меня криво. Сейчас попробую просто сделать чтобы работало (работу делать все же надо) а потом уже буду думать как сделать покрасивее
Никак не могу в толк взять. Вот передаю я в метод данные:
checkCurrentUserСredentials(login, pass);
теперь мне нужно сделать:
if(checkCurrentUserСredentials.isExists)
{
...
}
Так чтоли? Но checkCurrentUserСredentials получается вроде как вызов меда и обращение к его переменной isExists или нет?
Тогда получается мне нужно создать экземпляр:
userCredentials usercredentials;
вне функций и заполнять его, но это вообще как-то криво

Pavel
13.06.2016
15:47:20
Ты просто делаешь
user = db.findUser(login);
if (user.isEmpty) { throw new Exception("User does not exists"); }
if (user.password != hash(password)) {
throw new Exception("Password incorrect");
}

Dmitry
13.06.2016
15:48:05
Так, а если так как я пытаюсь. Можно так вообще или у меня дико упоротый вариант получается?

Pavel
13.06.2016
15:49:24
Блин да делай как можешь, главное чтобы работало )
Что значит можно/неможно ? Если пускает тех кого надо и не пускает тех кого не надо - значит можно.
Но когда у тебя появятся доп. требования к логину то станет неудобно переделывать

Dmitry
13.06.2016
15:50:40
Я просто не понимаю следующий момент.
С одной стороны мне нужно вызывать функцию:
checkCurrentUserСredentials
и передать в нее логин и пароль, с другой у потом проверять что она возвращает каждый раз т.е. снова и снова ее дергать

Pavel
13.06.2016
15:52:32
Почему каждый раз? Только один раз при логине

Dmitry
13.06.2016
15:52:57
Тогда получается надо сделать так, чтобы checkCurrentUserСredentials просто заполянла стрктуру объявленню до нее и ничего не возвращала. Тогда я смогу проверять что там в структуре получилось

Pavel
13.06.2016
15:53:33
Зачем тебе каждый раз дергать эту функцию? Ты один раз проверил, и записал id сессии в куку

Dmitry
13.06.2016
15:56:15
login (res req)
{
checkCurrentUserСredentials(request["username"].to!string, request["password"].to!string);
// вот теперь мне нужно сделать ряд проверок
if (checkCurrentUserСredentials != res.login
{
делаем ответ что юзера такого нет
}
if (checkCurrentUserСredentials == res.login
{
отвечаем что такой юзер есть
}
и тд
}

Pavel
13.06.2016
15:57:18
У тебя логин и пароль каждый раз передаются чтоли?
Через что? То есть они в каждой html форме ?

Dmitry
13.06.2016
15:58:08
при логине один раз, но по моему коду получается что checkCurrentUserСredentials придется дергать постоянно т.к. она возвращает нужную мне структкру

Pavel
13.06.2016
15:58:45
Во втором запросе откуда ты возьмешь request["password"] ?

Dmitry
13.06.2016
15:59:55
нет, я имею ввиду что согласно моему коду придется внутри if в эту функцию логин и пароль передавать еще и еще раз

Oleg
13.06.2016
16:05:02
@DmitryBubnenkov не до конца понимаю зачем тебе вообще структура с такими полями