Página 1 de 1

Ayuda con Envío XML (Problemas)

Publicado: 28 Nov 2012, 00:28
por arkcrew
Hola,

En primer lugar comento un poco.

Tengo que hacer un POST a una dirección enviando un archivo xml.

El XML que envía es el siguiente:

Código: Seleccionar todo

<?xml version="1.0" encoding="utf-8"?>
<GETLICEXP>
<SECTION ID="1000103">
<LICENSEREQUEST>
<NODE NAME="UsernamePassword" VALUE="PKPQPFSKMCQQWHKVKSKAHMBBMKMLMAMIMSMLMIMA" TYPE="STRING" />
<NODE NAME="Product" VALUE="ess" TYPE="STRING" />
<NODE NAME="Version" VALUE="5.2.9.1" TYPE="STRING" />
<NODE NAME="Language" VALUE="0C0A" TYPE="DWORD" />
<NODE NAME="UpdateTag" VALUE="" TYPE="STRING"/><NODE NAME="System" VALUE="5.1" TYPE="STRING"/>
</LICENSEREQUEST>
</SECTION>
</GETLICEXP>
Hace un post a http://exp02.eset.com/getlicexp
Con los siguientes datos: checklic=<?xml version="1.0" encoding="utf-8"?>................

El código que tengo es:

Código: Seleccionar todo

Func xmlPost($xml)
$host = "http://exp02.eset.com/getlicexp"
;$oHTTP = ObjCreate("Microsoft.XMLHTTP")
$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("POST", $host, False)
$oHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
ConsoleWrite($xml)
$oHTTP.Send($xml)
$oReceived = $oHTTP.ResponseText
$oStatusCode = $oHTTP.Status
ConsoleWrite(@Lf & $oStatusCode & @lf &$oReceived)
Endfunc
Ese código se supone debe devolver una fecha, concretamente: 01/01/2013 y el problema está en que dice todo el rato unknownlic. La estructura del XML es perfecta, osea no hay fallos ahi. Supongo que es porque no indico el checklic..

Probé también con este otro objeto

Código: Seleccionar todo

Func xmlPost($xml)
$host = "http://exp02.eset.com/getlicexp"
$oHTTP = ObjCreate("Microsoft.XMLHTTP")
;$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("POST", $host, False)
$oHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
ConsoleWrite("Checklic="&$xml)
$oHTTP.Send($xml)
$oReceived = $oHTTP.ResponseText
$oStatusCode = $oHTTP.Status
ConsoleWrite(@Lf & $oStatusCode & @lf &$oReceived)
Endfunc
Y sigo obteniendo lo mismo y estoy ya que me subo por las paredes.. Echadme un cable anda..

Saludos!

Re: Ayuda con Envío XML (Problemas)

Publicado: 28 Nov 2012, 00:31
por arkcrew
Añado código en C++ funcional con la misma función por si os puede aclarar. Decir que está basado en la libreria WxWidgets

Código: Seleccionar todo

