]>
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 if ((*I
)->DestFile
.empty())
54 // we assume that an existing (partial) file means that we have sufficient rights
55 if (RealFileExists((*I
)->DestFile
))
57 int fd
= open((*I
)->DestFile
.c_str(), O_CREAT
| O_EXCL
| O_RDWR
, 0600);
62 strprintf(msg
, _("Can't drop privileges for downloading as file '%s' couldn't be accessed by user '%s'."),
63 (*I
)->DestFile
.c_str(), SandboxUser
.c_str());
64 std::cerr
<< "W: " << msg
<< std::endl
;
65 _config
->Set("APT::Sandbox::User", "");
68 unlink((*I
)->DestFile
.c_str());
73 return _error
->Errno("seteuid", "seteuid %u failed", 0);
78 // CheckAuth - check if each download comes form a trusted source /*{{{*/
79 bool CheckAuth(pkgAcquire
& Fetcher
, bool const PromptUser
)
81 std::vector
<std::string
> UntrustedList
;
82 for (pkgAcquire::ItemIterator I
= Fetcher
.ItemsBegin(); I
< Fetcher
.ItemsEnd(); ++I
)
83 if (!(*I
)->IsTrusted())
84 UntrustedList
.push_back((*I
)->ShortDesc());
86 if (UntrustedList
.empty())
89 return AuthPrompt(UntrustedList
, PromptUser
);
92 bool AuthPrompt(std::vector
<std::string
> const &UntrustedList
, bool const PromptUser
)
94 ShowList(c2out
,_("WARNING: The following packages cannot be authenticated!"), UntrustedList
,
95 [](std::string
const&) { return true; },
96 [](std::string
const&str
) { return str
; },
97 [](std::string
const&) { return ""; });
99 if (_config
->FindB("APT::Get::AllowUnauthenticated",false) == true)
101 c2out
<< _("Authentication warning overridden.\n");
105 if (PromptUser
== false)
106 return _error
->Error(_("Some packages could not be authenticated"));
108 if (_config
->FindI("quiet",0) < 2
109 && _config
->FindB("APT::Get::Assume-Yes",false) == false)
111 c2out
<< _("Install these packages without verification?") << std::flush
;
112 if (!YnPrompt(false))
113 return _error
->Error(_("Some packages could not be authenticated"));
117 else if (_config
->FindB("APT::Get::Force-Yes",false) == true) {
118 _error
->Warning(_("--force-yes is deprecated, use one of the options starting with --allow instead."));
122 return _error
->Error(_("There were unauthenticated packages and -y was used without --allow-unauthenticated"));
125 bool AcquireRun(pkgAcquire
&Fetcher
, int const PulseInterval
, bool * const Failure
, bool * const TransientNetworkFailure
)/*{{{*/
127 pkgAcquire::RunResult res
;
128 if(PulseInterval
> 0)
129 res
= Fetcher
.Run(PulseInterval
);
133 if (res
== pkgAcquire::Failed
)
136 for (pkgAcquire::ItemIterator I
= Fetcher
.ItemsBegin();
137 I
!= Fetcher
.ItemsEnd(); ++I
)
140 if ((*I
)->Status
== pkgAcquire::Item::StatDone
&&
141 (*I
)->Complete
== true)
144 if (TransientNetworkFailure
!= NULL
&& (*I
)->Status
== pkgAcquire::Item::StatIdle
)
146 *TransientNetworkFailure
= true;
150 ::URI
uri((*I
)->DescURI());
152 uri
.Password
.clear();
153 std::string descUri
= std::string(uri
);
154 _error
->Error(_("Failed to fetch %s %s\n"), descUri
.c_str(),
155 (*I
)->ErrorText
.c_str());
164 bool CheckFreeSpaceBeforeDownload(std::string
const &Dir
, unsigned long long FetchBytes
)/*{{{*/
166 uint32_t const RAMFS_MAGIC
= 0x858458f6;
167 /* Check for enough free space, but only if we are actually going to
169 if (_config
->FindB("APT::Get::Print-URIs", false) == true ||
170 _config
->FindB("APT::Get::Download", true) == false)
174 if (statvfs(Dir
.c_str(),&Buf
) != 0) {
175 if (errno
== EOVERFLOW
)
176 return _error
->WarningE("statvfs",_("Couldn't determine free space in %s"),
179 return _error
->Errno("statvfs",_("Couldn't determine free space in %s"),
184 unsigned long long const FreeBlocks
= _config
->Find("APT::Sandbox::User").empty() ? Buf
.f_bfree
: Buf
.f_bavail
;
185 if (FreeBlocks
< (FetchBytes
/ Buf
.f_bsize
))
188 if (statfs(Dir
.c_str(),&Stat
) != 0
189 #if HAVE_STRUCT_STATFS_F_TYPE
190 || Stat
.f_type
!= RAMFS_MAGIC
193 return _error
->Error(_("You don't have enough free space in %s."),