Метод содержит следующие локальные переменные:
pop3Socket *pSocket – указатель на объект класса pop3Socket;
Cstring ip – строка типа Cstring, предназначенная для зранения ip адреса сервера
int port – целочисленная переменная для хранения номера порта сервера;
CString messtr – строка для хранения сформированного сообщения ответа клиента
CString pswd – строка для хранения паролья прользователя;
CString login – строка для хранения имени пользователя;
char * buf = new char [128] – массив для хранения принятов строки от сервера;
char fl=0 – переменная для анализа ответа сервера;
char * stamp = new char[64] – строка для хранения временной метки сервера.
Метод вызывается при нажатии пользователем на кнопку соединения с сервером. Подразумевается, что на момент нажатия кнопки, пользователь ввел все необходимые для функционирования программы данные, как то: имя, пароль, адрес, номер порта, тип аутентификации. Наличие полноты ввода этих данных проверяется программой и, в случае, если какие-либо из них отсутствуют, программа выдает сообщение об ошибке в виде окна AfxMessageBox.
Как только данный метод вызывается, происходит считывание введенных данных в переменные с помощью функции GetDlgItemText. Параметрами данной функции являются идентификатор элемента управления из которого считывается строка и переменная, в котороую данные считываются.
GetDlgItemText(IDC_EDIT1,ip); - из строки ввода в переменную ip
GetDlgItemText(IDC_EDIT2,login); - из строки ввода имени пользователя в переменную login;
port = atoi(login); - с помощью функции atoi строка login преобразуется в целочисленное значение и присваивается переменной port.
GetDlgItemText(IDC_EDIT3,login); - из строки ввода имени в строку login
GetDlgItemText(IDC_EDIT4,pswd); - из строки ввода пароля в строку pswd.
После этого производится проверка того, что был выбран тип аутентификации, если ни один из типов аутентификации выбран не был, то происходит вызов диалогового окна с сообщением об ошибке.
|
Если проверка проёдена успешно, происходит создание сокета pSocket=new pop3Socket(this), и его инициализация pSocket->Create().
Далее функционирование программы осуществляется в зависимости от выбранного типа аутентификации. Для этого производится анализ переменных simple, apop и auth.
1.3 Простая аутентификачия
1. Осуществляется соединение с сервером с помощью вызова методоа сокета pSocet: pSocket->Connect(ip,port), где в качестве параметров передаются строка, содержащая адрес сервера и номер порта Если соединение не установлено по каким-либо причинам, то производится вызов окна ошибки и завершение программы.
2. Ожидание и получение строки ответа от сервера в массив и buf с помощью вызова метода сокета pSocet->Receive(buf,0). В случае, если данные не были получены этот метод возвращает отрицательное число, в противном случае возвращает количество полученных байт. Количество байт, полученных от сервера присваивается переменной int recived.
3. Производится форматирование с помощью метода строки messtr.Format() строки messtr messtr.Format("S: %s",buf). Этот метод добавляет в начало строки символ последовательность “S: ” и далее содеримое массива buf.
4. Производится ывод строки messtr в ListBox с помощью вызова метода Protocol->Add(messtr).
5. В цикле от 0 до 127 элемента производится обнуление массива buf
6. С помощью вызова метода EnableWindow объекта disconect_btn с true в качестве параметра производится установка окна кнопки разрыва соединения с сервером в активное сотояние.
|
7. С помощью вызова метода EnableWindow объекта conect_btn с false в качестве параметра производится установка окна кнопки соединения с сервером в неактивное стостояние.
8. Если от сервера получен положительный ответ (проверяется по значению переменной fl: если она имеет значение «+», то ответ положителен, если «-», то отрицателен), тогда производится отправка ему строки с командой USER:
«pSocket->Send("USER " + login + "\n\r",strlen("USER ")+strlen(login) + strlen("\n\r"),1)», если нет, то осуществляется переход к пункту 14
9. Повторить 2-7
10. Повторить п 8-9 (с командой PASS: pSocket->Send("PASS " + pswd + "\n\r",strlen("PASS ")+strlen(pswd)+strlen("\n\r"),0))
11. Повторить п 8-9 с командой STAT:
pSocket->Send("STAT\n\r",strlen("STAT\n\r"),0)
12. Послать серверу команду QUIT:
pSocket->Send("QUIT\n\r",strlen("QUIT\n\r"),0)
APOP аутентификация
1. Производится объявление объекта md5Capi класса Cmd5Capi. Этот объект осуществляет вычисление хэш-функции MD5. Объявление переменных – CString out,in,test; int start,end;
2. Если соединение с сервером установлено то 3, инчае вывод окна ошибки:
3. Установка окна кнопки соединения с сервером в неактивное сотояние
4. Устанвка окна кнопки разрыва соединения в активное стостояние
5. Получение строки ответа от сервера в массив и buf. Количество байт, полученных от сервера присваивается переменной int recived.
6. Формирование с помощью метода строки messtr.Forma() строки messtr messtr.Format("S: %s",buf)
7. Поиск в полученной от сервера строки приветствия уникальной метки.
8. Вывод строки messtr в ListBox.
9. Обнуление массива buf
10. Если от сервера получен положительный ответ, то 11, иначе 14
|
11. Вычисление MD5 хэша от строки вида: метка_сервера+пароль
12. Отправка серверу команды APOP:
out="APOP " + login + " " + md5Capi.Digest(in)+"\n\r";
pSocket->Send(out,out.GetLength(),0)
13. Если получен положительный ответ, то отправка серверу команды STAT, иначе 14
14. Отправка серверу команды QUIT.
AUTH аутентификация
1. Если соединение с сервером установлено то 2, инчае вывод окна ошибки:
2. Установка окна кнопки соединения с сервером в неактивное сотояние
3. Устанвка окна кнопки разрыва соединения в активное стостояние
4. Получение строки ответа от сервера в массив и buf. Количество байт, полученных от сервера присваивается переменной int recived.
5. Формирование с помощью метода строки messtr.Forma() строки messtr messtr.Format("S: %s",buf)
6. Поиск в полученной от сервера строки приветствия уникальной метки.
7. Вывод строки messtr в ListBox.
8. Обнуление массива buf
9. Если от сервера получен положительный ответ, то 11, иначе 14
10. Вычисление MD5 хэша от метки сервера с паролем пользователя в качестве ключа.
11. Отправка серверу команды APOP:
out="AUTH " + login + " " + md5Capi.Digest(in)+"\n\r";
pSocket->Send(out,out.GetLength(),0)
12. Если получен положительный ответ, то отправка серверу команды STAT, иначе 14
13. Отправка серверу команды QUIT.
· 2. Описание алгоритма программы
Производится подключение к серверу. Если соединение не может быть установлено, то выдается соответствующее сообщение об ошибке и программа завершает свою работу. Если соединение с сервером установлено, то производится выбор ветки алгоритма, по которой пойдет выполнение программы. Она выбирается в зависимости от выбранного пользователем типа аутентификации. В зависимости от этого типа, программа выполняет соответствующую процедуру. Программа поддерживает три вида аутентификации: простая аутентификация, при которой пароль и имя пользователя передаются по каналу связи в незащищенном открытом виде; аутентификация с использованием безключевой хэш-функции MD5, аутентификация с использованием ключевой хэш-функции MD5. В случае, если пользователем выбран тип аутентификации – простая аутентификация, то производится переход к процедуре обработки этого типа аутентификации. В случае, если пользователем выбран тип аутентификации с использованием хэш-функций MD5, то производится формирование строки, которая используется для вычисления хэш-функции и производится переход к процедурам, обрабатывающим данные виды аутентификации.
Простая аутентификация
После подключения разрабатываемого клиентского приложения к серверу и воду пользователем необходимых строк, серверу отправляется команда USER с именем пользователя. После этого программа переходит в режим ожидания ответа сервера. После того как строка с ответом сервера приходит в сокет клиента, то эта строка сохраняется в соответствующий буфер, который используется для хранения строк, содержащих команды протокола. После этого производится проверка ответной строки сервера. Если строка ответа сервера содержит начальную подстроку –ERR, то значит ящика с данным именем на сервере не существует. В данном случае серверу отправляется команда QUIT и производится выход из процедуры. Если же строка начинается с +ОК, то почтовый ящик с данным именем существует на сервере и сервер ожидает пароля для доступа к нему. Далее производится отправка серверу строки с командой PASS, содержащей пароль пользователя для доступа к почтовому ящику. Далее программа опять переходит в режим ожидания ответа сервера и производится прием и анализ полученной от него строки. Если строка содержит начальную подстроку +ОК, значит пароль, введенный пользователем корректен, и сервер перешел в операционную фазу. Если строка-ответ сервера содержит подстроку –ERR, то серверу отправляется команда QUIT и производится выход из процедуры.
Если аутентификация успешно завершена, то алгоритм работы программы переход в операционную фазу. На этой фазе функционирования программы серверу последовательно отсылаются команды STAT – для вывода статистики почтового ящика пользователя и команда QUIT – для завершения соединения с сервером.
APOP аутентификация
Если пользователем был выбран тип аутентификации с использованием бесключевой хэш-функции MD5, то алгоритм программы переходит к выполнению данной процедуры. В данном виде аутентификации используется строка, которая была получена из основной части алгоритма. На втором шаге алгоритма функции apop производится склеивание полученной строки метки времени сервера с паролем пользователя. После этого производится вычисление MD5 хэша от этой строки. После этого формируется строка для команды APOP. Эта строка имеет следующий вид: «APOP имя_пользователя хэш-функция». После того, как эта строка сформирована, она отправляется серверу. После этого программа переходит в состояние ожидания ответна от сервера. После получения строки с ответом сервера производится ее разбор. Если строка содержит начальную подстроку –ERR, то аутентификации е пройдена и производится отправка серверу строки с командой QUIT и выход из программы. Если строка содержит начальную подстроку +OK, то значит аутентификация пройдена успешно и программа переходит в операционную фазу. В этой фазе серверу отсылается команда STAT и после этого команда QUIT. После этого производится разрыв связи с сервером и завершение программы.