void LicenseChecking::CheckExpirationDate()
{  
        wxString empty = wxT("");
    bool isServerOk = false;        
    wxString lineOfData;  //one line of information from socket
    wxInputStream *httpStream = NULL;    
    wxHTTPBuilder *get = Utils::SockInit( SETTINGS->GetProxySettings() );

    wxString path = SETTINGS->GetExpirationServer();
    //path=wxT("http://exp02.eset.com/getlicexp");

#ifdef LOCALSERVER
    path = wxT("http://localhost/getlicexp");
#endif
   
    get->SetValue(wxT("checklic="),GetValidityXML(),wxHTTPBuilder::wxHTTP_TYPE_POST);  
       
        get->SetHeader(wxT("Content-Type"), wxT("application/x-www-form-urlencoded"));

    httpStream = get->GetInputStream(path);                                   //gets the stream manager  
   
    if ( get->GetResponse() >= 200 && get->GetResponse() < 300
        && httpStream != NULL && get->GetError() == wxPROTO_NOERR
        && get->GetHeader(wxT("Content-Type")).Contains(wxT("xml"))
        )
        isServerOk = true;

        /*
        wxString msg;
        msg.Printf(wxT("%d\n%s - %s\n%s"), get->GetResponse(), m_license->GetUsername(), m_license->GetPassword(),get->GetHeader(wxT("Content-Type")));
        wxMessageBox(msg);*/
    if ( isServerOk == true )
    {



        int c = 0;
        wxTextInputStream in(*httpStream);
       
        int lines2Skip = SETTINGS->GetLines2SkipXml();
        for (c = 0; c < lines2Skip ; c++)
        {
            in.ReadLine();
        }

        wxXmlDocument doc(*httpStream);
 
        if ( !doc.GetRoot() || doc.GetRoot()->GetName().CmpNoCase(wxT("GETLICEXP")) != 0 )
            return;
        if ( !doc.IsOk() )
            return;

       
        wxXmlNode *child = doc.GetRoot()->GetChildren();
       
        bool continueReading = true;

        while ( child && continueReading )
        {
            if (child->GetName().CmpNoCase(wxT("SECTION")) == 0 && child->GetPropVal(wxT("ID"), wxT("")) == wxT("1000103") )
            {
                wxXmlNode *subChild = child->GetChildren();
                while (subChild && continueReading )
                {
                    if (subChild->GetName().CmpNoCase(wxT("LICENSEINFO")) == 0)
                    {
                        wxXmlNode *dataChild = subChild->GetChildren();
                        while (dataChild && continueReading )
                        {
                            if (dataChild->GetName().CmpNoCase(wxT("NODE")) == 0)
                            {
                                if ( dataChild->GetPropVal(wxT("NAME"),wxT("")).CmpNoCase(wxT("ExpirationDate")) == 0 )
                                {
                                    wxString valueDate = dataChild->GetPropVal(wxT("VALUE"),wxT(""));
                                    unsigned long dateInms = Utils::Hex2Dec(valueDate);
                                    m_license->SetExpirationDate(dateInms);
                                    //wxMessageBox(m_license->GetUsername());
                                }
                                else if ( dataChild->GetPropVal(wxT("NAME"),wxT("")).CmpNoCase(wxT("ExpirationState")) == 0 )
                                {
                                    wxString valueState = dataChild->GetPropVal(wxT("VALUE"),wxT(""));
                                    unsigned long state = Utils::Hex2Dec(valueState);
                                    m_license->SetExpirationState(state);

                                    License* newLicense = new License(m_license);
                                    if ( m_checkedLicenses != NULL )
                                    {
                                        AppendLicense2List(newLicense, m_checkedLicenses);
                                    }
                                    if ( state == 0 && m_LicWithNoExpirationOnly == true && m_validLicenses )
                                    {
                                        AppendLicense2List(newLicense, m_validLicenses);
                                    }
                                   
                                    SendExtraEvent(3,newLicense);

                                    continueReading = false;
                                }                                
                            }
                            dataChild = dataChild->GetNext();
                        }
                    }
                    subChild = subChild->GetNext();
                }
            }
            child = child->GetNext();
        }

        /*
        wxTextInputStream in(*httpStream);
        while (!httpStream->Eof() && !TestDestroy())
        {
            lineOfData = in.ReadLine();
            lineOfData.Trim(true);
            lineOfData.Trim(false);
           
            if ( lineOfData.Matches(wxT("*<NODE NAME=\"ExpirationDate\" VALUE=\"*\" TYPE=\"DWORD\"*")) )
            {//checks for the node: <NODE NAME="ExpirationDate" VALUE="XXXXX" TYPE="DWORD" />
             // XXXXX is a hexadecimal number wich represents the expiration date in milliseconds
                wxString valueDate = GetValueTagFromXml(lineOfData);
                unsigned long dateInms;
                dateInms = Utils::Hex2Dec(valueDate);
                m_license->SetExpirationDate(dateInms);
               
                //wxMessageBox(valueDate);
                SendExtraEvent(3,m_license);
            }                
            else if ( lineOfData.Matches(wxT("*<NODE NAME=\"ExpirationState\" VALUE=\"*\" TYPE=\"DWORD\"*")) )
            {//checks for the node: <NODE NAME="ExpirationState" VALUE="X" TYPE="DWORD" />
             //the X is a number which can be:
             // 0: License is Ok      1: License is near of expire     2: License is expired                    
                wxString valueState = GetValueTagFromXml(lineOfData);
                unsigned long state = Utils::Hex2Dec(valueState);
                m_license->SetExpirationState(state);

                License* newLicense = NULL;
                if ( m_checkedLicenses != NULL )
                {
                    newLicense = new License(m_license);
                    AppendLicense2List(newLicense, m_checkedLicenses);
       
                }
                if ( state == 0 )
                {
                    if ( m_LicWithNoExpirationOnly == true && m_validLicenses != NULL )
                    {
                        if ( !newLicense )
                            newLicense = new License(m_license);
                        AppendLicense2List(newLicense, m_validLicenses);
                    }
                }

                break;
            }
        }
        */
    }
    if ( get != NULL )
    {
        get->Stop();
        get->Close();
    }
    wxDELETE(httpStream);
}

