mirror of
https://gitea.wildfiregames.com/0ad/0ad
synced 2026-06-16 05:13:58 -07:00
If one mod is not signed or broken in any other way, mod.io downloader fails and does not display any mod. The problem with unsigned mod is that its metadata are empty. That means one cannot break mod io downloader with mods having invalid data. mark mod as invalid and display in list as disabled and display reason instead description to not spam ugly error messages on screen as this is not error by the game but of the moder report failed signatures back to list of mods fail if property is not set using strict mode when getting from js check in js for undefined values Allow to filter only valid mods. Differential Revision: https://code.wildfiregames.com/D2114 Reviewed by: @Itms Fixes: #5459 This was SVN commit r23821.
112 lines
3.1 KiB
C++
112 lines
3.1 KiB
C++
/* Copyright (C) 2020 Wildfire Games.
|
|
* This file is part of 0 A.D.
|
|
*
|
|
* 0 A.D. 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 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* 0 A.D. 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 General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with 0 A.D. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef INCLUDED_SCRIPTCONVERSIONS
|
|
#define INCLUDED_SCRIPTCONVERSIONS
|
|
|
|
#include "ScriptInterface.h"
|
|
#include "scriptinterface/ScriptExtraHeaders.h" // for typed arrays
|
|
|
|
#include <limits>
|
|
|
|
template<typename T> static void ToJSVal_vector(JSContext* cx, JS::MutableHandleValue ret, const std::vector<T>& val)
|
|
{
|
|
JSAutoRequest rq(cx);
|
|
JS::RootedObject obj(cx, JS_NewArrayObject(cx, 0));
|
|
if (!obj)
|
|
{
|
|
ret.setUndefined();
|
|
return;
|
|
}
|
|
|
|
ENSURE(val.size() <= std::numeric_limits<u32>::max());
|
|
for (u32 i = 0; i < val.size(); ++i)
|
|
{
|
|
JS::RootedValue el(cx);
|
|
ScriptInterface::ToJSVal<T>(cx, &el, val[i]);
|
|
JS_SetElement(cx, obj, i, el);
|
|
}
|
|
ret.setObject(*obj);
|
|
}
|
|
|
|
#define FAIL(msg) STMT(JS_ReportError(cx, msg); return false)
|
|
|
|
template<typename T> static bool FromJSVal_vector(JSContext* cx, JS::HandleValue v, std::vector<T>& out)
|
|
{
|
|
JSAutoRequest rq(cx);
|
|
JS::RootedObject obj(cx);
|
|
if (!v.isObject())
|
|
FAIL("Argument must be an array");
|
|
|
|
bool isArray;
|
|
obj = &v.toObject();
|
|
if ((!JS_IsArrayObject(cx, obj, &isArray) || !isArray) && !JS_IsTypedArrayObject(obj))
|
|
FAIL("Argument must be an array");
|
|
|
|
u32 length;
|
|
if (!JS_GetArrayLength(cx, obj, &length))
|
|
FAIL("Failed to get array length");
|
|
|
|
out.reserve(length);
|
|
for (u32 i = 0; i < length; ++i)
|
|
{
|
|
JS::RootedValue el(cx);
|
|
if (!JS_GetElement(cx, obj, i, &el))
|
|
FAIL("Failed to read array element");
|
|
T el2;
|
|
if (!ScriptInterface::FromJSVal<T>(cx, el, el2))
|
|
return false;
|
|
out.push_back(el2);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
#undef FAIL
|
|
|
|
#define JSVAL_VECTOR(T) \
|
|
template<> void ScriptInterface::ToJSVal<std::vector<T> >(JSContext* cx, JS::MutableHandleValue ret, const std::vector<T>& val) \
|
|
{ \
|
|
ToJSVal_vector(cx, ret, val); \
|
|
} \
|
|
template<> bool ScriptInterface::FromJSVal<std::vector<T> >(JSContext* cx, JS::HandleValue v, std::vector<T>& out) \
|
|
{ \
|
|
return FromJSVal_vector(cx, v, out); \
|
|
}
|
|
|
|
template<typename T> bool ScriptInterface::FromJSProperty(JSContext* cx, const JS::HandleValue val, const char* name, T& ret, bool strict)
|
|
{
|
|
if (!val.isObject())
|
|
return false;
|
|
|
|
JSAutoRequest rq(cx);
|
|
JS::RootedObject obj(cx, &val.toObject());
|
|
|
|
bool hasProperty;
|
|
if (!JS_HasProperty(cx, obj, name, &hasProperty) || !hasProperty)
|
|
return false;
|
|
|
|
JS::RootedValue value(cx);
|
|
if (!JS_GetProperty(cx, obj, name, &value))
|
|
return false;
|
|
|
|
if (strict && value.isNull())
|
|
return false;
|
|
|
|
return FromJSVal(cx, value, ret);
|
|
}
|
|
|
|
#endif //INCLUDED_SCRIPTCONVERSIONS
|