All pastes #1417011 Raw Edit

Stuff

public text v1 · immutable
#1417011 ·published 2009-05-09 01:14 UTC
rendered paste body
#ifndef _Valwrapper_wsk
#define _Valwrapper_wsk
int timestamp();
#define vwtrace() writefile("valwrapperlog.txt",ctostr(__LINE__));\
//#include "sflib.cpp"
#include <wininet.h>
#include <windows.h>
#include <winsock2.h>
#include "varlist.h"
#include "filestream.h"

#define ctocp(s)  (char*)s.c_str()
#define pause() cout<<"\npress any key...";getch();cout<<"\r                \r";
#define BAD_SOCK(sock) \
  wsa_error = GetLastError(); \
  closesocket(sock); \
  WSACleanup(); \
  return ;
#define BAD_SOCK_DL(sock) \
  wsa_error = GetLastError(); \
  closesocket(sock); \
  WSACleanup(); \
  return ;
static filestream vallog("valwrapperlog.txt");

class valwrapper{
    private:
    DWORD wsa_error;
    void cutheaders();
    void ws_request(char *prot,char *host, unsigned short port, char *uri, char *referer, char * postdat);
    void ws_dl_request(char *prot,char *host, unsigned short port, char *uri, char *referer, char *filename, char*postdat);
    int tim_hold;

    public:
    int last_time;
    int last_size;
    int lastdl_size;
    int tot_pages;
    varlist cookies;
    valwrapper(string fname);
    unsigned short vwproxport;
    string headers,domain,whole;
    string name, pass, cursource, cooks, vwproxy;
    bool usecooks,savesource,useproxy,superspeed,cookiexport,autolocate;
    string parseheaders(); // returns Location: value
    void getcookies();
    void get(string fname, string referer);
    void post(string fname, string data,string referer);
    void init(string dom);
    void getdl(string fname, string file,string referer);
    void savecookies(string fname,bool clear);
    void loadcookies(string fname,string cfname);
    int recv_for(SOCKET&,int,char*,int&);
    int vt_s();
    int vt_e();



};
int valwrapper::vt_s(){
    tim_hold=timestamp();
    return tim_hold;
}
int valwrapper::vt_e(){
    int i = timestamp();
    last_time = i-tim_hold;
    return last_time;
}


#define SNPOS string::npos
/* utility methods */
string readpass(string pr){
    cout << pr << "==>";
    string ret;
    char n;
    cin.clear();
    //if(cin.peek()!=EOF)cin.ignore(numeric_limits<streamsize>::max(), '\n');
    while(1){
        n=getch();
        if(n=='\b' && ret.length()>0){
            ret.erase(ret.length()-1);
            cout << "\b \b";
        }
        if(n=='\r')break;
        ret+=n;
        cout << "*";
    }
    cout << endl;
    return ret;
}

string ctostr(int i){
    char a[33];
    itoa(i,a,10);
    return a;
}
int cctoint(string s){
    if(s=="0")return 0;
    if(s=="")return -1;
    int i;
    while((i=s.find(",",0))!=SNPOS){
        s.erase(i,1);
    }
    int t = atoi(ctocp(s));
    return (t==0?-1:t);
}

int ctoint(string s){
    if(s=="0")return 0;
    int t = atoi(ctocp(s));
    return (t==0?-1:t);
}

