GetSchema returns the schema filtered and trimmed for a specific user or nil when the user shouldn't see it at all
(s *schema.Schema, authorization schema.Authorization)
| 26 | |
| 27 | //GetSchema returns the schema filtered and trimmed for a specific user or nil when the user shouldn't see it at all |
| 28 | func GetSchema(s *schema.Schema, authorization schema.Authorization) (result *schema.Resource, err error) { |
| 29 | manager := schema.GetManager() |
| 30 | metaschema, _ := manager.Schema("schema") |
| 31 | policy, _ := manager.PolicyValidate("read", s.GetPluralURL(), authorization) |
| 32 | if policy == nil { |
| 33 | return |
| 34 | } |
| 35 | if s.IsAbstract() { |
| 36 | return |
| 37 | } |
| 38 | rawSchema := s.JSON() |
| 39 | filteredSchema := util.ExtendMap(nil, s.JSONSchema) |
| 40 | rawSchema["schema"] = filteredSchema |
| 41 | schemaProperties, schemaPropertiesOrder, schemaRequired := policy.FilterSchema( |
| 42 | util.MaybeMap(deepcopy.Copy(s.JSONSchema["properties"])), |
| 43 | util.MaybeStringList(s.JSONSchema["propertiesOrder"]), |
| 44 | util.MaybeStringList(s.JSONSchema["required"])) |
| 45 | |
| 46 | filteredSchema["properties"] = schemaProperties |
| 47 | filteredSchema["propertiesOrder"] = schemaPropertiesOrder |
| 48 | filteredSchema["required"] = schemaRequired |
| 49 | |
| 50 | permission := []string{} |
| 51 | defaultFilter := schema.CreateExcludeAllFilter() |
| 52 | for _, action := range schema.AllActions { |
| 53 | if p, _ := manager.PolicyValidate(action, s.GetPluralURL(), authorization); p != nil { |
| 54 | permission = append(permission, action) |
| 55 | filterPermission(action, schemaProperties, p.GetPropertyFilter()) |
| 56 | } else { |
| 57 | filterPermission(action, schemaProperties, defaultFilter) |
| 58 | } |
| 59 | } |
| 60 | filteredSchema["permission"] = permission |
| 61 | |
| 62 | result, err = schema.NewResource(metaschema, rawSchema) |
| 63 | if err != nil { |
| 64 | log.Warning("%s %s", result, err) |
| 65 | return |
| 66 | } |
| 67 | return |
| 68 | } |
| 69 | |
| 70 | func filterPermission(action string, schemaProperties map[string]interface{}, filter *schema.Filter) { |
| 71 | for property, rawPermissions := range schemaProperties { |