Clarion и SSL

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1412
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

Clarion и SSL

Сообщение RaFaeL »

Решил создать отдельную тему по проблеме, которая страшно мешает жить проекту. Проблема возникла несколько лет назад, после того как большинство бесплатных почтовых серверов запретило прямое подключение и теперь для работы с ними требуется TLS/SSL. При этом в проекте без почты никуда. Частично решается использованием программы stunnel но это очень неудобно. Есть очень большое желание как-либо решить эту проблему и мне кажется очень странным, что по этой проблеме среди кларионщиков за столько лет не появилось решения, при том что есть несколько разных библиотек для работы с почтой и интернетом. Варианты:

1) WinAPI на основе schannel.dll. Это был бы самый правильный путь но он же самый сложный

2) OpenSSL. Пробовали несколько лет назад, "не взлетело", только вылетало уже на второй или третьей функции

3) Нечто под названием PolarSSL. Написано что все очень просто но я ничего не понял и не нашел там собственно готовой dll

4) WinSSL.dll. Эта либа шла ранее в комплекте с Мирандой 0.7.13 и к ней есть исходники. По сути, это обертка над п.1. Мне кажется, это был бы самый простой путь решения вопроса. Что удалось накопать по теме:
http://darkoff.ru/2012/02/ssl-на-сокетах-в-c/ - тут библиотеку используют в исходниках
http://forum.antichat.ru/threads/267997/#post-2624787 - тут можно посмотреть список функций, проверял, действительно есть

Что точно не подходит:
- ClaRunExt так как там нет приема почты (и вряд ли будет)
- NetTalk так как надо под 6.3

Было бы очень замечательно каким-либо образом решить этот вопрос
Вложения
winssl.zip
(3.05 КБ) 124 скачивания
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1412
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

Clarion и SSL

Сообщение RaFaeL »

Еще вариант нарисовался
В комплекте с IP Driver идут либы OpenSSL и к ним osslwrap.dll
Может быть, было бы проще работать через эту dll
Но без примера, "методом тыка" пока тоже не знаю как подойти
gopstop2007
Полимат
Сообщения: 1817
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 27 раз
Поблагодарили: 10 раз

Clarion и SSL

Сообщение gopstop2007 »

RaFaeL писал(а):... что по этой проблеме среди кларионщиков за столько лет не появилось решения...
... я ее решил с помощью https://code.google.com/p/mailsend/wiki/examples все просто и тривиально, так как продвигается гуглом, то при любых изменениях, изменения происходят и в данном приложении. Используется также и для рассылки списком
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1412
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

Clarion и SSL

Сообщение RaFaeL »

Просто разослать можно и через функцию в ClaRunExt там есть флажок SSL
Мне нужно POP3 через TLS
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Clarion и SSL

Сообщение Admin »

Ну вот накатал что то.

Код: Выделить всё

  PROGRAM

  INCLUDE('WINSOCK.INC')
  INCLUDE('windows.inc')

  MAP
    MODULE('WinSSL.DLL')
      SSL_library_init(),LONG,RAW,PASCAL,NAME('SSL_library_init')
      SSL_CTX_new(LONG Method),LONG,RAW,PASCAL,NAME('SSL_CTX_new')
      SSLv23_client_method(),LONG,RAW,PASCAL,NAME('SSLv23_client_method')
      SSL_new(LONG),LONG,RAW,PASCAL,NAME('SSL_new')
      SSL_free(LONG SSL),RAW,PASCAL,NAME('SSL_free')
      SSL_set_fd(LONG SSL, LONG Sock),LONG,RAW,PASCAL,NAME('SSL_set_fd')
      SSL_connect(LONG SSL),LONG,RAW,PASCAL,NAME('SSL_connect')
      SSL_write(LONG SSL, LONG Buffer, LONG BufferSize),LONG,RAW,PASCAL,NAME('SSL_write')
      SSL_read(LONG SSL, LONG Buffer, LONG BufferSize),LONG,RAW,PASCAL,NAME('SSL_read')
      SSL_get_error(LONG SSL, LONG ret),LONG,RAW,PASCAL,NAME('SSL_get_error')
    END
  END


