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);
48 use List::Util qw(min);
51 ($VERSION) = q$Revision: 1.4 $ =~ /^Revision:\s+([^\s+])/;
52 $DEBUG = 0 unless defined $DEBUG;
55 @EXPORT_OK = qw(is_valid_user open read_usertags write_usertags);
56 $EXPORT_TAGS{all} = [@EXPORT_OK];
59 # Obsolete compatability functions
65 my $user = get_user($u);
66 for my $t (keys %{$user->{"tags"}}) {
67 $ut->{$t} = [] unless defined $ut->{$t};
68 push @{$ut->{$t}}, @{$user->{"tags"}->{$t}};
76 my $user = get_user($u, 1); # locked
77 $user->{"tags"} = { %{$ut} };
81 #######################################################################
86 my $l = length($e) % 7;
87 return "$gSpoolDir/user/$l/" . join("",
88 map { m/^[0-9a-zA-Z_+.-]$/ ? $_ : sprintf("%%%02X", ord($_)) }
100 if ($field && m/^ (.*)$/) {
101 $res[-1] .= "\n" . $1;
102 } elsif (m/^([^:]+):(\s+(.*))?$/) {
115 while ($s =~ m/^([^,]*,\s*)(.*)$/ || $s =~ m/^([^,]+)()$/) {
118 unless ($sofar == 0 or $sofar + length($k) <= $n) {
123 $sofar += length($k);
130 return ($u =~ /^[a-zA-Z0-9._+-]+[@][a-z0-9-.]{4,}$/);
133 #######################################################################
141 "visible_cats" => [],
142 "unknown_stanzas" => []
146 my $need_lock = shift || 0;
147 my $p = filefromemail($u);
150 $user->{"filename"} = $p;
152 return bless $user, "Debbugs::User";
154 open($uf, "< $p") or die "Unable to open file $p for reading: $!";
157 $user->{"locked"} = $uf;
161 my @stanza = read_stanza($uf);
162 last if ($#stanza == -1);
163 if ($stanza[0] eq "Tag") {
166 $ut->{$t} = [] unless defined $ut->{$t};
167 push @{$ut->{$t}}, split /\s*,\s*/, $tag{Bugs};
168 } elsif ($stanza[0] eq "Category") {
170 my %stanza = @stanza;
171 my $catname = $stanza{"Category"};
173 while (++$i && defined $stanza{"Cat${i}"}) {
174 if (defined $stanza{"Cat${i}Options"}) {
176 my %c = ("nam" => $stanza{"Cat${i}"});
177 $c{"def"} = $stanza{"Cat${i}Default"}
178 if defined $stanza{"Cat${i}Default"};
179 if (defined $stanza{"Cat${i}Order"}) {
180 my @temp = split /\s*,\s*/, $stanza{"Cat${i}Order"};
182 my $min = min(@temp);
183 # Order to 0 minimum; strip duplicates
184 $c{ord} = [map {$temp{$_}++;
185 $temp{$_}>1?():($_-$min);
190 for my $l (split /\n/, $stanza{"Cat${i}Options"}) {
191 if ($l =~ m/^\s*(\S+)\s+-\s+(.*\S)\s*$/) {
194 } elsif ($l =~ m/^\s*(\S+)\s*$/) {
203 push @cat, $stanza{"Cat${i}"};
206 $user->{"categories"}->{$catname} = [@cat];
207 push @{$user->{"visible_cats"}}, $catname
208 unless ($stanza{"Hidden"} || "no") eq "yes";
210 push @{$user->{"unknown_stanzas"}}, [@stanza];
213 close($uf) unless $need_lock;
215 bless $user, "Debbugs::User";
222 my $ut = $user->{"tags"};
223 my $p = $user->{"filename"};
225 if ($p =~ m/^(.+)$/) { $p = $1; } else { return; }
226 open $uf, "> $p" or return;
228 for my $us (@{$user->{"unknown_stanzas"}}) {
231 my $k = shift @us; my $v = shift @us;
233 print $uf "$k: $v\n";
238 for my $t (keys %{$ut}) {
239 next if @{$ut->{$t}} == 0;
240 print $uf "Tag: $t\n";
241 print $uf fmt("Bugs: " . join(", ", @{$ut->{$t}}), 77) . "\n";
245 my $uc = $user->{"categories"};
246 my %vis = map { $_, 1 } @{$user->{"visible_cats"}};
247 for my $c (keys %{$uc}) {
248 next if @{$uc->{$c}} == 0;
250 print $uf "Category: $c\n";
251 print $uf "Hidden: yes\n" unless defined $vis{$c};
253 for my $cat (@{$uc->{$c}}) {
255 if (ref($cat) eq "HASH") {
256 printf $uf "Cat%d: %s\n", $i, $cat->{"nam"};
257 printf $uf "Cat%dOptions:\n", $i;
258 for my $j (0..$#{$cat->{"pri"}}) {
259 if (defined $cat->{"ttl"}->[$j]) {
260 printf $uf " %s - %s\n",
261 $cat->{"pri"}->[$j], $cat->{"ttl"}->[$j];
263 printf $uf " %s\n", $cat->{"pri"}->[$j];
266 printf $uf "Cat%dDefault: %s\n", $i, $cat->{"def"}
267 if defined $cat->{"def"};
268 printf $uf "Cat%dOrder: %s\n", $i, join(", ", @{$cat->{"ord"}})
269 if defined $cat->{"ord"};
271 printf $uf "Cat%d: %s\n", $i, $cat;
278 delete $user->{"locked"};