www.pudn.com > ImageServU.rar > ImageServU.cpp
// ImageServU.cpp : Defines the initialization routines for the DLL. // #include "stdafx.h" #include#include "Serv-U.h" #include "FileName.h" #include "ShellFileOp.h" #include "Zcategories.h" #include "Zimages.h" #include "MD5_CTX.h" #include "bompdmcomm.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif typedef struct tagIMGUSER { CString original_password; //Table[4images_user] long user_id; long user_level;/*用户等级-1---9*/ CString user_name; CString user_password; CString user_email; long user_showemail; long user_allowemails; long user_invisible; long user_joindate; CString user_activationkey; long user_lastaction; CString user_location; long user_lastvisit; long user_comments; CString user_homepage; CString user_icq; //////////////////////////////// //Table[4images_group] // long group_id; // CString group_name; // long group_type; ////////////////////////////// }ImagesUser ; typedef struct tagIMGDATAS { long image_id; long cat_id; long user_id; CString image_name; CString image_description; CString image_keywords; long image_date; long image_active; CString image_media_file; CString image_thumb_file; CString image_download_url; long image_allow_comments; long image_comments; long image_downloads; long image_votes; double image_rating; long image_hits; CString sublib; }ImagesData; typedef struct tagIMGCATS{ long cat_id; CString cat_name; CString cat_description; long cat_parent_id; long cat_hits; long cat_order; long auth_viewcat; long auth_viewimage; long auth_download; long auth_upload; long auth_directupload; long auth_vote; long auth_sendpostcard; long auth_readcomment; long auth_postcomment; }ImagesCat; #define INIFILE "ImageServU.ini" // .ini file name #define LOGFILE "ImageServU.log" // .log file name HINSTANCE hInstanceParam =NULL; CDatabase m_database; void WriteLogFile(HINSTANCE hInstance,LPCTSTR Component ); void AppendLogFile(HINSTANCE hInstance,LPCTSTR Component ); CString CheckUser(CString sUser,CString sPassword) { CString md5_Password; CString err; MD5_CTX md; md5_Password= md.MD5(sPassword.GetBuffer(sPassword.GetLength())); if(!m_database.IsOpen()) { TRY { m_database.OpenEx(PDMDSN,CDatabase::noOdbcDialog); } CATCH(CDBException, e) { err = e->m_strError; return err; } END_CATCH; } CRecordset recset(&m_database); // 设置读取的查询语句. CString sSql; sSql.Format("SELECT * FROM 4images_users WHERE user_name = '%s' AND user_password = '%s'",sUser,md5_Password); // 打开搜查 TRY{ recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly); if(recset.GetRecordCount() !=1) { // 关闭数据库 recset.Close(); err = "invaild user or password"; return err; } // 关闭数据库 recset.Close(); } CATCH(CDBException, e) { err = e->m_strError; return err; } END_CATCH; return err; } int GetUserLevle(CString sUser) { int iuserlevle = -1; if(!m_database.IsOpen()) { TRY { m_database.OpenEx(PDMDSN,CDatabase::noOdbcDialog); } CATCH(CDBException, e) { return -1; } END_CATCH; } CRecordset recset(&m_database); // 设置读取的查询语句. CString sSql; sSql.Format("SELECT * FROM 4images_users WHERE user_name = '%s'", sUser); // 打开搜查 TRY{ recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly); CDBVariant varValue; if(recset.GetRecordCount() !=1) { recset.Close(); return -1; } recset.GetFieldValue("user_level",varValue); iuserlevle = varValue.m_iVal; // 关闭数据库 recset.Close(); } CATCH(CDBException, e) { return -1; } END_CATCH; return iuserlevle; } CString QueryImagesCat(int catid,ImagesCat &c_imagescat){ CString err; if(!m_database.IsOpen()) { TRY{ m_database.OpenEx(PDMDSN,CDatabase::noOdbcDialog); } CATCH(CDBException, e) { err = e->m_strError; return err; } END_CATCH; } CZcategories recset(&m_database); // 设置读取的查询语句. CString sSql; sSql.Format("SELECT * FROM %s WHERE cat_id = %d",TABLE_CATEGORIES ,catid); // 打开搜查 TRY{ recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly); if(recset.GetRecordCount() !=1) { err ="NULL record"; return err; } c_imagescat.cat_id= recset.m_cat_id; c_imagescat.cat_name= recset.m_cat_name; c_imagescat.cat_description= recset.m_cat_description; c_imagescat.cat_parent_id= recset.m_cat_parent_id; c_imagescat.cat_hits= recset.m_cat_hits; c_imagescat.cat_order= recset.m_cat_order; c_imagescat.auth_viewcat= recset.m_auth_viewcat; c_imagescat.auth_viewimage= recset.m_auth_viewimage; c_imagescat.auth_download= recset.m_auth_download; c_imagescat.auth_upload= recset.m_auth_upload; c_imagescat.auth_directupload= recset.m_auth_directupload; c_imagescat.auth_vote= recset.m_auth_vote; c_imagescat.auth_sendpostcard= recset.m_auth_sendpostcard; c_imagescat.auth_readcomment= recset.m_auth_readcomment; c_imagescat.auth_postcomment= recset.m_auth_postcomment; // 关闭数据库 recset.Close(); } CATCH(CDBException, e) { err = e->m_strError; return err; } END_CATCH; return err; } CString QueryUser(CString sUser,ImagesUser &c_user){ CString err; if(!m_database.IsOpen()) { TRY{ m_database.OpenEx(PDMDSN,CDatabase::noOdbcDialog); } CATCH(CDBException, e) { err = e->m_strError; return err; } END_CATCH; } CRecordset recset(&m_database); // 设置读取的查询语句. CString sSql; sSql.Format("SELECT * FROM 4images_users WHERE user_name = '%s'", sUser); // 打开搜查 TRY{ recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly); CDBVariant varValue; if(recset.GetRecordCount() !=1) { recset.Close(); err = "invaild user or password"; return err; } recset.GetFieldValue("user_name",varValue); c_user.user_name = *(varValue.m_pstring); recset.GetFieldValue("user_password",varValue); c_user.user_password = *(varValue.m_pstring); recset.GetFieldValue("user_id",varValue); c_user.user_id= varValue.m_iVal; recset.GetFieldValue("user_level",varValue); c_user.user_level = varValue.m_iVal; recset.GetFieldValue("user_email",varValue); c_user.user_email = *(varValue.m_pstring); recset.GetFieldValue("user_showemail",varValue); c_user.user_showemail = varValue.m_iVal; recset.GetFieldValue("user_allowemails",varValue); c_user.user_allowemails = varValue.m_iVal; recset.GetFieldValue("user_invisible",varValue); c_user.user_invisible = varValue.m_iVal; recset.GetFieldValue("user_joindate",varValue); c_user.user_joindate = varValue.m_iVal; recset.GetFieldValue("user_activationkey",varValue); c_user.user_activationkey = *(varValue.m_pstring); recset.GetFieldValue("user_lastaction",varValue); c_user.user_lastaction = varValue.m_iVal; recset.GetFieldValue("user_location",varValue); c_user.user_location = *(varValue.m_pstring); recset.GetFieldValue("user_lastvisit",varValue); c_user.user_lastvisit = varValue.m_iVal; recset.GetFieldValue("user_comments",varValue); c_user.user_comments = varValue.m_iVal; recset.GetFieldValue("user_homepage",varValue); c_user.user_homepage = *(varValue.m_pstring); recset.GetFieldValue("user_icq",varValue); c_user.user_icq = *(varValue.m_pstring); // 关闭数据库 recset.Close(); } CATCH(CDBException, e) { err = e->m_strError; return err; } END_CATCH; return err; } CString QueryImagesData(int imageid,ImagesData &c_imagesdata){ CString err; if(!m_database.IsOpen()) { TRY{ m_database.OpenEx(PDMDSN,CDatabase::noOdbcDialog); } CATCH(CDBException, e) { err = e->m_strError; return err; } END_CATCH; } CZimages recset(&m_database); // 设置读取的查询语句. CString sSql; sSql.Format("SELECT * FROM %s WHERE image_id = %d",TABLE_IMAGES ,imageid); // 打开搜查 TRY{ recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly); if(recset.GetRecordCount() !=1) { err ="NULL record"; recset.Close(); return err; } c_imagesdata.image_id=recset.m_image_id; c_imagesdata.cat_id=recset.m_cat_id; c_imagesdata.user_id=recset.m_user_id; c_imagesdata.image_name=recset.m_image_name; c_imagesdata.image_description=recset.m_image_description; c_imagesdata.image_keywords=recset.m_image_keywords; c_imagesdata.image_date=recset.m_image_date; c_imagesdata.image_active=recset.m_image_active; c_imagesdata.image_media_file=recset.m_image_media_file; c_imagesdata.image_thumb_file=recset.m_image_thumb_file; c_imagesdata.image_download_url=recset.m_image_download_url; c_imagesdata.image_allow_comments=recset.m_image_allow_comments; c_imagesdata.image_comments=recset.m_image_comments; c_imagesdata.image_downloads=recset.m_image_downloads; c_imagesdata.image_votes=recset.m_image_votes; c_imagesdata.image_rating=recset.m_image_rating; c_imagesdata.image_hits=recset.m_image_hits; c_imagesdata.sublib=recset.m_sublib; // 关闭数据库 recset.Close(); } CATCH(CDBException, e) { err = e->m_strError; return err; } END_CATCH; return err; } static AFX_EXTENSION_MODULE ImageServUDLL = { NULL, NULL }; extern "C" int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { // Remove this if you use lpReserved UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH) { TRACE0("IMAGESERVU.DLL Initializing!\n"); // Extension DLL one-time initialization if (!AfxInitExtensionModule(ImageServUDLL, hInstance)) return 0; // Insert this DLL into the resource chain // NOTE: If this Extension DLL is being implicitly linked to by // an MFC Regular DLL (such as an ActiveX Control) // instead of an MFC application, then you will want to // remove this line from DllMain and put it in a separate // function exported from this Extension DLL. The Regular DLL // that uses this Extension DLL should then explicitly call that // function to initialize this Extension DLL. Otherwise, // the CDynLinkLibrary object will not be attached to the // Regular DLL's resource chain, and serious problems will // result. hInstanceParam = hInstance ; CString szNow; GetSysTime(szNow); CString log; log.Format("%s-> load imageservu.dll success! for zpmcpdm system, written by zhoudaqiao,corpy right 2006",szNow); ReadIniFileFromModuleFileDir(hInstanceParam,INIFILE); WriteLogFile(hInstanceParam,log); log.Format("\nGet setting EXEFILE_DWG2DWF = %s",EXEFILE_DWG2DWF); AppendLogFile(hInstanceParam,log); log.Format("\nGet setting EXEFILE_DWG2JPG = %s",EXEFILE_DWG2JPG); AppendLogFile(hInstanceParam,log); log.Format("\nGet setting EXEFILE_DWG2PDF = %s",EXEFILE_DWG2PDF); AppendLogFile(hInstanceParam,log); log.Format("\nGet setting EXEFILE_DWG2SLD = %s",EXEFILE_DWG2SLD); AppendLogFile(hInstanceParam,log); log.Format("\nGet setting IMAGES_HOMEDIR = %s",IMAGES_HOMEDIR); AppendLogFile(hInstanceParam,log); /* log.Format("\n登陆DSN:user=%s,name=%s",IMAGES_ADMIN,IMAGES_PASSWORD); AppendLogFile(hInstanceParam,log); if (pg_imagerec ==NULL) { CString err = g_imagerec.LoginDSN(IMAGES_ADMIN,IMAGES_PASSWORD); log.Format("\n登陆DSN:user=%s,name=%s",IMAGES_ADMIN,IMAGES_PASSWORD); AppendLogFile(hInstanceParam,log); if ( err !="") { log.Format("\n登陆DSN出错:%s",err); AppendLogFile(hInstanceParam,log); } } */ new CDynLinkLibrary(ImageServUDLL); } else if (dwReason == DLL_PROCESS_DETACH) { TRACE0("IMAGESERVU.DLL Terminating!\n"); if(m_database.IsOpen()) { m_database.Close(); } // Terminate the library before destructors are called AfxTermExtensionModule(ImageServUDLL); } return 1; // ok } int __cdecl HandleClientEvent(RClientEventStr* pEventStruc) { int Ret = 0 ; // 0 not handled - 1 handled //如果需要修改事件的默认反映,记得返回1,否则服务器没有任何反映 // disect event switch (pEventStruc->Event) { case SRVU_LoginMesFile : // get login message file break; case SRVU_HomeDir : // get home dir strcpy(pEventStruc->Aux,IMAGES_HOMEDIR); pEventStruc->Flag = TRUE; Ret = 1; break; case SRVU_Password : // verify password if(strlen(pEventStruc->Aux) >0) { CString err = CheckUser(pEventStruc->User,pEventStruc->Aux) ; if (err == "") { pEventStruc->Flag = TRUE; } } Ret = 1; break; case SRVU_IPAccess : // verify IP access break; case SRVU_WriteFile : // verify write access break; case SRVU_ReadFile : // verify read access if (GetUserLevle(pEventStruc->User) > 0) { pEventStruc->Flag = TRUE; } Ret = 1; break; case SRVU_ModifyFile: // verify mod./del. file access break; case SRVU_ExecProg : // verify execute access break; case SRVU_ListDir : // verify dir listing access if (GetUserLevle(pEventStruc->User) > 0) { pEventStruc->Flag = TRUE; } Ret = 1; break; case SRVU_ChangeDir : // verify dir change access if (GetUserLevle(pEventStruc->User) > 0) { pEventStruc->Flag = TRUE; } Ret = 1; break; case SRVU_DeleteDir : // verify dir delete access if (GetUserLevle(pEventStruc->User) == 9) { pEventStruc->Flag = TRUE; } Ret = 1; break; case SRVU_CreateDir : // verify dir create access if (GetUserLevle(pEventStruc->User) == 9) { pEventStruc->Flag = TRUE; } Ret = 1; break; case SRVU_HideHidden : // get setting for 'hide hidden files' break; case SRVU_RelPaths : // get setting for 'relative paths' pEventStruc->Flag = TRUE; Ret = 1; break; case SRVU_RatioType : // get setting for type of ratios break; case SRVU_RatioDown : // get setting for download ratio break; case SRVU_RatioUp : // get setting for upload ratio break; case SRVU_RatioCredit : // get/adjust ratio credit setting break; case SRVU_RatioFree : // verify if file is free for ratios break; case SRVU_QuotaEnable : // verify if disk quota is enabled break; case SRVU_QuotaChange : // change in disk quota break; case SRVU_QuotaMax : // maximum disk quota break; case SRVU_AlwaysLogin : // always allow login break; case SRVU_OneLoginPerIP : // allow one login per user/IP pair break; case SRVU_LogClientIP : // log client from this IP address break; case SRVU_SpeedLimit : // maximum transfer speed break; case SRVU_PassChange : // change user's password break; case SRVU_TimeOut : // get user time-out value break; case SRVU_MaxUsers : // max. no. of users for account break; case SRVU_PassChallenge : // get password challenge if needed break; case SRVU_Connect : // information only: client connected break; case SRVU_Close : // information only: client disconnected if(m_database.IsOpen()) { m_database.Close(); } break; case SRVU_MaxLoginPerIP : // max. no. of logins from same IP for user break; case SRVU_VerifyPasswd : // verify old password before changing it break; case SRVU_AppendFile : // verify append file access break; case SRVU_SignOnMes : // get signon message file break; case SRVU_SignOffMes : // get signoff message file break; case SRVU_Maintenance : // switch to maintenance mode break; case SRVU_SessionTimeOut : // session time-out break; case SRVU_SecureOnly : // only allow login over secure connection break; case SRVU_PassExpired : // verify if password is expired break; default: ; } return(Ret); } WORD CALLBACK HandleEventHook(RFTPEventStr* pEventStruc) { WORD Ret=REVNT_None; // return value, default is to allow operation // disect event switch (pEventStruc->Event) { case EVNT_EndUp: // successful upload of file break; case EVNT_EndDown: // successful download of file break; default: ; } return (Ret); } void WriteLogFile(HINSTANCE hInstance,LPCTSTR Component ) // ****** // Load .ini file variables // ****** { char LogFile[MAX_PATH]; // full path of .ini file // only initialize once static bool Once=FALSE; if (Once) return; // already initialized Once=true; // this is first time, remember // construct full path of .ini file GetModuleFileName(hInstance,LogFile,MAX_PATH); char* pEnd=strrchr(LogFile,'\\'); // strip .dll file name if (pEnd) pEnd[1]='\0'; strcat(LogFile,LOGFILE); // create full path .ini name CStdioFile file; if(file.Open(LogFile,CFile::modeCreate)) { file.Close(); } if(file.Open(LogFile,CFile::modeWrite)) { // file.SeekToEnd(); file.WriteString(Component); file.Close(); } /* // get log file name GetPrivateProfileString(INISECTION,INILOGFILE,"",LogFile,MAXPATH,IniFile); // get the double space value bDoubleSpace = (GetPrivateProfileInt(INISECTION, INIDBLSPACE, 0, IniFile)) ? true : false; */ } void AppendLogFile(HINSTANCE hInstance,LPCTSTR Component ) { char LogFile[MAX_PATH]; // full path of .ini file /* // only initialize once static bool Once=FALSE; if (Once) return; // already initialized Once=true; // this is first time, remember */ // construct full path of .ini file ::GetModuleFileName(hInstance,LogFile,MAX_PATH); char* pEnd=strrchr(LogFile,'\\'); // strip .dll file name if (pEnd) pEnd[1]='\0'; strcat(LogFile,LOGFILE); // create full path .ini name CStdioFile file; if(file.Open(LogFile,CFile::modeWrite)) { file.SeekToEnd(); file.WriteString(Component); file.Close(); } }