Developer Experience Release. Added LMS and code refactor.
This commit is contained in:
321
activation.cpp
Normal file
321
activation.cpp
Normal file
@@ -0,0 +1,321 @@
|
||||
/*
|
||||
Copyright 2019 Intel Corporation
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
#include "activation.h"
|
||||
#include <cpprest/ws_client.h>
|
||||
#include <cpprest/json.h>
|
||||
#include <cpprest/streams.h>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include "version.h"
|
||||
#include "commands.h"
|
||||
#include "network.h"
|
||||
#include "utils.h"
|
||||
|
||||
bool get_certificate_hashes(web::json::value& hashes)
|
||||
{
|
||||
std::vector<web::json::value> hashValues;
|
||||
std::vector<std::string> certHashes;
|
||||
if (!cmd_get_certificate_hashes(certHashes))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
for (std::string hashString : certHashes)
|
||||
{
|
||||
hashValues.push_back(web::json::value::string(utility::conversions::convertstring(hashString)));
|
||||
}
|
||||
|
||||
hashes = web::json::value::array(hashValues);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool get_uuid(web::json::value& value)
|
||||
{
|
||||
int i = 0;
|
||||
std::vector<web::json::value> uuidValue;
|
||||
std::vector<unsigned char> uuid;
|
||||
|
||||
if (!cmd_get_uuid(uuid)) return false;
|
||||
|
||||
for (unsigned char value : uuid)
|
||||
{
|
||||
uuidValue.push_back(web::json::value(uuid[i++]));
|
||||
}
|
||||
|
||||
value = web::json::value::array(uuidValue);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string get_dns_info()
|
||||
{
|
||||
std::string dnsSuffix;
|
||||
|
||||
// get DNS according to AMT
|
||||
cmd_get_dns_suffix(dnsSuffix);
|
||||
|
||||
if (!dnsSuffix.length())
|
||||
{
|
||||
std::vector<unsigned char> address;
|
||||
cmd_get_wired_mac_address(address);
|
||||
|
||||
if (address.size() == 6)
|
||||
{
|
||||
char macAddress[6];
|
||||
macAddress[0] = address[0];
|
||||
macAddress[1] = address[1];
|
||||
macAddress[2] = address[2];
|
||||
macAddress[3] = address[3];
|
||||
macAddress[4] = address[4];
|
||||
macAddress[5] = address[5];
|
||||
|
||||
// get DNS from OS
|
||||
dnsSuffix = net_get_dns(macAddress);
|
||||
}
|
||||
}
|
||||
|
||||
return dnsSuffix;
|
||||
}
|
||||
|
||||
web::json::value get_dns()
|
||||
{
|
||||
utility::string_t tmp;
|
||||
|
||||
std::string dnsSuffix = get_dns_info();
|
||||
tmp = utility::conversions::convertstring(dnsSuffix);
|
||||
|
||||
return web::json::value::string(tmp);
|
||||
}
|
||||
|
||||
bool getVersion(web::json::value& value)
|
||||
{
|
||||
std::string version;
|
||||
utility::string_t tmp;
|
||||
|
||||
if (!cmd_get_version(version)) return false;
|
||||
|
||||
tmp = utility::conversions::convertstring(version);
|
||||
|
||||
value = web::json::value::string(tmp);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool get_sku(web::json::value& value)
|
||||
{
|
||||
std::string version;
|
||||
utility::string_t tmp;
|
||||
|
||||
if (!cmd_get_sku(version)) return false;
|
||||
tmp = utility::conversions::convertstring(version);
|
||||
|
||||
value = web::json::value::string(tmp);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool get_build_number(web::json::value& value)
|
||||
{
|
||||
std::string version;
|
||||
utility::string_t tmp;
|
||||
|
||||
if (!cmd_get_build_number(version)) return false;
|
||||
tmp = utility::conversions::convertstring(version);
|
||||
|
||||
value = web::json::value::string(tmp);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool get_local_system_account_username(web::json::value& value)
|
||||
{
|
||||
std::string username;
|
||||
std::string password;
|
||||
utility::string_t tmp;
|
||||
|
||||
if (!cmd_get_local_system_account(username, password)) return false;
|
||||
tmp = utility::conversions::convertstring(username);
|
||||
|
||||
value = web::json::value::string(tmp);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool get_local_system_account_password(web::json::value& value)
|
||||
{
|
||||
std::string username;
|
||||
std::string password;
|
||||
utility::string_t tmp;
|
||||
|
||||
if (!cmd_get_local_system_account(username, password)) return false;
|
||||
tmp = utility::conversions::convertstring(password);
|
||||
|
||||
value = web::json::value::string(tmp);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool get_control_mode(web::json::value& value)
|
||||
{
|
||||
int controlMode;
|
||||
utility::string_t tmp;
|
||||
|
||||
if (!cmd_get_control_mode(controlMode)) return false;
|
||||
|
||||
value = web::json::value::number(controlMode);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool get_client_string(web::json::value& value)
|
||||
{
|
||||
int controlMode;
|
||||
utility::string_t tmp;
|
||||
|
||||
tmp = utility::conversions::convertstring("PPC");
|
||||
value = web::json::value::string(tmp);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool get_activation_payload(web::json::value& payload)
|
||||
{
|
||||
web::json::value value;
|
||||
utility::string_t tmp;
|
||||
web::json::value activationParams;
|
||||
|
||||
// get code version
|
||||
if (!getVersion(value)) return false;
|
||||
activationParams[U("ver")] = value;
|
||||
|
||||
if (!get_build_number(value)) return false;
|
||||
activationParams[U("build")] = value;
|
||||
|
||||
if (!get_sku(value)) return false;
|
||||
activationParams[U("sku")] = value;
|
||||
|
||||
// get UUID
|
||||
if (!get_uuid(value)) return false;
|
||||
activationParams[U("uuid")] = value;
|
||||
|
||||
// get local system account
|
||||
if (!get_local_system_account_username(value)) return false;
|
||||
activationParams[U("username")] = value;
|
||||
|
||||
if (!get_local_system_account_password(value)) return false;
|
||||
activationParams[U("password")] = value;
|
||||
|
||||
// get Control Mode
|
||||
if (!get_control_mode(value)) return false;
|
||||
activationParams[U("currentMode")] = value;
|
||||
|
||||
// get DNS Info
|
||||
activationParams[U("fqdn")] = get_dns();
|
||||
|
||||
// get client string
|
||||
if (!get_client_string(value)) return false;
|
||||
activationParams[U("client")] = value;
|
||||
|
||||
// get certificate hashes
|
||||
if (!get_certificate_hashes(value)) return false;
|
||||
activationParams[U("certHashes")] = value;
|
||||
|
||||
payload = activationParams;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool act_create_request(std::string commands, std::string dns_suffix, std::string& request)
|
||||
{
|
||||
web::json::value msg;
|
||||
|
||||
// get the activation info
|
||||
utility::string_t tmp = utility::conversions::convertstring(commands);
|
||||
msg[U("method")] = web::json::value::string(tmp);
|
||||
|
||||
tmp = utility::conversions::convertstring("key");
|
||||
msg[U("apiKey")] = web::json::value::string(tmp);
|
||||
|
||||
tmp = utility::conversions::convertstring(PROJECT_VER);
|
||||
msg[U("appVersion")] = web::json::value::string(tmp);
|
||||
|
||||
tmp = utility::conversions::convertstring(PROTOCOL_VERSION);
|
||||
msg[U("protocolVersion")] = web::json::value::string(tmp);
|
||||
|
||||
tmp = utility::conversions::convertstring("ok");
|
||||
msg[U("status")] = web::json::value::string(tmp);
|
||||
|
||||
tmp = utility::conversions::convertstring("ok");
|
||||
msg[U("message")] = web::json::value::string(tmp);
|
||||
|
||||
// get the activation payload
|
||||
web::json::value activationPayload;
|
||||
if (!get_activation_payload(activationPayload)) return false;
|
||||
|
||||
// override dns value if passed in
|
||||
if (!dns_suffix.empty())
|
||||
{
|
||||
utility::string_t tmp = utility::conversions::convertstring(dns_suffix);
|
||||
activationPayload[U("fqdn")] = web::json::value::string(tmp);
|
||||
}
|
||||
|
||||
// serialize payload
|
||||
std::string serializedPayload = utility::conversions::to_utf8string(activationPayload.serialize());
|
||||
std::string encodedPayload = util_encode_base64(serializedPayload);
|
||||
utility::string_t payload = utility::conversions::to_string_t(encodedPayload);
|
||||
msg[U("payload")] = web::json::value::string(payload);
|
||||
|
||||
#ifdef DEBUG
|
||||
std::cout << "Activation info payload:" << serializedPayload << std::endl;
|
||||
#endif
|
||||
|
||||
// serialize the entire message
|
||||
request = utility::conversions::to_utf8string(msg.serialize());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool act_create_response(std::string payload, std::string& response)
|
||||
{
|
||||
web::json::value msg;
|
||||
|
||||
utility::string_t tmp = utility::conversions::convertstring("response");
|
||||
msg[U("method")] = web::json::value::string(tmp);
|
||||
|
||||
tmp = utility::conversions::convertstring("key");
|
||||
msg[U("apiKey")] = web::json::value::string(tmp);
|
||||
|
||||
tmp = utility::conversions::convertstring(PROJECT_VER);
|
||||
msg[U("appVersion")] = web::json::value::string(tmp);
|
||||
|
||||
tmp = utility::conversions::convertstring(PROTOCOL_VERSION);
|
||||
msg[U("protocolVersion")] = web::json::value::string(tmp);
|
||||
|
||||
tmp = utility::conversions::convertstring("ok");
|
||||
msg[U("status")] = web::json::value::string(tmp);
|
||||
|
||||
tmp = utility::conversions::convertstring("ok");
|
||||
msg[U("message")] = web::json::value::string(tmp);
|
||||
|
||||
tmp = utility::conversions::convertstring(util_encode_base64(payload));
|
||||
msg[U("payload")] = web::json::value::string(tmp);
|
||||
|
||||
response = utility::conversions::to_utf8string(msg.serialize());
|
||||
|
||||
return true;
|
||||
}
|
Reference in New Issue
Block a user