]> git.proxmox.com Git - pve-http-server.git/blob - PVE/APIServer/Formatter.pm
rework formatter registration
[pve-http-server.git] / PVE / APIServer / Formatter.pm
1 package PVE::APIServer::Formatter;
2
3 use strict;
4 use warnings;
5
6 use URI::Escape;
7
8 # generic formatter support
9 # PVE::APIServer::Formatter::* classes should register themselves here
10
11 my $formatter_hash = {};
12 my $page_formatter_hash = {};
13
14 sub register_formatter {
15 my ($format, $code) = @_;
16
17 die "formatter '$format' already defined"
18 if defined($formatter_hash->{$format});
19
20 $formatter_hash->{$format} = $code;
21 }
22
23 sub register_page_formatter {
24 my (%config) = @_;
25
26 my $format = $config{format} ||
27 die "missing format";
28
29 my $path = $config{path} ||
30 die "missing path";
31
32 my $method = $config{method} ||
33 die "missing method";
34
35 my $code = $config{code} ||
36 die "missing formatter code";
37
38 die "duplicate page formatter for '$method: $path'"
39 if defined($page_formatter_hash->{$format}->{$method}->{$path});
40
41 $page_formatter_hash->{$format}->{$method}->{$path} = $code;
42 }
43
44 sub get_formatter {
45 my ($format, $method, $path) = @_;
46
47 return undef if !defined($format);
48
49 if (defined($method) && defined($path)) {
50 my $code = $page_formatter_hash->{$format}->{$method}->{$path};
51 return $code if defined($code);
52 }
53
54 return $formatter_hash->{$format};
55 }
56
57 my $login_formatter_hash = {};
58
59 sub register_login_formatter {
60 my ($format, $code) = @_;
61
62 die "login formatter '$format' already defined"
63 if defined($login_formatter_hash->{$format});
64
65 $login_formatter_hash->{$format} = $code;
66 }
67
68 sub get_login_formatter {
69 my ($format) = @_;
70
71 return undef if !defined($format);
72
73 return $login_formatter_hash->{$format};
74 }
75
76 # some helper functions
77
78 sub extract_auth_cookie {
79 my ($cookie, $cookie_name) = @_;
80
81 return undef if !$cookie;
82
83 my $ticket = ($cookie =~ /(?:^|\s)\Q$cookie_name\E=([^;]*)/)[0];
84
85 if ($ticket && $ticket =~ m/^PVE%3A/) {
86 $ticket = uri_unescape($ticket);
87 }
88
89 return $ticket;
90 }
91
92 sub create_auth_cookie {
93 my ($ticket, $cookie_name) = @_;
94
95 my $encticket = uri_escape($ticket);
96
97 return "${cookie_name}=$encticket; path=/; secure;";
98 }
99
100 1;