#include "SoftAuth.h" #include #include #include #include #include #include #include #include #include "Util.h" using namespace boost::archive::iterators; bool SoftAuth::MakeAuth(std::string machCode) { std::string data; // std::cout << "输入授权日期如:20200715" << std::endl; std::cin >> data; std::string out; bool ret = Base64Encode(machCode + data, out); /*AuthInfo info; info.code = machCode; info.data = data;*/ std::cout << "授权码如下:" << std::endl; std::cout << out << std::endl; return ret; } bool SoftAuth::MakeAuthV2(std::string machCode) { std::string data; // std::cout << "输入授权日期如:20200715" << std::endl; std::cin >> data; std::string trunkNum; std::cout << "输入授权中继数量(输入整数):" << std::endl; std::cin >> trunkNum; std::string acdNum; std::cout << "输入授权ACD坐席数量(输入整数):" << std::endl; std::cin >> acdNum; std::string out; bool ret = Base64Encode(machCode + data + "#" + trunkNum + "#" + acdNum, out); std::cout << "授权码如下:" << std::endl; std::cout << out << std::endl; return ret; } bool SoftAuth::Auth() { ifstream is(MSHY, ios_base::in | ios_base::binary); if (is) { //is.read(reinterpret_cast(&aInfo), sizeof(aInfo)); char str[200]; is.read(str, sizeof(str)); is.close(); std::string out; // 解密后 Base64Decode(str, out); std::string machcode1; // 机器码-本机 __getdiskid(machcode1); std::string data = std::regex_replace(out, std::regex(machcode1), ""); std::string machcode2; // 授权文件中的机器码 machcode2 = std::regex_replace(out, std::regex(data), ""); if (machcode2 != machcode1) { return false; } aInfo.data = data; aInfo.code = machcode1; return true; } return false; } bool SoftAuth::AuthV2() { ifstream is(MSHY, ios_base::in | ios_base::binary); if (is) { char str[1024]; //is.read(str, sizeof(str)); is.getline(str, sizeof(str)); is.close(); // std::cout << "解密前:" << str << std::endl; std::string out; // 解密后 Base64Decode(str, out); // std::cout << "解密后:" << out << std::endl; std::string machcode1; // 机器码-本机 __getdiskid(machcode1); if (machcode1.empty()) { std::cout << "机器码获取失败,请用root权限运行!" << std::endl; return false; } // std::cout << machcode1 << std::endl; // std::string data = std::regex_replace(out, std::regex(machcode1), ""); std::string data = out.substr(machcode1.length(), out.length()- machcode1.length()); // std::cout << data << std::endl; std::string machcode2; // 授权文件中的机器码 machcode2 = out.substr(0, out.find(data)); // std::cout << machcode2 << std::endl; if (machcode2 != machcode1) { return false; } std::vector vects; boost::split(vects, data, boost::is_any_of("#")); if (vects.size() < 3) return false; aInfo.data = vects[0]; aInfo.trunkNum = atoi(vects[1].c_str()); aInfo.agentNum = atoi(vects[2].c_str()); aInfo.code = machcode1; return true; } return false; } bool SoftAuth::Auth(std::string& encode) { std::string out; if (!Base64Decode(encode, out)) return false; ofstream os(MSHY, ios_base::out | ios_base::binary); //os.write(reinterpret_cast(&employee1), sizeof(employee1)); os.write(encode.c_str(), encode.length()); os.close(); /*AuthInfo* aInfo = (AuthInfo*)out.c_str();*/ // aInfo = (AuthInfo*)out.c_str(); std::string hardc; __getdiskid(hardc); if (out.find(hardc) == string::npos) { std::cout << "机器码和授权码中不相符" << std::endl; return false; } aInfo.data = std::regex_replace(out, std::regex(hardc), ""); aInfo.code = hardc; if (aInfo.code != hardc || hardc.empty()) { return false; } return true; } bool SoftAuth::AuthV2(std::string & encode) { std::string out; if (!Base64Decode(encode, out)) return false; ofstream os(MSHY, ios_base::out | ios_base::binary); os.write(encode.c_str(), encode.length()); os.close(); std::string hardc; __getdiskid(hardc); if (out.find(hardc) == string::npos) { std::cout << "机器码和授权码中不相符" << std::endl; return false; } std::string data = out.substr(hardc.length(), out.length() - hardc.length()); // std::string data = std::regex_replace(out, std::regex(hardc), ""); std::vector vects; boost::split(vects, data, boost::is_any_of("#")); if (vects.size() < 3) return false; aInfo.data = vects[0]; aInfo.trunkNum = atoi(vects[1].c_str()); aInfo.agentNum = atoi(vects[2].c_str()); aInfo.code = hardc; if (aInfo.code != hardc || hardc.empty()) { return false; } return true; } bool SoftAuth::isExpire() { try { boost::gregorian::date curData = Util::CurData(); boost::gregorian::date dData = boost::gregorian::from_undelimited_string(aInfo.data); /*boost::gregorian::date dData = boost::gregorian::from_undelimited_string("20200716");*/ if (dData.is_special()) // 时间无效 { return false; } return dData > curData; } catch (boost::bad_lexical_cast& e) { return false; } } bool SoftAuth::getMachineCode(std::string & code) { if (__getdiskid(code) == 0) { return true; } return false; } int SoftAuth::__getdiskid(std::string & hardc) { { char cmd[] = "blkid"; //sudo dmidecode -s system-serial-number \n neutron ALL=(ALL) NOPASSWD:ALL FILE *file = popen(cmd, "r"); if (!file) { fprintf(stderr, "popen top fail"); return -1; } char buff[1024]; while (fgets(buff, sizeof(buff), file) != NULL) { if (strstr(buff, "/dev/sda1: UUID=") != NULL) // /dev/sda1: UUID="1a2dffc7-a5c4-49a0-8158-147b3fa07f78" TYPE="ext4" PARTUUID="b48e27f0-01" { hardc = buff; hardc = std::regex_replace(hardc, std::regex("(/)|( )|(\")|(\\n)"), ""); // devsda1:UUID=1a2dffc7-a5c4-49a0-8158-147b3fa07f78TYPE=ext4PARTUUID=b48e27f0-01 hardc = std::regex_replace(hardc, std::regex("devsda1:UUID=(.*)TYPE=(.*)PARTUUID=(.*)"), "$1"); pclose(file); return 0; } } pclose(file); return -1; } } bool SoftAuth::Base64Encode(const string & input, string & output) { typedef base64_from_binary> Base64EncodeIterator; stringstream result; try { copy(Base64EncodeIterator(input.begin()), Base64EncodeIterator(input.end()), ostream_iterator(result)); } catch (...) { return false; } size_t equal_count = (3 - input.length() % 3) % 3; for (size_t i = 0; i < equal_count; i++) { result.put('='); } output = result.str(); return output.empty() == false; } bool SoftAuth::Base64Decode(const string & input, string & output) { typedef transform_width, 8, 6> Base64DecodeIterator; stringstream result; try { copy(Base64DecodeIterator(input.begin()), Base64DecodeIterator(input.end()), ostream_iterator(result)); } catch (...) { return false; } output = result.str(); return output.empty() == false; } SoftAuth SoftAuth::instance;