#include #include #include "libpq-fe.h" #include #include #include #include #include #include #define BDD_PASS_FILE "/srv/bdd/pipi-system.pass" #define BDD_CONN_LENGTH 255 int main(int argc, char **argv, char **envp) { // Print cgi headers printf("Content-Type: text/plain; charset=UTF-8\n\n"); char* pathInfo = getenv("PATH_INFO"); if(pathInfo==NULL){ printf("Je n'ai pas accès au PATH_INFO.\n"); return 2; } const char slash[] = {'/'}; char* token = strtok(pathInfo,slash); if(token == NULL){ printf("Il vous faut un token non nul pour accéder à l'interface\n"); return 2; } char* action = strtok(NULL,slash); if(action == NULL){ printf("Que voulez-vous faire avec votre token %s ?\n",token); return 2; } char* reste = strtok(NULL,slash); //printf("Données récupérées: %s, puis %s, puis %s",token,action,reste); int i; /* //Dumping args for(i = 0; i < argc; i++) printf("argv[%d] -> %s\n",i,argv[i]); //Dumping env for (char **env = envp; *env != 0; env++) { char *thisEnv = *env; printf("env: %s\n", thisEnv); } printf("-------------------------------------------\n"); */ char connInfo[BDD_CONN_LENGTH] = "host='/var/run/postgresql' dbname='pipi' user=pipisys password='"; FILE *dbPassFile; char ch; int pos = strlen(connInfo); PGconn *conn; PGresult *res; char* userId = "0"; if(argc>1){ userId=*(argv+1); } // Récupère le mdp à la BDD 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,geteuid(),errno); return 1; } while (feof(dbPassFile)) { connInfo[pos] = fgetc(dbPassFile); pos++; } fclose(dbPassFile); connInfo[pos] = '\''; // Connecte à la BDD conn = PQconnectdb(connInfo); if (PQstatus(conn) != CONNECTION_OK) { fprintf(stderr, "Connection to database failed: %s", PQerrorMessage(conn)); PQfinish(conn); return 1; } 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); PQfinish(conn); return 1; } PQclear(res); // Demande de l'autorisation char const * sqlParamValues[] = {action,token}; res = PQexecParams(conn,"SELECT userID FROM git.tokens WHERE type=$1 AND token=$2",2,NULL,sqlParamValues,NULL,NULL,0); if (PQresultStatus(res) != PGRES_TUPLES_OK) { fprintf(stderr,"Impossible de lancer la requête SQL pour authentifier le token: %s",PQerrorMessage(conn)); PQclear(res); PQfinish(conn); return 1; } if(PQntuples(res)<1){ printf("Ce token est invalide !!!"); PQclear(res); PQfinish(conn); return 0; } userId=PQgetvalue(res,0,0); PQclear(res); // Demande les données à la BDD sqlParamValues[0] = userId; res = PQexecParams(conn,"SELECT path,owner,description,logoUrl,groupeID,gdr.nom FROM git.\"AccessibleRepos\"($1,'WRITE') JOIN git.\"groupesDeRepo\" AS gdr ON gdr.\"ID\"=groupeID ORDER BY groupeID",1,NULL,sqlParamValues,NULL,NULL,0); if (PQresultStatus(res) != PGRES_TUPLES_OK) { fprintf(stderr,"Impossible de lancer la requête SQL pour la liste des repos: %s",PQerrorMessage(conn)); PQclear(res); PQfinish(conn); return 1; } // Renvoie le résultat à travers stdout for (i = 0; i < PQntuples(res); i++) { printf("%s\n",PQgetvalue(res,i,0)); } PQclear(res); PQfinish(conn); return 0; }