]>
git.saurik.com Git - apt.git/blob - apt-private/private-download.cc
1 // Include Files /*{{{*/
4 #include <apt-pkg/acquire.h>
5 #include <apt-pkg/acquire-item.h>
6 #include <apt-pkg/configuration.h>
7 #include <apt-pkg/error.h>
8 #include <apt-pkg/fileutl.h>
9 #include <apt-pkg/strutl.h>
11 #include <apt-private/private-output.h>
12 #include <apt-private/private-download.h>
19 #include <sys/types.h>
23 #include <sys/statvfs.h>
29 bool CheckDropPrivsMustBeDisabled(pkgAcquire
&Fetcher
) /*{{{*/
31 // no need/possibility to drop privs
35 // the user does not want to drop privs
36 std::string SandboxUser
= _config
->Find("APT::Sandbox::User");
37 if (SandboxUser
.empty())
40 struct passwd
const * const pw
= getpwnam(SandboxUser
.c_str());
44 if (seteuid(pw
->pw_uid
) != 0)
45 return _error
->Errno("seteuid", "seteuid %u failed", pw
->pw_uid
);
48 // check if we can write to destfile
49 for (pkgAcquire::ItemIterator I
= Fetcher
.ItemsBegin();
50 I
!= Fetcher
.ItemsEnd() && res
== true; ++I
)
52 int fd
= open((*I
)->DestFile
.c_str(), O_CREAT
| O_RDWR
, 0600);
57 strprintf(msg
, _("Can't drop privileges for downloading as file '%s' couldn't be accessed by user '%s'."),
58 (*I
)->DestFile
.c_str(), SandboxUser
.c_str());
59 c0out
<< msg
<< std::endl
;
60 _config
->Set("APT::Sandbox::User", "");
66 return _error
->Errno("seteuid", "seteuid %u failed", 0);
71 // CheckAuth - check if each download comes form a trusted source /*{{{*/
72 bool CheckAuth(pkgAcquire
& Fetcher
, bool const PromptUser
)
74 std::string UntrustedList
;
75 for (pkgAcquire::ItemIterator I
= Fetcher
.ItemsBegin(); I
< Fetcher
.ItemsEnd(); ++I
)
76 if (!(*I
)->IsTrusted())
77 UntrustedList
+= std::string((*I
)->ShortDesc()) + " ";
79 if (UntrustedList
== "")
82 return AuthPrompt(UntrustedList
, PromptUser
);
85 bool AuthPrompt(std::string
const &UntrustedList
, bool const PromptUser
)
87 ShowList(c2out
,_("WARNING: The following packages cannot be authenticated!"),UntrustedList
,"");
89 if (_config
->FindB("APT::Get::AllowUnauthenticated",false) == true)
91 c2out
<< _("Authentication warning overridden.\n");
95 if (PromptUser
== false)
96 return _error
->Error(_("Some packages could not be authenticated"));
98 if (_config
->FindI("quiet",0) < 2
99 && _config
->FindB("APT::Get::Assume-Yes",false) == false)
101 c2out
<< _("Install these packages without verification?") << std::flush
;
102 if (!YnPrompt(false))
103 return _error
->Error(_("Some packages could not be authenticated"));
107 else if (_config
->FindB("APT::Get::Force-Yes",false) == true)
110 return _error
->Error(_("There are problems and -y was used without --force-yes"));
113 bool AcquireRun(pkgAcquire
&Fetcher
, int const PulseInterval
, bool * const Failure
, bool * const TransientNetworkFailure
)/*{{{*/
115 pkgAcquire::RunResult res
;
116 if(PulseInterval
> 0)
117 res
= Fetcher
.Run(PulseInterval
);
121 if (res
== pkgAcquire::Failed
)
124 for (pkgAcquire::ItemIterator I
= Fetcher
.ItemsBegin();
125 I
!= Fetcher
.ItemsEnd(); ++I
)
128 if ((*I
)->Status
== pkgAcquire::Item::StatDone
&&
129 (*I
)->Complete
== true)
132 if (TransientNetworkFailure
!= NULL
&& (*I
)->Status
== pkgAcquire::Item::StatIdle
)
134 *TransientNetworkFailure
= true;
138 ::URI
uri((*I
)->DescURI());
140 uri
.Password
.clear();
141 std::string descUri
= std::string(uri
);
142 _error
->Error(_("Failed to fetch %s %s\n"), descUri
.c_str(),
143 (*I
)->ErrorText
.c_str());
152 bool CheckFreeSpaceBeforeDownload(std::string
const &Dir
, unsigned long long FetchBytes
)/*{{{*/
154 uint32_t const RAMFS_MAGIC
= 0x858458f6;
155 /* Check for enough free space, but only if we are actually going to
157 if (_config
->FindB("APT::Get::Print-URIs", false) == true ||
158 _config
->FindB("APT::Get::Download", true) == false)
162 if (statvfs(Dir
.c_str(),&Buf
) != 0) {
163 if (errno
== EOVERFLOW
)
164 return _error
->WarningE("statvfs",_("Couldn't determine free space in %s"),
167 return _error
->Errno("statvfs",_("Couldn't determine free space in %s"),
172 unsigned long long const FreeBlocks
= _config
->Find("APT::Sandbox::User").empty() ? Buf
.f_bfree
: Buf
.f_bavail
;
173 if (FreeBlocks
< (FetchBytes
/ Buf
.f_bsize
))
176 if (statfs(Dir
.c_str(),&Stat
) != 0
177 #if HAVE_STRUCT_STATFS_F_TYPE
178 || Stat
.f_type
!= RAMFS_MAGIC
181 return _error
->Error(_("You don't have enough free space in %s."),