Manager hierarchy
=================

Service		org.chromium.flimflam
Interface	org.chromium.flimflam.Manager
Object path	/

Methods		dict GetProperties()

			Return the global system properties specified
			in the Properties section.

		void SetProperty(string name, variant value)

			Changes the value of the specified property. Only
			properties that are listed as read-write are
			changeable. On success a PropertyChanged signal
			will be emitted.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.InvalidProperty

		string GetState()

			Return the connection state of a system. The
			same value is return via the State property.

		object CreateProfile(string name)

			Create and add new profile with the specified
			identifier name.  The name should either be in the
			form ``name'' or ``~user/name'' where where ``user''
			is the login name of a user suitable for finding
			their home directory.  Both strings must contain
			only alpha-numeric ASCII characters.

			Profiles created without a user name are stored in
			a system directory readable only by the connection
			mananger.  Profiles created with a user name are
			stored in the user's home directory but readable
			only by the connection manager.

			If any existing profile is specified its contents
			are reset to a default (minimal) contents.  If the
			profile is already registered with a CreateProfile
			or PushProfile request then an error is returned.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.AlreadyExists

		object PushProfile(string name)

			Push the profile with the specified identifier
			onto the profile stack.  The profile must have
			previously been created with CreateProfile.
			The profile becomes the ``active profile'' that
			is searched first when loading data and to which
			updates are stored.

			A profile may be pushed only once.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.AlreadyExists

		object InsertUserProfile(string name, string user_hash)

			Add the profile with the specified identifier
			to the profile stack.  The profile must have
			previously been created with CreateProfile.
			The |user_hash| provided is assigned to the
			profile and is made visible as a property of
			the profile.

			A profile may be inserted or pushed only once.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.AlreadyExists

		object PopProfile(string name)

			Pop the top-most profile on the profile stack.
			Any profile beneath this profile becomes the
			``active profile''.  Any services using configuration
			from the popped profile are disconnected and the
                        credentials invalidated (the next time
			credentials are needed they are loaded from the
			(new) active profile).

			The name must match the identifer of the active
			profile.  This is a safeguard against accidentally
			removing the wrong profile.

			Note it is valid to pop all profiles from the
			stack; in this state the connection manager does
			not write any state to persistent storage.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.NotFound

		object PopAnyProfile()

			Like PopProfile but do not check the profile on
			the top of the stack; pop anything.

			Possible Errors: [service].Error.InvalidArguments

		object PopAllUserProfiles()

			Remove all user profiles from the stack of managed
			profiles leaving only default profiles if any exist.

		void RemoveProfile(string name)

			Remove the profile with specified identifier.

			The profile may not be resident on the stack.
			The default profile may not be removed.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.AlreadyExists

		void RequestScan(string type)

			Request a scan for the specified technology. If
			type is the string "" then a scan request is
			made for each technology.

			Possible Errors: [service].Error.InvalidArguments

		void EnableTechnology(string type)

			Enable all technologies of the specified type.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.InProgress
					 [service].Error.AlreadyEnabled

		void DisableTechnology(string type)

			Disable all technologies of the specified type.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.InProgress
					 [service].Error.AlreadyDisabled

		object ConfigureService(dict properties)

			Update the configuration of a service in memory
			and in the profile.  If no matching service exists
			in memory it is temporarily created to carry out
			this work and may be removed later.  The object
			path of the created service is returned.

			If a GUID property is specified in properties
			it is used to find the service; otherwise Type,
			Security, and type-specific properties such as
			WiFi.SSID are used to find any existing service.
			If no service is located in memory a new one is
			created with the supplied properties.

			All provided parameters are applied to the in
			memory service regardless of errors.  But if an
			error occurs while setting a property and the
			service object was created as a result of this
			call it is removed.  In the event of multiple
			errors the first error code is returned by
			this call.

			See the Service Properties section for a list of
			properties and constraints on property values.
			See also GetService.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.NotSupported

		object ConfigureServiceForProfile(object profile,
						  dict properties)

			Create or update the configuration of a WiFi
			service within a specific profile.  This is
			similar to "ConfigureService" above, except
			that this might not change the state of the
			current service.  A matching service is found
			by first looking for a service with matching
			"GUID" property if specified, then by using
			the "Mode", "SSID", and "Security" properties
			from |properties|.

			If a matching service is found but its current
			profile supersedes the specified profile, a new
			profile entry is written with the specified
			properties.  This method can be used for
			configuring a service in the default profile
			while a separate configuration exists in the
			user profile.  In this scenario, no configured
			properties in the user profile entry will be
			copied to the default profile, and the user
			profile remains unchanged.  Moreover, the
			matching service will still refer to the user
			profile.

			A second example usage for this method is creating
			a copy of the current service from the default
			profile into the user profile.  If a matching
			service exists but its current profile antecedes
			the specified profile, the configuration of the
			current service is first copied to the new profile
			without removing the entry in the default profile.
			The service is then assigned to the new profile
			and the specified properties are then applied to
			the service and saved to the new profile, leaving
			the original profile intact.  This differs from the
			behavior of setting the "Profile" property on the
			service via the SetProperty or ConfigureService
			methods, which remove the configuration from the
			old profile.

			In situations where a matching service is not found,
			the service isn't associated with a profile, or the
			specified profile is already associated with the
			matched service, the behavior of this method mimics
			that of ConfigureService.

			Currently this method is only supported for WiFi
			services.  The specified profile must already
			be loaded and on the Manager's profile stack.
			If the "Profile" parameter is set in the properties
			dictionary, it must match the profile parameter.

			This method returns the object path of the created
			or modified service, in cases where a matching
			service will refer to the specified profile.
			Otherwise it returns the special path "/" to signify
			that although the operation succeeded, there is
			no matching service that refers to this profile.

			Possible Errors: [service].Error.InternalError
					 [service].Error.InvalidArguments
					 [service].Error.NotFound
					 [service].Error.NotSupported

		void FindMatchingService(dict properties)

			Find a service that matches all the properties
			and returns the object identifier associated
			with it.  If no service exists in memory that
			matches these arguments, an error is returned.

			See also GetService and ConfgiureService.

			Possible Errors: [service].Error.NotFound

		object GetService(dict properties)

			Return the object path of a service after
			applying any requested configuration changes.
			If no service exists it is created.

			If a GUID property is specified in properties
			it is used to find the service; otherwise Type,
			Security, and type-specific properties such as
			WiFi.SSID are used to find any existing service.
			If no service is located in memory a new one is
			created with the supplied properties.

			All provided parameters are applied to the service
			regardless of errors.  But if an error occurs
			while setting a property and the service was
			created as a result of this call it is removed.
			In the event of multiple errors the first error
			code is returned by this call.

			See the Service Properties section for a list of
			properties and constraints on property values.
			See also ConfigureService.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.NotSupported
					 [service].Error.PermissionDenied
					 [service].Error.InternalError
					 [service].Error.InvalidNetworkName
					 [service].Error.InvalidPassphrase

		object GetVPNService(dict properties) --DEPRECATED--

			Like GetService, but only for "vpn" services and
			without using the GUID property to lookup a service.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.NotSupported
					 [service].Error.PermissionDenied
					 [service].Error.InternalError

		object GetWifiService(dict properties) --DEPRECATED--

			Like GetService, but only for "wifi" services and
			without using the GUID property to lookup a service.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.NotSupported
					 [service].Error.PermissionDenied
					 [service].Error.InternalError
					 [service].Error.InvalidNetworkName
					 [service].Error.InvalidPassphrase

		void SetDebugTags(string taglist)

			Set the debug tags that are enabled for logging to
			syslog. "taglist" is a list of valid tag names
			separated by "+".  Shill silently ignores
			invalid flags.

		string GetDebugTags()
			Get the list of enabled debug tags. The list is
			represented as a string of tag names separated
			by "+".

		string ListDebugTags()
			Get the list of all debug tags that can be enabled.
			The list is represented as a string of tag names
			separated by "+".

		string GetServiceOrder()

			Return a ','-separated string listing known technologies
			in priority ordering.

			For example, the default ordering would be returned as:
				"ethernet,bluetooth,wifi,wimax,cellular"

		void SetServiceOrder(string mask)

			Set the technology priority based on a provided
			','-separated list of technologies, sorted from highest
			priority to lowest.

			The list may contain the following services:
				{ ethernet, wifi, wimax, bluetooth, cellular }
			Technologies not included are assigned the lowest
			priority.

			Technology priority changes occur immediately.

			Possible Errors: [service].Error.InvalidArguments

		void RecheckPortal()

			Retest the portal state of the active service
			if a check is not currently in progress.  This
			will only have an effect if the active service
			is currently in the portal state.

		dict GetNetworksForGeolocation()

		        Returns an array of dictionaries containing information
			about visible cellular and WiFi networks which may be
			then used for Geolocation.
			Each key is a string, and the value itself is an array
			of dictionaries mapping string key-value pairs. Each of
			these (sub) dictionaries contains information about
			one single network for Geolocation.
			For more details, see:
			https://developers.google.com/maps/documentation/business/geolocation/

		boolean VerifyDestination(string certificate,
					  string public_key
					  string nonce,
					  string signed_data,
					  string destination_udn,
					  string hotspot_ssid,
					  string hotspot_bssid)

			Verify that the given |certificate| refers to a valid
			destination with attributes as described in
			|signed_data|.  |certificate| is a x509 certificate in
			PEM format.  |public_key| is the base64 encoded public
			half of a 1024 bit RSA key in DER format.  |nonce| is
			random string of characters.  |destination_udn| is the
			unique device number for the given destination.
			|hotspot_ssid| and |hotspot_bssid| are self explanatory,
			but indicate that shill should not require itself to
			be connected to the destination in question, but instead
			use the specified values.

			|signed_data| formed as follows:

				Suppose we're connected to a destination with
				an SSID of ChromeDest1123, a BSSID of
				00:11::22:33:44:55, a serial number of
				ABCDEFG-1234-5678, a public key of "MIGJAoGB+",
				and a nonce like "2ldg8".  The device takes
				that information and joins it together with
				commas like so:

				"ChromeDest1123,ABCDEFG-1234-5678,00:11:22:33:44:55,MIGJAoGB+,2ldg8"

				The device then takes the SHA-1 hash of that
				string, and encrypts that hash with its private
				key.  The resulting byte string is base64
				encoded and passed as |signed_data|.

			This function verifies that the device described by all
			these pieces of data is a real device by checking that:

			1) The |certificate| is signed by a trusted CA.
			2) The public key signed by the CA matches to the
			   private key used to encrypt |signed_data|.
			3) The public key given is tied to the certificate by
			   being included in the |signed_data|.
			4) A WiFi service is currently connected to the SSID
			   and BSSID in |signed_data|.  This check will be
			   skipped if |hotspot_bssid| and |hotspot_ssid| are
			   of non-zero length.

			If all properties hold, this function will return true,
			otherwise false.


		string VerifyAndEncryptCredentials(string certificate,
						   string public_key
						   string nonce,
						   string signed_data,
						   string destination_udn,
						   string hotspot_ssid,
						   string hotspot_bssid,
						   object service)

			Verifies the given credentials as in VerifyDestination,
			and then uses |public_key| to encrypt the psk for the
			service identified by |service|.  The psk is padded
			with PKCS#1 v1.5.  Returns the base64 encoded,
			encrypted psk, or an empty string on error.

		string VerifyAndEncryptData(string certificate,
					    string public_key
					    string nonce,
					    string signed_data,
					    string destination_udn,
					    string hotspot_ssid,
					    string hotspot_bssid,
					    string data_to_encrypt)

			Verifies the given credentials as in VerifyDestination,
			and then uses |public_key| to encrypt
			|data_to_encrypt|.  The data to encrypt is padded as in
			VerifyAndEncryptCredentials.  Returns the base64 encoded,
			encrypted data, or an empty string on error.

		void ConnectToBestServices()

			For each technology present, connect to the "best"
			service available, as determined by sorting all
			services independent of their current connectivity
			state.  As a general rule, shill does not disrupt
			current connectivity even if "better" connectivity
			options appear.  This method allows this rule to be
			violated for a single instance for each technology
			type.


