nav-gov-hu / Online-Cash-Register-Logfile

Az online pénztárgép naplóállomány letöltését lehetővé tevő szolgáltatás publikus tárhelye
Other
13 stars 5 forks source link

[Q&A] a kapott file formátuma #34

Closed PongraczIstvan closed 1 year ago

PongraczIstvan commented 1 year ago

A dokumentációban a következő módon szerepel a kapott file-ok formátuma:

"A P7B állományok tömörített formában kerülnek továbbításra, a naplóállományok méretétől függetlenül. A tömörítés ZIP formátumban történik."

A lekérdezett adatok - hexaeditorba betöltve - valóban ZIP állománynak tűnnek, de ha ezeket lementem file-ba, akkor megnyitáskor a következő hibát kapom (több programmal is kipróbáltam):

"Az archívum ismeretlen vagy sérült"

Programkódban - Chilkat dll-t használva - szintén sikertelen a megnyitás:

Mi lehet a gond?

renced42 commented 1 year ago

Kedves @PongraczIstvan

Éppen válaszolni akartam de látom zártad az Issue-t. Mi volt a problémára a megoldás?

PongraczIstvan commented 1 year ago

Kedves @renced42 !

Kedves @PongraczIstvan

Éppen válaszolni akartam de látom zártad az Issue-t. Mi volt a problémára a megoldás?

Sajnos még nem sikerült megoldani ezt a gondot, de eszembe jutott még egy két dolog, amit ki akartam próbálni.

Eddig a Delphi TRest osztályát használtam Api-k lekérdezéshez, de az sajnos nem támogatja - vagy eddig nem jöttem rá hogyan - a bineáris adatokat. Szóval a response üresen jött vissza, mert mindenáron kódolni akart :( Így néznem kellett valami "kütyüt", ami támogatja ezt a lekérdezést. Ezért kezdetem most használni Chilkat.dll-t. Ebben - első ránézésre minden megvan, ami kell ehhez a projecthez (és ki tudja mit hoz az eAFA ;) ). Természetesen mivel most használom először ezt a dll-t, így nincs tapasztalatom, hogy mennyire megbízható.

Ez minden gond nélkül kezeli a multipart válaszokat. A XML-t pontosan visszakapom, így az a feltevésem, hogy a bináris adatrészeket is pontosan megkapom.

