luca 8d5786295a Patch level :
Files correlati     :
Ricompilazione Demo : [ ]
Commento            : Modifiche di marco


git-svn-id: svn://10.65.10.50/trunk@8858 c028cbd2-c16b-5b4b-a496-9718f37d4682
2000-03-02 15:26:30 +00:00

198 lines
6.4 KiB
C++
Executable File

// login.cgi: applicazione per registrare l'ingresso nell'area
// dei corsi. Modifica il template con i dati personali
// dell'utente (percorso formativo con moduli disponibili)
#include <libpq++.h>
#include "applicat.h"
class Login_Application : public Application
{
private:
String _dbname;
String _utente; // Utente corrente
String _realname;
String _moduli; // Moduli attivi per l'utente corrente
PgEnv _environment;
PgTransaction *_db;
protected:
virtual bool create();
virtual bool destroy();
virtual void main_func();
void login();
void print_access_error();
public:
Login_Application() {_db = NULL;}
virtual ~Login_Application() {};
};
void Login_Application::print_access_error()
{
cout << "<CENTER><H2>Accesso al corso</H2><BR><BR>" << endl;
cout << "<P>Si prega di effettuare regolarmente l'accesso al corso, fornendo le indicazioni<BR>";
cout << "di <B><I>utente</I></B> e <B><I>password</I></B> in vostro possesso.</P><BR>" << endl;
}
bool Login_Application::create()
{
_dbname = POSTGRES_DB;
_environment.Port(POSTGRES_PORT);
_environment.Host(POSTGRES_HOST);
print_header("Accesso all'area corsi");
_utente = getenv("REMOTE_USER");
return TRUE;
}
bool Login_Application::destroy()
{
print_footer();
return TRUE;
}
void Login_Application::login()
{
// Controlla se l'utente fornito è' un utente valido
String command;
// Compone la stringa di selezione utente.
command = "SELECT * FROM UTENTI WHERE loginname='";
command += _utente;
command += "'";
// Esegue il comando SQL, dovrebbe venir ritornata una sola tupla
// al limite se ne vengono ritornate piu' di una verranno ignorate
_db->ExecCommandOk(command);
const int tuples = _db->Tuples();
if (tuples > 0) {
// Cosa deve fare:
// Sistema le informazioni di logging dell'utente (anche sulla tabella ACCESSI)
// Carica il percorso formativo (campo modules) e compone la pagina
const bool logged = (_db->GetValue(0, "logged"))[0] == 't';
_realname = _db->GetValue(0, "realname");
_moduli = _db->GetValue(0, "modules");
// Aggiorna le informazioni di logging
if (!logged){
// Prende il progressivo per il logging sulla tabella accessi
long progressivo = 0L;
command = "LOCK PROGRESSIVI"; // Blocca la tabell all'interno di questa transazione per evitare sovrapposizioni
_db->ExecCommandOk(command); // Verrà automaticamente sbloccata al termine della transazione
command = "SELECT * FROM PROGRESSIVI"; // In caso il CGI si pianti la transazione viene abortita dal server, e di fatto non verrà fatto nessun aggiornamento alle tabelle
if (_db->ExecTuplesOk(command) && _db->Tuples() > 0){
progressivo = atol(_db->GetValue(0, "progaccessi"));
}
else { // Se non c'è nessuna riga viene aggiunta
command = "INSERT INTO PROGRESSIVI VALUES(0,0)";
_db->ExecCommandOk(command);
}
progressivo++;
command = "UPDATE PROGRESSIVI SET progaccessi=progaccessi+1"; // Incrementa il progressivo
_db->ExecCommandOk(command); // Aggiorna la tabella relativa
command = "UPDATE UTENTI SET logged=1, logindate=current_timestamp, ";
command += "progaccesso=";
command += ltoa(progressivo);
command += " WHERE loginname='";
command += _utente;
command += "'";
_db->ExecCommandOk(command); // Aggiorna la tabella utenti
command = "INSERT INTO ACCESSI VALUES (";
command += ltoa(progressivo);
command += ",'";
command += _utente;
command += "',current_timestamp, null)";
_db->ExecCommandOk(command); // Aggiunge un record alla tabella accessi
}
// Seleziona i moduli abilitati
command = "SELECT * FROM MODULI ORDER BY modulenum";
_db->ExecCommandOk(command);
cout << "<H2>Percorso formativo</H2><BR><BR>" << endl;
cout << "<P>Benvenuto/a, <STRONG>" << _realname << "</STRONG>.</P>" << endl;
cout << "<P>Ecco l'elenco dei moduli disponibili, clicca sull'immagine relativa al modulo per entrare nell'area di formazione prescelta. Si ricorda che i moduli contraddistinti da una piccola spirale fanno parte delle lezioni avanzate.</P>" << endl;
const int nt = _db->Tuples();
if (nt > 0) {
// Seleziona i moduli abilitati per costui
cout << "<BR><CENTER><TABLE WIDTH=50% CELLPADDING=4>" << endl;
int curr_module=0;
for (int i=0; i<nt;i++) {
const unsigned int mod_num = atoi(_db->GetValue(i, "modulenum"))-1;
const char *mod_name = _db->GetValue(i, "modulename");
bool cafe;
cafe = (strncmp(mod_name,"cafe",4)==0);
if (_moduli.length() > mod_num+1 && _moduli[mod_num] == 'X' && (!cafe)) { // Se il modulo e' abilitato e non rappresenta una class cafe visualizza le icone relative
const bool new_row = curr_module % 2 == 0;
curr_module++;
if (new_row)
cout << "<TR>" << endl;
cout << "<TD><FORM METHOD=\"POST\" ACTION=";
cout << GET_MODULE_CGI << ">";
cout << "<INPUT TYPE=HIDDEN NAME=\"MODULO\" VALUE=\"" << mod_num + 1 << "\">";
cout << "<INPUT TYPE=\"IMAGE\" SRC=\"/images/area_";
cout << mod_num+1 << ".gif\" ALIGN=top ALT=\"Accesso al modulo ";
cout << _db->GetValue(i, "modulename") << "\" BORDER=0>";
cout << "</FORM></TD>" << endl;
if (!new_row || i == nt - 1) // Se non è nuova riga o è l'ultimo elemento
cout << "</TR>" << endl;
}
}
cout << "</TABLE></CENTER>" << endl;
}
cout << "<BR><BR>" << endl;
}
else { // Se non trova i dati dell'utente indicato (con il percorso formativo)
// visualizza la mancanza di informazioni per completare la pagina.
cout << "<H2>Mancanza di informazioni</H2><BR><BR>" << endl;
cout << "<P>Impossibile reperire le informazioni relative al percorso formativo dell'utente <STRONG>" << _utente << "</STRONG>.</P>";
cout << "<P>Controllare l'esattezza delle informazioni inserite.</P><BR>";
}
return;
}
void Login_Application::main_func()
{
// Controllo utente: se il CGI viene chiamato senza indicazioni d'utente (impossibile o quasi)
// Allora mostra un avvertimento
if (_utente.empty()) {
print_access_error();
return;
}
// Se e' stato impostato l'utente, effettua la login()
// Inizia la transazione
_db = new PgTransaction(_environment, _dbname);
if ( _db->ConnectionBad() )
print_database_error();
else
login();
delete _db; // Termina la transazione
return;
}
int main(int argc, char* argv[])
{
Login_Application* a = new Login_Application();
a->run(argc, argv);
delete a;
exit(0);
}