/*******************************************\ | * Ce programme est sous license GNU GPL * | | * This software is under GNU/GPL license * | | * * * * * * * * * * * * * * * * * * * * * * | | * http://www.gnu.org/copyleft/gpl.html * | \*******************************************/ /* * http://ed.zehome.com/ * Made by Laurent Coustet <ed@zehome.com> */ #include <stdio.h> #include <stdlib.h> #include <cgi.h> #include <string.h> #include <time.h> #include <sys/time.h> #include <sys/file.h> #include <sys/types.h> #include <dirent.h> #include <mysql/mysql.h> #include "debug.h" #include "edblog.h" #include "templates.h" #include "mysql.h" #include "news.h" #include "guestbook.h" #include "blog2.h" /* avec un / */ #define SITEPATH "/home/ed/www2/" #define LOGPATH "/home/ed/www2/log" #define VISITFILE "/home/ed/www2/visites.txt" #define BLOGFILE "/home/ed/www/blog.txt" #define URL "http://ed.zehome.com/" #define BUF_SIZE 1024 #define NOMBRE_DE_VISITEURS_MAX 200 #define VERSION "3.0" #define PHOTO_REP "/home/ed/www/photos" #define SCREENSHOT_REP "/home/ed/www/screenshots" #define PHOTOS_PAR_LIGNE 4-1 #define BASEDIR "./html/" #define NEWSPASSWORD "*******" struct timeval start_time; struct timezone start_timezone; struct timeval stop_time; struct timezone stop_timezone; s_cgi *cgi; char *extension = ".html"; float gentime=0.0; char *__client_ip; void printhtml (char *string); void check_sh (char *string); int include_file (char *filepath,int html); void addvisit (); void checkvisit (char *ip); void html_generated(); void html_stats(); void photo_print_index(); void include_html (char *filename); void get_connected(); void html_print_credits () { printf("\n" "<!-- Version: %s -->", VERSION); } void html_print_headers () { cgiHeader (); html_print_credits (); include_file ("./includes/headershead",0); html_stats(); include_file ("./includes/headerstail",0); } void html_print_footer () { include_file ("./includes/footerhead",0); html_generated(); include_file ("./includes/footertail",0); html_print_credits (); } int main (int argc, char *argv[]) { char *path_info = NULL; cgiDebug (0, 0); cgi = cgiInit (); path_info = getenv ("PATH_INFO"); gettimeofday(&start_time, &start_timezone); if(getenv("REMOTE_ADDR")!=NULL) __client_ip = strdup(getenv ("REMOTE_ADDR")); else __client_ip = strdup("127.0.0.1"); checkvisit(__client_ip); if (! path_info) { html_print_headers (); if ((cgiGetValue(cgi, "page") == NULL)) include_html ("accueil"); else if (strstr(cgiGetValue(cgi, "page"), "photos")) { if (strstr("album", cgiGetValue(cgi, "page"))) fprintf(stdout,"Album %s\n", cgiGetValue(cgi, "Album")); else photo_print_index (PHOTO_REP, "photos"); } else if (strstr(cgiGetValue(cgi, "page"), "blog")) { init_blog ("templates/head.tpl", "templates/body.tpl", "templates/tail.tpl"); draw_head (stdout); draw_blog (stdout,"blog.txt"); draw_tail (stdout); } else if (strstr(cgiGetValue(cgi, "page"), "guestbook")) GetGB (); else if (strstr(cgiGetValue(cgi, "page"), "screenshots")) photo_print_index (SCREENSHOT_REP, "screenshots"); else if (strstr(cgiGetValue(cgi, "page"), "news2")) GetNews (); else if (strstr(cgiGetValue(cgi, "page"), "addgb")) { if (AddGB(cgiGetValue(cgi, "texte"), cgiGetValue(cgi, "auteur"), __client_ip, getenv("HTTP_USER_AGENT")) == 0) printf("Commentaire ajouté<br />\n"); else printf("Erreur d'ajout. Informations manquantes ou érronées.\n"); GetGB (); } else if (strstr(cgiGetValue(cgi, "page"), "addnewsconfirm")) { if (strcmp(cgiGetValue(cgi, "password"), NEWSPASSWORD)==0) { AddNews(cgiGetValue(cgi, "titre"), cgiGetValue(cgi, "texte")); printf("News ajoutée!<br /><a href=\"./?page=news2\"<< Retour</a>\n"); } else printf("Mauvais password!\n"); } else if (cgiGetValue(cgi, "page") != NULL) include_html (cgiGetValue(cgi, "page")); html_print_footer (); } return 0; } void check_sh (char *string) { if ((strstr((const char *) string,".."))!=NULL) { fprintf(stdout, "Erreur: Requete invalide. (contiend '../')\n"); html_print_footer (); exit (1); } while (*string != '\0') { switch (*string) { case ' ': case '\\': case '`': case '~': case '|': printf("Requete invalide.\n"); html_print_footer (); exit(1); break; } string++; } } void printhtml (char *string) /* replace < and > by < and > */ { while (*string) { switch (*string) { case '\n': fprintf (stdout,"<br>\n"); break; case '&': fprintf (stdout,"&"); break; default: fprintf (stdout,"%c", *string); break; } string++; } } void include_html (char *filename) { char *newfilename; int s; s = strlen(BASEDIR)+strlen(filename); newfilename = (char *)calloc(s+2, 1); snprintf(newfilename, s+2, "%s%s", BASEDIR, filename); include_file(newfilename, 0); free(newfilename); } int include_file (char *filepath, int html) { char *new_filepath; FILE *fichier; char *buffer; int size=0; check_sh (filepath); new_filepath = calloc(strlen(filepath)+strlen(extension)+1, 1); sprintf(new_filepath, "%s%s", filepath, extension); //strncpy(new_filepath, filepath, strlen(filepath)); //strncat(new_filepath, extension, strlen(extension)); /* fprintf(stdout, "filepath: %s\n",new_filepath); */ if ((fichier = fopen (new_filepath,"r"))==NULL) { fprintf(stdout, "Ouverture du fichier %s impossible\n",new_filepath); return (-1); } else { fseek(fichier, 0, SEEK_END); size = ftell(fichier); fseek(fichier, 0, SEEK_SET); buffer = (char *) calloc(size+1, 1); while (fread(buffer, sizeof(char), size, fichier)) { if(html==0) fprintf(stdout,"%s",buffer); else printhtml (buffer); } fclose(fichier); memset(buffer, 0, size+1); } free(new_filepath); free(buffer); return (0); } void html_generated() { gettimeofday(&stop_time, &stop_timezone); gentime = ((stop_time.tv_usec - start_time.tv_usec) / 1000000.0); fprintf(stdout, "%fs\n", gentime); } void checkvisit (char *ip) { FILE *logfile; char *ligne; int i, j=0, add=1; struct { char *lignecomplete; int date; char *ip; } visiteur[NOMBRE_DE_VISITEURS_MAX]; int timeout = 1200; int date = time (NULL); ligne = calloc(31, 1); if (ip == NULL) return; printf("Votre ip: %s\n", ip); if ((logfile = fopen (LOGPATH,"r"))==NULL) { fprintf(stdout, "Ouverture du fichier de logs %s impossible\n",LOGPATH); exit(1); } else { for (j=0;(fgets(ligne,30,logfile)!=NULL) && (j < NOMBRE_DE_VISITEURS_MAX);++j) { visiteur[j].lignecomplete = calloc(strlen(ligne)+1, 1); strcpy(visiteur[j].lignecomplete, ligne); visiteur[j].ip = strtok(ligne, " "); visiteur[j].date = strtol(strtok(NULL, " "), NULL, 10); if ((strstr(ip,visiteur[j].ip)) != NULL) add=0; } fclose(logfile); if ((logfile = fopen (LOGPATH,"w"))==NULL) { fprintf(stdout, "Ouverture du fichier de logs %s impossible\n",LOGPATH); exit(1); } for (i=0; i<j;i++) { if ( (date - visiteur[i].date) <= timeout ) fprintf(logfile,"%s",visiteur[i].lignecomplete); } if (add == 1) { if (strstr(ip, ".") != NULL) { fprintf(logfile,"%s %d\n",ip,date); addvisit(); } } fclose(logfile); } bzero(ip, strlen(ip)); } void addvisit () { FILE *visitfile; long long visites=0; char *line; line = calloc(20, 1); if ((visitfile = fopen (VISITFILE,"r"))==NULL) { fprintf(stdout, "Ouverture du fichier de logs %s impossible\n",LOGPATH); exit(1); } fgets(line, 20, visitfile); visites = strtoll(line, NULL, 10); free(line); // fprintf(stderr,"visites: %d\n",visites); fclose(visitfile); if ((visitfile = fopen (VISITFILE, "w")) == NULL) { fprintf(stdout, "Ouverture du fichier de logs %s impossible\n",LOGPATH); exit(1); } fprintf(visitfile,"%lld\n",visites+1); // fprintf(stdout,"%d\n",visites+1); fclose(visitfile); } void get_connected() { FILE *logfile; char *line; int i; line = calloc(31, 1); if ((logfile = fopen (LOGPATH,"r"))==NULL) { fprintf(stdout, "Ouverture du fichier de logs %s impossible\n",LOGPATH); exit(1); } for (i=0;(fgets(line,30,logfile) != NULL);i++); free(line); fclose(logfile); printf("%d connectés", i); } void html_stats() { FILE *visitfile; int visites; char *line; line = calloc(11, 1); if ((visitfile = fopen (VISITFILE,"r"))==NULL) { fprintf(stderr, "Ouverture du fichier de logs %s impossible\n",LOGPATH); //exit(1); return; } fgets(line,10,visitfile); visites = strtol(line,NULL,10); free(line); printf("<span><b>Stats:</b><br />"); printf("%d visites\n",visites); printf("<br />"); get_connected (); printf("</span>\n"); fclose(visitfile); } void photo_print_index(char *dir,char *rep) { DIR *directory; struct dirent *st_directory; int i=0; int tr=1; st_directory = calloc(201, 1); if ((directory = opendir(dir))==NULL) { fprintf(stdout, "Ouverture du répertoire d'images: %s impossible.\n",dir); exit(1); } fprintf(stdout, "<h1 align=\"center\">Photos / screenshots</h1>"); fprintf(stdout, "<table border=\"0\" class=\"photos\" cellspacing=\"15\" cellpadding=\"15\" align=\"center\">\n<tr>\n"); while ( (i<=PHOTOS_PAR_LIGNE) && ((st_directory = readdir(directory))!=NULL) ) { if ( (strncmp(&(st_directory->d_name[0]),(const char *)".",1)!=0) && (strncmp(&(st_directory->d_name[1]),(const char *)"..",2)!=0) && (strstr(&(st_directory->d_name[0]),"thumb")==NULL) ) { // fprintf(stdout, "Readdir %s filename: %s\n<br>",PHOTO_REP,&(st_directory->d_name[0])); fprintf(stdout, "<td><a href=\"%s/%s\"><img border=\"0\" src=\"%s/thumb/%s\" alt=\"%s\"></a></td>\n",rep,&(st_directory->d_name[0]),rep,&(st_directory->d_name[0]),&(st_directory->d_name[0])); if (i == PHOTOS_PAR_LIGNE) { i=0; fprintf(stdout,"</tr>\n<tr>\n"); tr++; } else { i++; } } } if (tr > 0) { fprintf(stdout,"<td> </td></tr>\n"); } fprintf(stdout,"</table>\n"); closedir(directory); }