| 491 | # Get rules for a user file |
| 492 | # Return: The rules of the file or False if not allowed |
| 493 | def getUserContentRules(self, parent_content, inner_path, content): |
| 494 | user_contents = parent_content["user_contents"] |
| 495 | |
| 496 | # Delivered for directory |
| 497 | if "inner_path" in parent_content: |
| 498 | parent_content_dir = helper.getDirname(parent_content["inner_path"]) |
| 499 | user_address = re.match(r"([A-Za-z0-9]*?)/", inner_path[len(parent_content_dir):]).group(1) |
| 500 | else: |
| 501 | user_address = re.match(r".*/([A-Za-z0-9]*?)/.*?$", inner_path).group(1) |
| 502 | |
| 503 | try: |
| 504 | if not content: |
| 505 | content = self.site.storage.loadJson(inner_path) # Read the file if no content specified |
| 506 | user_urn = "%s/%s" % (content["cert_auth_type"], content["cert_user_id"]) # web/nofish@zeroid.bit |
| 507 | cert_user_id = content["cert_user_id"] |
| 508 | except Exception: # Content.json not exist |
| 509 | user_urn = "n-a/n-a" |
| 510 | cert_user_id = "n-a" |
| 511 | |
| 512 | if user_address in user_contents["permissions"]: |
| 513 | rules = copy.copy(user_contents["permissions"].get(user_address, {})) # Default rules based on address |
| 514 | else: |
| 515 | rules = copy.copy(user_contents["permissions"].get(cert_user_id, {})) # Default rules based on username |
| 516 | |
| 517 | if rules is False: |
| 518 | banned = True |
| 519 | rules = {} |
| 520 | else: |
| 521 | banned = False |
| 522 | if "signers" in rules: |
| 523 | rules["signers"] = rules["signers"][:] # Make copy of the signers |
| 524 | for permission_pattern, permission_rules in list(user_contents["permission_rules"].items()): # Regexp rules |
| 525 | if not SafeRe.match(permission_pattern, user_urn): |
| 526 | continue # Rule is not valid for user |
| 527 | # Update rules if its better than current recorded ones |
| 528 | for key, val in permission_rules.items(): |
| 529 | if key not in rules: |
| 530 | if type(val) is list: |
| 531 | rules[key] = val[:] # Make copy |
| 532 | else: |
| 533 | rules[key] = val |
| 534 | elif type(val) is int: # Int, update if larger |
| 535 | if val > rules[key]: |
| 536 | rules[key] = val |
| 537 | elif hasattr(val, "startswith"): # String, update if longer |
| 538 | if len(val) > len(rules[key]): |
| 539 | rules[key] = val |
| 540 | elif type(val) is list: # List, append |
| 541 | rules[key] += val |
| 542 | |
| 543 | # Accepted cert signers |
| 544 | rules["cert_signers"] = user_contents.get("cert_signers", {}) |
| 545 | rules["cert_signers_pattern"] = user_contents.get("cert_signers_pattern") |
| 546 | |
| 547 | if "signers" not in rules: |
| 548 | rules["signers"] = [] |
| 549 | |
| 550 | if not banned: |