Advertisement
Guest User

Untitled

a guest
Jan 20th, 2017
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.05 KB | None | 0 0
  1. <?php
  2.  
  3. function check_obsidian_project($bytes) {
  4. $HEADERS_LENGTH = 51;
  5. $MIN_SECTION_SIZE = 2;
  6.  
  7. if (strlen($bytes) <= $HEADERS_LENGTH) {
  8. return false;
  9. }
  10.  
  11. $unpackString = "a4magic/nversion/A10type";
  12. $unpackString .= "/CmetadataFormat/NmetadataOffset/NmetadataLength";
  13. $unpackString .= "/CprojectFormat/NprojectOffset/NprojectLength";
  14. $unpackString .= "/CblobIndexFormat/NblobIndexOffset/NblobIndexLength";
  15. $unpackString .= "/NblobsOffset/NblobsLength";
  16. $data = unpack($unpackString, $bytes);
  17.  
  18. // magic
  19. if ($data["magic"] != "WPRJ") {
  20. return false;
  21. }
  22.  
  23. // metadata*
  24. if ($data["metadataFormat"] != 0 && $data["metadataFormat"] != 1) {
  25. return false;
  26. }
  27. if ($data["metadataOffset"] != $HEADERS_LENGTH) {
  28. return false;
  29. }
  30. if ($data["metadataLength"] < $MIN_SECTION_SIZE) {
  31. return false;
  32. }
  33.  
  34. // project*
  35. if ($data["projectFormat"] != 0 && $data["projectFormat"] != 1) {
  36. return false;
  37. }
  38. if ($data["projectOffset"] != $data["metadataOffset"] + $data["metadataLength"]) {
  39. return false;
  40. }
  41. if ($data["projectLength"] < $MIN_SECTION_SIZE) {
  42. return false;
  43. }
  44.  
  45. // blobIndex*
  46. if ($data["blobIndexFormat"] != 0 && $data["blobIndexFormat"] != 1) {
  47. return false;
  48. }
  49. if ($data["blobIndexOffset"] != $data["projectOffset"] + $data["projectLength"]) {
  50. return false;
  51. }
  52. if ($data["blobIndexLength"] < $MIN_SECTION_SIZE) {
  53. return false;
  54. }
  55.  
  56. // blobs*
  57. if ($data["blobsOffset"] != $data["blobIndexOffset"] + $data["blobIndexLength"]) {
  58. return false;
  59. }
  60.  
  61. // Check that the file size is coherent
  62. if (strlen($bytes) != $HEADERS_LENGTH + $data["metadataLength"] + $data["projectLength"] + $data["blobIndexLength"] + $data["blobsLength"]) {
  63. return false;
  64. }
  65.  
  66. return true;
  67. }
  68.  
  69. function check_obsidian_project_from_file($path) {
  70. $handle = fopen($path, "rb");
  71. $fsize = filesize($path);
  72. $bytes = fread($handle, $fsize);
  73. return check_obsidian_project($bytes);
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement