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

Annotation 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 - (hide annotations) (download)
Sat Apr 16 11:29:48 2022 UTC (2 years, 1 month 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 brianr 1.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