mirror of
https://github.com/overte-org/overte.git
synced 2025-04-21 09:44:21 +02:00
Merge pull request #5773 from birarda/master
fail asset request if hash does not match
This commit is contained in:
commit
9ab603e9a5
8 changed files with 71 additions and 36 deletions
|
@ -111,26 +111,29 @@ get_filename_component(QT_DIR "${QT_CMAKE_PREFIX_PATH}/../../" ABSOLUTE)
|
|||
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${QT_CMAKE_PREFIX_PATH})
|
||||
|
||||
if (APPLE)
|
||||
|
||||
SET(OSX_SDK "10.9" CACHE String "OS X SDK version to look for inside Xcode bundle or at OSX_SDK_PATH")
|
||||
|
||||
# set our OS X deployment target
|
||||
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.8)
|
||||
|
||||
# find the 10.9 SDK path
|
||||
# find the SDK path for the desired SDK
|
||||
find_path(
|
||||
_OSX_DESIRED_SDK_PATH
|
||||
NAME MacOSX10.9.sdk
|
||||
NAME MacOSX${OSX_SDK}.sdk
|
||||
HINTS ${OSX_SDK_PATH}
|
||||
PATHS /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/
|
||||
/Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/
|
||||
)
|
||||
|
||||
if (NOT _OSX_DESIRED_SDK_PATH)
|
||||
message(FATAL_ERROR "Could not find OS X 10.9 SDK. Please pass OSX_SDK_PATH to CMake to point us to your SDKs directory.")
|
||||
message(FATAL_ERROR "Could not find OS X ${OSX_SDK} SDK. Please pass OSX_SDK_PATH to CMake to point us to your SDKs directory.")
|
||||
else ()
|
||||
message(STATUS "Found OS X 10.9 SDK at ${_OSX_DESIRED_SDK_PATH}/MacOSX10.9.sdk")
|
||||
message(STATUS "Found OS X ${OSX_SDK} SDK at ${_OSX_DESIRED_SDK_PATH}/MacOSX${OSX_SDK}.sdk")
|
||||
endif ()
|
||||
|
||||
# set that as the SDK to use
|
||||
set(CMAKE_OSX_SYSROOT ${_OSX_DESIRED_SDK_PATH}/MacOSX10.9.sdk)
|
||||
set(CMAKE_OSX_SYSROOT ${_OSX_DESIRED_SDK_PATH}/MacOSX${OSX_SDK}.sdk)
|
||||
endif ()
|
||||
|
||||
# Hide automoc folders (for IDEs)
|
||||
|
|
|
@ -69,7 +69,7 @@ void AssetUploadDialogFactory::showDialog() {
|
|||
}
|
||||
|
||||
void AssetUploadDialogFactory::handleUploadFinished(AssetUpload* upload, const QString& hash) {
|
||||
if (upload->getResult() == AssetUpload::Success) {
|
||||
if (upload->getError() == AssetUpload::NoError) {
|
||||
// show message box for successful upload, with copiable text for ATP hash
|
||||
QDialog* hashCopyDialog = new QDialog(_dialogParent);
|
||||
|
||||
|
@ -124,14 +124,14 @@ void AssetUploadDialogFactory::handleUploadFinished(AssetUpload* upload, const Q
|
|||
// figure out the right error message for the message box
|
||||
QString additionalError;
|
||||
|
||||
switch (upload->getResult()) {
|
||||
switch (upload->getError()) {
|
||||
case AssetUpload::PermissionDenied:
|
||||
additionalError = PERMISSION_DENIED_ERROR;
|
||||
break;
|
||||
case AssetUpload::TooLarge:
|
||||
additionalError = "The uploaded content was too large and could not be stored in the asset-server.";
|
||||
break;
|
||||
case AssetUpload::ErrorLoadingFile:
|
||||
case AssetUpload::FileOpenError:
|
||||
additionalError = "The file could not be opened. Please check your permissions and try again.";
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -29,9 +29,9 @@ struct AssetInfo {
|
|||
int64_t size;
|
||||
};
|
||||
|
||||
using ReceivedAssetCallback = std::function<void(AssetServerError error, const QByteArray& data)>;
|
||||
using GetInfoCallback = std::function<void(AssetServerError error, AssetInfo info)>;
|
||||
using UploadResultCallback = std::function<void(AssetServerError error, const QString& hash)>;
|
||||
using ReceivedAssetCallback = std::function<void(AssetServerError serverError, const QByteArray& data)>;
|
||||
using GetInfoCallback = std::function<void(AssetServerError serverError, AssetInfo info)>;
|
||||
using UploadResultCallback = std::function<void(AssetServerError serverError, const QString& hash)>;
|
||||
|
||||
class AssetClient : public QObject, public Dependency {
|
||||
Q_OBJECT
|
||||
|
|
|
@ -41,14 +41,17 @@ void AssetRequest::start() {
|
|||
_state = WAITING_FOR_INFO;
|
||||
|
||||
auto assetClient = DependencyManager::get<AssetClient>();
|
||||
assetClient->getAssetInfo(_hash, _extension, [this](AssetServerError error, AssetInfo info) {
|
||||
assetClient->getAssetInfo(_hash, _extension, [this](AssetServerError serverError, AssetInfo info) {
|
||||
_info = info;
|
||||
_error = error;
|
||||
|
||||
if (_error != NoError) {
|
||||
if (serverError != AssetServerError::NoError) {
|
||||
qCDebug(networking) << "Got error retrieving asset info for" << _hash;
|
||||
|
||||
_state = FINISHED;
|
||||
emit finished(this);
|
||||
|
||||
_error = (serverError == AssetServerError::AssetNotFound) ? NotFound : UnknownError;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -60,17 +63,38 @@ void AssetRequest::start() {
|
|||
int start = 0, end = _info.size;
|
||||
|
||||
auto assetClient = DependencyManager::get<AssetClient>();
|
||||
assetClient->getAsset(_hash, _extension, start, end, [this, start, end](AssetServerError error,
|
||||
assetClient->getAsset(_hash, _extension, start, end, [this, start, end](AssetServerError serverError,
|
||||
const QByteArray& data) {
|
||||
Q_ASSERT(data.size() == (end - start));
|
||||
|
||||
_error = error;
|
||||
if (_error == NoError) {
|
||||
memcpy(_data.data() + start, data.constData(), data.size());
|
||||
_totalReceived += data.size();
|
||||
emit progress(_totalReceived, _info.size);
|
||||
if (serverError == AssetServerError::NoError) {
|
||||
|
||||
// we need to check the hash of the received data to make sure it matches what we expect
|
||||
if (hashData(data).toHex() == _hash) {
|
||||
memcpy(_data.data() + start, data.constData(), data.size());
|
||||
_totalReceived += data.size();
|
||||
emit progress(_totalReceived, _info.size);
|
||||
} else {
|
||||
// hash doesn't match - we have an error
|
||||
_error = HashVerificationFailed;
|
||||
}
|
||||
|
||||
} else {
|
||||
qCDebug(networking) << "Got error retrieving asset" << _hash;
|
||||
switch (serverError) {
|
||||
case AssetServerError::AssetNotFound:
|
||||
_error = NotFound;
|
||||
break;
|
||||
case AssetServerError::InvalidByteRange:
|
||||
_error = InvalidByteRange;
|
||||
break;
|
||||
default:
|
||||
_error = UnknownError;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (_error != NoError) {
|
||||
qCDebug(networking) << "Got error retrieving asset" << _hash << "- error code" << _error;
|
||||
}
|
||||
|
||||
_state = FINISHED;
|
||||
|
|
|
@ -29,14 +29,22 @@ public:
|
|||
WAITING_FOR_DATA,
|
||||
FINISHED
|
||||
};
|
||||
|
||||
enum Error {
|
||||
NoError,
|
||||
NotFound,
|
||||
InvalidByteRange,
|
||||
HashVerificationFailed,
|
||||
UnknownError
|
||||
};
|
||||
|
||||
AssetRequest(QObject* parent, const QString& hash, const QString& extension);
|
||||
|
||||
Q_INVOKABLE void start();
|
||||
|
||||
const QByteArray& getData() const { return _data; }
|
||||
State getState() const { return _state; }
|
||||
AssetServerError getError() const { return _error; }
|
||||
const State& getState() const { return _state; }
|
||||
const Error& getError() const { return _error; }
|
||||
|
||||
signals:
|
||||
void finished(AssetRequest* thisRequest);
|
||||
|
@ -44,7 +52,7 @@ signals:
|
|||
|
||||
private:
|
||||
State _state = NOT_STARTED;
|
||||
AssetServerError _error;
|
||||
Error _error = NoError;
|
||||
AssetInfo _info;
|
||||
uint64_t _totalReceived { 0 };
|
||||
QString _hash;
|
||||
|
|
|
@ -48,11 +48,11 @@ void AssetResourceRequest::doSend() {
|
|||
Q_ASSERT(req->getState() == AssetRequest::FINISHED);
|
||||
|
||||
switch (req->getError()) {
|
||||
case NoError:
|
||||
case AssetRequest::Error::NoError:
|
||||
_data = req->getData();
|
||||
_result = Success;
|
||||
break;
|
||||
case AssetNotFound:
|
||||
case AssetRequest::Error::NotFound:
|
||||
_result = NotFound;
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -46,23 +46,23 @@ void AssetUpload::start() {
|
|||
assetClient->uploadAsset(data, _extension, [this](AssetServerError error, const QString& hash){
|
||||
switch (error) {
|
||||
case AssetServerError::NoError:
|
||||
_result = Success;
|
||||
_error = NoError;
|
||||
break;
|
||||
case AssetServerError::AssetTooLarge:
|
||||
_result = TooLarge;
|
||||
_error = TooLarge;
|
||||
break;
|
||||
case AssetServerError::PermissionDenied:
|
||||
_result = PermissionDenied;
|
||||
_error = PermissionDenied;
|
||||
break;
|
||||
default:
|
||||
_result = ErrorLoadingFile;
|
||||
_error = FileOpenError;
|
||||
break;
|
||||
}
|
||||
emit finished(this, hash);
|
||||
});
|
||||
} else {
|
||||
// we couldn't open the file - set the error result
|
||||
_result = ErrorLoadingFile;
|
||||
_error = FileOpenError;
|
||||
|
||||
// emit that we are done
|
||||
emit finished(this, QString());
|
||||
|
|
|
@ -26,12 +26,12 @@ class AssetUpload : public QObject {
|
|||
Q_OBJECT
|
||||
public:
|
||||
|
||||
enum Result {
|
||||
Success = 0,
|
||||
enum Error {
|
||||
NoError = 0,
|
||||
Timeout,
|
||||
TooLarge,
|
||||
PermissionDenied,
|
||||
ErrorLoadingFile
|
||||
FileOpenError
|
||||
};
|
||||
|
||||
AssetUpload(QObject* parent, const QString& filename);
|
||||
|
@ -40,7 +40,7 @@ public:
|
|||
|
||||
const QString& getFilename() const { return _filename; }
|
||||
const QString& getExtension() const { return _extension; }
|
||||
const Result& getResult() const { return _result; }
|
||||
const Error& getError() const { return _error; }
|
||||
|
||||
signals:
|
||||
void finished(AssetUpload* upload, const QString& hash);
|
||||
|
@ -49,7 +49,7 @@ signals:
|
|||
private:
|
||||
QString _filename;
|
||||
QString _extension;
|
||||
Result _result;
|
||||
Error _error;
|
||||
};
|
||||
|
||||
#endif // hifi_AssetUpload_h
|
||||
|
|
Loading…
Reference in a new issue