Signals		PropertyChanged(string name, variant value)

			This signal indicates a changed value of the given
			property.

		StateChanged(string state)

			This signal is similar to the PropertyChanged signal
			for the State property.

			It exists for application state only care about the
			current state and so can avoid to be woken up when
			other details changes.

Properties 	object ActiveProfile [readwrite]

			Object path of the current active profile.

		boolean ArpGateway [readwrite]

			Specifies whether the DHCP client should be
			configured to perform the extra step of performing
			an ARP of the gateway IP address.  This provides
			a level of assurance that the issued IP address is
			valid and not blocked in some manner unknown by the
			DHCP server.

		array{string} AvailableTechnologies [readonly]

			The list of available technologies. The strings
			are the same as the ones from the service types.

		string CheckPortalList [readwrite]

			The list of technologies for which captive portal
			checking is enabled.  This is a comma-separated
			string; e.g. "wifi,wimax,vpn".

		array{string} ConnectedTechnologies [readonly]

			The list of connected technologies. The strings
			are the same as the ones from the service type.

		string ConnectionState [readonly]

			The state of the highest ranked connected service.
			The value of this property is "idle" if there are
			no connected services.  Otherwise this can be any
			of the connected service states, e.g, "portal" or
			"online".

		string Country [readwrite]

			The ISO 3166 country code.  This may not be defined;
			it is defined if manually set or if it is discovered
			through a service such as WiFi, Celluar, or GPS.

		string DefaultService [readonly]

			The current connected service with the default route.

		string DefaultTechnology [readonly]

			The current connected technology which holds the
			default route.

		array{object} Devices [readonly]

			List of device object paths.

		array{string} EnabledTechnologies [readonly]

			The list of enabled technologies. The strings
			are the same as the ones from the service types.

		string HostName [readwrite]

			The hostname to be reported in DHCP requests.
			Some DHCP servers may register a DNS entry on
			behalf of this hostname; others may just make
			available a table for administrators to tell
			what machines are on their network.

			The default for this name is empty, which
			means that the system will not report a hostname.

		string IgnoredDNSSearchPaths [readwrite]

			A comma-separated list of DNS domain suffixes
			which should be ignored when creating a DNS
			search list from DHCP-provided parameters.
			This list will be consulted every time DHCP
			information is updated (while connecting to
			a network, or when a DHCP lease is renewed).

		string LinkMonitorTechnologies [readwrite]

			The list of technologies for which thie Link
			Monitor will be enabled.  The Link monitor
			periodically checks for connectivity to the
			default gateway using ARP requests.

		boolean OfflineMode [readwrite]

			The offline mode indicates the global setting for
			switching all radios on or off. Changing offline mode
			to true results in powering down all devices. When
			leaving offline mode the individual policy of each
			device decides to switch the radio back on or not.

			During offline mode, it is still possible to switch
			certain technologies manually back on. For example
			the limited usage of WiFi or Bluetooth devices might
			be allowed in some situations.

		string PortalURL [readwrite]

			The URL to use when doing captive portal checking.
			When a service reaches the "ready" state and
			captive portal checking is enabled for it; an
			HTTP GET of this URL is done.  If this fails
			with a 204 error then the service is moved
			to the "online" state.  Otherwise the service
			is assumed to be not online and marked in a
			"portal" state.  Note that this check may fail
			for multiple reasons that are indicated in the
			Error property of the service.

		int32 PortalCheckInterval [readwrite]

			The interval in seconds between re-checking a
			service in the portal state.

		array{object} Profiles [readonly]

			List of profile object paths.

		array{object} Services [readonly]

			List of service object paths that are visible. The
			list is sorted internally to have the service with
			the default route always first and then the favorite
			services followed by scan results.

			This list represents the available services for the
			current selected profile. If the profile gets changed
			then this list will be updated.

			The same list is available via the profile object
			itself. It is just provided here for convenience of
			applications only dealing with the current active
			profile.

		array{object} ServiceCompleteList [readonly]

			Complete list of service object paths, including those
			that are not currently visible.  For example, WiFi
			services that are stored in a loaded profile but
			cannot currently be connected are presented in this
			list.

			The services are listed in the same service sorting
			order as the "Services" property above.  Change
			events for this property are not emitted.

		array{object} ServiceWatchList [readonly]

			List of service object paths that are in a
			'non-idle' state.  This indicates the set of services
			which are currently listed as associating, configuring,
			or some other state other than idle, failure or
			unknown.  This allows a caller to use this property
			indication to track which services should be monitored
			for state changes.

			The services are listed in the same service sorting
			order as the "Services" property above, and a change
			event for this property is emitted every time the
			Service list is reordered, even if this list has not
			changed.

		string State [readonly]

			The global connection state of a system. Possible
			values are "online" if at least one connection exists
			and "offline" if no device is connected.

		array{string} UninitializedTechnologies [readonly]

			The list of uninitialized technologies. An
			uninitialized technology is a technology that has at
			least one device that is not initialized yet (i.e.
			the Device object is not created yet). The strings
			are the same as the ones from the service types.
