Files
envi-code/SourceCode/Code2026/tg_shs/inc/geo/TDbDwgLicense.h
T

229 lines
6.3 KiB
C++
Raw Normal View History

2026-09-28 15:28:50 +08:00
//-----------------------------------------------------------------------------------------------------------------------------------------------------
// = 版权
// 上华公司
// = 作者
// 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__