It is possible to have overlapping blocks. For instance you can have a block on your user as well as a hard block on an IP address (that also applies to your user). Likewise, you can have an IP Range block that could apply to your IP address and (possibly) your user (if it's a hard block).
`User::getBlockedStatus()`picks a block to use and that is what gets used. This becomes a problem when overlapping blocks have different configuration.
For instance, if a user is partially blocked from Saturn and IP address (hard block) is partially blocked from Mars, The user should be blocked from both Saturn and Mars. Likewise, if either of these blocks are sitewide blocks, the user should be sitewide blocked.
Likewise, if a user is IP blocked and has an overlapping IP Range block, the user should have all of the restrictions of both blocks.
When blocks are enforced, all blocks that apply to the user should be gathered (User, IP, Range, Cookie, Proxy, etc.) and should be merged together into a single block (perhaps of a new class?) with the most restrictive restriction of the set. For instance if one block is partial and the other is sitewide, then the sitewide block would take precedence. If all blocks are partial, than all fo the restrictions will be merged together.