#include "ba8.h" #include "ba8700a.h" #include #include #include #include #include /////////////////////////////////////////////////////////// // TSignature_mask /////////////////////////////////////////////////////////// class TSignature_mask : public TAutomask { TString _host, _user; bool _admin; protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); public: void load(); void save(); TSignature_mask(); }; bool TSignature_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch (o.dlg()) { case F_LIST: { TSheet_field& s = (TSheet_field&)o; switch (e) { case se_enter: // Solo l'amministratore puo' cancellare: abilito il bottone di elimina solo per lui s.sheet_mask().enable(DLG_DELREC, _admin && s.cell_enabled(jolly, 0)); break; case se_query_add: return _admin; // Solo l'amministratore puo' aggiungere utenti case se_notify_add: { // Copia i contenuti dalla eventuae riga di default (Guest) int g; for (g = s.items()-1; g >= 0; g--) { if (xvt_str_compare_ignoring_case(s.row(g).get(0), "Guest") == 0) break; } if (g >= 0) { TToken_string& row = s.row(jolly); row = s.row(g); // Copia riga Guest row.add(" ", 0); // Svuota nome utente } } break; case se_query_del: return _admin && s.cell_enabled(jolly, 0); // Solo l'amministratore puo' eliminare utenti default: break; } } break; default: break; } return true; } void TSignature_mask::load() { TConfig ini(CONFIG_WST, "fd"); TAssoc_array& ass = ini.list_variables(); TSheet_field& sheet = sfield(F_LIST); bool guest_found = false; FOR_EACH_ASSOC_STRING(ass, h, key, val) { if (_admin || _user.compare(key, -1, true) == 0) { TToken_string& row = sheet.row(-1); row = key; // "Cert_USER" row.ltrim(5); // remove "Cert_" if (row == "Guest") { guest_found = true; sheet.disable_cell(sheet.items()-1, 0); } row.add(val); // add "pkxxx.dll,certificate" row.replace(',', row.separator()); } } sheet.sort(); if (_admin && !guest_found) { TToken_string& row = sheet.row(-1); row = "Guest"; sheet.disable_cell(sheet.items()-1, 0); } } void TSignature_mask::save() { TConfig ini(CONFIG_WST, "fd"); if (_admin) ini.remove_all(); TSheet_field& sheet = sfield(F_LIST); TString usr; TToken_string data(255, ','); FOR_EACH_SHEET_ROW(sheet, i, row) { row->get(0, usr); if (usr.full()) { usr.insert("Cert_"); data = (const char*)*row; // Copia la riga dello spreadsheet data.replace(row->separator(), ','); // Cambia il separatore da | a , data.add(" ", 0); data.ltrim(2); // Elimina il nome dell'utente ini.set(usr, data); } } } TSignature_mask::TSignature_mask() : TAutomask("ba8700a") { _admin = user() == dongle().administrator(); xvt_sys_get_host_name(_host.get_buffer(), _host.size()); xvt_sys_get_user_name(_user.get_buffer(), _user.size()); set(F_HOST, _host); set(F_NAME, _user); load(); } /////////////////////////////////////////////////////////// // TSignature_app /////////////////////////////////////////////////////////// class TSignature_app : public TSkeleton_application { protected: virtual const char* extra_modules() const { return "fd"; } public: virtual void main_loop(); }; void TSignature_app::main_loop() { TSignature_mask m; while (m.run() == K_ENTER) m.save(); } int ba8700(int argc, char* argv[]) { TSignature_app app; app.run(argc, argv, TR("Firma digitale")); return 0; }