summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/examples/configure-index1
-rw-r--r--methods/CMakeLists.txt3
-rw-r--r--methods/http.cc20
-rw-r--r--vendor/ubuntu/apt.conf-01-vendor-ubuntu1
4 files changed, 23 insertions, 2 deletions
diff --git a/doc/examples/configure-index b/doc/examples/configure-index
index 7664e0760..497483ccc 100644
--- a/doc/examples/configure-index
+++ b/doc/examples/configure-index
@@ -271,6 +271,7 @@ Acquire
No-Store "false"; // Prevent the cache from storing archives
Dl-Limit "<INT>"; // Kb/sec maximum download rate
User-Agent "Debian APT-HTTP/1.3";
+ User-Agent-Non-Interactive "false"; // include non-interactive if run in systemd service (true on Ubuntu)
Referer "<STRING>"; // Set the HTTP Referer [sic!] header to given value
};
diff --git a/methods/CMakeLists.txt b/methods/CMakeLists.txt
index c4a32b4f5..8589484cf 100644
--- a/methods/CMakeLists.txt
+++ b/methods/CMakeLists.txt
@@ -17,9 +17,10 @@ add_executable(rsh rsh.cc)
target_compile_definitions(connectlib PRIVATE ${GNUTLS_DEFINITIONS})
target_include_directories(connectlib PRIVATE ${GNUTLS_INCLUDE_DIR})
+target_include_directories(http PRIVATE $<$<BOOL:${SYSTEMD_FOUND}>:${SYSTEMD_INCLUDE_DIRS}>)
# Additional libraries to link against for networked stuff
-target_link_libraries(http ${GNUTLS_LIBRARIES})
+target_link_libraries(http ${GNUTLS_LIBRARIES} $<$<BOOL:${SYSTEMD_FOUND}>:${SYSTEMD_LIBRARIES}>)
target_link_libraries(ftp ${GNUTLS_LIBRARIES})
# Install the library
diff --git a/methods/http.cc b/methods/http.cc
index bd866d321..71aa56751 100644
--- a/methods/http.cc
+++ b/methods/http.cc
@@ -45,6 +45,10 @@
#include "http.h"
#include <apti18n.h>
+
+#ifdef HAVE_SYSTEMD
+#include <systemd/sd-login.h>
+#endif
/*}}}*/
using namespace std;
@@ -972,7 +976,21 @@ void HttpMethod::SendReq(FetchItem *Itm)
<< Base64Encode(Uri.User + ":" + Uri.Password) << "\r\n";
Req << "User-Agent: " << ConfigFind("User-Agent",
- "Debian APT-HTTP/1.3 (" PACKAGE_VERSION ")") << "\r\n";
+ "Debian APT-HTTP/1.3 (" PACKAGE_VERSION ")");
+
+#ifdef HAVE_SYSTEMD
+ char *unit = nullptr;
+ sd_pid_get_unit(getpid(), &unit);
+ if (unit != nullptr && *unit != '\0' && not APT::String::Startswith(unit, "user@") // user@ _is_ interactive
+ && unit != "packagekit.service"s // packagekit likely is interactive
+ && unit != "dbus.service"s // aptdaemon and qapt don't have systemd services
+ && ConfigFindB("User-Agent-Non-Interactive", false))
+ Req << " non-interactive";
+
+ free(unit);
+#endif
+
+ Req << "\r\n";
// the famously typoed HTTP header field
auto const referrer = ConfigFind("Referer", "");
diff --git a/vendor/ubuntu/apt.conf-01-vendor-ubuntu b/vendor/ubuntu/apt.conf-01-vendor-ubuntu
index 44e684710..30d25a717 100644
--- a/vendor/ubuntu/apt.conf-01-vendor-ubuntu
+++ b/vendor/ubuntu/apt.conf-01-vendor-ubuntu
@@ -1 +1,2 @@
Acquire::Changelogs::AlwaysOnline "true";
+Acquire::http::User-Agent-Non-Interactive "true";