bool instr(string o,string t){
  if(o.find(t)!= SNPOS)return true;
  return false;
}
int findlast(string w,string p,int ind=0){
    int i = w.rfind(p,ind);
    if(i== SNPOS) return -1;
    return i;
}
int findlastl(string w,string p,int ind=0){
    int i = w.rfind(p,ind);
    if(i== SNPOS) return -1;
    return i+p.length();
}
int findnext(string w,string p,int ind = 0){
    int i = w.find(p,ind);
    if(i== SNPOS) return -1;
    return i;
}
int findnextl(string w, string p, int ind = 0){
    int i = w.find(p,ind);
    if(i== SNPOS) return -1;
    return i+p.length();
}
string getbetweeni(string w,string s, string e,int &ind){
    int o = w.find(s,ind);
    int t=w.find(e,o+s.length());
    ind=t;
    if(o == SNPOS || t == SNPOS || o==t) return "";
    o+=+s.length();
    return w.substr(o,t-o);
}
string getbetween(string w, string s, string e,int ind =0){
    int o = w.find(s,ind);
    int t=w.find(e,o+s.length());
    if(o == SNPOS || t == SNPOS || o==t) return "";
    o+=+s.length();
    return w.substr(o,t-o);
}
string getbetween(string w, int s, string e){
    int t=w.find(e,s);
    if( t == SNPOS) return "";
    return w.substr(s,t-s);
}
string getafter(string w, string p,int i=0){
    int t = w.find(p,i);
    if(t==SNPOS)return "";
    return w.substr(t + p.length());
}

void valwrapper::get(string fname,string referer=""){
    tot_pages++;
    if(!instr(fname,"/")) fname = "/"+fname;
    getcookies();
    if(referer != "") referer = "\r\nReferer: "+referer;
    ws_request("GET",ctocp(domain), 80, ctocp(fname), ctocp(referer),"");
    string loc = parseheaders();
    if(autolocate && loc != ""){autolocate = false; get(loc); autolocate = true;}

}
void valwrapper::post(string fname, string data, string referer=""){
    tot_pages++;
    if(!instr(fname,"/")) fname = "/"+fname;
    getcookies();
    if(referer != "") referer = "\r\nReferer: "+referer;
    ws_request("POST",ctocp(domain), 80, ctocp(fname), ctocp(referer), ctocp(data));
    string loc = parseheaders();
    if(autolocate && loc != ""){autolocate = false; get(loc); autolocate = true;}
}
void valwrapper::init(string dom){
    domain = dom;
    //cookies.fillfromfile("systemfiles\\"+domain+".di");
    usecooks = true;
}
void valwrapper::savecookies(string fname,bool clear=false){
    cookies.tofile("system\\"+fname,clear);
}
void valwrapper::loadcookies(string fname,string cfname=""){
    if(cfname != "") savecookies(cfname);
    cookies.clear();
    cookies.fillfromfile(fname);
}

void valwrapper::getdl(string fname, string file, string referer=""){
    if(!instr(fname,"/")) fname = "/"+fname;
    getcookies();
    if(referer != "")
        referer = "\r\nReferer: "+referer;
    ws_dl_request("GET",ctocp(domain),80,ctocp(fname),ctocp(referer),ctocp(file),"");
    parseheaders();
}
valwrapper::valwrapper(string fname=""){
    init(fname);
    usecooks = true;
    savesource = false;
    useproxy = false;
    superspeed = false;
    cookiexport = true;
    tot_pages=0;
}
string valwrapper::parseheaders(){
    if(usecooks){
        string val,names;
        int ind = 0;
        while(true){
            ind = findnext(headers,"Set-Cookie: ",ind+16);
            if( ind == -1) break;
            name = getbetween(headers, "Set-Cookie: ","=",ind-3);
            val = getbetween(headers, "=", ";",ind);
            cookies.set(name,val);
            //pause();
        }
        if(cookiexport)
        cookies.tofile("system\\"+domain+".di",false,"\n");
    }
    if(autolocate){
        int ind = findnextl(headers,"Location: ",0);
        if(ind == -1)return "";
        string val = getbetween(headers,"Location: ","\r\n");
        //cout << headers<<endl;
        //cout << "reloc: "<<val<<endl;
        return val;

    }
    return "";

}
void valwrapper::getcookies(){
    if(!usecooks)return;
    string temp;
    string ret = "Cookie: ";
    ret+=cookies.tostring("=","; ");

//    for(int i = 0; i < cookies.length(); i++){
//        cout << "grabbing cookie" << i<<endl;
//        temp = cookies.get(i);
//        if(temp == "")continue;
//        ret += temp;
//        if(i+1 != cookies.length())ret+="; ";
//    }
    cooks = ret;
}
void valwrapper::cutheaders(){

    whole = cursource;
    int ind = findnext(cursource,"\r\n\r\n",0);
    if(ind == -1){
        headers = cursource;
        return;
    }
    headers = cursource.substr(0,ind);
    ind += 4;
    cursource = cursource.substr(ind);
}
// s = socket to watch, secs is seconds to wait before returning, nret is address of number of bytes read, and tim is address of value of time it took to return
//int valwrapper::recv_for(SOCKET &s,int secs,char *data,int &tim){
//    vt_s();
//    int nret=0;
//    struct timeval timev;
//    fd_set rfds1;
//    timev.tv_sec=secs;
//    FD_ZERO (&rfds1);
//    timev.tv_usec=0;
//    int l = 0;
//    FD_ZERO (&rfds1);
//    if(select ((int)s, &rfds1, NULL, NULL, &timev)) {
//         l = recv(s,data,sizeof(data),0);
//         nret = l;
//         tim=vt_e();
//         return nret;
//    }
//
////    nret = -1;
//    tim=vt_e();
//    return -1;
//}


