> On June 29, 2016, 12:51 a.m., Vinod Kone wrote: > > src/master/http.cpp, lines 1241-1262 > > <https://reviews.apache.org/r/49313/diff/1/?file=1431790#file1431790line1241> > > > > flags specific authorization should be done in `_flags()` so that the > > v1 API can get the benefit automatically. > > > > please move this logic inside `_flags()`. you might need to adjust its > > return type and add a `__flags()`. > > Alexander Rojas wrote: > The main problem with this suggestion is, `_flags` return type is > `JSON::Object`, which means it is supposed to be called synchronously by both > `flags()` and `getFlags()`. > > If I were to make `_flags()` async, the return type would be > `Future<JSON::Object>` but then, how do I encode the fact that I must return > `Forbidden`? I could make `_flags()` return a `Future<Response>` but then it > would not be different from `flags()`, moreover `getFlags()` expects a > `JSON::Object` since it evolves it to a `v1::master::Response`, so it > shouldn't take a `Future<Response>`. > > My solution would be to use the same code in `getFlags()` to perform > authorization. > > Alexander Rojas wrote: > I added a patch implementing the solution I described > [r/49363/](https://reviews.apache.org/r/49363/) > > Vinod Kone wrote: > `_flags()` returning `Future<Response>` is fine. `flags()` still needs to > deal with the REST specific things like METHOD check and jsonp. I prefer that > than duplicating authz code in `flags()` and `getFlags()`.
my point was, the returned response in both cases, `flags()` and `getFlags()` is different, in the first case you return `OK(_flags(), request.url.query.get("jsonp"));`, in the second case you return `OK(serialize(contentType, evolve<v1::master::Response::GET_FLAGS>(_flags())), stringify(contentType));`. If we go with `_flags()` returning a future response, which one should that one be? the first response or the second one? - Alexander ----------------------------------------------------------- This is an automatically generated e-mail. To reply, visit: https://reviews.apache.org/r/49313/#review139886 ----------------------------------------------------------- On June 29, 2016, 10:44 a.m., Alexander Rojas wrote: > > ----------------------------------------------------------- > This is an automatically generated e-mail. To reply, visit: > https://reviews.apache.org/r/49313/ > ----------------------------------------------------------- > > (Updated June 29, 2016, 10:44 a.m.) > > > Review request for mesos, Adam B, Joerg Schad, Till Toenshoff, and Vinod Kone. > > > Bugs: MESOS-5705 > https://issues.apache.org/jira/browse/MESOS-5705 > > > Repository: mesos > > > Description > ------- > > Adds again authorization for flags. Instead of being part of > `get_endpoints` it uses its own action `VIEW_TASKS` which is > used to restrict access to the `/flags` endpoint, as well as > to filter the results of the `/state` endpoint on both master > and agents. > > > Diffs > ----- > > include/mesos/authorizer/acls.proto > a6d93cd2cb9161a98565b22e50b06aac4931a671 > include/mesos/authorizer/authorizer.proto > fc76796022a6fa3d36a1447c476980868d42c2d0 > src/authorizer/local/authorizer.cpp > 3fade4168face1cb80b30c9b69b31d9eb4126222 > src/common/http.hpp 55bd0ac81af80c656a4a80766a3e4b21db9cf0cf > src/common/http.cpp 95e8fb672b49a00860c64f818cc734fa22cf3516 > src/master/http.cpp 311db1a9400ab533f4536e7a7412122275a7044d > src/slave/http.cpp 44d8cc98c0c1ada9d5313a3fe5c66029c9c373c6 > src/tests/authorization_tests.cpp 9b99da138fa27a725738d70bd99e889b108b44ae > src/tests/master_authorization_tests.cpp > 9088d7df901ad9e0b3c43a3ea61882054f55ee93 > src/tests/slave_authorization_tests.cpp > 78221e200d9b7880cc474f1acef92c5dec1c8e25 > > Diff: https://reviews.apache.org/r/49313/diff/ > > > Testing > ------- > > - `make check` > - manual tests with browsers. > - Used the script: > > ```sh > #! /usr/bin/env bash > > rm -rf /tmp/mesos/* > > cat <<EOF > /tmp/credentials.txt > foo bar > baz bar > EOF > > cat <<EOF > /tmp/acls.json > { > "permissive": false, > "view_flags" : [ > { > "principals" : { "values" : ["foo"] }, > "flags" : { "type" : "ANY" } > }, > { > "principals" : { "values" : ["foo"] }, > "flags" : { "type" : "NONE" } > } > ] > } > EOF > > ./bin/mesos-master.sh --work_dir=/tmp/mesos/master \ > --authenticate_http \ > --log_dir=/tmp/mesos/logs/master \ > --http_credentials=file:///tmp/credentials.txt \ > --acls=file:///tmp/acls.json & > ./bin/mesos-slave.sh --work_dir=/tmp/mesos/slave \ > --master=127.0.0.1:5050 \ > --authenticate_http \ > --http_credentials=file:///tmp/credentials.txt \ > --acls=file:///tmp/acls.json & > > # Returns a 200 OK Response with the contents of the flags > # in JSON object > http GET http://127.0.0.1:5050/flags -a foo:bar > http GET http://127.0.0.1:5051/flags -a foo:bar > > # Returned JSON contains a `flags` entry with all the flags. > http GET http://127.0.0.1:5050/state -a foo:bar > http GET http://127.0.0.1:5051/state -a foo:bar > > # 403 Forbidden response > http GET http://127.0.0.1:5050/flags -a baz:bar > http GET http://127.0.0.1:5051/flags -a baz:bar > > # Returned JSON doesn't include flags information. > http GET http://127.0.0.1:5050/state -a baz:bar > http GET http://127.0.0.1:5051/state -a baz:bar > ``` > > > Thanks, > > Alexander Rojas > >