This commit is contained in:
Lorenzo Fiorini
2008-01-26 09:15:58 +00:00
parent 5aa509ba3a
commit 08abc77ab8
7 changed files with 190 additions and 109 deletions

View File

@@ -8,6 +8,18 @@
2002-12-01 13:30 UTC+0100 Foo Bar <foo.bar@foobar.org>
*/
2008-01-26 10:10 UTC+0100 Lorenzo Fiorini (lorenzo.fiorini/at/gmail.com)
* contrib/hbtip/utils.c
added .ico support to TIP_MIMETYPE
* contrib/hbtip/cgi.prg
+ contrib/hbtip/sessid.prg
moved statis funcs GenerateSID, CheckSID, DateToGmt from cgi.prg
to new sessid.prg and renamed to TIP_*
* contrib/hbtip/httpcln.prg
fixed few typos that generated RT errors
* source/rtl/gtxwc/gtxwc.c
added missed K_SH_keys
2008-01-26 09:54 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
* contrib/make_b32_all.bat
* contrib/make_vc_all.bat

View File

@@ -24,7 +24,8 @@ PRG_SOURCES= \
mail.prg \
cgi.prg \
thtml.prg \
sendmail.prg
sendmail.prg \
sessid.prg
PRG_HEADERS= \
thtml.ch \

View File