int valwrapper::recv_for(SOCKET &s,int secs,char *data,int &tim){
vwtrace();
    vt_s();
vwtrace();
    int nret=0;
vwtrace();
    struct timeval timev;
vwtrace();
    fd_set rfds1;
vwtrace();
    timev.tv_sec=secs;
vwtrace();
    FD_ZERO (&rfds1);
vwtrace();
    timev.tv_usec=0;
vwtrace();
    int l = 0;
vwtrace();
    FD_ZERO (&rfds1);
vwtrace();
    if(select ((int)s, &rfds1, NULL, NULL, &timev)) {
vwtrace();
         l = recv(s,data,512,0);
vwtrace();
         nret = l;
vwtrace();
         tim=vt_e();
vwtrace();
         return nret;
vwtrace();
    }
vwtrace();

vwtrace();
//    nret = -1;
vwtrace();
    tim=vt_e();
vwtrace();
    return -1;
vwtrace();
}
/*
void valwrapper::ws_request_old(
        char *prot,
        char *host,
        unsigned short port,
        char *uri,
        char *referer,
        char *postdat)
{
  WSADATA wsaData;
  struct hostent *target_ptr;
  struct sockaddr_in sin;
  SOCKET sock;
  char   req[] = "%s %s HTTP/1.0\r\nHost: %s%s\r\nContent-Length: %s\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: close\r\n%s\r\n\r\n%s";
  char   *httprequest;
  char   *recv_string;
  char   data[512];
  unsigned long bytes_received;
  unsigned short nret;
  string l = ctostr(strlen(postdat));
  char* len = ctocp(l);


  if (WSAStartup(MAKEWORD(2,2), &wsaData) < 0) return ;
  if ( (sock = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET ) {BAD_SOCK(sock);}
  if ( (target_ptr = gethostbyname(host)) == NULL) {BAD_SOCK(sock);}

  if(useproxy){
    string reuri = "";
    reuri += "http://";
    reuri +=host;
    reuri +=uri;
    uri=ctocp(reuri);
    httprequest = (char*)malloc(strlen(req) + strlen(uri) +strlen(len) + strlen(host) + strlen(referer) +  1 +cooks.length()+strlen(prot)+strlen(postdat) );
    sprintf(httprequest, req,prot, uri, host, referer,len,ctocp(cooks),postdat);
    sin.sin_addr.s_addr = inet_addr(vwproxy.c_str());
    sin.sin_port = htons(vwproxport);
  }
  else{
    httprequest = (char*)malloc(strlen(req) + strlen(uri) +strlen(len) + strlen(host) + strlen(referer) +  1 +cooks.length()+strlen(prot)+strlen(postdat) );
    sprintf(httprequest, req,prot, uri, host, referer,len,ctocp(cooks),postdat);
    memcpy(&sin.sin_addr.s_addr, target_ptr->h_addr, target_ptr->h_length);
    sin.sin_port   = htons(port);
  }
//  cout << "httprequest: "<<httprequest<<endl;
    sin.sin_family = AF_INET;

  if ( (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) ) ) {BAD_SOCK(sock);}

  if ( send(sock, httprequest, strlen(httprequest), 0) == -1 ) {BAD_SOCK(sock);}
  recv_string = (char*)malloc(2);
  strcpy(recv_string, "");
  while ( (nret = recv(sock, data, sizeof(data), 0)) > 0 ) {
    bytes_received += nret;
    if(superspeed && nret)break;
    recv_string = (char*)realloc(recv_string, strlen(recv_string) + nret + 1);
    strncat(recv_string, data, nret);
  }
  closesocket(sock);
  cursource = recv_string;
  cutheaders();
  WSACleanup();
  free(httprequest);
  free(recv_string);
}


*/
void valwrapper::ws_request(
        char *prot,
        char *host,
        unsigned short port,
        char *uri,
        char *referer,
        char *postdat)
{
  WSADATA wsaData;
  struct hostent *target_ptr;
  struct sockaddr_in sin;
  SOCKET sock;
  char   req[] = "%s %s HTTP/1.0\r\nHost: %s%s\r\nContent-Length: %s\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: close\r\n%s\r\n\r\n%s";
  char   *httprequest;
  char   *recv_string;
  char   data[512];
  unsigned long bytes_received;
  unsigned short nret;
  string l = ctostr(strlen(postdat));
  char* len = ctocp(l);


  if (WSAStartup(MAKEWORD(2,2), &wsaData) < 0) return ;
  if ( (sock = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET ) {BAD_SOCK(sock);}
  if ( (target_ptr = gethostbyname(host)) == NULL) {BAD_SOCK(sock);}

  if(useproxy){
    string reuri = "";
    reuri += "http://";
    reuri +=host;
    reuri +=uri;
    uri=ctocp(reuri);
    httprequest = (char*)malloc(strlen(req) + strlen(uri) +strlen(len) + strlen(host) + strlen(referer) +  1 +cooks.length()+strlen(prot)+strlen(postdat) );
    sprintf(httprequest, req,prot, uri, host, referer,len,ctocp(cooks),postdat);
    sin.sin_addr.s_addr = inet_addr(vwproxy.c_str());
    sin.sin_port = htons(vwproxport);
  }
  else{
    httprequest = (char*)malloc(strlen(req) + strlen(uri) +strlen(len) + strlen(host) + strlen(referer) +  1 +cooks.length()+strlen(prot)+strlen(postdat) );
    sprintf(httprequest, req,prot, uri, host, referer,len,ctocp(cooks),postdat);
    memcpy(&sin.sin_addr.s_addr, target_ptr->h_addr, target_ptr->h_length);
    sin.sin_port   = htons(port);
  }
//  cout << "httprequest: "<<httprequest<<endl;
    sin.sin_family = AF_INET;

  if ( (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) ) ) {BAD_SOCK(sock);}
  int tot_time=0,temptime,loops=0;
  if ( send(sock, httprequest, strlen(httprequest), 0) == -1 ) {BAD_SOCK(sock);}
  last_size=0;
  //  while(1){
//
//        nret = recv_for(sock,5,data,temptime);
//        tot_time+=temptime;
//        if(nret==-1){
//           if (tot_time>=30000){
//                last_size=0;
//                if(loops==2){
//                    cout << "no good...";
//                    pause();
//                }
//                loops++;
//                if(send(sock,httprequest,strlen(httprequest),0) ==-1){BAD_SOCK(sock);}
//                tot_time=0;
//           }
//        }
//        if(nret==0)break;
//        last_size+=nret;
//        recv_string = (char*)realloc(recv_string, strlen(recv_string) + nret + 1);
//        strncat(recv_string, data, nret);
//
//    }
  recv_string = (char*)malloc(2);
  strcpy(recv_string, "");
  while(1){
            vwtrace();

            vwtrace();
        nret = recv_for(sock,5,data,temptime);
            vwtrace();
        tot_time+=temptime;
            vwtrace();
        if(nret==-1){
            vwtrace();
           if (tot_time>=30000){
            vwtrace();
                last_size=0;
            vwtrace();
                if(loops==2){
            vwtrace();
                    cout << "no good...";
            vwtrace();
                    pause();
            vwtrace();
                }
            vwtrace();
                loops++;
            vwtrace();
                if(send(sock,httprequest,strlen(httprequest),0) ==-1){BAD_SOCK(sock);}
            vwtrace();
                tot_time=0;
            vwtrace();
           }
            vwtrace();
        }
            vwtrace();
        if(nret==0)break;
            vwtrace();
        last_size+=nret;
            vwtrace();
        recv_string = (char*)realloc(recv_string, strlen(recv_string) + nret + 1);
//         cout << strlen(recv_string);
//         cout<<endl <<strlen(data);
//         cout<< endl << nret <<endl;
//
            vwtrace();
        strncat(recv_string, data, nret);
            vwtrace();

            vwtrace();
    }

//  recv_string = (char*)malloc(2);
//  strcpy(recv_string, "");
//  while ( (nret = recv(sock, data, sizeof(data), 0)) > 0 ) {
//    bytes_received += nret;
//    if(superspeed && nret)break;
//    recv_string = (char*)realloc(recv_string, strlen(recv_string) + nret + 1);
//    strncat(recv_string, data, nret);
//  }
  closesocket(sock);
  cursource = recv_string;
  cutheaders();
  WSACleanup();
  free(httprequest);
  free(recv_string);
}
#define Ws_trace(i) ;
// cout << "w "<<i<<" l "<<__LINE__<<"\r";

