changeset 4500:3b4940bca158

added safeguards in Orthanc::FileInfo
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 09 Feb 2021 14:49:30 +0100
parents 6f99949b2878
children 11c2ddb4e2ca
files OrthancFramework/Resources/CMake/OrthancFrameworkConfiguration.cmake OrthancFramework/Sources/FileStorage/FileInfo.cpp OrthancFramework/Sources/FileStorage/FileInfo.h OrthancServer/Sources/ServerContext.cpp
diffstat 4 files changed, 195 insertions(+), 62 deletions(-) [+]
line wrap: on
line diff
--- a/OrthancFramework/Resources/CMake/OrthancFrameworkConfiguration.cmake	Tue Feb 09 14:25:21 2021 +0100
+++ b/OrthancFramework/Resources/CMake/OrthancFrameworkConfiguration.cmake	Tue Feb 09 14:49:30 2021 +0100
@@ -152,6 +152,7 @@
   ${CMAKE_CURRENT_LIST_DIR}/../../Sources/DicomFormat/DicomTag.cpp
   ${CMAKE_CURRENT_LIST_DIR}/../../Sources/EnumerationDictionary.h
   ${CMAKE_CURRENT_LIST_DIR}/../../Sources/Enumerations.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/../../Sources/FileStorage/FileInfo.cpp
   ${CMAKE_CURRENT_LIST_DIR}/../../Sources/FileStorage/MemoryStorageArea.cpp
   ${CMAKE_CURRENT_LIST_DIR}/../../Sources/HttpServer/HttpContentNegociation.cpp
   ${CMAKE_CURRENT_LIST_DIR}/../../Sources/HttpServer/HttpToolbox.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OrthancFramework/Sources/FileStorage/FileInfo.cpp	Tue Feb 09 14:49:30 2021 +0100
