Trois programmes: - authKeysPg génère un fichier .authorized_keys à partir de la BDD - pam_oath_key est un module PAM demandant un mot de passe otp selon la clé de connection SSH utilisée - bash-gitonly est un «shell» qui execute les commandes transmises par SSH, uniquement reliées à git et en vérifiant les permissions
99 lines
2.5 KiB
C
99 lines
2.5 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include "libpq-fe.h"
|
|
#include <string.h>
|
|
|
|
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;
|
|
|
|
/*
|
|
char *password;
|
|
const char *passFileName = "/srv/bdd/pipi-system.pass";
|
|
|
|
FILE *passFile;
|
|
|
|
passFile = fopen(passFileName, "r");
|
|
|
|
fgets(password,127,passFile);
|
|
fclose(passFile);
|
|
|
|
printf("%-15s",password);
|
|
|
|
const char *connfirst = "dbname='pipi-system' user=pipiadmin password=";
|
|
|
|
//int lgt = strlen(connfirst) + strlen(password);
|
|
|
|
char * conninfo = (char *) malloc(256);
|
|
|
|
strcpy(conninfo,connfirst);
|
|
strcat(conninfo,password);
|
|
|
|
/* Crée une connexion à la base de données */
|
|
|
|
char *conninfo = "dbname='pipi-system' user=pipiadmin password='oaelEAAZH3Pr+hej43NnISY+RqkDpl09EHqzWu4XGQWUkG/Tkb+an2Triybhog/lkb/NRYK6b277duP0d3MF'";
|
|
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);
|
|
}
|
|
|
|
/* 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 * FROM login.\"git-users\"");
|
|
/* 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("ssh-ed25519 %s\n",PQgetvalue(res,i,3));
|
|
//printf("environment=\"GIT_USER_UID=%s\" ssh-ed25519 %s\n",PQgetvalue(res, i, 1),PQgetvalue(res,i,3));
|
|
}
|
|
|
|
PQclear(res);
|
|
|
|
/* ferme la connexion à la base et nettoie */
|
|
PQfinish(conn);
|
|
|
|
return 0;
|
|
}
|
|
|