//----------------------------------------------------------------------------------------------------------------------------------------------------- // = 版权 // 上华公司 // = 作者 // lfy // = 版本 // version 1.0 // = 日期 // 2009.3.10 // = 修改日志 // // = 描述 // CDbDwgLicense 上华对象的dwg文档授权验证类 // // BOOL GetDocLicenser() 全局函数,验证文档授权是否通过 // // 授权信息格式如下 // TEXT1 -> string a0|a1|a2|a3|a4|a5|a6|a7|a8|a9 // a0 : 开始时间 a1: 终止时间 // a2 : 授权人账号 a3 : 授权目标账号, 没有目标为 *** // a4 : 时间,每次访问时间 a5 : TPM 服务器ip地址,也可能是服务器名 // a6 : TPM ftp 目录名 a7 : 登录密码 a8 : 端口 // a9 : md5 码,锁定tpm网络环境,由ITPMApp的接口 DispTPMCommand 获得锁定码 // // TEXT2 -> string a0|a1|a2|a3|a5 的锁定码 // TEXT3 -> string a0|a1 的锁定码,一旦过期记录过期前的访问时间 a4 的锁定码 // long -> long 年份 // // 示例: // 0 1 2 3 4 5 6 7 8 9 // 授权全文信息 2008-03-02|2008-09-09|lfy|lh|2009-04-01:09|192.168.0.8|tpm|sa|21|d41d8cd98f00b204e9800998ecf8427e // 校验码 47ad1a4f3684c9f3cd7f9e55431092fe // 预留默认 30dd18ed9dea0f5c4604c79708b8acbf // 预留默认 2009 //= 说明 // 在 vc2005 平台 需要 ADS=17 _INTEGRAL_MAX_BITS=64 // // //----------------------------------------------------------------------------------------------------------------------------------------------------- #ifndef _TDBDWGLICENSE_H__ #define _TDBDWGLICENSE_H__ #if _MSC_VER > 1000 #pragma once #endif #include #include #include #include "dbxrecrd.h" typedef unsigned char byte; typedef unsigned int uint32; class CDbDwgLicense : public AcDbXrecord { public: ACRX_DECLARE_MEMBERS(CDbDwgLicense); CDbDwgLicense(); virtual ~CDbDwgLicense(); //{{AFX_ARX_METHODS(CDbDwgLicense) virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* pFiler) const; virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler* pFiler); virtual void copied(const AcDbObject* dbObj,const AcDbObject* newObj); //}}AFX_ARX_METHODS //{{AFX_ARX_DATA_ACCESS(CDbDwgLicense) //}}AFX_ARX_DATA_ACCESS private: //{{AFX_ARX_DATA(CDbDwgLicense) //}}AFX_ARX_DATA private: void *operator new[](size_t nSize) { return 0; } void operator delete[](void *p) {}; void *operator new[](size_t nSize, const char *file, int line) { return 0; } public: class ImpMD5 { public: ImpMD5(); ImpMD5(const void* input, size_t length); ImpMD5(const std::string& str); ImpMD5(std::ifstream& in); void update(const void* input, size_t length); void update(const std::string& str); void update(const std::wstring& str); void update(std::ifstream& in); const byte* digest(); std::string toString(); void reset(); private: void update(const byte* input, size_t length); void final(); void transform(const byte block[64]); void encode(const uint32* input, byte* output, size_t length); void decode(const byte* input, uint32* output, size_t length); std::string bytesToHexString(const byte* input, size_t length); ImpMD5(const ImpMD5&); ImpMD5& operator=(const ImpMD5&); private: uint32 m_state[4]; /* state (ABCD) */ uint32 m_count[2]; /* number of bits, modulo 2^64 (low-order word first) */ byte m_buffer[64]; /* input buffer */ byte m_digest[16]; /* message digest */ bool m_finished; /* calculate finished ? */ static const byte PADDING[64]; /* padding for calculate */ static const char HEX[16]; enum { BUFFER_SIZE = 1024 }; }; private: // 内部授权校验 BOOL VerifyLicense(); // 获取授权信息 int GetLicenseInfo(char* pszLicense,char* pszVerify,char* pszReserv,long& lReserv); // 从pRblist提取授权信息 int FormatLicenseInfo(struct resbuf* pRbList,char* pszLicense,char* pszVerify,char* pszReserv,long& lReserv); // 授权验证实现 int ImpVerifyLicense(char* pszLicense,char* pszVerify,char* pszReserv,long& lReserv,AcDbObjectId& idLnsNew); // 解析授权信息 int ParserContext(char* pszLicense,std::vector& sSegments); // 格式时间 int FormatTime(std::string& sTime,int& nYear,int& nMont,int& nDay,int& nHour); // 写时间点 AcDbObjectId WriteXRecord(std::vector& sSegments,CTime& tNewPos,int nIndex,char* pszVerify,char* pszReserv,long lReserv); // 写时间点 AcDbObjectId WriteXRecord(std::vector& sSegments,char* pszVerify,std::string& sLockTime,long lReserv); // 创建时间点记录 AcDbObjectId CreateNewLicenseRecord(struct resbuf* pHead,AcDbDatabase* pDb = NULL); // 判断是否有主 BOOL OwnerHasThisLicense(const AcDbObjectId& id); // 复制检测,返回授权id AcDbObjectId CopyNewLicenseRecord(struct resbuf* pHead,AcDbObject* pEnt); int ParserTPMmd5(char* pszLicense,char* pszPassword); void WritePassword(const char* pszPassword); }; // 文档授权校验,TRUE表示通过; BOOL GetDocLicenser(); // Infields 锁 __declspec(dllexport) void SetDwgInFieldsLock(BOOL bLock); //----------------------------------------------------------------------------------------------------------------------------------------------------- // = 版权 // 上华公司 // = 作者 // lfy // = 版本 // version 1.0 // = 日期 // 2009.3.10 // = 修改日志 // // = 描述 // CDbLicenseCarrier 授权加密信息感染类 //= 说明 // 负责在copy,等操作导致实体流出图形时,传出授权加密信息 // //----------------------------------------------------------------------------------------------------------------------------------------------------- class CDbLicenseCarrier : public AcDbEntity { public: ACRX_DECLARE_MEMBERS(CDbLicenseCarrier); CDbLicenseCarrier(); virtual ~CDbLicenseCarrier(); public: //{{AFX_ARX_METHODS(CDbLicenseCarrier) virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* pFiler) const; virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler* pFiler); virtual Acad::ErrorStatus subErase(Adesk::Boolean erasing); //}}AFX_ARX_METHODS //{{AFX_ARX_DATA_ACCESS(CDbLicenseCarrier) //}}AFX_ARX_DATA_ACCESS private: //{{AFX_ARX_DATA(CDbLicenseCarrier) //}}AFX_ARX_DATA // 验证是否有授权对象,没有创建该对象 void VerifyLicense(); // 创建授权加密信息 AcDbObjectId CreateNewLicenseRecord(struct resbuf* pHead,AcDbDatabase* pDb); private: void *operator new[](size_t nSize) { return 0; } void operator delete[](void *p) {}; void *operator new[](size_t nSize, const char *file, int line) { return 0; } }; #endif //_TDBDWGLICENSE_H__