Re: Ayuda con Envío XML (Problemas)

Publicado: 29 Nov 2012, 20:01
por arkcrew
Buenas,

He programado esto mismo en JAVA y sigue devolviendome lo mismo, el caso es que con C++ funciona..

Adjunto código java:

Código: Seleccionar todo

import java.io.BufferedReader;
import java.io.IOException;
import java.io.Writer;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class Comprobar {
   public static void main(String[] args)
     throws MalformedURLException, IOException {
      URL url = new URL("http://exp01.eset.com/getlicexp");
      URLConnection con = url.openConnection();
	    con.setRequestProperty("content-type", "application/x-www-form-urlencoded");
		con.setUseCaches(false);
		con.setDoOutput(true); 
		Writer write = new OutputStreamWriter(con.getOutputStream());
      try {
        write.append("<?xml version='1.0' encoding='utf-8'?><GETLICEXP><SECTION ID='1000103'><LICENSEREQUEST><NODE NAME='UsernamePassword' VALUE='PKPQPFSKMCQQWHKVKSKAHMBBMKMLMAMIMSMLMIMA' TYPE='STRING' /><NODE NAME='Product' VALUE='ess' TYPE='STRING' /><NODE NAME='Version' VALUE='5.2.9.1' TYPE='STRING' /><NODE NAME='Language' VALUE='0C0A' TYPE='DWORD' /><NODE NAME='UpdateTag' VALUE='' TYPE='STRING'/><NODE NAME='System' VALUE='5.1' TYPE='STRING'/></LICENSEREQUEST></SECTION></GETLICEXP> ");
      }
      finally {
        write.close();
      }
      BufferedReader in = new BufferedReader(
         new InputStreamReader(con.getInputStream()));
      String linea;
      while ((linea = in.readLine()) != null) {
         System.out.println(linea + linea.getBytes());
      }
   }
}
Alguna idea?

Re: Ayuda con Envío XML (Problemas)

Publicado: 30 Nov 2012, 16:41
por Chefito
Parece que lo que has hecho en AutoIt está bien.
Lo que no veo tan claro es si fallas en los datos xml, o en otra cosa.
Es mosqueante el tema del checklic=.
Yo lo que haría sería pillarme un sniffer http y empezaría a ver los datos que envía el código que funciona, incluyendo los cabezales, no sea que falles en algo.

Saludos.

Re: Ayuda con Envío XML (Problemas)

