コード例 #1
0
/// POST: conversacion
RequestResult Request_POST_Conversacion(Database* db, const std::string& uriparams, const std::string& qparams, const std::string& body) {
	RequestResult ret;
	auto qdict = parseQueryParams(qparams);
	if(qdict.size() < 2 || !db->validateSession(qdict["r_user"], qdict["token"])) {
		ret.code = 401;
		ret.data = "{\"error\": \"token invalido\" }";
	}else{
		const auto& r_user = qdict["r_user"];
		const auto& t_user = uriparams;
		auto js = JSONParse(body);
                const auto& msg = js.get("mensaje", "").asString();
                if(msg.length() == 0) {
                	ret.code = 401;
                        ret.data = "{ \"error\": \"mensaje invalido\" }";
                }else if(!db->usuarioExists(t_user)){
			ret.code = 401;
                        ret.data = "{ \"error\": \"usuario de destino invalido\" }";
		}else if(!db->postearMensaje(r_user, t_user, msg)) {
			ret.code = 500;
                        ret.data = "{ \"error\": \"error al postear mensaje\" }";
		}else{
			// Todo ok
			ret.code = 201;
		}
	}
	return ret;
}
コード例 #2
0
JSCryptoKeySerializationJWK::JSCryptoKeySerializationJWK(ExecState* exec, const String& jsonString)
    : m_exec(exec)
{
    JSValue jsonValue = JSONParse(exec, jsonString);
    if (exec->hadException())
        return;

    if (!jsonValue || !jsonValue.isObject()) {
        throwTypeError(exec, "Invalid JWK serialization");
        return;
    }

    m_json.set(m_exec->vm(), asObject(jsonValue));
}
コード例 #3
0
JSValue JSXMLHttpRequest::response(ExecState* exec) const
{
    switch (impl().responseTypeCode()) {
    case XMLHttpRequest::ResponseTypeDefault:
    case XMLHttpRequest::ResponseTypeText:
        return responseText(exec);

    case XMLHttpRequest::ResponseTypeJSON:
        {
            // FIXME: Use CachedAttribute for other types as well.
            if (m_response && impl().responseCacheIsValid())
                return m_response.get();

            if (!impl().doneWithoutErrors())
                return jsNull();

            JSValue value = JSONParse(exec, impl().responseTextIgnoringResponseType());
            if (!value)
                value = jsNull();
            JSXMLHttpRequest* jsRequest = const_cast<JSXMLHttpRequest*>(this);
            jsRequest->m_response.set(exec->vm(), jsRequest, value);

            impl().didCacheResponseJSON();

            return value;
        }

    case XMLHttpRequest::ResponseTypeDocument:
        {
            ExceptionCode ec = 0;
            Document* document = impl().responseXML(ec);
            if (ec) {
                setDOMException(exec, ec);
                return jsUndefined();
            }
            return toJS(exec, globalObject(), document);
        }

    case XMLHttpRequest::ResponseTypeBlob:
        return toJS(exec, globalObject(), impl().responseBlob());

    case XMLHttpRequest::ResponseTypeArrayBuffer:
        return toJS(exec, globalObject(), impl().responseArrayBuffer());
    }

    return jsUndefined();
}
コード例 #4
0
JSValue JSXMLHttpRequest::retrieveResponse(ExecState& state)
{
    auto type = wrapped().responseType();

    switch (type) {
    case XMLHttpRequest::ResponseType::EmptyString:
    case XMLHttpRequest::ResponseType::Text:
        return responseText(state);
    default:
        break;
    }

    if (!wrapped().doneWithoutErrors())
        return jsNull();

    JSValue value;
    switch (type) {
    case XMLHttpRequest::ResponseType::EmptyString:
    case XMLHttpRequest::ResponseType::Text:
        ASSERT_NOT_REACHED();
        return jsUndefined();

    case XMLHttpRequest::ResponseType::Json:
        value = JSONParse(&state, wrapped().responseTextIgnoringResponseType());
        if (!value)
            value = jsNull();
        break;

    case XMLHttpRequest::ResponseType::Document: {
        ExceptionCode ec = 0;
        auto document = wrapped().responseXML(ec);
        ASSERT(!ec);
        value = toJS(&state, globalObject(), document);
        break;
    }
    case XMLHttpRequest::ResponseType::Blob:
        value = toJSNewlyCreated(&state, globalObject(), wrapped().createResponseBlob());
        break;

    case XMLHttpRequest::ResponseType::Arraybuffer:
        value = toJS(&state, globalObject(), wrapped().createResponseArrayBuffer());
        break;
    }
    wrapped().didCacheResponse();
    return value;
}
コード例 #5
0
JSValue JSXMLHttpRequest::response(ExecState& state) const
{
    // FIXME: Use CachedAttribute for other types than JSON as well.
    if (m_response && wrapped().responseCacheIsValid())
        return m_response.get();

    if (!wrapped().doneWithoutErrors() && wrapped().responseTypeCode() > XMLHttpRequest::ResponseTypeText)
        return jsNull();

    switch (wrapped().responseTypeCode()) {
    case XMLHttpRequest::ResponseTypeDefault:
    case XMLHttpRequest::ResponseTypeText:
        return responseText(state);

    case XMLHttpRequest::ResponseTypeJSON:
        {
            JSValue value = JSONParse(&state, wrapped().responseTextIgnoringResponseType());
            if (!value)
                value = jsNull();
            m_response.set(state.vm(), this, value);

            wrapped().didCacheResponseJSON();

            return value;
        }

    case XMLHttpRequest::ResponseTypeDocument:
        {
            ExceptionCode ec = 0;
            Document* document = wrapped().responseXML(ec);
            if (ec) {
                setDOMException(&state, ec);
                return jsUndefined();
            }
            return toJS(&state, globalObject(), document);
        }

    case XMLHttpRequest::ResponseTypeBlob:
        return toJS(&state, globalObject(), wrapped().responseBlob());

    case XMLHttpRequest::ResponseTypeArrayBuffer:
        return toJS(&state, globalObject(), wrapped().responseArrayBuffer());
    }

    return jsUndefined();
}
コード例 #6
0
static std::error_code loadEncodedRules(ExecState& exec, const String& rules, Vector<ContentExtensionRule>& ruleList)
{
    VM& vm = exec.vm();
    auto scope = DECLARE_THROW_SCOPE(vm);

    // FIXME: JSONParse should require callbacks instead of an ExecState.
    const JSValue decodedRules = JSONParse(&exec, rules);

    if (scope.exception() || !decodedRules)
        return ContentExtensionError::JSONInvalid;

    if (!decodedRules.isObject())
        return ContentExtensionError::JSONTopLevelStructureNotAnObject;

    const JSObject* topLevelObject = decodedRules.toObject(&exec);
    if (!topLevelObject || scope.exception())
        return ContentExtensionError::JSONTopLevelStructureNotAnObject;
    
    if (!isJSArray(topLevelObject))
        return ContentExtensionError::JSONTopLevelStructureNotAnArray;

    const JSArray* topLevelArray = jsCast<const JSArray*>(topLevelObject);

    Vector<ContentExtensionRule> localRuleList;

    unsigned length = topLevelArray->length();
    const unsigned maxRuleCount = 50000;
    if (length > maxRuleCount)
        return ContentExtensionError::JSONTooManyRules;
    for (unsigned i = 0; i < length; ++i) {
        const JSValue value = topLevelArray->getIndex(&exec, i);
        if (scope.exception() || !value)
            return ContentExtensionError::JSONInvalidObjectInTopLevelArray;

        const JSObject* ruleObject = value.toObject(&exec);
        if (!ruleObject || scope.exception())
            return ContentExtensionError::JSONInvalidRule;

        auto error = loadRule(exec, *ruleObject, localRuleList);
        if (error)
            return error;
    }

    ruleList = WTFMove(localRuleList);
    return { };
}
コード例 #7
0
/// POST: /usuario
RequestResult Request_POST_Usuario(Database* db, const std::string& uriparams, const std::string& qparams, const std::string& body) {
	RequestResult ret;
	Usuario user;
	// Parseamos el JSON para cargar los datos posteados
	auto js = JSONParse(body);
	user.load(js);
	// Cargamos el usuario del uri
	user.id = uriparams;
	std::string err_str;
	if(db->createUsuario(user, err_str)) {
		ret.code = 201;
	}else{
		log.msg(LOG_TYPE::INFO, std::string("Error creando usuario `") + user.id + "`");
		ret.code = 401;
                ret.data = std::string("{ \"error\": \"") + err_str + "\" }";
	}
	return ret;
}
コード例 #8
0
// Define all requests here
/// POST: /login
RequestResult Request_POST_Login(Database* db, const std::string& uriparams, const std::string& qparams, const std::string& body) {
	RequestResult ret;
	// Parse and check credentials
	auto js = JSONParse(body);
	const std::string usr_id = js.get("id", "").asString();
	const std::string pwd = js.get("password", "").asString();
	Usuario usr;
	if(db->loadUsuario(usr_id, usr) && usr.password == pwd) {
		usr.last_action = std::time(nullptr);
		usr.token = genToken();
		db->saveUsuario(usr);
		ret.data = std::string("{ \"token\": \"") + usr.token + usr.nombre + "\" }";
		ret.code = 201;
	}else{
		ret.data = "{ \"error\": \"Usuario o clave invalidos\" }";
		ret.code = 401;
	}
	return ret;
}
コード例 #9
0
/// PUT: /usuario
RequestResult Request_PUT_Usuario(Database* db, const std::string& uriparams, const std::string& qparams, const std::string& body) {
	RequestResult ret;
	auto qdict = parseQueryParams(qparams);
	Usuario usr;
	// Debe pasar la clave tambien
	if(qdict.size() < 2 || !db->validateSession(qdict["r_user"], qdict["token"])) {
		ret.code = 401;
		ret.data = "{\"error\": \"token invalido\" }";
		return ret;
	}
	if(uriparams != qdict["r_user"]) {
		ret.code = 401;
		ret.data = "{\"error\": \"permiso denegado\" }";
		return ret;
	}
	if(!db->loadUsuario(uriparams, usr)) {
		ret.code = 500;
		ret.data = "{\"error\": \"error cargando usuario\" }";
		return ret;
	}
	if(qdict["password"] != usr.password) {
		ret.code = 401;
		ret.data = "{\"error\": \"password invalido\" }";
		return ret;
	}
	// Editamos los valores que nos pasaron (si los pasaron)
	auto js = JSONParse(body);
	usr.load(js);
	// Guardamos el usuario
	if(!db->saveUsuario(usr)) {
		// TODO: desdoblar en los distintos
		ret.code = 401;
		ret.data = "{ \"error\": \"atributos invalidos\" }";
	}else{
		ret.code = 201;
	}
	return ret;
}