.. This work is licensed under a Creative Commons Attribution 3.0 Unported License. http://creativecommons.org/licenses/by/3.0/legalcode ==================================================== Optionally enforce URL-safe domain and project names ==================================================== `bp url-safe-naming `_ In preparation for future support for hierarchical naming of projects and domains, deprecate non url-safe names as well as optionally enforce url-safe names. Problem Description =================== Once upon a time, in a release far away, there were just tenants in a flat namespace. It was natural that tenant names had to be unique keystone-wide. Subsequently we have added domains (to hold tenants, now called projects), which meant that project names had only to be unique within that domain. We now support hierarchies of projects (within a domain) and potentially may support hierarchies of domains above projects. However, our name uniqueness rules have not changed, so a project name must (effectively) be unique within its hierarchy, and domain names must still be unique keystone-wide. One main reason our rules have not changed is that we support scoping to domain and project by name. Given this new hierarchy support, our naming rules will become increasingly onerous on customers. Not only for customer with deep project hierarchies, but also will complicate any support for domain hierarchies for resellers. In the future it would be ideal if you could address a node in a hierarchy with a url-style addressing scheme, for example: :: { "auth": { "identity": { ... }, "scope": { "project": { "domain": { "name": "acme.com" }, "name": "development/sas/myproject" } } } } The same addressing scheme could also be used for domains, if we require support for domain hierarchies. However, our current project and domain names are not url-safe, so we could not guarantee to support any particular hierarchical naming scheme without risk of breaking access to strangely named projects/domains. Proposed Change =============== It is proposed that we lay the groundwork to move to url-safe naming for all projects and domains. A url-safe name is defined as one that does not contain any of the `reserved` characters as defined in section 2.2 of `rfc3986 _`. In particular, we would: - Deprecate url-unsafe naming, so deprecation warnings would be logged for unsafe names. - Provide a keystone-manage option to list the ID and name of any url-unsafe projects or domains, so that such names can subsequently be updated using the regular Identity API. - Provide two configuration options (one for projects and one for domains) to enable enforcement. These would accept three values: `off`, `new`, `strict`. These would be `off` by default, which means no change in behavior. - If set to `new` then a request to create a new domain or project with a name that does not match the url safe criteria will be rejected. - If the configuration option is set to `strict`, in addition to the restrictions defined for `new`, any existing unsafely-named domains or projects will be treated as disabled for the purposes of issuing a token scoped by project/domain name. Renaming the project or domain will re-enable it. Future keystone releases would harden the above, moving towards a situation when the configuration options are eventually deprecated and url-safe naming is permanently enabled. New features we release, for example domain hierarchies for resellers, could insist that the appropriate url-safe configuration option was enabled before that feature was supported. To be clear, this proposal does not enable the actual use of hierarchical naming, rather it lays the groundwork for us to do so in the future. This proposal does not preclude the use of unicode for project and domain names (since all the `reserved` characters are coded the same in ascii and unicode). However, to utilize such an extended character set for auth or searching by name would require additional changes (for encoding and decoding) which is outside of the scope of this proposal. By allowing unicode within the strict naming option defined here, we allow customer using unicode to "go strict" as soon as they can (and hence avoiding a further road block to us being able to deprecate unsafe names). Alternatives ------------ None Data Model Impact ----------------- None REST API Impact --------------- None Security Impact --------------- None Notifications Impact -------------------- None Other End User Impact --------------------- None Performance Impact ------------------ None Other Deployer Impact --------------------- None, by default, although would require them to potentially rename projects or domains if they want to start enforcing url-safe naming. Developer Impact ---------------- None Implementation ============== Assignee(s) ----------- Primary assignee: henry-nash Work Items ---------- - Add support for new configuration options - Add deprecation logging - Add checking in create/update domain/project - Add checking in auth to prevent scoping to unsafe entities - Add support to keystone-manage for listing unsafely-named domains/projects Dependencies ============ None Testing ======= None, above and beyond unit testing Documentation Impact ==================== Changes to the Identity API to clarify naming. References ========== None