230 lines
6.6 KiB
C++
230 lines
6.6 KiB
C++
//-----------------------------------------------------------------------------------------------------------------------------------------------------
|
||
// = 版权
|
||
// 上华公司
|
||
// = 作者
|
||
// 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 <string>
|
||
#include <vector>
|
||
#include <fstream>
|
||
#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<std::string>& sSegments);
|
||
|
||
// 格式时间
|
||
int FormatTime(std::string& sTime,int& nYear,int& nMont,int& nDay,int& nHour);
|
||
|
||
// 写时间点
|
||
AcDbObjectId WriteXRecord(std::vector<std::string>& sSegments,CTime& tNewPos,int nIndex,char* pszVerify,char* pszReserv,long lReserv);
|
||
|
||
// 写时间点
|
||
AcDbObjectId WriteXRecord(std::vector<std::string>& 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__
|