Runner: Merge development into master for release
[slapos.git] / software / unstable / mioga / mioga-patch
1 diff --git a/INSTALL b/INSTALL
2 index ef0f369..b275a48 100644
3 --- a/INSTALL
4 +++ b/INSTALL
5 @@ -382,6 +382,8 @@ A default init script is provided in file web/conf/mioga2.init.d. This script wo
6  Additional configuration for the Search engine
7  ----------------------------------------------
8  
9 +The default init script starts the search engine daemon.
10 +
11  You must edit the crawl_sample.sh to specify default location for configuration files and rename it to crawl.sh.
12  This script must be run by cron in a day basis with apache user (www-data for Debian)
13  
14 diff --git a/Makefile.PL b/Makefile.PL
15 index 3582d20..c24e217 100644
16 --- a/Makefile.PL
17 +++ b/Makefile.PL
18 @@ -20,8 +20,10 @@
19  # ============================================================================
20  
21  
22 +use Cwd;
23  use ExtUtils::MakeMaker;
24  use ExtUtils::MakeMaker::Config;
25 +use File::Find;
26  
27  # ****************************************************************************
28  # 
29 @@ -67,6 +69,7 @@ sub CheckPreDepends {
30  
31  my $disable_check = grep {lc($_) eq 'disable_check'} @ARGV;
32  
33 +if (! $disable_check) {
34  CheckPreDepends({ # 'Data::Dumper' => '2.101',
35                   # 'DBI'          => '1.13',
36                   # 'DBD::Pg'      => '1.01',
37 @@ -75,7 +78,8 @@ CheckPreDepends({ # 'Data::Dumper' => '2.101',
38                   'Error'        => '0.15',
39                   # 'Net::LDAP'    => '0.25',
40                   # 'Unicode::String' => '2.06',
41 -             });
42 +          })
43 +}
44      
45  require MiogaConf;
46      
47 @@ -115,7 +119,7 @@ my $docsubdirs = "docs";
48  # ----------------------------------------------------------------------------
49  sub MY::processPL {
50  return '
51 -# Not realy in the good section, but at a good place:
52 +# Not really in the good section, but at a good place:
53  # between "all" and next "tardist"
54  
55  include config.mk
56 @@ -124,10 +128,7 @@ tardist: doc
57  dist: doc
58  install ::
59         if test -e $(TMP_DIR) ; then \
60 -            if test -d $(TMP_DIR) ; then \
61 -                ( su - $(APACHE_USER) -c "id" -s /bin/sh || \
62 -                    ( echo "===> Problem with \"$(APACHE_USER)\" user" ; exit 1 ) ) \
63 -            else \
64 +            if ! test -d $(TMP_DIR) ; then \
65                  echo "===> File $(TMP_DIR) exists but is not a directory ..." ; \
66                  exit 1 ; \
67              fi \
68 @@ -156,6 +157,31 @@ install-all ::
69  
70         (cd web && $(MAKE) setperms) || exit 1;
71  
72 +slapos-compilation :: install
73 +       for i in bin locales web ; \
74 +       do \
75 +               (cd $$i && $(MAKE) install) || exit 1;\
76 +       done
77 +       # Create symlinks for static content that can be shared among all SlapOS instances      
78 +       for i in var/lib/Mioga2/static var/lib/Mioga2/conf/themes/default var/lib/Mioga2/conf/xsl; do \
79 +               mkdir -p `dirname "$(MIOGA_STATIC)/$$i"` && \
80 +               mv "$(MIOGA_BASE)/$$i" "$(MIOGA_STATIC)/$$i" && \
81 +               ln -s "$(MIOGA_STATIC)/$$i" "$(MIOGA_BASE)/$$i"; \
82 +       done
83 +       # copy a minimal build system into mioga/build
84 +       mkdir -p "$(MIOGA_BUILDINST)"
85 +       cp -R --parents \
86 +               Makefile.PL sql web/conf web/skel conf bin/search/crawl_sample.sh \
87 +               "$(MIOGA_BUILDINST)"
88 +
89 +slapos-instantiation ::
90 +       rm -Rf web/conf/apache; (cd web/conf && $(MAKE) apache)
91 +
92 +       for i in web/conf conf web/skel sql ; \
93 +       do \
94 +               (cd $$i && $(MAKE) install) || exit 1;\
95 +       done
96 +
97  doc:
98         for i in ' . $docsubdirs . ' ; \
99         do \
100 @@ -176,9 +202,18 @@ installall: install install-all
101  # 
102  # ----------------------------------------------------------------------------
103  
104 +my $Mioga2_pm = 'lib/Mioga2.pm';
105 +if ((not -e $Mioga2_pm) and exists($ENV{MIOGA_SITEPERL})) {
106 +    my $findfile = sub {
107 +        if ($_ eq 'Mioga2.pm') {
108 +            $Mioga2_pm = $File::Find::name;
109 +        }
110 +    };
111 +    find($findfile, $ENV{MIOGA_SITEPERL});
112 +}; 
113  WriteMakefile(
114     'NAME'  => 'Mioga',
115     'DIR'   => ['bin', 'web',  'locales', 'docs', 'sql'],
116 -   'VERSION_FROM' => 'lib/Mioga2.pm',
117 +   'VERSION_FROM' => $Mioga2_pm,
118  );
119  
120 diff --git a/bin/mailinglist/miogamailinglist.pl b/bin/mailinglist/miogamailinglist.pl
121 index 80668e2..fa1603a 100755
122 --- a/bin/mailinglist/miogamailinglist.pl
123 +++ b/bin/mailinglist/miogamailinglist.pl
124 @@ -205,11 +205,11 @@ sub MsgSendStock
125  sub CheckUTF8 {
126      my ($str) = @_;
127      
128 -    my $conv    = Text::Iconv->new('utf8', 'utf8');
129 +    my $conv    = Text::Iconv->new('UTF-8', 'UTF-8');
130      my $tmp_str = $conv->convert($str);
131      unless ($tmp_str) {
132          my $charset = detect($str) || 'iso-8859-15'; # defaults to latin9
133 -        $conv = Text::Iconv->new($charset, "utf8");
134 +        $conv = Text::Iconv->new($charset, "UTF-8");
135          $str  = $conv->convert($str);
136      }
137      return $str;
138 diff --git a/bin/notifier/searchengine.pl b/bin/notifier/searchengine.pl
139 index efd1ca2..fc5ba67 100755
140 --- a/bin/notifier/searchengine.pl
141 +++ b/bin/notifier/searchengine.pl
142 @@ -39,8 +39,7 @@ if (!open(FIFO, "+>$fifo")) {
143      syslog('err', "Can't open fifo: $!. Exiting...");
144  }
145  my $flags   = fcntl(FIFO, F_GETFL, 0);
146 -
147 -
148 +my $crawler = $config->GetBinariesDir()."/crawl.sh";
149  # MAIN LOOP
150  
151  my %instances;
152 @@ -53,7 +52,7 @@ while (1) {
153                 $instances{$line} += 1;
154      }
155         foreach my $inst (keys(%instances)) {
156 -               system("/usr/local/bin/crawl.sh $inst");
157 +               system("$crawler $inst");
158         }
159      fcntl(FIFO, F_SETFL, $flags);
160  }
161 diff --git a/conf/Config.xml b/conf/Config.xml
162 index e614cda..3a9b7e3 100644
163 --- a/conf/Config.xml
164 +++ b/conf/Config.xml
165 @@ -3,6 +3,9 @@
166    <version module="Mioga2"/>
167  
168    <config>
169 +    <parameter name="init_sql" question="Initialize database ?"
170 +              type="bool" default="no" xpath="/init_sql"/>
171 +
172      <parameter name="instance_ident" question="First Mioga instance Identifier ?"
173                 type="text" default="Mioga"
174                 xpath="/instance_ident"/>
175 @@ -35,8 +38,18 @@
176      <parameter name="authentication" question="Authentification method ?" 
177                 type="enum" default="Mioga2" values="Mioga2"
178                 xpath="/authentication"/>
179 -    
180 +
181 +    <parameter name="bin_dir" question="Directory for helper scripts and binaries ?" 
182 +               type="text" default="/usr/local/bin"
183 +               xpath="/bin_dir"/>
184 +
185      <parameter name="Database settings" type="submenu">
186 +      <parameter name="db_host" question=" Mioga database server name or address ?" 
187 +                 type="text" default="localhost"
188 +                 xpath="/database/DBhost"/>              
189 +      <parameter name="db_port" question=" Mioga database server port ?" 
190 +                 type="text" default="5432"
191 +                 xpath="/database/DBport"/>              
192        <parameter name="db_name" question=" Name of Mioga database ?" 
193                   type="text" default="mioga2"
194                   xpath="/database/DBname"/>              
195 @@ -462,7 +475,6 @@
196         <app ident="Portal" package="Mioga2::Portal"/>
197         <app ident="Search" package="Mioga2::Search"/>
198      <app ident="Magellan" package="Mioga2::Magellan"/>
199 -    <app ident="Mermoz" package="Mioga2::Mermoz"/>
200      <app ident="RSS" package="Mioga2::RSS"/>
201      <app ident="Narkissos" package="Mioga2::Narkissos"/>
202      <app ident="Colbert" package="Mioga2::Colbert"/>
203 @@ -476,7 +488,7 @@
204         <mioglet ident="Workspace" package="Mioga2::Portal::WSMioglet"/>
205         <mioglet ident="Organizer" package="Mioga2::Portal::OrgMioglet"/>
206         <mioglet ident="News" package="Mioga2::Portal::NewsMioglet"/>
207 -       <mioglet ident="File" package="Mioga2::Portal::FileMioglet"/>
208 +       <mioglet ident="File" package="Miorouga2::Portal::FileMioglet"/>
209         <mioglet ident="Articles" package="Mioga2::Portal::ArticlesMioglet"/>
210      <mioglet ident="Poll" package="Mioga2::Portal::PollMioglet"/>
211         <mioglet ident="Search" package="Mioga2::Portal::SearchMioglet"/>
212 diff --git a/lib/Mioga2/Bottin.pm b/lib/Mioga2/Bottin.pm
213 index ba4cd8d..0db5651 100644
214 --- a/lib/Mioga2/Bottin.pm
215 +++ b/lib/Mioga2/Bottin.pm
216 @@ -1742,11 +1742,11 @@ sub InitSuperAdminMode {
217  sub CheckUTF8 {
218      my ($str) = @_;
219      
220 -    my $conv    = Text::Iconv->new('utf8', 'utf8');
221 +    my $conv    = Text::Iconv->new('UTF-8', 'UTF-8');
222      my $tmp_str = $conv->convert($str);
223      unless ($tmp_str) {
224 -        my $charset = detect($str) || 'iso-8859-15'; # defaults to latin9
225 -        $conv = Text::Iconv->new($charset, "utf8");
226 +        my $charset = detect($str) || 'ISO-8859-15'; # defaults to latin9
227 +        $conv = Text::Iconv->new($charset, "UTF-8");
228          $str  = $conv->convert($str);
229      }
230      return $str;
231 diff --git a/lib/Mioga2/Classes/URI.pm b/lib/Mioga2/Classes/URI.pm
232 index 8678b33..bf97e71 100644
233 --- a/lib/Mioga2/Classes/URI.pm
234 +++ b/lib/Mioga2/Classes/URI.pm
235 @@ -75,15 +75,16 @@ sub new {
236    
237    # convert uri to UTF-8
238    my $uri     = uri_unescape($options{uri});
239 +    
240    
241    # attempt to see if uri is utf8 to avoid detection
242 -  my $conv    = Text::Iconv->new('utf8', 'utf8');
243 +  my $conv    = Text::Iconv->new('UTF-8', 'UTF-8');
244    my $tmp_uri = $conv->convert($uri);
245 -  
246 +
247    unless ($tmp_uri) {
248 -    my $charset = detect($uri) || 'iso-8859-15'; # defaults to latin9
249 +    my $charset = detect($uri) || 'ISO-8859-15'; # defaults to latin9
250      warn "charset = '$charset' for uri = '$uri'" if $debug;
251 -    $conv = Text::Iconv->new($charset, "utf8");
252 +    $conv = Text::Iconv->new($charset, "UTF-8");
253      $uri  = $conv->convert($uri);
254      warn "==> converted uri = '$uri'" if $debug;
255    }
256 diff --git a/lib/Mioga2/Config.pm b/lib/Mioga2/Config.pm
257 index b088823..4edac62 100644
258 --- a/lib/Mioga2/Config.pm
259 +++ b/lib/Mioga2/Config.pm
260 @@ -28,7 +28,7 @@ Config.pm: Access class to the current Mioga instance configuration.
261  This module permits to access to the current Mioga instance
262  configuration parameters.
263  
264 -=head1 METHODS DESRIPTION
265 +=head1 METHODS DESCRIPTION
266  
267  =cut
268  
269 diff --git a/lib/Mioga2/DAVFS.pm b/lib/Mioga2/DAVFS.pm
270 index b56c4ad..7810f82 100644
271 --- a/lib/Mioga2/DAVFS.pm
272 +++ b/lib/Mioga2/DAVFS.pm
273 @@ -141,10 +141,11 @@ use Mioga2::tools::APIAuthz;
274  use Mioga2::tools::database;
275  use Mioga2::tools::string_utils;
276  use Mioga2::tools::Convert;
277 +use Net::INET6Glue::INET_is_INET6;
278  use XML::LibXML ();
279  use Mioga2::Constants;
280  
281 -my $debug = 0;
282 +my $debug = 5;
283  
284  my $MULTI_STATUS       = 207;  # code DAV for the Multi-status response
285  
286 @@ -756,13 +757,17 @@ sub make_request {
287         my $host = $self->{host};
288         my $port = $self->{port};
289  
290 +    my $hostport = $host;
291 +    $hostport = '['.$hostport.']' if $host =~ /:.*:/;
292 +    $hostport .= ':'.$port;
293 +
294         my $dav_uri   = $config->GetDAVBasePath;
295         my $mioga_uri = $config->GetBasePath;
296  
297         my $orig_uri = Mioga2::Classes::URI->new( uri => $callbacks->{uri}->() );
298         my $uri      = $orig_uri->as_string;
299         $uri =~ s/^$mioga_uri/$dav_uri/;
300 -       $uri = Mioga2::Classes::URI->new( uri => "$protocol://$host:$port$uri" )
301 +       $uri = Mioga2::Classes::URI->new( uri => "$protocol://$hostport$uri" )
302           ->as_string;
303         print STDERR "[Mioga2::DAVFS::make_request] uri = $uri\n" if $debug;
304  
305 @@ -774,7 +779,7 @@ sub make_request {
306  
307                 # process headers
308                 if ( $header =~ /^destination/i && $value !~ $dav_uri ) {
309 -                       $value =~ s!(//)[^/]+$mioga_uri!$1$host$dav_uri!;
310 +                       $value =~ s!(//)[^/]+$mioga_uri!$1$hostport$dav_uri!; # was only $host before!
311                         $value = Mioga2::Classes::URI->new( uri => $value )->as_string;
312                         $value = $self->escapeSpecialChars($value);
313                 }
314 diff --git a/lib/Mioga2/Database.pm b/lib/Mioga2/Database.pm
315 index 4afa54b..ca8368c 100644
316 --- a/lib/Mioga2/Database.pm
317 +++ b/lib/Mioga2/Database.pm
318 @@ -61,7 +61,7 @@ sub new {
319         my $self = { };
320         bless($self, $class);
321  
322 -       for my $attr (qw/DBIlogin DBIpasswd DBIdriver DBname/) {
323 +       for my $attr (qw/DBhost DBport DBIlogin DBIpasswd DBIdriver DBname/) {
324                 if (!defined ($attributes{$attr})) {
325                         throw Mioga2::Exception::DB ("[Mioga2::Database::new]", "Cannot connect to database: " . $DBI::errstr);
326                 }
327 @@ -72,8 +72,10 @@ sub new {
328         my $dbiPassword = $self->{database}->{DBIpasswd};
329         my $dbDriver = $self->{database}->{DBIdriver};
330         my $dbName = $self->{database}->{DBname};
331 +    my $dbHost = $self->{database}->{DBhost};
332 +    my $dbPort = $self->{database}->{DBport};
333  
334 -       my $datasource = "dbi:$dbDriver:dbname=$dbName";
335 +       my $datasource = "dbi:$dbDriver:dbname=$dbName;host=$dbHost;port=$dbPort";
336  
337         $self->{dbh} = DBI->connect($datasource, $dbiUser, $dbiPassword);
338  
339 diff --git a/lib/Mioga2/Exception/DB.pm b/lib/Mioga2/Exception/DB.pm
340 index 7ce5020..dd29d83 100644
341 --- a/lib/Mioga2/Exception/DB.pm
342 +++ b/lib/Mioga2/Exception/DB.pm
343 @@ -1,3 +1,4 @@
344 +
345  # ============================================================================
346  # Mioga2 Project (C) 2003-2007 The Mioga2 Project
347  #
348 @@ -53,6 +54,7 @@ sub new {
349      my($class, $function, $errDB, $errStr, $sql) = @_;
350         my $self = $class->SUPER::new(-text => "$errStr : $errDB");
351         $self->{errDB} = $errDB;
352 +    $self->{errStr} =  $errStr;
353         $self->{sql} = $sql;
354         $self->{function} = $function;
355         return $self;
356 @@ -76,6 +78,27 @@ sub as_string
357         return $string;
358  }
359  
360 +# ----------------------------------------------------------------------------
361 +=head2 getDBerr ()
362 +Return the error code as sent by the database connector.
363 +=cut 
364 +# ----------------------------------------------------------------------------
365 +sub getDBerr {
366 +    my ($self) = @_;
367 +    return $self->{errDB};
368 +}
369 +
370 +# ----------------------------------------------------------------------------
371 +=head2 getDBerrstr ()
372 +Return the error string as sent by the database connector.
373 +=cut 
374 +# ----------------------------------------------------------------------------
375 +sub getDBerrstr {
376 +    my ($self) = @_;
377 +    return $self->{errStr};
378 +}
379 +
380 +
381  # ============================================================================
382  
383  =head1 PRIVATE METHODS DESCRIPTION
384 diff --git a/lib/Mioga2/InstanceList.pm b/lib/Mioga2/InstanceList.pm
385 index 3e2cf7a..a676a1b 100644
386 --- a/lib/Mioga2/InstanceList.pm
387 +++ b/lib/Mioga2/InstanceList.pm
388 @@ -423,7 +423,9 @@ sub Store {
389                 $conf->RunHooks($self->{config}->{miogaconf});
390  
391                 # Run crawl.sh to initialize search engine database
392 -               my $crawlcmd = $self->{config}->{miogaconf}->GetMiogaPrefix () . "/bin/mioga2_index.pl --conf=" . $self->{config}->GetMiogaConfPath () . ' --search_conf=' . $self->{config}->GetInstallPath . "/conf/search_conf.xml" . ' ' . $self->Get ('ident');
393 +               my $crawlcmd = $self->{config}->{miogaconf}->GetMiogaPrefix () . "/bin/mioga2_index.pl --conf=" . $self->{config}->GetMiogaConfPath () 
394 +                       . ' --search_conf=' . $self->{config}->{miogaconf}->GetInstallDir()."/conf/search_conf.xml" 
395 +                       . ' '. $self->Get ('ident');
396                 system ("$crawlcmd");
397         }
398         elsif (scalar (keys (%{$self->{update}}))) {
399 diff --git a/lib/Mioga2/Magellan.pm b/lib/Mioga2/Magellan.pm
400 index 86e2e42..4b3814a 100644
401 --- a/lib/Mioga2/Magellan.pm
402 +++ b/lib/Mioga2/Magellan.pm
403 @@ -327,10 +327,13 @@ sub GetNodes {
404                         $mygroup = $group;
405                 }
406  
407 +        my $host = $config->GetMiogaConf()->GetDAVHost();
408 +        $host = "[${host}]" if $host =~ /:.*?:/;
409 +
410          my $resources = Mioga2::Magellan::DAV::GetCollection(
411              $context,
412              $context->GetSessionToken,
413 -            $config->GetMiogaConf ()->GetDAVProtocol () . "://" . $config->GetMiogaConf ()->GetDAVHost () . ":" . $config->GetMiogaConf ()->GetDAVPort (), $node
414 +            $config->GetMiogaConf ()->GetDAVProtocol () . "://" . $host . ":" . $config->GetMiogaConf ()->GetDAVPort (), $node
415          );
416  
417                 $inconsistent = pop (@$resources);
418 @@ -853,7 +856,7 @@ sub GetResource {
419                         );
420                         print STDERR "mime = $mime\n content= $content\n" if ($debug);
421                         if ($mime) {
422 -                               #my $conv = Text::Iconv->new( 'utf8', 'utf8' );
423 +                               #my $conv = Text::Iconv->new( 'UTF-8', 'UTF-8' );
424                                 #my $encoding = $conv->convert($content);
425                                 #if ($encoding) {
426                                 if ($mime =~ /(application\/xml)|(text\/)|(application\/xsl)/)
427 diff --git a/lib/Mioga2/Magellan/Archive.pm b/lib/Mioga2/Magellan/Archive.pm
428 index 842ae90..3b9e7f7 100644
429 --- a/lib/Mioga2/Magellan/Archive.pm
430 +++ b/lib/Mioga2/Magellan/Archive.pm
431 @@ -163,7 +163,7 @@ sub Content
432          return undef;
433      }
434  
435 -    my $conv  = Text::Iconv->new('utf8', 'utf8');
436 +    my $conv  = Text::Iconv->new('UTF-8', 'UTF-8');
437      my %folders;
438      while(my $file = <PRG>) {
439        chomp($file);
440 diff --git a/lib/Mioga2/Magellan/DAV.pm b/lib/Mioga2/Magellan/DAV.pm
441 index cdf77f1..116ebf4 100644
442 --- a/lib/Mioga2/Magellan/DAV.pm
443 +++ b/lib/Mioga2/Magellan/DAV.pm
444 @@ -106,7 +106,7 @@ sub ExecuteRequest
445         }
446  
447         if ($response->code >= 500) {
448 -               warn "Mioga2::Magellan::ExecuteRequest Failed: " . $response->content;
449 +               warn "Mioga2::Magellan::DAV::ExecuteRequest Failed: " . $response->content;
450         }
451  
452         return  $response;
453 diff --git a/lib/Mioga2/MailingList.pm b/lib/Mioga2/MailingList.pm
454 index c7d631c..3a92466 100644
455 --- a/lib/Mioga2/MailingList.pm
456 +++ b/lib/Mioga2/MailingList.pm
457 @@ -749,11 +749,11 @@ sub MailDeleteMsg
458  sub CheckUTF8 {
459      my ($str) = @_;
460      
461 -    my $conv    = Text::Iconv->new('utf8', 'utf8');
462 +    my $conv    = Text::Iconv->new('UTF-8', 'UTF-8');
463      my $tmp_str = $conv->convert($str);
464      unless ($tmp_str) {
465 -        my $charset = detect($str) || 'iso-8859-15'; # defaults to latin9
466 -        $conv = Text::Iconv->new($charset, "utf8");
467 +        my $charset = detect($str) || 'ISO-8859-15'; # defaults to latin9
468 +        $conv = Text::Iconv->new($charset, "UTF-8");
469          $str  = $conv->convert($str);
470      }
471      return $str;
472 diff --git a/lib/Mioga2/MiogaConf.pm b/lib/Mioga2/MiogaConf.pm
473 index 5b74a96..a46e27c 100644
474 --- a/lib/Mioga2/MiogaConf.pm
475 +++ b/lib/Mioga2/MiogaConf.pm
476 @@ -258,7 +258,7 @@ sub GetFilenameEncoding {
477  sub GetBinariesDir {
478         my ($self) = @_;
479  
480 -       return $self->{binaries_dir};
481 +       return $self->{bin_dir};
482  }
483  
484  # ============================================================================
485 diff --git a/lib/Mioga2/Search.pm b/lib/Mioga2/Search.pm
486 index 2c20259..292f864 100644
487 --- a/lib/Mioga2/Search.pm
488 +++ b/lib/Mioga2/Search.pm
489 @@ -447,13 +447,13 @@ sub CheckArgs
490         elsif (exists($context->{args}->{query})) {
491                 $query_string = $context->{args}->{query};
492         }
493 -       my $conv    = Text::Iconv->new('utf8', 'utf8');
494 +       my $conv    = Text::Iconv->new('UTF-8', 'UTF-8');
495         my $tmp_query = $conv->convert($query_string);
496    
497         unless ($tmp_query) {
498 -               my $charset = detect($query_string) || 'iso-8859-15'; # defaults to latin9
499 +               my $charset = detect($query_string) || 'ISO-8859-15'; # defaults to latin9
500                 warn "charset = '$charset' for query_string = '$query_string'" if $debug;
501 -               $conv = Text::Iconv->new($charset, "utf8");
502 +               $conv = Text::Iconv->new($charset, "UTF-8");
503                 $query_string  = $conv->convert($query_string);
504                 warn "==> converted query_string = '$query_string'" if $debug;
505         }
506 diff --git a/lib/Mioga2/tools/string_utils.pm b/lib/Mioga2/tools/string_utils.pm
507 index c56cc3b..36bfa5a 100644
508 --- a/lib/Mioga2/tools/string_utils.pm
509 +++ b/lib/Mioga2/tools/string_utils.pm
510 @@ -46,6 +46,7 @@ use Mioga2::Content::XSLT;
511  use Mioga2::XML::Simple;
512  use Exporter;
513  use Text::Iconv;
514 +use Encode;
515  use Encode::Detect::Detector;
516  use Data::Dumper;
517  use HTML::TokeParser::Simple;
518 @@ -715,11 +716,11 @@ Check if string is UTF8 and convert it if needed
519  sub st_CheckUTF8 {
520      my ($str) = @_;
521      
522 -    my $conv    = Text::Iconv->new('utf8', 'utf8');
523 +    my $conv    = Text::Iconv->new('UTF-8', 'UTF-8');
524      my $tmp_str = $conv->convert($str);
525      unless ($tmp_str) {
526 -        my $charset = detect($str) || 'iso-8859-15'; # defaults to latin9
527 -        $conv = Text::Iconv->new($charset, "utf8");
528 +        my $charset = detect($str) || 'ISO-8859-15'; # defaults to latin9
529 +        $conv = Text::Iconv->new($charset, "UTF-8");
530          $str  = $conv->convert($str);
531                 utf8::decode ($str);
532      }
533 diff --git a/lib/MiogaConf.pm b/lib/MiogaConf.pm
534 index 0870174..bbcc80a 100644
535 --- a/lib/MiogaConf.pm
536 +++ b/lib/MiogaConf.pm
537 @@ -836,6 +836,10 @@ sub CheckDepends
538         my @missing;
539         my @missing_clib;
540  
541 +       # Some modules rewrite $ENV{PATH} without hesitation when "require"d,      
542 +       # we need to put the old one back in place.                                
543 +       my $oldpath = $ENV{PATH}; 
544 +
545         foreach my $dep (@{$self->{CONFIG}->{dependencies}->[0]->{dep}}) {
546                 my $version;
547                 if(exists $dep->{version}) {
548 @@ -858,6 +862,7 @@ sub CheckDepends
549                 }
550         }
551         
552 +       $ENV{PATH} = $oldpath;
553  
554         foreach my $dep (@{$self->{CONFIG}->{dependencies}->[0]->{clib}}) {
555                 my $version;
556 diff --git a/sql/Makefile b/sql/Makefile
557 index 07b26f5..3d79b1b 100644
558 --- a/sql/Makefile
559 +++ b/sql/Makefile
560 @@ -15,19 +15,21 @@ install:
561         cp upgradeMiogletDesc.pl $(DESTDIR)$(INSTALL_DIR)/conf/Config.hook.d
562         chmod a+x $(DESTDIR)$(INSTALL_DIR)/conf/Config.hook.d/upgradeMiogletDesc.pl
563  
564 -       if [ $(INIT_SQL) = 'yes' ] ; \
565 +       DB_STATE=`perl -w testdb.pl`; \
566 +       if [ "$$DB_STATE" = "nodb" -o "$$DB_STATE" = "empty" ] ; \
567         then \
568                 echo "Initialize database"; \
569 -               su - $(POSTGRES_USER) -c "dropdb $(DB_NAME)" ; \
570 -               su - $(POSTGRES_USER) -c "createdb --encoding UTF8 $(DB_NAME)" && \
571 -               su $(POSTGRES_USER) -c "psql $(DB_NAME) < create_lang.sql" && \
572 -               perl -w -I../lib initdb.pl ; \
573 -       elif [ $(INIT_SQL) != 'noupdate' ]; then \
574 +        dropdb -h $(DB_HOST) -p $(DB_PORT) -U $(DBI_LOGIN) $(DB_NAME) ; \
575 +               createdb --encoding UTF8 -h $(DB_HOST) -p $(DB_PORT) -U $(DBI_LOGIN) $(DB_NAME) && \
576 +               psql -h $(DB_HOST) -p $(DB_PORT) -U $(DBI_LOGIN) $(DB_NAME) < create_lang.sql && \
577 +               perl -w -I../lib initdb.pl force_init_sql=1; \
578 +       elif [ "$$DB_STATE" = "present" ]; then \
579                 echo "Update database"; \
580                 perl -w -I../lib updatedb.pl configxml=$(DESTDIR)$(INSTALL_DIR)/conf/Config.xml; \
581 +       elif [ "$$DB_STATE" = "noserver" ]; then \
582 +               echo "ERROR: Cannot connect to the database server!"; \
583         fi
584  
585 -
586  clean:
587         rm -f *~
588  
589 diff --git a/sql/schema_base.sql b/sql/schema_base.sql
590 index b7d8cc2..88d5e2d 100644
591 --- a/sql/schema_base.sql
592 +++ b/sql/schema_base.sql
593 @@ -429,10 +429,6 @@ CREATE OR REPLACE FUNCTION check_group_base_default_profile_id () RETURNS trigge
594      END;
595  ' LANGUAGE 'plpgsql';
596  
597 -CREATE TRIGGER m_group_base_default_profile_id_check
598 -     BEFORE DELETE ON m_profile FOR EACH ROW
599 -     EXECUTE PROCEDURE check_group_base_default_profile_id ();
600 -
601  
602  CREATE OR REPLACE FUNCTION check_group_base_mioga_id () RETURNS trigger AS '
603      DECLARE
604 @@ -839,6 +835,10 @@ create table m_profile (
605  );
606  create unique index m_profile_ident_group_index on m_profile (ident, group_id);
607  
608 +CREATE TRIGGER m_group_base_default_profile_id_check
609 +     BEFORE DELETE ON m_profile FOR EACH ROW
610 +     EXECUTE PROCEDURE check_group_base_default_profile_id ();
611 +
612  
613  --
614  -- Add referencial integrity on default_profile_id in m_group_base
615 diff --git a/sql/testdb.pl b/sql/testdb.pl
616 new file mode 100755
617 index 0000000..1952891
618 --- /dev/null
619 +++ b/sql/testdb.pl
620 @@ -0,0 +1,64 @@
621 +#!/usr/bin/perl -w
622 +
623 +# Tests the availability of the Mioga2 database.
624 +# Returns on stdout one of:
625 +# 'present'  - The Mioga2 database has been found and contains data.
626 +# 'empty'    - The Mioga2 database exists but the table "m_mioga" is empty or nonexistent.
627 +# 'nodb'     - There is no Mioga2 database but the database server is working fine
628 +#              (i.e. one can try to create the database)
629 +# 'noserver' - Connection to the database server failed.
630 +
631 +# This has been written for Mioga2/SlapOS, to avoid overwriting the database
632 +# when re-instantiating the Apache/mod_perl partition.
633 +
634 +use strict;
635 +use lib "../lib";
636 +
637 +use Data::Dumper;
638 +use DBI;
639 +use Error qw(:try);
640 +use Mioga2::Exception::DB;
641 +use Mioga2::MiogaConf;
642 +
643 +# TODO: get this through a parameter?
644 +# my $configxml = "../conf/Config.xml";
645 +my $miogaconf = "../web/conf/Mioga.conf";
646 +
647 +my $result = 'undefined';
648 +try {
649 +    my $config = new Mioga2::MiogaConf($miogaconf);
650 +    my $dbh = $config->GetDBH();
651 +    my $sql = 'SELECT COUNT(*) FROM m_mioga';
652 +    my $sth = $dbh->prepare($sql);
653 +    my $exec_result = $sth->execute();
654 +    if (not defined($exec_result)) {
655 +        throw Mioga2::Exception::DB("testdb.pl 0", $sth->err, $sth->errstr, $sql);
656 +    }
657 +    my $res = $sth->fetchrow_arrayref();
658 +    if (not defined($res)) {
659 +        throw Mioga2::Exception::DB("testdb.pl 1", $sth->err, $sth->errstr, $sql);
660 +    }
661 +    my $count = $res->[0];
662 +    if (not defined($count)) {
663 +        throw Mioga2::Exception::DB("testdb.pl 2", $sth->err, $sth->errstr, $sql);
664 +    } elsif ($count == 0) {
665 +        $result = 'empty';
666 +    } else {
667 +        $result = 'present';
668 +    }   
669 +} catch Mioga2::Exception::DB with {
670 +    my $err = shift;
671 +    my $errstr = $err->getDBerrstr();
672 +    if ($errstr =~ m#database "mioga2" does not exist#) {
673 +        $result = 'nodb';
674 +    } elsif ($errstr =~ m#relation "m_mioga" does not exist#) {
675 +        $result = 'empty';
676 +    } else {
677 +        $result = 'noserver';
678 +    }
679 +} otherwise {
680 +    my $err = shift;
681 +    $result = 'noserver';
682 +};
683 +
684 +print $result;
685 diff --git a/sql/updatedb.pl b/sql/updatedb.pl
686 index 67921e7..bb4db1a 100644
687 --- a/sql/updatedb.pl
688 +++ b/sql/updatedb.pl
689 @@ -25,7 +25,7 @@ foreach my $var qw(configxml miogaconf timezonexml dir) {
690  
691  my $config = new Mioga2::MiogaConf($miogaconf);
692  
693 -my $conf = new MiogaConf( dir => $dir, config => $configxml);
694 +my $conf = new MiogaConf( dir => $dir, config => $configxml, force_init_sql => 0);
695  $conf->Install($config);
696  
697  
698 diff --git a/web/Makefile b/web/Makefile
699 index 66af45f..9649a02 100644
700 --- a/web/Makefile
701 +++ b/web/Makefile
702 @@ -16,11 +16,11 @@ all ::
703  
704  
705  install ::
706 -       if [ $(INIT_SQL) = 'yes' -a -d $(INSTALL_DIR) ] ; \
707 -       then \
708 -            su - $(POSTGRES_USER) -c "pg_dump -b -Ft --column-inserts $(DB_NAME) | gzip" > ${INSTALL_DIR}/db_dump.tar.gz ; \
709 -            mv $(INSTALL_DIR) $(BACKUP_DIR) ; \
710 -        fi
711 +#      if [ $(INIT_SQL) = 'yes' -a -d $(INSTALL_DIR) ] ; \
712 +#      then \
713 +#           su - $(POSTGRES_USER) -c "pg_dump -b -Ft --column-inserts $(DB_NAME) | gzip" > ${INSTALL_DIR}/db_dump.tar.gz ; \
714 +#           mv $(INSTALL_DIR) $(BACKUP_DIR) ; \
715 +#       fi
716  
717         mkdir -p $(TMP_DIR)
718         mkdir -p $(DESTDIR)$(INSTALL_DIR)/$(INSTANCE_IDENT)/$(MIOGA_FILES)
719 diff --git a/web/conf/Makefile b/web/conf/Makefile
720 index 1573e5c..189f2fd 100644
721 --- a/web/conf/Makefile
722 +++ b/web/conf/Makefile
723 @@ -14,5 +14,6 @@ install:
724  # is done in ../Makefile
725  
726  clean:
727 +       echo "VHH DEBUG: web/conf make clean, deleting apache/ !"
728         rm -Rf apache Mioga.conf .memdump
729  
730 diff --git a/web/conf/startup.pl b/web/conf/startup.pl
731 index a9dc968..6558061 100644
732 --- a/web/conf/startup.pl
733 +++ b/web/conf/startup.pl
734 @@ -29,6 +29,7 @@ use MIME::Entity ();
735  use MIME::Parser ();
736  use MIME::QuotedPrint ();
737  use MiogaConf ();
738 +use Net::INET6Glue::INET_is_INET6;
739  use Net::LDAP ();
740  use Parse::Yapp::Driver ();
741  use Storable ();
742 diff --git a/web/skel/Makefile b/web/skel/Makefile
743 index e604e7d..fbaad2d 100644
744 --- a/web/skel/Makefile
745 +++ b/web/skel/Makefile
746 @@ -33,7 +33,7 @@ fr_FR : $(SRC_FR_FILES)
747  install:
748         rsync $(RSYNC_OPTS) $(SUBDIRS) $(DESTDIR)$(INSTALL_DIR)/conf/skel/
749         # Update instance default skeletons
750 -       for i in `mioga2_info.pl --conf=$(DESTDIR)$(INSTALL_DIR)/conf/Mioga.conf instances`; do if [ ! -d /var/lib/Mioga2/$$i/MiogaFiles/skel/ ]; then mkdir $(DESTDIR)$(INSTALL_DIR)/$$i/MiogaFiles/skel/; fi; cp -R $(DESTDIR)$(INSTALL_DIR)/conf/skel/* $(DESTDIR)$(INSTALL_DIR)/$$i/MiogaFiles/skel/; done
751 +#      for i in `mioga2_info.pl --conf=$(DESTDIR)$(INSTALL_DIR)/conf/Mioga.conf instances`; do if [ ! -d /var/lib/Mioga2/$$i/MiogaFiles/skel/ ]; then mkdir $(DESTDIR)$(INSTALL_DIR)/$$i/MiogaFiles/skel/; fi; cp -R $(DESTDIR)$(INSTALL_DIR)/conf/skel/* $(DESTDIR)$(INSTALL_DIR)/$$i/MiogaFiles/skel/; done
752  
753  clean:
754         rm -rf $(SUBDIRS)
755 diff --git a/web/skel/src/en_US/group/50-standard.xml b/web/skel/src/en_US/group/50-standard.xml
756 index 6cf89e5..e1ef140 100644
757 --- a/web/skel/src/en_US/group/50-standard.xml
758 +++ b/web/skel/src/en_US/group/50-standard.xml
759 @@ -12,7 +12,6 @@
760         <applications>
761                 <application ident="AnimGroup" active="1"/>
762                 <application ident="Magellan" active="1"/>
763 -               <application ident="Mermoz" active="1"/>
764                 <application ident="Organizer"/>
765                 <application ident="Contact"/>
766                 <application ident="Tasks"/>
767 @@ -38,9 +37,6 @@
768                         <application ident="Magellan">
769                                 <all_functions/>
770                         </application>
771 -                       <application ident="Mermoz">
772 -                               <all_functions/>
773 -                       </application>
774                         <application ident="Portal">
775                                 <all_functions/>
776                         </application>
777 @@ -53,10 +49,6 @@
778                         <application ident="Magellan">  
779                                 <function>Read</function>
780                         </application>
781 -                       <application ident="Mermoz">    
782 -                               <function>Base</function>
783 -                               <function>Standard</function>
784 -                       </application>
785                         <application ident="Portal">
786                                 <function>Portal</function>
787                         </application>
788 @@ -69,9 +61,6 @@
789                         <application ident="Magellan">  
790                                 <function>Read</function>
791                         </application>
792 -                       <application ident="Mermoz">    
793 -                               <function>Base</function>
794 -                       </application>
795                         <application ident="Portal">
796                                 <function>Portal</function>
797                         </application>
798 diff --git a/web/skel/src/en_US/group/60-admin.xml b/web/skel/src/en_US/group/60-admin.xml
799 index c73b700..d3f368b 100644
800 --- a/web/skel/src/en_US/group/60-admin.xml
801 +++ b/web/skel/src/en_US/group/60-admin.xml
802 @@ -12,7 +12,6 @@
803         <applications>
804                 <application ident="AnimGroup" active="1"/>
805                 <application ident="Magellan" active="1"/>
806 -               <application ident="Mermoz" active="1"/>
807                 <application ident="Colbert" active="1"/>
808                 <application ident="Organizer"/>
809                 <application ident="Contact"/>
810 @@ -39,9 +38,6 @@
811                         <application ident="Magellan">
812                                 <all_functions/>
813                         </application>
814 -                       <application ident="Mermoz">
815 -                               <all_functions/>
816 -                       </application>
817                         <application ident="Colbert">
818                                 <all_functions/>
819                         </application>
820 @@ -57,10 +53,6 @@
821                         <application ident="Magellan">  
822                                 <function>Read</function>
823                         </application>
824 -                       <application ident="Mermoz">    
825 -                               <function>Base</function>
826 -                               <function>Standard</function>
827 -                       </application>
828                         <application ident="Colbert">
829                                 <function>UsersWrite</function>
830                                 <function>GroupsWrite</function>
831 @@ -79,9 +71,6 @@
832                         <application ident="Magellan">  
833                                 <function>Read</function>
834                         </application>
835 -                       <application ident="Mermoz">    
836 -                               <function>Base</function>
837 -                       </application>
838                         <application ident="Colbert">
839                                 <function>UsersRead</function>
840                                 <function>GroupsRead</function>
841 diff --git a/web/skel/src/en_US/instance/50-standard.xml b/web/skel/src/en_US/instance/50-standard.xml
842 index cdb1e88..82a125b 100644
843 --- a/web/skel/src/en_US/instance/50-standard.xml
844 +++ b/web/skel/src/en_US/instance/50-standard.xml
845 @@ -102,10 +102,6 @@
846                 </application>
847                 <application ident="MailingList">
848                 </application>
849 -               <application ident="Mermoz">
850 -                       <all_users/>
851 -                       <all_groups/>
852 -               </application>
853                 <application ident="Narkissos">
854                         <all_users/>
855                 </application>
856 diff --git a/web/skel/src/en_US/user/50-standard.xml b/web/skel/src/en_US/user/50-standard.xml
857 index c8983bb..256400d 100644
858 --- a/web/skel/src/en_US/user/50-standard.xml
859 +++ b/web/skel/src/en_US/user/50-standard.xml
860 @@ -92,7 +92,6 @@
861                 <application ident="FileBrowser"/>
862                 <application ident="Portal"/>
863                 <application ident="Search" active="1"/>
864 -               <application ident="Mermoz"/>
865                 <application ident="RSS" active="1"/>
866         </applications>
867  
868 diff --git a/web/skel/src/en_US/user/60-admin.xml b/web/skel/src/en_US/user/60-admin.xml
869 index 9083b6f..e246d19 100644
870 --- a/web/skel/src/en_US/user/60-admin.xml
871 +++ b/web/skel/src/en_US/user/60-admin.xml
872 @@ -101,7 +101,6 @@
873                 <application ident="FileBrowser"/>
874                 <application ident="Portal"/>
875                 <application ident="Search" active="1"/>
876 -               <application ident="Mermoz"/>
877                 <application ident="RSS" active="1"/>
878         </applications>
879  
880 diff --git a/web/skel/src/fr_FR/group/50-standard.xml b/web/skel/src/fr_FR/group/50-standard.xml
881 index 954f71d..dfc79b1 100644
882 --- a/web/skel/src/fr_FR/group/50-standard.xml
883 +++ b/web/skel/src/fr_FR/group/50-standard.xml
884 @@ -35,9 +35,6 @@
885                 <!-- Le navigateur de fichiers est accessible et actif. -->
886                 <application ident="Magellan" active="1"/>
887  
888 -               <!-- L'application de rédaction d'e-mails est accessible et active. -->
889 -               <application ident="Mermoz" active="1"/>
890 -
891                 <!-- Le portail est accessible et actif. -->
892                 <application ident="Portal" active="1"/>
893  
894 @@ -77,11 +74,6 @@
895                                 <all_functions/>
896                         </application>
897  
898 -                       <!-- Le profil "Animation" donne accès à toutes les fonctions de l'application Mermoz d'envoi d'e-mail. -->
899 -                       <application ident="Mermoz">
900 -                               <all_functions/>
901 -                       </application>
902 -
903                         <!-- Le profil "Animation" donne accès à toutes les fonctions du portail de groupe. -->
904                         <application ident="Portal">
905                                 <all_functions/>
906 @@ -102,12 +94,6 @@
907                                 <function>Read</function>
908                         </application>
909  
910 -                       <!-- Le profil "Membre" donne accès uniquement à l'envoi d'e-mail au groupe ou indépendamment aux différentes équipes du groupe via l'application d'envoi d'e-mail Mermoz. -->
911 -                       <application ident="Mermoz">    
912 -                               <function>Base</function>
913 -                               <function>Standard</function>
914 -                       </application>
915 -
916                         <!-- Le profil "Membre" donne accès uniquement à la consultation du portail de groupe. -->
917                         <application ident="Portal">
918                                 <function>Portal</function>
919 @@ -128,11 +114,6 @@
920                                 <function>Read</function>
921                         </application>
922  
923 -                       <!-- Le profil "Invité" donne accès uniquement à l'envoi d'e-mail au groupe via l'application d'envoi d'e-mail Mermoz. -->
924 -                       <application ident="Mermoz">    
925 -                               <function>Base</function>
926 -                       </application>
927 -
928                         <!-- Le profil "Invité" donne accès uniquement à la consultation du portail de groupe. -->
929                         <application ident="Portal">
930                                 <function>Portal</function>
931 @@ -151,6 +132,7 @@
932                 <space type="private">
933                         
934                         <!-- La balise "acls" contient les définitions de droits d'accès à la racine de l'espace privé du groupe. -->
935 +
936                         <acls>
937  
938                                 <!-- Les profils "Animation" et "Membre" ont accès en lecture et écriture. -->
939 diff --git a/web/skel/src/fr_FR/group/60-admin.xml b/web/skel/src/fr_FR/group/60-admin.xml
940 index d9bd724..1c97ca5 100644
941 --- a/web/skel/src/fr_FR/group/60-admin.xml
942 +++ b/web/skel/src/fr_FR/group/60-admin.xml
943 @@ -12,7 +12,6 @@
944         <applications>
945                 <application ident="AnimGroup" active="1"/>
946                 <application ident="Magellan" active="1"/>
947 -               <application ident="Mermoz" active="1"/>
948                 <application ident="Colbert" active="1"/>
949                 <application ident="Organizer"/>
950                 <application ident="Contact"/>
951 @@ -39,9 +38,6 @@
952                         <application ident="Magellan">
953                                 <all_functions/>
954                         </application>
955 -                       <application ident="Mermoz">
956 -                               <all_functions/>
957 -                       </application>
958                         <application ident="Colbert">
959                                 <all_functions/>
960                         </application>
961 @@ -57,10 +53,6 @@
962                         <application ident="Magellan">  
963                                 <function>Read</function>
964                         </application>
965 -                       <application ident="Mermoz">    
966 -                               <function>Base</function>
967 -                               <function>Standard</function>
968 -                       </application>
969                         <application ident="Colbert">
970                                 <function>UsersWrite</function>
971                                 <function>GroupsWrite</function>
972 @@ -79,9 +71,6 @@
973                         <application ident="Magellan">  
974                                 <function>Read</function>
975                         </application>
976 -                       <application ident="Mermoz">    
977 -                               <function>Base</function>
978 -                       </application>
979                         <application ident="Colbert">
980                                 <function>UsersRead</function>
981                                 <function>GroupsRead</function>
982 diff --git a/web/skel/src/fr_FR/instance/50-standard.xml b/web/skel/src/fr_FR/instance/50-standard.xml
983 index 34a8536..f7d1eb1 100644
984 --- a/web/skel/src/fr_FR/instance/50-standard.xml
985 +++ b/web/skel/src/fr_FR/instance/50-standard.xml
986 @@ -215,12 +215,6 @@
987                 <application ident="MailingList">
988                 </application>
989  
990 -               <!-- L'application d'envoi d'e-mail est accessible à tous les utilisateurs et à tous les groupes. -->
991 -               <application ident="Mermoz">
992 -                       <all_users/>
993 -                       <all_groups/>
994 -               </application>
995 -
996                 <!-- L'application de gestion des données personnelles est accessible à tous les utilisateurs. -->
997                 <application ident="Narkissos">
998                         <all_users/>
999 diff --git a/web/skel/src/fr_FR/user/50-standard.xml b/web/skel/src/fr_FR/user/50-standard.xml
1000 index c7da5e8..d07b180 100644
1001 --- a/web/skel/src/fr_FR/user/50-standard.xml
1002 +++ b/web/skel/src/fr_FR/user/50-standard.xml
1003 @@ -138,7 +138,6 @@
1004                 <!-- L'afficheur de fichiers, le portail utilisateur et l'application d'envoi d'e-mails Mermoz sont accessible mais ne sont pas actives. L'utilisateur pourra les activer s'il le souhaite. -->
1005                 <application ident="FileBrowser"/>
1006                 <application ident="Portal"/>
1007 -               <application ident="Mermoz"/>
1008  
1009         </applications>
1010  
1011 diff --git a/web/skel/src/fr_FR/user/60-admin.xml b/web/skel/src/fr_FR/user/60-admin.xml
1012 index afff18d..4d4df04 100644
1013 --- a/web/skel/src/fr_FR/user/60-admin.xml
1014 +++ b/web/skel/src/fr_FR/user/60-admin.xml
1015 @@ -101,7 +101,6 @@
1016                 <application ident="FileBrowser"/>
1017                 <application ident="Portal"/>
1018                 <application ident="Search" active="1"/>
1019 -               <application ident="Mermoz"/>
1020                 <application ident="RSS" active="1"/>
1021         </applications>
1022