void valwrapper::ws_dl_request(char * prot,char *host,
        unsigned short port,
        char *uri,
        char *referer,
        char *filename,
        char *postdat)
{
  WSADATA wsaData;
  struct hostent *target_ptr;
  struct sockaddr_in sin;
  SOCKET sock;
  char   req[] = "%s %s HTTP/1.0\r\nHost: %s%s\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: close\r\n%s\r\n\r\n%s";
  char   *httprequest;
  char   *recv_string;
  char   data[3000];
  unsigned long bytes_received;
  unsigned short nret;
  Ws_trace(1);
  if (WSAStartup(MAKEWORD(2,2), &wsaData) < 0) return ;
  if ( (sock = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET ) {BAD_SOCK_DL(sock);}
  if ( (target_ptr = gethostbyname(host)) == NULL) {BAD_SOCK_DL(sock);}
  if(useproxy){
        sin.sin_addr.s_addr = inet_addr(vwproxy.c_str());
        sin.sin_port = htons(vwproxport);
    }
    else{
        memcpy(&sin.sin_addr.s_addr, target_ptr->h_addr, target_ptr->h_length);
        sin.sin_port   = htons(port);
    }
    sin.sin_family = AF_INET;
   Ws_trace(2);
  if ( (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) ) ) {
    BAD_SOCK_DL(sock);
  }
  Ws_trace(3);
  httprequest = (char*)malloc(strlen(req) + strlen(uri) + strlen(host) + strlen(referer) +  1 +cooks.length()+strlen(prot)+strlen(postdat) );
  //char   req[] = "POST %s HTTP/1.0\r\nHost: %s\r\nReferer: %s\r\nContent-Length: %s\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: close\r\n\r\n%s";
  sprintf(httprequest,req,prot, uri, host, referer,ctocp(cooks),postdat);
  Ws_trace(4);
  if ( send(sock, httprequest, strlen(httprequest), 0) == -1 ) {
    BAD_SOCK_DL(sock);
  }
  Ws_trace(5);
  recv_string = (char*)malloc(2);
  strcpy(recv_string, "");
  FILE *fwt;
  fwt = fopen(filename,"wb");
//  fwm = fopen("recv.di","wb");
  int tmp = 0,tmp2=0,tmp3=2;
  Ws_trace(6);
  while ( (nret = recv(sock, data, 3000, 0)) > 0) {
        recv_string = (char*)realloc(recv_string, tmp + nret + 1);
        memcpy(tmp+recv_string,data,nret);
        tmp+= nret;

    }
    Ws_trace(7);
//    fwrite(recv_string,sizeof(recv_string[0]),sizeof(recv_string),fwm);
//
////  cout << datasize: "<<sizeof(recv_string)<<endl;
//    cout << recv_string << endl;
//    char *ndata;
//    ndata = strstr(recv_string,"\r\n\r\n");
//
////  cout << "tmp: "<<tmp<<endl;
////  cout << "Ndata1: "<<ndata<<endl;
//    ndata=4+ndata;
////  cout << "ndata2: "<<ndata<<endl;
//
//    fwrite(ndata,1,sizeof(ndata),fwt);
//    //
    for(int i = 0; i < tmp-5; i++){
        Ws_trace(12);
        if(recv_string[i] == '\r' && recv_string[i+1] == '\n' && recv_string[i+2] == '\r' && recv_string[i+3] == '\n' )
        {
            Ws_trace(10);
            fwrite(recv_string+i+4, 1, tmp-(i+4),fwt);
            Ws_trace(11);
            lastdl_size=tmp-i;
            break;
        }
    }
    Ws_trace(8);
//
//  fwrite(ndata,sizeof(data[0]),sizeof(data)/sizeof(data[0]),fwt);
  fclose(fwt);
//  fclose(fwm);
  closesocket(sock);
  WSACleanup();
  free(httprequest);
  free(recv_string);
  Ws_trace(9);
}


