#include <applicat.h> #include <date.h> #include <modaut.h> #include <msksheet.h> #include <prefix.h> #include <utility.h> #include <urldefid.h> #include <extcdecl.h> #include "ba1.h" #include "ba1500.h" #include "ba1500a.h" #define USERADR 26952 #define AGAADR 26953 #define PRASSIADR 26954 #define PROCOMADR 26956 #define K1 0x4500 #define LBYTEMASK 0x00FF #define UBYTEMASK 0xFF00 #define MAXAUT 49 enum KeyType { _user_key, _aga_key, _prassi_key, _procom_key}; #define BITTEST(w,p) (((w) & (0x0001 << (p))) != 0) #define BITSET(w,p,v) ((v) ? ((w) |= (0x0001 << (p))) : ((w) &= (~(0x0001 << (p))))) TInformazione_moduli::TInformazione_moduli() { int mod = 0; char _buffer[256]; TString s; TToken_string t; TString_array descs; _unassigned_modules = 0; ifstream in("prassi.aut"); while (!in.eof() && in.good()) { in.getline(_buffer, sizeof(_buffer),'\n'); s = _buffer; s.trim(); if (s.empty()) break; const int l = s.len(); if (l > 2) { t = format("%-40s",(const char*)s.right(l-3)); t.add(s.left(2)); } else { t = " "; t.add(" "); _unassigned_modules++; } t.add(mod++); TString d(t.get(0)); descs.add(d); d.upper(); t.add(d, 0); _infos.add(t); } if (in.bad() && !in.eof()) error_box("Si e' verificato un errore leggendo il file di descrizione moduli."); _infos.sort(); for (int i=0;i<mod;i++) { TToken_string& riga = _infos.row(i); const int mod = riga.get_int(2); _index[mod] = i; const TString d(descs.row(mod).get(0)); riga.add(d, 0); } } const char * TInformazione_moduli::get_description_by_order(int index) { if (index>=0 && index<ENDAUT) return _infos.row(index).get(0); else return ""; } const char * TInformazione_moduli::get_name_by_order(int index) { if (index>=0 && index<ENDAUT) return _infos.row(index).get(1); else return ""; } int TInformazione_moduli::get_module_by_order(int index) { if (index>=0 && index<ENDAUT) return atoi(_infos.row(index).get(2)); else return -1; } const char * TInformazione_moduli::get_description(int module) { return get_description_by_order(_index[module]); } const char * TInformazione_moduli::get_name(int module) { return get_name_by_order(_index[module]); } int TInformazione_moduli::get_index(int module) { return _index[module]; } class TError_application : public TApplication { TString _errmess; virtual bool create() { fatal_box(_errmess); return FALSE; } public: TError_application(const char* err) : _errmess(err) {} }; class TAttivazione_moduli : public TApplication { TMask* _msk; TInformazione_moduli* _im; KeyType _key_type; word _serno; word _port; virtual bool create() ; virtual bool destroy() ; virtual bool use_files() const { return FALSE; } virtual bool menu(MENU_TAG); void generate_key(); int build_sheet(bool on = TRUE); static void keyext(const TString & s, word * v); static bool user_hnd(TMask_field & f, KEY k); static void encode_second_key(); static bool decode_hnd(TMask_field & f, KEY k); static bool activate_hnd(TMask_field & f, KEY k); static bool k_notify(TSheet_field & f, int r, KEY k); public: TAttivazione_moduli() : _msk(NULL) { _key_type = _user_key;} }; HIDDEN TAttivazione_moduli& app() { return (TAttivazione_moduli &)main_app(); } int TAttivazione_moduli::build_sheet(bool on) { int nmod = 0; TSheet_field& sf = (TSheet_field&) _msk->field(F_MODULI); for (int i = 0; i < ENDAUT; i++) { TString d( _im->get_description_by_order(i)); if (d.trim().empty()) continue; TToken_string& riga = sf.row(i); riga = d; const int module = _im->get_module_by_order(i); if (has_module(module, CHK_DONGLE) && on || module==0) { riga.add("X"); if (module != 0) nmod++; } else riga.add(" "); riga.add(module); } return nmod; } void TAttivazione_moduli::generate_key() { #if XVT_OS == XVT_OS_SCOUNIX word ud[4]; INT_OFF(); HL_ON(_port, USERADR); ud[0] = HL_RD(_port, 48); ud[1] = HL_RD(_port, 49); ud[2] = HL_RD(_port, 50); ud[3] = HL_RD(_port, 51); HL_OFF(_port); INT_ON(); #else int ud[4]; HL_READ(48, &ud[0]); HL_READ(49, &ud[1]); HL_READ(50, &ud[2]); HL_READ(51, &ud[3]); #endif int nmod; _msk->set(F_K2, format("%04X%04X%04X%04X", ud[0], ud[1], ud[2], ud[3])); nmod = build_sheet(); _serno = SerNo; ud[0] = _serno; ud[1] = K1 | (nmod & LBYTEMASK); long & l = (long &) ud[2]; TDate d(TODAY); l = d.year()*10000L + d.month()*100L + d.day(); #if XVT_OS == XVT_OS_SCOUNIX INT_OFF(); HL_ON(_port, ModAd); K_EYE(_port, (unsigned char *) ud, HLBLOCK); HL_OFF(_port); INT_ON(); #else HL_CODE(EYECAST &ud[0], HLBLOCK); #endif _msk->set(F_K1, format("%04X%04X%04X%04X", ud[0], ud[1], ud[2], ud[3])); _msk->set(F_SN, SerNo); _msk->set(F_DT, d.string()); } int hexdigit(char c) { static char s[] = "0123456789ABCDEF"; int i = strlen(s); while (i-- >= 0) if (s[i] == c) break; return i; } void TAttivazione_moduli::keyext(const TString& s, word * val) { for (int i = 0 ; i < 4; i++) { const int off = i * 4; word & l = val[i]; l = 0; for (int j = 0; j < 4; j++) l = l * 16 + hexdigit(s[off + j]); } } bool TAttivazione_moduli::user_hnd(TMask_field & f, KEY k) { const TString16 k4(f.get()); if (!f.to_check(k) || k4.empty()) return TRUE; TMask & m = f.mask(); word ud1[4], ud2[4], port = app()._port; const TString16 k3(m.get(F_K3)); keyext(k3, ud1); keyext(k4, ud2); #if XVT_OS == XVT_OS_SCOUNIX INT_OFF(); HL_ON(port, ModAd); K_EYE(port, (unsigned char *) ud1, HLBLOCK); HL_OFF(port); INT_ON(); #else HL_CODE(EYECAST ud1, HLBLOCK); #endif const long & l = (long &) ud1[0]; TDate d(l), d1(TODAY); d.addmonth(3); if (d < d1) return f.error_box("data non valida"); if ((ud1[2] & UBYTEMASK) != K1 || ud1[3] != app()._serno) return f.error_box("primo codice errato"); #if XVT_OS == XVT_OS_SCOUNIX INT_OFF(); HL_ON(port, ModAd); K_EYE(port, (unsigned char *) ud2, HLBLOCK); HL_OFF(port); INT_ON(); #else HL_CODE(EYECAST ud2, HLBLOCK); #endif for (int i = 0; i < 4; i++) ud2[i] ^= app()._serno; if (ud2[3] != 0) return f.error_box("secondo codice errato"); TSheet_field& sf = (TSheet_field&) m.field(F_MODULI); const int un = app()._im->unassigned(); for (i = un; i < ENDAUT; i++) { const int af = app()._im->get_module_by_order(i) - 1; if (af < 0) continue; TToken_string& tt = sf.row(i-un); tt.add(BITTEST(ud2[af / 16], af % 16) ? "X" : " ", 1); } if (k == K_ENTER) { keyext(k4, ud2); #if XVT_OS == XVT_OS_SCOUNIX INT_OFF(); HL_ON(port, ModAd); HL_ON(port, ModAd); HL_WR(port, 48, ud2[0]); HL_WR(port, 49, ud2[1]); HL_WR(port, 50, ud2[2]); HL_WR(port, 51, ud2[3]); HL_OFF(port); INT_ON(); #else HL_WRITE(48, ud2[0]); HL_WRITE(49, ud2[1]); HL_WRITE(50, ud2[2]); HL_WRITE(51, ud2[3]); #endif } else sf.force_update(); return TRUE; } void TAttivazione_moduli::encode_second_key() { TMask * m = app()._msk; word ud1[4], ud2[4], port = app()._port; int nmod = 0; for (int i = 0; i < 4; i++) ud2[i] = 0; TSheet_field& sf = (TSheet_field&) m->field(F_MODULI); const int un = app()._im->unassigned(); for (i = un; i < ENDAUT; i++) { const int af = app()._im->get_module_by_order(i) -1; if (af < 0) continue; TToken_string& tt = sf.row(i-un); if (tt.get(1)[0] == 'X') { BITSET(ud2[af / 16], af % 16, TRUE); nmod++; } } for (i = 0; i < 4; i++) ud2[i] ^= app()._serno; const TDate d(m->get(F_DT)); long & l = (long &) ud1[0]; l = d.year()*10000L + d.month()*100L + d.day(); ud1[2] = K1 | (nmod & UBYTEMASK); ud1[3] = app()._serno; #if XVT_OS == XVT_OS_SCOUNIX INT_OFF(); HL_ON(port, ModAd); K_EYE(port, (unsigned char *) ud1, HLBLOCK); K_EYE(port, (unsigned char *) ud2, HLBLOCK); HL_OFF(port); INT_ON(); #else HL_CODE(EYECAST ud1, HLBLOCK); HL_CODE(EYECAST ud2, HLBLOCK); #endif m->set(F_K4, format("%04X%04X%04X%04X", ud2[0], ud2[1], ud2[2], ud2[3])); m->set(F_K3, format("%04X%04X%04X%04X", ud1[0], ud1[1], ud1[2], ud1[3])); } bool TAttivazione_moduli::decode_hnd(TMask_field & f, KEY k) { const TString16 k2(f.get()); if (!f.to_check(k) || k2.empty()) return TRUE; TMask & m = f.mask(); word ud1[4], ud2[4], port = app()._port; const TString16 k1(m.get(F_K1)); keyext(k1, ud1); keyext(k2, ud2); #if XVT_OS == XVT_OS_SCOUNIX INT_OFF(); HL_ON(port, USERADR); K_EYE(port, (unsigned char *) ud1, HLBLOCK); HL_OFF(port); INT_ON(); #else HL_CODE(EYECAST ud1, HLBLOCK); #endif long & l = (long &) ud1[2]; const TDate d(l); app()._serno = ud1[0]; if ((ud1[1] & UBYTEMASK) != K1) return f.error_box("primo codice errato"); #if XVT_OS == XVT_OS_SCOUNIX INT_OFF(); HL_ON(port, USERADR); K_EYE(port, (unsigned char *) ud2, HLBLOCK); HL_OFF(port); INT_ON(); #else HL_CODE(EYECAST ud2, HLBLOCK); #endif for (int i = 0; i < 4; i++) ud2[i] ^= app()._serno; if (ud2[3] != 0) return f.error_box("secondo codice errato"); m.set(F_SN, app()._serno); m.set(F_DT, d.string()); m.set(F_K3,k1); m.set(F_K4,k2); TSheet_field& sf = (TSheet_field&) m.field(F_MODULI); const int un = app()._im->unassigned(); for (i = un; i < ENDAUT; i++) { const int af = app()._im->get_module_by_order(i) -1; if (af < 0) continue; TToken_string& tt = sf.row(i-un); tt.add(BITTEST(ud2[af / 16], af % 16) ? "X" : " ", 1); } encode_second_key(); sf.force_update(); return TRUE; } bool TAttivazione_moduli::activate_hnd(TMask_field & f, KEY k) { encode_second_key(); return TRUE; } bool TAttivazione_moduli::k_notify(TSheet_field& f, int r, KEY k) { if (k == K_INS) return FALSE; return TRUE; } bool TAttivazione_moduli::create() { if (user() != "PRASSI") return error_box("Utente non abilitato all'uso di questo programma"); _im = new TInformazione_moduli; disable_menu_item(M_FILE_NEW); disable_menu_item(M_FILE_REVERT); disable_menu_item(M_FILE_PG_SETUP); _msk = new TMask("ba1500a") ; #if XVT_OS == XVT_OS_SCOUNIX if (Hl_Port(AGAADR) != 0) _key_type = _aga_key; else if (Hl_Port(PRASSIADR) != 0) _key_type = _prassi_key; else if (Hl_Port(PROCOMADR) != 0) _key_type = _prcom_key; _port = Hl_Port(USERADR); #else HL_LOGOUT(); if (HL_LOGIN(AGAADR, DONT_CARE, REFKEY, VERKEY) == STATUS_OK) _key_type = _aga_key; else { HL_LOGOUT(); if (HL_LOGIN(PRASSIADR, DONT_CARE, REFKEY, VERKEY) == STATUS_OK) _key_type = _prassi_key; else { HL_LOGOUT(); if (HL_LOGIN(PROCOMADR, DONT_CARE, REFKEY, VERKEY) == STATUS_OK) _key_type = _procom_key; } } HL_LOGOUT(); HL_LOGIN(USERADR, DONT_CARE, REFKEY, VERKEY); #endif TSheet_field& sf = (TSheet_field&) _msk->field(F_MODULI); const int un = _im->unassigned(); sf.set_notify(k_notify); switch (_key_type) { case _user_key: { _msk->disable(F_K1); _msk->disable(F_K2); _msk->set_handler(F_K4, user_hnd); generate_key(); const int nm = sf.items(); for (int i = 0; i < nm; i++) sf.disable_cell(i,1); } break; case _prassi_key: sf.disable_cell(_im->get_index(CMAUT)-un,1); sf.disable_cell(_im->get_index(ATAUT)-un,1); sf.disable_cell(_im->get_index(POAUT)-un,1); sf.disable_cell(_im->get_index(AFAUT)-un,1); sf.disable_cell(_im->get_index(TCAUT)-un,1); sf.disable_cell(_im->get_index(TMAUT)-un,1); sf.disable_cell(_im->get_index(VEAUT)-un,1); sf.disable_cell(_im->get_index(MGAUT)-un,1); sf.disable_cell(_im->get_index(ORAUT)-un,1); sf.disable_cell(_im->get_index(EFAUT)-un,1); sf.disable_cell(_im->get_index(DBAUT)-un,1); sf.disable_cell(_im->get_index(SVAUT)-un,1); case _aga_key: case _procom_key: { _msk->set_handler(F_K2, decode_hnd); _msk->disable(F_K3); _msk->disable(F_K4); sf.sheet_mask().field(F_ENABLE).set_handler(activate_hnd); build_sheet(FALSE); for (int i = un; i < ENDAUT; i++) { const int af = _im->get_module_by_order(i); const int index = i-un; if (af == 0) sf.disable_cell(index,1); if (_key_type == _procom_key) sf.enable_cell(index,1,af>=40 && af<=46); else if (af>=40 && af<=46) sf.disable_cell(index,1); } } break; default: break; } dispatch_e_menu(BAR_ITEM(1)); return TRUE; } bool TAttivazione_moduli::destroy() { if (_msk != NULL) delete _msk; if (_im != NULL) delete _im; return TRUE; } bool TAttivazione_moduli::menu(MENU_TAG) { _msk->run(); return FALSE; } int ba1500(int argc, char** argv) { // dipende dalla check_parameters fatta in main() TString user(user()); if (user == "PRASSI") { TAttivazione_moduli a ; a.run(argc, argv, "Attivazione moduli"); } else { TString err(80); err.format("L'utente %s non e' abilitato all'esecuzione di questo programma", (const char*)user); TError_application e(err); e.run(argc, argv, "Attivazione moduli"); } return 0; }