SSLClass                CLASS,TYPE
WSA                       LIKE(WSAData)
Sock                      SOCKET
SSL                       LONG
Init                      PROCEDURE
Init_Winsock              PROCEDURE(),LONG,PROC
Init_DLL                  PROCEDURE(),LONG
Connect                   PROCEDURE(STRING ServerIP, STRING PortNumber),LONG 
Kill                      PROCEDURE()
Send                      PROCEDURE(STRING Text) 
Read                      PROCEDURE(),STRING 
                        END

SL                      SSLClass

  CODE
  SL.Init()
  IF SL.Connect('5.255.255.55', 443)
    MESSAGE('Error on connect')
  END  
  SL.Send('GET / HTTP/1.0\r\nHost: forum.antichat.ru\r\n\r\n')
  MESSAGE(SL.Read())
  SL.Kill()
  !MESSAGE('End & unload')

SSLClass.Init           PROCEDURE
  CODE
  IF SELF.Init_Winsock()
    MESSAGE('Error on init Winsock')
    RETURN
  END
  SELF.SSL = SELF.Init_DLL()
  IF ~SELF.SSL
    MESSAGE('Error on init SSL')
    RETURN
  END
  !MESSAGE('SSL handle: ' & SELF.SSL)

SSLClass.Kill           PROCEDURE()  
  CODE
  IF SELF.SSL
    SSL_free(SELF.SSL)
  END

