diff options
Diffstat (limited to 'src/ppp-manager')
| -rw-r--r-- | src/ppp-manager/Makefile.in | 57 | ||||
| -rw-r--r-- | src/ppp-manager/nm-ppp-manager.c | 226 | ||||
| -rw-r--r-- | src/ppp-manager/nm-ppp-manager.h | 8 | ||||
| -rw-r--r-- | src/ppp-manager/nm-pppd-plugin.c | 4 |
4 files changed, 168 insertions, 127 deletions
diff --git a/src/ppp-manager/Makefile.in b/src/ppp-manager/Makefile.in index f8f55d2c..13c60b41 100644 --- a/src/ppp-manager/Makefile.in +++ b/src/ppp-manager/Makefile.in @@ -38,11 +38,16 @@ subdir = src/ppp-manager DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/compiler_warnings.m4 \ - $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/intltool.m4 \ - $(top_srcdir)/m4/libnl-check.m4 $(top_srcdir)/m4/libtool.m4 \ - $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ - $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ - $(top_srcdir)/m4/nls.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \ + $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libnl-check.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -96,7 +101,7 @@ nm_pppd_plugin_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ -o $@ @WITH_PPP_TRUE@am_nm_pppd_plugin_la_rpath = -rpath $(pppd_plugindir) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/depcomp +depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ @@ -128,7 +133,6 @@ ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ -ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ @@ -137,13 +141,15 @@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ -CATALOGS = @CATALOGS@ -CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DBUS_CFLAGS = @DBUS_CFLAGS@ @@ -155,6 +161,7 @@ DHCLIENT_PATH = @DHCLIENT_PATH@ DHCLIENT_VERSION = @DHCLIENT_VERSION@ DHCPCD_PATH = @DHCPCD_PATH@ DISABLE_DEPRECATED = @DISABLE_DEPRECATED@ +DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ @@ -163,6 +170,7 @@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ @@ -171,8 +179,8 @@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GMODULE_CFLAGS = @GMODULE_CFLAGS@ GMODULE_LIBS = @GMODULE_LIBS@ -GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GREP = @GREP@ @@ -187,13 +195,23 @@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ IPTABLES_PATH = @IPTABLES_PATH@ +IWMX_SDK_CFLAGS = @IWMX_SDK_CFLAGS@ +IWMX_SDK_LIBS = @IWMX_SDK_LIBS@ KERNEL_FIRMWARE_DIR = @KERNEL_FIRMWARE_DIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ @@ -201,6 +219,8 @@ LIBDL = @LIBDL@ LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@ LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBNL_CFLAGS = @LIBNL_CFLAGS@ LIBNL_LIBS = @LIBNL_LIBS@ @@ -209,13 +229,15 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ -MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ -MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ @@ -241,13 +263,12 @@ PKGCONFIG_PATH = @PKGCONFIG_PATH@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ -POFILES = @POFILES@ POLKIT_CFLAGS = @POLKIT_CFLAGS@ POLKIT_LIBS = @POLKIT_LIBS@ POSUB = @POSUB@ -PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ -PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PPPD_PLUGIN_DIR = @PPPD_PLUGIN_DIR@ +QT_CFLAGS = @QT_CFLAGS@ +QT_LIBS = @QT_LIBS@ RANLIB = @RANLIB@ RESOLVCONF_PATH = @RESOLVCONF_PATH@ SED = @SED@ @@ -261,11 +282,15 @@ UUID_CFLAGS = @UUID_CFLAGS@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ diff --git a/src/ppp-manager/nm-ppp-manager.c b/src/ppp-manager/nm-ppp-manager.c index 1258b8f6..767b9315 100644 --- a/src/ppp-manager/nm-ppp-manager.c +++ b/src/ppp-manager/nm-ppp-manager.c @@ -82,6 +82,7 @@ typedef struct { NMActRequest *act_req; DBusGMethodInvocation *pending_secrets_context; + guint32 secrets_id; guint32 ppp_watch_id; guint32 ppp_timeout_handler; @@ -203,8 +204,7 @@ set_property (GObject *object, guint prop_id, switch (prop_id) { case PROP_PARENT_IFACE: - if (priv->parent_iface) - g_free (priv->parent_iface); + g_free (priv->parent_iface); priv->parent_iface = g_value_dup_string (value); break; default: @@ -350,19 +350,29 @@ remove_timeout_handler (NMPPPManager *manager) } static void -impl_ppp_manager_need_secrets (NMPPPManager *manager, - DBusGMethodInvocation *context) +cancel_get_secrets (NMPPPManager *self) +{ + NMPPPManagerPrivate *priv = NM_PPP_MANAGER_GET_PRIVATE (self); + + if (priv->secrets_id) { + nm_act_request_cancel_secrets (priv->act_req, priv->secrets_id); + priv->secrets_id = 0; + } +} + +static gboolean +extract_details_from_connection (NMConnection *connection, + const char **username, + const char **password, + GError **error) { - NMPPPManagerPrivate *priv = NM_PPP_MANAGER_GET_PRIVATE (manager); - NMConnection *connection; NMSettingConnection *s_con; + NMSetting *setting; const char *connection_type; - const char *setting_name; - guint32 tries; - GPtrArray *hints = NULL; - const char *hint1 = NULL, *hint2 = NULL; - connection = nm_act_request_get_connection (priv->act_req); + g_return_val_if_fail (connection != NULL, FALSE); + g_return_val_if_fail (username != NULL, FALSE); + g_return_val_if_fail (password != NULL, FALSE); s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION)); g_assert (s_con); @@ -370,67 +380,117 @@ impl_ppp_manager_need_secrets (NMPPPManager *manager, connection_type = nm_setting_connection_get_connection_type (s_con); g_assert (connection_type); + setting = nm_connection_get_setting_by_name (connection, connection_type); + if (!setting) { + g_set_error_literal (error, NM_PPP_MANAGER_ERROR, NM_PPP_MANAGER_ERROR_UNKOWN, + "Missing type-specific setting; no secrets could be found."); + return FALSE; + } + + /* FIXME: push this down to the settings and keep PPP manager generic */ + if (NM_IS_SETTING_PPPOE (setting)) { + *username = nm_setting_pppoe_get_username (NM_SETTING_PPPOE (setting)); + *password = nm_setting_pppoe_get_password (NM_SETTING_PPPOE (setting)); + } else if (NM_IS_SETTING_GSM (setting)) { + *username = nm_setting_gsm_get_username (NM_SETTING_GSM (setting)); + *password = nm_setting_gsm_get_password (NM_SETTING_GSM (setting)); + } else if (NM_IS_SETTING_CDMA (setting)) { + *username = nm_setting_cdma_get_username (NM_SETTING_CDMA (setting)); + *password = nm_setting_cdma_get_password (NM_SETTING_CDMA (setting)); + } + + return TRUE; +} + +static void +ppp_secrets_cb (NMActRequest *req, + guint32 call_id, + NMConnection *connection, + GError *error, + gpointer user_data) +{ + NMPPPManager *self = NM_PPP_MANAGER (user_data); + NMPPPManagerPrivate *priv = NM_PPP_MANAGER_GET_PRIVATE (self); + const char *username = NULL; + const char *password = NULL; + GError *local = NULL; + + g_return_if_fail (priv->pending_secrets_context != NULL); + g_return_if_fail (req == priv->act_req); + g_return_if_fail (call_id == priv->secrets_id); + + if (error) { + nm_log_warn (LOGD_PPP, "%s", error->message); + dbus_g_method_return_error (priv->pending_secrets_context, error); + goto out; + } + + if (!extract_details_from_connection (connection, &username, &password, &local)) { + nm_log_warn (LOGD_PPP, "%s", local->message); + dbus_g_method_return_error (priv->pending_secrets_context, local); + g_clear_error (&local); + goto out; + } + + /* This is sort of a hack but... + * pppd plugin only ever needs username and password. Passing the full + * connection there would mean some bloat: the plugin would need to link + * against libnm-util just to parse this. So instead, let's just send what + * it needs. + */ + dbus_g_method_return (priv->pending_secrets_context, username, password); + +out: + priv->pending_secrets_context = NULL; + priv->secrets_id = 0; +} + +static void +impl_ppp_manager_need_secrets (NMPPPManager *manager, + DBusGMethodInvocation *context) +{ + NMPPPManagerPrivate *priv = NM_PPP_MANAGER_GET_PRIVATE (manager); + NMConnection *connection; + const char *setting_name; + const char *username = NULL; + const char *password = NULL; + guint32 tries; + GPtrArray *hints = NULL; + GError *error = NULL; + NMSettingsGetSecretsFlags flags = NM_SETTINGS_GET_SECRETS_FLAG_ALLOW_INTERACTION; + + connection = nm_act_request_get_connection (priv->act_req); + nm_connection_clear_secrets (connection); setting_name = nm_connection_need_secrets (connection, &hints); if (!setting_name) { - NMSetting *setting; - - setting = nm_connection_get_setting_by_name (connection, connection_type); - if (setting) { - const char *username = NULL; - const char *password = NULL; - - /* FIXME: push this down to the settings and keep PPP manager generic */ - if (NM_IS_SETTING_PPPOE (setting)) { - username = nm_setting_pppoe_get_username (NM_SETTING_PPPOE (setting)); - password = nm_setting_pppoe_get_password (NM_SETTING_PPPOE (setting)); - } else if (NM_IS_SETTING_GSM (setting)) { - username = nm_setting_gsm_get_username (NM_SETTING_GSM (setting)); - password = nm_setting_gsm_get_password (NM_SETTING_GSM (setting)); - } else if (NM_IS_SETTING_CDMA (setting)) { - username = nm_setting_cdma_get_username (NM_SETTING_CDMA (setting)); - password = nm_setting_cdma_get_password (NM_SETTING_CDMA (setting)); - } - - /* If secrets are not required, send the existing username and password - * back to the PPP plugin immediately. - */ + /* Use existing secrets from the connection */ + if (extract_details_from_connection (connection, &username, &password, &error)) { + /* Send existing secrets to the PPP plugin */ priv->pending_secrets_context = context; - nm_ppp_manager_update_secrets (manager, - priv->parent_iface, - username ? username : "", - password ? password : "", - NULL); + ppp_secrets_cb (priv->act_req, priv->secrets_id, connection, NULL, manager); } else { - GError *err = NULL; - - g_set_error (&err, NM_PPP_MANAGER_ERROR, NM_PPP_MANAGER_ERROR_UNKOWN, - "Missing type-specific setting; no secrets could be found."); - nm_log_warn (LOGD_PPP, "%s", err->message); - dbus_g_method_return_error (context, err); + nm_log_warn (LOGD_PPP, "%s", error->message); + dbus_g_method_return_error (priv->pending_secrets_context, error); + g_clear_error (&error); } return; } - /* Extract hints */ - if (hints) { - if (hints->len > 0) - hint1 = g_ptr_array_index (hints, 0); - if (hints->len > 1) - hint2 = g_ptr_array_index (hints, 1); - } - - tries = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (connection), PPP_MANAGER_SECRET_TRIES)); - /* Only ask for completely new secrets after retrying them once; some PPP - * servers (T-Mobile USA) appear to ask a few times when they actually don't - * even care what you pass back. + /* Only ask for completely new secrets after retrying them once; some devices + * appear to ask a few times when they actually don't even care what you + * pass back. */ - nm_act_request_get_secrets (priv->act_req, - setting_name, - tries > 1 ? TRUE : FALSE, - SECRETS_CALLER_PPP, - hint1, - hint2); + tries = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (connection), PPP_MANAGER_SECRET_TRIES)); + if (tries > 1) + flags |= NM_SETTINGS_GET_SECRETS_FLAG_REQUEST_NEW; + + priv->secrets_id = nm_act_request_get_secrets (priv->act_req, + setting_name, + flags, + hints ? g_ptr_array_index (hints, 0) : NULL, + ppp_secrets_cb, + manager); g_object_set_data (G_OBJECT (connection), PPP_MANAGER_SECRET_TRIES, GUINT_TO_POINTER (++tries)); priv->pending_secrets_context = context; @@ -982,46 +1042,6 @@ nm_ppp_manager_start (NMPPPManager *manager, return priv->pid > 0; } -void -nm_ppp_manager_update_secrets (NMPPPManager *manager, - const char *device, - const char *username, - const char *password, - const char *error_message) -{ - NMPPPManagerPrivate *priv = NM_PPP_MANAGER_GET_PRIVATE (manager); - - g_return_if_fail (NM_IS_PPP_MANAGER (manager)); - g_return_if_fail (device != NULL); - g_return_if_fail (priv->pending_secrets_context != NULL); - - if (error_message) { - g_return_if_fail (username == NULL); - g_return_if_fail (password == NULL); - } else { - g_return_if_fail (username != NULL); - g_return_if_fail (password != NULL); - } - - if (error_message) { - GError *err = NULL; - - g_set_error (&err, NM_PPP_MANAGER_ERROR, NM_PPP_MANAGER_ERROR_UNKOWN, "%s", error_message); - nm_log_warn (LOGD_PPP, "%s", error_message); - dbus_g_method_return_error (priv->pending_secrets_context, err); - g_error_free (err); - } else { - /* This is sort of a hack but... - pppd plugin only ever needs username and password. - Passing the full connection there would mean some bloat: - the plugin would need to link against libnm-util just to parse this. - So instead, let's just send what it needs */ - - dbus_g_method_return (priv->pending_secrets_context, username, password); - } - priv->pending_secrets_context = NULL; -} - static gboolean ensure_killed (gpointer data) { @@ -1047,6 +1067,8 @@ _ppp_cleanup (NMPPPManager *manager) priv = NM_PPP_MANAGER_GET_PRIVATE (manager); + cancel_get_secrets (manager); + if (priv->monitor_id) { g_source_remove (priv->monitor_id); priv->monitor_id = 0; diff --git a/src/ppp-manager/nm-ppp-manager.h b/src/ppp-manager/nm-ppp-manager.h index 51684157..c38602fc 100644 --- a/src/ppp-manager/nm-ppp-manager.h +++ b/src/ppp-manager/nm-ppp-manager.h @@ -16,7 +16,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * Copyright (C) 2008 Novell, Inc. - * Copyright (C) 2008 Red Hat, Inc. + * Copyright (C) 2008 - 2010 Red Hat, Inc. */ #ifndef NM_PPP_MANAGER_H @@ -63,12 +63,6 @@ gboolean nm_ppp_manager_start (NMPPPManager *manager, guint32 timeout_secs, GError **err); -void nm_ppp_manager_update_secrets (NMPPPManager *manager, - const char *device, - const char *username, - const char *password, - const char *error_message); - #define NM_PPP_MANAGER_ERROR nm_ppp_manager_error_quark() #define NM_TYPE_PPP_MANAGER_ERROR (nm_ppp_manager_error_get_type ()) diff --git a/src/ppp-manager/nm-pppd-plugin.c b/src/ppp-manager/nm-pppd-plugin.c index c64bb87f..e2e5c709 100644 --- a/src/ppp-manager/nm-pppd-plugin.c +++ b/src/ppp-manager/nm-pppd-plugin.c @@ -240,13 +240,13 @@ nm_ip_up (void *data, int arg) } static int -get_chap_check() +get_chap_check (void) { return 1; } static int -get_pap_check() +get_pap_check (void) { return 1; } |