sealcode / sealious

An extensible, declarative node framework
25 stars 2 forks source link

Missing check for `undefined` value_in_code in field-type.text #257

Closed arkadiusz-wieczorek closed 8 years ago

arkadiusz-wieczorek commented 8 years ago

I've sent empty object by method PUT to resource which doesn't exist (not correct id), e.g:

placetag.pl/api/v1/places/ehuyta04pkfff

I've received body (403):

{
    "data": {
        "longitude": "Missing value for field `longitude`",
        "latitude": "Missing value for field `latitude`"
    },
    "is_error": true,
    "type": "validation",
    "status_message": "There are problems with some of the provided values."
}

Ok, I've sent again object with filled fields (latitude and longitude) then I received error (500):

{
    "data": {},
    "is_error": true,
    "type": "error",
    "status_message": "Internal server error"
}

Whether it should be another code and body? Because this resource doesn't exist.

kuba-orlik commented 8 years ago

Please include the Sealious version you're using, your resource-type declaration and the console output :)

adwydman commented 8 years ago
Also your PESEL, eye color and parents approval letter.

2016-01-05 15:32 GMT+01:00 Kuba Orlik notifications@github.com:

Please include the Sealious version you're using, your resource-type declaration and the console output :)

— Reply to this email directly or view it on GitHub https://github.com/Sealious/sealious/issues/257#issuecomment-169017127.

arkadiusz-wieczorek commented 8 years ago

Sealious version: 0.6.18 Resource-type declaration:


new Sealious.ChipTypes.ResourceType({
    name: "places",
    fields: [
        {name: "name", type: "text"},
        {name: "address", type: "text"},
        {name: "city", type: "text"},
        {name: "country", type: "text"},
        {name: "category", type: "category"},
        {name: "description", type: "description"},
        {name: "longitude", type: "float", required: true}, //52
        {name: "latitude", type: "float", required: true},  //16
        {name: "image", type: "photo", params: {no_file_value: "none"}},
        {name: "access", type: "access"}
    ],
    access_strategy: {
        create : "create_only_logged",
        retrieve : "owner_access",
        delete : "create_only_logged",
        update : "owner_access"
    }
});

Console output:

20:21:12.825 - error:   PUT /api/v1/places/ehuyta04pkfff
            from: 127.0.0.1, mime: multipart/form-data
            result: 
20:21:12.825 - error:  TypeError: Cannot read property 'toString' of undefined
    at Sealious.ChipTypes.FieldType.encode (/home/arkadiusz/Projects/Placetag/node_modules/sealious/lib/base-chips/field_type.text.js:33:41)
    at tryCatcher (/home/arkadiusz/Projects/Placetag/node_modules/sealious/node_modules/bluebird/js/main/util.js:26:23)
    at /home/arkadiusz/Projects/Placetag/node_modules/sealious/node_modules/bluebird/js/main/method.js:15:34
    at encode (/home/arkadiusz/Projects/Placetag/node_modules/sealious/lib/chip-types/field-type.js:175:36)
    at encode_value (/home/arkadiusz/Projects/Placetag/node_modules/sealious/lib/chip-types/resource-type-field.js:64:20)
    at encode_field_values (/home/arkadiusz/Projects/Placetag/node_modules/sealious/lib/chip-types/resource-type.js:186:51)
    at /home/arkadiusz/Projects/Placetag/node_modules/sealious/lib/core-services/resource-manager.js:243:33
    at bound (domain.js:250:14)
    at runBound (domain.js:263:12)
    at tryCatcher (/home/arkadiusz/Projects/Placetag/node_modules/sealious/node_modules/bluebird/js/main/util.js:26:23)
    at Promise._settlePromiseFromHandler (/home/arkadiusz/Projects/Placetag/node_modules/sealious/node_modules/bluebird/js/main/promise.js:503:31)
    at Promise._settlePromiseAt (/home/arkadiusz/Projects/Placetag/node_modules/sealious/node_modules/bluebird/js/main/promise.js:577:18)
    at Async._drainQueue (/home/arkadiusz/Projects/Placetag/node_modules/sealious/node_modules/bluebird/js/main/async.js:128:12)
    at Async._drainQueues (/home/arkadiusz/Projects/Placetag/node_modules/sealious/node_modules/bluebird/js/main/async.js:133:10)
    at Immediate.Async.drainQueues [as _onImmediate] (/home/arkadiusz/Projects/Placetag/node_modules/sealious/node_modules/bluebird/js/main/async.js:15:14)
    at processImmediate [as _immediateCallback] (timers.js:371:17)
