Imports System.IO Imports UTS_Core.DebugLog Imports UTS_Core.Security Namespace UTSModule.License Public Class License ''' License文件字段枚举 Private Enum LicenseKeyEnum ''' 客户名 VendorName ''' 注册日期 AuthorizationDate ''' 截止日期 ExpirationDate ''' 管理员账号 DefaultUser ''' 管理员密码 DefaultPassword ''' 远程数据库URL或IP MysqlServer ''' 远程数据库连接端口 MysqlPort ''' 远程数据库账号 MysqlUserID ''' 远程数据库密码 MysqlPassword ''' 远程数据库私有操作库 MysqlDatabase ''' 远程数据库共有操作库 PublicDb ''' 本地数据库存放文件夹 SqliteDir ''' 本地数据库文件名 SqliteName ''' 本地数据库密码 SqlitePassword ''' 客户MAC地址,锁定|MAC时使用 MAC ''' 备注 Remark ''' UTS版本号 UtsVersion ''' 签名 Signature End Enum ''' License文件校验返回枚举值 Public Enum LicenseCheckCodeEnum ''' 未找到License NoLicense ''' 无法打开License CantOpenLicense ''' 无效的License InvalidLicense ''' 校验通过 CheckPass End Enum ''' License校验结果 Public Enum EnLicenseCheckCode ''' 校验通过 CheckPass ''' 无效的客户 InvalidCustomer ''' 无效的注册日期 InvalidAuthorizationDate ''' 无效的截止日期 InvalidExpirationDate ''' 无效的用户 InvalidDefaultUser ''' 无效的用户密码 InvalidDefaultPassword ''' 无效的MAC地址 InvalidMac ''' 无效的UTS版本 InvalidUtsVersion ''' 无效的签名 InvalidSignature ''' 无效的数据库地址 InvalidDatabaseServer ''' 无效的数据库名 InvalidDatabaseName ''' 无效的数据库用户 InvalidDatabaseUserID ''' 无效的数据库密码 InvalidDatabaseUserPassword ''' 无效的数据库端口号 InvalidDatabaseUserPort ''' 无效的数据库名(sqlite) InvalidDatabaseFileName ''' 无效的数据库文件夹名(sqlite) InvalidDatabaseDirName End Enum ''' 存储License签名校验值 Private ReadOnly _standardSignature As String = "this is a valid license data" ''' License密钥 Private ReadOnly _licenseAesKey As String = "8h(*H&-987OygO8yg*yS$&G&aG9*&6g96*&7^RA65s76r*&&G(*(7(Gyg7#7Ff7F*&(*&&^5GHo96tr5ff&*Hphg7665^fyu&uOhj0j[0[(jOIhI&g77FgghO*hhHY" Sub New(licensePath As String) ReadLicenseFile(licensePath) End Sub ''' ''' 获取客户名 ''' ''' 客户名 Public Property VendorName As String ''' ''' 获取注册日期 ''' ''' 注册日期 Public Property AuthorizationDate() As String ''' ''' 获取截止日期 ''' ''' 截止日期 Public Property ExpirationDate() As String ''' ''' 获取管理员账号 ''' ''' 管理员账号 Public Property DefaultUser() As String ''' ''' 获取管理员密码 ''' ''' 管理员密码 Public Property DefaultPassword() As String ''' ''' 远程数据库URL或IP ''' ''' 远程数据库URL或IP Public Property MysqlServer() As String ''' ''' 远程数据库连接端口 ''' ''' 远程数据库连接端口 Public Property MysqlPort() As String ''' ''' 远程数据库账号 ''' ''' 远程数据库账号 Public Property MysqlUserID() As String ''' ''' 远程数据库密码 ''' ''' 远程数据库密码 Public Property MysqlPassword() As String ''' ''' 远程数据库操作库 ''' ''' 远程数据库操作库 Public Property MysqlDatabase() As String ''' ''' 远程数据库公开库 ''' ''' Public Property PublicDb() As String ''' ''' 本地数据库存放文件夹 ''' ''' 本地数据库存放文件夹 Public Property SqliteDir() As String ''' ''' 本地数据库文件名 ''' ''' 本地数据库文件名 Public Property SqliteName() As String ''' ''' 本地数据库密码 ''' ''' 本地数据库密码 Public Property SqlitePassword() As String ''' ''' 获取客户MAC地址 ''' ''' 客户MAC地址 Public Property Mac() As String ''' ''' 获取备注 ''' ''' 备注 Public Property Remark() As String ''' ''' 获取UTS版本号 ''' ''' UTS版本号 Public Property UtsVersion() As String ''' ''' 获取签名 ''' ''' 签名 Public Property Signature() As String Public Function DealLicenseString(strLicense As String) As Boolean strLicense = strLicense.Replace(vbLf, String.Empty) Dim lines() As String = strLicense.Split(Chr(13)) For Each line As String In lines Dim keyValues As String() = line.Split("="c) If keyValues.Length = 2 Then keyValues(0) = keyValues(0).Trim() keyValues(1) = keyValues(1).Trim() InitLicenseField(keyValues(0), keyValues(1)) Else Throw New Exception($"ReadLicense Error:{LicenseCheckCodeEnum.InvalidLicense}") End If Next Return True End Function Private Sub InitLicenseField(key As String, value As String) Dim field As LicenseKeyEnum If [Enum].TryParse(key, field) = False Then ApplicationLog.WriteLog(ApplicationLog.LogTypes.Error, $"Error LicenseField,Key:{key},Value:{value}") Return End If Select Case field Case LicenseKeyEnum.AuthorizationDate AuthorizationDate = value Case LicenseKeyEnum.DefaultPassword DefaultPassword = value Case LicenseKeyEnum.DefaultUser DefaultUser = value Case LicenseKeyEnum.ExpirationDate ExpirationDate = value Case LicenseKeyEnum.MAC Mac = value Case LicenseKeyEnum.Remark Remark = value Case LicenseKeyEnum.Signature Signature = value Case LicenseKeyEnum.UtsVersion UtsVersion = value Case LicenseKeyEnum.VendorName VendorName = value Case LicenseKeyEnum.MysqlServer MysqlServer = value Case LicenseKeyEnum.MysqlPort MysqlPort = value Case LicenseKeyEnum.MysqlUserID MysqlUserID = value Case LicenseKeyEnum.MysqlPassword MysqlPassword = value Case LicenseKeyEnum.MysqlDatabase MysqlDatabase = value Case LicenseKeyEnum.PublicDb PublicDb = value Case LicenseKeyEnum.SqliteDir SqliteDir = value Case LicenseKeyEnum.SqliteName SqliteName = value Case LicenseKeyEnum.SqlitePassword SqlitePassword = value Case Else ApplicationLog.WriteLog(ApplicationLog.LogTypes.Warn, $"Untreated,Key:{key},Value:{value}") End Select End Sub ''' ''' 读取License文件所有内容,并进行解密,将解密后的内容存入License字典中 ''' ''' License文件完整路径(含文件名) Public Sub ReadLicenseFile(licensePath As String) If File.Exists(licensePath) = False Then Throw New Exception($"ReadLicense Error:{LicenseCheckCodeEnum.NoLicense}") End If Dim strLicense As String = Aes128.DecryptStr(File.ReadAllText(licensePath), _licenseAesKey) DealLicenseString(strLicense) End Sub Public Function CheckLicense() As Boolean '校验注册日期 Dim nowDate As String = Format(Now.Date, "yyyy-MM-dd") & " " & Format(TimeOfDay, "HH:mm:ss") If String.Compare(nowDate, AuthorizationDate, StringComparison.OrdinalIgnoreCase) < 0 Then Throw New Exception($"CheckLicense Error:{EnLicenseCheckCode.InvalidAuthorizationDate}") End If '校验截止日期 If String.Compare(nowDate, ExpirationDate, StringComparison.OrdinalIgnoreCase) > 0 Then Throw New Exception($"CheckLicense Error:{EnLicenseCheckCode.InvalidExpirationDate}") End If '默认用户 If String.IsNullOrWhiteSpace(DefaultUser) Then Throw New Exception($"CheckLicense Error:{EnLicenseCheckCode.InvalidDefaultUser}") End If '默认用户密码 If String.IsNullOrWhiteSpace(DefaultPassword) Then Throw New Exception($"CheckLicense Error:{EnLicenseCheckCode.InvalidDefaultPassword}") End If '校验签名 If String.Compare(Signature, _standardSignature, True) <> 0 Then Throw New Exception($"CheckLicense Error:{EnLicenseCheckCode.InvalidSignature}") End If '校验数据库URL或IP If String.IsNullOrEmpty(MysqlServer) Then Throw New Exception($"CheckLicense Error:{EnLicenseCheckCode.InvalidDatabaseServer}") End If If String.IsNullOrEmpty(MysqlDatabase) Then Throw New Exception($"CheckLicense Error:{EnLicenseCheckCode.InvalidDatabaseName}") End If If String.IsNullOrEmpty(MysqlPort) Then Throw New Exception($"CheckLicense Error:{EnLicenseCheckCode.InvalidDatabaseUserPort}") End If If String.IsNullOrEmpty(MysqlUserID) Then Throw New Exception($"CheckLicense Error:{EnLicenseCheckCode.InvalidDatabaseUserID}") End If If String.IsNullOrEmpty(MysqlPassword) Then Throw New Exception($"CheckLicense Error:{EnLicenseCheckCode.InvalidDatabaseUserPassword}") End If If String.IsNullOrEmpty(SqliteDir) Then Throw New Exception($"CheckLicense Error:{EnLicenseCheckCode.InvalidDatabaseDirName}") End If If String.IsNullOrEmpty(SqliteName) Then Throw New Exception($"CheckLicense Error:{EnLicenseCheckCode.InvalidDatabaseFileName}") End If Return True End Function End Class End Namespace