Publicado: 30 Nov 2012, 16:45
por arkcrew
JAJAJJAJAJAJAJ

La idea del Sniffer fué la primera en la que pensé,pero no ves datos ya que salen encriptados, sólo puedo apoyarme en ese código c++ ya que es funcional, aunque los posteados mios en autoit y java deberían funcionar tambien..

Estoy que no se que hacer la verdad..

Creo que la clave está aqui: get->SetValue(wxT("checklic="),GetValidityXML(),wxHTTPBuilder::wxHTTP_TYPE_POST); que es en C++
esta función: GetValidityXML() retorna el xml.

Sería añadir esto al script, pero no se como..

Saludos!

Re: Ayuda con Envío XML (Problemas)

Publicado: 30 Nov 2012, 17:48
por chekok
arkcrew echale un vistazo a esto: http://es.wikipedia.org/wiki/Validaci%C3%B3n_XML. Puede que te de una idea para crear una función de validación del XML.

Yo creo que esa función está declarada en el código del servidor al que intentas enviar los datos, como ocurre con los WebServices con SOAP.

Puedes verificar el esquema de ficheros XML desde esta dirección: http://www.stg.brown.edu/cgi-bin/xmlvalid/xmlvalid.pl. De todas maneras he probado tu XML y la validación devuelve como resultado que está todo OK.

Re: Ayuda con Envío XML (Problemas)

Publicado: 30 Nov 2012, 18:24
por chekok
Has tenido en cuenta que el servidor no te va devolver la fecha si el UsernamePassword que envías ya no existe en su base de datos?

<NODE NAME="UsernamePassword" VALUE="PKPQPFSKMCQQWHKVKSKAHMBBMKMLMAMIMSMLMIMA"

Puede que tengas todo bien y el único problema sea que el valor que envías ya no exista o esté bloqueado y de ahí que te devuelva " unknownlic." que es la abreviatura de "Licencia desconocida" en inglés.

Por poder, puede ser, no? o que simplemente hayan cambiado el algoritmo de codificación de los datos y los mismos ya no correspondan.

Re: Ayuda con Envío XML (Problemas)

Publicado: 30 Nov 2012, 20:09
por arkcrew
Pero vamos a ver,

La encriptación es correcta porque yo mismo la he comprobado con el OllyDBG, además, me han dicho que con muchas licencias pasa, pero, he comprobado y mi código con esa licencia es el único que no funciona,ese de c++ si devuelve una fecha..

saludos!

Re: Ayuda con Envío XML (Problemas)

Publicado: 02 Dic 2012, 20:53
por arkcrew
Chicos, encontré el problema,

Es una GILIPOLLEZ muy grande, fijaos que el código es funcional PEEEERO, si generais el xml con una función que uso:

Código: Seleccionar todo

$oHTTP.Send("<?xml version='1.0' encoding='utf-8'?><GETLICEXP><SECTION ID='1000103'><LICENSEREQUEST><NODE NAME='UsernamePassword' VALUE="&Encode2validate($username,$password)&" TYPE='STRING' /><NODE NAME='Product' VALUE='ess' TYPE='STRING' /><NODE NAME='Version' VALUE='5.2.9.1' TYPE='STRING' /><NODE NAME='Language' VALUE='0C0A' TYPE='DWORD' /><NODE NAME='UpdateTag' VALUE='' TYPE='STRING'/><NODE NAME='System' VALUE='5.1' TYPE='STRING'/></LICENSEREQUEST></SECTION></GETLICEXP>")
FALLA,

PERO, si en vez de poner el <NODE NAME='UsernamePassword' VALUE='"&Encode2validate($username,$password)&"' TYPE='STRING' /> pongo
<NODE NAME='UsernamePassword' VALUE='PKPQPFSKMCQQWHKVKSKAHMBFMKMLMAMDMSMLMDMA' TYPE='STRING' />