TypeError: Cannot read property 'toString' of undefined
    at Sealious.ChipTypes.FieldType.encode (/home/arkadiusz/Projects/Placetag/node_modules/sealious/lib/base-chips/field_type.text.js:33:41)
    at tryCatcher (/home/arkadiusz/Projects/Placetag/node_modules/sealious/node_modules/bluebird/js/main/util.js:26:23)
    at /home/arkadiusz/Projects/Placetag/node_modules/sealious/node_modules/bluebird/js/main/method.js:15:34
    at encode (/home/arkadiusz/Projects/Placetag/node_modules/sealious/lib/chip-types/field-type.js:175:36)
    at encode_value (/home/arkadiusz/Projects/Placetag/node_modules/sealious/lib/chip-types/resource-type-field.js:64:20)
    at encode_field_values (/home/arkadiusz/Projects/Placetag/node_modules/sealious/lib/chip-types/resource-type.js:186:51)
    at /home/arkadiusz/Projects/Placetag/node_modules/sealious/lib/core-services/resource-manager.js:243:33
    at bound (domain.js:250:14)
    at runBound (domain.js:263:12)
    at tryCatcher (/home/arkadiusz/Projects/Placetag/node_modules/sealious/node_modules/bluebird/js/main/util.js:26:23)
    at Promise._settlePromiseFromHandler (/home/arkadiusz/Projects/Placetag/node_modules/sealious/node_modules/bluebird/js/main/promise.js:503:31)
    at Promise._settlePromiseAt (/home/arkadiusz/Projects/Placetag/node_modules/sealious/node_modules/bluebird/js/main/promise.js:577:18)
    at Async._drainQueue (/home/arkadiusz/Projects/Placetag/node_modules/sealious/node_modules/bluebird/js/main/async.js:128:12)
    at Async._drainQueues (/home/arkadiusz/Projects/Placetag/node_modules/sealious/node_modules/bluebird/js/main/async.js:133:10)
    at Immediate.Async.drainQueues [as _onImmediate] (/home/arkadiusz/Projects/Placetag/node_modules/sealious/node_modules/bluebird/js/main/async.js:15:14)
    at processImmediate [as _immediateCallback] (timers.js:371:17)
kuba-orlik commented 8 years ago

I did manage to reproduce that issue in both 0.6.18 and the newest 0.6.21. There needs to be an additional check in field-type.text for the value undefined.

I won't release a new version without first reproducing the bug in tests, but here's a simple patch you can apply on your local copy if you're in a hurry:

---
 lib/base-chips/field_type.text.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/base-chips/field_type.text.js b/lib/base-chips/field_type.text.js
index f6fc53d..39e5c26 100644
--- a/lib/base-chips/field_type.text.js
+++ b/lib/base-chips/field_type.text.js
@@ -27,7 +27,7 @@ var field_type_text = new Sealious.ChipTypes.FieldType({
                } else {
                        if (value_in_code instanceof Object) {
                                return Promise.resolve(JSON.stringify(value_in_code));
-                       } else if (value_in_code === null) {
+                       } else if (value_in_code === null || value_in_code === undefined) {
                                return Promise.resolve(null);
                        } else {
                                return Promise.resolve(value_in_code.toString());
-- 
2.5.0
arkadiusz-wieczorek commented 8 years ago

Thanks, I will check it.

kuba-orlik commented 8 years ago

There's a PR for this issue pending: https://github.com/Sealious/sealious/pull/258 :)

adwydman commented 8 years ago

Pull request merged.