#include #include #include #include /* The license will be uuencoded on top of xor. This should be sufficient to protect the contents. Lic: TM105R20020101013001EF VVVVVVYYYYMMDDTTDDCCCC XX=version TM105R. should check this against this product version and release YYYY=year of license issuance. 30 day license will use this value to expire itself. MM=month of license issuance 30 day license will use this value to expiure DD=day of license issuance TT=type of license 01=30 day license, expires 30 days from issuance. 02=Full license, never expires. DD=for type 01 license, indicates number of days license is good for. CCCC=checksum, just add up ASCII values of the characters through TT, display in hex. */ const String License::smBeginLicense="BEGIN LICENSE"; const String License::smEndLicense="END LICENSE"; String License::generate(const String &strProductVersion,const SystemTime &issueDate,LicenseType licenseType,int dayCount) { String strLicenseKey; String strIssueDate; String strLicenseType; String strDayCount; String strChecksum; strLicenseKey=String("TM"); strLicenseKey+=strProductVersion.substr(0,3); ::sprintf(strIssueDate,"%4d%02d%02d",issueDate.year(),issueDate.month(),issueDate.day()); strLicenseKey+=strIssueDate; ::sprintf(strLicenseType,"%02d",licenseType); strLicenseKey+=strLicenseType; ::sprintf(strDayCount,"%02d",dayCount); strLicenseKey+=strDayCount; ::sprintf(strChecksum,"%04lx",calculateChecksum(strLicenseKey)); strLicenseKey+=strChecksum; return UUTool::encode(xor(strLicenseKey)); } String numericEncode(const String &strLicense) { return String(); } String numericDecode(const String &strLicense) { return String(); } bool License::fromLines(Block &strLicenseLines) { if(3!=strLicenseLines.size())return false; if(!(strLicenseLines[0]==smBeginLicense))return false; if(!(strLicenseLines[2]==smEndLicense))return false; return fromString(strLicenseLines[1]); } // TM105R2002040301 30 03d8 bool License::fromString(const String &strLicense) { VersionInfo versionInfo; SystemTime currDate; SystemTime expireDate; String strHeader; String strDecoded; String strVersion; int hashCode; mUUEncodedLicense=strLicense; strDecoded=xor(UUTool::decode(strLicense)); strHeader=strDecoded.substr(0,1); if(!(strHeader==String("TM")))return false; mProductVersion=strDecoded.substr(2,5); mIssueDate.year(strDecoded.substr(6,9).toInt()); mIssueDate.month((SystemTime::Month)strDecoded.substr(10,11).toInt()); mIssueDate.day(strDecoded.substr(12,13).toInt()); mLicenseType=(LicenseType)strDecoded.substr(14,15).toInt(); mDayCount=strDecoded.substr(16,17).toInt(); hashCode=strDecoded.substr(18,21).hex(); if(hashCode!=calculateChecksum(strDecoded.substr(0,17)))return false; strVersion=versionInfo.getProductVersionString(); strVersion.removeTokens(", "); strVersion.upper(); if(!(strVersion==mProductVersion))return false; if(Permanent==mLicenseType)return mIsValid=true; expireDate=mIssueDate; expireDate.daysAdd360(mDayCount); if(currDate>=expireDate)return false; return mIsValid=true; } String License::xor(const String &strLicense) { String strEncoded; int strLength; strEncoded.reserve((strLength=strLicense.length())+1); for(int index=0;index