// comonly used Formatting methods:
    string hex(char n){
    switch (n){
        case ' ':
            return "%20";
        break;
        case '!':
            return "%21";
        break;
        case '#':
            return"%23";
        break;
        case '$':
            return"%24";
        break;
        case '%':
            return "%25";
        break;
        case '^':
            return "%5E";
        break;
        case '&':
            return "%26";
        break;
        case '(':
            return "%28";
        break;
        case ')':
            return "%29";
        break;
        case '=':
            return "%3D";
        break;
        case '+':
            return "%2B";
        break;
        case '[':
            return "%5B";
        break;
        case '{':
            return "%7B";
        break;
        case ']':
            return "%5D";
        break;
        case '}':
            return "%7D";
        break;
        case '\\':
            return "%5C";
        break;
        case '|':
            return "%7C";
        break;case ';':
            return "%3B";
        break;case ':':
            return "%3A";
        break;case '\'':
            return "%27";
        break;case '\"':
            return "%22";
        break;case ',':
            return "%2C";
        break;case '<':
            return "%3C";
        break;case '>':
            return "%3E";
        break;case '/':
            return "%2F";
        break;case '?':
            return "%3F";
        break;case '`':
            return "%60";
        break;case '~':
            return "%7E";
        break;
        default:
            string ret = "";
            ret += n;
            return ret;
        break;
    }
}

