6 Debbugs::User -- User settings
10 use Debbugs::User qw(is_valid_user read_usertags write_usertags);
12 Debbugs::User::is_valid_user($userid);
14 $u = Debbugs::User::open($userid);
15 $u = Debbugs::User::open(user => $userid, locked => 0);
17 $u = Debbugs::User::open(user => $userid, locked => 1);
26 read_usertags(\%ut, $userid);
27 write_usertags(\%ut, $userid);
33 =item :all -- all functions that can be exported
44 use vars qw($VERSION $DEBUG %EXPORT_TAGS @EXPORT_OK @EXPORT);
45 use base qw(Exporter);
47 use Debbugs::Config qw(:globals);
50 ($VERSION) = q$Revision: 1.4 $ =~ /^Revision:\s+([^\s+])/;
51 $DEBUG = 0 unless defined $DEBUG;
54 @EXPORT_OK = qw(is_valid_user open read_usertags write_usertags);
55 $EXPORT_TAGS{all} = [@EXPORT_OK];
58 # Obsolete compatability functions
64 my $user = get_user($u);
65 for my $t (keys %{$user->{"tags"}}) {
66 $ut->{$t} = [] unless defined $ut->{$t};
67 push @{$ut->{$t}}, @{$user->{"tags"}->{$t}};
75 my $user = get_user($u, 1); # locked
76 $user->{"tags"} = { %{$ut} };
80 #######################################################################
85 my $l = length($e) % 7;
86 return "$gSpoolDir/user/$l/" . join("",
87 map { m/^[0-9a-zA-Z_+.-]$/ ? $_ : sprintf("%%%02X", ord($_)) }
99 if ($field && m/^ (.*)$/) {
100 $res[-1] .= "\n" . $1;
101 } elsif (m/^([^:]+):(\s+(.*))?$/) {
114 while ($s =~ m/^([^,]*,\s*)(.*)$/ || $s =~ m/^([^,]+)()$/) {
117 unless ($sofar == 0 or $sofar + length($k) <= $n) {
122 $sofar += length($k);
129 return ($u =~ /^[a-zA-Z0-9._+-]+[@][a-z0-9-.]{4,}$/);
132 #######################################################################
140 "visible_cats" => [],
141 "unknown_stanzas" => []
145 my $need_lock = shift || 0;
146 my $p = filefromemail($u);
149 $user->{"filename"} = $p;
151 return bless $user, "Debbugs::User";
153 open($uf, "< $p") or die "Unable to open file $p for reading: $!";
156 $user->{"locked"} = $uf;
160 my @stanza = read_stanza($uf);
161 last if ($#stanza == -1);
162 if ($stanza[0] eq "Tag") {
165 $ut->{$t} = [] unless defined $ut->{$t};
166 push @{$ut->{$t}}, split /\s*,\s*/, $tag{Bugs};
167 } elsif ($stanza[0] eq "Category") {
169 my %stanza = @stanza;
170 my $catname = $stanza{"Category"};
172 while (++$i && defined $stanza{"Cat${i}"}) {
173 if (defined $stanza{"Cat${i}Options"}) {
175 my %c = ("nam" => $stanza{"Cat${i}"});
176 $c{"def"} = $stanza{"Cat${i}Default"}
177 if defined $stanza{"Cat${i}Default"};
178 $c{"ord"} = [ split /,/, $stanza{"Cat${i}Order"} ]
179 if defined $stanza{"Cat${i}Order"};
181 for my $l (split /\n/, $stanza{"Cat${i}Options"}) {
182 if ($l =~ m/^\s*(\S+)\s+-\s+(.*\S)\s*$/) {
185 } elsif ($l =~ m/^\s*(\S+)\s*$/) {
194 push @cat, $stanza{"Cat${i}"};
197 $user->{"categories"}->{$catname} = [@cat];
198 push @{$user->{"visible_cats"}}, $catname
199 unless ($stanza{"Hidden"} || "no") eq "yes";
201 push @{$user->{"unknown_stanzas"}}, [@stanza];
204 close($uf) unless $need_lock;
206 bless $user, "Debbugs::User";
213 my $ut = $user->{"tags"};
214 my $p = $user->{"filename"};
216 if ($p =~ m/^(.+)$/) { $p = $1; } else { return; }
217 open $uf, "> $p" or return;
219 for my $us (@{$user->{"unknown_stanzas"}}) {
222 my $k = shift @us; my $v = shift @us;
224 print $uf "$k: $v\n";
229 for my $t (keys %{$ut}) {
230 next if @{$ut->{$t}} == 0;
231 print $uf "Tag: $t\n";
232 print $uf fmt("Bugs: " . join(", ", @{$ut->{$t}}), 77) . "\n";
236 my $uc = $user->{"categories"};
237 my %vis = map { $_, 1 } @{$user->{"visible_cats"}};
238 for my $c (keys %{$uc}) {
239 next if @{$uc->{$c}} == 0;
241 print $uf "Category: $c\n";
242 print $uf "Hidden: yes\n" unless defined $vis{$c};
244 for my $cat (@{$uc->{$c}}) {
246 if (ref($cat) eq "HASH") {
247 printf $uf "Cat%d: %s\n", $i, $cat->{"nam"};
248 printf $uf "Cat%dOptions:\n", $i;
249 for my $j (0..$#{$cat->{"pri"}}) {
250 if (defined $cat->{"ttl"}->[$j]) {
251 printf $uf " %s - %s\n",
252 $cat->{"pri"}->[$j], $cat->{"ttl"}->[$j];
254 printf $uf " %s\n", $cat->{"pri"}->[$j];
257 printf $uf "Cat%dDefault: %s\n", $i, $cat->{"def"}
258 if defined $cat->{"def"};
259 printf $uf "Cat%dOrder: %s\n", $i, join(", ", @{$cat->{"ord"}})
260 if defined $cat->{"ord"};
262 printf $uf "Cat%d: %s\n", $i, $cat;
269 delete $user->{"locked"};