#include #include #include "libpq-fe.h" #include #include #include #include #define BDD_PASS_FILE "/srv/bdd/pipi-system.pass" #define BDD_CONN_LENGTH 255 static void exit_nicely(PGconn *conn) { PQfinish(conn); exit(1); } int main(int argc, char **argv) { PGconn *conn; PGresult *res; int nFields; int j,i; errno=0; /* Crée une connexion à la base de données */ char connInfo[BDD_CONN_LENGTH] = "dbname='pipi' user=pipisys password='"; char lastAp = '\''; FILE *dbPassFile; char ch; int pos = strlen(connInfo); dbPassFile = fopen(BDD_PASS_FILE,"r"); if (dbPassFile == NULL) { fprintf(stderr,"Cannot open file %s, on peut pas se connecter à la base de données pour lister les clés en tant que %d -> fopen error %d\n", BDD_PASS_FILE,getegid(),errno); return 1; } while (feof(dbPassFile)) { connInfo[pos] = fgetc(dbPassFile); pos++; } fclose(dbPassFile); connInfo[pos] = '\''; conn = PQconnectdb(connInfo); /* Vérifier que la connexion au backend a été faite avec succès */ if (PQstatus(conn) != CONNECTION_OK) { fprintf(stderr, "Connection to database failed: %s", PQerrorMessage(conn)); exit_nicely(conn); return 1; } /* Initialise un search path sûr, pour qu'un utilisateur malveillant ne puisse prendre le contrôle. */ res = PQexec(conn, "SELECT pg_catalog.set_config('search_path', '', false)"); if (PQresultStatus(res) != PGRES_TUPLES_OK) { fprintf(stderr, "SET failed: %s", PQerrorMessage(conn)); PQclear(res); exit_nicely(conn); } /* * Il faut libérer PGresult avec PQclear dès que l'on en a plus besoin pour * éviter les fuites de mémoire. */ PQclear(res); //res = PQprepare(conn,"GettingAllLoginGitUsersInfo","SELECT * FROM $1",1,NULL); //const char * tablename = "git-users"; //res = PQexecPrepared(conn,"GettingAllLoginGitUsersInfo",1,"git-users",NULL,NULL,0); res = PQexec(conn,"SELECT \"userID\",\"sshKeyType\",\"sshPubKey\" FROM git.keys"); /* affiche d'abord les noms des attributs */ nFields = PQnfields(res); fprintf(stderr, PQerrorMessage(conn)); /* puis affiche les lignes */ for (i = 0; i < PQntuples(res); i++) { printf("environement=\"GIT_USERID=%s\" %s %s\n", (int) PQgetvalue(res,i,0),PQgetvalue(res,i,1),PQgetvalue(res,i,2)); } PQclear(res); /* ferme la connexion à la base et nettoie */ PQfinish(conn); return 0; }