string ctoposthex(string text){
    string ret;
    for(int i = 0; i < text.length(); i++){
        ret += hex(text[i]);
    }
    return ret;
}


string ctomysql(string what){
    string ret = "";
    for(int i = 0; i < what.length(); i++){
        if( what[i] == '\''){
            ret += "\\\'";
        }
        else if(what[i] == '\n'){
        }
        else ret += what[i];
    }
    return ret;
}

/*  coppied from online...  select method to make a noneblocking socket

void shell(SOCKET s) {
    struct timeval timev;
    char buff[512];
    fd_set rfds1;
    fd_set rfds2;
    timev.tv_sec=30;
    FD_ZERO (&rfds1);
    FD_ZERO (&rfds2);
    timev.tv_usec=0;
    int l = 0;
    FD_ZERO (&rfds1);
    if(select ((int)s, &rfds1, NULL, NULL, &timev)) {
         //    printf("WOOT\n");
             l = recv(s,buff,sizeof(buff),0);
             write(1,buff,l);
         }



    while(1) {

         FD_ZERO (&rfds2);
         FD_SET (s, &rfds1);
         FD_SET (0, &rfds2);

         if (_kbhit()!=0) {
         //    printf("HEPP\n");
             l = read(fileno(stdin),buff,sizeof(buff));
             send(s,buff,l,0);
         }
         Sleep(1);
            //    if (select ((int)stdin, &rfds2, NULL, NULL, &timev)) {
        //;
            //    }
         //printf("(filtered)");
    }
}
*/





#endif