@@ -71,10 +71,6 @@
#define _CRLF chr(13)+chr(10)
#define _BR '<br />'
#define SID_LENGTH 25
#define BASE_KEY_STRING "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
#define CRC_KEY_STRING "Ak3yStR1Ng" // Max Length must be 10 chars
CLASS TIpCgi
DATA HTTP_RAW_POST_DATA
@@ -106,8 +102,8 @@ CLASS TIpCgi
METHOD StartSession()
METHOD DestroySession()
METHOD CreateSID( cCRCKey ) INLINE ::cSID := GenerateSID( cCrcKey )
METHOD CheckCrcSID( cSID, cCRCKey ) INLINE CheckSID( cSID, cCRCKey )
METHOD CreateSID( cCRCKey ) INLINE ::cSID := TIP_GenerateSID( cCrcKey )
METHOD CheckCrcSID( cSID, cCRCKey ) INLINE TIP_CheckSID( cSID, cCRCKey )
METHOD SessionEncode()
METHOD SessionDecode( cData )
@@ -275,7 +271,7 @@ METHOD DestroySession( cID ) CLASS TIpCgi
if !( lRet := ( FErase( cFile ) == 0 ) )
::Print( "ERROR: On deleting session file : " + cFile + ", File error : " + hb_cStr( FError() ) )
else
::hCookies[ 'SESSIONID' ] := cSID + "; expires= " + DateToGMT( DATE() - 1 )
::hCookies[ 'SESSIONID' ] := cSID + "; expires= " + TIP_DateToGMT( DATE() - 1 )
::CreateSID()
cSID := ::cSID
::hCookies[ 'SESSIONID' ] := cSID
@@ -393,12 +389,12 @@ METHOD StartSession( cSID ) CLASS TIpCgi
if empty( cSID )
if ( nH := hb_HPos( ::hGets, 'SESSIONID' ) ) != 0
cSID := hb_HValueAt( ::hGets, nH )
elseif ( nH := hb_HPos( ::hPosts, 'SESSIONID' ) ) != 0
cSID := hb_HValueAt( ::hPosts, nH )
elseif ( nH := hb_HPos( ::hCookies, 'SESSIONID' ) ) != 0
cSID := hb_HValueAt( ::hCookies, nH )
if ( nH := hb_HPos( ::hGets, 'SESSIONID' ) ) != 0
cSID := hb_HValueAt( ::hGets, nH )
elseif ( nH := hb_HPos( ::hPosts, 'SESSIONID' ) ) != 0
cSID := hb_HValueAt( ::hPosts, nH )
elseif ( nH := hb_HPos( ::hCookies, 'SESSIONID' ) ) != 0
cSID := hb_HValueAt( ::hCookies, nH )
endif
endif
@@ -632,84 +628,4 @@ STATIC FUNCTION HtmlStyle( xVal, cKey )
return cVal
STATIC FUNCTION GenerateSID( cCRCKey )
local cSID, nSIDCRC, cSIDCRC, n, cTemp
local nLenSID := SID_LENGTH
local cBaseKeys := BASE_KEY_STRING
local nLenKeys := Len( cBaseKeys )
local cRet
local nRand, nKey := 0
DEFAULT cCRCKey TO CRC_KEY_STRING
cCRCKey := Left( cCRCKey, 10 ) // Max Lenght must to be of 10 chars
/* Let's generate the sequence */
cSID := Space( nLenSID )
for n := 1 TO nLenSID
nRand := HB_RandomInt( 1, nLenKeys )
cSID := Stuff( cSID, n, 1, SubStr( cBaseKeys, nRand, 1 ) )
nKey += nRand
next
nSIDCRC := nKey * 51 // Max Value is 99603 a 5 chars number
cTemp := StrZero( nSIDCRC, 5 )
cSIDCRC := ""
for n := 1 to Len( cTemp )
cSIDCRC += SubStr( cCRCKey, Val( SubStr( cTemp, n, 1 ) ) + 1, 1 )
next
cRet := cSID + cSIDCRC
RETURN cRet
STATIC FUNCTION CheckSID( cSID, cCRCKey )
local nSIDCRC, cSIDCRC, n, cTemp
local nLenSID := SID_LENGTH
local cBaseKeys := BASE_KEY_STRING
local nLenKeys := Len( cBaseKeys )
local nRand, nKey := 0
DEFAULT cCRCKey TO CRC_KEY_STRING
cCRCKey := Left( cCRCKey, 10 ) // Max Lenght must to be of 10 chars
/* Calculate the key */
for n := 1 to nLenSID
nRand := At( SubStr( cSID, n, 1), cBaseKeys )
nKey += nRand
next
// Recalculate the CRC
nSIDCRC := nKey * 51 // Max Value is 99603. a 5 chars number
cTemp := StrZero( nSIDCRC, 5 )
cSIDCRC := ""
for n := 1 to Len( cTemp )
cSIDCRC += SubStr( cCRCKey, Val( SubStr( cTemp, n, 1 ) ) + 1, 1 )
next
RETURN ( Right( cSID, 5 ) == cSIDCRC )
STATIC FUNCTION DateToGMT( dDate, cTime )
LOCAL cStr := ""
LOCAL cOldDateFormat := Set( _SET_DATEFORMAT, "dd-mm-yy" )
LOCAL nDay, nMonth, nYear, nDoW
LOCAL aDays := { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }
LOCAL aMonths := { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }
DEFAULT dDate TO DATE()
DEFAULT cTime TO TIME()
nDay := Day( dDate )
nMonth := Month( dDate )
nYear := Year( dDate)
nDoW := Dow( dDate )
cStr := aDays[ nDow ] + ", " + StrZero( nDay, 2 ) + "-" + aMonths[ nMonth ] + "-" + ;
Right( StrZero( nYear, 4 ), 2 ) + " " + cTime + " GMT"
Set( _SET_DATEFORMAT, cOldDateFormat )
RETURN cStr

View File

@@ -439,7 +439,7 @@ METHOD getcookies(cHost,cPath) CLASS tIPClientHTTP
ENDIF
//tail matching the domain
aKeys:=hb_hkeyat(::hCookies)
aKeys:=hb_hkeys(::hCookies)
y:=len(aKeys)
z:=len(cHost)
cHost:=upper(cHost)
@@ -455,7 +455,7 @@ METHOD getcookies(cHost,cPath) CLASS tIPClientHTTP
//now that we have the domain matches we have to do path matchine
nPath:=len(cPath)
FOR x := 1 TO y
aKeys:=hb_hkeyat(::hCookies[aDomKeys[x]])
aKeys:=hb_hkeys(::hCookies[aDomKeys[x]])
aPathKeys:={}
b:=len(aKeys)
FOR a:= 1 TO b

View File