Que viene a ser lo mismo, pero sin el tema de de insertar eso en el xml (la funcion) devuelve perfectamente un resultado..

Alguna idea??

Re: Ayuda con Envío XML (Problemas)

Publicado: 02 Dic 2012, 21:22
por arkcrew
Señores, no penseis más!

ESTO YA FUNCIONAAA!

Aqui os dejo un result,

<?xml version="1.0"?>
<GETLICEXP>
<SECTION ID="1000103">
<LICENSEINFO>
<NODE NAME="ExpirationDate" VALUE="50e2cfc0" TYPE="DWORD"/>
<NODE NAME="ExpirationState" VALUE="0" TYPE="DWORD"/>
<NODE NAME="ExpirationNotifyDays" VALUE="e" TYPE="DWORD"/>
<NODE NAME="DistributorGUID" VALUE="33" TYPE="STRING"/>
<NODE NAME="LicenseType" VALUE="4" TYPE="DWORD"/>
<NODE NAME="LicenseCategory" VALUE="3" TYPE="DWORD"/>
<NODE NAME="LicenseCancelledFlag" VALUE="0" TYPE="DWORD"/>
<NODE NAME="PasswordChangedFlag" VALUE="0" TYPE="DWORD"/>
<NODE NAME="InfoMessage" VALUE="" TYPE="STRING"/>
<NODE NAME="LinkUrl" VALUE="" TYPE="STRING"/>
<NODE NAME="IsEvalVersion" VALUE="0" TYPE="DWORD"/>
</LICENSEINFO>
</SECTION>
</GETLICEXP>

Saludos y gracias!

Re: Ayuda con Envío XML (Problemas)

Publicado: 03 Dic 2012, 10:13
por Chefito
Ya sabía yo que el problema debía de estar en los datos enviados. Pero yo envía los datos que tu nos proporcionabas y me daba el error. Sería por cosa del usuario y de la clave que no serían válidas.
arkcrew escribió:Chicos, encontré el problema,

Es una GILIPOLLEZ muy grande, fijaos que el código es funcional PEEEERO, si generais el xml con una función que uso:

Código: Seleccionar todo

$oHTTP.Send("<?xml version='1.0' encoding='utf-8'?><GETLICEXP><SECTION ID='1000103'><LICENSEREQUEST><NODE NAME='UsernamePassword' VALUE="&Encode2validate($username,$password)&" TYPE='STRING' /><NODE NAME='Product' VALUE='ess' TYPE='STRING' /><NODE NAME='Version' VALUE='5.2.9.1' TYPE='STRING' /><NODE NAME='Language' VALUE='0C0A' TYPE='DWORD' /><NODE NAME='UpdateTag' VALUE='' TYPE='STRING'/><NODE NAME='System' VALUE='5.1' TYPE='STRING'/></LICENSEREQUEST></SECTION></GETLICEXP>")
FALLA,

PERO, si en vez de poner el <NODE NAME='UsernamePassword' VALUE='"&Encode2validate($username,$password)&"' TYPE='STRING' /> pongo
<NODE NAME='UsernamePassword' VALUE='PKPQPFSKMCQQWHKVKSKAHMBFMKMLMAMDMSMLMDMA' TYPE='STRING' />

Que viene a ser lo mismo, pero sin el tema de de insertar eso en el xml (la funcion) devuelve perfectamente un resultado..

Alguna idea??
¿Por que no te iba el código con la función? Veo que puede ser por dos cosas.
En el código que pones te faltan las comillas simples que rodean al resultado de la función:
.....VALUE= '"&Encode2validate($username,$password)&"' TYPE='STRING' /><.......
En cambio en el ejemplo que pones más abajo las pones. Pero como lo que ejecutarás es el código, supongo que ahí estaba el fallo.

Y la otra cosa por la que puede fallar es lo típico, que la función te devuelva un mal resultado :smt004 .

Me alegro que lo hayas solucionado.

Saludos.