From b5001a9a6e6d0f63f2f2d26a2f710519a6fcc6a0 Mon Sep 17 00:00:00 2001
From: open-license-manager <rillf@maildrop.cc>
Date: 周一, 26 5月 2014 01:00:10 +0800
Subject: [PATCH] pc id

---
 src/library/pc-identifiers.c |   62 ++++++++++++++++++++++++++++---
 1 files changed, 56 insertions(+), 6 deletions(-)

diff --git a/src/library/pc-identifiers.c b/src/library/pc-identifiers.c
index a4ea81c..e60a5b0 100644
--- a/src/library/pc-identifiers.c
+++ b/src/library/pc-identifiers.c
@@ -9,6 +9,7 @@
 #include "pc-identifiers.h"
 #include <stdlib.h>
 #include <stdbool.h>
+#include "base/base64.h"
 
 static FUNCTION_RETURN generate_default_pc_id(PcIdentifier * identifiers,
 		unsigned int * num_identifiers) {
@@ -43,8 +44,9 @@
 	for (i = 0; i < disk_num; i++) {
 		for (j = 0; j < adapter_num; i++) {
 			for (k = 0; k < 6; k++)
-				identifiers[i * adapter_num + j][k] = diskInfos[i].disk_sn[k
-						+ 2] ^ adapterInfos[j].mac_address[k + 2];
+				identifiers[i * adapter_num + j][k] =
+						diskInfos[i].disk_sn[k + 2]
+								^ adapterInfos[j].mac_address[k + 2];
 		}
 	}
 
@@ -147,7 +149,7 @@
 		result = generate_default_pc_id(identifiers, array_size);
 		break;
 	case ETHERNET:
-		result = generate_ethernet_pc_id(identifiers, array_size, false);
+		result = generate_ethernet_pc_id(identifiers, array_size, true);
 		break;
 	case IP_ADDRESS:
 		result = generate_ethernet_pc_id(identifiers, array_size, false);
@@ -156,7 +158,7 @@
 		result = generate_disk_pc_id(identifiers, array_size, false);
 		break;
 	case DISK_LABEL:
-		result = generate_disk_pc_id(identifiers, array_size, false);
+		result = generate_disk_pc_id(identifiers, array_size, true);
 		break;
 	default:
 		return ERROR;
@@ -188,7 +190,55 @@
  * @param str_code: the code in the string format XXXX-XXXX-XXXX-XXXX
  * @return
  */
-int decode_pc_id(PcIdentifier* identifier1_out, PcIdentifier* identifier2_out,
-		UserPcIdentifier str_code) {
+static FUNCTION_RETURN decode_pc_id(PcIdentifier* identifier1_out,
+		PcIdentifier* identifier2_out, UserPcIdentifier str_code) {
 
 }
+
+static IDENTIFICATION_STRATEGY strategy_from_pc_id(PcIdentifier identifier) {
+	return (IDENTIFICATION_STRATEGY) identifier[0] >> 5;
+}
+
+EVENT_TYPE validate_user_pc_identifier(UserPcIdentifier str_code) {
+	PcIdentifier user_identifiers[2];
+	FUNCTION_RETURN result;
+	IDENTIFICATION_STRATEGY previous_strategy_id, current_strategy_id;
+	PcIdentifier* calculated_identifiers;
+	size_t calc_identifiers_size;
+	int i, j;
+	bool found;
+
+	result = decode_pc_id(&user_identifiers[0], &user_identifiers[1], str_code);
+	if (result != OK) {
+		return result;
+	}
+	previous_strategy_id = STRATEGY_UNKNOWN;
+	found = false;
+	for (i = 0; i < 2; i++) {
+		current_strategy_id = strategy_from_pc_id(user_identifiers[i]);
+		if (current_strategy_id == STRATEGY_UNKNOWN) {
+			return LICENSE_MALFORMED;
+		}
+		if (current_strategy_id != previous_strategy_id) {
+			if (calculated_identifiers != NULL) {
+				free(calculated_identifiers);
+			}
+			current_strategy_id = previous_strategy_id;
+			generate_pc_id(NULL, &calc_identifiers_size, current_strategy_id);
+			calculated_identifiers = (PcIdentifier *) malloc(
+					sizeof(PcIdentifier) * calc_identifiers_size);
+			generate_pc_id(calculated_identifiers, &calc_identifiers_size,
+					current_strategy_id);
+		}
+		//maybe skip the byte 0
+		for (j = 0; j < calc_identifiers_size; j++) {
+			if (!memcmp(user_identifiers[i], calculated_identifiers[j],
+					sizeof(PcIdentifier))) {
+				free(calculated_identifiers);
+				return LICENSE_OK;
+			}
+		}
+	}
+	free(calculated_identifiers);
+	return IDENTIFIERS_MISMATCH;
+}

--
Gitblit v1.9.1