Ayuda con Envío XML (Problemas)

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Ayuda con Envío XML (Problemas)

Mensaje 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!
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Ayuda con Envío XML (Problemas)

Mensaje 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);
}
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Ayuda con Envío XML (Problemas)

Mensaje 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?
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Ayuda con Envío XML (Problemas)

Mensaje 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.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Ayuda con Envío XML (Problemas)

Mensaje 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!
Avatar de Usuario
chekok
Hacker del Foro
Mensajes: 111
Registrado: 16 Sep 2011, 11:50
Ubicación: Valencia / España
Contactar:

Re: Ayuda con Envío XML (Problemas)

Mensaje 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.
La vida es larga y dura.
Avatar de Usuario
chekok
Hacker del Foro
Mensajes: 111
Registrado: 16 Sep 2011, 11:50
Ubicación: Valencia / España
Contactar:

Re: Ayuda con Envío XML (Problemas)

Mensaje 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.
La vida es larga y dura.
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Ayuda con Envío XML (Problemas)

Mensaje 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!
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Ayuda con Envío XML (Problemas)

Mensaje 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??
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Ayuda con Envío XML (Problemas)

Mensaje 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!
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Ayuda con Envío XML (Problemas)

Mensaje 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.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Responder