File Coverage

blib/lib/Mail/Server/IMAP4/User.pm
Criterion Covered Total %
statement 12 50 24.0
branch 0 28 0.0
condition 0 9 0.0
subroutine 4 10 40.0
pod 4 5 80.0
total 20 102 19.6


line stmt bran cond sub pod time code
1             # This code is part of Perl distribution Mail-Box-IMAP4 version 4.01.
2             # The POD got stripped from this file by OODoc version 3.05.
3             # For contributors see file ChangeLog.
4              
5             # This software is copyright (c) 2001-2025 by Mark Overmeer.
6              
7             # This is free software; you can redistribute it and/or modify it under
8             # the same terms as the Perl 5 programming language system itself.
9             # SPDX-License-Identifier: Artistic-1.0-Perl OR GPL-1.0-or-later
10              
11              
12             package Mail::Server::IMAP4::User;{
13             our $VERSION = '4.01';
14             }
15              
16 1     1   1305 use parent 'Mail::Box::Manage::User';
  1         9  
  1         7  
17              
18 1     1   248168 use strict;
  1         3  
  1         67  
19 1     1   8 use warnings;
  1         2  
  1         67  
20              
21 1     1   8 use Log::Report 'mail-box-imap4', import => [ qw/__x fault warning/ ];
  1         4  
  1         6  
22              
23             #--------------------
24              
25             sub init($)
26 0     0 0   { my ($self, $args) = @_;
27 0 0         $self->SUPER::init($args) or return ();
28 0   0       $self->{MSNU_indexfile} = $args->{indexfile} // ($self->folderdir . '/index');
29 0           $self;
30             }
31              
32             #--------------------
33              
34 0     0 1   sub indexFilename() { $_[0]->{MSNU_indexfile} };
35              
36             #--------------------
37              
38             sub folderInfo($)
39 0 0   0 1   { my $index = $_[0]->index or return ();
40 0           $index->folder(shift);
41             }
42              
43              
44             sub delete($)
45 0     0 1   { my ($self, $name) = @_;
46 0 0         my $index = $self->index->startModify or return 0;
47              
48 0 0         unless($self->_delete($index, $name))
49 0           { $self->cancelModification($index);
50 0           return 0;
51             }
52              
53 0           $index->write;
54             }
55              
56             sub _delete($$)
57 0     0     { my ($self, $index, $name) = @_;
58              
59             # First clean all subfolders recursively
60 0           foreach my $subf ($index->subfolders($name))
61 0 0         { $self->_delete($index, $subf) or return 0;
62             }
63              
64             # Already disappeared? Shouldn't happen, but ok
65 0 0         my $info = $index->folder($name)
66             or return 1;
67              
68             # Bluntly clean-out the directory
69 0 0         if(my $dir = $info->{Directory})
70             { # Bluntly try to remove, but error is not set
71 0 0 0       if(remove(\1, $dir) != 0 && -d $dir)
72 0           { fault __x"Unable to remove folder {name}", name => $dir;
73 0           return 0;
74             }
75             }
76              
77             # Remove (sub)folder from index
78 0           $index->folder($name, undef);
79 0           1;
80             }
81              
82              
83             sub create($@)
84 0     0 1   { my ($self, $name) = (shift, shift);
85 0 0         my $index = $self->index->startModify or return undef;
86              
87 0 0         if(my $info = $index->folder($name))
88 0           { warning __x"folder {name} already exists, creation skipped.", name => $name;
89 0           return $info;
90             }
91              
92 0           my $uniq = $index->createUnique;
93              
94             # Create the directory
95             # Also in this case, we bluntly try to create it, and when it doesn't
96             # work, we check whether we did too much. This may safe an NFS stat.
97              
98 0           my $dir = $self->home . '/F' . $uniq;
99 0 0 0       -d $dir or mkdir $dir, 0750
100             or fault __x"cannot create folder directory {dir}", dir => $dir;
101              
102             # Write folder name in directory, for recovery purposes.
103 0           my $namefile = "$dir/name";
104 0           my $namefh;
105 0 0         open $namefh, '>:encoding(utf-8)', $namefile
106             or fault __x"cannot write name for folder in {file}", file => $namefile;
107              
108 0           $namefh->print("$name\n");
109              
110 0 0         $namefh->close
111             or fault __x"failed writing folder name to {file}", file => $namefile;
112              
113             # Add folder to the index
114              
115 0           my $facts = $self->folder(
116             $name,
117             Folder => $name,
118             Directory => $dir,
119             Messages => 0,
120             Size => 0,
121             );
122              
123 0 0         $self->write && $facts;
124             }
125              
126             #--------------------
127              
128             1;