campo-sirio/ba/ba8700.cpp

166 lines
3.8 KiB
C++
Raw Normal View History

#include "ba8.h"
#include "ba8700a.h"
#include <applicat.h>
#include <automask.h>
#include <config.h>
#include <defmask.h>
#include <dongle.h>
///////////////////////////////////////////////////////////
// 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;
}