Első körben chilkat zip tömörítőjét próbáltam használni, mintha egy zip file-t olvasnék fel, de akkor azt a hibát kapom, amit már először is leírtam. Ha a ZipEntry-be (ez a zip file-on belül egy file-nak fele meg ) próbálom beolvasni szintén hibát kapok :(

Második körben arra gondoltam, hogy kapott adatok kicsomagolásához, használom az online számla esetén már bevált módszert:

function Unzip(const zipped: string): string;
var
  DecompressionStream: TDecompressionStream;
  Compressed: TBytesStream;
  Decompressed: TStringStream;
begin
  // Compressed := TBytesStream.Create(DecodeBase64(AnsiString(zipped)));
  Compressed :=
    TBytesStream.Create(TNetEncoding.Base64.DecodeStringToBytes(AnsiString(zipped)));
  //  TNetEncoding.Base64.DecodeStringToBytes(n.ChildNodes['invoiceData'].Text
  try
    // window bits set to 15 + 16 for gzip
    DecompressionStream := TDecompressionStream.Create(Compressed, 15 + 16);
    try
      Decompressed := TStringStream.Create('', TEncoding.UTF8);
      try
        Decompressed.LoadFromStream(DecompressionStream);
        Result := Decompressed.DataString;
      finally
        Decompressed.Free;
      end;
    finally
      DecompressionStream.Free;
    end;
  finally
    Compressed.Free;
  end;
end;

Természetesen annyi módosítással, hogy itt nem Base64-es adatokat kell feldolgozni:

function Unzip2(const zipped: HCKbyteData): string;
var
  DecompressionStream: TDecompressionStream;
  Compressed: TBytesStream;
    Decompressed: TMemoryStream;
begin

  Compressed := TbytesStream.create();
  Compressed.writeData(CkByteData_getData(zipped),CkByteData_getSize(zipped));

  //Compressed.Position:=0;

  ShowMessage('átadott byte '+inttostr(Compressed.Size));
  try
    // window bits set to 15 + 16 for gzip
    DecompressionStream := TDecompressionStream.Create(Compressed , 31);

    Decompressed:=TMemoryStream.create();
    Decompressed.LoadFromStream(DecompressionStream);
    deCompressed.SaveTofile('c:\delphi_test\test.p7b');

    decompressed.free;

  finally
      DecompressionStream.Free;
    Compressed.Free;
  end;
end;

Itt ugyan nem kapok hibát, de a DecompressionStream-ben csak 0-ák szerepelnek :(

Harmadik lépésben megpróbáltam írni egy teszt progit Nodejs-ben, a beépített zip könyvtárat használva:

const zlib = require('zlib');
const fs = require('fs');

const inputFile = fs.createReadStream('teszt2.zip');
const outputFile = fs.createWriteStream('teszt.p7b');

inputFile.pipe(zlib.createUnzip()).pipe(outputFile);

ekkor a következőt kaptam: errno: -3, code: 'Z_DATA_ERROR'

Ha a Nodejs-sel csinálok egy teszt, zippelt állományt azt vissza tudom olvasni. Igaz a windows ugyanazt a hibát dobja, de winrar szépen felolvassa és ki is csomagolja...

Az eredeti problémára visszatérve, az az érzésem, hogy nem kapom meg a teljes bináris kódot esetleg hibásan. Sajnos az XML-ban csak a file neve szerepel, sem egy crc kód, sem egy byte-hossz nincs ...

Szóval ennyi... itt tartok most ... :( Ha bármi ötleted van azt nagyon szépen megköszönöm!

PongraczIstvan commented 1 year ago

Kedves @renced42 !

Hogy a lehetséges hibákat kiszűrjem letöltöttem a sample könyvtárból a queryCashRegisterFileDataResponse.data és a queryCashRegisterFileDataResponse2.data file-okat. Az ezekben található adatokat minden gond nélkül fel tudtam dolgozni. A generált zip file-okat mind a windows, mind a winrar szépen fel tudta olvasni, tudta kezelni.

Sajnos az általam lekért cég adatainál továbbra is fennáll a kezdeti hiba. :(

erikapapp commented 1 year ago

Kedves @renced42!

Én is a QueryCashRegisterFileDataResponse feldolgozásán dolgozom.

------=_Part_10220_1432721102.1676293389926
Content-Type: application/octet-stream
Content-ID: <f85ddcd9-d08e-4026-926a-0a16c4a0698e@schemas.nav.gov.hu>
Content-Transfer-Encoding: binary

PKL>V)A87654321_12345678_20230130013620_531.p7b\x9dZm\x8c\Wy\xce\xda&4\xb7%\xad@\xa0\x8ed\xacU\xdb\xcc\xee\xf9\xfeX\xaeoz\xee\xf9\xf0\xaewwv\xbd3\xde\xc4[w\xb3;\x8e\x9d]\xe3\xdd8\x8e\x91&\xc4\xaa\xd2B%@rDK+
.....
\xd5\xb7/\xfe\xe9}\xe3o\xbes\xf5\xef^\xa5\x9f\xfb`\xb9\xf2\x83\xd7^\xff\xd1\xbf\xbe"|\xc3\xfd\xd9\xf8\xd2\xd4\xffPK=\xfb\x93\xe3\xf3K%PKL>V=\xfb\x93\xe3\xf3K%)A87654321_12345678_20230130013620_531.p7bPKWJ
------=_Part_10220_1432721102.1676293389926

A leírás alapján "A pénztárgép által beküldött naplóállomány GZIP által tömörített formában." azonban nekem a "PKL>" kezdetű és "PKWJ" végű tartalomra azt írja hogy nem zippelt tartalom.

Gyozke commented 1 year ago

Kedves renced42 és erikapapp!

Én is hasonló problémával küzdök. A választ a curl lementi egy fájlba, de nem sikerül helyesen kivágni belőle a zip állomány részét. Talán nem jól határozzuk meg az állomány elejét vagy a végét?

Köszönöm, Győző

renced42 commented 1 year ago

Kedves @erikapapp @Gyozke @PongraczIstvan

A napló file-ok ZIP-elve vannak a legjobb tudomásom szerint. (Korábban a Speciben valóban GZIP szerepelt helytelenül, de ez javítva lett). A teszt rendszerben nem boldogultok?

PongraczIstvan commented 1 year ago

Kedves @renced42 !

A sample-ben megadott response állományok formátuma nem egyezik meg a most visszakapott formátummal? (Mert akkor korán örültem a félsikernek, amit előzőleg írtam ;) ) Esetleg a teszt rendszerben más algoritmus dolgozik?
Én az élest használom ...

Gyozke commented 1 year ago

A gondom a response.xml-ből történő kivágással van. Melyik pozíciótol kezdődik és hol fejeződik be a zip állomány?

Gyozke commented 1 year ago

Én a hex editor neoval próbálkoztam, és azzal skerült az éles állományból kivágnom a zip fájlt, ami működik.

PongraczIstvan commented 1 year ago

... és mi volt a titok? Nekem sajna még mindig nem megy:( A sample állománnyal tökéletes, a letöltött élessel nem.

Gyozke commented 1 year ago

A hex editor neoval kimásoltam a PK-val kezdődő részt egészen az elválasztó részt jelőlő kötőjelig. A kijelőlés a P-betűvel kezdődik, a vége pedig az első kötőjelet megelőző byte-ig tart. Ezt kimásolva az éles rendszerből kapott válaszból is helyes zip fájl képződik. Más kérdés ennek a kódolása...

Gyozke commented 1 year ago

Hol található specifikációt az AEE xml állományhoz?

PongraczIstvan commented 1 year ago

https://net.jogtar.hu/jogszabaly?docid=a1300048.ngm 4. melléklet

PongraczIstvan commented 1 year ago

... és igen! Sikerült levarázsolni nekem is a zip file-t. A MIME konverter viccelt meg, mert összevissza kódolta a bináris adatokat is :)

A p7b file-ok validálása sikerült valakinek? Nekem azt írja ki, hogy :

Cannot find the signing certificate

renced42 commented 1 year ago

A p7b file-ok validálása sikerült valakinek? Azt nem fogod tudni validálni, mert nincs meg nálad az az infó.

PongraczIstvan commented 1 year ago

Milyen infóra gondolsz? A digitális aláírásnak az a lényege, hogy tartalmazza a hash visszakódolásához szükséges public kódot. Ha ez nincs meg vagy a tanúsítvány kiállítója nem megbízható (azonosítható), akkor az nem aláírás, hisz pont a dolog lényege vész el! Úgy gondolom, hogy ezt a lekérdezést olyanok fogják használni, akik valamely' könyvelő szoftverbe akarják automatikusan betölteni az adatokat, de ha nem lehet hitelesnek elfogadni ...