git4pipi/webterface.c
2021-07-28 22:52:43 +02:00

145 lines
3.7 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}