campo-sirio/setup/key.cpp
luca 67791b207f Patch level :10.0
Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
Procedura di salvataggio del corrente OEM (reseller) del prg già installato; in questo modo anche mandando un CD AGA (che generalmente funziona!) ad un cliente di un distributore non AGA, il reseller .a video non cambia. Per cambiare reseller si dovrà intervenire a mano sull'oem.ini cambiando il valore di OEM dopo l'installazione


git-svn-id: svn://10.65.10.50/trunk@19779 c028cbd2-c16b-5b4b-a496-9718f37d4682
2009-12-15 11:55:49 +00:00

319 lines
7.7 KiB
C++
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "wxinc.h"
#include <wx/socket.h>
#include "key.h"
#include "utils.h"
extern "C"
{
#include "../xvaga/hlapi_c.h"
#include "../xvaga/skeylink.h"
}
///////////////////////////////
// Utilities //
///////////////////////////////
static int ThisYear()
{
int anno = 2006;
time_t lt;
if (time(&lt) == 0)
{
struct tm* timeloc = localtime(&lt) ;
if (timeloc != NULL)
anno = timeloc->tm_year + 1900;
}
return anno;
}
///////////////////////////////
// Gestione chiave Hardlock //
///////////////////////////////
bool HardlockGarble(unsigned short* data)
{
HL_CODE(data, 1);
return true;
}
unsigned short HardlockLogin(int& year)
{
unsigned short serno = 0xFFFF;
unsigned char REFKEY[16] = "CAMPOKEY";
unsigned char VERKEY[16] = "ìpÙˆ¬cê<";
if (HL_LOGIN(26952, LOCAL_DEVICE, REFKEY, VERKEY) == STATUS_OK)
{
unsigned short eprom[64]; memset(eprom, 0, sizeof(eprom));
HL_READBL((unsigned char*)eprom);
unsigned short data[4];
memcpy(data, eprom, sizeof(data));
HardlockGarble(data);
if (data[0] == 0xFAE8)
serno = data[1];
else
serno = 0;
memcpy(data, &eprom[60], sizeof(data));
if (HardlockGarble(data))
year = (int)data[0];
HL_LOGOUT();
}
return serno;
}
///////////////////////////////
// Gestione chiave Eutron //
///////////////////////////////
void EncodeEutronPassword(char* str)
{
const char* const key = "QSECOFR-";
char tmp[16];
int i;
for (i = 0; str[i]; i++)
tmp[i] = str[i] + (i < 8 ? key[i] : str[i - 8]);
tmp[i] = '\0';
strcpy(str, tmp);
}
unsigned short EutronLogin(int& year)
{
unsigned short serno = 0xFFFF;
const char* const login[2] = { "AGA.CAMPO", "25EBAI" };
for (int i = 0; i < 2; i++)
{
KEY_NET eutron_key;
memset(&eutron_key, 0, sizeof(KEY_NET));
eutron_key.net_command = NET_KEY_OPEN;
eutron_key.command = LOCATING_MODE;
const char* const chiaro = login[i];
char cifrato[16];
strcpy(cifrato, chiaro);
EncodeEutronPassword(cifrato);
memset(eutron_key.label, 0, LABEL_LENGTH);
strcpy((char*)eutron_key.label, chiaro);
memset(eutron_key.password, 0, PASSWORD_LENGTH);
strcpy((char*)eutron_key.password, cifrato);
smartlink(&eutron_key);
if (eutron_key.status == ST_OK)
{
eutron_key.net_command = NET_KEY_ACCESS;
eutron_key.command = BLOCK_READING_MODE;
short* pointer = (short*)(&eutron_key.data[0]);
short* number = (short*)(&eutron_key.data[2]);
*pointer = 0; // Posizione in cui leggere
*number = 8; // Words da leggere
eutron_key.status = -1;
smartlink(&eutron_key);
if (eutron_key.status == ST_OK)
{
serno = (unsigned short)atol((const char*)eutron_key.data+4);
if (i == 0)
{
const unsigned short y = *(unsigned short*)(eutron_key.data+12);
if (y > 2000 && y < 3000)
year = y;
}
else
year = ThisYear();
eutron_key.net_command = NET_KEY_CLOSE;
smartlink(&eutron_key);
break;
}
}
}
return serno;
}
//////////////////////////////////
// Gestione Server di chiavi //
//////////////////////////////////
class TBordello
{
WX_DECLARE_STRING_HASH_MAP(wxSocketClient*, TBrothel);
TBrothel m_map;
public:
wxSocketClient& Zoccola(wxIPV4address& ip);
wxSocketClient* QuellaBuona();
void Chiudi();
virtual ~TBordello();
} m_bordello;
wxSocketClient& TBordello::Zoccola(wxIPV4address& ip)
{
const wxString strIP = ip.IPAddress();
if (m_map[strIP] == NULL)
{
m_map[strIP] = new wxSocketClient;
m_map[strIP]->SetTimeout(2);
}
return *m_map[strIP];
}
wxSocketClient* TBordello::QuellaBuona()
{
wxSocketClient* good = NULL;
for(TBrothel::iterator it = m_map.begin(); it != m_map.end(); ++it )
{
wxSocketClient* sc = (wxSocketClient*)it->second;
if (sc != NULL)
{
sc->WaitOnConnect(0, 1);
if (sc->IsConnected())
{
good = sc;
break;
}
}
}
return good;
}
void TBordello::Chiudi()
{
for(TBrothel::iterator it = m_map.begin(); it != m_map.end(); ++it )
{
wxSocketClient* sc = (wxSocketClient*)it->second;
if (sc != NULL)
sc->Close();
}
}
TBordello::~TBordello()
{
/* Non funziona per oggetti statici
for(TBrothel::iterator it = m_map.begin(); it != m_map.end(); ++it )
{
wxSocketClient* sc = (wxSocketClient*)it->second;
sc->Destroy();
}
*/
m_map.clear();
}
static unsigned short InquireSocketNumber(wxSocketClient& sc, const wxString& strCommand)
{
sc.Discard();
sc.Write(strCommand, (wxUint32)strCommand.Len());
long number[2] = { 0L, 0L };
sc.Read(number, sizeof(number));
return (unsigned short)number[1];
}
//metodo per sapere dal server di chiave quanti sono gli utonti connessi;non funziona finchè ai servers non..
//..viene aggiunto il metodo NumberActiveUsers (è qui come segnaposto futuro)
unsigned short ServerLoggedUsers(const wxString& strSrvName)
{
unsigned short nUtonti = 0;
wxIPV4address ip;
if (ip.Hostname(strSrvName) && ip.Service("1883")) //riesce a connettersi
{
wxSocketClient& sc = m_bordello.Zoccola(ip);
if (sc.IsConnected() || sc.Connect(ip)) //il computer remoto risponde
{
// quante licenze sono loggate al momento (utonti connessi)
nUtonti = InquireSocketNumber(sc, "DongleLoggedLicenses");
}
}
return nUtonti;
}
static unsigned short InquireServer(const wxString& strSrvName, int& year, const bool bMsg)
{
unsigned short serno = 0xFFFF;
year = 0;
wxIPV4address ip;
if (!ip.Hostname(strSrvName) || !ip.Service("1883")) //indirizzo NON valido o porta scazzata!
{
if (bMsg)
ErrorBox("Indirizzo IP errato!");
return serno;
}
wxSocketClient& sc = m_bordello.Zoccola(ip);
if (sc.IsConnected() || sc.Connect(ip)) //il computer remoto risponde
{
// ma il server e' davvero acceso o spento ?
serno = InquireSocketNumber(sc, "DongleNumber()");
year = InquireSocketNumber(sc, "DongleYear()");
}
else
{
if (bMsg)
{
wxString strMsg;
strMsg << "Il server " << strSrvName << " non e' raggiungibile!";
ErrorBox(strMsg);
}
}
return serno;
}
unsigned short ServerLogin(int& year, wxString& strSrvName)
{
unsigned short serno = 0xFFFF;
//se non specificato un nome/indirizzo di server, lo cerca tra i miei "cpu fratelli" in rete
if (strSrvName.IsEmpty())
{
//intanto deve trovare il suo IP di rete
wxIPV4address ipLocal;
ipLocal.AnyAddress();
wxString strMyName = ipLocal.Hostname();
ipLocal.Hostname(strMyName);
const wxString strMyIP = ipLocal.IPAddress();
if (strMyIP.Len() > 7)
{
const unsigned short MaxSck = 256;
for (int i = 0; i < MaxSck; i++)
{
//deve sostituire l'ultima cifra dell'IP con tutti i numeri che vanno da 0 a 255 alla ricerca del server
wxString strSrvIP = strMyIP.BeforeLast('.');
strSrvIP << "." << i; //ip del computer remoto
if (strSrvIP != strMyIP)
{
wxIPV4address ipRemote;
if (ipRemote.Hostname(strSrvIP) && ipRemote.Service("1883"))
{
wxSocketClient& sc = m_bordello.Zoccola(ipRemote);
if (!sc.IsConnected())
sc.Connect(ipRemote, ipLocal, false);
}
}
}
wxSleep(2);
wxSocketClient* sc = m_bordello.QuellaBuona();
if (sc != NULL)
{
wxIPV4address ipRemote;
sc->GetPeer(ipRemote);
strSrvName = ipRemote.Hostname();
}
} //if(strMyIP.Len()...
} //if(strSrvName.Is...
if (!strSrvName.IsEmpty())
serno = InquireServer(strSrvName, year, false);
return serno;
}
bool DictionaryLogin(const wxString& strSrvName)
{
return false;
}