diff --git a/include/about.cpp b/include/about.cpp index a66d62e26..6f14fbbc1 100755 --- a/include/about.cpp +++ b/include/about.cpp @@ -307,7 +307,7 @@ TInfo_mask::TInfo_mask() : TProperty_sheet(TR("Informazioni")) TString arg; for (int a = 0; a < main_app().argc(); a++) arg << main_app().argv(a) << ' '; - arg.trim(); arg.lower(); + arg.trim(); TConfig campoini(CONFIG_INSTALL, "Main"); TConfig userini(CONFIG_GUI, "Printer"); diff --git a/include/applicat.cpp b/include/applicat.cpp index 6a31365de..d84b99bc8 100755 --- a/include/applicat.cpp +++ b/include/applicat.cpp @@ -77,7 +77,7 @@ HIDDEN void paint_background(WINDOW win) xvt_dwin_draw_text(win, x, y, t, -1); xvtil_set_font(win, NULL, XVT_FS_NONE); - xvt_dwin_set_fore_color(win, NORMAL_COLOR); + xvt_dwin_set_fore_color(win, PROMPT_COLOR); TString spa; spa << dongle().product(); if (!xvt_sys_is_pda()) @@ -88,8 +88,8 @@ HIDDEN void paint_background(WINDOW win) if (ADVANCED_GRAPHICS) { - const int ix = xvt_vobj_get_attr(NULL_WIN, ATTR_ICON_WIDTH); - const int iy = xvt_vobj_get_attr(NULL_WIN, ATTR_ICON_HEIGHT); + const int ix = xvt_vobj_get_attr(win, ATTR_ICON_WIDTH); + const int iy = xvt_vobj_get_attr(win, ATTR_ICON_HEIGHT); xvt_dwin_draw_icon(win, r.right-ix-CHARY, r.bottom-iy-CHARY, ICON_RSRC); xvt_dwin_draw_icon(win, CHARY, r.bottom-iy-CHARY, ICON_RSRC); } @@ -483,8 +483,8 @@ bool TApplication::test_assistance_year() const ok = app_year <= dongle_year; if (ok) { - const int solar_year = (dongle_year/1000)*1000 + (dongle_year%1000)/10; - ok = TDate(TODAY).year() <= solar_year+2; + Tdninst dninst; + ok = dninst.can_I_run(); } } return ok; diff --git a/include/dongle.cpp b/include/dongle.cpp index c953c02b9..62c66bcff 100755 --- a/include/dongle.cpp +++ b/include/dongle.cpp @@ -1032,3 +1032,310 @@ bool TDongle::shown(word code) const bool TDongle::demo() const { return hardware() == _dongle_unknown && type() == _no_dongle; } + +/////////////////////////////////////////////////////////////////////////////// +// TEnigma_machine +/////////////////////////////////////////////////////////////////////////////// + +#define DNINST_PATH "setup/dninst.zip" + +class TEnigma_machine : public TObject +{ + TScanner* _scan; + int _year_assist; + +protected: + void init_key(char key[8]) const; + bool decode_string(const TString& datain, TString& dataout) const; + +public: + virtual bool ok() const { return _scan != NULL && !_scan->eof(); } + + bool line(TString& data); + bool find_serno(long serno); + int year_assist() const { return _year_assist; } + + TEnigma_machine(); + ~TEnigma_machine(); +}; + +void TEnigma_machine::init_key(char key[8]) const +{ + for (int i = 0; i < 8; i++) + key[i] = 'A' + ::rand() % 26; +} + +bool TEnigma_machine::decode_string(const TString& datain, TString& dataout) const +{ + dataout.cut(0); + if (datain.not_empty()) + { + char* tmp = dataout.get_buffer(datain.len()); + char key[8]; init_key(key); + int i; + for (i = 0; datain[i]; i++) + tmp[i] = datain[i] - (i < 8 ? key[i] : tmp[i - 8]); + tmp[i] = '\0'; + } + return dataout.full(); +} + +bool TEnigma_machine::line(TString& data) +{ return _scan != NULL ? decode_string(_scan->line(), data) : false; } + +bool TEnigma_machine::find_serno(long serno) +{ + if (serno == 0) + return true; + + TToken_string row(80, ';'); + if (_year_assist > 2100) + { + TString8 para; para << '[' << serno << ']'; + while (line(row)) + { + if (row == para) + return true; + } + } + else + { + while (line(row)) + { + if (row.get_long(0) == serno) + return true; + } + } + return false; +} + +TEnigma_machine::TEnigma_machine() + : _scan(NULL), _year_assist(0) +{ + if (fexist(DNINST_PATH)) + { + _scan = new TScanner(DNINST_PATH); + ::srand(883); + TString4 l1; line(l1); + _year_assist = atoi(l1); + ::srand(_year_assist); + } +} + +TEnigma_machine::~TEnigma_machine() +{ + if (_scan != NULL) + delete _scan; +} + +int Tdninst::assistance_year2solar(int ay) const +{ + return (ay/1000)*1000 + (ay%1000)/10; +} + +bool Tdninst::parse_date(const TString& line, TString& key, TDate& datascad) const +{ + const int equal = line.find('='); + if (equal > 0 && equal <= 16) + { + key = line.left(equal); key.trim(); + TString16 strdate = line.mid(equal+1, 16); strdate.trim(); + int d, m, y; + if (sscanf(strdate, "%2d-%2d-%4d", &d, &m, &y) == 3) + { + datascad = TDate(d, m, y); + return datascad.ok(); + } + } + return false; +} + +int Tdninst::test_cmdline(const TString& cmdline, bool key_must_exist, TString& msg) const +{ + msg.cut(0); + + const TDongle& don = dongle(); + const long serno = don.number(); + if (serno == 0) + { + if (is_power_reseller(true)) + return 0; // Solo chiavi per uso interno aga + msg = TR("Chiave di sviluppo non autorizzata"); + return 1; + } + + const TString4 strmod = cmdline.left(2); + const word codmod = don.module_name2code(strmod); + if (codmod == BAAUT) + return 0; + + if (!don.active(codmod)) + { + msg << TR("Modulo non attivo sulla chiave: ") << strmod; + return 2; + } + + const TDate oggi(TODAY); + const int solar_year = oggi.year(); + const int dongle_ass = don.year_assist(); + const int dongle_year = assistance_year2solar(dongle_ass); + if (solar_year - dongle_year >= 2) + { + msg << TR("Anno di assitenza non valido sulla chiave: ") << dongle_year; + return 3; + } + + TEnigma_machine em; + const int dninst_ass = em.year_assist(); + if (dongle_ass > dninst_ass) + { + msg << TR("File dninst.zip obsoleto"); + return 4; + } + + bool bFound = false; + if (dninst_ass > 2100) + { + if (em.find_serno(serno)) + { + TString80 dninst_line; + TString16 key; + TDate datascad; + while (em.line(dninst_line)) + { + if (dninst_line.empty() || dninst_line.starts_with("[")) + break; // Fine file o paragrafo + + if (parse_date(dninst_line, key, datascad)) + { + const bool scaduto = datascad < oggi; + if (key == "*") + { + if (scaduto) + { + msg << TR("Chiave scaduta il ") << datascad; + return 7; + } + } else + if (key == cmdline) + { + bFound = true; + if (scaduto) + { + msg << TR("Applicazione scaduta il ") << datascad; + return 8; + } + } else + if (key == strmod) + { + if (scaduto) + { + msg << TR("Modulo scaduto il ") << datascad; + return 9; + } + } + } + } + } + } + else + { + TToken_string dninst_line(80, ';'); + while (em.line(dninst_line)) + { + bFound = dninst_line.get_long(0) == serno; + if (bFound) + { + if (dninst_line.get_pos(strmod) > 0) + { + msg << TR("Modulo non attivo in dninst.zip : ") << strmod; + return 5; + } + break; + } + } + } + + if (!bFound && key_must_exist) + { + msg << TR("Impossibile trovare ") << cmdline; + return 6; + } + + return 0; +} + +bool Tdninst::can_I_run() const +{ + TFilename cmdline = main_app().argv(0); + cmdline = cmdline.name_only(); + if (cmdline.starts_with("ba", true)) + return true; + + const bool me = cmdline.len()>3; + const char* option = main_app().argc() > 1 ? main_app().argv(1) : ""; + if (*option == '-' && isdigit(*(option+1))) + cmdline << ' ' << option; + cmdline.lower(); + TString msg; + return test_cmdline(cmdline, me, msg) == 0; +} + +bool Tdninst::find_killed(TToken_string& kill_list) const +{ + kill_list.cut(0); + + const int serno = dongle().number(); + if (serno == 0) + return true; + + bool good = false; + TEnigma_machine em; + if (em.ok()) + { + if (em.year_assist() > 2100) + { + TToken_string l(80, '='); + good = em.find_serno(serno); + if (good) + { + const TDate oggi(TODAY); + TString16 str; + TDate ds; + while (em.line(l)) + { + if (l.empty() || l[0] == '[') + break; + if (parse_date(l, str, ds) && ds < oggi) + kill_list.add(str); + } + } + } + else + { + TToken_string l(80, ';'); + while (em.line(l)) + { + if (l.get_long(0) == serno) + { + const int semicolon = l.find(l.separator()); + if (semicolon > 0) + { + kill_list = l.mid(semicolon+1); + kill_list.lower(); + kill_list.replace(l.separator(), kill_list.separator()); + } + good = true; + break; + } + } + } + } + return good; +} + +Tdninst::Tdninst() : _year_assist(0) +{ + TEnigma_machine s; + _year_assist = s.year_assist(); // 2091 or 2101? +} diff --git a/include/dongle.h b/include/dongle.h index 8b655eb65..205805948 100755 --- a/include/dongle.h +++ b/include/dongle.h @@ -106,6 +106,27 @@ public: virtual ~TDongle(); }; +/////////////////////////////////////////////////////////////////////////////// +// Tdninst +/////////////////////////////////////////////////////////////////////////////// + +class Tdninst : public TObject +{ + int _year_assist; + +protected: + int assistance_year2solar(int ay) const; + bool parse_date(const TString& line, TString& key, TDate& d) const; + +public: + int assist_year() const { return _year_assist; } + int solar_year() const { return assistance_year2solar(_year_assist); } + int test_cmdline(const TString& cmdline, bool key_must_exist, TString& msg) const; + bool can_I_run() const; + bool find_killed(TToken_string& kill_list) const; + Tdninst(); +}; + TDongle& dongle(); bool destroy_dongle();