Login

Haukkasin liian suuren palan edellisessä postissa, vaikka suurin osa koodista olikin jo olemassa. Aloitan uudestaan login palalla. Tästä puuttuu vielä kenttien pituuksien rajoituiksia, tämä on vasta ensimmäinen versio. Salasanat ovat vielä selväkielisiä.

Tätä samaa rutiinia käytetään käyttäjän tietojen tarkistuksessa, session id:n määrittelyssä ja login näytön tulostuksessa.

Lisäsin loppuun vielä html-parametrien käsittelyn. Se on pala, joka muuttaa html-näytön parametrit terttu muotoon. (katso userid ja password kentät logon näytöllä)

Kaikki oikeudet tietenkin pidätetään.

int get_session(char *sessionid)
{
 int c,ok,comp;
 char userid2[32],password2[32],password3[32],bones[64];
 struct set *sets,*setp,*setusers;
 time_t now;
 unsigned char timebuf[128];

 ok=0;
 *sessionid='\0';
 *userid2='\0';
 *password2='\0';
 sets=NULL;
 setusers=NULL;

 /* luetaan html datasta sessionid */
 set_get_element("sessionid",&comp,sessionid,htmlparams);

 /* Jos id löytyi, tarkistetaan istunnon olemassaolo */
 if(*sessionid!='\0') {
  if(exists_session_var("SESSION"))
    ok=1;
  else
    sessionid[0]='\0';
 }

 if(*sessionid=='\0') {
  /* luetaan näytöltä käyttäjätunnus ja käyttäjän syöttämä salasana */
  skk_fetch_sets(&sets,"'userid', 'password'",setscreen); /* ennen skk_fetch2() JariK 20150917 */

  /* Näitä pareja löytyy vain yksi (katso lopun näytön tulostus */
  if(skk_count_sets(sets)==1) {
   set_get_element("userid",&comp,userid2,sets->data);
   set_get_element("password",&comp,password2,sets->data);
  }

  if(*userid2!='\0' || password2!='\0') {
   /* Haetaan mätsäävä tunnus tertusta */
   sprintf(bones,"'userid'=\"%s\", 'password'",userid2);
   skk_fetch_sets(&setusers,bones,skk->first);

   if(skk_count_sets(setusers)==1) {
    /* Jos löytyi vaan yksi */
    set_get_element("password",&comp,password3,setusers->data);

    /* Verrataan salasanoja, jos samat,luodaan sessionid,
       talletetaan se ja userid */
    if(!strcmp(password2,password3)) {
     get_session_id(sessionid);
     set_session_var("session",sessionid);
     set_session_var("userid",userid);
     ok=1;
    }
   }
  }
 }

 /* Jos sessionidtä ei löytynyt/saatu aikaiseksi,
  * tulostetaan login näyttö käyttäjälle:
  */
 if(*sessionid=='\0') {
  html=html1;
  html[0]='\0';

  html_printf("HTTP/1.0 200 OK\r\n");
  html_printf("Location: \r\n");
  html_printf("Server: %s\r\n",programname);
  now = time(NULL);
  strftime(timebuf, sizeof(timebuf), HTMLTIMEFORMAT, gmtime(&now));

  html_printf("Date: %s\r\n",timebuf);

  html=html2;
  html[0]='\0';
  html_printf("\n<!DOCTYPE html>\r\n");
  html_printf("<html lang=\"fi\">");

  html_printf("<head>");
  html_printf("<meta charset=\"UTF-8\">");
  html_printf("<title>Terttu</title>");
  html_printf("<meta name=\"author\" content=\"Jari Kuivaniemi\">");
  html_printf("<link href=\"terttu.css\" rel=\"stylesheet\" type=\"text/css\">");
  html_printf("</head>");
  html_printf("<body>");

  html_printf("<form action=\"logon\" method=\"post\">");
  html_printf("<input type=\"hidden\" name=\"sessionid\" value=\"%s\">",sessionid);
  html_printf("<table border=\"0\">");
  html_printf("<tr>");
  html_printf("Testiohjelmaan lokkaantuminen Userid=testi, password=testaus");
  html_printf("</tr>");
  html_printf("<tr>");
  html_printf("</tr>");
  html_printf("<td>");
  html_printf("Userid");
  html_printf("</td>");
  html_printf("<td>");

  html_printf("<input type=\"char\" name=\"userid-0\" value=\"%s\">",userid2);
  html_printf("</td>");
  html_printf("</tr>");

  html_printf("<tr>");
  html_printf("<td>");
  html_printf("Password");
  html_printf("</td>");
  html_printf("<td>");
  html_printf("<input type=\"password\" name=\"password-0\" value=\"%s\">",password2);
  html_printf("</td>");

  html_printf("<tr>");
  html_printf("<input type=\"submit\" value=\"Submit\">");
  html_printf("</tr>");

  html_printf("</table>");
  html_printf("</form>");

  html_printf("<br>");
  html_printf("Tämä on kesken olevan projektin \"lelusovellus\", eikä se ole tarkoitettu tuotteiden tilaamiseen.<br>");
  html_printf("<br>");
  html_printf("Saat listan toiminnoista leijumalla Terttu -sanan päällä.<br>");
  html_printf("<br>");
  html_printf("Raportti sovelluksen rakentamisesta löytyy osoitteesta moijari.com.<br>");
  html_printf("<br>");
  html_printf("<br>");
  html_printf("</body>");
 }
 return(ok);
}

html_get_screen_params(struct set **set)
{
 int id,first;
 char *p,*q;
 unsigned char name[64],value[64];
 struct set *setu;

 /* hae html parametrien sijaintiosoite */
 p=html_get_param2_addr();

 while(*p!='\0') {
  /* Hae parametrin nimi ja arvo */
  html_get_param2(&p,name,sizeof(name)-1,value,sizeof(value)-1);

  /* osoite parametrin nimen loppuun */
  q=name+strlen(name)-1;
  id=0;

  /* Haetaan parametrin nimen lopussa olevan numeron alku */
  if(isdigit(*q)) {
   while(isdigit(*(q-1))) {
   q--;
  }

  /* rivinumeron lisäksi parametrin nimen lopussa pitää olla '-'.
   * esimerkiksi 'userid-0'.
   */
  if(*(q-1)==rowidchar)
   *(q-1)='\0';
   /* rivin numero inttimuuttujaan */
   id=atoi(q);
  } else {
   id=-1;
  }

  if(id>=0) {
   /* Talletetaan kenttä oikealle riville. */
   set_add_element_id(set,id,name,value);
  }
  /* Ohitetaan parametrien välissä oleva '&' merkki. */
  if(*p=='&') {
   p++;
  }
 }
}