@@ -0,0 +1,148 @@
/*
* xHarbour Project source code:
* Functions to create session id and some utils
*
* Copyright 2008 Lorenzo Fiorini <lorenzo.fiorini@gmail.com>
*
* code from:
* TIP Class oriented Internet protocol library
*
* Copyright 2003 Giancarlo Niccolai <gian@niccolai.ws>
*
* www - http://www.harbour-project.org
*
* CGI Session Manager Class
*
* Copyright 2003-2006 Francesco Saverio Giudice <info / at / fsgiudice / dot / com>
* www - http://www.xharbour.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/).
*
* As a special exception, the Harbour Project gives permission for
* additional uses of the text contained in its release of Harbour.
*
* The exception is that, if you link the Harbour libraries with other
* files to produce an executable, this does not by itself cause the
* resulting executable to be covered by the GNU General Public License.
* Your use of that executable is in no way restricted on account of
* linking the Harbour library code into it.
*
* This exception does not however invalidate any other reasons why
* the executable file might be covered by the GNU General Public License.
*
* This exception applies only to the code released by the Harbour
* Project under the name Harbour. If you copy code from other
* Harbour Project or Free Software Foundation releases into a copy of
* Harbour, as the General Public License permits, the exception does
* not apply to the code that you add in this way. To avoid misleading
* anyone as to the status of such modified files, you must delete
* this exception notice from them.
*
* If you write modifications of your own for Harbour, it is your choice
* whether to permit this exception to apply to your modifications.
* If you do not wish that, delete this exception notice.
*
*/
#include 'tip.ch'
#include 'common.ch'
#define SID_LENGTH 25
#define BASE_KEY_STRING "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
#define CRC_KEY_STRING "Ak3yStR1Ng" // Max Length must be 10 chars
FUNCTION TIP_GENERATESID( cCRCKey )
local cSID, nSIDCRC, cSIDCRC, n, cTemp
local nLenSID := SID_LENGTH
local cBaseKeys := BASE_KEY_STRING
local nLenKeys := Len( cBaseKeys )
local cRet
local nRand, nKey := 0
DEFAULT cCRCKey TO CRC_KEY_STRING
cCRCKey := Left( cCRCKey, 10 ) // Max Lenght must to be of 10 chars
/* Let's generate the sequence */
cSID := Space( nLenSID )
for n := 1 TO nLenSID
nRand := HB_RandomInt( 1, nLenKeys )
cSID := Stuff( cSID, n, 1, SubStr( cBaseKeys, nRand, 1 ) )
nKey += nRand
next
nSIDCRC := nKey * 51 // Max Value is 99603 a 5 chars number
cTemp := StrZero( nSIDCRC, 5 )
cSIDCRC := ""
for n := 1 to Len( cTemp )
cSIDCRC += SubStr( cCRCKey, Val( SubStr( cTemp, n, 1 ) ) + 1, 1 )
next
cRet := cSID + cSIDCRC
RETURN cRet
FUNCTION TIP_CHECKSID( cSID, cCRCKey )
local nSIDCRC, cSIDCRC, n, cTemp
local nLenSID := SID_LENGTH
local cBaseKeys := BASE_KEY_STRING
local nLenKeys := Len( cBaseKeys )
local nRand, nKey := 0
DEFAULT cCRCKey TO CRC_KEY_STRING
cCRCKey := Left( cCRCKey, 10 ) // Max Lenght must to be of 10 chars
/* Calculate the key */
for n := 1 to nLenSID
nRand := At( SubStr( cSID, n, 1), cBaseKeys )
nKey += nRand
next
// Recalculate the CRC
nSIDCRC := nKey * 51 // Max Value is 99603. a 5 chars number
cTemp := StrZero( nSIDCRC, 5 )
cSIDCRC := ""
for n := 1 to Len( cTemp )
cSIDCRC += SubStr( cCRCKey, Val( SubStr( cTemp, n, 1 ) ) + 1, 1 )
next
RETURN ( Right( cSID, 5 ) == cSIDCRC )
FUNCTION TIP_DATETOGMT( dDate, cTime )
LOCAL cStr := ""
LOCAL cOldDateFormat := Set( _SET_DATEFORMAT, "dd-mm-yy" )
LOCAL nDay, nMonth, nYear, nDoW
LOCAL aDays := { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }
LOCAL aMonths := { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }
DEFAULT dDate TO DATE()
DEFAULT cTime TO TIME()
nDay := Day( dDate )
nMonth := Month( dDate )
nYear := Year( dDate)
nDoW := Dow( dDate )
cStr := aDays[ nDow ] + ", " + StrZero( nDay, 2 ) + "-" + aMonths[ nMonth ] + "-" + ;
Right( StrZero( nYear, 4 ), 2 ) + " " + cTime + " GMT"
Set( _SET_DATEFORMAT, cOldDateFormat )
RETURN cStr