@@ -0,0 +1,160 @@
+/**
+ * Orthanc - A Lightweight, RESTful DICOM Store
+ * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
+ * Department, University Hospital of Liege, Belgium
+ * Copyright (C) 2017-2021 Osimis S.A., Belgium
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ **/
+
+
+#include "../PrecompiledHeaders.h"
+#include "FileInfo.h"
+
+#include "../OrthancException.h"
+
+namespace Orthanc
+{
+  FileInfo::FileInfo(const std::string& uuid,
+                     FileContentType contentType,
+                     uint64_t size,
+                     const std::string& md5) :
+    valid_(true),
+    uuid_(uuid),
+    contentType_(contentType),
+    uncompressedSize_(size),
+    uncompressedMD5_(md5),
+    compressionType_(CompressionType_None),
+    compressedSize_(size),
+    compressedMD5_(md5)
+  {
+  }
+
+
+  FileInfo::FileInfo(const std::string& uuid,
+                     FileContentType contentType,
+                     uint64_t uncompressedSize,
+                     const std::string& uncompressedMD5,
+                     CompressionType compressionType,
+                     uint64_t compressedSize,
+                     const std::string& compressedMD5) :
+    valid_(true),
+    uuid_(uuid),
+    contentType_(contentType),
+    uncompressedSize_(uncompressedSize),
+    uncompressedMD5_(uncompressedMD5),
+    compressionType_(compressionType),
+    compressedSize_(compressedSize),
+    compressedMD5_(compressedMD5)
+  {
+  }
+
+  
+  bool FileInfo::IsValid() const
+  {
+    return valid_;
+  }
+
+  
+  const std::string& FileInfo::GetUuid() const
+  {
+    if (valid_)
+    {
+      return uuid_;
+    }
+    else
+    {
+      throw OrthancException(ErrorCode_BadSequenceOfCalls);
+    }
+  }
+
+  
+  FileContentType FileInfo::GetContentType() const
+  {
+    if (valid_)
+    {
+      return contentType_;
+    }
+    else
+    {
+      throw OrthancException(ErrorCode_BadSequenceOfCalls);
+    }
+  }
+  
+
+  uint64_t FileInfo::GetUncompressedSize() const
+  {
+    if (valid_)
+    {
+      return uncompressedSize_;
+    }
+    else
+    {
+      throw OrthancException(ErrorCode_BadSequenceOfCalls);
+    }
+  }
+  
+
+  CompressionType FileInfo::GetCompressionType() const
+  {
+    if (valid_)
+    {
+      return compressionType_;
+    }
+    else
+    {
+      throw OrthancException(ErrorCode_BadSequenceOfCalls);
+    }
+  }
+  
+
+  uint64_t FileInfo::GetCompressedSize() const
+  {
+    if (valid_)
+    {
+      return compressedSize_;
+    }
+    else
+    {
+      throw OrthancException(ErrorCode_BadSequenceOfCalls);
+    }
+  }
+
+  
+  const std::string& FileInfo::GetCompressedMD5() const
+  {
+    if (valid_)
+    {
+      return compressedMD5_;
+    }
+    else
+    {
+      throw OrthancException(ErrorCode_BadSequenceOfCalls);
+    }
+  }
+
+  
+  const std::string& FileInfo::GetUncompressedMD5() const
+  {
+    if (valid_)
+    {
+      return uncompressedMD5_;
+    }
+    else
+    {
+      throw OrthancException(ErrorCode_BadSequenceOfCalls);
+    }
+  }
+}
--- a/OrthancFramework/Sources/FileStorage/FileInfo.h	Tue Feb 09 14:25:21 2021 +0100
+++ b/OrthancFramework/Sources/FileStorage/FileInfo.h	Tue Feb 09 14:49:30 2021 +0100
@@ -31,18 +31,18 @@
   struct FileInfo
   {
   private:
-    std::string uuid_;
-    FileContentType contentType_;
-
-    uint64_t uncompressedSize_;
-    std::string uncompressedMD5_;
-
-    CompressionType compressionType_;
-    uint64_t compressedSize_;
-    std::string compressedMD5_;
+    bool             valid_;
+    std::string      uuid_;
+    FileContentType  contentType_;
+    uint64_t         uncompressedSize_;
+    std::string      uncompressedMD5_;
+    CompressionType  compressionType_;
+    uint64_t         compressedSize_;
+    std::string      compressedMD5_;
 
   public:
-    FileInfo()
+    FileInfo() :
+      valid_(false)
     {
     }
 
@@ -52,16 +52,7 @@
     FileInfo(const std::string& uuid,
              FileContentType contentType,
              uint64_t size,
-             const std::string& md5) :
-      uuid_(uuid),
-      contentType_(contentType),
-      uncompressedSize_(size),
-      uncompressedMD5_(md5),
-      compressionType_(CompressionType_None),
-      compressedSize_(size),
-      compressedMD5_(md5)
-    {
-    }
+             const std::string& md5);
 
     /**
      * Constructor for a compressed attachment.
@@ -72,50 +63,22 @@
              const std::string& uncompressedMD5,
              CompressionType compressionType,
              uint64_t compressedSize,
-             const std::string& compressedMD5) :
-      uuid_(uuid),
-      contentType_(contentType),
-      uncompressedSize_(uncompressedSize),
-      uncompressedMD5_(uncompressedMD5),
-      compressionType_(compressionType),
-      compressedSize_(compressedSize),
-      compressedMD5_(compressedMD5)
-    {
-    }
+             const std::string& compressedMD5);
 
-    const std::string& GetUuid() const
-    {
-      return uuid_;
-    }
+    bool IsValid() const;
+    
+    const std::string& GetUuid() const;
 
-    FileContentType GetContentType() const
-    {
-      return contentType_;
-    }
+    FileContentType GetContentType() const;
 
-    uint64_t GetUncompressedSize() const
-    {
-      return uncompressedSize_;
-    }
+    uint64_t GetUncompressedSize() const;
 
-    CompressionType GetCompressionType() const
-    {
-      return compressionType_;
-    }
+    CompressionType GetCompressionType() const;
 
-    uint64_t GetCompressedSize() const
-    {
-      return compressedSize_;
-    }
+    uint64_t GetCompressedSize() const;
 
-    const std::string& GetCompressedMD5() const
-    {
-      return compressedMD5_;
-    }
+    const std::string& GetCompressedMD5() const;
 
-    const std::string& GetUncompressedMD5() const
-    {
-      return uncompressedMD5_;
-    }
+    const std::string& GetUncompressedMD5() const;
   };
 }
--- a/OrthancServer/Sources/ServerContext.cpp	Tue Feb 09 14:25:21 2021 +0100
+++ b/OrthancServer/Sources/ServerContext.cpp	Tue Feb 09 14:49:30 2021 +0100
@@ -571,12 +571,17 @@
 
       FileInfo dicomInfo = accessor.Write(dicom.GetBufferData(), dicom.GetBufferSize(), 
                                           FileContentType_Dicom, compression, storeMD5_);
-      FileInfo jsonInfo = accessor.Write(dicom.GetJson().toStyledString(), 
-                                         FileContentType_DicomAsJson, compression, storeMD5_);
 
       ServerIndex::Attachments attachments;
       attachments.push_back(dicomInfo);
-      attachments.push_back(jsonInfo);
+
+      FileInfo jsonInfo;
+      if (true /* TODO - !area_.HasReadRange() || !hasPixelDataOffset */)
+      {
+        jsonInfo = accessor.Write(dicom.GetJson().toStyledString(), 
+                                  FileContentType_DicomAsJson, compression, storeMD5_);
+        attachments.push_back(jsonInfo);
+      }
 
       typedef std::map<MetadataType, std::string>  InstanceMetadata;
       InstanceMetadata  instanceMetadata;
@@ -596,7 +601,11 @@
       if (status != StoreStatus_Success)
       {
         accessor.Remove(dicomInfo);
-        accessor.Remove(jsonInfo);
+
+        if (jsonInfo.IsValid())
+        {
+          accessor.Remove(jsonInfo);
+        }
       }
 
       switch (status)