/[smecontribs]/rpms/smeserver-certificate/contribs10/smeserver-certificate-0.0.4-Add-panel-for-SM2.patch
ViewVC logotype

Contents of /rpms/smeserver-certificate/contribs10/smeserver-certificate-0.0.4-Add-panel-for-SM2.patch

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1 - (show annotations) (download)
Sat Apr 16 11:29:48 2022 UTC (2 years ago) by brianr
Branch: MAIN
CVS Tags: smeserver-certificate-0_0_4-13_el7_sme, smeserver-certificate-0_0_4-14_el7_sme, smeserver-certificate-0_0_4-11_el7_sme, smeserver-certificate-0_0_4-12_el7_sme, smeserver-certificate-0_0_4-10_el7_sme, smeserver-certificate-0_0_4-9_el7_sme, HEAD
* Wed Mar 30 2022 Brian Read <brianr@bjsystems.co.uk> 0.0.4-9.sme
- Add panel for SM2 [SME: 11926]

1 diff -urN smeserver-certificate-0.0.4.old/root/certificate.lex smeserver-certificate-0.0.4/root/certificate.lex
2 --- smeserver-certificate-0.0.4.old/root/certificate.lex 1970-01-01 01:00:00.000000000 +0100
3 +++ smeserver-certificate-0.0.4/root/certificate.lex 2022-03-31 14:29:11.569660091 +0100
4 @@ -0,0 +1,56 @@
5 +'FORM_TITLE' => ' SSL certificates management',
6 +Certificate' =>
7 +'Manage SSL certificates',
8 +'DESC_SSL_CERTIFICAT_CONFIG_PAGE' => 'This panel is made to help the managing of SSL certificates if you need to use commercial Certificates by example.<br>
9 +If you want to get back to the default SME Server certificates, simply blank all the contents and press save.<br>
10 +In case of you set wrong certificates, the server Web may crash. You will have to do a command line in a root Terminal to get back to the default certificate : <br><br>
11 +<b>signal-event certificate-revert</b><br><br>
12 +',
13 +ERROR_OPEN_KEY' =>
14 +'Impossible to open the certificates',
15 +'DESC_DOMAIN_CRT' =>
16 +'Paste Here the full certificate (server.crt)',
17 +'LABEL_DOMAIN_CRT' =>
18 +'SSL certificate',
19 +'DESC_DOMAIN_KEY' =>
20 +'Paste Here the full private key (server.key)',
21 +
22 +'LABEL_DOMAIN_KEY' =>
23 +'SSL private Key',
24 +'DESC_CERTIFICATE_CHAINFILE' =>
25 +'You may need the intermediate CA certificate as \'chain\' certificate in your clientssl profile. Paste here the full chain file',
26 +'LABEL_CERTIFICATE_CHAINFILE' =>
27 +'SSL intermediate chain certificate',
28 +
29 +'SUCCESS-CERT-WRITTEN' =>
30 +'Success - New Certificate details written',
31 +'SUCCESS-CERT-DEFAULTED' =>
32 +'Success - Certificate reverted to self-signed',
33 +'FORM_TITLE' => ' SSL certificates management',
34 +Certificate' =>
35 +'Manage SSL certificates',
36 +'DESC_SSL_CERTIFICAT_CONFIG_PAGE' => 'This panel is made to help the managing of SSL certificates if you need to use commercial Certificates by example.<br>
37 +If you want to get back to the default SME Server certificates, simply blank all the contents and press save.<br>
38 +In case of you set wrong certificates, the server Web may crash. You will have to do a command line in a root Terminal to get back to the default certificate : <br><br>
39 +<b>signal-event certificate-revert</b><br><br>
40 +',
41 +ERROR_OPEN_KEY' =>
42 +'Impossible to open the certificates',
43 +'DESC_DOMAIN_CRT' =>
44 +'Paste Here the full certificate (server.crt)',
45 +'LABEL_DOMAIN_CRT' =>
46 +'SSL certificate',
47 +'DESC_DOMAIN_KEY' =>
48 +'Paste Here the full private key (server.key)',
49 +
50 +'LABEL_DOMAIN_KEY' =>
51 +'SSL private Key',
52 +'DESC_CERTIFICATE_CHAINFILE' =>
53 +'You may need the intermediate CA certificate as \'chain\' certificate in your clientssl profile. Paste here the full chain file',
54 +'LABEL_CERTIFICATE_CHAINFILE' =>
55 +'SSL intermediate chain certificate',
56 +
57 +'SUCCESS-CERT-WRITTEN' =>
58 +'Success - New Certificate details written',
59 +'SUCCESS-CERT-DEFAULTED' =>
60 +'Success - Certificate reverted to self-signed',
61 diff -urN smeserver-certificate-0.0.4.old/root/certificate.res smeserver-certificate-0.0.4/root/certificate.res
62 --- smeserver-certificate-0.0.4.old/root/certificate.res 1970-01-01 01:00:00.000000000 +0100
63 +++ smeserver-certificate-0.0.4/root/certificate.res 2022-03-31 12:28:35.032909445 +0100
64 @@ -0,0 +1,69 @@
65 +<lexicon lang="en-us">
66 + <entry>
67 + <base>FORM_TITLE</base>
68 + <trans>
69 + SSL certificates management
70 + </trans>
71 + </entry>
72 + <entry>
73 + <base>Certificate</base>
74 + <trans>Manage SSL certificates</trans>
75 + </entry>
76 + <entry>
77 + <base>DESC_SSL_CERTIFICAT_CONFIG_PAGE</base>
78 + <trans>
79 + <![CDATA[This panel is made to help the managing of SSL certificates if you need to use commercial Certificates by example.<br>
80 + If you want to get back to the default SME Server certificates, simply blank all the contents and press save.<br>
81 + In case of you set wrong certificates, the server Web may crash. You will have to do a command line in a root Terminal to get back to the default certificate : <br><br>
82 + <b>signal-event certificate-revert</b><br><br>]]>
83 +
84 + </trans>
85 + </entry>
86 +
87 + <entry>
88 + <base>ERROR_OPEN_KEY</base>
89 + <trans>Impossible to open the certificates</trans>
90 + </entry>
91 +
92 + <entry>
93 + <base>DESC_DOMAIN_CRT</base>
94 + <trans>Paste Here the full certificate (server.crt)</trans>
95 + </entry>
96 +
97 + <entry>
98 + <base>LABEL_DOMAIN_CRT</base>
99 + <trans>SSL certificate</trans>
100 + </entry>
101 +
102 + <entry>
103 + <base>DESC_DOMAIN_KEY</base>
104 + <trans>Paste Here the full private key (server.key)</trans>
105 + </entry>
106 +
107 + <entry>
108 + <base>LABEL_DOMAIN_KEY</base>
109 + <trans>SSL private Key</trans>
110 + </entry>
111 +
112 + <entry>
113 + <base>DESC_CERTIFICATE_CHAINFILE</base>
114 + <trans>You may need the intermediate CA certificate as 'chain' certificate in your clientssl profile. Paste here the full chain file</trans>
115 + </entry>
116 +
117 + <entry>
118 + <base>LABEL_CERTIFICATE_CHAINFILE</base>
119 + <trans>SSL intermediate chain certificate</trans>
120 + </entry>
121 +
122 + <entry>
123 + <base>SUCCESS-CERT-WRITTEN</base>
124 + <trans>Success - New Certificate details written</trans>
125 + </entry>
126 +
127 + <entry>
128 + <base>SUCCESS-CERT-DEFAULTED</base>
129 + <trans>Success - Certificate reverted to self-signed</trans>
130 + </entry>
131 +
132 +</lexicon>
133 +
134 diff -urN smeserver-certificate-0.0.4.old/root/usr/share/smanager/lib/SrvMngr/Controller/Certificate.pm smeserver-certificate-0.0.4/root/usr/share/smanager/lib/SrvMngr/Controller/Certificate.pm
135 --- smeserver-certificate-0.0.4.old/root/usr/share/smanager/lib/SrvMngr/Controller/Certificate.pm 1970-01-01 01:00:00.000000000 +0100
136 +++ smeserver-certificate-0.0.4/root/usr/share/smanager/lib/SrvMngr/Controller/Certificate.pm 2022-04-16 11:52:00.000000000 +0100
137 @@ -0,0 +1,222 @@
138 +package SrvMngr::Controller::Certificate;
139 +
140 +#----------------------------------------------------------------------
141 +# heading : Configuration
142 +# description : Certificate
143 +# navigation : 6000 6750
144 +
145 +# name : Certificate, method : get, url : /certificate, ctlact : Certificate#main
146 +# name : CertificateSave, method : post, url : /certificatesave, ctlact : Certificate#save
147 +#
148 +# routes : end
149 +#
150 +#
151 +# Documentation: https://wiki.koozali.org/Certificatemanager
152 +#
153 +use strict;
154 +use warnings;
155 +use Mojo::Base 'Mojolicious::Controller';
156 +
157 +use constant FALSE => 0;
158 +use constant TRUE => 1;
159 +
160 +use Locale::gettext;
161 +use SrvMngr::I18N;
162 +use SrvMngr qw(theme_list init_session);
163 +
164 +use Data::Dumper;
165 +use esmith::util;
166 +use esmith::HostsDB;
167 +use esmith::AccountsDB;
168 +use Net::Ping;
169 +use esmith::util::network qw(:all);
170 +use Socket qw( inet_aton );
171 +
172 +
173 +#our $adb = esmith::AccountsDB->open() or die("Unable to open accounts DB");
174 +
175 +my %certificate_data = ();
176 +
177 +our $ssl_crt = '/home/e-smith/ssl.crt';
178 +our $ssl_key = '/home/e-smith/ssl.key';
179 +our $config_db = esmith::ConfigDB->open || die "Couldn't open ConfigDB\n";
180 +
181 +
182 +sub main {
183 + #
184 + # Initial page - full summary of parameters etc
185 + # Initial para from the Wiki.
186 + #
187 + my $c = shift;
188 + %certificate_data = ();
189 + read_pem($c);
190 + do_display($c);
191 +}
192 +
193 +sub do_display {
194 + #
195 + # Front parameters page
196 + #
197 + my $c = shift;
198 + $c->app->log->info( $c->log_req );
199 + my $title = $c->l("FORM_TITLE");
200 + my $modul = '';
201 + my $trt = "SETTINGS";
202 + our $db = esmith::ConfigDB->open() or die("Unable to open Configuration DB");
203 + $certificate_data{trt} = $trt;
204 + $c->stash( title => $title, modul => $modul, certificate_data => \%certificate_data );
205 + #die("here");
206 + $c->render( template => 'certificate' );
207 +
208 +}
209 +
210 +sub save{
211 + #
212 + # Save Cert details or revert to default
213 + #
214 + my $c = shift;
215 + my $retmsg = write_pem($c);
216 + if (index($retmsg,"SUCCESS") != -1){$certificate_data{success} = $retmsg;}
217 + else {$certificate_data{error} = $retmsg;}
218 + read_pem($c);
219 + do_display($c);
220 +}
221 +
222 +
223 +sub read_pem{
224 + # Read in cert stuff to shared data
225 + my $c = shift;
226 + my $dir = '';
227 + my $ret;
228 + my $domain = $config_db->get_value('DomainName');
229 +
230 + my $dir = $ssl_crt;
231 + my $pem = "$domain.crt";
232 + $certificate_data{"domain.crt"} = get_pem_file($dir,$pem);
233 +
234 + $dir = $ssl_key;
235 + $pem = "$domain.crt";
236 + $certificate_data{"domain.key"} = get_pem_file($dir,$pem);
237 +
238 + $dir = $ssl_crt;
239 + $pem = "chain.pem";
240 + $certificate_data{"chain.pem"} = get_pem_file($dir,$pem);
241 +
242 + return "ok";
243 +}
244 +
245 +sub get_pem_file{
246 + my $dir = shift;
247 + my $pem = shift;
248 + my $ret;
249 + if (! open (PEM, "<$dir/$pem")){
250 + #$fm->error('ERROR_OPEN_PEM','FIRST');
251 + # Tell the user something bad has happened
252 + return "";
253 + }
254 + while (<PEM>){
255 + $ret .= $_;
256 + }
257 + close PEM;
258 + return $ret;
259 +}
260 +
261 +
262 +sub write_pem{
263 + my $q = shift;
264 + my $domain = $config_db->get_value('DomainName')|| die "Couldn't open ConfigDB\n";
265 +
266 + my $domain_crt = $q->param('ca_crt');
267 + my $domain_key = $q->param('ca_key');
268 + my $chain_crt = $q->param('chain_crt_file');
269 +
270 +
271 +if (($domain_crt eq '') && ($domain_key eq ''))
272 + {
273 + my $ssl_crt = '/home/e-smith/ssl.crt';
274 + my $ssl_key = '/home/e-smith/ssl.key';
275 +
276 + my $domain = $config_db->get_value('DomainName') || die "Couldn't open ConfigDB\n";
277 + my $server = $config_db->get_value('SystemName') || die "Couldn't open ConfigDB\n";
278 +
279 + my $crt_path = "$ssl_crt" . '/' . $domain . '.crt' || '';
280 + my $key_path = "$ssl_key" . '/' . $domain . '.key' || '';
281 + my $chain_path = "$ssl_crt" . '/chain.pem' || '';
282 +
283 + #we return to the default certificate of sme and we remove the db entry CertificateChainFile
284 + system("/sbin/e-smith/db configuration delprop modSSL crt");
285 + system("/sbin/e-smith/db configuration delprop modSSL key");
286 + system("/sbin/e-smith/db configuration delprop modSSL CertificateChainFile");
287 +
288 + system("/sbin/e-smith/expand-template /home/e-smith/ssl.pem/pem");
289 + # system("/sbin/e-smith/expand-template /etc/httpd/conf/httpd.conf");
290 + # system("/sbin/service httpd-e-smith restart");
291 + # system("/sbin/e-smith/signal-event ldap-update");
292 + # system("/sbin/e-smith/signal-event email-update");
293 +
294 + system("/sbin/e-smith/signal-event ssl-update");
295 +
296 + if (( -f $crt_path) && ( -f $key_path )) {
297 + system("/bin/rm $ssl_crt/$domain.crt");
298 + system("/bin/rm $ssl_key/$domain.key");
299 + system("/bin/rm $ssl_crt/chain.pem");
300 + }
301 + return 'SUCCESS-CERT-DEFAULTED';
302 +
303 + }
304 +
305 +elsif (($domain_crt ne '') && ($domain_key ne ''))
306 + {
307 + if (! open (CRT, ">$ssl_crt/$domain.crt")){
308 + #$fm->error('ERROR_OPEN_KEY','FIRST');
309 + # Tell the user something bad has happened
310 + return 'ERROR_OPEN_KEY';
311 + }
312 + print CRT $domain_crt;
313 + close CRT;
314 +
315 + if (! open (KEY, ">$ssl_key/$domain.key")){
316 + #$fm->error('ERROR_OPEN_KEY','FIRST');
317 + # Tell the user something bad has happened
318 + return 'ERROR_OPEN_KEY';
319 + }
320 + print KEY $domain_key;
321 + close KEY;
322 +
323 + if (! open (CHAIN, ">$ssl_crt/chain.pem")){
324 + #$fm->error('ERROR_OPEN_KEY','FIRST');
325 + # Tell the user something bad has happened
326 + return 'ERROR_OPEN_KEY';
327 + }
328 + print CHAIN $chain_crt;
329 + close CHAIN;
330 +
331 + # Restrict permissions on sensitive data
332 + esmith::util::chownFile("root", "root","$ssl_key/$domain.key");
333 + esmith::util::chownFile("root", "root","$ssl_crt/$domain.crt");
334 + chmod 0600, "$ssl_key/$domain.key";
335 + chmod 0600, "$ssl_crt/$domain.crt";
336 +
337 + #we load new certificates in db
338 + system("/sbin/e-smith/db configuration setprop modSSL crt $ssl_crt/$domain.crt");
339 + system("/sbin/e-smith/db configuration setprop modSSL key $ssl_key/$domain.key");
340 +
341 + #we look if the certificate chain file is not equal to nothing, if not we load in db
342 + if ($chain_crt ne '') {
343 + system("/sbin/e-smith/db configuration setprop modSSL CertificateChainFile /home/e-smith/ssl.crt/chain.pem");
344 + }
345 +
346 + system("/sbin/e-smith/expand-template /home/e-smith/ssl.pem/pem");
347 + # system("/sbin/e-smith/expand-template /etc/httpd/conf/httpd.conf");
348 + # system("/sbin/service httpd-e-smith restart >/dev/null 2>&1");
349 + # system("/sbin/service httpd-e-smith restart");
350 + # system("/sbin/e-smith/signal-event ldap-update");
351 + # system("/sbin/e-smith/signal-event email-update");
352 +
353 + system("/sbin/e-smith/signal-event ssl-update");
354 +
355 + return 'SUCCESS-CERT-WRITTEN';
356 + }
357 +}
358 +
359 +1;
360 diff -urN smeserver-certificate-0.0.4.old/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Certificate/certificate_en.lex smeserver-certificate-0.0.4/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Certificate/certificate_en.lex
361 --- smeserver-certificate-0.0.4.old/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Certificate/certificate_en.lex 1970-01-01 01:00:00.000000000 +0100
362 +++ smeserver-certificate-0.0.4/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Certificate/certificate_en.lex 2022-03-31 14:29:11.000000000 +0100
363 @@ -0,0 +1,56 @@
364 +'FORM_TITLE' => ' SSL certificates management',
365 +Certificate' =>
366 +'Manage SSL certificates',
367 +'DESC_SSL_CERTIFICAT_CONFIG_PAGE' => 'This panel is made to help the managing of SSL certificates if you need to use commercial Certificates by example.<br>
368 +If you want to get back to the default SME Server certificates, simply blank all the contents and press save.<br>
369 +In case of you set wrong certificates, the server Web may crash. You will have to do a command line in a root Terminal to get back to the default certificate : <br><br>
370 +<b>signal-event certificate-revert</b><br><br>
371 +',
372 +ERROR_OPEN_KEY' =>
373 +'Impossible to open the certificates',
374 +'DESC_DOMAIN_CRT' =>
375 +'Paste Here the full certificate (server.crt)',
376 +'LABEL_DOMAIN_CRT' =>
377 +'SSL certificate',
378 +'DESC_DOMAIN_KEY' =>
379 +'Paste Here the full private key (server.key)',
380 +
381 +'LABEL_DOMAIN_KEY' =>
382 +'SSL private Key',
383 +'DESC_CERTIFICATE_CHAINFILE' =>
384 +'You may need the intermediate CA certificate as \'chain\' certificate in your clientssl profile. Paste here the full chain file',
385 +'LABEL_CERTIFICATE_CHAINFILE' =>
386 +'SSL intermediate chain certificate',
387 +
388 +'SUCCESS-CERT-WRITTEN' =>
389 +'Success - New Certificate details written',
390 +'SUCCESS-CERT-DEFAULTED' =>
391 +'Success - Certificate reverted to self-signed',
392 +'FORM_TITLE' => ' SSL certificates management',
393 +Certificate' =>
394 +'Manage SSL certificates',
395 +'DESC_SSL_CERTIFICAT_CONFIG_PAGE' => 'This panel is made to help the managing of SSL certificates if you need to use commercial Certificates by example.<br>
396 +If you want to get back to the default SME Server certificates, simply blank all the contents and press save.<br>
397 +In case of you set wrong certificates, the server Web may crash. You will have to do a command line in a root Terminal to get back to the default certificate : <br><br>
398 +<b>signal-event certificate-revert</b><br><br>
399 +',
400 +ERROR_OPEN_KEY' =>
401 +'Impossible to open the certificates',
402 +'DESC_DOMAIN_CRT' =>
403 +'Paste Here the full certificate (server.crt)',
404 +'LABEL_DOMAIN_CRT' =>
405 +'SSL certificate',
406 +'DESC_DOMAIN_KEY' =>
407 +'Paste Here the full private key (server.key)',
408 +
409 +'LABEL_DOMAIN_KEY' =>
410 +'SSL private Key',
411 +'DESC_CERTIFICATE_CHAINFILE' =>
412 +'You may need the intermediate CA certificate as \'chain\' certificate in your clientssl profile. Paste here the full chain file',
413 +'LABEL_CERTIFICATE_CHAINFILE' =>
414 +'SSL intermediate chain certificate',
415 +
416 +'SUCCESS-CERT-WRITTEN' =>
417 +'Success - New Certificate details written',
418 +'SUCCESS-CERT-DEFAULTED' =>
419 +'Success - Certificate reverted to self-signed',
420 diff -urN smeserver-certificate-0.0.4.old/root/usr/share/smanager/themes/default/templates/certificate.html.ep smeserver-certificate-0.0.4/root/usr/share/smanager/themes/default/templates/certificate.html.ep
421 --- smeserver-certificate-0.0.4.old/root/usr/share/smanager/themes/default/templates/certificate.html.ep 1970-01-01 01:00:00.000000000 +0100
422 +++ smeserver-certificate-0.0.4/root/usr/share/smanager/themes/default/templates/certificate.html.ep 2022-04-16 11:53:00.000000000 +0100
423 @@ -0,0 +1,101 @@
424 +% layout 'default', title => "Sme server 2 - Certificate Manager", share_dir => './';
425 +
426 +% content_for 'module' => begin
427 +
428 +<div id="module" class="module certificate-panel">
429 +
430 + % if ($config->{debug} == 1) {
431 + <p>
432 + %= dumper $c->current_route
433 + </p>
434 + % }
435 +
436 + <h1><%=$title%></h1>
437 + %= $modul
438 +
439 + %if ($certificate_data->{first}) {
440 + <br><p>
441 + %=$c->render_to_string(inline =>$c->l($certificate_data->{first}))
442 + </p>
443 +
444 + %} elsif ($certificate_data->{success}) {
445 + <div class='sme-border'>
446 + <h2> Operation Status Report - success</h2><p>
447 + <font color=green>
448 + %= $c->l($certificate_data->{success});
449 + </font>
450 + </p>
451 + </div>
452 +
453 + %} elsif ($certificate_data->{error}) {
454 + <div class='sme-error'>
455 + <h2> Operation Status Report - error</h2><p>
456 + <font color=red>
457 + %= $c->l($certificate_data->{error});
458 + </font>
459 + </p>
460 + </div>
461 +
462 + %} elsif ($certificate_data->{warning}) {
463 + <div class='sme-warning'>
464 + <h2> Operation Status Report - warning</h2><p>
465 + <font color=orange>
466 + %= $c->l($certificate_data->{warning});
467 + </font>
468 + </p>
469 + </div>
470 +
471 + %}
472 + %= form_for '/certificatesave' => (method => 'POST') => begin
473 + % my $btn = l('SAVE');
474 + %== l 'DESC_SSL_CERTIFICAT_CONFIG_PAGE'
475 +
476 + <span class=label>
477 + <strong>
478 + %=l 'LABEL_DOMAIN_CRT'
479 + </strong>
480 + %=l 'DESC_DOMAIN_CRT'
481 + <br />
482 + </span><span class=data>
483 + % param 'ca_crt' => $certificate_data->{'domain.crt'} unless param 'ca_crt';
484 + %= text_area 'ca_crt' , cols=>60, rows=>15
485 + </span><br>
486 + <br />
487 +
488 + <span class=label>
489 + <strong>
490 + %=l 'LABEL_DOMAIN_KEY'
491 + </strong>
492 + %=l 'DESC_DOMAIN_KEY'
493 + </span><span class=data>
494 + % param 'ca_key' => $certificate_data->{'domain.key'} unless param 'ca_key';
495 + %= text_area 'ca_key' , cols=>60, rows=>15
496 + </span><br>
497 + <br />
498 +
499 + <span class=label>
500 + <strong>
501 + %=l 'LABEL_CERTIFICATE_CHAINFILE'
502 + </strong>
503 + %=l 'DESC_CERTIFICATE_CHAINFILE'
504 + </span><span class=data>
505 + % param 'chain_crt_file' => $certificate_data->{'chain.pem'} unless param 'chain_crt_file';
506 + %= text_area 'chain_crt_file' , cols=>60, rows=>15
507 + </span><br>
508 + <br />
509 + %= submit_button "$btn", class => 'action'
510 + </div>
511 +%end
512 +
513 +%= stylesheet begin
514 +span.label {
515 + width:46em;
516 + font-weight:normal;
517 +}
518 +
519 +span.label strong {
520 + text-align:left;
521 +}
522 +%end
523 +
524 +%end
525 \ No newline at end of file

admin@koozali.org
ViewVC Help
Powered by ViewVC 1.2.1 RSS 2.0 feed