View File

@@ -226,7 +226,7 @@ typedef struct tag_mime
#define MIME_FLAG_TRIMTABS 0x0002
#define MIME_FLAG_CASEINSENS 0x0004
#define MIME_FLAG_CONTINUE 0x0008
#define MIME_TABLE_SIZE 67
#define MIME_TABLE_SIZE 68
static MIME_ENTRY s_mimeTable[ MIME_TABLE_SIZE ] =
{
@@ -333,7 +333,11 @@ static MIME_ENTRY s_mimeTable[ MIME_TABLE_SIZE ] =
/* 65*/ { 0, "GIF", "image/gif", 0, 0, 0 },
/* JPEG image */
/* 66*/ { 0, "\xff\xd8", "image/jpg", 0, 0, 0 }
/* 66*/ { 0, "\xff\xd8", "image/jpeg", 0, 0, 0 },
/* ICO image */
/* 67*/ { 2, "\x01\x00", "image/x-icon", 0, 0, 0 }
};
/* Find mime by extension */

View File

@@ -192,17 +192,17 @@ static const ClipKeyCode extKeyTab[CLIP_EXTKEY_COUNT] = {
{K_F10, K_ALT_F10, K_CTRL_F10, K_SH_F10}, /* 09 */
{K_F11, K_ALT_F11, K_CTRL_F11, K_SH_F11}, /* 10 */
{K_F12, K_ALT_F12, K_CTRL_F12, K_SH_F12}, /* 11 */
{K_UP, K_ALT_UP, K_CTRL_UP, 0}, /* 12 */
{K_DOWN, K_ALT_DOWN, K_CTRL_DOWN, 0}, /* 13 */
{K_LEFT, K_ALT_LEFT, K_CTRL_LEFT, 0}, /* 14 */
{K_RIGHT, K_ALT_RIGHT, K_CTRL_RIGHT, 0}, /* 15 */
{K_INS, K_ALT_INS, K_CTRL_INS, 0}, /* 16 */
{K_DEL, K_ALT_DEL, K_CTRL_DEL, 0}, /* 17 */
{K_HOME, K_ALT_HOME, K_CTRL_HOME, 0}, /* 18 */
{K_END, K_ALT_END, K_CTRL_END, 0}, /* 19 */
{K_PGUP, K_ALT_PGUP, K_CTRL_PGUP, 0}, /* 20 */
{K_PGDN, K_ALT_PGDN, K_CTRL_PGDN, 0}, /* 21 */
{K_BS, K_ALT_BS, 127, 0}, /* 22 */
{K_UP, K_ALT_UP, K_CTRL_UP, K_SH_UP}, /* 12 */
{K_DOWN, K_ALT_DOWN, K_CTRL_DOWN, K_SH_DOWN}, /* 13 */
{K_LEFT, K_ALT_LEFT, K_CTRL_LEFT, K_SH_LEFT}, /* 14 */
{K_RIGHT, K_ALT_RIGHT, K_CTRL_RIGHT, K_SH_RIGHT}, /* 15 */
{K_INS, K_ALT_INS, K_CTRL_INS, K_SH_INS}, /* 16 */
{K_DEL, K_ALT_DEL, K_CTRL_DEL, K_SH_DEL}, /* 17 */
{K_HOME, K_ALT_HOME, K_CTRL_HOME, K_SH_HOME}, /* 18 */
{K_END, K_ALT_END, K_CTRL_END, K_SH_END}, /* 19 */
{K_PGUP, K_ALT_PGUP, K_CTRL_PGUP, K_SH_PGUP}, /* 20 */
{K_PGDN, K_ALT_PGDN, K_CTRL_PGDN, K_SH_PGDN}, /* 21 */
{K_BS, K_ALT_BS, 127, K_SH_BS}, /* 22 */
{K_TAB, K_ALT_TAB, K_CTRL_TAB, K_SH_TAB}, /* 23 */
{K_ESC, K_ALT_ESC, K_ESC, 0}, /* 24 */
{K_ENTER, K_ALT_ENTER, K_CTRL_ENTER, 0}, /* 25 */