Mercurial > hg > orthanc
diff OrthancServer/Sources/main.cpp @ 4899:3ab57510f6dd proto-filter-instance-returning-error-code
integration mainline->proto-filter-instance-returning-error-code
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Sun, 20 Feb 2022 12:59:30 +0100 |
parents | 656784ac6759 6eff25f70121 |
children |
line wrap: on
line diff
--- a/OrthancServer/Sources/main.cpp Wed Sep 29 10:32:23 2021 +0200 +++ b/OrthancServer/Sources/main.cpp Sun Feb 20 12:59:30 2022 +0100 @@ -2,24 +2,13 @@ * 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 + * Copyright (C) 2017-2022 Osimis S.A., Belgium + * Copyright (C) 2021-2022 Sebastien Jodogne, ICTEAM UCLouvain, Belgium * * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. - * - * In addition, as a special exception, the copyright holders of this - * program give permission to link the code of its release with the - * OpenSSL project's "OpenSSL" library (or with modified versions of it - * that use the same license as the "OpenSSL" library), and distribute - * the linked executables. You must obey the GNU General Public License - * in all respects for all of the code used other than "OpenSSL". If you - * modify file(s) with this exception, you may extend this exception to - * your version of the file(s), but you are not obligated to do so. If - * you do not wish to do so, delete this exception statement from your - * version. If you delete this exception statement from all source files - * in the program, then also delete it here. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of @@ -84,10 +73,10 @@ } - virtual int Handle(DcmDataset& dicom, - const std::string& remoteIp, - const std::string& remoteAet, - const std::string& calledAet) ORTHANC_OVERRIDE + virtual uint16_t Handle(DcmDataset& dicom, + const std::string& remoteIp, + const std::string& remoteAet, + const std::string& calledAet) ORTHANC_OVERRIDE { std::unique_ptr<DicomInstanceToStore> toStore(DicomInstanceToStore::CreateFromDcmDataset(dicom)); @@ -97,15 +86,19 @@ (remoteIp.c_str(), remoteAet.c_str(), calledAet.c_str())); std::string id; - StoreStatus res = context_.Store(id, *toStore, StoreInstanceMode_Default); - if (res == StoreStatus_FilteredOut) + ServerContext::StoreResult result = context_.Store(id, *toStore, StoreInstanceMode_Default); + + if (result.GetStatus() == StoreStatus_FilteredOut) { - return 0xA700; // C-Store "Out of Resources" error code + return STATUS_STORE_Refused_OutOfResources; // C-Store "Out of Resources" error code (0xa700) } - return 0x0000; + else + { + return result.GetCStoreStatusCode(); + } } - return 0xC000; // C-Store "Cannot understand" error code + return STATUS_STORE_Error_CannotUnderstand; // C-Store "Cannot understand" error code (0xc000) } }; @@ -285,6 +278,7 @@ ServerContext& context_; bool alwaysAllowEcho_; bool alwaysAllowFind_; // New in Orthanc 1.9.0 + bool alwaysAllowFindWorklist_; // New in Orthanc 1.10.0 bool alwaysAllowGet_; // New in Orthanc 1.9.0 bool alwaysAllowMove_; // New in Orthanc 1.9.7 bool alwaysAllowStore_; @@ -297,6 +291,7 @@ OrthancConfiguration::ReaderLock lock; alwaysAllowEcho_ = lock.GetConfiguration().GetBooleanParameter("DicomAlwaysAllowEcho", true); alwaysAllowFind_ = lock.GetConfiguration().GetBooleanParameter("DicomAlwaysAllowFind", false); + alwaysAllowFindWorklist_ = lock.GetConfiguration().GetBooleanParameter("DicomAlwaysAllowFindWorklist", false); alwaysAllowGet_ = lock.GetConfiguration().GetBooleanParameter("DicomAlwaysAllowGet", false); alwaysAllowMove_ = lock.GetConfiguration().GetBooleanParameter("DicomAlwaysAllowMove", false); alwaysAllowStore_ = lock.GetConfiguration().GetBooleanParameter("DicomAlwaysAllowStore", true); @@ -307,6 +302,11 @@ LOG(WARNING) << "Security risk in DICOM SCP: C-FIND requests are always allowed, even from unknown modalities"; } + if (alwaysAllowFindWorklist_) + { + LOG(WARNING) << "Security risk in DICOM SCP: C-FIND requests for worklists are always allowed, even from unknown modalities"; + } + if (alwaysAllowGet_) { LOG(WARNING) << "Security risk in DICOM SCP: C-GET requests are always allowed, even from unknown modalities"; @@ -327,6 +327,7 @@ if (alwaysAllowEcho_ || alwaysAllowFind_ || + alwaysAllowFindWorklist_ || alwaysAllowGet_ || alwaysAllowMove_ || alwaysAllowStore_) @@ -344,7 +345,7 @@ const std::string& remoteAet, DicomRequestType type) { - LOG(WARNING) << "Unable to check DICOM authorization for AET " << remoteAet + LOG(WARNING) << "DICOM authorization rejected for AET " << remoteAet << " on IP " << remoteIp << ": The DICOM command " << EnumerationToString(type) << " is not allowed for this modality " << "according to configuration option \"DicomModalities\""; @@ -371,6 +372,12 @@ // Incoming C-Find requests are always accepted, even from unknown AET return true; } + else if (type == DicomRequestType_FindWorklist && + alwaysAllowFindWorklist_) + { + // Incoming C-Find requests for worklists are always accepted, even from unknown AET + return true; + } else if (type == DicomRequestType_Store && alwaysAllowStore_) { @@ -402,7 +409,7 @@ if (modalities.empty()) { - LOG(WARNING) << "Unable to check DICOM authorization for AET " << remoteAet + LOG(WARNING) << "DICOM authorization rejected for AET " << remoteAet << " on IP " << remoteIp << ": This AET is not listed in " << "configuration option \"DicomModalities\""; return false; @@ -413,7 +420,7 @@ if (checkIp && remoteIp != modalities.front().GetHost()) { - LOG(WARNING) << "Unable to check DICOM authorization for AET " << remoteAet + LOG(WARNING) << "DICOM authorization rejected for AET " << remoteAet << " on IP " << remoteIp << ": Its IP address should be " << modalities.front().GetHost() << " according to configuration option \"DicomModalities\""; @@ -449,7 +456,7 @@ } } - LOG(WARNING) << "Unable to check DICOM authorization for AET " << remoteAet + LOG(WARNING) << "DICOM authorization rejected for AET " << remoteAet << " on IP " << remoteIp << ": " << modalities.size() << " modalites found with this AET in configuration option " << "\"DicomModalities\", but none of them matches the IP"; @@ -718,8 +725,9 @@ std::cout << path << " " << ORTHANC_VERSION << std::endl << "Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics Department, University Hospital of Liege (Belgium)" << std::endl - << "Copyright (C) 2017-2021 Osimis S.A. (Belgium)" << std::endl - << "Licensing GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>, with OpenSSL exception." << std::endl + << "Copyright (C) 2017-2022 Osimis S.A. (Belgium)" << std::endl + << "Copyright (C) 2021-2022 Sebastien Jodogne, ICTEAM UCLouvain (Belgium)" << std::endl + << "Licensing GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>." << std::endl << "This is free software: you are free to change and redistribute it." << std::endl << "There is NO WARRANTY, to the extent permitted by law." << std::endl << std::endl @@ -1217,6 +1225,7 @@ dicomServer.SetCalledApplicationEntityTitleCheck(lock.GetConfiguration().GetBooleanParameter("DicomCheckCalledAet", false)); dicomServer.SetAssociationTimeout(lock.GetConfiguration().GetUnsignedIntegerParameter("DicomScpTimeout", 30)); dicomServer.SetPortNumber(lock.GetConfiguration().GetUnsignedIntegerParameter("DicomPort", 4242)); + dicomServer.SetThreadsCount(lock.GetConfiguration().GetUnsignedIntegerParameter("DicomThreadsCount", 4)); dicomServer.SetApplicationEntityTitle(lock.GetConfiguration().GetOrthancAET()); // Configuration of DICOM TLS for Orthanc SCP (since Orthanc 1.9.0) @@ -1528,6 +1537,16 @@ { context.GetIndex().SetMaximumStorageSize(0); } + + try + { + uint64_t size = lock.GetConfiguration().GetUnsignedIntegerParameter("MaximumStorageCacheSize", 128); + context.SetMaximumStorageCacheSize(size * 1024 * 1024); + } + catch (...) + { + context.SetMaximumStorageCacheSize(128); + } } {