SSLClass.Send           PROCEDURE(STRING Text) 
LOC:buffer              CSTRING(2048)
  CODE 
  LOC:buffer = Text
  Err# = SSL_write(SELF.SSL,ADDRESS(LOC:buffer),SIZE(LOC:buffer))
  !MESSAGE('SSL_write: ' & Err# & '|GetLastError: ' & GetLastError())

SSLClass.Read           PROCEDURE()!,STRING 
LOC:buffer              CSTRING(2048)
  CODE 
  Err# = SSL_read(SELF.SSL,ADDRESS(LOC:buffer),SIZE(LOC:buffer))
  !MESSAGE('SSL_read: ' & Err#)
  RETURN LOC:buffer

SSLClass.Init_Winsock   PROCEDURE()
s                       SOCKET
wsaDataBlock            LIKE(WSAData)
  CODE
  s = WS_SOCKET(AF_INET, SOCK_STREAM, IPPROTO_TCP)
  IF s = SOCKET_ERROR
    IF WSAGetLastError() = WSANOTINITIALISED                ! Was it that the socket layer wasn't initialised?
      IF WSAStartup(s32_Version2_0, wsaDataBlock)         ! Tries to initialize it
        RETURN 1                                            ! If still an error, give up
      END
      s = WS_SOCKET(AF_INET, SOCK_STREAM, IPPROTO_TCP)
      IF s = SOCKET_ERROR THEN RETURN 1 END                 ! Still error, give up
    END
  END
  SELF.Sock = s
  RETURN 0

SSLClass.Init_DLL       PROCEDURE()    
Method                  LONG
SSL_CTX                 LONG
  CODE
  Ret# = SSL_library_init()
  IF Ret#
    Method = SSLv23_client_method()
    IF Method
      SSL_CTX = SSL_CTX_new(Method)
      IF SSL_CTX
        SSL_Ret# = SSL_new(SSL_CTX)  
        RETURN SSL_Ret#
      END
    END  
  END
  RETURN 0
  
SSLClass.Connect        PROCEDURE(STRING pServerIp, STRING pPortNumber)!,LONG   
szIP                    CSTRING(64)
inetAddr                ULONG
dest                    LIKE(SOCKADDR_IN)
ret                     LONG
  CODE
  szIP = pServerIp
  inetAddr = WS_INET_ADDR(szIP)
  IF inetAddr = INADDR_NONE OR inetAddr = INADDR_ANY
    MESSAGE('Can''t connect to "ANY" address')
    RETURN 1
  END
  dest.sin_family = AF_INET
  dest.sin_addr.s_un.s_addr = inetAddr
  dest.sin_port = WS_HTONS(pPortNumber)
  IF WS_CONNECT(SELF.Sock, ADDRESS(dest), SIZE(dest) ) = SOCKET_ERROR
    MESSAGE('Socket error')
    RETURN 2
  END
  IF ~SSL_set_fd(SELF.SSL, SELF.Sock)
    RETURN 3
  END
  ret = SSL_connect(SELF.SSL)
  IF ret <> 1
    MESSAGE(SSL_get_error(SELF.SSL, ret),'SSL_get_error')
  END
  RETURN 0
Все исходники с библиотеками. Писал на Clarion 10
Часть с сокетами выдрал из QuickSocket.CLW
Windows SSL.zip
Windows SSL
(1.54 МБ) 137 скачиваний
Такой результат при команде SL.Connect('5.255.255.55', 443) ! yandex.ru
Куда долбиться и какие команды слать х.з.
Это уже сами
2015-10-24 19-25-14.png
2015-10-24 19-25-14.png (2.23 КБ) 5196 просмотров
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Clarion и SSL

Сообщение Admin »

Делал на коленке. Так что "AS IS"
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Clarion и SSL

Сообщение Admin »

А кстати с winssl.dll ничего не получилось т.к. SSLv23_client_method почему то возвращала 0. Переделал на виндовую ssleay32.dll и все заработало с ходу. По сути просто подменил DLL т.к. функции совпадают.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1412
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

Clarion и SSL

Сообщение RaFaeL »

Спасибо, буду смотреть!
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Clarion и SSL

Сообщение Admin »

На свой почтовый постучался.
2015-10-24 19-53-24.png
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Clarion и SSL

Сообщение Admin »

Я так понял что для смены вида шифрования нужно менять вызов функции SSLv23_client_method на соответствующую из списка
2015-10-24 20-07-33 LibMaker.png
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Clarion и SSL

Сообщение Admin »

Еще можно добавить в MAP функцию

Код: Выделить всё

      SSL_pending(LONG SSL),LONG,RAW,PASCAL,NAME('SSL_pending')
Возвращает количество байт которые ожидают чтения. Мне не нужно было для теста. А потом подумал... а как много строк читать.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1412
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

Clarion и SSL

Сообщение RaFaeL »

В архиве чего-то не хватает. Ругается на WS_CONNECT и т.п. Хотел проверить так сказать в оригинале в 6.3
Потому что отдельно пробовал последовательности процедур вставлять куда мне нужно - как и ранее, вылет, причём вылет не на эти команды а на нечто произвольное после инициализации SSL
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Clarion и SSL

Сообщение Admin »

Я же написал что тестировал на Clarion 10
Из него можно взять файл WINSOCK.INC, там описаны эти функции.
Или в аттаче
WINSOCK.INC
(39.65 КБ) 467 скачиваний
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Clarion и SSL

Сообщение Admin »

RaFaeL писал(а): Потому что отдельно пробовал последовательности процедур вставлять куда мне нужно
В целом, класс сейчас работает. Отдельно я не знаю что там у вас не так. Нужно смотреть и разбираться.
RaFaeL писал(а): а на нечто произвольное после инициализации SSL
Отлаживать учить что ли? :)
Вставляйте проверки после каждой команды. Смотрите что команда должна возвращать.
SSL команды все в гугле ищутся. Или смотрим тут
Возвращаемые параметры описаны.
Сравнивайте результаты с работающим примером. Удалите код связанный с вашими предыдущими попытками работы с SSL
Может быть где то дублируется описание функций или еще что.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1412
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

Clarion и SSL

Сообщение RaFaeL »

Admin писал(а): Я же написал что тестировал на Clarion 10Из него можно взять файл WINSOCK.INC, там описаны эти функции.
Надо же, столько лет не меняли этот файл а в 10-ке поменяли
Специально посмотрел а 9.1, там от 6.3 разница в одну функцию, а тут вон оно что
Ответить