Files
envi-code/SourceCode/Code2026/tg_shs/inc/geo/TDbDwgLicense.h
T
2026-09-28 15:28:50 +08:00

230 lines
6.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//-----------------------------------------------------------------------------------------------------------------------------------------------------
// = 版权
// 上华公司
// = 作者
// 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__