On 01 Sep 2018, at 13:06, Yann Ylavic <ylavic....@gmail.com> wrote:

>> Looking at 1839779 and 1839755, both of these need to be reverted as they 
>> break RFC compliance with respect to the JSON RFC and JOSE RFCs (I’m -1 on 
>> these changes).
> 
> There is probably another solution, see below.
> 
>> 
>> Please can you discuss these changes first before making them, I’ve had my 
>> head buried in these RFCs for the past while and I can explain the design 
>> choices behind the API, and add any documentation that’s lacking to clarify 
>> how this works.
> 
> OK, sorry about this.

No worries, it caught me just as I was done on apr_jose. Turns out there are a 
whole of of security requirements in the RFCs that depend on JSON, requiring a 
whole lot of strictness in base64/base64url processing, JSON processing, etc.

What this shows is I need to document apr_json.h better.

>> JSON whitespace is significant in some RFCs, specifically the JWE and JWS 
>> RFCs, and there needs to be a mechanism to formally support whitespace for 
>> this API to be be useful in a security sensitive environment.
> 
> My changes were meant to allow simple (default) apr_json_object_set
> without having to create a json_string for the key.
> That's IMO how most users want it to be:
>    apr_json_object_set(json, "somekey", apr_json_<type>_create(...));
> rather than:
>    apr_json_object_set(json, apr_json_string_create("somekey"),
> apr_json_<type>_create(...));
> …

I’ve at least twice tried to make the same changes you have, and both times 
stopped myself going “oh, yeah”. We definitely need a “simple” signature for 
the common case as you describe.

How about this?

/**
 * Associate a value with a key in a JSON object.
 * @param obj The JSON object.
 * @param key Pointer to the key string.
 * @param klen Length of the key, or APR_JSON_VALUE_STRING if NUL
 *   terminated.
 * @param val Value to associate with the key.
 * @param pool Pool to use.
 * @return APR_SUCCESS on success, APR_EINVAL if the key is
 *   NULL or not a string, or the object is not an APR_JSON_OBJECT.
 * @remark If the value is NULL the key value pair is deleted.
 */
APU_DECLARE(apr_status_t) apr_json_object_set(apr_json_value_t *obj,
        const char *key, apr_ssize_t klen, apr_json_value_t *val,
        apr_pool_t *pool) __attribute__((nonnull(1, 2, 5)));

/**
 * Associate a value with a key in a JSON object, preserving whitespace.
 * @param obj The JSON object.
 * @param key Pointer to the key string, including any whitespace
 *   required.
 * @param val Value to associate with the key.
 * @param pool Pool to use.
 * @return APR_SUCCESS on success, APR_EINVAL if the key is
 *   NULL or not a string, or the object is not an APR_JSON_OBJECT.
 * @remark If the value is NULL the key value pair is deleted.
 */
APU_DECLARE(apr_status_t) apr_json_object_set_ex(apr_json_value_t *obj,
        apr_json_value_t *key, apr_json_value_t *val,
        apr_pool_t *pool) __attribute__((nonnull(1, 2, 4)));

Regards,
Graham
—

Reply via email to