)]}'
{"doc/source/cli/commands.rst":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"c569ee9e5afb2178b80ae44cd6d35d6ec844a863","unresolved":false,"context_lines":[{"line_number":24,"context_line":"* ``mapping_purge``: Purge the identity mapping table."},{"line_number":25,"context_line":"* ``mapping_engine``: Test your federation mapping rules."},{"line_number":26,"context_line":"* ``saml_idp_metadata``: Generate identity provider metadata."},{"line_number":27,"context_line":"* ``trust_flush``: Purge expired trusts."}],"source_content_type":"text/x-rst","patch_set":8,"id":"9fdfeff1_f00c30a6","line":27,"updated":"2019-01-30 00:15:48.000000000","message":"Unrelated change?","commit_id":"d1d26ad41d32a409484e69009b15d8fe2403dd15"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c62176d10970435a4954507be16446d0ab6e4261","unresolved":false,"context_lines":[{"line_number":24,"context_line":"* ``mapping_purge``: Purge the identity mapping table."},{"line_number":25,"context_line":"* ``mapping_engine``: Test your federation mapping rules."},{"line_number":26,"context_line":"* ``saml_idp_metadata``: Generate identity provider metadata."},{"line_number":27,"context_line":"* ``trust_flush``: Purge expired trusts."}],"source_content_type":"text/x-rst","patch_set":8,"id":"9fdfeff1_b3ceb2b1","line":27,"in_reply_to":"9fdfeff1_f00c30a6","updated":"2019-01-30 01:07:14.000000000","message":"Yeah - I think this is caused by my editor.","commit_id":"d1d26ad41d32a409484e69009b15d8fe2403dd15"}],"keystone/cmd/cli.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b5b752c6671aea59d0e824eb40c2cceac39de8d3","unresolved":false,"context_lines":[{"line_number":31,"context_line":"from keystone.cmd import doctor"},{"line_number":32,"context_line":"from keystone.common import driver_hints"},{"line_number":33,"context_line":"from keystone.common import fernet_utils"},{"line_number":34,"context_line":"from keystone.common import file_utils"},{"line_number":35,"context_line":"from keystone.common import jwt_utils"},{"line_number":36,"context_line":"from keystone.common import sql"},{"line_number":37,"context_line":"from keystone.common.sql import upgrades"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_e1a214ac","line":34,"range":{"start_line":34,"start_character":28,"end_line":34,"end_character":38},"updated":"2018-11-08 15:41:03.000000000","message":"Remove this and pull in utils instead.","commit_id":"05811da4337a3ed6a181f5264b8be025ee5ebdab"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"92707ba2dfb745cfa13c9babe16a8acfbbdd8238","unresolved":false,"context_lines":[{"line_number":31,"context_line":"from keystone.cmd import doctor"},{"line_number":32,"context_line":"from keystone.common import driver_hints"},{"line_number":33,"context_line":"from keystone.common import fernet_utils"},{"line_number":34,"context_line":"from keystone.common import file_utils"},{"line_number":35,"context_line":"from keystone.common import jwt_utils"},{"line_number":36,"context_line":"from keystone.common import sql"},{"line_number":37,"context_line":"from keystone.common.sql import upgrades"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_c1c7d83c","line":34,"range":{"start_line":34,"start_character":28,"end_line":34,"end_character":38},"in_reply_to":"3f79a3b5_e1a214ac","updated":"2018-11-08 15:42:54.000000000","message":"Done","commit_id":"05811da4337a3ed6a181f5264b8be025ee5ebdab"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b5b752c6671aea59d0e824eb40c2cceac39de8d3","unresolved":false,"context_lines":[{"line_number":495,"context_line":"    @classmethod"},{"line_number":496,"context_line":"    def main(cls):"},{"line_number":497,"context_line":"        keystone_user_id, keystone_group_id \u003d cls.get_user_group()"},{"line_number":498,"context_line":"        file_utils.create_directory("},{"line_number":499,"context_line":"            CONF.jwt_tokens.key_repository, keystone_user_id\u003dkeystone_user_id,"},{"line_number":500,"context_line":"            keystone_group_id\u003dkeystone_group_id"},{"line_number":501,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_c18b581f","line":498,"range":{"start_line":498,"start_character":8,"end_line":498,"end_character":18},"updated":"2018-11-08 15:41:03.000000000","message":"Use utils instead.","commit_id":"05811da4337a3ed6a181f5264b8be025ee5ebdab"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"92707ba2dfb745cfa13c9babe16a8acfbbdd8238","unresolved":false,"context_lines":[{"line_number":495,"context_line":"    @classmethod"},{"line_number":496,"context_line":"    def main(cls):"},{"line_number":497,"context_line":"        keystone_user_id, keystone_group_id \u003d cls.get_user_group()"},{"line_number":498,"context_line":"        file_utils.create_directory("},{"line_number":499,"context_line":"            CONF.jwt_tokens.key_repository, keystone_user_id\u003dkeystone_user_id,"},{"line_number":500,"context_line":"            keystone_group_id\u003dkeystone_group_id"},{"line_number":501,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_81cd605c","line":498,"range":{"start_line":498,"start_character":8,"end_line":498,"end_character":18},"in_reply_to":"3f79a3b5_c18b581f","updated":"2018-11-08 15:42:54.000000000","message":"Done","commit_id":"05811da4337a3ed6a181f5264b8be025ee5ebdab"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"35e374cd1d7e90eb30dd389f3de5f47d784a07e6","unresolved":false,"context_lines":[{"line_number":500,"context_line":"        )"},{"line_number":501,"context_line":""},{"line_number":502,"context_line":"        private_key_path \u003d os.path.join("},{"line_number":503,"context_line":"            CONF.jwt_tokens.key_repository, \u0027private.pem\u0027"},{"line_number":504,"context_line":"        )"},{"line_number":505,"context_line":"        public_key_path \u003d os.path.join("},{"line_number":506,"context_line":"            CONF.jwt_tokens.key_repository, \u0027public.pem\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_0460e9d0","line":503,"range":{"start_line":503,"start_character":17,"end_line":503,"end_character":27},"updated":"2018-12-17 02:50:58.000000000","message":"the group is not registered, you should create one in keystone/conf as well.\n\nERROR I hit local:\n\nERROR keystone Traceback (most recent call last):\nERROR keystone   File \"/usr/local/bin/keystone-manage\", line 10, in \u003cmodule\u003e\nERROR keystone     sys.exit(main())\nERROR keystone   File \"/opt/stack/keystone/keystone/cmd/manage.py\", line 41, in main\nERROR keystone     cli.main(argv\u003dsys.argv, developer_config_file\u003ddeveloper_config)\nERROR keystone   File \"/opt/stack/keystone/keystone/cmd/cli.py\", line 1378, in main\nERROR keystone     CONF.command.cmd_class.main()\nERROR keystone   File \"/opt/stack/keystone/keystone/cmd/cli.py\", line 498, in main\nERROR keystone     CONF.jwt_tokens.key_repository, keystone_user_id\u003dkeystone_user_id,\nERROR keystone   File \"/usr/local/lib/python3.5/dist-packages/oslo_config/cfg.py\", line 2640, in __getattr__\nERROR keystone     raise NoSuchOptError(name)\nERROR keystone oslo_config.cfg.NoSuchOptError: no such option jwt_tokens in group [DEFAULT]","commit_id":"98af1c34332b0d36574b65d277f985fded1b9b88"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ad80e38ddd2d758b15ceece23c68d245fd4914d2","unresolved":false,"context_lines":[{"line_number":500,"context_line":"        )"},{"line_number":501,"context_line":""},{"line_number":502,"context_line":"        private_key_path \u003d os.path.join("},{"line_number":503,"context_line":"            CONF.jwt_tokens.key_repository, \u0027private.pem\u0027"},{"line_number":504,"context_line":"        )"},{"line_number":505,"context_line":"        public_key_path \u003d os.path.join("},{"line_number":506,"context_line":"            CONF.jwt_tokens.key_repository, \u0027public.pem\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffd0ebdf_f81ee26e","line":503,"range":{"start_line":503,"start_character":17,"end_line":503,"end_character":27},"in_reply_to":"3f79a3b5_0460e9d0","updated":"2019-01-04 20:24:24.000000000","message":"Good catch. I pulled this out into it\u0027s own change.","commit_id":"98af1c34332b0d36574b65d277f985fded1b9b88"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"35e374cd1d7e90eb30dd389f3de5f47d784a07e6","unresolved":false,"context_lines":[{"line_number":503,"context_line":"            CONF.jwt_tokens.key_repository, \u0027private.pem\u0027"},{"line_number":504,"context_line":"        )"},{"line_number":505,"context_line":"        public_key_path \u003d os.path.join("},{"line_number":506,"context_line":"            CONF.jwt_tokens.key_repository, \u0027public.pem\u0027"},{"line_number":507,"context_line":"        )"},{"line_number":508,"context_line":"        jwt_utils.create_key_pair(private_key_path, public_key_path)"},{"line_number":509,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_4474a18a","line":506,"range":{"start_line":506,"start_character":28,"end_line":506,"end_character":42},"updated":"2018-12-17 02:50:58.000000000","message":"how about saving private and public keys into different folders like what we did for PKI. If my memory is correct, we\u0027ll support multi key paris in the future. It\u0027s good and safer for saving them separately IMO.","commit_id":"98af1c34332b0d36574b65d277f985fded1b9b88"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ad80e38ddd2d758b15ceece23c68d245fd4914d2","unresolved":false,"context_lines":[{"line_number":503,"context_line":"            CONF.jwt_tokens.key_repository, \u0027private.pem\u0027"},{"line_number":504,"context_line":"        )"},{"line_number":505,"context_line":"        public_key_path \u003d os.path.join("},{"line_number":506,"context_line":"            CONF.jwt_tokens.key_repository, \u0027public.pem\u0027"},{"line_number":507,"context_line":"        )"},{"line_number":508,"context_line":"        jwt_utils.create_key_pair(private_key_path, public_key_path)"},{"line_number":509,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ffd0ebdf_cbfea604","line":506,"range":{"start_line":506,"start_character":28,"end_line":506,"end_character":42},"in_reply_to":"3f79a3b5_4474a18a","updated":"2019-01-04 20:24:24.000000000","message":"So - we should have two different directories? One that defaults to /etc/keystone/jwt/signing-keys and one that defaults to /etc/keystone/jwt/validation-keys?","commit_id":"98af1c34332b0d36574b65d277f985fded1b9b88"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"54bd9fa24f8515886e4c4c62428a51c9083ff533","unresolved":false,"context_lines":[{"line_number":514,"context_line":"                             % {\u0027path\u0027: public_key_path})"},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"        jwt_utils.create_jws_keypair(private_key_path, public_key_path)"},{"line_number":517,"context_line":""},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"class TokenSetup(BasePermissionsSetup):"},{"line_number":520,"context_line":"    \"\"\"Setup a key repository for tokens."}],"source_content_type":"text/x-python","patch_set":10,"id":"9fdfeff1_6b157348","line":517,"updated":"2019-02-02 01:51:40.000000000","message":"it\u0027s good to add some Log info, otherwise operators may not know what is happened or where is the generated key pairs.","commit_id":"1abe8a2ec056fecadbbd025675eeb32fc18c0fcb"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1d5a6ea38776ee65e0ad0bd0f34f80050956f0b1","unresolved":false,"context_lines":[{"line_number":514,"context_line":"                             % {\u0027path\u0027: public_key_path})"},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"        jwt_utils.create_jws_keypair(private_key_path, public_key_path)"},{"line_number":517,"context_line":""},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"class TokenSetup(BasePermissionsSetup):"},{"line_number":520,"context_line":"    \"\"\"Setup a key repository for tokens."}],"source_content_type":"text/x-python","patch_set":10,"id":"9fdfeff1_19c3dd8a","line":517,"in_reply_to":"9fdfeff1_6b157348","updated":"2019-02-02 06:17:20.000000000","message":"Oh, like where the keys were actually created? I can spin up a follow-on patch to add that.","commit_id":"1abe8a2ec056fecadbbd025675eeb32fc18c0fcb"}],"keystone/common/jwt_utils.py":[{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"35e374cd1d7e90eb30dd389f3de5f47d784a07e6","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"def create_key_pair(private_key_path, public_key_path):"},{"line_number":19,"context_line":"    private_key \u003d ec.generate_private_key(ec.SECP384R1(), default_backend())"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    with open(private_key_path, \u0027wb\u0027) as f:"},{"line_number":22,"context_line":"        f.write("}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_29514033","line":19,"range":{"start_line":19,"start_character":45,"end_line":19,"end_character":54},"updated":"2018-12-17 02:50:58.000000000","message":"We use ES256 in the specs. ES256 is the ECDSA using P-256 and SHA-256. So I think it should be SECP256R1","commit_id":"98af1c34332b0d36574b65d277f985fded1b9b88"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4eb109404f38df76c947e221e0785a51ca10a78c","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"def create_key_pair(private_key_path, public_key_path):"},{"line_number":19,"context_line":"    private_key \u003d ec.generate_private_key(ec.SECP384R1(), default_backend())"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    with open(private_key_path, \u0027wb\u0027) as f:"},{"line_number":22,"context_line":"        f.write("}],"source_content_type":"text/x-python","patch_set":3,"id":"ffd0ebdf_4b12b65a","line":19,"range":{"start_line":19,"start_character":45,"end_line":19,"end_character":54},"in_reply_to":"3f79a3b5_29514033","updated":"2019-01-04 20:27:00.000000000","message":"Done","commit_id":"98af1c34332b0d36574b65d277f985fded1b9b88"}]}
