import torrus 1.0.9
[freeside.git] / torrus / perllib / Torrus / ACL / Import.pm
1 #  Copyright (C) 2002  Stanislav Sinyagin
2 #
3 #  This program is free software; you can redistribute it and/or modify
4 #  it under the terms of the GNU General Public License as published by
5 #  the Free Software Foundation; either version 2 of the License, or
6 #  (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software
15 #  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
16
17 # $Id: Import.pm,v 1.1 2010-12-27 00:03:59 ivan Exp $
18 # Stanislav Sinyagin <ssinyagin@yahoo.com>
19
20
21 package Torrus::ACL::Import;
22
23 use Torrus::ACL;
24 use Torrus::ACL::Edit;
25 use Torrus::Log;
26
27 use XML::LibXML;
28 use strict;
29
30 my %formatsSupported = ('1.0' => 1,
31                         '1.1' => 1);
32
33 sub importACL
34 {
35     my $self = shift;
36     my $filename = shift;
37
38     my $ok = 1;
39     my $parser = new XML::LibXML;
40     my $doc;
41     eval { $doc = $parser->parse_file( $filename );  };
42     if( $@ )
43     {
44         Error("Failed to parse $filename: $@");
45         return 0;
46     }
47
48     my $root = $doc->documentElement();
49     if( $root->nodeName() ne 'aclexport' )
50     {
51         Error('XML root element is not "aclexport" in ' . $filename);
52         return 0;
53     }
54
55     my $format_version =
56         (($root->getElementsByTagName('file-info'))[0]->
57          getElementsByTagName('format-version'))[0]->textContent();
58     if( not $format_version or not $formatsSupported{$format_version} )
59     {
60         Error('Invalid format or format version not supported: ' . $filename);
61         return 0;
62     }
63
64     foreach my $groupnode ( ($root->getElementsByTagName('groups'))[0]->
65                             getElementsByTagName('group') )
66     {
67         my $group = $groupnode->getAttribute('name');
68         Debug('Importing group: ' . $group);
69         if( not $self->groupExists( $group ) )
70         {
71             $ok = $self->addGroups( $group ) ? $ok:0;
72         }
73         else
74         {
75             Debug('Group already exists: ' . $group);
76         }
77
78         foreach my $privnode ( $groupnode->getElementsByTagName('privilege') )
79         {
80             my $object = $privnode->getAttribute('object');
81             my $priv = $privnode->getAttribute('name');
82             Debug('Setting privilege ' . $priv . ' for ' . $object .
83                   ' to group ' . $group);
84             $ok = $self->setPrivilege( $group, $object, $priv ) ? $ok:0;
85         }
86
87         foreach my $attrnode ( $groupnode->getElementsByTagName('attribute') )
88         {
89             my $attr = $attrnode->getAttribute('name');
90             if( $attr ne 'modified' )
91             {
92                 my $value = $attrnode->getAttribute('value');
93                 Debug('Setting attribute ' . $attr . ' for group ' . $group .
94                       ' to ' . $value);
95                 $ok = $self->setGroupAttribute( $group, $attr, $value )
96                     ? $ok:0;
97             }
98         }
99     }
100
101     foreach my $usernode ( ($root->getElementsByTagName('users'))[0]->
102                             getElementsByTagName('user') )
103     {
104         my $uid = $usernode->getAttribute('uid');
105         Debug('Importing user: ' . $uid);
106
107         if( not $self->userExists( $uid ) )
108         {
109             $ok = $self->addUser( $uid ) ? $ok:0;
110         }
111         else
112         {
113             Debug('User already exists: ' . $uid);
114         }
115
116         foreach my $membernode ( $usernode->getElementsByTagName('member-of') )
117         {
118             my $group = $membernode->getAttribute('group');
119             Debug('Adding ' . $uid . ' to group ' . $group);
120
121             if( not grep {$group eq $_} $self->memberOf( $uid ) )
122             {
123                 $ok = $self->addUserToGroups( $uid, $group ) ? $ok:0;
124             }
125             else
126             {
127                 Debug('User ' . $uid . ' is already in group ' . $group);
128             }
129         }
130
131         foreach my $attrnode ( $usernode->getElementsByTagName('attribute') )
132         {
133             my $attr = $attrnode->getAttribute('name');
134             if( $attr ne 'modified' )
135             {
136                 my $value = $attrnode->getAttribute('value');
137                 Debug('Setting attribute ' . $attr . ' for user ' . $uid .
138                       ' to ' . $value);
139                 $ok = $self->setUserAttribute( $uid, $attr, $value ) ? $ok:0;
140             }
141         }
142     }
143     Debug('Import finished');
144     return $ok;
145 }
146
147
148
149
150 1;
151
152
153 # Local Variables:
154 # mode: perl
155 # indent-tabs-mode: nil
156 # perl-indent-level: 4
157 # End: