2  *    This program is free software; you can redistribute it and/or modify
 
   3  *    it under the terms of the GNU General Public License as published by
 
   4  *    the Free Software Foundation; either version 2 of the License, or
 
   5  *    (at your option) any later version.
 
   7  *    This program is distributed in the hope that it will be useful,
 
   8  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
   9  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  10  *    GNU General Public License for more details.
 
  12  *    You should have received a copy of the GNU General Public License
 
  13  *    along with this program; if not, write to the Free Software
 
  14  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
  18  *    Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
 
  23  $Date: 2010/03/15 12:58:17 $
 
  31 #include "stg/common.h"
 
  36 extern IA_CLIENT_PROT * clnp;
 
  38 #define LISTEN_PORT (5580)
 
  42 //---------------------------------------------------------------------------
 
  46 unsigned long WINAPI RunWeb(void *)
 
  53 //---------------------------------------------------------------------------
 
  62 res = WSAStartup(MAKEWORD(2,0), &wsaData);
 
  65 for (int i = 0; i < DIR_NUM; i++)
 
  70 memset(&ls, 0, sizeof(ls));
 
  72 //---------------------------------------------------------------------------
 
  78     NULL,   // pointer to thread security attributes
 
  79     16384,  // initial thread stack size, in bytes
 
  80     RunWeb, // pointer to thread function
 
  81     NULL,   // argument for new thread
 
  82     0,      // CREATE_SUSPENDED, // creation flags
 
  83     &pt     // pointer to returned thread identifier
 
  86 pthread_create(&thread, NULL, RunWeb, NULL);
 
  89 //---------------------------------------------------------------------------
 
  90 void WEB::PrepareNet()
 
  92 listenSocket = socket(PF_INET, SOCK_STREAM, 0);
 
  94 struct sockaddr_in listenAddr;
 
  95 listenAddr.sin_family = AF_INET;
 
  96 listenAddr.sin_port = htons(LISTEN_PORT);
 
  97 listenAddr.sin_addr.s_addr = listenWebAddr;
 
 101 if (0 != setsockopt(listenSocket, SOL_SOCKET, SO_REUSEADDR, &lng, 4))
 
 103     printf("Setsockopt Fail\n");
 
 104     printf(">>> Error %s\n", strerror(errno));
 
 111 res = bind(listenSocket, (struct sockaddr*)&listenAddr, sizeof(listenAddr));
 
 115     printf("Bind failed.\n");
 
 119 res = listen(listenSocket, 0);
 
 122     printf("Listen failed.\n");
 
 126 //---------------------------------------------------------------------------
 
 127 void WEB::SetRefreshPagePeriod(int p)
 
 130 if (refreshPeriod <= 0 || refreshPeriod > 24*3600)
 
 133 //---------------------------------------------------------------------------
 
 134 void WEB::SetListenAddr(uint32_t ip)
 
 138 //---------------------------------------------------------------------------
 
 142 char recvBuffer[4096];
 
 145     struct sockaddr_in outerAddr;
 
 148     socklen_t outerAddrLen = sizeof(outerAddr);
 
 150     int outerAddrLen = sizeof(outerAddr);
 
 153     outerSocket = accept(listenSocket, (struct sockaddr*)&outerAddr, &outerAddrLen);
 
 154     if (outerSocket == -1)
 
 156         printf(">>> Error %s\n", strerror(errno));
 
 159     recv(outerSocket, recvBuffer, sizeof(recvBuffer), 0);
 
 161     if (strncmp(recvBuffer, "GET /sgauth.css", strlen("GET /sgauth.css")) == 0)
 
 164         //printf("(1) recvBuffer=%s\n", recvBuffer);
 
 166     else if (strncmp(recvBuffer, "GET /disconnect", strlen("GET /disconnect")) == 0)
 
 170         //printf("(2) recvBuffer=%s\n", recvBuffer);
 
 172     else if (strncmp(recvBuffer, "GET /connect", strlen("GET /connect")) == 0)
 
 176         //printf("(3) recvBuffer=%s\n", recvBuffer);
 
 178     else if (strncmp(recvBuffer, "GET /exit", strlen("GET /exit")) == 0)
 
 185         struct timespec ts = {1, 0};
 
 186         nanosleep(&ts, NULL);
 
 193        //printf("(4) recvBuffer=%s\n", recvBuffer);
 
 197     closesocket(outerSocket);
 
 203 //---------------------------------------------------------------------------
 
 204 int WEB::Redirect(const char * url)
 
 206 const char * redirect =
 
 208     "Content-Type: text/html\n"
 
 213     "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0;%s\">\n"
 
 216     "</body></html>\n\n";
 
 219 sprintf(buff, redirect, url);
 
 220 send(outerSocket, buff, strlen(buff), 0);
 
 224 //---------------------------------------------------------------------------
 
 229 const char * replyHeader =
 
 231     "Content-Type: text/html\n"
 
 236     "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"%d\">\n"
 
 237     "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n"
 
 238     "<title>sgauth</title>\n"
 
 239     "<link rel=\"Stylesheet\" href=\"sgauth.css\">"
 
 242     "<H3>Stargazer</H3><p>\n";
 
 244 const char * replyFooter = "</body></html>\n\n";
 
 246 char replyHeaderBuffer[2000];
 
 247 sprintf(replyHeaderBuffer, replyHeader, refreshPeriod);
 
 249 send(outerSocket, replyHeaderBuffer, strlen(replyHeaderBuffer), 0);
 
 253 int st = clnp->GetAuthorized();
 
 255 sprintf(str, "<a href=\"connect\">%s</a><p>\n", gettext("Connect"));
 
 256 res = send(outerSocket, str, strlen(str), 0);
 
 258 sprintf(str, "<a href=\"disconnect\">%s</a><p>\n", gettext("Disconnect"));
 
 259 res = send(outerSocket, str, strlen(str), 0);
 
 261 sprintf(str, "<a href=\"/\">%s</a><p>\n", gettext("Refresh"));
 
 262 res = send(outerSocket, str, strlen(str), 0);
 
 264 sprintf(str, "<a href=\"exit\">%s</a><p>\n", gettext("Exit"));
 
 265 res = send(outerSocket, str, strlen(str), 0);
 
 267 sprintf(str, "<div id=\"%s\">%s</div><p>\n" , st ? "ConnectionStateOnline":"ConnectionStateOffline", st ? "Online":"Offline");
 
 268 res = send(outerSocket, str, strlen(str), 0);
 
 270 sprintf(str, "<div id=\"Cash\">%s: %.3f</div><p>\n" , gettext("Cash"), ls.cash / 1000.0);
 
 271 res = send(outerSocket, str, strlen(str), 0);
 
 273 sprintf(str, "<div id=\"Prepaid Traffic\">%s: %s</div><p>\n" ,
 
 274         gettext("PrepaidTraffic"),
 
 275         ls.freeMb[0] == 'C' ? ls.freeMb + 1 : ls.freeMb);
 
 276 res = send(outerSocket, str, strlen(str), 0);
 
 278 sprintf(str, "<TABLE id=\"TraffTable\">\n");
 
 279 res = send(outerSocket, str, strlen(str), 0);
 
 280 sprintf(str, "    <TR id=\"TraffTableCaptionRow\">\n");
 
 281 res = send(outerSocket, str, strlen(str), 0);
 
 282 sprintf(str, "       <TD id=\"TraffTableCaptionCellC\"> </TD>\n");
 
 283 res = send(outerSocket, str, strlen(str), 0);
 
 286 for (j = 0; j < DIR_NUM; j++)
 
 288     if (dirName[j][0] == 0)
 
 291     KOIToWin(dirName[j], &s);// +++++++++ sigsegv ==========   TODO too long dir name crashes sgauth
 
 292     sprintf(str, "       <TD id=\"TraffTableCaptionCell%d\">%s</TD>\n", rowNum++, s.c_str());
 
 293     send(outerSocket, str, strlen(str), 0);
 
 296 sprintf(str,"    </TR>\n");
 
 297 send(outerSocket, str, strlen(str), 0);
 
 299 sprintf(str,"    <TR id=\"TraffTableUMRow\">\n");
 
 300 send(outerSocket, str, strlen(str), 0);
 
 302 sprintf(str,"        <TD id=\"TraffTableUMCellC\">%s</TD>\n", gettext("Month Upload"));
 
 303 send(outerSocket, str, strlen(str), 0);
 
 306 for (j = 0; j < DIR_NUM; j++)
 
 308     if (dirName[j][0] == 0)
 
 310     sprintf(str,"        <TD id=\"TraffTableUMCell%d\">%s</TD>\n", rowNum++, IntToKMG(ls.mu[j], ST_F));
 
 311     res = send(outerSocket, str, strlen(str), 0);
 
 314 sprintf(str,"    </TR>\n");
 
 315 res = send(outerSocket, str, strlen(str), 0);
 
 316 sprintf(str,"    <TR id=\"TraffTableDMRow\">\n");
 
 317 res = send(outerSocket, str, strlen(str), 0);
 
 318 sprintf(str,"        <TD id=\"TraffTableDMCellC\">%s</TD>\n", gettext("Month Download"));
 
 319 res = send(outerSocket, str, strlen(str), 0);
 
 322 for (j = 0; j < DIR_NUM; j++)
 
 324     if (dirName[j][0] == 0)
 
 326     sprintf(str,"        <TD id=\"TraffTableDMCell%d\">%s</TD>\n", rowNum++, IntToKMG(ls.md[j], ST_F));
 
 327     res = send(outerSocket, str, strlen(str), 0);
 
 329 sprintf(str,"    </TR>\n");
 
 330 res = send(outerSocket, str, strlen(str), 0);
 
 333 sprintf(str,"    <TR id=\"TraffTableUSRow\">\n");
 
 334 res = send(outerSocket, str, strlen(str), 0);
 
 335 sprintf(str,"        <TD id=\"TraffTableUSCellC\">%s</TD>\n", gettext("Session Upload"));
 
 336 res = send(outerSocket, str, strlen(str), 0);
 
 339 for (j = 0; j < DIR_NUM; j++)
 
 341     if (dirName[j][0] == 0)
 
 343     sprintf(str,"        <TD id=\"TraffTableUSCell%d\">%s</TD>\n", rowNum++, IntToKMG(ls.su[j], ST_F));
 
 344     res = send(outerSocket, str, strlen(str), 0);
 
 347 sprintf(str,"    </TR>\n");
 
 348 res = send(outerSocket, str, strlen(str), 0);
 
 349 sprintf(str,"    <TR id=\"TraffTableDSRow\">\n");
 
 350 res = send(outerSocket, str, strlen(str), 0);
 
 351 sprintf(str,"        <TD id=\"TraffTableDSCellC\">%s</TD>\n", gettext("Session Download"));
 
 352 res = send(outerSocket, str, strlen(str), 0);
 
 355 for (j = 0; j < DIR_NUM; j++)
 
 357     if (dirName[j][0] == 0)
 
 359     sprintf(str,"        <TD id=\"TraffTableDSCell%d\">%s</TD>\n", j, IntToKMG(ls.sd[j], ST_F));
 
 360     res = send(outerSocket, str, strlen(str), 0);
 
 363 sprintf(str,"    </TR>\n");
 
 364 res = send(outerSocket, str, strlen(str), 0);
 
 366 sprintf(str,"</TABLE>\n");
 
 367 res = send(outerSocket, str, strlen(str), 0);
 
 370 if (!messages.empty())
 
 372     sprintf(str,"    <TABLE id=\"MessagesTable\">\n");
 
 373     res = send(outerSocket, str, strlen(str), 0);
 
 375     sprintf(str,"        <TR id=\"MessagesTableRowC\">\n");
 
 376     send(outerSocket, str, strlen(str), 0);
 
 377     sprintf(str,"            <TD>Date</TD>\n");
 
 378     send(outerSocket, str, strlen(str), 0);
 
 379     sprintf(str,"            <TD>Text</TD>\n");
 
 380     send(outerSocket, str, strlen(str), 0);
 
 381     sprintf(str,"        </TR>\n");
 
 382     send(outerSocket, str, strlen(str), 0);
 
 384     list<STG_MESSAGE>::reverse_iterator it;
 
 385     it = messages.rbegin();
 
 386     while (it != messages.rend())
 
 388         sprintf(str,"        <TR id=\"MessagesTableRow%d\">\n", rowNum);
 
 389         send(outerSocket, str, strlen(str), 0);
 
 390         sprintf(str,"            <TD>%s</TD>\n", it->recvTime.c_str());
 
 391         send(outerSocket, str, strlen(str), 0);
 
 392         sprintf(str,"            <TD>%s</TD>\n", it->msg.c_str());
 
 393         send(outerSocket, str, strlen(str), 0);
 
 394         sprintf(str,"        </TR>\n");
 
 395         send(outerSocket, str, strlen(str), 0);
 
 400     sprintf(str,"   </TABLE>\n");
 
 401     res = send(outerSocket, str, strlen(str), 0);
 
 404 time_t t = time(NULL);
 
 405 sprintf(str,"Îáíîâëåíî: %s</b>" , ctime(&t));
 
 406 res = send(outerSocket, str, strlen(str), 0);
 
 408 send(outerSocket, replyFooter, strlen(replyFooter), 0);
 
 412 //---------------------------------------------------------------------------
 
 415 const char * replyHeader =
 
 417     "Content-Type: text/css\n"
 
 418     "Connection: close\n\n";
 
 420 const char * replyFooter= "\n\n";
 
 422 send(outerSocket, replyHeader, strlen(replyHeader), 0);
 
 423 send(outerSocket, css, strlen(css), 0);
 
 424 send(outerSocket, replyFooter, strlen(replyFooter), 0);
 
 428 //---------------------------------------------------------------------------
 
 429 void WEB::SetDirName(const string & dn, int n)
 
 431 web->dirName[n] =  dn;
 
 433 //---------------------------------------------------------------------------
 
 434 void WEB::AddMessage(const string & message, int type)
 
 436 time_t t = time(NULL);
 
 441 m.recvTime = ctime(&t);
 
 443 messages.push_back(m);
 
 445 if (messages.size() > MAX_MESSAGES)
 
 446     messages.pop_front();
 
 449 //---------------------------------------------------------------------------
 
 450 void WEB::UpdateStat(const LOADSTAT & ls)
 
 452 memcpy((void*)&(WEB::ls), &ls, sizeof(LOADSTAT));
 
 454 //---------------------------------------------------------------------------