145 lines
3.7 KiB
C
145 lines
3.7 KiB
C
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include "libpq-fe.h"
|
||
#include <string.h>
|
||
|
||
#include <fcntl.h>
|
||
#include <unistd.h>
|
||
#include <sys/types.h>
|
||
#include <errno.h>
|
||
|
||
#include <dirent.h>
|
||
|
||
#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;
|
||
}
|
||
|