1 use anyhow
::{bail, format_err, Error}
;
3 use proxmox_backup
::api2
;
5 use proxmox
::api
::schema
::*;
7 // Simply test if api lookup tables inside Routers and Schemas are
10 fn verify_object_schema(schema
: &ObjectSchema
) -> Result
<(), Error
> {
12 let map
= schema
.properties
;
16 for i
in 1..map
.len() {
18 if map
[i
].0 <= map
[i
-1].0 {
19 for (name
, _
, _
) in map
.iter() {
20 eprintln
!("{}", name
);
22 bail
!("found unsorted property map ({} <= {})", map
[i
].0, map
[i
-1].0);
27 for (_name
, _
, sub_schema
) in map
.iter() {
28 verify_schema(sub_schema
)?
;
34 fn verify_schema(schema
: &Schema
) -> Result
<(), Error
> {
36 Schema
::Object(obj_schema
) => {
37 verify_object_schema(obj_schema
)?
;
39 Schema
::Array(arr_schema
) => {
40 verify_schema(arr_schema
.items
)?
;
47 fn verify_access_permissions(permission
: &Permission
) -> Result
<(), Error
> {
50 Permission
::Or(list
) => {
51 for perm
in list
.iter() { verify_access_permissions(perm)?; }
53 Permission
::And(list
) => {
54 for perm
in list
.iter() { verify_access_permissions(perm)?; }
56 Permission
::Privilege(path_comp
, ..)=> {
57 let path
= format
!("/{}", path_comp
.join("/"));
58 proxmox_backup
::config
::acl
::check_acl_path(&path
)?
;
69 ) -> Result
<(), Error
>
71 verify_object_schema(info
.parameters
)
72 .map_err(|err
| format_err
!("{} {} parameters: {}", method
, path
, err
))?
;
74 verify_schema(info
.returns
)
75 .map_err(|err
| format_err
!("{} {} returns: {}", method
, path
, err
))?
;
77 verify_access_permissions(info
.access
.permission
)
78 .map_err(|err
| format_err
!("{} {} access: {}", method
, path
, err
))?
;
86 ) -> Result
<(), Error
> {
88 if dirmap
.len() >= 1 {
90 for i
in 1..dirmap
.len() {
92 if dirmap
[i
].0 <= dirmap
[i
-1].0 {
93 for (name
, _
) in dirmap
.iter() {
94 eprintln
!("{}/{}", path
, name
);
96 bail
!("found unsorted dirmap at {:?} ({} <= {})", path
, dirmap
[i
].0, dirmap
[i
-1].0);
102 for (name
, router
) in dirmap
.iter() {
103 let sub_path
= format
!("{}/{}", path
, name
);
104 verify_router(&sub_path
, router
)?
;
110 fn verify_router(path
: &str, router
: &Router
) -> Result
<(), Error
> {
112 println
!("Verify {}", path
);
114 if let Some(api_method
) = router
.get
{
115 verify_api_method("GET", path
, api_method
)?
;
117 if let Some(api_method
) = router
.put
{
118 verify_api_method("PUT", path
, api_method
)?
;
120 if let Some(api_method
) = router
.post
{
121 verify_api_method("POST", path
, api_method
)?
;
123 if let Some(api_method
) = router
.delete
{
124 verify_api_method("DELETE", path
, api_method
)?
;
127 match router
.subroute
{
128 Some(SubRoute
::Map(dirmap
)) => {
129 verify_dirmap(path
, dirmap
)?
;
131 Some(SubRoute
::MatchAll { router, param_name }
) => {
132 let path
= format
!("{}/{{{}}}", path
, param_name
);
133 verify_router(&path
, router
)?
;
142 fn verify_backup_api() -> Result
<(), Error
> {
144 let api
= &api2
::backup
::BACKUP_API_ROUTER
;
145 verify_router("backup-api", api
)?
;
151 fn verify_reader_api() -> Result
<(), Error
> {
153 let api
= &api2
::reader
::READER_API_ROUTER
;
154 verify_router("reader-api", api
)?
;
160 fn verify_root_api() -> Result
<(), Error
> {
162 let api
= &api2
::ROUTER
;
163 verify_router("root", api
)?
;