diff options
Diffstat (limited to 'libnm-util')
86 files changed, 0 insertions, 43578 deletions
diff --git a/libnm-util/COPYING b/libnm-util/COPYING deleted file mode 100644 index 2ec1380e34..0000000000 --- a/libnm-util/COPYING +++ /dev/null @@ -1,488 +0,0 @@ -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2 of the License, or (at your option) any later version. - - - GNU LIBRARY GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1991 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the library GPL. It is - numbered 2 because it goes with version 2 of the ordinary GPL.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Library General Public License, applies to some -specially designated Free Software Foundation software, and to any -other libraries whose authors decide to use it. You can use it for -your libraries, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if -you distribute copies of the library, or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link a program with the library, you must provide -complete object files to the recipients so that they can relink them -with the library, after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - Our method of protecting your rights has two steps: (1) copyright -the library, and (2) offer you this license which gives you legal -permission to copy, distribute and/or modify the library. - - Also, for each distributor's protection, we want to make certain -that everyone understands that there is no warranty for this free -library. If the library is modified by someone else and passed on, we -want its recipients to know that what they have is not the original -version, so that any problems introduced by others will not reflect on -the original authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that companies distributing free -software will individually obtain patent licenses, thus in effect -transforming the program into proprietary software. To prevent this, -we have made it clear that any patent must be licensed for everyone's -free use or not licensed at all. - - Most GNU software, including some libraries, is covered by the ordinary -GNU General Public License, which was designed for utility programs. This -license, the GNU Library General Public License, applies to certain -designated libraries. This license is quite different from the ordinary -one; be sure to read it in full, and don't assume that anything in it is -the same as in the ordinary license. - - The reason we have a separate public license for some libraries is that -they blur the distinction we usually make between modifying or adding to a -program and simply using it. Linking a program with a library, without -changing the library, is in some sense simply using the library, and is -analogous to running a utility program or application program. However, in -a textual and legal sense, the linked executable is a combined work, a -derivative of the original library, and the ordinary General Public License -treats it as such. - - Because of this blurred distinction, using the ordinary General -Public License for libraries did not effectively promote software -sharing, because most developers did not use the libraries. We -concluded that weaker conditions might promote sharing better. - - However, unrestricted linking of non-free programs would deprive the -users of those programs of all benefit from the free status of the -libraries themselves. This Library General Public License is intended to -permit developers of non-free programs to use free libraries, while -preserving your freedom as a user of such programs to change the free -libraries that are incorporated in them. (We have not seen how to achieve -this as regards changes in header files, but we have achieved it as regards -changes in the actual functions of the Library.) The hope is that this -will lead to faster development of free libraries. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, while the latter only -works together with the library. - - Note that it is possible for a library to be covered by the ordinary -General Public License rather than by this special one. - - GNU LIBRARY GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library which -contains a notice placed by the copyright holder or other authorized -party saying it may be distributed under the terms of this Library -General Public License (also called "this License"). Each licensee is -addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also compile or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - c) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - d) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the source code distributed need not include anything that is normally -distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Library General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - <one line to give the library's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the - Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - <signature of Ty Coon>, 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! diff --git a/libnm-util/NetworkManager.h b/libnm-util/NetworkManager.h deleted file mode 100644 index b4f8b97f98..0000000000 --- a/libnm-util/NetworkManager.h +++ /dev/null @@ -1,555 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Copyright 2004 - 2014 Red Hat, Inc. - */ - -/* Definitions related to NetworkManager's D-Bus interfaces. - * - * Note that although this header is installed as part of libnm-util, it is also - * used by some external code that does not link to libnm-util. - */ - -#ifndef NETWORK_MANAGER_H -#define NETWORK_MANAGER_H - -/* This header must not include glib or libnm. */ - -#include "nm-version-macros.h" - -/* - * dbus services details - */ -#define NM_DBUS_SERVICE "org.freedesktop.NetworkManager" - -#define NM_DBUS_PATH "/org/freedesktop/NetworkManager" -#define NM_DBUS_INTERFACE "org.freedesktop.NetworkManager" -#define NM_DBUS_INTERFACE_DEVICE NM_DBUS_INTERFACE ".Device" -#define NM_DBUS_INTERFACE_DEVICE_WIRED NM_DBUS_INTERFACE_DEVICE ".Wired" -#define NM_DBUS_INTERFACE_DEVICE_ADSL NM_DBUS_INTERFACE_DEVICE ".Adsl" -#define NM_DBUS_INTERFACE_DEVICE_WIRELESS NM_DBUS_INTERFACE_DEVICE ".Wireless" -#define NM_DBUS_INTERFACE_DEVICE_BLUETOOTH NM_DBUS_INTERFACE_DEVICE ".Bluetooth" -#define NM_DBUS_INTERFACE_DEVICE_OLPC_MESH NM_DBUS_INTERFACE_DEVICE ".OlpcMesh" -#define NM_DBUS_PATH_ACCESS_POINT NM_DBUS_PATH "/AccessPoint" -#define NM_DBUS_INTERFACE_ACCESS_POINT NM_DBUS_INTERFACE ".AccessPoint" -#define NM_DBUS_INTERFACE_DEVICE_MODEM NM_DBUS_INTERFACE_DEVICE ".Modem" -#define NM_DBUS_INTERFACE_DEVICE_WIMAX NM_DBUS_INTERFACE_DEVICE ".WiMax" -#define NM_DBUS_INTERFACE_WIMAX_NSP NM_DBUS_INTERFACE ".WiMax.Nsp" -#define NM_DBUS_PATH_WIMAX_NSP NM_DBUS_PATH "/Nsp" -#define NM_DBUS_INTERFACE_ACTIVE_CONNECTION NM_DBUS_INTERFACE ".Connection.Active" -#define NM_DBUS_INTERFACE_IP4_CONFIG NM_DBUS_INTERFACE ".IP4Config" -#define NM_DBUS_INTERFACE_DHCP4_CONFIG NM_DBUS_INTERFACE ".DHCP4Config" -#define NM_DBUS_INTERFACE_IP6_CONFIG NM_DBUS_INTERFACE ".IP6Config" -#define NM_DBUS_INTERFACE_DHCP6_CONFIG NM_DBUS_INTERFACE ".DHCP6Config" -#define NM_DBUS_INTERFACE_DEVICE_INFINIBAND NM_DBUS_INTERFACE_DEVICE ".Infiniband" -#define NM_DBUS_INTERFACE_DEVICE_BOND NM_DBUS_INTERFACE_DEVICE ".Bond" -#define NM_DBUS_INTERFACE_DEVICE_TEAM NM_DBUS_INTERFACE_DEVICE ".Team" -#define NM_DBUS_INTERFACE_DEVICE_VLAN NM_DBUS_INTERFACE_DEVICE ".Vlan" -#define NM_DBUS_INTERFACE_DEVICE_BRIDGE NM_DBUS_INTERFACE_DEVICE ".Bridge" -#define NM_DBUS_INTERFACE_DEVICE_GENERIC NM_DBUS_INTERFACE_DEVICE ".Generic" -#define NM_DBUS_INTERFACE_DEVICE_VETH NM_DBUS_INTERFACE_DEVICE ".Veth" -#define NM_DBUS_INTERFACE_DEVICE_TUN NM_DBUS_INTERFACE_DEVICE ".Tun" -#define NM_DBUS_INTERFACE_DEVICE_MACVLAN NM_DBUS_INTERFACE_DEVICE ".Macvlan" -#define NM_DBUS_INTERFACE_DEVICE_VXLAN NM_DBUS_INTERFACE_DEVICE ".Vxlan" -#define NM_DBUS_INTERFACE_DEVICE_GRE NM_DBUS_INTERFACE_DEVICE ".Gre" - -#define NM_DBUS_IFACE_SETTINGS "org.freedesktop.NetworkManager.Settings" -#define NM_DBUS_PATH_SETTINGS "/org/freedesktop/NetworkManager/Settings" - -#define NM_DBUS_IFACE_SETTINGS_CONNECTION "org.freedesktop.NetworkManager.Settings.Connection" -#define NM_DBUS_PATH_SETTINGS_CONNECTION "/org/freedesktop/NetworkManager/Settings/Connection" -#define NM_DBUS_IFACE_SETTINGS_CONNECTION_SECRETS "org.freedesktop.NetworkManager.Settings.Connection.Secrets" - -#define NM_DBUS_INTERFACE_AGENT_MANAGER NM_DBUS_INTERFACE ".AgentManager" -#define NM_DBUS_PATH_AGENT_MANAGER "/org/freedesktop/NetworkManager/AgentManager" - -#define NM_DBUS_INTERFACE_SECRET_AGENT NM_DBUS_INTERFACE ".SecretAgent" -#define NM_DBUS_PATH_SECRET_AGENT "/org/freedesktop/NetworkManager/SecretAgent" - -/** - * NMState: - * @NM_STATE_UNKNOWN: networking state is unknown - * @NM_STATE_ASLEEP: networking is not enabled - * @NM_STATE_DISCONNECTED: there is no active network connection - * @NM_STATE_DISCONNECTING: network connections are being cleaned up - * @NM_STATE_CONNECTING: a network connection is being started - * @NM_STATE_CONNECTED_LOCAL: there is only local IPv4 and/or IPv6 connectivity - * @NM_STATE_CONNECTED_SITE: there is only site-wide IPv4 and/or IPv6 connectivity - * @NM_STATE_CONNECTED_GLOBAL: there is global IPv4 and/or IPv6 Internet connectivity - * - * #NMState values indicate the current overall networking state. - **/ -typedef enum { - NM_STATE_UNKNOWN = 0, - NM_STATE_ASLEEP = 10, - NM_STATE_DISCONNECTED = 20, - NM_STATE_DISCONNECTING = 30, - NM_STATE_CONNECTING = 40, - NM_STATE_CONNECTED_LOCAL = 50, - NM_STATE_CONNECTED_SITE = 60, - NM_STATE_CONNECTED_GLOBAL = 70, -} NMState; - -/* For backwards compat */ -#define NM_STATE_CONNECTED NM_STATE_CONNECTED_GLOBAL - -/** - * NMConnectivityState: - * @NM_CONNECTIVITY_UNKNOWN: Network connectivity is unknown. - * @NM_CONNECTIVITY_NONE: The host is not connected to any network. - * @NM_CONNECTIVITY_PORTAL: The host is behind a captive portal and - * cannot reach the full Internet. - * @NM_CONNECTIVITY_LIMITED: The host is connected to a network, but - * does not appear to be able to reach the full Internet. - * @NM_CONNECTIVITY_FULL: The host is connected to a network, and - * appears to be able to reach the full Internet. - * - * Since: 0.9.8.6 - */ -typedef enum { - NM_CONNECTIVITY_UNKNOWN = 0, - NM_CONNECTIVITY_NONE = 1, - NM_CONNECTIVITY_PORTAL = 2, - NM_CONNECTIVITY_LIMITED = 3, - NM_CONNECTIVITY_FULL = 4, -} NMConnectivityState; - -/** - * NMDeviceType: - * @NM_DEVICE_TYPE_UNKNOWN: unknown device - * @NM_DEVICE_TYPE_GENERIC: generic support for unrecognized device types - * @NM_DEVICE_TYPE_ETHERNET: a wired ethernet device - * @NM_DEVICE_TYPE_WIFI: an 802.11 Wi-Fi device - * @NM_DEVICE_TYPE_UNUSED1: not used - * @NM_DEVICE_TYPE_UNUSED2: not used - * @NM_DEVICE_TYPE_BT: a Bluetooth device supporting PAN or DUN access protocols - * @NM_DEVICE_TYPE_OLPC_MESH: an OLPC XO mesh networking device - * @NM_DEVICE_TYPE_WIMAX: an 802.16e Mobile WiMAX broadband device - * @NM_DEVICE_TYPE_MODEM: a modem supporting analog telephone, CDMA/EVDO, - * GSM/UMTS, or LTE network access protocols - * @NM_DEVICE_TYPE_INFINIBAND: an IP-over-InfiniBand device - * @NM_DEVICE_TYPE_BOND: a bond master interface - * @NM_DEVICE_TYPE_VLAN: an 802.1Q VLAN interface - * @NM_DEVICE_TYPE_ADSL: ADSL modem - * @NM_DEVICE_TYPE_BRIDGE: a bridge master interface - * @NM_DEVICE_TYPE_TEAM: a team master interface - * @NM_DEVICE_TYPE_TUN: a TUN/TAP interface - * @NM_DEVICE_TYPE_IP_TUNNEL: an IP tunnel interface - * @NM_DEVICE_TYPE_MACVLAN: a MACVLAN interface - * @NM_DEVICE_TYPE_VXLAN: a VXLAN interface - * @NM_DEVICE_TYPE_VETH: a VETH interface - * - * #NMDeviceType values indicate the type of hardware represented by - * an #NMDevice. - **/ -typedef enum { - NM_DEVICE_TYPE_UNKNOWN = 0, - NM_DEVICE_TYPE_ETHERNET = 1, - NM_DEVICE_TYPE_WIFI = 2, - NM_DEVICE_TYPE_UNUSED1 = 3, - NM_DEVICE_TYPE_UNUSED2 = 4, - NM_DEVICE_TYPE_BT = 5, /* Bluetooth */ - NM_DEVICE_TYPE_OLPC_MESH = 6, - NM_DEVICE_TYPE_WIMAX = 7, - NM_DEVICE_TYPE_MODEM = 8, - NM_DEVICE_TYPE_INFINIBAND = 9, - NM_DEVICE_TYPE_BOND = 10, - NM_DEVICE_TYPE_VLAN = 11, - NM_DEVICE_TYPE_ADSL = 12, - NM_DEVICE_TYPE_BRIDGE = 13, - NM_DEVICE_TYPE_GENERIC = 14, - NM_DEVICE_TYPE_TEAM = 15, - NM_DEVICE_TYPE_TUN = 16, - NM_DEVICE_TYPE_IP_TUNNEL = 17, - NM_DEVICE_TYPE_MACVLAN = 18, - NM_DEVICE_TYPE_VXLAN = 19, - NM_DEVICE_TYPE_VETH = 20, -} NMDeviceType; - -/** - * NMDeviceCapabilities: - * @NM_DEVICE_CAP_NONE: device has no special capabilities - * @NM_DEVICE_CAP_NM_SUPPORTED: NetworkManager supports this device - * @NM_DEVICE_CAP_CARRIER_DETECT: this device can indicate carrier status - * @NM_DEVICE_CAP_IS_SOFTWARE: this device is a software device - * - * General device capability flags. - **/ -typedef enum { /*< flags >*/ - NM_DEVICE_CAP_NONE = 0x00000000, - NM_DEVICE_CAP_NM_SUPPORTED = 0x00000001, - NM_DEVICE_CAP_CARRIER_DETECT = 0x00000002, - NM_DEVICE_CAP_IS_SOFTWARE = 0x00000004, -} NMDeviceCapabilities; - -/** - * NMDeviceWifiCapabilities: - * @NM_WIFI_DEVICE_CAP_NONE: device has no encryption/authentication capabilities - * @NM_WIFI_DEVICE_CAP_CIPHER_WEP40: device supports 40/64-bit WEP encryption - * @NM_WIFI_DEVICE_CAP_CIPHER_WEP104: device supports 104/128-bit WEP encryption - * @NM_WIFI_DEVICE_CAP_CIPHER_TKIP: device supports TKIP encryption - * @NM_WIFI_DEVICE_CAP_CIPHER_CCMP: device supports AES/CCMP encryption - * @NM_WIFI_DEVICE_CAP_WPA: device supports WPA1 authentication - * @NM_WIFI_DEVICE_CAP_RSN: device supports WPA2/RSN authentication - * @NM_WIFI_DEVICE_CAP_AP: device supports Access Point mode - * @NM_WIFI_DEVICE_CAP_ADHOC: device supports Ad-Hoc mode - * @NM_WIFI_DEVICE_CAP_FREQ_VALID: device reports frequency capabilities - * @NM_WIFI_DEVICE_CAP_FREQ_2GHZ: device supports 2.4GHz frequencies - * @NM_WIFI_DEVICE_CAP_FREQ_5GHZ: device supports 5GHz frequencies - * - * 802.11 specific device encryption and authentication capabilities. - **/ -typedef enum { /*< flags >*/ - NM_WIFI_DEVICE_CAP_NONE = 0x00000000, - NM_WIFI_DEVICE_CAP_CIPHER_WEP40 = 0x00000001, - NM_WIFI_DEVICE_CAP_CIPHER_WEP104 = 0x00000002, - NM_WIFI_DEVICE_CAP_CIPHER_TKIP = 0x00000004, - NM_WIFI_DEVICE_CAP_CIPHER_CCMP = 0x00000008, - NM_WIFI_DEVICE_CAP_WPA = 0x00000010, - NM_WIFI_DEVICE_CAP_RSN = 0x00000020, - NM_WIFI_DEVICE_CAP_AP = 0x00000040, - NM_WIFI_DEVICE_CAP_ADHOC = 0x00000080, - NM_WIFI_DEVICE_CAP_FREQ_VALID = 0x00000100, - NM_WIFI_DEVICE_CAP_FREQ_2GHZ = 0x00000200, - NM_WIFI_DEVICE_CAP_FREQ_5GHZ = 0x00000400, -} NMDeviceWifiCapabilities; - -/** - * NM80211ApFlags: - * @NM_802_11_AP_FLAGS_NONE: access point has no special capabilities - * @NM_802_11_AP_FLAGS_PRIVACY: access point requires authentication and - * encryption (usually means WEP) - * - * 802.11 access point flags. - **/ -typedef enum { /*< underscore_name=nm_802_11_ap_flags, flags >*/ - NM_802_11_AP_FLAGS_NONE = 0x00000000, - NM_802_11_AP_FLAGS_PRIVACY = 0x00000001, -} NM80211ApFlags; - -/** - * NM80211ApSecurityFlags: - * @NM_802_11_AP_SEC_NONE: the access point has no special security requirements - * @NM_802_11_AP_SEC_PAIR_WEP40: 40/64-bit WEP is supported for - * pairwise/unicast encryption - * @NM_802_11_AP_SEC_PAIR_WEP104: 104/128-bit WEP is supported for - * pairwise/unicast encryption - * @NM_802_11_AP_SEC_PAIR_TKIP: TKIP is supported for pairwise/unicast encryption - * @NM_802_11_AP_SEC_PAIR_CCMP: AES/CCMP is supported for pairwise/unicast encryption - * @NM_802_11_AP_SEC_GROUP_WEP40: 40/64-bit WEP is supported for group/broadcast - * encryption - * @NM_802_11_AP_SEC_GROUP_WEP104: 104/128-bit WEP is supported for - * group/broadcast encryption - * @NM_802_11_AP_SEC_GROUP_TKIP: TKIP is supported for group/broadcast encryption - * @NM_802_11_AP_SEC_GROUP_CCMP: AES/CCMP is supported for group/broadcast - * encryption - * @NM_802_11_AP_SEC_KEY_MGMT_PSK: WPA/RSN Pre-Shared Key encryption is - * supported - * @NM_802_11_AP_SEC_KEY_MGMT_802_1X: 802.1x authentication and key management - * is supported - * - * 802.11 access point security and authentication flags. These flags describe - * the current security requirements of an access point as determined from the - * access point's beacon. - **/ -typedef enum { /*< underscore_name=nm_802_11_ap_security_flags, flags >*/ - NM_802_11_AP_SEC_NONE = 0x00000000, - NM_802_11_AP_SEC_PAIR_WEP40 = 0x00000001, - NM_802_11_AP_SEC_PAIR_WEP104 = 0x00000002, - NM_802_11_AP_SEC_PAIR_TKIP = 0x00000004, - NM_802_11_AP_SEC_PAIR_CCMP = 0x00000008, - NM_802_11_AP_SEC_GROUP_WEP40 = 0x00000010, - NM_802_11_AP_SEC_GROUP_WEP104 = 0x00000020, - NM_802_11_AP_SEC_GROUP_TKIP = 0x00000040, - NM_802_11_AP_SEC_GROUP_CCMP = 0x00000080, - NM_802_11_AP_SEC_KEY_MGMT_PSK = 0x00000100, - NM_802_11_AP_SEC_KEY_MGMT_802_1X = 0x00000200, -} NM80211ApSecurityFlags; - -/** - * NM80211Mode: - * @NM_802_11_MODE_UNKNOWN: the device or access point mode is unknown - * @NM_802_11_MODE_ADHOC: for both devices and access point objects, indicates - * the object is part of an Ad-Hoc 802.11 network without a central - * coordinating access point. - * @NM_802_11_MODE_INFRA: the device or access point is in infrastructure mode. - * For devices, this indicates the device is an 802.11 client/station. For - * access point objects, this indicates the object is an access point that - * provides connectivity to clients. - * @NM_802_11_MODE_AP: the device is an access point/hotspot. Not valid for - * access point objects; used only for hotspot mode on the local machine. - * - * Indicates the 802.11 mode an access point or device is currently in. - **/ -typedef enum { /*< underscore_name=nm_802_11_mode >*/ - NM_802_11_MODE_UNKNOWN = 0, - NM_802_11_MODE_ADHOC = 1, - NM_802_11_MODE_INFRA = 2, - NM_802_11_MODE_AP = 3, -} NM80211Mode; - -/** - * NMBluetoothCapabilities: - * @NM_BT_CAPABILITY_NONE: device has no usable capabilities - * @NM_BT_CAPABILITY_DUN: device provides Dial-Up Networking capability - * @NM_BT_CAPABILITY_NAP: device provides Network Access Point capability - * - * #NMBluetoothCapabilities values indicate the usable capabilities of a - * Bluetooth device. - **/ -typedef enum { /*< flags >*/ - NM_BT_CAPABILITY_NONE = 0x00000000, - NM_BT_CAPABILITY_DUN = 0x00000001, - NM_BT_CAPABILITY_NAP = 0x00000002, -} NMBluetoothCapabilities; - -/** - * NMDeviceModemCapabilities: - * @NM_DEVICE_MODEM_CAPABILITY_NONE: modem has no usable capabilities - * @NM_DEVICE_MODEM_CAPABILITY_POTS: modem uses the analog wired telephone - * network and is not a wireless/cellular device - * @NM_DEVICE_MODEM_CAPABILITY_CDMA_EVDO: modem supports at least one of CDMA - * 1xRTT, EVDO revision 0, EVDO revision A, or EVDO revision B - * @NM_DEVICE_MODEM_CAPABILITY_GSM_UMTS: modem supports at least one of GSM, - * GPRS, EDGE, UMTS, HSDPA, HSUPA, or HSPA+ packet switched data capability - * @NM_DEVICE_MODEM_CAPABILITY_LTE: modem has LTE data capability - * - * #NMDeviceModemCapabilities values indicate the generic radio access - * technology families a modem device supports. For more information on the - * specific access technologies the device supports use the ModemManager D-Bus - * API. - **/ -typedef enum { /*< flags >*/ - NM_DEVICE_MODEM_CAPABILITY_NONE = 0x00000000, - NM_DEVICE_MODEM_CAPABILITY_POTS = 0x00000001, - NM_DEVICE_MODEM_CAPABILITY_CDMA_EVDO = 0x00000002, - NM_DEVICE_MODEM_CAPABILITY_GSM_UMTS = 0x00000004, - NM_DEVICE_MODEM_CAPABILITY_LTE = 0x00000008, -} NMDeviceModemCapabilities; - -/** - * NMDeviceState: - * @NM_DEVICE_STATE_UNKNOWN: the device's state is unknown - * @NM_DEVICE_STATE_UNMANAGED: the device is recognized, but not managed by - * NetworkManager - * @NM_DEVICE_STATE_UNAVAILABLE: the device is managed by NetworkManager, but - * is not available for use. Reasons may include the wireless switched off, - * missing firmware, no ethernet carrier, missing supplicant or modem manager, - * etc. - * @NM_DEVICE_STATE_DISCONNECTED: the device can be activated, but is currently - * idle and not connected to a network. - * @NM_DEVICE_STATE_PREPARE: the device is preparing the connection to the - * network. This may include operations like changing the MAC address, - * setting physical link properties, and anything else required to connect - * to the requested network. - * @NM_DEVICE_STATE_CONFIG: the device is connecting to the requested network. - * This may include operations like associating with the Wi-Fi AP, dialing - * the modem, connecting to the remote Bluetooth device, etc. - * @NM_DEVICE_STATE_NEED_AUTH: the device requires more information to continue - * connecting to the requested network. This includes secrets like WiFi - * passphrases, login passwords, PIN codes, etc. - * @NM_DEVICE_STATE_IP_CONFIG: the device is requesting IPv4 and/or IPv6 - * addresses and routing information from the network. - * @NM_DEVICE_STATE_IP_CHECK: the device is checking whether further action is - * required for the requested network connection. This may include checking - * whether only local network access is available, whether a captive portal - * is blocking access to the Internet, etc. - * @NM_DEVICE_STATE_SECONDARIES: the device is waiting for a secondary - * connection (like a VPN) which must activated before the device can be - * activated - * @NM_DEVICE_STATE_ACTIVATED: the device has a network connection, either local - * or global. - * @NM_DEVICE_STATE_DEACTIVATING: a disconnection from the current network - * connection was requested, and the device is cleaning up resources used for - * that connection. The network connection may still be valid. - * @NM_DEVICE_STATE_FAILED: the device failed to connect to the requested - * network and is cleaning up the connection request - **/ -typedef enum { - NM_DEVICE_STATE_UNKNOWN = 0, - NM_DEVICE_STATE_UNMANAGED = 10, - NM_DEVICE_STATE_UNAVAILABLE = 20, - NM_DEVICE_STATE_DISCONNECTED = 30, - NM_DEVICE_STATE_PREPARE = 40, - NM_DEVICE_STATE_CONFIG = 50, - NM_DEVICE_STATE_NEED_AUTH = 60, - NM_DEVICE_STATE_IP_CONFIG = 70, - NM_DEVICE_STATE_IP_CHECK = 80, - NM_DEVICE_STATE_SECONDARIES = 90, - NM_DEVICE_STATE_ACTIVATED = 100, - NM_DEVICE_STATE_DEACTIVATING = 110, - NM_DEVICE_STATE_FAILED = 120, -} NMDeviceState; - -/** - * NMDeviceStateReason: - * @NM_DEVICE_STATE_REASON_NONE: No reason given - * @NM_DEVICE_STATE_REASON_UNKNOWN: Unknown error - * @NM_DEVICE_STATE_REASON_NOW_MANAGED: Device is now managed - * @NM_DEVICE_STATE_REASON_NOW_UNMANAGED: Device is now unmanaged - * @NM_DEVICE_STATE_REASON_CONFIG_FAILED: The device could not be readied for configuration - * @NM_DEVICE_STATE_REASON_IP_CONFIG_UNAVAILABLE: IP configuration could not be reserved (no available address, timeout, etc) - * @NM_DEVICE_STATE_REASON_IP_CONFIG_EXPIRED: The IP config is no longer valid - * @NM_DEVICE_STATE_REASON_NO_SECRETS: Secrets were required, but not provided - * @NM_DEVICE_STATE_REASON_SUPPLICANT_DISCONNECT: 802.1x supplicant disconnected - * @NM_DEVICE_STATE_REASON_SUPPLICANT_CONFIG_FAILED: 802.1x supplicant configuration failed - * @NM_DEVICE_STATE_REASON_SUPPLICANT_FAILED: 802.1x supplicant failed - * @NM_DEVICE_STATE_REASON_SUPPLICANT_TIMEOUT: 802.1x supplicant took too long to authenticate - * @NM_DEVICE_STATE_REASON_PPP_START_FAILED: PPP service failed to start - * @NM_DEVICE_STATE_REASON_PPP_DISCONNECT: PPP service disconnected - * @NM_DEVICE_STATE_REASON_PPP_FAILED: PPP failed - * @NM_DEVICE_STATE_REASON_DHCP_START_FAILED: DHCP client failed to start - * @NM_DEVICE_STATE_REASON_DHCP_ERROR: DHCP client error - * @NM_DEVICE_STATE_REASON_DHCP_FAILED: DHCP client failed - * @NM_DEVICE_STATE_REASON_SHARED_START_FAILED: Shared connection service failed to start - * @NM_DEVICE_STATE_REASON_SHARED_FAILED: Shared connection service failed - * @NM_DEVICE_STATE_REASON_AUTOIP_START_FAILED: AutoIP service failed to start - * @NM_DEVICE_STATE_REASON_AUTOIP_ERROR: AutoIP service error - * @NM_DEVICE_STATE_REASON_AUTOIP_FAILED: AutoIP service failed - * @NM_DEVICE_STATE_REASON_MODEM_BUSY: The line is busy - * @NM_DEVICE_STATE_REASON_MODEM_NO_DIAL_TONE: No dial tone - * @NM_DEVICE_STATE_REASON_MODEM_NO_CARRIER: No carrier could be established - * @NM_DEVICE_STATE_REASON_MODEM_DIAL_TIMEOUT: The dialing request timed out - * @NM_DEVICE_STATE_REASON_MODEM_DIAL_FAILED: The dialing attempt failed - * @NM_DEVICE_STATE_REASON_MODEM_INIT_FAILED: Modem initialization failed - * @NM_DEVICE_STATE_REASON_GSM_APN_FAILED: Failed to select the specified APN - * @NM_DEVICE_STATE_REASON_GSM_REGISTRATION_NOT_SEARCHING: Not searching for networks - * @NM_DEVICE_STATE_REASON_GSM_REGISTRATION_DENIED: Network registration denied - * @NM_DEVICE_STATE_REASON_GSM_REGISTRATION_TIMEOUT: Network registration timed out - * @NM_DEVICE_STATE_REASON_GSM_REGISTRATION_FAILED: Failed to register with the requested network - * @NM_DEVICE_STATE_REASON_GSM_PIN_CHECK_FAILED: PIN check failed - * @NM_DEVICE_STATE_REASON_FIRMWARE_MISSING: Necessary firmware for the device may be missing - * @NM_DEVICE_STATE_REASON_REMOVED: The device was removed - * @NM_DEVICE_STATE_REASON_SLEEPING: NetworkManager went to sleep - * @NM_DEVICE_STATE_REASON_CONNECTION_REMOVED: The device's active connection disappeared - * @NM_DEVICE_STATE_REASON_USER_REQUESTED: Device disconnected by user or client - * @NM_DEVICE_STATE_REASON_CARRIER: Carrier/link changed - * @NM_DEVICE_STATE_REASON_CONNECTION_ASSUMED: The device's existing connection was assumed - * @NM_DEVICE_STATE_REASON_SUPPLICANT_AVAILABLE: The supplicant is now available - * @NM_DEVICE_STATE_REASON_MODEM_NOT_FOUND: The modem could not be found - * @NM_DEVICE_STATE_REASON_BT_FAILED: The Bluetooth connection failed or timed out - * @NM_DEVICE_STATE_REASON_GSM_SIM_NOT_INSERTED: GSM Modem's SIM Card not inserted - * @NM_DEVICE_STATE_REASON_GSM_SIM_PIN_REQUIRED: GSM Modem's SIM Pin required - * @NM_DEVICE_STATE_REASON_GSM_SIM_PUK_REQUIRED: GSM Modem's SIM Puk required - * @NM_DEVICE_STATE_REASON_GSM_SIM_WRONG: GSM Modem's SIM wrong - * @NM_DEVICE_STATE_REASON_INFINIBAND_MODE: InfiniBand device does not support connected mode - * @NM_DEVICE_STATE_REASON_DEPENDENCY_FAILED: A dependency of the connection failed - * @NM_DEVICE_STATE_REASON_BR2684_FAILED: Problem with the RFC 2684 Ethernet over ADSL bridge - * @NM_DEVICE_STATE_REASON_MODEM_MANAGER_UNAVAILABLE: ModemManager not running - * @NM_DEVICE_STATE_REASON_SSID_NOT_FOUND: The Wi-Fi network could not be found - * @NM_DEVICE_STATE_REASON_SECONDARY_CONNECTION_FAILED: A secondary connection of the base connection failed - * @NM_DEVICE_STATE_REASON_DCB_FCOE_FAILED: DCB or FCoE setup failed - * @NM_DEVICE_STATE_REASON_TEAMD_CONTROL_FAILED: teamd control failed - * @NM_DEVICE_STATE_REASON_MODEM_FAILED: Modem failed or no longer available - * @NM_DEVICE_STATE_REASON_MODEM_AVAILABLE: Modem now ready and available - * @NM_DEVICE_STATE_REASON_SIM_PIN_INCORRECT: SIM PIN was incorrect - * @NM_DEVICE_STATE_REASON_NEW_ACTIVATION: New connection activation was enqueued - * @NM_DEVICE_STATE_REASON_PARENT_CHANGED: the device's parent changed - * @NM_DEVICE_STATE_REASON_PARENT_MANAGED_CHANGED: the device parent's management changed - * - * Device state change reason codes - */ -typedef enum { - NM_DEVICE_STATE_REASON_NONE = 0, - NM_DEVICE_STATE_REASON_UNKNOWN = 1, - NM_DEVICE_STATE_REASON_NOW_MANAGED = 2, - NM_DEVICE_STATE_REASON_NOW_UNMANAGED = 3, - NM_DEVICE_STATE_REASON_CONFIG_FAILED = 4, - NM_DEVICE_STATE_REASON_IP_CONFIG_UNAVAILABLE = 5, - NM_DEVICE_STATE_REASON_IP_CONFIG_EXPIRED = 6, - NM_DEVICE_STATE_REASON_NO_SECRETS = 7, - NM_DEVICE_STATE_REASON_SUPPLICANT_DISCONNECT = 8, - NM_DEVICE_STATE_REASON_SUPPLICANT_CONFIG_FAILED = 9, - NM_DEVICE_STATE_REASON_SUPPLICANT_FAILED = 10, - NM_DEVICE_STATE_REASON_SUPPLICANT_TIMEOUT = 11, - NM_DEVICE_STATE_REASON_PPP_START_FAILED = 12, - NM_DEVICE_STATE_REASON_PPP_DISCONNECT = 13, - NM_DEVICE_STATE_REASON_PPP_FAILED = 14, - NM_DEVICE_STATE_REASON_DHCP_START_FAILED = 15, - NM_DEVICE_STATE_REASON_DHCP_ERROR = 16, - NM_DEVICE_STATE_REASON_DHCP_FAILED = 17, - NM_DEVICE_STATE_REASON_SHARED_START_FAILED = 18, - NM_DEVICE_STATE_REASON_SHARED_FAILED = 19, - NM_DEVICE_STATE_REASON_AUTOIP_START_FAILED = 20, - NM_DEVICE_STATE_REASON_AUTOIP_ERROR = 21, - NM_DEVICE_STATE_REASON_AUTOIP_FAILED = 22, - NM_DEVICE_STATE_REASON_MODEM_BUSY = 23, - NM_DEVICE_STATE_REASON_MODEM_NO_DIAL_TONE = 24, - NM_DEVICE_STATE_REASON_MODEM_NO_CARRIER = 25, - NM_DEVICE_STATE_REASON_MODEM_DIAL_TIMEOUT = 26, - NM_DEVICE_STATE_REASON_MODEM_DIAL_FAILED = 27, - NM_DEVICE_STATE_REASON_MODEM_INIT_FAILED = 28, - NM_DEVICE_STATE_REASON_GSM_APN_FAILED = 29, - NM_DEVICE_STATE_REASON_GSM_REGISTRATION_NOT_SEARCHING = 30, - NM_DEVICE_STATE_REASON_GSM_REGISTRATION_DENIED = 31, - NM_DEVICE_STATE_REASON_GSM_REGISTRATION_TIMEOUT = 32, - NM_DEVICE_STATE_REASON_GSM_REGISTRATION_FAILED = 33, - NM_DEVICE_STATE_REASON_GSM_PIN_CHECK_FAILED = 34, - NM_DEVICE_STATE_REASON_FIRMWARE_MISSING = 35, - NM_DEVICE_STATE_REASON_REMOVED = 36, - NM_DEVICE_STATE_REASON_SLEEPING = 37, - NM_DEVICE_STATE_REASON_CONNECTION_REMOVED = 38, - NM_DEVICE_STATE_REASON_USER_REQUESTED = 39, - NM_DEVICE_STATE_REASON_CARRIER = 40, - NM_DEVICE_STATE_REASON_CONNECTION_ASSUMED = 41, - NM_DEVICE_STATE_REASON_SUPPLICANT_AVAILABLE = 42, - NM_DEVICE_STATE_REASON_MODEM_NOT_FOUND = 43, - NM_DEVICE_STATE_REASON_BT_FAILED = 44, - NM_DEVICE_STATE_REASON_GSM_SIM_NOT_INSERTED = 45, - NM_DEVICE_STATE_REASON_GSM_SIM_PIN_REQUIRED = 46, - NM_DEVICE_STATE_REASON_GSM_SIM_PUK_REQUIRED = 47, - NM_DEVICE_STATE_REASON_GSM_SIM_WRONG = 48, - NM_DEVICE_STATE_REASON_INFINIBAND_MODE = 49, - NM_DEVICE_STATE_REASON_DEPENDENCY_FAILED = 50, - NM_DEVICE_STATE_REASON_BR2684_FAILED = 51, - NM_DEVICE_STATE_REASON_MODEM_MANAGER_UNAVAILABLE = 52, - NM_DEVICE_STATE_REASON_SSID_NOT_FOUND = 53, - NM_DEVICE_STATE_REASON_SECONDARY_CONNECTION_FAILED = 54, - NM_DEVICE_STATE_REASON_DCB_FCOE_FAILED = 55, - NM_DEVICE_STATE_REASON_TEAMD_CONTROL_FAILED = 56, - NM_DEVICE_STATE_REASON_MODEM_FAILED = 57, - NM_DEVICE_STATE_REASON_MODEM_AVAILABLE = 58, - NM_DEVICE_STATE_REASON_SIM_PIN_INCORRECT = 59, - NM_DEVICE_STATE_REASON_NEW_ACTIVATION = 60, - NM_DEVICE_STATE_REASON_PARENT_CHANGED = 61, - NM_DEVICE_STATE_REASON_PARENT_MANAGED_CHANGED = 62, - - NM_DEVICE_STATE_REASON_LAST = 0xFFFF, -} NMDeviceStateReason; - -/** - * NMActiveConnectionState: - * @NM_ACTIVE_CONNECTION_STATE_UNKNOWN: the state of the connection is unknown - * @NM_ACTIVE_CONNECTION_STATE_ACTIVATING: a network connection is being prepared - * @NM_ACTIVE_CONNECTION_STATE_ACTIVATED: there is a connection to the network - * @NM_ACTIVE_CONNECTION_STATE_DEACTIVATING: the network connection is being - * torn down and cleaned up - * @NM_ACTIVE_CONNECTION_STATE_DEACTIVATED: the network connection is disconnected - * and will be removed - * - * #NMActiveConnectionState values indicate the state of a connection to a - * specific network while it is starting, connected, or disconnecting from that - * network. - **/ -typedef enum { - NM_ACTIVE_CONNECTION_STATE_UNKNOWN = 0, - NM_ACTIVE_CONNECTION_STATE_ACTIVATING = 1, - NM_ACTIVE_CONNECTION_STATE_ACTIVATED = 2, - NM_ACTIVE_CONNECTION_STATE_DEACTIVATING = 3, - NM_ACTIVE_CONNECTION_STATE_DEACTIVATED = 4, -} NMActiveConnectionState; - -#endif /* NETWORK_MANAGER_H */ diff --git a/libnm-util/NetworkManagerVPN.h b/libnm-util/NetworkManagerVPN.h deleted file mode 100644 index 39a5d9613b..0000000000 --- a/libnm-util/NetworkManagerVPN.h +++ /dev/null @@ -1,294 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Copyright 2004 Red Hat, Inc. - */ - -/* D-Bus-related definitions for NetworkManager VPN plugins. - * - * Note that although this header is installed as part of libnm-util, it is also - * used by some external code that does not link to libnm-util. - */ - -#ifndef NETWORK_MANAGER_VPN_H -#define NETWORK_MANAGER_VPN_H - -/* - * dbus services details - */ -#define NM_DBUS_PATH_VPN "/org/freedesktop/NetworkManager/VPN/Manager" -#define NM_DBUS_INTERFACE_VPN "org.freedesktop.NetworkManager.VPN.Manager" - -#define NM_DBUS_PATH_VPN_CONNECTION "/org/freedesktop/NetworkManager/VPN/Connection" -#define NM_DBUS_INTERFACE_VPN_CONNECTION "org.freedesktop.NetworkManager.VPN.Connection" - -#define NM_VPN_DBUS_PLUGIN_PATH "/org/freedesktop/NetworkManager/VPN/Plugin" -#define NM_VPN_DBUS_PLUGIN_INTERFACE "org.freedesktop.NetworkManager.VPN.Plugin" - -/* - * VPN Errors - */ -#define NM_DBUS_NO_ACTIVE_VPN_CONNECTION "org.freedesktop.NetworkManager.VPNConnections.NoActiveVPNConnection" -#define NM_DBUS_NO_VPN_CONNECTIONS "org.freedesktop.NetworkManager.VPNConnections.NoVPNConnections" -#define NM_DBUS_INVALID_VPN_CONNECTION "org.freedesktop.NetworkManager.VPNConnections.InvalidVPNConnection" - -#define NM_DBUS_VPN_ERROR_PREFIX "org.freedesktop.NetworkManager.VPN.Error" -#define NM_DBUS_VPN_STARTING_IN_PROGRESS "StartingInProgress" -#define NM_DBUS_VPN_ALREADY_STARTED "AlreadyStarted" -#define NM_DBUS_VPN_STOPPING_IN_PROGRESS "StoppingInProgress" -#define NM_DBUS_VPN_ALREADY_STOPPED "AlreadyStopped" -#define NM_DBUS_VPN_WRONG_STATE "WrongState" -#define NM_DBUS_VPN_BAD_ARGUMENTS "BadArguments" -#define NM_DBUS_VPN_INTERACTIVE_NOT_SUPPORTED "InteractiveNotSupported" - -/* - * VPN daemon signals - */ -#define NM_DBUS_VPN_SIGNAL_LOGIN_BANNER "LoginBanner" -#define NM_DBUS_VPN_SIGNAL_LOGIN_FAILED "LoginFailed" -#define NM_DBUS_VPN_SIGNAL_LAUNCH_FAILED "LaunchFailed" -#define NM_DBUS_VPN_SIGNAL_CONNECT_FAILED "ConnectFailed" -#define NM_DBUS_VPN_SIGNAL_VPN_CONFIG_BAD "VPNConfigBad" -#define NM_DBUS_VPN_SIGNAL_IP_CONFIG_BAD "IPConfigBad" -#define NM_DBUS_VPN_SIGNAL_STATE_CHANGE "StateChange" -#define NM_DBUS_VPN_SIGNAL_IP4_CONFIG "IP4Config" - -/** - * NMVPNServiceState: - * @NM_VPN_SERVICE_STATE_UNKNOWN: The state of the VPN plugin is unknown. - * @NM_VPN_SERVICE_STATE_INIT: The VPN plugin is initialized. - * @NM_VPN_SERVICE_STATE_SHUTDOWN: Not used. - * @NM_VPN_SERVICE_STATE_STARTING: The plugin is attempting to connect to a VPN server. - * @NM_VPN_SERVICE_STATE_STARTED: The plugin has connected to a VPN server. - * @NM_VPN_SERVICE_STATE_STOPPING: The plugin is disconnecting from the VPN server. - * @NM_VPN_SERVICE_STATE_STOPPED: The plugin has disconnected from the VPN server. - * - * VPN daemon states - */ -typedef enum NMVPNServiceState { - NM_VPN_SERVICE_STATE_UNKNOWN = 0, - NM_VPN_SERVICE_STATE_INIT, - NM_VPN_SERVICE_STATE_SHUTDOWN, - NM_VPN_SERVICE_STATE_STARTING, - NM_VPN_SERVICE_STATE_STARTED, - NM_VPN_SERVICE_STATE_STOPPING, - NM_VPN_SERVICE_STATE_STOPPED -} NMVPNServiceState; - -/** - * NMVPNConnectionState: - * @NM_VPN_CONNECTION_STATE_UNKNOWN: The state of the VPN connection is - * unknown. - * @NM_VPN_CONNECTION_STATE_PREPARE: The VPN connection is preparing to - * connect. - * @NM_VPN_CONNECTION_STATE_NEED_AUTH: The VPN connection needs authorization - * credentials. - * @NM_VPN_CONNECTION_STATE_CONNECT: The VPN connection is being established. - * @NM_VPN_CONNECTION_STATE_IP_CONFIG_GET: The VPN connection is getting an IP - * address. - * @NM_VPN_CONNECTION_STATE_ACTIVATED: The VPN connection is active. - * @NM_VPN_CONNECTION_STATE_FAILED: The VPN connection failed. - * @NM_VPN_CONNECTION_STATE_DISCONNECTED: The VPN connection is disconnected. - * - * VPN connection states - */ -typedef enum NMVPNConnectionState { - NM_VPN_CONNECTION_STATE_UNKNOWN = 0, - NM_VPN_CONNECTION_STATE_PREPARE, - NM_VPN_CONNECTION_STATE_NEED_AUTH, - NM_VPN_CONNECTION_STATE_CONNECT, - NM_VPN_CONNECTION_STATE_IP_CONFIG_GET, - NM_VPN_CONNECTION_STATE_ACTIVATED, - NM_VPN_CONNECTION_STATE_FAILED, - NM_VPN_CONNECTION_STATE_DISCONNECTED -} NMVPNConnectionState; - -/** - * NMVPNConnectionStateReason: - * @NM_VPN_CONNECTION_STATE_REASON_UNKNOWN: The reason for the VPN connection - * state change is unknown. - * @NM_VPN_CONNECTION_STATE_REASON_NONE: No reason was given for the VPN - * connection state change. - * @NM_VPN_CONNECTION_STATE_REASON_USER_DISCONNECTED: The VPN connection changed - * state because the user disconnected it. - * @NM_VPN_CONNECTION_STATE_REASON_DEVICE_DISCONNECTED: The VPN connection - * changed state because the device it was using was disconnected. - * @NM_VPN_CONNECTION_STATE_REASON_SERVICE_STOPPED: The service providing the - * VPN connection was stopped. - * @NM_VPN_CONNECTION_STATE_REASON_IP_CONFIG_INVALID: The IP config of the VPN - * connection was invalid. - * @NM_VPN_CONNECTION_STATE_REASON_CONNECT_TIMEOUT: The connection attempt to - * the VPN service timed out. - * @NM_VPN_CONNECTION_STATE_REASON_SERVICE_START_TIMEOUT: A timeout occurred - * while starting the service providing the VPN connection. - * @NM_VPN_CONNECTION_STATE_REASON_SERVICE_START_FAILED: Starting the service - * starting the service providing the VPN connection failed. - * @NM_VPN_CONNECTION_STATE_REASON_NO_SECRETS: Necessary secrets for the VPN - * connection were not provided. - * @NM_VPN_CONNECTION_STATE_REASON_LOGIN_FAILED: Authentication to the VPN - * server failed. - * @NM_VPN_CONNECTION_STATE_REASON_CONNECTION_REMOVED: The connection was - * deleted from settings. - * - * VPN connection state reasons - */ -typedef enum NMVPNConnectionStateReason { - NM_VPN_CONNECTION_STATE_REASON_UNKNOWN = 0, - NM_VPN_CONNECTION_STATE_REASON_NONE, - NM_VPN_CONNECTION_STATE_REASON_USER_DISCONNECTED, - NM_VPN_CONNECTION_STATE_REASON_DEVICE_DISCONNECTED, - NM_VPN_CONNECTION_STATE_REASON_SERVICE_STOPPED, - NM_VPN_CONNECTION_STATE_REASON_IP_CONFIG_INVALID, - NM_VPN_CONNECTION_STATE_REASON_CONNECT_TIMEOUT, - NM_VPN_CONNECTION_STATE_REASON_SERVICE_START_TIMEOUT, - NM_VPN_CONNECTION_STATE_REASON_SERVICE_START_FAILED, - NM_VPN_CONNECTION_STATE_REASON_NO_SECRETS, - NM_VPN_CONNECTION_STATE_REASON_LOGIN_FAILED, - NM_VPN_CONNECTION_STATE_REASON_CONNECTION_REMOVED -} NMVPNConnectionStateReason; - -/** - * NMVPNPluginFailure: - * @NM_VPN_PLUGIN_FAILURE_LOGIN_FAILED: Login failed. - * @NM_VPN_PLUGIN_FAILURE_CONNECT_FAILED: Connect failed. - * @NM_VPN_PLUGIN_FAILURE_BAD_IP_CONFIG: Invalid IP configuration returned from - * the VPN plugin. - * - * VPN plugin failure reasons - */ -typedef enum { - NM_VPN_PLUGIN_FAILURE_LOGIN_FAILED, - NM_VPN_PLUGIN_FAILURE_CONNECT_FAILED, - NM_VPN_PLUGIN_FAILURE_BAD_IP_CONFIG -} NMVPNPluginFailure; - -/*** Generic config ***/ - -/* string: VPN interface name (tun0, tap0, etc) */ -#define NM_VPN_PLUGIN_CONFIG_TUNDEV "tundev" - -/* string: Login message */ -#define NM_VPN_PLUGIN_CONFIG_BANNER "banner" - -/* uint32 / array of uint8: IP address of the public external VPN gateway (network byte order) */ -#define NM_VPN_PLUGIN_CONFIG_EXT_GATEWAY "gateway" - -/* uint32: Maximum Transfer Unit that the VPN interface should use */ -#define NM_VPN_PLUGIN_CONFIG_MTU "mtu" - -/* boolean: Has IP4 configuration? */ -#define NM_VPN_PLUGIN_CONFIG_HAS_IP4 "has-ip4" - -/* boolean: Has IP6 configuration? */ -#define NM_VPN_PLUGIN_CONFIG_HAS_IP6 "has-ip6" - -/* boolean: If %TRUE the VPN plugin can persist/reconnect the connection over - * link changes and VPN server dropouts. - */ -#define NM_VPN_PLUGIN_CAN_PERSIST "can-persist" - -/*** Ip4Config ***/ - -/* uint32: IP address of the internal gateway of the subnet the VPN interface is - * on, if the VPN uses subnet configuration (network byte order) - */ -#define NM_VPN_PLUGIN_IP4_CONFIG_INT_GATEWAY "internal-gateway" - -/* uint32: internal IP address of the local VPN interface (network byte order) */ -#define NM_VPN_PLUGIN_IP4_CONFIG_ADDRESS "address" - -/* uint32: IP address of the other side of Point-to-Point connection if the VPN - * uses Point-to-Point configuration. (network byte order) - */ -#define NM_VPN_PLUGIN_IP4_CONFIG_PTP "ptp" - -/* uint32: IP prefix of the VPN interface; 1 - 32 inclusive */ -#define NM_VPN_PLUGIN_IP4_CONFIG_PREFIX "prefix" - -/* array of uint32: IP addresses of DNS servers for the VPN (network byte order) */ -#define NM_VPN_PLUGIN_IP4_CONFIG_DNS "dns" - -/* array of uint32: IP addresses of NBNS/WINS servers for the VPN (network byte order) */ -#define NM_VPN_PLUGIN_IP4_CONFIG_NBNS "nbns" - -/* uint32: Message Segment Size that the VPN interface should use */ -#define NM_VPN_PLUGIN_IP4_CONFIG_MSS "mss" - -/* string: DNS domain name */ -#define NM_VPN_PLUGIN_IP4_CONFIG_DOMAIN "domain" - -/* array of strings: DNS domain names */ -#define NM_VPN_PLUGIN_IP4_CONFIG_DOMAINS "domains" - -/* [ip4 routes]: custom routes the client should apply, in the format used - * by nm_utils_ip4_routes_to/from_gvalue - */ -#define NM_VPN_PLUGIN_IP4_CONFIG_ROUTES "routes" - -/* boolean: prevent this VPN connection from ever getting the default route */ -#define NM_VPN_PLUGIN_IP4_CONFIG_NEVER_DEFAULT "never-default" - -/* Deprecated */ -#define NM_VPN_PLUGIN_IP4_CONFIG_GATEWAY NM_VPN_PLUGIN_IP4_CONFIG_EXT_GATEWAY - -/* Legacy IP4 items; these are included in the IP4 config by older plugins, - * but in the generic config by newer plugins. - */ - -#define NM_VPN_PLUGIN_IP4_CONFIG_BANNER NM_VPN_PLUGIN_CONFIG_BANNER -#define NM_VPN_PLUGIN_IP4_CONFIG_EXT_GATEWAY NM_VPN_PLUGIN_CONFIG_EXT_GATEWAY -#define NM_VPN_PLUGIN_IP4_CONFIG_MTU NM_VPN_PLUGIN_CONFIG_MTU -#define NM_VPN_PLUGIN_IP4_CONFIG_TUNDEV NM_VPN_PLUGIN_CONFIG_TUNDEV - -/*** Ip6Config ***/ - -/* array of uint8: IP address of the internal gateway of the subnet the VPN interface is - * on, if the VPN uses subnet configuration (network byte order) - */ -#define NM_VPN_PLUGIN_IP6_CONFIG_INT_GATEWAY "internal-gateway" - -/* array of uint8: internal IP address of the local VPN interface (network byte order) */ -#define NM_VPN_PLUGIN_IP6_CONFIG_ADDRESS "address" - -/* array of uint8: IP address of the other side of Point-to-Point connection if the VPN - * uses Point-to-Point configuration. (network byte order) - */ -#define NM_VPN_PLUGIN_IP6_CONFIG_PTP "ptp" - -/* uint32: prefix length of the VPN interface; 1 - 128 inclusive */ -#define NM_VPN_PLUGIN_IP6_CONFIG_PREFIX "prefix" - -/* array of array of uint8: IP addresses of DNS servers for the VPN (network byte order) */ -#define NM_VPN_PLUGIN_IP6_CONFIG_DNS "dns" - -/* uint32: Message Segment Size that the VPN interface should use */ -#define NM_VPN_PLUGIN_IP6_CONFIG_MSS "mss" - -/* string: DNS domain name */ -#define NM_VPN_PLUGIN_IP6_CONFIG_DOMAIN "domain" - -/* array of strings: DNS domain names */ -#define NM_VPN_PLUGIN_IP6_CONFIG_DOMAINS "domains" - -/* [ip6 routes]: custom routes the client should apply, in the format used - * by nm_utils_ip6_routes_to/from_gvalue - */ -#define NM_VPN_PLUGIN_IP6_CONFIG_ROUTES "routes" - -/* boolean: prevent this VPN connection from ever getting the default route */ -#define NM_VPN_PLUGIN_IP6_CONFIG_NEVER_DEFAULT "never-default" - -#endif /* NETWORK_MANAGER_VPN_H */ diff --git a/libnm-util/crypto.c b/libnm-util/crypto.c deleted file mode 100644 index 5d1a37ffc9..0000000000 --- a/libnm-util/crypto.c +++ /dev/null @@ -1,749 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * Dan Williams <dcbw@redhat.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2011 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <strings.h> -#include <unistd.h> -#include <stdlib.h> - -#include "crypto.h" - -GQuark -_nm_crypto_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-crypto-error-quark"); - return quark; -} - -#define PEM_RSA_KEY_BEGIN "-----BEGIN RSA PRIVATE KEY-----" -#define PEM_RSA_KEY_END "-----END RSA PRIVATE KEY-----" - -#define PEM_DSA_KEY_BEGIN "-----BEGIN DSA PRIVATE KEY-----" -#define PEM_DSA_KEY_END "-----END DSA PRIVATE KEY-----" - -#define PEM_CERT_BEGIN "-----BEGIN CERTIFICATE-----" -#define PEM_CERT_END "-----END CERTIFICATE-----" - -#define PEM_PKCS8_ENC_KEY_BEGIN "-----BEGIN ENCRYPTED PRIVATE KEY-----" -#define PEM_PKCS8_ENC_KEY_END "-----END ENCRYPTED PRIVATE KEY-----" - -#define PEM_PKCS8_DEC_KEY_BEGIN "-----BEGIN PRIVATE KEY-----" -#define PEM_PKCS8_DEC_KEY_END "-----END PRIVATE KEY-----" - -static gboolean -find_tag (const char *tag, - const GByteArray *array, - gsize start_at, - gsize *out_pos) -{ - gsize i, taglen; - gsize len = array->len - start_at; - - g_return_val_if_fail (out_pos != NULL, FALSE); - - taglen = strlen (tag); - if (len >= taglen) { - for (i = 0; i < len - taglen + 1; i++) { - if (memcmp (array->data + start_at + i, tag, taglen) == 0) { - *out_pos = start_at + i; - return TRUE; - } - } - } - return FALSE; -} - -#define DEK_INFO_TAG "DEK-Info: " -#define PROC_TYPE_TAG "Proc-Type: " - -static GByteArray * -parse_old_openssl_key_file (const GByteArray *contents, - int key_type, - char **out_cipher, - char **out_iv, - GError **error) -{ - GByteArray *bindata = NULL; - char **lines = NULL; - char **ln = NULL; - gsize start = 0, end = 0; - GString *str = NULL; - int enc_tags = 0; - char *iv = NULL; - char *cipher = NULL; - unsigned char *tmp = NULL; - gsize tmp_len = 0; - const char *start_tag; - const char *end_tag; - guint8 save_end = 0; - - switch (key_type) { - case NM_CRYPTO_KEY_TYPE_RSA: - start_tag = PEM_RSA_KEY_BEGIN; - end_tag = PEM_RSA_KEY_END; - break; - case NM_CRYPTO_KEY_TYPE_DSA: - start_tag = PEM_DSA_KEY_BEGIN; - end_tag = PEM_DSA_KEY_END; - break; - default: - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_UNKNOWN_KEY_TYPE, - "Unknown key type %d", - key_type); - g_assert_not_reached (); - return NULL; - } - - if (!find_tag (start_tag, contents, 0, &start)) - goto parse_error; - - start += strlen (start_tag); - if (!find_tag (end_tag, contents, start, &end)) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_FILE_FORMAT_INVALID, - _("PEM key file had no end tag '%s'."), - end_tag); - goto parse_error; - } - - save_end = contents->data[end]; - contents->data[end] = '\0'; - lines = g_strsplit ((const char *) (contents->data + start), "\n", 0); - contents->data[end] = save_end; - - if (!lines || g_strv_length (lines) <= 1) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_FILE_FORMAT_INVALID, - _("Doesn't look like a PEM private key file.")); - goto parse_error; - } - - str = g_string_new_len (NULL, end - start); - for (ln = lines; *ln; ln++) { - char *p = *ln; - - /* Chug leading spaces */ - p = g_strstrip (p); - if (!*p) - continue; - - if (!strncmp (p, PROC_TYPE_TAG, strlen (PROC_TYPE_TAG))) { - if (enc_tags++ != 0) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_FILE_FORMAT_INVALID, - _("Malformed PEM file: Proc-Type was not first tag.")); - goto parse_error; - } - - p += strlen (PROC_TYPE_TAG); - if (strcmp (p, "4,ENCRYPTED")) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_FILE_FORMAT_INVALID, - _("Malformed PEM file: unknown Proc-Type tag '%s'."), - p); - goto parse_error; - } - } else if (!strncmp (p, DEK_INFO_TAG, strlen (DEK_INFO_TAG))) { - char *comma; - - if (enc_tags++ != 1) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_FILE_FORMAT_INVALID, - _("Malformed PEM file: DEK-Info was not the second tag.")); - goto parse_error; - } - - p += strlen (DEK_INFO_TAG); - - /* Grab the IV first */ - comma = strchr (p, ','); - if (!comma || (*(comma + 1) == '\0')) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_FILE_FORMAT_INVALID, - _("Malformed PEM file: no IV found in DEK-Info tag.")); - goto parse_error; - } - *comma++ = '\0'; - if (!g_ascii_isxdigit (*comma)) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_FILE_FORMAT_INVALID, - _("Malformed PEM file: invalid format of IV in DEK-Info tag.")); - goto parse_error; - } - iv = g_strdup (comma); - - /* Get the private key cipher */ - if (!strcasecmp (p, "DES-EDE3-CBC")) { - cipher = g_strdup (p); - } else if (!strcasecmp (p, "DES-CBC")) { - cipher = g_strdup (p); - } else if (!strcasecmp (p, "AES-128-CBC")) { - cipher = g_strdup (p); - } else { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_UNKNOWN_KEY_TYPE, - _("Malformed PEM file: unknown private key cipher '%s'."), - p); - goto parse_error; - } - } else { - if ((enc_tags != 0) && (enc_tags != 2)) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_FILE_FORMAT_INVALID, - "Malformed PEM file: both Proc-Type and DEK-Info tags are required."); - goto parse_error; - } - g_string_append (str, p); - } - } - - tmp = g_base64_decode (str->str, &tmp_len); - if (tmp == NULL || !tmp_len) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_DECODE_FAILED, - _("Could not decode private key.")); - goto parse_error; - } - g_string_free (str, TRUE); - - if (lines) - g_strfreev (lines); - - bindata = g_byte_array_sized_new (tmp_len); - g_byte_array_append (bindata, tmp, tmp_len); - g_free (tmp); - - *out_iv = iv; - *out_cipher = cipher; - return bindata; - -parse_error: - g_free (tmp); - g_free (cipher); - g_free (iv); - if (str) - g_string_free (str, TRUE); - if (lines) - g_strfreev (lines); - return NULL; -} - -static GByteArray * -parse_pkcs8_key_file (const GByteArray *contents, - gboolean *out_encrypted, - GError **error) -{ - GByteArray *key = NULL; - gsize start = 0, end = 0; - unsigned char *der = NULL; - guint8 save_end; - gsize length = 0; - const char *start_tag = NULL, *end_tag = NULL; - gboolean encrypted = FALSE; - - /* Try encrypted first, decrypted next */ - if (find_tag (PEM_PKCS8_ENC_KEY_BEGIN, contents, 0, &start)) { - start_tag = PEM_PKCS8_ENC_KEY_BEGIN; - end_tag = PEM_PKCS8_ENC_KEY_END; - encrypted = TRUE; - } else if (find_tag (PEM_PKCS8_DEC_KEY_BEGIN, contents, 0, &start)) { - start_tag = PEM_PKCS8_DEC_KEY_BEGIN; - end_tag = PEM_PKCS8_DEC_KEY_END; - encrypted = FALSE; - } else { - g_set_error_literal (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_FILE_FORMAT_INVALID, - _("Failed to find expected PKCS#8 start tag.")); - return NULL; - } - - start += strlen (start_tag); - if (!find_tag (end_tag, contents, start, &end)) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_FILE_FORMAT_INVALID, - _("Failed to find expected PKCS#8 end tag '%s'."), - end_tag); - return NULL; - } - - /* g_base64_decode() wants a NULL-terminated string */ - save_end = contents->data[end]; - contents->data[end] = '\0'; - der = g_base64_decode ((const char *) (contents->data + start), &length); - contents->data[end] = save_end; - - if (der && length) { - key = g_byte_array_sized_new (length); - g_byte_array_append (key, der, length); - g_assert (key->len == length); - *out_encrypted = encrypted; - } else { - g_set_error_literal (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_DECODE_FAILED, - _("Failed to decode PKCS#8 private key.")); - } - - g_free (der); - return key; -} - -static GByteArray * -file_to_g_byte_array (const char *filename, GError **error) -{ - char *contents; - GByteArray *array = NULL; - gsize length = 0; - - if (g_file_get_contents (filename, &contents, &length, error)) { - array = g_byte_array_sized_new (length); - g_byte_array_append (array, (guint8 *) contents, length); - g_assert (array->len == length); - g_free (contents); - } - return array; -} - -/* - * Convert a hex string into bytes. - */ -static char * -convert_iv (const char *src, - gsize *out_len, - GError **error) -{ - int num; - int i; - char conv[3]; - char *c; - - g_return_val_if_fail (src != NULL, NULL); - - num = strlen (src); - if (num % 2) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_RAW_IV_INVALID, - _("IV must be an even number of bytes in length.")); - return NULL; - } - - num /= 2; - c = g_malloc0 (num + 1); - - conv[2] = '\0'; - for (i = 0; i < num; i++) { - conv[0] = src[(i * 2)]; - conv[1] = src[(i * 2) + 1]; - if (!g_ascii_isxdigit (conv[0]) || !g_ascii_isxdigit (conv[1])) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_RAW_IV_INVALID, - _("IV contains non-hexadecimal digits.")); - goto error; - } - - c[i] = strtol(conv, NULL, 16); - } - *out_len = num; - return c; - -error: - g_free (c); - return NULL; -} - -static char * -make_des_aes_key (const char *cipher, - const char *salt, - const gsize salt_len, - const char *password, - gsize *out_len, - GError **error) -{ - char *key; - guint32 digest_len; - - g_return_val_if_fail (cipher != NULL, NULL); - g_return_val_if_fail (salt != NULL, NULL); - g_return_val_if_fail (salt_len >= 8, NULL); - g_return_val_if_fail (password != NULL, NULL); - g_return_val_if_fail (out_len != NULL, NULL); - - if (!strcmp (cipher, "DES-EDE3-CBC")) - digest_len = 24; - else if (!strcmp (cipher, "DES-CBC")) - digest_len = 8; - else if (!strcmp (cipher, "AES-128-CBC")) - digest_len = 16; - else { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_UNKNOWN_CIPHER, - _("Private key cipher '%s' was unknown."), - cipher); - return NULL; - } - - if (password[0] == '\0') - return NULL; - - key = g_malloc0 (digest_len + 1); - - if (!crypto_md5_hash (salt, - salt_len, - password, - strlen (password), - key, - digest_len, - error)) - goto error; - - *out_len = digest_len; - return key; - -error: - if (key) { - /* Don't leak stale key material */ - memset (key, 0, digest_len); - g_free (key); - } - return NULL; -} - -static GByteArray * -decrypt_key (const char *cipher, - int key_type, - GByteArray *data, - const char *iv, - const char *password, - GError **error) -{ - char *bin_iv = NULL; - gsize bin_iv_len = 0; - char *key = NULL; - gsize key_len = 0; - char *output = NULL; - gsize decrypted_len = 0; - GByteArray *decrypted = NULL; - - g_return_val_if_fail (password != NULL, NULL); - - bin_iv = convert_iv (iv, &bin_iv_len, error); - if (!bin_iv) - return NULL; - - /* Convert the password and IV into a DES or AES key */ - key = make_des_aes_key (cipher, bin_iv, bin_iv_len, password, &key_len, error); - if (!key || !key_len) - goto out; - - output = crypto_decrypt (cipher, key_type, - data, - bin_iv, bin_iv_len, - key, key_len, - &decrypted_len, - error); - if (output && decrypted_len) { - decrypted = g_byte_array_sized_new (decrypted_len); - g_byte_array_append (decrypted, (guint8 *) output, decrypted_len); - } - -out: - /* Don't leak stale key material */ - if (key) - memset (key, 0, key_len); - g_free (output); - g_free (key); - g_free (bin_iv); - - return decrypted; -} - -GByteArray * -crypto_decrypt_private_key_data (const GByteArray *contents, - const char *password, - NMCryptoKeyType *out_key_type, - GError **error) -{ - GByteArray *decrypted = NULL; - NMCryptoKeyType key_type = NM_CRYPTO_KEY_TYPE_RSA; - GByteArray *data; - char *iv = NULL; - char *cipher = NULL; - - g_return_val_if_fail (contents != NULL, NULL); - if (out_key_type) - g_return_val_if_fail (*out_key_type == NM_CRYPTO_KEY_TYPE_UNKNOWN, NULL); - - /* OpenSSL non-standard legacy PEM files */ - - /* Try RSA keys first */ - data = parse_old_openssl_key_file (contents, key_type, &cipher, &iv, error); - if (!data) { - g_clear_error (error); - - /* DSA next */ - key_type = NM_CRYPTO_KEY_TYPE_DSA; - data = parse_old_openssl_key_file (contents, key_type, &cipher, &iv, error); - if (!data) { - g_clear_error (error); - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_FILE_FORMAT_INVALID, - _("Unable to determine private key type.")); - } - } - - if (data) { - /* return the key type even if decryption failed */ - if (out_key_type) - *out_key_type = key_type; - - if (password) { - decrypted = decrypt_key (cipher, - key_type, - data, - iv, - password, - error); - } - g_byte_array_free (data, TRUE); - } - - g_free (cipher); - g_free (iv); - - return decrypted; -} - -GByteArray * -crypto_decrypt_private_key (const char *file, - const char *password, - NMCryptoKeyType *out_key_type, - GError **error) -{ - GByteArray *contents; - GByteArray *key = NULL; - - contents = file_to_g_byte_array (file, error); - if (contents) { - key = crypto_decrypt_private_key_data (contents, password, out_key_type, error); - g_byte_array_free (contents, TRUE); - } - return key; -} - -static GByteArray * -extract_pem_cert_data (GByteArray *contents, GError **error) -{ - GByteArray *cert = NULL; - gsize start = 0, end = 0; - unsigned char *der = NULL; - guint8 save_end; - gsize length = 0; - - if (!find_tag (PEM_CERT_BEGIN, contents, 0, &start)) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_FILE_FORMAT_INVALID, - _("PEM certificate had no start tag '%s'."), - PEM_CERT_BEGIN); - goto done; - } - - start += strlen (PEM_CERT_BEGIN); - if (!find_tag (PEM_CERT_END, contents, start, &end)) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_FILE_FORMAT_INVALID, - _("PEM certificate had no end tag '%s'."), - PEM_CERT_END); - goto done; - } - - /* g_base64_decode() wants a NULL-terminated string */ - save_end = contents->data[end]; - contents->data[end] = '\0'; - der = g_base64_decode ((const char *) (contents->data + start), &length); - contents->data[end] = save_end; - - if (der && length) { - cert = g_byte_array_sized_new (length); - g_byte_array_append (cert, der, length); - g_assert (cert->len == length); - } else { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_DECODE_FAILED, - _("Failed to decode certificate.")); - } - -done: - g_free (der); - return cert; -} - -GByteArray * -crypto_load_and_verify_certificate (const char *file, - NMCryptoFileFormat *out_file_format, - GError **error) -{ - GByteArray *array, *contents; - - g_return_val_if_fail (file != NULL, NULL); - g_return_val_if_fail (out_file_format != NULL, NULL); - g_return_val_if_fail (*out_file_format == NM_CRYPTO_FILE_FORMAT_UNKNOWN, NULL); - - contents = file_to_g_byte_array (file, error); - if (!contents) - return NULL; - - /* Check for PKCS#12 */ - if (crypto_is_pkcs12_data (contents)) { - *out_file_format = NM_CRYPTO_FILE_FORMAT_PKCS12; - return contents; - } - - /* Check for plain DER format */ - if (contents->len > 2 && contents->data[0] == 0x30 && contents->data[1] == 0x82) { - *out_file_format = crypto_verify_cert (contents->data, contents->len, error); - } else { - array = extract_pem_cert_data (contents, error); - if (!array) { - g_byte_array_free (contents, TRUE); - return NULL; - } - - *out_file_format = crypto_verify_cert (array->data, array->len, error); - g_byte_array_free (array, TRUE); - } - - if (*out_file_format != NM_CRYPTO_FILE_FORMAT_X509) { - g_byte_array_free (contents, TRUE); - contents = NULL; - } - - return contents; -} - -gboolean -crypto_is_pkcs12_data (const GByteArray *data) -{ - GError *error = NULL; - gboolean success; - - g_return_val_if_fail (data != NULL, FALSE); - - if (!data->len) - return FALSE; - - success = crypto_verify_pkcs12 (data, NULL, &error); - if (success == FALSE) { - /* If the error was just a decryption error, then it's pkcs#12 */ - if (error) { - if (g_error_matches (error, NM_CRYPTO_ERROR, NM_CRYPTO_ERR_CIPHER_DECRYPT_FAILED)) - success = TRUE; - g_error_free (error); - } - } - return success; -} - -gboolean -crypto_is_pkcs12_file (const char *file, GError **error) -{ - GByteArray *contents; - gboolean success = FALSE; - - g_return_val_if_fail (file != NULL, FALSE); - - contents = file_to_g_byte_array (file, error); - if (contents) { - success = crypto_is_pkcs12_data (contents); - g_byte_array_free (contents, TRUE); - } - return success; -} - -/* Verifies that a private key can be read, and if a password is given, that - * the private key can be decrypted with that password. - */ -NMCryptoFileFormat -crypto_verify_private_key_data (const GByteArray *contents, - const char *password, - GError **error) -{ - GByteArray *tmp; - NMCryptoFileFormat format = NM_CRYPTO_FILE_FORMAT_UNKNOWN; - NMCryptoKeyType ktype = NM_CRYPTO_KEY_TYPE_UNKNOWN; - gboolean is_encrypted = FALSE; - - g_return_val_if_fail (contents != NULL, FALSE); - - /* Check for PKCS#12 first */ - if (crypto_is_pkcs12_data (contents)) { - if (!password || crypto_verify_pkcs12 (contents, password, error)) - format = NM_CRYPTO_FILE_FORMAT_PKCS12; - } else { - /* Maybe it's PKCS#8 */ - tmp = parse_pkcs8_key_file (contents, &is_encrypted, error); - if (tmp) { - if (!password || crypto_verify_pkcs8 (tmp, is_encrypted, password, error)) - format = NM_CRYPTO_FILE_FORMAT_RAW_KEY; - } else { - g_clear_error (error); - - /* Or it's old-style OpenSSL */ - tmp = crypto_decrypt_private_key_data (contents, password, &ktype, error); - if (tmp) - format = NM_CRYPTO_FILE_FORMAT_RAW_KEY; - else if (!password && (ktype != NM_CRYPTO_KEY_TYPE_UNKNOWN)) - format = NM_CRYPTO_FILE_FORMAT_RAW_KEY; - } - - if (tmp) { - /* Don't leave decrypted key data around */ - memset (tmp->data, 0, tmp->len); - g_byte_array_free (tmp, TRUE); - } - } - - return format; -} - -NMCryptoFileFormat -crypto_verify_private_key (const char *filename, - const char *password, - GError **error) -{ - GByteArray *contents; - NMCryptoFileFormat format = NM_CRYPTO_FILE_FORMAT_UNKNOWN; - - g_return_val_if_fail (filename != NULL, FALSE); - - contents = file_to_g_byte_array (filename, error); - if (contents) { - format = crypto_verify_private_key_data (contents, password, error); - g_byte_array_free (contents, TRUE); - } - return format; -} diff --git a/libnm-util/crypto.h b/libnm-util/crypto.h deleted file mode 100644 index 29e1c3dc37..0000000000 --- a/libnm-util/crypto.h +++ /dev/null @@ -1,141 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * Dan Williams <dcbw@redhat.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2014 Red Hat, Inc. - */ - -#ifndef __CRYPTO_H__ -#define __CRYPTO_H__ - -#define MD5_HASH_LEN 20 -#define CIPHER_DES_EDE3_CBC "DES-EDE3-CBC" -#define CIPHER_DES_CBC "DES-CBC" -#define CIPHER_AES_CBC "AES-128-CBC" - -enum { - NM_CRYPTO_ERR_NONE = 0, - NM_CRYPTO_ERR_INIT_FAILED, - NM_CRYPTO_ERR_CANT_READ_FILE, - NM_CRYPTO_ERR_FILE_FORMAT_INVALID, - NM_CRYPTO_ERR_CERT_FORMAT_INVALID, - NM_CRYPTO_ERR_DECODE_FAILED, - NM_CRYPTO_ERR_OUT_OF_MEMORY, - NM_CRYPTO_ERR_UNKNOWN_KEY_TYPE, - NM_CRYPTO_ERR_UNKNOWN_CIPHER, - NM_CRYPTO_ERR_RAW_IV_INVALID, - NM_CRYPTO_ERR_MD5_INIT_FAILED, - NM_CRYPTO_ERR_CIPHER_INIT_FAILED, - NM_CRYPTO_ERR_CIPHER_SET_KEY_FAILED, - NM_CRYPTO_ERR_CIPHER_SET_IV_FAILED, - NM_CRYPTO_ERR_CIPHER_DECRYPT_FAILED, - NM_CRYPTO_ERR_INVALID_PASSWORD, - NM_CRYPTO_ERR_CIPHER_ENCRYPT_FAILED, - NM_CRYPTO_ERR_RANDOMIZE_FAILED -}; - -typedef enum { - NM_CRYPTO_KEY_TYPE_UNKNOWN = 0, - NM_CRYPTO_KEY_TYPE_RSA, - NM_CRYPTO_KEY_TYPE_DSA -} NMCryptoKeyType; - -typedef enum { - NM_CRYPTO_FILE_FORMAT_UNKNOWN = 0, - NM_CRYPTO_FILE_FORMAT_X509, - NM_CRYPTO_FILE_FORMAT_RAW_KEY, - NM_CRYPTO_FILE_FORMAT_PKCS12 -} NMCryptoFileFormat; - -#define NM_CRYPTO_ERROR _nm_crypto_error_quark () -GQuark _nm_crypto_error_quark (void); - -gboolean crypto_init (GError **error); - -GByteArray *crypto_decrypt_private_key_data (const GByteArray *contents, - const char *password, - NMCryptoKeyType *out_key_type, - GError **error); - -GByteArray *crypto_decrypt_private_key (const char *file, - const char *password, - NMCryptoKeyType *out_key_type, - GError **error); - -GByteArray *crypto_load_and_verify_certificate (const char *file, - NMCryptoFileFormat *out_file_format, - GError **error); - -gboolean crypto_is_pkcs12_file (const char *file, GError **error); - -gboolean crypto_is_pkcs12_data (const GByteArray *data); - -NMCryptoFileFormat crypto_verify_private_key_data (const GByteArray *contents, - const char *password, - GError **error); - -NMCryptoFileFormat crypto_verify_private_key (const char *file, - const char *password, - GError **error); - -/* Internal utils API bits for crypto providers */ - -gboolean crypto_md5_hash (const char *salt, - const gsize salt_len, - const char *password, - gsize password_len, - char *buffer, - gsize buflen, - GError **error); - -char * crypto_decrypt (const char *cipher, - int key_type, - GByteArray *data, - const char *iv, - const gsize iv_len, - const char *key, - const gsize key_len, - gsize *out_len, - GError **error); - -char * crypto_encrypt (const char *cipher, - const GByteArray *data, - const char *iv, - gsize iv_len, - const char *key, - gsize key_len, - gsize *out_len, - GError **error); - -gboolean crypto_randomize (void *buffer, gsize buffer_len, GError **error); - -NMCryptoFileFormat crypto_verify_cert (const unsigned char *data, - gsize len, - GError **error); - -gboolean crypto_verify_pkcs12 (const GByteArray *data, - const char *password, - GError **error); - -gboolean crypto_verify_pkcs8 (const GByteArray *data, - gboolean is_encrypted, - const char *password, - GError **error); - -#endif /* __CRYPTO_H__ */ diff --git a/libnm-util/crypto_gnutls.c b/libnm-util/crypto_gnutls.c deleted file mode 100644 index 47c614b919..0000000000 --- a/libnm-util/crypto_gnutls.c +++ /dev/null @@ -1,465 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* NetworkManager Wireless Applet -- Display wireless access points and allow user control - * - * Dan Williams <dcbw@redhat.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2015 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <gnutls/gnutls.h> -#include <gnutls/crypto.h> -#include <gnutls/x509.h> -#include <gnutls/pkcs12.h> - -#include "crypto.h" - -#define SALT_LEN 8 - -static gboolean initialized = FALSE; - -gboolean -crypto_init (GError **error) -{ - if (initialized) - return TRUE; - - if (gnutls_global_init() != 0) { - gnutls_global_deinit(); - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_INIT_FAILED, - "%s", - _("Failed to initialize the crypto engine.")); - return FALSE; - } - - initialized = TRUE; - return TRUE; -} - -gboolean -crypto_md5_hash (const char *salt, - const gsize salt_len, - const char *password, - gsize password_len, - char *buffer, - gsize buflen, - GError **error) -{ - gnutls_hash_hd_t ctx; - int err; - int nkey = buflen; - const gsize digest_len = 16; - int count = 0; - char digest[MD5_HASH_LEN]; - char *p = buffer; - - if (salt) - g_return_val_if_fail (salt_len >= SALT_LEN, FALSE); - - g_return_val_if_fail (password != NULL, FALSE); - g_return_val_if_fail (password_len > 0, FALSE); - g_return_val_if_fail (buffer != NULL, FALSE); - g_return_val_if_fail (buflen > 0, FALSE); - - if (gnutls_hash_get_len (GNUTLS_DIG_MD5) > MD5_HASH_LEN) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_MD5_INIT_FAILED, - _("Hash length too long (%d > %d)."), - gnutls_hash_get_len (GNUTLS_DIG_MD5), MD5_HASH_LEN); - return FALSE; - } - - while (nkey > 0) { - int i = 0; - - err = gnutls_hash_init (&ctx, GNUTLS_DIG_MD5); - if (err < 0) - goto error; - - if (count++) - gnutls_hash (ctx, digest, digest_len); - gnutls_hash (ctx, password, password_len); - if (salt) - gnutls_hash (ctx, salt, SALT_LEN); /* Only use 8 bytes of salt */ - gnutls_hash_deinit (ctx, digest); - - while (nkey && (i < digest_len)) { - *(p++) = digest[i++]; - nkey--; - } - } - - memset (digest, 0, sizeof (digest)); - return TRUE; -error: - memset (digest, 0, sizeof (digest)); - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_MD5_INIT_FAILED, - _("Failed to initialize the MD5 engine: %s (%s)"), - gnutls_strerror_name (err), gnutls_strerror (err)); - return FALSE; -} - -char * -crypto_decrypt (const char *cipher, - int key_type, - GByteArray *data, - const char *iv, - const gsize iv_len, - const char *key, - const gsize key_len, - gsize *out_len, - GError **error) -{ - gnutls_cipher_hd_t ctx; - gnutls_datum_t key_dt, iv_dt; - int err; - int cipher_mech, i; - char *output = NULL; - gboolean success = FALSE; - gsize pad_len, real_iv_len; - - if (!strcmp (cipher, CIPHER_DES_EDE3_CBC)) { - cipher_mech = GNUTLS_CIPHER_3DES_CBC; - real_iv_len = SALT_LEN; - } else if (!strcmp (cipher, CIPHER_DES_CBC)) { - cipher_mech = GNUTLS_CIPHER_DES_CBC; - real_iv_len = SALT_LEN; - } else if (!strcmp (cipher, CIPHER_AES_CBC)) { - cipher_mech = GNUTLS_CIPHER_AES_128_CBC; - real_iv_len = 16; - } else { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_UNKNOWN_CIPHER, - _("Private key cipher '%s' was unknown."), - cipher); - return NULL; - } - - if (iv_len < real_iv_len) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_RAW_IV_INVALID, - _("Invalid IV length (must be at least %zd)."), - real_iv_len); - return NULL; - } - - output = g_malloc0 (data->len); - - key_dt.data = (unsigned char *) key; - key_dt.size = key_len; - iv_dt.data = (unsigned char *) iv; - iv_dt.size = iv_len; - - err = gnutls_cipher_init (&ctx, cipher_mech, &key_dt, &iv_dt); - if (err < 0) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_CIPHER_INIT_FAILED, - _("Failed to initialize the decryption cipher context: %s (%s)"), - gnutls_strerror_name (err), gnutls_strerror (err)); - goto out; - } - - err = gnutls_cipher_decrypt2 (ctx, data->data, data->len, output, data->len); - if (err < 0) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_CIPHER_DECRYPT_FAILED, - _("Failed to decrypt the private key: %s (%s)"), - gnutls_strerror_name (err), gnutls_strerror (err)); - goto out; - } - pad_len = output[data->len - 1]; - - /* Check if the padding at the end of the decrypted data is valid */ - if (pad_len == 0 || pad_len > real_iv_len) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_CIPHER_DECRYPT_FAILED, - _("Failed to decrypt the private key: unexpected padding length.")); - goto out; - } - - /* Validate tail padding; last byte is the padding size, and all pad bytes - * should contain the padding size. - */ - for (i = 1; i <= pad_len; ++i) { - if (output[data->len - i] != pad_len) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_CIPHER_DECRYPT_FAILED, - _("Failed to decrypt the private key.")); - goto out; - } - } - - *out_len = data->len - pad_len; - success = TRUE; - -out: - if (!success) { - if (output) { - /* Don't expose key material */ - memset (output, 0, data->len); - g_free (output); - output = NULL; - } - } - gnutls_cipher_deinit (ctx); - return output; -} - -char * -crypto_encrypt (const char *cipher, - const GByteArray *data, - const char *iv, - const gsize iv_len, - const char *key, - gsize key_len, - gsize *out_len, - GError **error) -{ - gnutls_cipher_hd_t ctx; - gnutls_datum_t key_dt, iv_dt; - int err; - int cipher_mech; - char *output = NULL; - gboolean success = FALSE; - gsize padded_buf_len, pad_len, output_len; - char *padded_buf = NULL; - guint32 i; - - if (!strcmp (cipher, CIPHER_DES_EDE3_CBC)) - cipher_mech = GNUTLS_CIPHER_3DES_CBC; - else if (!strcmp (cipher, CIPHER_AES_CBC)) - cipher_mech = GNUTLS_CIPHER_AES_128_CBC; - else { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_UNKNOWN_CIPHER, - _("Private key cipher '%s' was unknown."), - cipher); - return NULL; - } - - /* If data->len % ivlen == 0, then we add another complete block - * onto the end so that the decrypter knows there's padding. - */ - pad_len = iv_len - (data->len % iv_len); - output_len = padded_buf_len = data->len + pad_len; - padded_buf = g_malloc0 (padded_buf_len); - - memcpy (padded_buf, data->data, data->len); - for (i = 0; i < pad_len; i++) - padded_buf[data->len + i] = (guint8) (pad_len & 0xFF); - - output = g_malloc0 (output_len); - - key_dt.data = (unsigned char *) key; - key_dt.size = key_len; - iv_dt.data = (unsigned char *) iv; - iv_dt.size = iv_len; - - err = gnutls_cipher_init (&ctx, cipher_mech, &key_dt, &iv_dt); - if (err < 0) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_CIPHER_INIT_FAILED, - _("Failed to initialize the encryption cipher context: %s (%s)"), - gnutls_strerror_name (err), gnutls_strerror (err)); - goto out; - } - - err = gnutls_cipher_encrypt2 (ctx, padded_buf, padded_buf_len, output, output_len); - if (err < 0) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_CIPHER_DECRYPT_FAILED, - _("Failed to encrypt the data: %s (%s)"), - gnutls_strerror_name (err), gnutls_strerror (err)); - goto out; - } - - *out_len = output_len; - success = TRUE; - -out: - if (padded_buf) { - memset (padded_buf, 0, padded_buf_len); - g_free (padded_buf); - padded_buf = NULL; - } - - if (!success) { - if (output) { - /* Don't expose key material */ - memset (output, 0, output_len); - g_free (output); - output = NULL; - } - } - gnutls_cipher_deinit (ctx); - return output; -} - -NMCryptoFileFormat -crypto_verify_cert (const unsigned char *data, - gsize len, - GError **error) -{ - gnutls_x509_crt_t der; - gnutls_datum_t dt; - int err; - - err = gnutls_x509_crt_init (&der); - if (err < 0) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_CERT_FORMAT_INVALID, - _("Error initializing certificate data: %s"), - gnutls_strerror (err)); - return NM_CRYPTO_FILE_FORMAT_UNKNOWN; - } - - /* Try DER first */ - dt.data = (unsigned char *) data; - dt.size = len; - err = gnutls_x509_crt_import (der, &dt, GNUTLS_X509_FMT_DER); - if (err == GNUTLS_E_SUCCESS) { - gnutls_x509_crt_deinit (der); - return NM_CRYPTO_FILE_FORMAT_X509; - } - - /* And PEM next */ - err = gnutls_x509_crt_import (der, &dt, GNUTLS_X509_FMT_PEM); - gnutls_x509_crt_deinit (der); - if (err == GNUTLS_E_SUCCESS) - return NM_CRYPTO_FILE_FORMAT_X509; - - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_CERT_FORMAT_INVALID, - _("Couldn't decode certificate: %s"), - gnutls_strerror (err)); - return NM_CRYPTO_FILE_FORMAT_UNKNOWN; -} - -gboolean -crypto_verify_pkcs12 (const GByteArray *data, - const char *password, - GError **error) -{ - gnutls_pkcs12_t p12; - gnutls_datum_t dt; - gboolean success = FALSE; - int err; - - g_return_val_if_fail (data != NULL, FALSE); - - dt.data = (unsigned char *) data->data; - dt.size = data->len; - - err = gnutls_pkcs12_init (&p12); - if (err < 0) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_DECODE_FAILED, - _("Couldn't initialize PKCS#12 decoder: %s"), - gnutls_strerror (err)); - return FALSE; - } - - /* DER first */ - err = gnutls_pkcs12_import (p12, &dt, GNUTLS_X509_FMT_DER, 0); - if (err < 0) { - /* PEM next */ - err = gnutls_pkcs12_import (p12, &dt, GNUTLS_X509_FMT_PEM, 0); - if (err < 0) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_FILE_FORMAT_INVALID, - _("Couldn't decode PKCS#12 file: %s"), - gnutls_strerror (err)); - goto out; - } - } - - err = gnutls_pkcs12_verify_mac (p12, password); - if (err == GNUTLS_E_SUCCESS) - success = TRUE; - else { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_CIPHER_DECRYPT_FAILED, - _("Couldn't verify PKCS#12 file: %s"), - gnutls_strerror (err)); - } - -out: - gnutls_pkcs12_deinit (p12); - return success; -} - -gboolean -crypto_verify_pkcs8 (const GByteArray *data, - gboolean is_encrypted, - const char *password, - GError **error) -{ - gnutls_x509_privkey_t p8; - gnutls_datum_t dt; - int err; - - g_return_val_if_fail (data != NULL, FALSE); - - dt.data = (unsigned char *) data->data; - dt.size = data->len; - - err = gnutls_x509_privkey_init (&p8); - if (err < 0) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_DECODE_FAILED, - _("Couldn't initialize PKCS#8 decoder: %s"), - gnutls_strerror (err)); - return FALSE; - } - - err = gnutls_x509_privkey_import_pkcs8 (p8, - &dt, - GNUTLS_X509_FMT_DER, - is_encrypted ? password : NULL, - is_encrypted ? 0 : GNUTLS_PKCS_PLAIN); - gnutls_x509_privkey_deinit (p8); - - if (err < 0) { - if (err == GNUTLS_E_UNKNOWN_CIPHER_TYPE) { - /* HACK: gnutls doesn't support all the cipher types that openssl - * can use with PKCS#8, so if we encounter one, we have to assume - * the given password works. gnutls needs to unsuckify, apparently. - * Specifically, by default openssl uses pbeWithMD5AndDES-CBC - * which gnutls does not support. - */ - } else { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_FILE_FORMAT_INVALID, - _("Couldn't decode PKCS#8 file: %s"), - gnutls_strerror (err)); - return FALSE; - } - } - - return TRUE; -} - -gboolean -crypto_randomize (void *buffer, gsize buffer_len, GError **error) -{ - gnutls_rnd (GNUTLS_RND_RANDOM, buffer, buffer_len); - return TRUE; -} diff --git a/libnm-util/crypto_nss.c b/libnm-util/crypto_nss.c deleted file mode 100644 index 01bb28c33d..0000000000 --- a/libnm-util/crypto_nss.c +++ /dev/null @@ -1,555 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * Dan Williams <dcbw@redhat.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2009 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <prinit.h> -#include <nss.h> -#include <pk11pub.h> -#include <pkcs11t.h> -#include <cert.h> -#include <prerror.h> -#include <p12.h> -#include <ciferfam.h> -#include <p12plcy.h> - -#include "crypto.h" - -static gboolean initialized = FALSE; - -gboolean -crypto_init (GError **error) -{ - SECStatus ret; - - if (initialized) - return TRUE; - - PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 1); - ret = NSS_NoDB_Init (NULL); - if (ret != SECSuccess) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_INIT_FAILED, - _("Failed to initialize the crypto engine: %d."), - PR_GetError ()); - PR_Cleanup (); - return FALSE; - } - - SEC_PKCS12EnableCipher(PKCS12_RC4_40, 1); - SEC_PKCS12EnableCipher(PKCS12_RC4_128, 1); - SEC_PKCS12EnableCipher(PKCS12_RC2_CBC_40, 1); - SEC_PKCS12EnableCipher(PKCS12_RC2_CBC_128, 1); - SEC_PKCS12EnableCipher(PKCS12_DES_56, 1); - SEC_PKCS12EnableCipher(PKCS12_DES_EDE3_168, 1); - SEC_PKCS12SetPreferredCipher(PKCS12_DES_EDE3_168, 1); - - initialized = TRUE; - return TRUE; -} - -gboolean -crypto_md5_hash (const char *salt, - const gsize salt_len, - const char *password, - gsize password_len, - char *buffer, - gsize buflen, - GError **error) -{ - PK11Context *ctx; - int nkey = buflen; - unsigned digest_len; - int count = 0; - char digest[MD5_HASH_LEN]; - char *p = buffer; - - if (salt) - g_return_val_if_fail (salt_len >= 8, FALSE); - - g_return_val_if_fail (password != NULL, FALSE); - g_return_val_if_fail (password_len > 0, FALSE); - g_return_val_if_fail (buffer != NULL, FALSE); - g_return_val_if_fail (buflen > 0, FALSE); - - ctx = PK11_CreateDigestContext (SEC_OID_MD5); - if (!ctx) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_MD5_INIT_FAILED, - _("Failed to initialize the MD5 context: %d."), - PORT_GetError ()); - return FALSE; - } - - while (nkey > 0) { - int i = 0; - - PK11_DigestBegin (ctx); - if (count++) - PK11_DigestOp (ctx, (const unsigned char *) digest, digest_len); - PK11_DigestOp (ctx, (const unsigned char *) password, password_len); - if (salt) - PK11_DigestOp (ctx, (const unsigned char *) salt, 8); /* Only use 8 bytes of salt */ - PK11_DigestFinal (ctx, (unsigned char *) digest, &digest_len, sizeof (digest)); - - while (nkey && (i < digest_len)) { - *(p++) = digest[i++]; - nkey--; - } - } - - memset (digest, 0, sizeof (digest)); - PK11_DestroyContext (ctx, PR_TRUE); - return TRUE; -} - -char * -crypto_decrypt (const char *cipher, - int key_type, - GByteArray *data, - const char *iv, - const gsize iv_len, - const char *key, - const gsize key_len, - gsize *out_len, - GError **error) -{ - char *output = NULL; - int decrypted_len = 0; - CK_MECHANISM_TYPE cipher_mech; - PK11SlotInfo *slot = NULL; - SECItem key_item; - PK11SymKey *sym_key = NULL; - SECItem *sec_param = NULL; - PK11Context *ctx = NULL; - SECStatus s; - gboolean success = FALSE; - unsigned pad_len = 0, extra = 0; - guint32 i, real_iv_len = 0; - - if (!strcmp (cipher, CIPHER_DES_EDE3_CBC)) { - cipher_mech = CKM_DES3_CBC_PAD; - real_iv_len = 8; - } else if (!strcmp (cipher, CIPHER_DES_CBC)) { - cipher_mech = CKM_DES_CBC_PAD; - real_iv_len = 8; - } else if (!strcmp (cipher, CIPHER_AES_CBC)) { - cipher_mech = CKM_AES_CBC_PAD; - real_iv_len = 16; - } else { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_UNKNOWN_CIPHER, - _("Private key cipher '%s' was unknown."), - cipher); - return NULL; - } - - if (iv_len < real_iv_len) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_RAW_IV_INVALID, - _("Invalid IV length (must be at least %d)."), - real_iv_len); - return NULL; - } - - output = g_malloc0 (data->len); - - slot = PK11_GetBestSlot (cipher_mech, NULL); - if (!slot) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_CIPHER_INIT_FAILED, - _("Failed to initialize the decryption cipher slot.")); - goto out; - } - - key_item.data = (unsigned char *) key; - key_item.len = key_len; - sym_key = PK11_ImportSymKey (slot, cipher_mech, PK11_OriginUnwrap, CKA_DECRYPT, &key_item, NULL); - if (!sym_key) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_CIPHER_SET_KEY_FAILED, - _("Failed to set symmetric key for decryption.")); - goto out; - } - - key_item.data = (unsigned char *) iv; - key_item.len = real_iv_len; - sec_param = PK11_ParamFromIV (cipher_mech, &key_item); - if (!sec_param) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_CIPHER_SET_IV_FAILED, - _("Failed to set IV for decryption.")); - goto out; - } - - ctx = PK11_CreateContextBySymKey (cipher_mech, CKA_DECRYPT, sym_key, sec_param); - if (!ctx) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_CIPHER_INIT_FAILED, - _("Failed to initialize the decryption context.")); - goto out; - } - - s = PK11_CipherOp (ctx, - (unsigned char *) output, - &decrypted_len, - data->len, - data->data, - data->len); - if (s != SECSuccess) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_CIPHER_DECRYPT_FAILED, - _("Failed to decrypt the private key: %d."), - PORT_GetError ()); - goto out; - } - - if (decrypted_len > data->len) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_CIPHER_DECRYPT_FAILED, - _("Failed to decrypt the private key: decrypted data too large.")); - goto out; - } - - s = PK11_DigestFinal (ctx, - (unsigned char *) (output + decrypted_len), - &extra, - data->len - decrypted_len); - if (s != SECSuccess) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_CIPHER_DECRYPT_FAILED, - _("Failed to finalize decryption of the private key: %d."), - PORT_GetError ()); - goto out; - } - decrypted_len += extra; - pad_len = data->len - decrypted_len; - - /* Check if the padding at the end of the decrypted data is valid */ - if (pad_len == 0 || pad_len > real_iv_len) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_CIPHER_DECRYPT_FAILED, - _("Failed to decrypt the private key: unexpected padding length.")); - goto out; - } - - /* Validate tail padding; last byte is the padding size, and all pad bytes - * should contain the padding size. - */ - for (i = pad_len; i > 0; i--) { - if (output[data->len - i] != pad_len) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_CIPHER_DECRYPT_FAILED, - _("Failed to decrypt the private key.")); - goto out; - } - } - - *out_len = decrypted_len; - success = TRUE; - -out: - if (ctx) - PK11_DestroyContext (ctx, PR_TRUE); - if (sym_key) - PK11_FreeSymKey (sym_key); - if (sec_param) - SECITEM_FreeItem (sec_param, PR_TRUE); - if (slot) - PK11_FreeSlot (slot); - - if (!success) { - if (output) { - /* Don't expose key material */ - memset (output, 0, data->len); - g_free (output); - output = NULL; - } - } - return output; -} - -char * -crypto_encrypt (const char *cipher, - const GByteArray *data, - const char *iv, - gsize iv_len, - const char *key, - gsize key_len, - gsize *out_len, - GError **error) -{ - SECStatus ret; - CK_MECHANISM_TYPE cipher_mech = CKM_DES3_CBC_PAD; - PK11SlotInfo *slot = NULL; - SECItem key_item = { .data = (unsigned char *) key, .len = key_len }; - SECItem iv_item = { .data = (unsigned char *) iv, .len = iv_len }; - PK11SymKey *sym_key = NULL; - SECItem *sec_param = NULL; - PK11Context *ctx = NULL; - unsigned char *output, *padded_buf; - gsize output_len; - int encrypted_len = 0, i; - gboolean success = FALSE; - gsize padded_buf_len, pad_len; - - if (!strcmp (cipher, CIPHER_DES_EDE3_CBC)) - cipher_mech = CKM_DES3_CBC_PAD; - else if (!strcmp (cipher, CIPHER_AES_CBC)) - cipher_mech = CKM_AES_CBC_PAD; - else { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_UNKNOWN_CIPHER, - _("Private key cipher '%s' was unknown."), - cipher); - return NULL; - } - - /* If data->len % ivlen == 0, then we add another complete block - * onto the end so that the decrypter knows there's padding. - */ - pad_len = iv_len - (data->len % iv_len); - output_len = padded_buf_len = data->len + pad_len; - padded_buf = g_malloc0 (padded_buf_len); - - memcpy (padded_buf, data->data, data->len); - for (i = 0; i < pad_len; i++) - padded_buf[data->len + i] = (guint8) (pad_len & 0xFF); - - output = g_malloc0 (output_len); - - slot = PK11_GetBestSlot (cipher_mech, NULL); - if (!slot) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_CIPHER_INIT_FAILED, - _("Failed to initialize the encryption cipher slot.")); - goto out; - } - - sym_key = PK11_ImportSymKey (slot, cipher_mech, PK11_OriginUnwrap, CKA_ENCRYPT, &key_item, NULL); - if (!sym_key) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_CIPHER_SET_KEY_FAILED, - _("Failed to set symmetric key for encryption.")); - goto out; - } - - sec_param = PK11_ParamFromIV (cipher_mech, &iv_item); - if (!sec_param) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_CIPHER_SET_IV_FAILED, - _("Failed to set IV for encryption.")); - goto out; - } - - ctx = PK11_CreateContextBySymKey (cipher_mech, CKA_ENCRYPT, sym_key, sec_param); - if (!ctx) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_CIPHER_INIT_FAILED, - _("Failed to initialize the encryption context.")); - goto out; - } - - ret = PK11_CipherOp (ctx, output, &encrypted_len, output_len, padded_buf, padded_buf_len); - if (ret != SECSuccess) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_CIPHER_ENCRYPT_FAILED, - _("Failed to encrypt: %d."), - PORT_GetError ()); - goto out; - } - - if (encrypted_len != output_len) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_CIPHER_ENCRYPT_FAILED, - _("Unexpected amount of data after encrypting.")); - goto out; - } - - *out_len = encrypted_len; - success = TRUE; - -out: - if (ctx) - PK11_DestroyContext (ctx, PR_TRUE); - if (sym_key) - PK11_FreeSymKey (sym_key); - if (sec_param) - SECITEM_FreeItem (sec_param, PR_TRUE); - if (slot) - PK11_FreeSlot (slot); - - memset (padded_buf, 0, padded_buf_len); - g_free (padded_buf); - - if (!success) { - memset (output, 0, output_len); - g_free (output); - output = NULL; - } - return (char *) output; -} - -NMCryptoFileFormat -crypto_verify_cert (const unsigned char *data, - gsize len, - GError **error) -{ - CERTCertificate *cert; - - /* Try DER/PEM first */ - cert = CERT_DecodeCertFromPackage ((char *) data, len); - if (!cert) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_CERT_FORMAT_INVALID, - _("Couldn't decode certificate: %d"), - PORT_GetError()); - return NM_CRYPTO_FILE_FORMAT_UNKNOWN; - } - - CERT_DestroyCertificate (cert); - return NM_CRYPTO_FILE_FORMAT_X509; -} - -gboolean -crypto_verify_pkcs12 (const GByteArray *data, - const char *password, - GError **error) -{ - SEC_PKCS12DecoderContext *p12ctx = NULL; - SECItem pw = { 0 }; - PK11SlotInfo *slot = NULL; - SECStatus s; - char *ucs2_password; - long ucs2_chars = 0; - - if (error) - g_return_val_if_fail (*error == NULL, FALSE); - - /* PKCS#12 passwords are apparently UCS2 BIG ENDIAN, and NSS doesn't do - * any conversions for us. - */ - if (password && strlen (password)) { - ucs2_password = (char *) g_utf8_to_utf16 (password, strlen (password), NULL, &ucs2_chars, NULL); - if (!ucs2_password || !ucs2_chars) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_INVALID_PASSWORD, - _("Couldn't convert password to UCS2: %d"), - PORT_GetError()); - return FALSE; - } - - ucs2_chars *= 2; /* convert # UCS2 characters -> bytes */ - pw.data = PORT_ZAlloc(ucs2_chars + 2); - memcpy (pw.data, ucs2_password, ucs2_chars); - pw.len = ucs2_chars + 2; /* include terminating NULL */ - - memset (ucs2_password, 0, ucs2_chars); - g_free (ucs2_password); - -#if __BYTE_ORDER == __LITTLE_ENDIAN - { - guint16 *p; - - for (p = (guint16 *) pw.data; p < (guint16 *) (pw.data + pw.len); p++) - *p = GUINT16_SWAP_LE_BE (*p); - } -#endif - } else { - /* NULL password */ - pw.data = NULL; - pw.len = 0; - } - - slot = PK11_GetInternalKeySlot(); - p12ctx = SEC_PKCS12DecoderStart (&pw, slot, NULL, NULL, NULL, NULL, NULL, NULL); - if (!p12ctx) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_DECODE_FAILED, - _("Couldn't initialize PKCS#12 decoder: %d"), - PORT_GetError()); - goto error; - } - - s = SEC_PKCS12DecoderUpdate (p12ctx, data->data, data->len); - if (s != SECSuccess) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_FILE_FORMAT_INVALID, - _("Couldn't decode PKCS#12 file: %d"), - PORT_GetError()); - goto error; - } - - s = SEC_PKCS12DecoderVerify (p12ctx); - if (s != SECSuccess) { - g_set_error (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_CIPHER_DECRYPT_FAILED, - _("Couldn't verify PKCS#12 file: %d"), - PORT_GetError()); - goto error; - } - - SEC_PKCS12DecoderFinish (p12ctx); - SECITEM_ZfreeItem (&pw, PR_FALSE); - return TRUE; - -error: - if (p12ctx) - SEC_PKCS12DecoderFinish (p12ctx); - - if (slot) - PK11_FreeSlot(slot); - - SECITEM_ZfreeItem (&pw, PR_FALSE); - return FALSE; -} - -gboolean -crypto_verify_pkcs8 (const GByteArray *data, - gboolean is_encrypted, - const char *password, - GError **error) -{ - g_return_val_if_fail (data != NULL, FALSE); - - /* NSS apparently doesn't do PKCS#8 natively, but you have to put the - * PKCS#8 key into a PKCS#12 file and import that?? So until we figure - * all that out, we can only assume the password is valid. - */ - return TRUE; -} - -gboolean -crypto_randomize (void *buffer, gsize buffer_len, GError **error) -{ - SECStatus s; - - s = PK11_GenerateRandom (buffer, buffer_len); - if (s != SECSuccess) { - g_set_error_literal (error, NM_CRYPTO_ERROR, - NM_CRYPTO_ERR_RANDOMIZE_FAILED, - _("Could not generate random data.")); - return FALSE; - } - return TRUE; -} diff --git a/libnm-util/libnm-util.pc.in b/libnm-util/libnm-util.pc.in deleted file mode 100644 index 4f1ff3ef0e..0000000000 --- a/libnm-util/libnm-util.pc.in +++ /dev/null @@ -1,13 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: libnm-util -Description: Convenience library for clients of NetworkManager -Version: @VERSION@ -Requires: NetworkManager >= @VERSION@ glib-2.0 dbus-glib-1 -Cflags: -I${includedir}/NetworkManager -Libs: -L${libdir} -lnm-util - - diff --git a/libnm-util/libnm-util.ver b/libnm-util/libnm-util.ver deleted file mode 100644 index 385cdb8e3b..0000000000 --- a/libnm-util/libnm-util.ver +++ /dev/null @@ -1,671 +0,0 @@ -{ -global: - _nm_connection_new_from_hash; - _nm_connection_replace_settings; - nm_connection_add_setting; - nm_connection_clear_secrets; - nm_connection_clear_secrets_with_flags; - nm_connection_compare; - nm_connection_create_setting; - nm_connection_diff; - nm_connection_dump; - nm_connection_duplicate; - nm_connection_error_get_type; - nm_connection_error_quark; - nm_connection_for_each_setting_value; - nm_connection_get_connection_type; - nm_connection_get_id; - nm_connection_get_interface_name; - nm_connection_get_path; - nm_connection_get_setting; - nm_connection_get_setting_802_1x; - nm_connection_get_setting_adsl; - nm_connection_get_setting_bluetooth; - nm_connection_get_setting_bond; - nm_connection_get_setting_bridge; - nm_connection_get_setting_bridge_port; - nm_connection_get_setting_by_name; - nm_connection_get_setting_cdma; - nm_connection_get_setting_connection; - nm_connection_get_setting_dcb; - nm_connection_get_setting_generic; - nm_connection_get_setting_gsm; - nm_connection_get_setting_infiniband; - nm_connection_get_setting_ip4_config; - nm_connection_get_setting_ip6_config; - nm_connection_get_setting_olpc_mesh; - nm_connection_get_setting_ppp; - nm_connection_get_setting_pppoe; - nm_connection_get_setting_serial; - nm_connection_get_setting_team; - nm_connection_get_setting_team_port; - nm_connection_get_setting_vlan; - nm_connection_get_setting_vpn; - nm_connection_get_setting_wimax; - nm_connection_get_setting_wired; - nm_connection_get_setting_wireless; - nm_connection_get_setting_wireless_security; - nm_connection_get_type; - nm_connection_get_uuid; - nm_connection_get_virtual_device_description; - nm_connection_get_virtual_iface_name; - nm_connection_is_type; - nm_connection_lookup_setting_type; - nm_connection_lookup_setting_type_by_quark; - nm_connection_need_secrets; - nm_connection_new; - nm_connection_new_from_hash; - nm_connection_normalize; - nm_connection_remove_setting; - nm_connection_replace_settings; - nm_connection_replace_settings_from_connection; - nm_connection_set_path; - nm_connection_to_hash; - nm_connection_update_secrets; - nm_connection_verify; - nm_ip4_address_compare; - nm_ip4_address_dup; - nm_ip4_address_get_address; - nm_ip4_address_get_gateway; - nm_ip4_address_get_prefix; - nm_ip4_address_get_type; - nm_ip4_address_new; - nm_ip4_address_ref; - nm_ip4_address_set_address; - nm_ip4_address_set_gateway; - nm_ip4_address_set_prefix; - nm_ip4_address_unref; - nm_ip4_route_compare; - nm_ip4_route_dup; - nm_ip4_route_get_dest; - nm_ip4_route_get_metric; - nm_ip4_route_get_next_hop; - nm_ip4_route_get_prefix; - nm_ip4_route_get_type; - nm_ip4_route_new; - nm_ip4_route_ref; - nm_ip4_route_set_dest; - nm_ip4_route_set_metric; - nm_ip4_route_set_next_hop; - nm_ip4_route_set_prefix; - nm_ip4_route_unref; - nm_ip6_address_compare; - nm_ip6_address_dup; - nm_ip6_address_get_address; - nm_ip6_address_get_gateway; - nm_ip6_address_get_prefix; - nm_ip6_address_get_type; - nm_ip6_address_new; - nm_ip6_address_ref; - nm_ip6_address_set_address; - nm_ip6_address_set_gateway; - nm_ip6_address_set_prefix; - nm_ip6_address_unref; - nm_ip6_route_compare; - nm_ip6_route_dup; - nm_ip6_route_get_dest; - nm_ip6_route_get_metric; - nm_ip6_route_get_next_hop; - nm_ip6_route_get_prefix; - nm_ip6_route_get_type; - nm_ip6_route_new; - nm_ip6_route_ref; - nm_ip6_route_set_dest; - nm_ip6_route_set_metric; - nm_ip6_route_set_next_hop; - nm_ip6_route_set_prefix; - nm_ip6_route_unref; - nm_setting_802_1x_add_altsubject_match; - nm_setting_802_1x_add_eap_method; - nm_setting_802_1x_add_phase2_altsubject_match; - nm_setting_802_1x_ck_format_get_type; - nm_setting_802_1x_ck_scheme_get_type; - nm_setting_802_1x_clear_altsubject_matches; - nm_setting_802_1x_clear_eap_methods; - nm_setting_802_1x_clear_phase2_altsubject_matches; - nm_setting_802_1x_error_get_type; - nm_setting_802_1x_error_quark; - nm_setting_802_1x_get_altsubject_match; - nm_setting_802_1x_get_anonymous_identity; - nm_setting_802_1x_get_ca_cert_blob; - nm_setting_802_1x_get_ca_cert_path; - nm_setting_802_1x_get_ca_cert_scheme; - nm_setting_802_1x_get_ca_path; - nm_setting_802_1x_get_client_cert_blob; - nm_setting_802_1x_get_client_cert_path; - nm_setting_802_1x_get_client_cert_scheme; - nm_setting_802_1x_get_eap_method; - nm_setting_802_1x_get_identity; - nm_setting_802_1x_get_num_altsubject_matches; - nm_setting_802_1x_get_num_eap_methods; - nm_setting_802_1x_get_num_phase2_altsubject_matches; - nm_setting_802_1x_get_pac_file; - nm_setting_802_1x_get_password; - nm_setting_802_1x_get_password_flags; - nm_setting_802_1x_get_password_raw; - nm_setting_802_1x_get_password_raw_flags; - nm_setting_802_1x_get_phase1_fast_provisioning; - nm_setting_802_1x_get_phase1_peaplabel; - nm_setting_802_1x_get_phase1_peapver; - nm_setting_802_1x_get_phase2_altsubject_match; - nm_setting_802_1x_get_phase2_auth; - nm_setting_802_1x_get_phase2_autheap; - nm_setting_802_1x_get_phase2_ca_cert_blob; - nm_setting_802_1x_get_phase2_ca_cert_path; - nm_setting_802_1x_get_phase2_ca_cert_scheme; - nm_setting_802_1x_get_phase2_ca_path; - nm_setting_802_1x_get_phase2_client_cert_blob; - nm_setting_802_1x_get_phase2_client_cert_path; - nm_setting_802_1x_get_phase2_client_cert_scheme; - nm_setting_802_1x_get_phase2_private_key_blob; - nm_setting_802_1x_get_phase2_private_key_format; - nm_setting_802_1x_get_phase2_private_key_password; - nm_setting_802_1x_get_phase2_private_key_password_flags; - nm_setting_802_1x_get_phase2_private_key_path; - nm_setting_802_1x_get_phase2_private_key_scheme; - nm_setting_802_1x_get_phase2_subject_match; - nm_setting_802_1x_get_pin; - nm_setting_802_1x_get_pin_flags; - nm_setting_802_1x_get_private_key_blob; - nm_setting_802_1x_get_private_key_format; - nm_setting_802_1x_get_private_key_password; - nm_setting_802_1x_get_private_key_password_flags; - nm_setting_802_1x_get_private_key_path; - nm_setting_802_1x_get_private_key_scheme; - nm_setting_802_1x_get_subject_match; - nm_setting_802_1x_get_system_ca_certs; - nm_setting_802_1x_get_type; - nm_setting_802_1x_new; - nm_setting_802_1x_remove_altsubject_match; - nm_setting_802_1x_remove_altsubject_match_by_value; - nm_setting_802_1x_remove_eap_method; - nm_setting_802_1x_remove_eap_method_by_value; - nm_setting_802_1x_remove_phase2_altsubject_match; - nm_setting_802_1x_remove_phase2_altsubject_match_by_value; - nm_setting_802_1x_set_ca_cert; - nm_setting_802_1x_set_client_cert; - nm_setting_802_1x_set_phase2_ca_cert; - nm_setting_802_1x_set_phase2_client_cert; - nm_setting_802_1x_set_phase2_private_key; - nm_setting_802_1x_set_private_key; - nm_setting_adsl_error_get_type; - nm_setting_adsl_error_quark; - nm_setting_adsl_get_encapsulation; - nm_setting_adsl_get_password; - nm_setting_adsl_get_password_flags; - nm_setting_adsl_get_protocol; - nm_setting_adsl_get_type; - nm_setting_adsl_get_username; - nm_setting_adsl_get_vci; - nm_setting_adsl_get_vpi; - nm_setting_adsl_new; - nm_setting_bluetooth_error_get_type; - nm_setting_bluetooth_error_quark; - nm_setting_bluetooth_get_bdaddr; - nm_setting_bluetooth_get_connection_type; - nm_setting_bluetooth_get_type; - nm_setting_bluetooth_new; - nm_setting_bond_add_option; - nm_setting_bond_error_get_type; - nm_setting_bond_error_quark; - nm_setting_bond_get_interface_name; - nm_setting_bond_get_num_options; - nm_setting_bond_get_option; - nm_setting_bond_get_option_by_name; - nm_setting_bond_get_option_default; - nm_setting_bond_get_type; - nm_setting_bond_get_valid_options; - nm_setting_bond_new; - nm_setting_bond_remove_option; - nm_setting_bond_validate_option; - nm_setting_bridge_error_get_type; - nm_setting_bridge_error_quark; - nm_setting_bridge_get_ageing_time; - nm_setting_bridge_get_forward_delay; - nm_setting_bridge_get_hello_time; - nm_setting_bridge_get_interface_name; - nm_setting_bridge_get_mac_address; - nm_setting_bridge_get_max_age; - nm_setting_bridge_get_priority; - nm_setting_bridge_get_stp; - nm_setting_bridge_get_type; - nm_setting_bridge_new; - nm_setting_bridge_port_error_get_type; - nm_setting_bridge_port_error_quark; - nm_setting_bridge_port_get_hairpin_mode; - nm_setting_bridge_port_get_path_cost; - nm_setting_bridge_port_get_priority; - nm_setting_bridge_port_get_type; - nm_setting_bridge_port_new; - nm_setting_cdma_error_get_type; - nm_setting_cdma_error_quark; - nm_setting_cdma_get_number; - nm_setting_cdma_get_password; - nm_setting_cdma_get_password_flags; - nm_setting_cdma_get_type; - nm_setting_cdma_get_username; - nm_setting_cdma_new; - nm_setting_clear_secrets; - nm_setting_clear_secrets_with_flags; - nm_setting_compare; - nm_setting_compare_flags_get_type; - nm_setting_connection_add_permission; - nm_setting_connection_add_secondary; - nm_setting_connection_error_get_type; - nm_setting_connection_error_quark; - nm_setting_connection_get_autoconnect; - nm_setting_connection_get_connection_type; - nm_setting_connection_get_gateway_ping_timeout; - nm_setting_connection_get_id; - nm_setting_connection_get_interface_name; - nm_setting_connection_get_master; - nm_setting_connection_get_num_permissions; - nm_setting_connection_get_num_secondaries; - nm_setting_connection_get_permission; - nm_setting_connection_get_read_only; - nm_setting_connection_get_secondary; - nm_setting_connection_get_slave_type; - nm_setting_connection_get_timestamp; - nm_setting_connection_get_type; - nm_setting_connection_get_uuid; - nm_setting_connection_get_zone; - nm_setting_connection_is_slave_type; - nm_setting_connection_new; - nm_setting_connection_permissions_user_allowed; - nm_setting_connection_remove_permission; - nm_setting_connection_remove_permission_by_value; - nm_setting_connection_remove_secondary; - nm_setting_connection_remove_secondary_by_value; - nm_setting_dcb_error_get_type; - nm_setting_dcb_error_quark; - nm_setting_dcb_flags_get_type; - nm_setting_dcb_get_app_fcoe_flags; - nm_setting_dcb_get_app_fcoe_mode; - nm_setting_dcb_get_app_fcoe_priority; - nm_setting_dcb_get_app_fip_flags; - nm_setting_dcb_get_app_fip_priority; - nm_setting_dcb_get_app_iscsi_flags; - nm_setting_dcb_get_app_iscsi_priority; - nm_setting_dcb_get_priority_bandwidth; - nm_setting_dcb_get_priority_flow_control; - nm_setting_dcb_get_priority_flow_control_flags; - nm_setting_dcb_get_priority_group_bandwidth; - nm_setting_dcb_get_priority_group_flags; - nm_setting_dcb_get_priority_group_id; - nm_setting_dcb_get_priority_strict_bandwidth; - nm_setting_dcb_get_priority_traffic_class; - nm_setting_dcb_get_type; - nm_setting_dcb_new; - nm_setting_dcb_set_priority_bandwidth; - nm_setting_dcb_set_priority_flow_control; - nm_setting_dcb_set_priority_group_bandwidth; - nm_setting_dcb_set_priority_group_id; - nm_setting_dcb_set_priority_strict_bandwidth; - nm_setting_dcb_set_priority_traffic_class; - nm_setting_diff; - nm_setting_diff_result_get_type; - nm_setting_duplicate; - nm_setting_enumerate_values; - nm_setting_error_get_type; - nm_setting_error_quark; - nm_setting_generic_error_get_type; - nm_setting_generic_error_quark; - nm_setting_generic_get_type; - nm_setting_generic_new; - nm_setting_get_name; - nm_setting_get_secret_flags; - nm_setting_get_type; - nm_setting_get_virtual_iface_name; - nm_setting_gsm_error_get_type; - nm_setting_gsm_error_quark; - nm_setting_gsm_get_allowed_bands; - nm_setting_gsm_get_apn; - nm_setting_gsm_get_home_only; - nm_setting_gsm_get_network_id; - nm_setting_gsm_get_network_type; - nm_setting_gsm_get_number; - nm_setting_gsm_get_password; - nm_setting_gsm_get_password_flags; - nm_setting_gsm_get_pin; - nm_setting_gsm_get_pin_flags; - nm_setting_gsm_get_type; - nm_setting_gsm_get_username; - nm_setting_gsm_network_band_get_type; - nm_setting_gsm_network_type_get_type; - nm_setting_gsm_new; - nm_setting_hash_flags_get_type; - nm_setting_infiniband_error_get_type; - nm_setting_infiniband_error_quark; - nm_setting_infiniband_get_mac_address; - nm_setting_infiniband_get_mtu; - nm_setting_infiniband_get_p_key; - nm_setting_infiniband_get_parent; - nm_setting_infiniband_get_transport_mode; - nm_setting_infiniband_get_type; - nm_setting_infiniband_new; - nm_setting_ip4_config_add_address; - nm_setting_ip4_config_add_dns; - nm_setting_ip4_config_add_dns_search; - nm_setting_ip4_config_add_route; - nm_setting_ip4_config_clear_addresses; - nm_setting_ip4_config_clear_dns; - nm_setting_ip4_config_clear_dns_searches; - nm_setting_ip4_config_clear_routes; - nm_setting_ip4_config_error_get_type; - nm_setting_ip4_config_error_quark; - nm_setting_ip4_config_get_address; - nm_setting_ip4_config_get_dhcp_client_id; - nm_setting_ip4_config_get_dhcp_hostname; - nm_setting_ip4_config_get_dhcp_send_hostname; - nm_setting_ip4_config_get_dhcp_timeout; - nm_setting_ip4_config_get_dns; - nm_setting_ip4_config_get_dns_search; - nm_setting_ip4_config_get_ignore_auto_dns; - nm_setting_ip4_config_get_ignore_auto_routes; - nm_setting_ip4_config_get_may_fail; - nm_setting_ip4_config_get_method; - nm_setting_ip4_config_get_never_default; - nm_setting_ip4_config_get_num_addresses; - nm_setting_ip4_config_get_num_dns; - nm_setting_ip4_config_get_num_dns_searches; - nm_setting_ip4_config_get_num_routes; - nm_setting_ip4_config_get_route; - nm_setting_ip4_config_get_route_metric; - nm_setting_ip4_config_get_type; - nm_setting_ip4_config_new; - nm_setting_ip4_config_remove_address; - nm_setting_ip4_config_remove_address_by_value; - nm_setting_ip4_config_remove_dns; - nm_setting_ip4_config_remove_dns_by_value; - nm_setting_ip4_config_remove_dns_search; - nm_setting_ip4_config_remove_dns_search_by_value; - nm_setting_ip4_config_remove_route; - nm_setting_ip4_config_remove_route_by_value; - nm_setting_ip6_config_add_address; - nm_setting_ip6_config_add_dns; - nm_setting_ip6_config_add_dns_search; - nm_setting_ip6_config_add_route; - nm_setting_ip6_config_clear_addresses; - nm_setting_ip6_config_clear_dns; - nm_setting_ip6_config_clear_dns_searches; - nm_setting_ip6_config_clear_routes; - nm_setting_ip6_config_error_get_type; - nm_setting_ip6_config_error_quark; - nm_setting_ip6_config_get_address; - nm_setting_ip6_config_get_dhcp_hostname; - nm_setting_ip6_config_get_dns; - nm_setting_ip6_config_get_dns_search; - nm_setting_ip6_config_get_ignore_auto_dns; - nm_setting_ip6_config_get_ignore_auto_routes; - nm_setting_ip6_config_get_ip6_privacy; - nm_setting_ip6_config_get_may_fail; - nm_setting_ip6_config_get_method; - nm_setting_ip6_config_get_never_default; - nm_setting_ip6_config_get_num_addresses; - nm_setting_ip6_config_get_num_dns; - nm_setting_ip6_config_get_num_dns_searches; - nm_setting_ip6_config_get_num_routes; - nm_setting_ip6_config_get_route; - nm_setting_ip6_config_get_route_metric; - nm_setting_ip6_config_get_type; - nm_setting_ip6_config_new; - nm_setting_ip6_config_privacy_get_type; - nm_setting_ip6_config_remove_address; - nm_setting_ip6_config_remove_address_by_value; - nm_setting_ip6_config_remove_dns; - nm_setting_ip6_config_remove_dns_by_value; - nm_setting_ip6_config_remove_dns_search; - nm_setting_ip6_config_remove_dns_search_by_value; - nm_setting_ip6_config_remove_route; - nm_setting_ip6_config_remove_route_by_value; - nm_setting_need_secrets; - nm_setting_new_from_hash; - nm_setting_olpc_mesh_error_get_type; - nm_setting_olpc_mesh_error_quark; - nm_setting_olpc_mesh_get_channel; - nm_setting_olpc_mesh_get_dhcp_anycast_address; - nm_setting_olpc_mesh_get_ssid; - nm_setting_olpc_mesh_get_type; - nm_setting_olpc_mesh_new; - nm_setting_ppp_error_get_type; - nm_setting_ppp_error_quark; - nm_setting_ppp_get_baud; - nm_setting_ppp_get_crtscts; - nm_setting_ppp_get_lcp_echo_failure; - nm_setting_ppp_get_lcp_echo_interval; - nm_setting_ppp_get_mppe_stateful; - nm_setting_ppp_get_mru; - nm_setting_ppp_get_mtu; - nm_setting_ppp_get_no_vj_comp; - nm_setting_ppp_get_noauth; - nm_setting_ppp_get_nobsdcomp; - nm_setting_ppp_get_nodeflate; - nm_setting_ppp_get_refuse_chap; - nm_setting_ppp_get_refuse_eap; - nm_setting_ppp_get_refuse_mschap; - nm_setting_ppp_get_refuse_mschapv2; - nm_setting_ppp_get_refuse_pap; - nm_setting_ppp_get_require_mppe; - nm_setting_ppp_get_require_mppe_128; - nm_setting_ppp_get_type; - nm_setting_ppp_new; - nm_setting_pppoe_error_get_type; - nm_setting_pppoe_error_quark; - nm_setting_pppoe_get_password; - nm_setting_pppoe_get_password_flags; - nm_setting_pppoe_get_service; - nm_setting_pppoe_get_type; - nm_setting_pppoe_get_username; - nm_setting_pppoe_new; - nm_setting_secret_flags_get_type; - nm_setting_serial_error_get_type; - nm_setting_serial_error_quark; - nm_setting_serial_get_baud; - nm_setting_serial_get_bits; - nm_setting_serial_get_parity; - nm_setting_serial_get_send_delay; - nm_setting_serial_get_stopbits; - nm_setting_serial_get_type; - nm_setting_serial_new; - nm_setting_set_secret_flags; - nm_setting_team_error_get_type; - nm_setting_team_error_quark; - nm_setting_team_get_config; - nm_setting_team_get_interface_name; - nm_setting_team_get_type; - nm_setting_team_new; - nm_setting_team_port_error_get_type; - nm_setting_team_port_error_quark; - nm_setting_team_port_get_config; - nm_setting_team_port_get_type; - nm_setting_team_port_new; - nm_setting_to_hash; - nm_setting_to_string; - nm_setting_update_secrets; - nm_setting_verify; - nm_setting_vlan_add_priority; - nm_setting_vlan_add_priority_str; - nm_setting_vlan_clear_priorities; - nm_setting_vlan_error_get_type; - nm_setting_vlan_error_quark; - nm_setting_vlan_get_flags; - nm_setting_vlan_get_id; - nm_setting_vlan_get_interface_name; - nm_setting_vlan_get_num_priorities; - nm_setting_vlan_get_parent; - nm_setting_vlan_get_priority; - nm_setting_vlan_get_type; - nm_setting_vlan_new; - nm_setting_vlan_remove_priority; - nm_setting_vlan_remove_priority_by_value; - nm_setting_vlan_remove_priority_str_by_value; - nm_setting_vpn_add_data_item; - nm_setting_vpn_add_secret; - nm_setting_vpn_error_get_type; - nm_setting_vpn_error_quark; - nm_setting_vpn_foreach_data_item; - nm_setting_vpn_foreach_secret; - nm_setting_vpn_get_data_item; - nm_setting_vpn_get_num_data_items; - nm_setting_vpn_get_num_secrets; - nm_setting_vpn_get_secret; - nm_setting_vpn_get_service_type; - nm_setting_vpn_get_type; - nm_setting_vpn_get_user_name; - nm_setting_vpn_new; - nm_setting_vpn_remove_data_item; - nm_setting_vpn_remove_secret; - nm_setting_wimax_error_get_type; - nm_setting_wimax_error_quark; - nm_setting_wimax_get_mac_address; - nm_setting_wimax_get_network_name; - nm_setting_wimax_get_type; - nm_setting_wimax_new; - nm_setting_wired_add_mac_blacklist_item; - nm_setting_wired_add_s390_option; - nm_setting_wired_clear_mac_blacklist_items; - nm_setting_wired_error_get_type; - nm_setting_wired_error_quark; - nm_setting_wired_get_auto_negotiate; - nm_setting_wired_get_cloned_mac_address; - nm_setting_wired_get_duplex; - nm_setting_wired_get_mac_address; - nm_setting_wired_get_mac_address_blacklist; - nm_setting_wired_get_mac_blacklist_item; - nm_setting_wired_get_mtu; - nm_setting_wired_get_num_mac_blacklist_items; - nm_setting_wired_get_num_s390_options; - nm_setting_wired_get_port; - nm_setting_wired_get_s390_nettype; - nm_setting_wired_get_s390_option; - nm_setting_wired_get_s390_option_by_key; - nm_setting_wired_get_s390_subchannels; - nm_setting_wired_get_speed; - nm_setting_wired_get_type; - nm_setting_wired_get_valid_s390_options; - nm_setting_wired_new; - nm_setting_wired_remove_mac_blacklist_item; - nm_setting_wired_remove_mac_blacklist_item_by_value; - nm_setting_wired_remove_s390_option; - nm_setting_wireless_add_mac_blacklist_item; - nm_setting_wireless_add_seen_bssid; - nm_setting_wireless_ap_security_compatible; - nm_setting_wireless_clear_mac_blacklist_items; - nm_setting_wireless_error_get_type; - nm_setting_wireless_error_quark; - nm_setting_wireless_get_band; - nm_setting_wireless_get_bssid; - nm_setting_wireless_get_channel; - nm_setting_wireless_get_cloned_mac_address; - nm_setting_wireless_get_hidden; - nm_setting_wireless_get_mac_address; - nm_setting_wireless_get_mac_address_blacklist; - nm_setting_wireless_get_mac_blacklist_item; - nm_setting_wireless_get_mode; - nm_setting_wireless_get_mtu; - nm_setting_wireless_get_num_mac_blacklist_items; - nm_setting_wireless_get_num_seen_bssids; - nm_setting_wireless_get_powersave; - nm_setting_wireless_get_rate; - nm_setting_wireless_get_security; - nm_setting_wireless_get_seen_bssid; - nm_setting_wireless_get_ssid; - nm_setting_wireless_get_tx_power; - nm_setting_wireless_get_type; - nm_setting_wireless_new; - nm_setting_wireless_remove_mac_blacklist_item; - nm_setting_wireless_remove_mac_blacklist_item_by_value; - nm_setting_wireless_security_add_group; - nm_setting_wireless_security_add_pairwise; - nm_setting_wireless_security_add_proto; - nm_setting_wireless_security_clear_groups; - nm_setting_wireless_security_clear_pairwise; - nm_setting_wireless_security_clear_protos; - nm_setting_wireless_security_error_get_type; - nm_setting_wireless_security_error_quark; - nm_setting_wireless_security_get_auth_alg; - nm_setting_wireless_security_get_group; - nm_setting_wireless_security_get_key_mgmt; - nm_setting_wireless_security_get_leap_password; - nm_setting_wireless_security_get_leap_password_flags; - nm_setting_wireless_security_get_leap_username; - nm_setting_wireless_security_get_num_groups; - nm_setting_wireless_security_get_num_pairwise; - nm_setting_wireless_security_get_num_protos; - nm_setting_wireless_security_get_pairwise; - nm_setting_wireless_security_get_proto; - nm_setting_wireless_security_get_psk; - nm_setting_wireless_security_get_psk_flags; - nm_setting_wireless_security_get_type; - nm_setting_wireless_security_get_wep_key; - nm_setting_wireless_security_get_wep_key_flags; - nm_setting_wireless_security_get_wep_key_type; - nm_setting_wireless_security_get_wep_tx_keyidx; - nm_setting_wireless_security_new; - nm_setting_wireless_security_remove_group; - nm_setting_wireless_security_remove_group_by_value; - nm_setting_wireless_security_remove_pairwise; - nm_setting_wireless_security_remove_pairwise_by_value; - nm_setting_wireless_security_remove_proto; - nm_setting_wireless_security_remove_proto_by_value; - nm_setting_wireless_security_set_wep_key; - nm_util_get_private; - nm_utils_ap_mode_security_valid; - nm_utils_bin2hexstr; - nm_utils_check_virtual_device_compatibility; - nm_utils_deinit; - nm_utils_escape_ssid; - nm_utils_file_is_pkcs12; - nm_utils_file_search_in_paths; - nm_utils_get_private; - nm_utils_gvalue_hash_dup; - nm_utils_hex2byte; - nm_utils_hexstr2bin; - nm_utils_hwaddr_atoba; - nm_utils_hwaddr_aton; - nm_utils_hwaddr_aton_len; - nm_utils_hwaddr_len; - nm_utils_hwaddr_ntoa; - nm_utils_hwaddr_ntoa_len; - nm_utils_hwaddr_type; - nm_utils_hwaddr_valid; - nm_utils_iface_valid_name; - nm_utils_inet4_ntop; - nm_utils_inet6_ntop; - nm_utils_init; - nm_utils_ip4_addresses_from_gvalue; - nm_utils_ip4_addresses_to_gvalue; - nm_utils_ip4_get_default_prefix; - nm_utils_ip4_netmask_to_prefix; - nm_utils_ip4_prefix_to_netmask; - nm_utils_ip4_routes_from_gvalue; - nm_utils_ip4_routes_to_gvalue; - nm_utils_ip6_addresses_from_gvalue; - nm_utils_ip6_addresses_to_gvalue; - nm_utils_ip6_dns_from_gvalue; - nm_utils_ip6_dns_to_gvalue; - nm_utils_ip6_routes_from_gvalue; - nm_utils_ip6_routes_to_gvalue; - nm_utils_is_empty_ssid; - nm_utils_is_uuid; - nm_utils_rsa_key_encrypt; - nm_utils_rsa_key_encrypt_aes; - nm_utils_same_ssid; - nm_utils_security_type_get_type; - nm_utils_security_valid; - nm_utils_slist_free; - nm_utils_ssid_to_utf8; - nm_utils_uuid_generate; - nm_utils_uuid_generate_from_string; - nm_utils_wep_key_valid; - nm_utils_wifi_channel_to_freq; - nm_utils_wifi_find_next_channel; - nm_utils_wifi_freq_to_channel; - nm_utils_wifi_is_channel_valid; - nm_utils_wpa_psk_valid; - nm_vlan_flags_get_type; - nm_vlan_priority_map_get_type; - nm_wep_key_type_get_type; -local: - *; -}; diff --git a/libnm-util/meson.build b/libnm-util/meson.build deleted file mode 100644 index e561cb81ee..0000000000 --- a/libnm-util/meson.build +++ /dev/null @@ -1,217 +0,0 @@ -libnm_util_inc = include_directories('.') - -enums_headers = [version_header] + files( - 'nm-connection.h', - 'nm-setting-8021x.h', - 'nm-setting-adsl.h', - 'nm-setting-bluetooth.h', - 'nm-setting-bond.h', - 'nm-setting-bridge.h', - 'nm-setting-bridge-port.h', - 'nm-setting-cdma.h', - 'nm-setting-connection.h', - 'nm-setting-dcb.h', - 'nm-setting-generic.h', - 'nm-setting-gsm.h', - 'nm-setting.h', - 'nm-setting-infiniband.h', - 'nm-setting-ip4-config.h', - 'nm-setting-ip6-config.h', - 'nm-setting-olpc-mesh.h', - 'nm-setting-ppp.h', - 'nm-setting-pppoe.h', - 'nm-setting-serial.h', - 'nm-setting-team.h', - 'nm-setting-team-port.h', - 'nm-setting-vlan.h', - 'nm-setting-vpn.h', - 'nm-setting-wimax.h', - 'nm-setting-wired.h', - 'nm-setting-wireless.h', - 'nm-setting-wireless-security.h', - 'nm-utils.h', - 'nm-version.h', -) - -headers = enums_headers + files( - 'NetworkManager.h', - 'NetworkManagerVPN.h', -) - -install_headers( - headers, - subdir: nm_name, -) - -enum_types = 'nm-utils-enum-types' - -libnm_utils_enum = gnome.mkenums( - enum_types, - sources: enums_headers, - identifier_prefix: nm_id_prefix, - c_template: enum_types + '.c.template', - h_template: enum_types + '.h.template', - install_header: true, - install_dir: nm_pkgincludedir, -) - -sources = files( - 'crypto.c', - 'nm-connection.c', - 'nm-param-spec-specialized.c', - 'nm-setting-8021x.c', - 'nm-setting-adsl.c', - 'nm-setting-bluetooth.c', - 'nm-setting-bridge.c', - 'nm-setting-bridge-port.c', - 'nm-setting-bond.c', - 'nm-setting.c', - 'nm-setting-cdma.c', - 'nm-setting-connection.c', - 'nm-setting-dcb.c', - 'nm-setting-generic.c', - 'nm-setting-gsm.c', - 'nm-setting-infiniband.c', - 'nm-setting-ip4-config.c', - 'nm-setting-ip6-config.c', - 'nm-setting-olpc-mesh.c', - 'nm-setting-ppp.c', - 'nm-setting-pppoe.c', - 'nm-setting-serial.c', - 'nm-setting-team.c', - 'nm-setting-team-port.c', - 'nm-setting-wimax.c', - 'nm-setting-wired.c', - 'nm-setting-wireless.c', - 'nm-setting-wireless-security.c', - 'nm-setting-vlan.c', - 'nm-setting-vpn.c', - 'nm-utils.c', - 'nm-value-transforms.c', -) - -deps = [ - dbus_dep, - dbus_glib_dep, - shared_nm_glib_aux_dep, - uuid_dep, -] - -common_cflags = [ - '-DNETWORKMANAGER_COMPILATION=NM_NETWORKMANAGER_COMPILATION_LIBNM_UTIL', -] - -cflags = common_cflags + [ - '-DG_LOG_DOMAIN="@0@"'.format(libnm_util_name), -] - -if crypto_gnutls_dep.found() - libnm_util_crypto_gnutls = static_library( - 'nm-util-crypto-gnutls', - sources: [ 'crypto_gnutls.c' ], - dependencies: deps + [ crypto_gnutls_dep ], - c_args: cflags, - ) -endif - -if crypto_nss_dep.found() - libnm_util_crypto_nss = static_library( - 'nm-util-crypto-nss', - sources: [ 'crypto_nss.c' ], - dependencies: deps + [ crypto_nss_dep ], - c_args: cflags, - ) -endif - -if crypto == 'gnutls' - libnm_util_crypto = libnm_util_crypto_gnutls -elif crypto == 'nss' - libnm_util_crypto = libnm_util_crypto_nss -else - error('bug') -endif - -linker_script = join_paths(meson.current_source_dir(), 'libnm-util.ver') - -libnm_util = shared_library( - 'nm-util', - sources: sources + libnm_utils_enum, - version: libnm_util_version, - dependencies: deps, - c_args: cflags, - link_args: [ - '-Wl,--version-script,@0@'.format(linker_script), - ], - link_depends: linker_script, - link_with: libnm_util_crypto, - install: true, -) - -libnm_util_dep = declare_dependency( - sources: libnm_utils_enum[1], - include_directories: libnm_util_inc, - link_with: libnm_util, -) - -pkg.generate( - libraries: libnm_util, - version: nm_version, - name: libnm_util_name, - description: 'Convenience library for clients of NetworkManager', - filebase: libnm_util_name, - subdirs: nm_name, - requires: 'NetworkManager >= ' + nm_version + ' glib-2.0 dbus-glib-1', - variables: 'exec_prefix=${prefix}', -) - -if enable_introspection - gir_sources = sources + headers + libnm_utils_enum - - gir_includes = [ - 'DBusGLib-1.0', - 'GObject-2.0', - ] - - libnm_util_gir = gnome.generate_gir( - libnm_util, - sources: gir_sources, - nsversion: nm_gir_version, - namespace: nm_name, - identifier_prefix: nm_id_prefix, - symbol_prefix: nm_id_prefix.to_lower(), - export_packages: libnm_util_name, - includes: gir_includes, - install: true, - ) - - libnm_util_gir_dep = declare_dependency( - sources: libnm_util_gir, - link_with: libnm_util, - ) -endif - -test( - 'check-local-exports-' + libnm_util_name, - check_exports, - args: [libnm_util.full_path(), linker_script], -) - -sources = files( - 'crypto.c', -) - -deps = [ - shared_nm_glib_aux_dep, -] - -libtest_crypto = static_library( - 'test-crypto', - sources: sources, - dependencies: deps, - link_with: libnm_util_crypto, - c_args: cflags, -) - -if enable_tests - subdir('tests') -endif diff --git a/libnm-util/nm-connection.c b/libnm-util/nm-connection.c deleted file mode 100644 index 3ddea2d742..0000000000 --- a/libnm-util/nm-connection.c +++ /dev/null @@ -1,2212 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2013 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#include "nm-default.h" - -#include <dbus/dbus-glib.h> -#include <string.h> - -#include "nm-connection.h" -#include "nm-utils.h" -#include "nm-dbus-glib-types.h" -#include "nm-setting-private.h" - -#include "nm-setting-8021x.h" -#include "nm-setting-bluetooth.h" -#include "nm-setting-connection.h" -#include "nm-setting-infiniband.h" -#include "nm-setting-ip4-config.h" -#include "nm-setting-ip6-config.h" -#include "nm-setting-ppp.h" -#include "nm-setting-pppoe.h" -#include "nm-setting-wimax.h" -#include "nm-setting-wired.h" -#include "nm-setting-adsl.h" -#include "nm-setting-wireless.h" -#include "nm-setting-wireless-security.h" -#include "nm-setting-serial.h" -#include "nm-setting-vpn.h" -#include "nm-setting-olpc-mesh.h" -#include "nm-setting-bond.h" -#include "nm-setting-team.h" -#include "nm-setting-team-port.h" -#include "nm-setting-bridge.h" -#include "nm-setting-bridge-port.h" -#include "nm-setting-vlan.h" -#include "nm-setting-serial.h" -#include "nm-setting-gsm.h" -#include "nm-setting-cdma.h" - -/** - * SECTION:nm-connection - * @short_description: Describes a connection to specific network or provider - * @include: nm-connection.h - * - * An #NMConnection describes all the settings and configuration values that - * are necessary to configure network devices for operation on a specific - * network. Connections are the fundamental operating object for - * NetworkManager; no device is connected without a #NMConnection, or - * disconnected without having been connected with a #NMConnection. - * - * Each #NMConnection contains a list of #NMSetting objects usually referenced - * by name (using nm_connection_get_setting_by_name()) or by type (with - * nm_connection_get_setting()). The settings describe the actual parameters - * with which the network devices are configured, including device-specific - * parameters (MTU, SSID, APN, channel, rate, etc) and IP-level parameters - * (addresses, routes, addressing methods, etc). - * - */ - -/** - * nm_connection_error_quark: - * - * Registers an error quark for #NMConnection if necessary. - * - * Returns: the error quark used for #NMConnection errors. - **/ -GQuark -nm_connection_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-connection-error-quark"); - return quark; -} - -typedef struct { - GHashTable *settings; - - /* D-Bus path of the connection, if any */ - char *path; -} NMConnectionPrivate; - -#define NM_CONNECTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_CONNECTION, NMConnectionPrivate)) - -G_DEFINE_TYPE (NMConnection, nm_connection, G_TYPE_OBJECT) - -enum { - PROP_0, - PROP_PATH, - - LAST_PROP -}; - -enum { - SECRETS_UPDATED, - SECRETS_CLEARED, - CHANGED, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - -static NMSettingVerifyResult _nm_connection_verify (NMConnection *connection, GError **error); - -/*****************************************************************************/ - -/** - * nm_connection_lookup_setting_type: - * @name: a setting name - * - * Returns the #GType of the setting's class for a given setting name. - * - * Returns: the #GType of the setting's class - **/ -GType -nm_connection_lookup_setting_type (const char *name) -{ - return _nm_setting_lookup_setting_type (name); -} - -/** - * nm_connection_lookup_setting_type_by_quark: - * @error_quark: a setting error quark - * - * Returns the #GType of the setting's class for a given setting error quark. - * Useful for figuring out which setting a returned error is for. - * - * Returns: the #GType of the setting's class - **/ -GType -nm_connection_lookup_setting_type_by_quark (GQuark error_quark) -{ - return _nm_setting_lookup_setting_type_by_quark (error_quark); -} - -/** - * nm_connection_create_setting: - * @name: a setting name - * - * Create a new #NMSetting object of the desired type, given a setting name. - * - * Returns: (transfer full): the new setting object, or %NULL if the setting name was unknown - **/ -NMSetting * -nm_connection_create_setting (const char *name) -{ - GType type; - NMSetting *setting = NULL; - - g_return_val_if_fail (name != NULL, NULL); - - type = nm_connection_lookup_setting_type (name); - if (type) - setting = (NMSetting *) g_object_new (type, NULL); - - return setting; -} - -static void -setting_changed_cb (NMSetting *setting, - GParamSpec *pspec, - NMConnection *self) -{ - g_signal_emit (self, signals[CHANGED], 0); -} - -static gboolean -_setting_release (gpointer key, gpointer value, gpointer user_data) -{ - g_signal_handlers_disconnect_by_func (user_data, setting_changed_cb, value); - return TRUE; -} - -static void -_nm_connection_add_setting (NMConnection *connection, NMSetting *setting) -{ - NMConnectionPrivate *priv = NM_CONNECTION_GET_PRIVATE (connection); - const char *name = G_OBJECT_TYPE_NAME (setting); - NMSetting *s_old; - - if ((s_old = g_hash_table_lookup (priv->settings, (gpointer) name))) - g_signal_handlers_disconnect_by_func (s_old, setting_changed_cb, connection); - g_hash_table_insert (priv->settings, (gpointer) name, setting); - /* Listen for property changes so we can emit the 'changed' signal */ - g_signal_connect (setting, "notify", (GCallback) setting_changed_cb, connection); -} - -/** - * nm_connection_add_setting: - * @connection: a #NMConnection - * @setting: (transfer full): the #NMSetting to add to the connection object - * - * Adds a #NMSetting to the connection, replacing any previous #NMSetting of the - * same name which has previously been added to the #NMConnection. The - * connection takes ownership of the #NMSetting object and does not increase - * the setting object's reference count. - **/ -void -nm_connection_add_setting (NMConnection *connection, NMSetting *setting) -{ - g_return_if_fail (NM_IS_CONNECTION (connection)); - g_return_if_fail (NM_IS_SETTING (setting)); - - _nm_connection_add_setting (connection, setting); - g_signal_emit (connection, signals[CHANGED], 0); -} - -/** - * nm_connection_remove_setting: - * @connection: a #NMConnection - * @setting_type: the #GType of the setting object to remove - * - * Removes the #NMSetting with the given #GType from the #NMConnection. This - * operation dereferences the #NMSetting object. - **/ -void -nm_connection_remove_setting (NMConnection *connection, GType setting_type) -{ - NMConnectionPrivate *priv; - NMSetting *setting; - const char *setting_name; - - g_return_if_fail (NM_IS_CONNECTION (connection)); - g_return_if_fail (g_type_is_a (setting_type, NM_TYPE_SETTING)); - - priv = NM_CONNECTION_GET_PRIVATE (connection); - setting_name = g_type_name (setting_type); - setting = g_hash_table_lookup (priv->settings, setting_name); - if (setting) { - g_signal_handlers_disconnect_by_func (setting, setting_changed_cb, connection); - g_hash_table_remove (priv->settings, setting_name); - g_signal_emit (connection, signals[CHANGED], 0); - } -} - -/** - * nm_connection_get_setting: - * @connection: a #NMConnection - * @setting_type: the #GType of the setting object to return - * - * Gets the #NMSetting with the given #GType, if one has been previously added - * to the #NMConnection. - * - * Returns: (transfer none): the #NMSetting, or %NULL if no setting of that type was previously - * added to the #NMConnection - **/ -NMSetting * -nm_connection_get_setting (NMConnection *connection, GType setting_type) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - g_return_val_if_fail (g_type_is_a (setting_type, NM_TYPE_SETTING), NULL); - - return (NMSetting *) g_hash_table_lookup (NM_CONNECTION_GET_PRIVATE (connection)->settings, - g_type_name (setting_type)); -} - -/** - * nm_connection_get_setting_by_name: - * @connection: a #NMConnection - * @name: a setting name - * - * Gets the #NMSetting with the given name, if one has been previously added - * the #NMConnection. - * - * Returns: (transfer none): the #NMSetting, or %NULL if no setting with that name was previously - * added to the #NMConnection - **/ -NMSetting * -nm_connection_get_setting_by_name (NMConnection *connection, const char *name) -{ - GType type; - - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - g_return_val_if_fail (name != NULL, NULL); - - type = nm_connection_lookup_setting_type (name); - - return type ? nm_connection_get_setting (connection, type) : NULL; -} - -static gboolean -validate_permissions_type (GHashTable *hash, GError **error) -{ - GHashTable *s_con; - GValue *permissions; - - /* Ensure the connection::permissions item (if present) is the correct - * type, otherwise the g_object_set() will throw a warning and ignore the - * error, leaving us with no permissions. - */ - s_con = g_hash_table_lookup (hash, NM_SETTING_CONNECTION_SETTING_NAME); - if (s_con) { - permissions = g_hash_table_lookup (s_con, NM_SETTING_CONNECTION_PERMISSIONS); - if (permissions) { - if ( !G_VALUE_HOLDS (permissions, G_TYPE_STRV) - && !G_VALUE_HOLDS (permissions, DBUS_TYPE_G_LIST_OF_STRING)) { - g_set_error_literal (error, - NM_SETTING_ERROR, - NM_SETTING_ERROR_PROPERTY_TYPE_MISMATCH, - "Wrong permissions property type; should be a list of strings."); - return FALSE; - } - } - } - return TRUE; -} - -/** - * _nm_connection_replace_settings: - * @connection: a #NMConnection - * @new_settings: (element-type utf8 GLib.HashTable): a #GHashTable of settings - **/ -void -_nm_connection_replace_settings (NMConnection *connection, - GHashTable *new_settings) -{ - NMConnectionPrivate *priv = NM_CONNECTION_GET_PRIVATE (connection); - GHashTableIter iter; - const char *setting_name; - GHashTable *setting_hash; - gboolean changed; - - g_return_if_fail (NM_IS_CONNECTION (connection)); - g_return_if_fail (new_settings != NULL); - - priv = NM_CONNECTION_GET_PRIVATE (connection); - - if ((changed = g_hash_table_size (priv->settings) > 0)) - g_hash_table_foreach_remove (priv->settings, _setting_release, connection); - - g_hash_table_iter_init (&iter, new_settings); - while (g_hash_table_iter_next (&iter, (gpointer) &setting_name, (gpointer) &setting_hash)) { - GType type = nm_connection_lookup_setting_type (setting_name); - - if (type) { - NMSetting *setting = nm_setting_new_from_hash (type, setting_hash); - - if (setting) { - _nm_connection_add_setting (connection, setting); - changed = TRUE; - } - } - } - - if (changed) - g_signal_emit (connection, signals[CHANGED], 0); -} - -/** - * nm_connection_replace_settings: - * @connection: a #NMConnection - * @new_settings: (element-type utf8 GLib.HashTable): a #GHashTable of settings - * @error: location to store error, or %NULL - * - * Returns: %TRUE if the settings were valid and added to the connection, %FALSE - * if they were not - **/ -gboolean -nm_connection_replace_settings (NMConnection *connection, - GHashTable *new_settings, - GError **error) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), FALSE); - g_return_val_if_fail (new_settings != NULL, FALSE); - g_return_val_if_fail (!error || !*error, FALSE); - - if (!validate_permissions_type (new_settings, error)) - return FALSE; - - _nm_connection_replace_settings (connection, new_settings); - return nm_connection_verify (connection, error); -} - -/** - * nm_connection_replace_settings_from_connection: - * @connection: a #NMConnection - * @new_connection: a #NMConnection to replace the settings of @connection with - * @error: location to store error, or %NULL - * - * Deep-copies the settings of @new_conenction and replaces the settings of @connection - * with the copied settings. - * - * Returns: %TRUE if the settings were valid after replacing the connection, %FALSE - * if they were not. Regardless of whether %TRUE or %FALSE is returned, the connection - * is successfully replaced. %FALSE only means, that the connection does not verify - * at the end of the operation. - * - * Since: 0.9.10 - **/ -gboolean -nm_connection_replace_settings_from_connection (NMConnection *connection, - NMConnection *new_connection, - GError **error) -{ - NMConnectionPrivate *priv; - GHashTableIter iter; - NMSetting *setting; - gboolean changed = FALSE; - gboolean valid; - - g_return_val_if_fail (NM_IS_CONNECTION (connection), FALSE); - g_return_val_if_fail (NM_IS_CONNECTION (new_connection), FALSE); - g_return_val_if_fail (!error || !*error, FALSE); - - /* When 'connection' and 'new_connection' are the same object simply return - * in order not to destroy 'connection' */ - if (connection == new_connection) - goto out; - - /* No need to validate permissions like nm_connection_replace_settings() - * since we're dealing with an NMConnection which has already done that. - */ - - priv = NM_CONNECTION_GET_PRIVATE (connection); - if ((changed = g_hash_table_size (priv->settings) > 0)) - g_hash_table_foreach_remove (priv->settings, _setting_release, connection); - - if (g_hash_table_size (NM_CONNECTION_GET_PRIVATE (new_connection)->settings)) { - g_hash_table_iter_init (&iter, NM_CONNECTION_GET_PRIVATE (new_connection)->settings); - while (g_hash_table_iter_next (&iter, NULL, (gpointer) &setting)) - _nm_connection_add_setting (connection, nm_setting_duplicate (setting)); - changed = TRUE; - } - -out: - valid = nm_connection_verify (connection, error); - if (changed) - g_signal_emit (connection, signals[CHANGED], 0); - return valid; -} - -/** - * nm_connection_compare: - * @a: a #NMConnection - * @b: a second #NMConnection to compare with the first - * @flags: compare flags, e.g. %NM_SETTING_COMPARE_FLAG_EXACT - * - * Compares two #NMConnection objects for similarity, with comparison behavior - * modified by a set of flags. See nm_setting_compare() for a description of - * each flag's behavior. - * - * Returns: %TRUE if the comparison succeeds, %FALSE if it does not - **/ -gboolean -nm_connection_compare (NMConnection *a, - NMConnection *b, - NMSettingCompareFlags flags) -{ - GHashTableIter iter; - NMSetting *src; - - if (a == b) - return TRUE; - if (!a || !b) - return FALSE; - - /* B / A: ensure settings in B that are not in A make the comparison fail */ - if (g_hash_table_size (NM_CONNECTION_GET_PRIVATE (a)->settings) != - g_hash_table_size (NM_CONNECTION_GET_PRIVATE (b)->settings)) - return FALSE; - - /* A / B: ensure all settings in A match corresponding ones in B */ - g_hash_table_iter_init (&iter, NM_CONNECTION_GET_PRIVATE (a)->settings); - while (g_hash_table_iter_next (&iter, NULL, (gpointer) &src)) { - NMSetting *cmp = nm_connection_get_setting (b, G_OBJECT_TYPE (src)); - - if (!cmp || !nm_setting_compare (src, cmp, flags)) - return FALSE; - } - - return TRUE; -} - -static void -diff_one_connection (NMConnection *a, - NMConnection *b, - NMSettingCompareFlags flags, - gboolean invert_results, - GHashTable *diffs) -{ - NMConnectionPrivate *priv = NM_CONNECTION_GET_PRIVATE (a); - GHashTableIter iter; - NMSetting *a_setting = NULL; - - g_hash_table_iter_init (&iter, priv->settings); - while (g_hash_table_iter_next (&iter, NULL, (gpointer) &a_setting)) { - NMSetting *b_setting = NULL; - const char *setting_name = nm_setting_get_name (a_setting); - GHashTable *results; - gboolean new_results = TRUE; - - if (b) - b_setting = nm_connection_get_setting (b, G_OBJECT_TYPE (a_setting)); - - results = g_hash_table_lookup (diffs, setting_name); - if (results) - new_results = FALSE; - - if (!nm_setting_diff (a_setting, b_setting, flags, invert_results, &results)) { - if (new_results) - g_hash_table_insert (diffs, g_strdup (setting_name), results); - } - } -} - -/** - * nm_connection_diff: - * @a: a #NMConnection - * @b: a second #NMConnection to compare with the first - * @flags: compare flags, e.g. %NM_SETTING_COMPARE_FLAG_EXACT - * @out_settings: (element-type utf8 GLib.HashTable): if the - * connections differ, on return a hash table mapping setting names to - * second-level GHashTable (utf8 to guint32), which contains the key names that - * differ mapped to one or more of %NMSettingDiffResult as a bitfield - * - * Compares two #NMConnection objects for similarity, with comparison behavior - * modified by a set of flags. See nm_setting_compare() for a description of - * each flag's behavior. If the connections differ, settings and keys within - * each setting that differ are added to the returned @out_settings hash table. - * No values are returned, only key names. - * - * Returns: %TRUE if the connections contain the same values, %FALSE if they do - * not - **/ -gboolean -nm_connection_diff (NMConnection *a, - NMConnection *b, - NMSettingCompareFlags flags, - GHashTable **out_settings) -{ - GHashTable *diffs; - - g_return_val_if_fail (NM_IS_CONNECTION (a), FALSE); - g_return_val_if_fail (out_settings != NULL, FALSE); - g_return_val_if_fail (*out_settings == NULL, FALSE); - if (b) - g_return_val_if_fail (NM_IS_CONNECTION (b), FALSE); - - if (a == b) - return TRUE; - - diffs = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_hash_table_destroy); - - /* Diff A to B, then B to A to capture keys in B that aren't in A */ - diff_one_connection (a, b, flags, FALSE, diffs); - if (b) - diff_one_connection (b, a, flags, TRUE, diffs); - - if (g_hash_table_size (diffs) == 0) - g_hash_table_destroy (diffs); - else - *out_settings = diffs; - - return *out_settings ? FALSE : TRUE; -} - -static gboolean -_normalize_virtual_iface_name (NMConnection *self) -{ - NMConnectionPrivate *priv = NM_CONNECTION_GET_PRIVATE (self); - GHashTableIter h_iter; - NMSetting *setting; - NMSettingConnection *s_con; - const char *interface_name; - char *virtual_iface_name = NULL; - gboolean was_modified = FALSE; - const char *prop_name = NULL; - - /* search for settings that might need normalization of the interface name. */ - g_hash_table_iter_init (&h_iter, priv->settings); - while ( !prop_name - && g_hash_table_iter_next (&h_iter, NULL, (void **) &setting)) { - if (NM_IS_SETTING_BOND (setting)) - prop_name = NM_SETTING_BOND_INTERFACE_NAME; - else if (NM_IS_SETTING_BRIDGE (setting)) - prop_name = NM_SETTING_BRIDGE_INTERFACE_NAME; - else if (NM_IS_SETTING_TEAM (setting)) - prop_name = NM_SETTING_TEAM_INTERFACE_NAME; - else if (NM_IS_SETTING_VLAN (setting)) - prop_name = NM_SETTING_VLAN_INTERFACE_NAME; - } - if (!prop_name) - return FALSE; - - s_con = nm_connection_get_setting_connection (self); - g_return_val_if_fail (s_con, FALSE); - - interface_name = nm_setting_connection_get_interface_name (s_con); - - /* read the potential virtual_iface_name from the setting. */ - g_object_get (setting, prop_name, &virtual_iface_name, NULL); - - if (g_strcmp0 (interface_name, virtual_iface_name) != 0) { - if (interface_name) { - /* interface_name is set and overwrites the virtual_iface_name. */ - g_object_set (setting, prop_name, interface_name, NULL); - } else { - /* interface in NMSettingConnection must be set. */ - g_object_set (s_con, NM_SETTING_CONNECTION_INTERFACE_NAME, virtual_iface_name, NULL); - } - was_modified = TRUE; - } - - g_free (virtual_iface_name); - - return was_modified; -} - -static gboolean -_normalize_ip_config (NMConnection *self, GHashTable *parameters) -{ - NMSettingConnection *s_con = nm_connection_get_setting_connection (self); - const char *default_ip4_method = NM_SETTING_IP4_CONFIG_METHOD_AUTO; - const char *default_ip6_method = NULL; - NMSettingIP4Config *s_ip4; - NMSettingIP6Config *s_ip6; - NMSetting *setting; - - if (parameters) - default_ip6_method = g_hash_table_lookup (parameters, NM_CONNECTION_NORMALIZE_PARAM_IP6_CONFIG_METHOD); - if (!default_ip6_method) - default_ip6_method = NM_SETTING_IP6_CONFIG_METHOD_AUTO; - - s_ip4 = nm_connection_get_setting_ip4_config (self); - s_ip6 = nm_connection_get_setting_ip6_config (self); - - if (nm_setting_connection_get_master (s_con)) { - /* Slave connections don't have IP configuration. */ - - if (s_ip4) - nm_connection_remove_setting (self, NM_TYPE_SETTING_IP4_CONFIG); - - if (s_ip6) - nm_connection_remove_setting (self, NM_TYPE_SETTING_IP6_CONFIG); - - return s_ip4 || s_ip6; - } else { - /* Ensure all non-slave connections have IP4 and IP6 settings objects. If no - * IP6 setting was specified, then assume that means IP6 config is allowed - * to fail. But if no IP4 setting was specified, assume the caller was just - * being lazy. - */ - if (!s_ip4) { - setting = nm_setting_ip4_config_new (); - - g_object_set (setting, - NM_SETTING_IP4_CONFIG_METHOD, default_ip4_method, - NULL); - nm_connection_add_setting (self, setting); - } - if (!s_ip6) { - setting = nm_setting_ip6_config_new (); - - g_object_set (setting, - NM_SETTING_IP6_CONFIG_METHOD, default_ip6_method, - NM_SETTING_IP6_CONFIG_MAY_FAIL, TRUE, - NULL); - nm_connection_add_setting (self, setting); - } - return !s_ip4 || !s_ip6; - } -} - -/** - * nm_connection_verify: - * @connection: the #NMConnection to verify - * @error: location to store error, or %NULL - * - * Validates the connection and all its settings. Each setting's properties - * have allowed values, and some values are dependent on other values. For - * example, if a Wi-Fi connection is security enabled, the #NMSettingWireless - * setting object's 'security' property must contain the setting name of the - * #NMSettingWirelessSecurity object, which must also be present in the - * connection for the connection to be valid. As another example, the - * #NMSettingWired object's 'mac-address' property must be a validly formatted - * MAC address. The returned #GError contains information about which - * setting and which property failed validation, and how it failed validation. - * - * Returns: %TRUE if the connection is valid, %FALSE if it is not - **/ -gboolean -nm_connection_verify (NMConnection *connection, GError **error) -{ - NMSettingVerifyResult result; - - result = _nm_connection_verify (connection, error); - - /* we treat normalizable connections as valid. */ - if (result == NM_SETTING_VERIFY_NORMALIZABLE) - g_clear_error (error); - - return result == NM_SETTING_VERIFY_SUCCESS || result == NM_SETTING_VERIFY_NORMALIZABLE; -} - -static NMSettingVerifyResult -_nm_connection_verify (NMConnection *connection, GError **error) -{ - NMConnectionPrivate *priv; - NMSettingConnection *s_con; - NMSettingIP4Config *s_ip4; - NMSettingIP6Config *s_ip6; - GHashTableIter iter; - gpointer value; - GSList *all_settings = NULL, *setting_i; - NMSettingVerifyResult success = NM_SETTING_VERIFY_ERROR; - NMSetting *base; - const char *ctype; - GError *normalizable_error = NULL; - NMSettingVerifyResult normalizable_error_type = NM_SETTING_VERIFY_SUCCESS; - - if (error) - g_return_val_if_fail (*error == NULL, NM_SETTING_VERIFY_ERROR); - - if (!NM_IS_CONNECTION (connection)) { - g_set_error_literal (error, - NM_SETTING_CONNECTION_ERROR, - NM_SETTING_CONNECTION_ERROR_UNKNOWN, - "invalid connection; failed verification"); - g_return_val_if_fail (NM_IS_CONNECTION (connection), NM_SETTING_VERIFY_ERROR); - } - - priv = NM_CONNECTION_GET_PRIVATE (connection); - - /* First, make sure there's at least 'connection' setting */ - s_con = nm_connection_get_setting_connection (connection); - if (!s_con) { - g_set_error_literal (error, - NM_CONNECTION_ERROR, - NM_CONNECTION_ERROR_CONNECTION_SETTING_NOT_FOUND, - "connection setting not found"); - goto EXIT; - } - - /* Build up the list of settings */ - g_hash_table_iter_init (&iter, priv->settings); - while (g_hash_table_iter_next (&iter, NULL, &value)) { - /* Order NMSettingConnection so that it will be verified first. - * The reason is, that NMSettingConnection:verify() modifies the connection - * by setting NMSettingConnection:interface_name. So we want to call that - * verify() first, because the order can affect the outcome. - * Another reason is, that errors in this setting might be more fundamental - * and should be checked and reported with higher priority. - * Another reason is, that some settings look especially at the - * NMSettingConnection, so they find it first in the all_settings list. */ - if (value == s_con) - all_settings = g_slist_append (all_settings, value); - else - all_settings = g_slist_prepend (all_settings, value); - } - all_settings = g_slist_reverse (all_settings); - - /* Now, run the verify function of each setting */ - for (setting_i = all_settings; setting_i; setting_i = setting_i->next) { - GError *verify_error = NULL; - NMSettingVerifyResult verify_result; - - /* verify all settings. We stop if we find the first non-normalizable - * @NM_SETTING_VERIFY_ERROR. If we find normalizable errors we continue - * but remember the error to return it to the user. - * @NM_SETTING_VERIFY_NORMALIZABLE_ERROR has a higher priority then - * @NM_SETTING_VERIFY_NORMALIZABLE, so, if we encounter such an error type, - * we remember it instead (to return it as output). - **/ - verify_result = _nm_setting_verify (NM_SETTING (setting_i->data), all_settings, &verify_error); - if (verify_result == NM_SETTING_VERIFY_NORMALIZABLE || - verify_result == NM_SETTING_VERIFY_NORMALIZABLE_ERROR) { - if ( verify_result == NM_SETTING_VERIFY_NORMALIZABLE_ERROR - && normalizable_error_type == NM_SETTING_VERIFY_NORMALIZABLE) { - /* NORMALIZABLE_ERROR has higher priority. */ - g_clear_error (&normalizable_error); - } - if (!normalizable_error) { - g_propagate_error (&normalizable_error, verify_error); - verify_error = NULL; - normalizable_error_type = verify_result; - } - } else if (verify_result != NM_SETTING_VERIFY_SUCCESS) { - g_propagate_error (error, verify_error); - g_slist_free (all_settings); - g_return_val_if_fail (verify_result == NM_SETTING_VERIFY_ERROR, success); - goto EXIT; - } - g_clear_error (&verify_error); - } - g_slist_free (all_settings); - - /* Now make sure the given 'type' setting can actually be the base setting - * of the connection. Can't have type=ppp for example. - */ - ctype = nm_setting_connection_get_connection_type (s_con); - if (!ctype) { - g_set_error_literal (error, - NM_CONNECTION_ERROR, - NM_CONNECTION_ERROR_CONNECTION_TYPE_INVALID, - "connection type missing"); - goto EXIT; - } - - base = nm_connection_get_setting_by_name (connection, ctype); - if (!base) { - g_set_error_literal (error, - NM_CONNECTION_ERROR, - NM_CONNECTION_ERROR_CONNECTION_TYPE_INVALID, - "base setting GType not found"); - goto EXIT; - } - - if (!_nm_setting_is_base_type (base)) { - g_set_error (error, - NM_CONNECTION_ERROR, - NM_CONNECTION_ERROR_CONNECTION_TYPE_INVALID, - "connection type '%s' is not a base type", - ctype); - goto EXIT; - } - - s_ip4 = nm_connection_get_setting_ip4_config (connection); - s_ip6 = nm_connection_get_setting_ip6_config (connection); - - if (nm_setting_connection_get_master (s_con)) { - if ((normalizable_error_type == NM_SETTING_VERIFY_SUCCESS || - (normalizable_error_type == NM_SETTING_VERIFY_NORMALIZABLE)) && (s_ip4 || s_ip6)) { - g_clear_error (&normalizable_error); - g_set_error (&normalizable_error, - NM_CONNECTION_ERROR, - NM_CONNECTION_ERROR_INVALID_SETTING, - "slave connection cannot have an IP%c setting", - s_ip4 ? '4' : '6'); - /* having a slave with IP config *was* and is a verify() error. */ - normalizable_error_type = NM_SETTING_VERIFY_NORMALIZABLE_ERROR; - } - } else { - if (normalizable_error_type == NM_SETTING_VERIFY_SUCCESS && (!s_ip4 || !s_ip6)) { - g_set_error (&normalizable_error, - NM_CONNECTION_ERROR, - NM_CONNECTION_ERROR_SETTING_NOT_FOUND, - "connection needs an IP%c setting", - !s_ip4 ? '4' : '6'); - /* having a master without IP config was not a verify() error, accept - * it for backward compatibility. */ - normalizable_error_type = NM_SETTING_VERIFY_NORMALIZABLE; - } - } - - if (normalizable_error_type != NM_SETTING_VERIFY_SUCCESS) { - g_propagate_error (error, normalizable_error); - normalizable_error = NULL; - success = normalizable_error_type; - } else - success = NM_SETTING_VERIFY_SUCCESS; - -EXIT: - g_clear_error (&normalizable_error); - return success; -} - -/** - * nm_connection_normalize: - * @connection: the #NMConnection to normalize - * @parameters: (allow-none) (element-type utf8 gpointer): a #GHashTable with - * normalization parameters to allow customization of the normalization by providing - * specific arguments. Unknown arguments will be ignored and the default will be - * used. The keys must be strings, hashed by g_str_hash() and g_str_equal() functions. - * The values are opaque and depend on the parameter name. - * @modified: (out) (allow-none): outputs whether any settings were modified. - * @error: location to store error, or %NULL. Contains the reason, - * why the connection is invalid, if the function returns an error. - * - * Does some basic normalization and fixup of well known inconsistencies - * and deprecated fields. If the connection was modified in any way, - * the output parameter @modified is set %TRUE. - * - * Finally the connection will be verified and %TRUE returns if the connection - * is valid. As this function only performs some specific normalization steps - * it cannot repair all connections. If the connection has errors that - * cannot be normalized, the connection will not be modified. - * - * Returns: %TRUE if the connection is valid, %FALSE if it is not - * - * Since: 1.0 - **/ -gboolean -nm_connection_normalize (NMConnection *connection, - GHashTable *parameters, - gboolean *modified, - GError **error) -{ - NMSettingVerifyResult success; - gboolean was_modified = FALSE; - GError *normalizable_error = NULL; - - success = _nm_connection_verify (connection, &normalizable_error); - - if (success == NM_SETTING_VERIFY_ERROR || - success == NM_SETTING_VERIFY_SUCCESS) { - if (normalizable_error) - g_propagate_error (error, normalizable_error); - goto EXIT; - } - g_assert (success == NM_SETTING_VERIFY_NORMALIZABLE || success == NM_SETTING_VERIFY_NORMALIZABLE_ERROR); - g_clear_error (&normalizable_error); - - /* Try to perform all kind of normalizations on the settings to fix it. - * We only do this, after verifying that the connection contains no un-normalizable - * errors, because in that case we rather fail without touching the settings. */ - - was_modified |= _normalize_virtual_iface_name (connection); - was_modified |= _normalize_ip_config (connection, parameters); - - /* Verify anew. */ - success = _nm_connection_verify (connection, error); - - /* we would expect, that after normalization, the connection can be verified. */ - g_return_val_if_fail (success == NM_SETTING_VERIFY_SUCCESS, success); - - /* we would expect, that the connection was modified during normalization. */ - g_return_val_if_fail (was_modified, success); - -EXIT: - if (modified) - *modified = was_modified; - - return success == NM_SETTING_VERIFY_SUCCESS; -} - -/** - * nm_connection_update_secrets: - * @connection: the #NMConnection - * @setting_name: the setting object name to which the secrets apply - * @secrets: (element-type utf8 GObject.Value): a #GHashTable mapping - * string:#GValue of setting property names and secrets of the given @setting_name - * @error: location to store error, or %NULL - * - * Update the specified setting's secrets, given a hash table of secrets - * intended for that setting (deserialized from D-Bus for example). Will also - * extract the given setting's secrets hash if given a hash of hashes, as would - * be returned from nm_connection_to_hash(). If @setting_name is %NULL, expects - * a fully serialized #NMConnection as returned by nm_connection_to_hash() and - * will update all secrets from all settings contained in @secrets. - * - * Returns: %TRUE if the secrets were successfully updated, %FALSE if the update - * failed (tried to update secrets for a setting that doesn't exist, etc) - **/ -gboolean -nm_connection_update_secrets (NMConnection *connection, - const char *setting_name, - GHashTable *secrets, - GError **error) -{ - NMSetting *setting; - gboolean success = TRUE, updated = FALSE; - GHashTable *setting_hash = NULL; - GHashTableIter iter; - const char *key; - gboolean hashed_connection = FALSE; - int success_detail; - - g_return_val_if_fail (NM_IS_CONNECTION (connection), FALSE); - g_return_val_if_fail (secrets != NULL, FALSE); - if (error) - g_return_val_if_fail (*error == NULL, FALSE); - - /* Empty @secrets means success */ - if (g_hash_table_size (secrets) == 0) - return TRUE; - - /* For backwards compatibility, this function accepts either a hashed - * connection (GHashTable of GHashTables of GValues) or a single hashed - * setting (GHashTable of GValues). - */ - g_hash_table_iter_init (&iter, secrets); - while (g_hash_table_iter_next (&iter, (gpointer) &key, NULL)) { - if (_nm_setting_lookup_setting_type (key) != G_TYPE_INVALID) { - /* @secrets looks like a hashed connection */ - hashed_connection = TRUE; - break; - } - } - - if (setting_name) { - /* Update just one setting's secrets */ - setting = nm_connection_get_setting_by_name (connection, setting_name); - if (!setting) { - g_set_error_literal (error, - NM_CONNECTION_ERROR, - NM_CONNECTION_ERROR_SETTING_NOT_FOUND, - setting_name); - return FALSE; - } - - if (hashed_connection) { - setting_hash = g_hash_table_lookup (secrets, setting_name); - if (!setting_hash) { - /* The hashed connection that didn't contain any secrets for - * @setting_name; just return success. - */ - return TRUE; - } - } - - g_signal_handlers_block_by_func (setting, (GCallback) setting_changed_cb, connection); - success_detail = _nm_setting_update_secrets (setting, - setting_hash ?: secrets, - error); - g_signal_handlers_unblock_by_func (setting, (GCallback) setting_changed_cb, connection); - - if (success_detail == NM_SETTING_UPDATE_SECRET_ERROR) - return FALSE; - if (success_detail == NM_SETTING_UPDATE_SECRET_SUCCESS_MODIFIED) - updated = TRUE; - } else { - if (!hashed_connection) { - g_set_error_literal (error, - NM_CONNECTION_ERROR, - NM_CONNECTION_ERROR_SETTING_NOT_FOUND, - key); - return FALSE; - } - - /* check first, whether all the settings exist... */ - g_hash_table_iter_init (&iter, secrets); - while (g_hash_table_iter_next (&iter, (gpointer) &key, NULL)) { - setting = nm_connection_get_setting_by_name (connection, key); - if (!setting) { - g_set_error_literal (error, - NM_CONNECTION_ERROR, - NM_CONNECTION_ERROR_SETTING_NOT_FOUND, - key); - return FALSE; - } - } - - /* Update each setting with any secrets from the hashed connection */ - g_hash_table_iter_init (&iter, secrets); - while (g_hash_table_iter_next (&iter, (gpointer) &key, (gpointer) &setting_hash)) { - /* Update the secrets for this setting */ - setting = nm_connection_get_setting_by_name (connection, key); - - g_signal_handlers_block_by_func (setting, (GCallback) setting_changed_cb, connection); - success_detail = _nm_setting_update_secrets (setting, setting_hash, error); - g_signal_handlers_unblock_by_func (setting, (GCallback) setting_changed_cb, connection); - - if (success_detail == NM_SETTING_UPDATE_SECRET_ERROR) { - success = FALSE; - break; - } - if (success_detail == NM_SETTING_UPDATE_SECRET_SUCCESS_MODIFIED) - updated = TRUE; - } - } - - if (updated) { - g_signal_emit (connection, signals[SECRETS_UPDATED], 0, setting_name); - g_signal_emit (connection, signals[CHANGED], 0); - } - - return success; -} - -/** - * nm_connection_need_secrets: - * @connection: the #NMConnection - * @hints: (out) (element-type utf8) (allow-none) (transfer container): - * the address of a pointer to a #GPtrArray, initialized to %NULL, which on - * return points to an allocated #GPtrArray containing the property names of - * secrets of the #NMSetting which may be required; the caller owns the array - * and must free the array itself with g_ptr_array_free(), but not free its - * elements - * - * Returns the name of the first setting object in the connection which would - * need secrets to make a successful connection. The returned hints are only - * intended as a guide to what secrets may be required, because in some - * circumstances, there is no way to conclusively determine exactly which - * secrets are needed. - * - * Returns: the setting name of the #NMSetting object which has invalid or - * missing secrets - **/ -const char * -nm_connection_need_secrets (NMConnection *connection, - GPtrArray **hints) -{ - NMConnectionPrivate *priv; - GHashTableIter hiter; - GSList *settings = NULL; - GSList *iter; - const char *name = NULL; - NMSetting *setting; - - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - if (hints) - g_return_val_if_fail (*hints == NULL, NULL); - - priv = NM_CONNECTION_GET_PRIVATE (connection); - - /* Get list of settings in priority order */ - g_hash_table_iter_init (&hiter, priv->settings); - while (g_hash_table_iter_next (&hiter, NULL, (gpointer) &setting)) - settings = g_slist_insert_sorted (settings, setting, _nm_setting_compare_priority); - - for (iter = settings; iter; iter = g_slist_next (iter)) { - GPtrArray *secrets; - - setting = NM_SETTING (iter->data); - secrets = nm_setting_need_secrets (setting); - if (secrets) { - if (hints) - *hints = secrets; - else - g_ptr_array_free (secrets, TRUE); - - name = nm_setting_get_name (setting); - break; - } - } - - g_slist_free (settings); - return name; -} - -/** - * nm_connection_clear_secrets: - * @connection: the #NMConnection - * - * Clears and frees any secrets that may be stored in the connection, to avoid - * keeping secret data in memory when not needed. - **/ -void -nm_connection_clear_secrets (NMConnection *connection) -{ - GHashTableIter iter; - NMSetting *setting; - gboolean changed = FALSE; - - g_return_if_fail (NM_IS_CONNECTION (connection)); - - g_hash_table_iter_init (&iter, NM_CONNECTION_GET_PRIVATE (connection)->settings); - while (g_hash_table_iter_next (&iter, NULL, (gpointer) &setting)) { - g_signal_handlers_block_by_func (setting, (GCallback) setting_changed_cb, connection); - changed |= _nm_setting_clear_secrets (setting); - g_signal_handlers_unblock_by_func (setting, (GCallback) setting_changed_cb, connection); - } - - g_signal_emit (connection, signals[SECRETS_CLEARED], 0); - if (changed) - g_signal_emit (connection, signals[CHANGED], 0); -} - -/** - * nm_connection_clear_secrets_with_flags: - * @connection: the #NMConnection - * @func: (scope call): function to be called to determine whether a - * specific secret should be cleared or not - * @user_data: caller-supplied data passed to @func - * - * Clears and frees secrets determined by @func. - **/ -void -nm_connection_clear_secrets_with_flags (NMConnection *connection, - NMSettingClearSecretsWithFlagsFn func, - gpointer user_data) -{ - GHashTableIter iter; - NMSetting *setting; - gboolean changed = FALSE; - - g_return_if_fail (NM_IS_CONNECTION (connection)); - - g_hash_table_iter_init (&iter, NM_CONNECTION_GET_PRIVATE (connection)->settings); - while (g_hash_table_iter_next (&iter, NULL, (gpointer) &setting)) { - g_signal_handlers_block_by_func (setting, (GCallback) setting_changed_cb, connection); - changed |= _nm_setting_clear_secrets_with_flags (setting, func, user_data); - g_signal_handlers_unblock_by_func (setting, (GCallback) setting_changed_cb, connection); - } - - g_signal_emit (connection, signals[SECRETS_CLEARED], 0); - if (changed) - g_signal_emit (connection, signals[CHANGED], 0); -} - -/** - * nm_connection_to_hash: - * @connection: the #NMConnection - * @flags: hash flags, e.g. %NM_SETTING_HASH_FLAG_ALL - * - * Converts the #NMConnection into a #GHashTable describing the connection, - * suitable for marshalling over D-Bus or serializing. The hash table mapping - * is string:#GHashTable with each element in the returned hash representing - * a #NMSetting object. The keys are setting object names, and the values - * are #GHashTables mapping string:GValue, each of which represents the - * properties of the #NMSetting object. - * - * Returns: (transfer full) (element-type utf8 GLib.HashTable): a new - * #GHashTable describing the connection, its settings, and each setting's - * properties. The caller owns the hash table and must unref the hash table - * with g_hash_table_unref() when it is no longer needed. - **/ -GHashTable * -nm_connection_to_hash (NMConnection *connection, NMSettingHashFlags flags) -{ - NMConnectionPrivate *priv; - GHashTableIter iter; - gpointer key, data; - GHashTable *ret, *setting_hash; - - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - ret = g_hash_table_new_full (g_str_hash, g_str_equal, - g_free, (GDestroyNotify) g_hash_table_unref); - - priv = NM_CONNECTION_GET_PRIVATE (connection); - - /* Add each setting's hash to the main hash */ - g_hash_table_iter_init (&iter, priv->settings); - while (g_hash_table_iter_next (&iter, &key, &data)) { - NMSetting *setting = NM_SETTING (data); - - setting_hash = nm_setting_to_hash (setting, flags); - if (setting_hash) - g_hash_table_insert (ret, g_strdup (nm_setting_get_name (setting)), setting_hash); - } - - /* Don't send empty hashes */ - if (g_hash_table_size (ret) < 1) { - g_hash_table_destroy (ret); - ret = NULL; - } - - return ret; -} - -/** - * nm_connection_is_type: - * @connection: the #NMConnection - * @type: a setting name to check the connection's type against (like - * %NM_SETTING_WIRELESS_SETTING_NAME or %NM_SETTING_WIRED_SETTING_NAME) - * - * A convenience function to check if the given @connection is a particular - * type (ie wired, Wi-Fi, ppp, etc). Checks the #NMSettingConnection:type - * property of the connection and matches that against @type. - * - * Returns: %TRUE if the connection is of the given @type, %FALSE if not - **/ -gboolean -nm_connection_is_type (NMConnection *connection, const char *type) -{ - NMSettingConnection *s_con; - const char *type2; - - g_return_val_if_fail (NM_IS_CONNECTION (connection), FALSE); - g_return_val_if_fail (type != NULL, FALSE); - - s_con = nm_connection_get_setting_connection (connection); - if (!s_con) - return FALSE; - - type2 = nm_setting_connection_get_connection_type (s_con); - - return (g_strcmp0 (type2, type) == 0); -} - -/** - * nm_connection_for_each_setting_value: - * @connection: the #NMConnection - * @func: (scope call): user-supplied function called for each setting's property - * @user_data: user data passed to @func at each invocation - * - * Iterates over the properties of each #NMSetting object in the #NMConnection, - * calling the supplied user function for each property. - **/ -void -nm_connection_for_each_setting_value (NMConnection *connection, - NMSettingValueIterFn func, - gpointer user_data) -{ - GHashTableIter iter; - gpointer value; - - g_return_if_fail (NM_IS_CONNECTION (connection)); - g_return_if_fail (func != NULL); - - g_hash_table_iter_init (&iter, NM_CONNECTION_GET_PRIVATE (connection)->settings); - while (g_hash_table_iter_next (&iter, NULL, &value)) - nm_setting_enumerate_values (NM_SETTING (value), func, user_data); -} - -/** - * nm_connection_dump: - * @connection: the #NMConnection - * - * Print the connection to stdout. For debugging purposes ONLY, should NOT - * be used for serialization of the connection or machine-parsed in any way. The - * output format is not guaranteed to be stable and may change at any time. - **/ -void -nm_connection_dump (NMConnection *connection) -{ - GHashTableIter iter; - NMSetting *setting; - const char *setting_name; - char *str; - - if (!connection) - return; - - g_hash_table_iter_init (&iter, NM_CONNECTION_GET_PRIVATE (connection)->settings); - while (g_hash_table_iter_next (&iter, (gpointer) &setting_name, (gpointer) &setting)) { - str = nm_setting_to_string (setting); - g_print ("%s\n", str); - g_free (str); - } -} - -/** - * nm_connection_set_path: - * @connection: the #NMConnection - * @path: the D-Bus path of the connection as given by the settings service - * which provides the connection - * - * Sets the D-Bus path of the connection. This property is not serialized, and - * is only for the reference of the caller. Sets the #NMConnection:path - * property. - **/ -void -nm_connection_set_path (NMConnection *connection, const char *path) -{ - NMConnectionPrivate *priv; - - g_return_if_fail (NM_IS_CONNECTION (connection)); - - priv = NM_CONNECTION_GET_PRIVATE (connection); - - g_free (priv->path); - priv->path = NULL; - - if (path) - priv->path = g_strdup (path); -} - -/** - * nm_connection_get_path: - * @connection: the #NMConnection - * - * Returns the connection's D-Bus path. - * - * Returns: the D-Bus path of the connection, previously set by a call to - * nm_connection_set_path(). - **/ -const char * -nm_connection_get_path (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return NM_CONNECTION_GET_PRIVATE (connection)->path; -} - -/** - * nm_connection_get_interface_name: - * @connection: The #NMConnection - * - * Returns the interface name as stored in NMSettingConnection:interface_name. - * If the connection contains no NMSettingConnection, it will return %NULL. - * - * For hardware devices and software devices created outside of NetworkManager, - * this name is used to match the device. for software devices created by - * NetworkManager, this is the name of the created interface. - * - * Returns: Name of the kernel interface or %NULL - * - * Since: 1.0 - */ -const char * -nm_connection_get_interface_name (NMConnection *connection) -{ - NMSettingConnection *s_con; - - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - s_con = nm_connection_get_setting_connection (connection); - - return s_con ? nm_setting_connection_get_interface_name (s_con) : NULL; -} - -/** - * nm_connection_get_virtual_iface_name: - * @connection: The #NMConnection - * - * Returns the name of the virtual kernel interface which the connection - * needs to use if specified in the settings. This function abstracts all - * connection types which require this functionality. For all other - * connection types, this function will return %NULL. - * - * Returns: Name of the kernel interface or %NULL - */ -const char * -nm_connection_get_virtual_iface_name (NMConnection *connection) -{ - NMSettingConnection *s_con; - const char *type; - NMSetting *base; - - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - s_con = nm_connection_get_setting_connection (connection); - g_return_val_if_fail (s_con, NULL); - - type = nm_setting_connection_get_connection_type (s_con); - g_return_val_if_fail (type, NULL); - - base = nm_connection_get_setting_by_name (connection, type); - if (!base) - return NULL; - - return nm_setting_get_virtual_iface_name (base); -} - -/** - * nm_connection_new: - * - * Creates a new #NMConnection object with no #NMSetting objects. - * - * Returns: the new empty #NMConnection object - **/ -NMConnection * -nm_connection_new (void) -{ - return (NMConnection *) g_object_new (NM_TYPE_CONNECTION, NULL); -} - -/** - * _nm_connection_new_from_hash: - * @hash: (element-type utf8 GLib.HashTable): the #GHashTable describing - * the connection - * - * Creates a new #NMConnection from a hash table describing the connection. See - * nm_connection_to_hash() for a description of the expected hash table. - * - * Returns: the new #NMConnection object, populated with settings created - * from the values in the hash table. - **/ -NMConnection * -_nm_connection_new_from_hash (GHashTable *hash) -{ - NMConnection *connection; - - g_return_val_if_fail (hash != NULL, NULL); - - connection = nm_connection_new (); - _nm_connection_replace_settings (connection, hash); - return connection; -} - -/** - * nm_connection_new_from_hash: - * @hash: (element-type utf8 GLib.HashTable): the #GHashTable describing - * the connection - * @error: on unsuccessful return, an error - * - * Creates a new #NMConnection from a hash table describing the connection. See - * nm_connection_to_hash() for a description of the expected hash table. - * - * Returns: the new #NMConnection object, populated with settings created - * from the values in the hash table, or %NULL if the connection failed to - * validate - **/ -NMConnection * -nm_connection_new_from_hash (GHashTable *hash, GError **error) -{ - NMConnection *connection; - - g_return_val_if_fail (hash != NULL, NULL); - - if (!validate_permissions_type (hash, error)) - return NULL; - - connection = _nm_connection_new_from_hash (hash); - if (!nm_connection_verify (connection, error)) - g_clear_object (&connection); - return connection; -} - -/** - * nm_connection_duplicate: - * @connection: the #NMConnection to duplicate - * - * Duplicates a #NMConnection. - * - * Returns: (transfer full): a new #NMConnection containing the same settings and properties - * as the source #NMConnection - **/ -NMConnection * -nm_connection_duplicate (NMConnection *connection) -{ - NMConnection *dup; - GHashTableIter iter; - NMSetting *setting; - - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - dup = nm_connection_new (); - nm_connection_set_path (dup, nm_connection_get_path (connection)); - - g_hash_table_iter_init (&iter, NM_CONNECTION_GET_PRIVATE (connection)->settings); - while (g_hash_table_iter_next (&iter, NULL, (gpointer) &setting)) - _nm_connection_add_setting (dup, nm_setting_duplicate (setting)); - - return dup; -} - -/** - * nm_connection_get_uuid: - * @connection: the #NMConnection - * - * A shortcut to return the UUID from the connection's #NMSettingConnection. - * - * Returns: the UUID from the connection's 'connection' setting - **/ -const char * -nm_connection_get_uuid (NMConnection *connection) -{ - NMSettingConnection *s_con; - - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - s_con = nm_connection_get_setting_connection (connection); - g_return_val_if_fail (s_con != NULL, NULL); - - return nm_setting_connection_get_uuid (s_con); -} - -/** - * nm_connection_get_id: - * @connection: the #NMConnection - * - * A shortcut to return the ID from the connection's #NMSettingConnection. - * - * Returns: the ID from the connection's 'connection' setting - **/ -const char * -nm_connection_get_id (NMConnection *connection) -{ - NMSettingConnection *s_con; - - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - s_con = nm_connection_get_setting_connection (connection); - g_return_val_if_fail (s_con != NULL, NULL); - - return nm_setting_connection_get_id (s_con); -} - -/** - * nm_connection_get_connection_type: - * @connection: the #NMConnection - * - * A shortcut to return the type from the connection's #NMSettingConnection. - * - * Returns: the type from the connection's 'connection' setting - * - * Since: 0.9.10 - **/ -const char * -nm_connection_get_connection_type (NMConnection *connection) -{ - NMSettingConnection *s_con; - - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - s_con = nm_connection_get_setting_connection (connection); - g_return_val_if_fail (s_con != NULL, NULL); - - return nm_setting_connection_get_connection_type (s_con); -} - -/** - * nm_connection_get_virtual_device_description: - * @connection: an #NMConnection for a virtual device type - * - * Returns the name that nm_device_disambiguate_names() would - * return for the virtual device that would be created for @connection. - * Eg, "VLAN (eth1.1)". - * - * Returns: (transfer full): the name of @connection's device, - * or %NULL if @connection is not a virtual connection type - * - * Since: 0.9.10 - */ -char * -nm_connection_get_virtual_device_description (NMConnection *connection) -{ - const char *iface, *type, *display_type; - NMSettingConnection *s_con; - - iface = nm_connection_get_virtual_iface_name (connection); - if (!iface) - return NULL; - - s_con = nm_connection_get_setting_connection (connection); - g_return_val_if_fail (s_con != NULL, NULL); - type = nm_setting_connection_get_connection_type (s_con); - - if (!strcmp (type, NM_SETTING_BOND_SETTING_NAME)) - display_type = _("Bond"); - else if (!strcmp (type, NM_SETTING_TEAM_SETTING_NAME)) - display_type = _("Team"); - else if (!strcmp (type, NM_SETTING_BRIDGE_SETTING_NAME)) - display_type = _("Bridge"); - else if (!strcmp (type, NM_SETTING_VLAN_SETTING_NAME)) - display_type = _("VLAN"); - else { - g_warning ("Unrecognized virtual device type '%s'", type); - display_type = type; - } - - return g_strdup_printf ("%s (%s)", display_type, iface); -} - -/*****************************************************************************/ - -/** - * nm_connection_get_setting_802_1x: - * @connection: the #NMConnection - * - * A shortcut to return any #NMSetting8021x the connection might contain. - * - * Returns: (transfer none): an #NMSetting8021x if the connection contains one, otherwise %NULL - **/ -NMSetting8021x * -nm_connection_get_setting_802_1x (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return (NMSetting8021x *) nm_connection_get_setting (connection, NM_TYPE_SETTING_802_1X); -} - -/** - * nm_connection_get_setting_bluetooth: - * @connection: the #NMConnection - * - * A shortcut to return any #NMSettingBluetooth the connection might contain. - * - * Returns: (transfer none): an #NMSettingBluetooth if the connection contains one, otherwise %NULL - **/ -NMSettingBluetooth * -nm_connection_get_setting_bluetooth (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return (NMSettingBluetooth *) nm_connection_get_setting (connection, NM_TYPE_SETTING_BLUETOOTH); -} - -/** - * nm_connection_get_setting_bond: - * @connection: the #NMConnection - * - * A shortcut to return any #NMSettingBond the connection might contain. - * - * Returns: (transfer none): an #NMSettingBond if the connection contains one, otherwise %NULL - **/ -NMSettingBond * -nm_connection_get_setting_bond (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return (NMSettingBond *) nm_connection_get_setting (connection, NM_TYPE_SETTING_BOND); -} - -/** - * nm_connection_get_setting_team: - * @connection: the #NMConnection - * - * A shortcut to return any #NMSettingTeam the connection might contain. - * - * Returns: (transfer none): an #NMSettingTeam if the connection contains one, otherwise %NULL - * - * Since: 0.9.10 - **/ -NMSettingTeam * -nm_connection_get_setting_team (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return (NMSettingTeam *) nm_connection_get_setting (connection, NM_TYPE_SETTING_TEAM); -} - -/** - * nm_connection_get_setting_team_port: - * @connection: the #NMConnection - * - * A shortcut to return any #NMSettingTeamPort the connection might contain. - * - * Returns: (transfer none): an #NMSettingTeamPort if the connection contains one, otherwise %NULL - * - * Since: 0.9.10 - **/ -NMSettingTeamPort * -nm_connection_get_setting_team_port (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return (NMSettingTeamPort *) nm_connection_get_setting (connection, NM_TYPE_SETTING_TEAM_PORT); -} - -/** - * nm_connection_get_setting_bridge: - * @connection: the #NMConnection - * - * A shortcut to return any #NMSettingBridge the connection might contain. - * - * Returns: (transfer none): an #NMSettingBridge if the connection contains one, otherwise %NULL - **/ -NMSettingBridge * -nm_connection_get_setting_bridge (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return (NMSettingBridge *) nm_connection_get_setting (connection, NM_TYPE_SETTING_BRIDGE); -} - -/** - * nm_connection_get_setting_cdma: - * @connection: the #NMConnection - * - * A shortcut to return any #NMSettingCdma the connection might contain. - * - * Returns: (transfer none): an #NMSettingCdma if the connection contains one, otherwise %NULL - **/ -NMSettingCdma * -nm_connection_get_setting_cdma (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return (NMSettingCdma *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CDMA); -} - -/** - * nm_connection_get_setting_connection: - * @connection: the #NMConnection - * - * A shortcut to return any #NMSettingConnection the connection might contain. - * - * Returns: (transfer none): an #NMSettingConnection if the connection contains one, otherwise %NULL - **/ -NMSettingConnection * -nm_connection_get_setting_connection (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return (NMSettingConnection *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION); -} - -/** - * nm_connection_get_setting_dcb: - * @connection: the #NMConnection - * - * A shortcut to return any #NMSettingDcb the connection might contain. - * - * Returns: (transfer none): an #NMSettingDcb if the connection contains one, otherwise NULL - * - * Since: 0.9.10 - **/ -NMSettingDcb * -nm_connection_get_setting_dcb (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return (NMSettingDcb *) nm_connection_get_setting (connection, NM_TYPE_SETTING_DCB); -} - -/** - * nm_connection_get_setting_generic: - * @connection: the #NMConnection - * - * A shortcut to return any #NMSettingGeneric the connection might contain. - * - * Returns: (transfer none): an #NMSettingGeneric if the connection contains one, otherwise NULL - * - * Since: 0.9.10 - **/ -NMSettingGeneric * -nm_connection_get_setting_generic (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return (NMSettingGeneric *) nm_connection_get_setting (connection, NM_TYPE_SETTING_GENERIC); -} - -/** - * nm_connection_get_setting_gsm: - * @connection: the #NMConnection - * - * A shortcut to return any #NMSettingGsm the connection might contain. - * - * Returns: (transfer none): an #NMSettingGsm if the connection contains one, otherwise %NULL - **/ -NMSettingGsm * -nm_connection_get_setting_gsm (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return (NMSettingGsm *) nm_connection_get_setting (connection, NM_TYPE_SETTING_GSM); -} - -/** - * nm_connection_get_setting_infiniband: - * @connection: the #NMConnection - * - * A shortcut to return any #NMSettingInfiniband the connection might contain. - * - * Returns: (transfer none): an #NMSettingInfiniband if the connection contains one, otherwise %NULL - **/ -NMSettingInfiniband * -nm_connection_get_setting_infiniband (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return (NMSettingInfiniband *) nm_connection_get_setting (connection, NM_TYPE_SETTING_INFINIBAND); -} - -/** - * nm_connection_get_setting_ip4_config: - * @connection: the #NMConnection - * - * A shortcut to return any #NMSettingIP4Config the connection might contain. - * - * Returns: (transfer none): an #NMSettingIP4Config if the connection contains one, otherwise %NULL - **/ -NMSettingIP4Config * -nm_connection_get_setting_ip4_config (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return (NMSettingIP4Config *) nm_connection_get_setting (connection, NM_TYPE_SETTING_IP4_CONFIG); -} - -/** - * nm_connection_get_setting_ip6_config: - * @connection: the #NMConnection - * - * A shortcut to return any #NMSettingIP6Config the connection might contain. - * - * Returns: (transfer none): an #NMSettingIP6Config if the connection contains one, otherwise %NULL - **/ -NMSettingIP6Config * -nm_connection_get_setting_ip6_config (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return (NMSettingIP6Config *) nm_connection_get_setting (connection, NM_TYPE_SETTING_IP6_CONFIG); -} - -/** - * nm_connection_get_setting_olpc_mesh: - * @connection: the #NMConnection - * - * A shortcut to return any #NMSettingOlpcMesh the connection might contain. - * - * Returns: (transfer none): an #NMSettingOlpcMesh if the connection contains one, otherwise %NULL - **/ -NMSettingOlpcMesh * -nm_connection_get_setting_olpc_mesh (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return (NMSettingOlpcMesh *) nm_connection_get_setting (connection, NM_TYPE_SETTING_OLPC_MESH); -} - -/** - * nm_connection_get_setting_ppp: - * @connection: the #NMConnection - * - * A shortcut to return any #NMSettingPPP the connection might contain. - * - * Returns: (transfer none): an #NMSettingPPP if the connection contains one, otherwise %NULL - **/ -NMSettingPPP * -nm_connection_get_setting_ppp (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return (NMSettingPPP *) nm_connection_get_setting (connection, NM_TYPE_SETTING_PPP); -} - -/** - * nm_connection_get_setting_pppoe: - * @connection: the #NMConnection - * - * A shortcut to return any #NMSettingPPPOE the connection might contain. - * - * Returns: (transfer none): an #NMSettingPPPOE if the connection contains one, otherwise %NULL - **/ -NMSettingPPPOE * -nm_connection_get_setting_pppoe (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return (NMSettingPPPOE *) nm_connection_get_setting (connection, NM_TYPE_SETTING_PPPOE); -} - -/** - * nm_connection_get_setting_serial: - * @connection: the #NMConnection - * - * A shortcut to return any #NMSettingSerial the connection might contain. - * - * Returns: (transfer none): an #NMSettingSerial if the connection contains one, otherwise %NULL - **/ -NMSettingSerial * -nm_connection_get_setting_serial (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return (NMSettingSerial *) nm_connection_get_setting (connection, NM_TYPE_SETTING_SERIAL); -} - -/** - * nm_connection_get_setting_vpn: - * @connection: the #NMConnection - * - * A shortcut to return any #NMSettingVPN the connection might contain. - * - * Returns: (transfer none): an #NMSettingVPN if the connection contains one, otherwise %NULL - **/ -NMSettingVPN * -nm_connection_get_setting_vpn (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return (NMSettingVPN *) nm_connection_get_setting (connection, NM_TYPE_SETTING_VPN); -} - -/** - * nm_connection_get_setting_wimax: - * @connection: the #NMConnection - * - * A shortcut to return any #NMSettingWimax the connection might contain. - * - * Returns: (transfer none): an #NMSettingWimax if the connection contains one, otherwise %NULL - **/ -NMSettingWimax * -nm_connection_get_setting_wimax (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return (NMSettingWimax *) nm_connection_get_setting (connection, NM_TYPE_SETTING_WIMAX); -} - -/** - * nm_connection_get_setting_wired: - * @connection: the #NMConnection - * - * A shortcut to return any #NMSettingWired the connection might contain. - * - * Returns: (transfer none): an #NMSettingWired if the connection contains one, otherwise %NULL - **/ -NMSettingWired * -nm_connection_get_setting_wired (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return (NMSettingWired *) nm_connection_get_setting (connection, NM_TYPE_SETTING_WIRED); -} - -/** - * nm_connection_get_setting_adsl: - * @connection: the #NMConnection - * - * A shortcut to return any #NMSettingAdsl the connection might contain. - * - * Returns: (transfer none): an #NMSettingAdsl if the connection contains one, otherwise %NULL - **/ -NMSettingAdsl * -nm_connection_get_setting_adsl (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return (NMSettingAdsl *) nm_connection_get_setting (connection, NM_TYPE_SETTING_ADSL); -} - -/** - * nm_connection_get_setting_wireless: - * @connection: the #NMConnection - * - * A shortcut to return any #NMSettingWireless the connection might contain. - * - * Returns: (transfer none): an #NMSettingWireless if the connection contains one, otherwise %NULL - **/ -NMSettingWireless * -nm_connection_get_setting_wireless (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return (NMSettingWireless *) nm_connection_get_setting (connection, NM_TYPE_SETTING_WIRELESS); -} - -/** - * nm_connection_get_setting_wireless_security: - * @connection: the #NMConnection - * - * A shortcut to return any #NMSettingWirelessSecurity the connection might contain. - * - * Returns: (transfer none): an #NMSettingWirelessSecurity if the connection contains one, otherwise %NULL - **/ -NMSettingWirelessSecurity * -nm_connection_get_setting_wireless_security (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return (NMSettingWirelessSecurity *) nm_connection_get_setting (connection, NM_TYPE_SETTING_WIRELESS_SECURITY); -} - -/** - * nm_connection_get_setting_bridge_port: - * @connection: the #NMConnection - * - * A shortcut to return any #NMSettingBridgePort the connection might contain. - * - * Returns: (transfer none): an #NMSettingBridgePort if the connection contains one, otherwise %NULL - **/ -NMSettingBridgePort * -nm_connection_get_setting_bridge_port (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return (NMSettingBridgePort *) nm_connection_get_setting (connection, NM_TYPE_SETTING_BRIDGE_PORT); -} - -/** - * nm_connection_get_setting_vlan: - * @connection: the #NMConnection - * - * A shortcut to return any #NMSettingVlan the connection might contain. - * - * Returns: (transfer none): an #NMSettingVlan if the connection contains one, otherwise %NULL - **/ -NMSettingVlan * -nm_connection_get_setting_vlan (NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); - - return (NMSettingVlan *) nm_connection_get_setting (connection, NM_TYPE_SETTING_VLAN); -} - -/*****************************************************************************/ - -static void -nm_connection_init (NMConnection *connection) -{ - NMConnectionPrivate *priv = NM_CONNECTION_GET_PRIVATE (connection); - - priv->settings = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_object_unref); -} - -static void -dispose (GObject *object) -{ - NMConnection *self = NM_CONNECTION (object); - NMConnectionPrivate *priv = NM_CONNECTION_GET_PRIVATE (self); - - g_hash_table_foreach_remove (priv->settings, _setting_release, self); - - G_OBJECT_CLASS (nm_connection_parent_class)->dispose (object); -} - -static void -finalize (GObject *object) -{ - NMConnection *connection = NM_CONNECTION (object); - NMConnectionPrivate *priv = NM_CONNECTION_GET_PRIVATE (connection); - - g_assert (g_hash_table_size (priv->settings) == 0); - g_hash_table_destroy (priv->settings); - g_free (priv->path); - - G_OBJECT_CLASS (nm_connection_parent_class)->finalize (object); -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMConnection *connection = NM_CONNECTION (object); - - switch (prop_id) { - case PROP_PATH: - nm_connection_set_path (connection, g_value_get_string (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMConnection *connection = NM_CONNECTION (object); - - switch (prop_id) { - case PROP_PATH: - g_value_set_string (value, nm_connection_get_path (connection)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_connection_class_init (NMConnectionClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - g_type_class_add_private (klass, sizeof (NMConnectionPrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->dispose = dispose; - object_class->finalize = finalize; - - /* Properties */ - - /** - * NMConnection:path: - * - * The connection's D-Bus path, used only by the calling process as a record - * of the D-Bus path of the connection as provided by a settings service. - **/ - g_object_class_install_property - (object_class, PROP_PATH, - g_param_spec_string (NM_CONNECTION_PATH, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /* Signals */ - - /** - * NMConnection::secrets-updated: - * @connection: the object on which the signal is emitted - * @setting_name: the setting name of the #NMSetting for which secrets were - * updated - * - * The ::secrets-updated signal is emitted when the secrets of a setting - * have been changed. - */ - signals[SECRETS_UPDATED] = - g_signal_new (NM_CONNECTION_SECRETS_UPDATED, - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (NMConnectionClass, secrets_updated), - NULL, NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); - - /** - * NMConnection::secrets-cleared: - * @connection: the object on which the signal is emitted - * - * The ::secrets-cleared signal is emitted when the secrets of a connection - * are cleared. - */ - signals[SECRETS_CLEARED] = - g_signal_new (NM_CONNECTION_SECRETS_CLEARED, - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - 0, NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - /** - * NMConnection::changed: - * @connection: the object on which the signal is emitted - * - * The ::changed signal is emitted when any property of any property - * (including secrets) of any setting of the connection is modified, - * or when settings are added or removed. - * - * Since: 0.9.10 - */ - signals[CHANGED] = - g_signal_new (NM_CONNECTION_CHANGED, - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - 0, NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); -} diff --git a/libnm-util/nm-connection.h b/libnm-util/nm-connection.h deleted file mode 100644 index 9bee219e86..0000000000 --- a/libnm-util/nm-connection.h +++ /dev/null @@ -1,256 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2013 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#ifndef NM_CONNECTION_H -#define NM_CONNECTION_H - -#include <glib.h> -#include <glib-object.h> -#include "nm-setting.h" - -#include "nm-setting-8021x.h" -#include "nm-setting-bluetooth.h" -#include "nm-setting-bond.h" -#include "nm-setting-team.h" -#include "nm-setting-team-port.h" -#include "nm-setting-bridge.h" -#include "nm-setting-bridge-port.h" -#include "nm-setting-cdma.h" -#include "nm-setting-connection.h" -#include "nm-setting-dcb.h" -#include "nm-setting-generic.h" -#include "nm-setting-gsm.h" -#include "nm-setting-infiniband.h" -#include "nm-setting-ip4-config.h" -#include "nm-setting-ip6-config.h" -#include "nm-setting-olpc-mesh.h" -#include "nm-setting-ppp.h" -#include "nm-setting-pppoe.h" -#include "nm-setting-serial.h" -#include "nm-setting-vpn.h" -#include "nm-setting-wimax.h" -#include "nm-setting-wired.h" -#include "nm-setting-adsl.h" -#include "nm-setting-wireless.h" -#include "nm-setting-wireless-security.h" -#include "nm-setting-vlan.h" - -G_BEGIN_DECLS - -#define NM_TYPE_CONNECTION (nm_connection_get_type ()) -#define NM_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_CONNECTION, NMConnection)) -#define NM_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_CONNECTION, NMConnectionClass)) -#define NM_IS_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_CONNECTION)) -#define NM_IS_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_CONNECTION)) -#define NM_CONNECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_CONNECTION, NMConnectionClass)) - -/* Signals */ -#define NM_CONNECTION_SECRETS_UPDATED "secrets-updated" -#define NM_CONNECTION_SECRETS_CLEARED "secrets-cleared" -#define NM_CONNECTION_CHANGED "changed" - -/* Properties */ -#define NM_CONNECTION_PATH "path" - -/** - * NMConnectionError: - * @NM_CONNECTION_ERROR_UNKNOWN: unknown or unclassified error - * @NM_CONNECTION_ERROR_CONNECTION_SETTING_NOT_FOUND: the #NMConnection object - * did not contain the required #NMSettingConnection object, which must be - * present for all connections - * @NM_CONNECTION_ERROR_CONNECTION_TYPE_INVALID: the 'type' property of the - * 'connection' setting did not point to a valid connection base type; ie - * it was not a hardware-related setting like #NMSettingWired or - * #NMSettingWireless. - * @NM_CONNECTION_ERROR_SETTING_NOT_FOUND: the #NMConnection object - * did not contain the specified #NMSetting object - *@NM_CONNECTION_ERROR_INVALID_SETTING: the #NMConnection object contains - * a conflicting setting object - * - * Describes errors that may result from operations involving a #NMConnection. - * - **/ -typedef enum -{ - NM_CONNECTION_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_CONNECTION_ERROR_CONNECTION_SETTING_NOT_FOUND, /*< nick=ConnectionSettingNotFound >*/ - NM_CONNECTION_ERROR_CONNECTION_TYPE_INVALID, /*< nick=ConnectionTypeInvalid >*/ - NM_CONNECTION_ERROR_SETTING_NOT_FOUND, /*< nick=SettingNotFound >*/ - NM_CONNECTION_ERROR_INVALID_SETTING, /*< nick=InvalidSetting >*/ -} NMConnectionError; - -/* - * NM_CONNECTION_NORMALIZE_PARAM_IP6_CONFIG_METHOD: overwrite the ip6 method - * when normalizing ip6 configuration. If omitted, this defaults to - * @NM_SETTING_IP6_CONFIG_METHOD_AUTO. - */ -#define NM_CONNECTION_NORMALIZE_PARAM_IP6_CONFIG_METHOD "ip6-config-method" - -#define NM_CONNECTION_ERROR nm_connection_error_quark () -GQuark nm_connection_error_quark (void); - -/** - * NMConnection: - * - * The NMConnection struct contains only private data. - * It should only be accessed through the functions described below. - */ -typedef struct { - GObject parent; -} NMConnection; - -typedef struct { - GObjectClass parent; - - /* Signals */ - void (*secrets_updated) (NMConnection *connection, const char * setting); -} NMConnectionClass; - -GType nm_connection_get_type (void); - -NMConnection *nm_connection_new (void); - -NMConnection *nm_connection_new_from_hash (GHashTable *hash, GError **error); - -NMConnection *nm_connection_duplicate (NMConnection *connection); - -NMSetting *nm_connection_create_setting (const char *name); - -void nm_connection_add_setting (NMConnection *connection, - NMSetting *setting); - -void nm_connection_remove_setting (NMConnection *connection, - GType setting_type); - -NMSetting *nm_connection_get_setting (NMConnection *connection, - GType setting_type); - -NMSetting *nm_connection_get_setting_by_name (NMConnection *connection, - const char *name); - -gboolean nm_connection_replace_settings (NMConnection *connection, - GHashTable *new_settings, - GError **error); - -NM_AVAILABLE_IN_0_9_10 -gboolean nm_connection_replace_settings_from_connection (NMConnection *connection, - NMConnection *new_connection, - GError **error); - -gboolean nm_connection_compare (NMConnection *a, - NMConnection *b, - NMSettingCompareFlags flags); - -gboolean nm_connection_diff (NMConnection *a, - NMConnection *b, - NMSettingCompareFlags flags, - GHashTable **out_settings); - -gboolean nm_connection_verify (NMConnection *connection, GError **error); -NM_AVAILABLE_IN_1_0 -gboolean nm_connection_normalize (NMConnection *connection, - GHashTable *parameters, - gboolean *modified, - GError **error); - -const char * nm_connection_need_secrets (NMConnection *connection, - GPtrArray **hints); - -void nm_connection_clear_secrets (NMConnection *connection); - -void nm_connection_clear_secrets_with_flags (NMConnection *connection, - NMSettingClearSecretsWithFlagsFn func, - gpointer user_data); - -gboolean nm_connection_update_secrets (NMConnection *connection, - const char *setting_name, - GHashTable *secrets, - GError **error); - -void nm_connection_set_path (NMConnection *connection, - const char *path); - -const char * nm_connection_get_path (NMConnection *connection); - -const char * nm_connection_get_virtual_iface_name (NMConnection *connection); - -NM_AVAILABLE_IN_1_0 -const char * nm_connection_get_interface_name (NMConnection *connection); - -gboolean nm_connection_is_type (NMConnection *connection, const char *type); - -void nm_connection_for_each_setting_value (NMConnection *connection, - NMSettingValueIterFn func, - gpointer user_data); - -GHashTable *nm_connection_to_hash (NMConnection *connection, - NMSettingHashFlags flags); - -void nm_connection_dump (NMConnection *connection); - -GType nm_connection_lookup_setting_type (const char *name); - -GType nm_connection_lookup_setting_type_by_quark (GQuark error_quark); - -/* Helpers */ -const char * nm_connection_get_uuid (NMConnection *connection); -const char * nm_connection_get_id (NMConnection *connection); -NM_AVAILABLE_IN_0_9_10 -const char * nm_connection_get_connection_type (NMConnection *connection); - -NM_AVAILABLE_IN_0_9_10 -char * nm_connection_get_virtual_device_description (NMConnection *connection); - -NMSetting8021x * nm_connection_get_setting_802_1x (NMConnection *connection); -NMSettingBluetooth * nm_connection_get_setting_bluetooth (NMConnection *connection); -NMSettingBond * nm_connection_get_setting_bond (NMConnection *connection); -NM_AVAILABLE_IN_0_9_10 -NMSettingTeam * nm_connection_get_setting_team (NMConnection *connection); -NM_AVAILABLE_IN_0_9_10 -NMSettingTeamPort * nm_connection_get_setting_team_port (NMConnection *connection); -NMSettingBridge * nm_connection_get_setting_bridge (NMConnection *connection); -NMSettingBridgePort * nm_connection_get_setting_bridge_port (NMConnection *connection); -NMSettingCdma * nm_connection_get_setting_cdma (NMConnection *connection); -NMSettingConnection * nm_connection_get_setting_connection (NMConnection *connection); -NM_AVAILABLE_IN_0_9_10 -NMSettingDcb * nm_connection_get_setting_dcb (NMConnection *connection); -NM_AVAILABLE_IN_0_9_10 -NMSettingGeneric * nm_connection_get_setting_generic (NMConnection *connection); -NMSettingGsm * nm_connection_get_setting_gsm (NMConnection *connection); -NMSettingInfiniband * nm_connection_get_setting_infiniband (NMConnection *connection); -NMSettingIP4Config * nm_connection_get_setting_ip4_config (NMConnection *connection); -NMSettingIP6Config * nm_connection_get_setting_ip6_config (NMConnection *connection); -NMSettingOlpcMesh * nm_connection_get_setting_olpc_mesh (NMConnection *connection); -NMSettingPPP * nm_connection_get_setting_ppp (NMConnection *connection); -NMSettingPPPOE * nm_connection_get_setting_pppoe (NMConnection *connection); -NMSettingSerial * nm_connection_get_setting_serial (NMConnection *connection); -NMSettingVPN * nm_connection_get_setting_vpn (NMConnection *connection); -NMSettingWimax * nm_connection_get_setting_wimax (NMConnection *connection); -NMSettingAdsl * nm_connection_get_setting_adsl (NMConnection *connection); -NMSettingWired * nm_connection_get_setting_wired (NMConnection *connection); -NMSettingWireless * nm_connection_get_setting_wireless (NMConnection *connection); -NMSettingWirelessSecurity *nm_connection_get_setting_wireless_security (NMConnection *connection); -NMSettingVlan * nm_connection_get_setting_vlan (NMConnection *connection); - -G_END_DECLS - -#endif /* NM_CONNECTION_H */ diff --git a/libnm-util/nm-dbus-glib-types.h b/libnm-util/nm-dbus-glib-types.h deleted file mode 100644 index ad11ab6812..0000000000 --- a/libnm-util/nm-dbus-glib-types.h +++ /dev/null @@ -1,45 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Copyright 2008 Red Hat, Inc. - */ - -#ifndef __NM_DBUS_GLIB_TYPES_H__ -#define __NM_DBUS_GLIB_TYPES_H__ - -#include <dbus/dbus-glib.h> - -#define DBUS_TYPE_G_ARRAY_OF_OBJECT_PATH (dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH)) -#define DBUS_TYPE_G_ARRAY_OF_STRING (dbus_g_type_get_collection ("GPtrArray", G_TYPE_STRING)) -#define DBUS_TYPE_G_ARRAY_OF_UINT (dbus_g_type_get_collection ("GArray", G_TYPE_UINT)) -#define DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UCHAR (dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_UCHAR_ARRAY)) -#define DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UINT (dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_ARRAY_OF_UINT)) -#define DBUS_TYPE_G_MAP_OF_VARIANT (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE)) -#define DBUS_TYPE_G_MAP_OF_MAP_OF_VARIANT (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, DBUS_TYPE_G_MAP_OF_VARIANT)) -#define DBUS_TYPE_G_MAP_OF_STRING (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_STRING)) -#define DBUS_TYPE_G_LIST_OF_STRING (dbus_g_type_get_collection ("GSList", G_TYPE_STRING)) - -#define DBUS_TYPE_G_IP6_ADDRESS (dbus_g_type_get_struct ("GValueArray", DBUS_TYPE_G_UCHAR_ARRAY, G_TYPE_UINT, DBUS_TYPE_G_UCHAR_ARRAY, G_TYPE_INVALID)) -#define DBUS_TYPE_G_ARRAY_OF_IP6_ADDRESS (dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_IP6_ADDRESS)) -#define DBUS_TYPE_G_IP6_ROUTE (dbus_g_type_get_struct ("GValueArray", DBUS_TYPE_G_UCHAR_ARRAY, G_TYPE_UINT, DBUS_TYPE_G_UCHAR_ARRAY, G_TYPE_UINT, G_TYPE_INVALID)) -#define DBUS_TYPE_G_ARRAY_OF_IP6_ROUTE (dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_IP6_ROUTE)) - -#define DBUS_TYPE_NM_IP_ADDRESS DBUS_TYPE_G_MAP_OF_VARIANT -#define DBUS_TYPE_NM_IP_ADDRESSES (dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_NM_IP_ADDRESS)) -#define DBUS_TYPE_NM_IP_ROUTE DBUS_TYPE_G_MAP_OF_VARIANT -#define DBUS_TYPE_NM_IP_ROUTES (dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_NM_IP_ROUTE)) - -#endif /* __NM_DBUS_GLIB_TYPES_H__ */ diff --git a/libnm-util/nm-gvaluearray-compat.h b/libnm-util/nm-gvaluearray-compat.h deleted file mode 100644 index 91f4f243a6..0000000000 --- a/libnm-util/nm-gvaluearray-compat.h +++ /dev/null @@ -1,104 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Copyright 2013 Red Hat, Inc. - */ - -#ifndef __NM_GVALUEARRAY_COMPAT_H__ -#define __NM_GVALUEARRAY_COMPAT_H__ - -#define g_value_array_get_type() \ - ({ \ - G_GNUC_BEGIN_IGNORE_DEPRECATIONS \ - g_value_array_get_type (); \ - G_GNUC_END_IGNORE_DEPRECATIONS \ - }) - -#define g_value_array_get_nth(value_array, index_) \ - ({ \ - G_GNUC_BEGIN_IGNORE_DEPRECATIONS \ - g_value_array_get_nth (value_array, index_); \ - G_GNUC_END_IGNORE_DEPRECATIONS \ - }) - -#define g_value_array_new(n_prealloced) \ - ({ \ - G_GNUC_BEGIN_IGNORE_DEPRECATIONS \ - g_value_array_new (n_prealloced); \ - G_GNUC_END_IGNORE_DEPRECATIONS \ - }) - -static inline void -__g_value_array_free (GValueArray *value_array) -{ - ({ - G_GNUC_BEGIN_IGNORE_DEPRECATIONS - g_value_array_free (value_array); - G_GNUC_END_IGNORE_DEPRECATIONS - }); -} -#define g_value_array_free __g_value_array_free - -#define g_value_array_copy(value_array) \ - ({ \ - G_GNUC_BEGIN_IGNORE_DEPRECATIONS \ - g_value_array_copy (value_array); \ - G_GNUC_END_IGNORE_DEPRECATIONS \ - }) - -#define g_value_array_prepend(value_array, value) \ - ({ \ - G_GNUC_BEGIN_IGNORE_DEPRECATIONS \ - g_value_array_prepend (value_array, value); \ - G_GNUC_END_IGNORE_DEPRECATIONS \ - }) - -#define g_value_array_append(value_array, value) \ - ({ \ - G_GNUC_BEGIN_IGNORE_DEPRECATIONS \ - g_value_array_append (value_array, value); \ - G_GNUC_END_IGNORE_DEPRECATIONS \ - }) - -#define g_value_array_insert(value_array, index_, value) \ - ({ \ - G_GNUC_BEGIN_IGNORE_DEPRECATIONS \ - g_value_array_insert (value_array, index_, value); \ - G_GNUC_END_IGNORE_DEPRECATIONS \ - }) - -#define g_value_array_remove(value_array, index_) \ - ({ \ - G_GNUC_BEGIN_IGNORE_DEPRECATIONS \ - g_value_array_remove (value_array, index_); \ - G_GNUC_END_IGNORE_DEPRECATIONS \ - }) - -#define g_value_array_sort(value_array, compare_func) \ - ({ \ - G_GNUC_BEGIN_IGNORE_DEPRECATIONS \ - g_value_array_sort (value_array, compare_func); \ - G_GNUC_END_IGNORE_DEPRECATIONS \ - }) - -#define g_value_array_sort_with_data(value_array, compare_func, user_data) \ - ({ \ - G_GNUC_BEGIN_IGNORE_DEPRECATIONS \ - g_value_array_sort_with_data (value_array, compare_func, user_data); \ - G_GNUC_END_IGNORE_DEPRECATIONS \ - }) - -#endif /* __NM_GVALUEARRAY_COMPAT_H__ */ diff --git a/libnm-util/nm-param-spec-specialized.c b/libnm-util/nm-param-spec-specialized.c deleted file mode 100644 index 8581ecc5b0..0000000000 --- a/libnm-util/nm-param-spec-specialized.c +++ /dev/null @@ -1,973 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2011 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#include "nm-default.h" - -#include "nm-gvaluearray-compat.h" -#include "nm-param-spec-specialized.h" - -struct _NMParamSpecSpecialized { - GParamSpec parent; -}; - -#include <string.h> -#include <netinet/in.h> -#include <dbus/dbus-glib.h> - -#include "nm-dbus-glib-types.h" - -/*****************************************************************************/ -/* _gvalues_compare */ - -static int _gvalues_compare (const GValue *value1, const GValue *value2); - -static gboolean -type_is_fixed_size (GType type, gsize *tsize) -{ - switch (type) { - case G_TYPE_CHAR: - if (tsize) *tsize = sizeof (char); - return TRUE; - case G_TYPE_UCHAR: - if (tsize) *tsize = sizeof (guchar); - return TRUE; - case G_TYPE_BOOLEAN: - if (tsize) *tsize = sizeof (gboolean); - return TRUE; - case G_TYPE_LONG: - if (tsize) *tsize = sizeof (long); - return TRUE; - case G_TYPE_ULONG: - if (tsize) *tsize = sizeof (gulong); - return TRUE; - case G_TYPE_INT: - if (tsize) *tsize = sizeof (int); - return TRUE; - case G_TYPE_UINT: - if (tsize) *tsize = sizeof (guint); - return TRUE; - case G_TYPE_INT64: - if (tsize) *tsize = sizeof (gint64); - return TRUE; - case G_TYPE_UINT64: - if (tsize) *tsize = sizeof (guint64); - return TRUE; - case G_TYPE_FLOAT: - if (tsize) *tsize = sizeof (float); - return TRUE; - case G_TYPE_DOUBLE: - if (tsize) *tsize = sizeof (double); - return TRUE; - default: - return FALSE; - } -} - -#define FLOAT_FACTOR 0.00000001 - -static int -_gvalues_compare_fixed (const GValue *value1, const GValue *value2) -{ - int ret = 0; - - switch (G_VALUE_TYPE (value1)) { - case G_TYPE_CHAR: { - char val1 = g_value_get_schar (value1); - char val2 = g_value_get_schar (value2); - if (val1 != val2) - ret = val1 < val2 ? -1 : val1 > val2; - break; - } - case G_TYPE_UCHAR: { - guchar val1 = g_value_get_uchar (value1); - guchar val2 = g_value_get_uchar (value2); - if (val1 != val2) - ret = val1 < val2 ? -1 : val1 > val2; - break; - } - case G_TYPE_BOOLEAN: { - gboolean val1 = g_value_get_boolean (value1); - gboolean val2 = g_value_get_boolean (value2); - if (val1 != val2) - ret = val1 < val2 ? -1 : val1 > val2; - break; - } - case G_TYPE_LONG: { - long val1 = g_value_get_long (value1); - long val2 = g_value_get_long (value2); - if (val1 != val2) - ret = val1 < val2 ? -1 : val1 > val2; - break; - } - case G_TYPE_ULONG: { - gulong val1 = g_value_get_ulong (value1); - gulong val2 = g_value_get_ulong (value2); - if (val1 != val2) - ret = val1 < val2 ? -1 : val1 > val2; - break; - } - case G_TYPE_INT: { - int val1 = g_value_get_int (value1); - int val2 = g_value_get_int (value2); - if (val1 != val2) - ret = val1 < val2 ? -1 : val1 > val2; - break; - } - case G_TYPE_UINT: { - guint val1 = g_value_get_uint (value1); - guint val2 = g_value_get_uint (value2); - if (val1 != val2) - ret = val1 < val2 ? -1 : val1 > val2; - break; - } - case G_TYPE_INT64: { - gint64 val1 = g_value_get_int64 (value1); - gint64 val2 = g_value_get_int64 (value2); - if (val1 != val2) - ret = val1 < val2 ? -1 : val1 > val2; - break; - } - case G_TYPE_UINT64: { - guint64 val1 = g_value_get_uint64 (value1); - guint64 val2 = g_value_get_uint64 (value2); - if (val1 != val2) - ret = val1 < val2 ? -1 : val1 > val2; - break; - } - case G_TYPE_FLOAT: { - float val1 = g_value_get_float (value1); - float val2 = g_value_get_float (value2); - float diff = val1 - val2; - - /* Can't use == or != here due to inexactness of FP */ - if (diff > FLOAT_FACTOR || diff < -FLOAT_FACTOR) - ret = val1 < val2 ? -1 : val1 > val2; - break; - } - case G_TYPE_DOUBLE: { - double val1 = g_value_get_double (value1); - double val2 = g_value_get_double (value2); - double diff = val1 - val2; - - if (diff > FLOAT_FACTOR || diff < -FLOAT_FACTOR) - ret = val1 < val2 ? -1 : val1 > val2; - break; - } - default: - g_warning ("Unhandled fixed size type '%s'", G_VALUE_TYPE_NAME (value1)); - } - - return ret; -} - -static int -_gvalues_compare_string (const GValue *value1, const GValue *value2) -{ - const char *str1 = g_value_get_string (value1); - const char *str2 = g_value_get_string (value2); - - if (str1 == str2) - return 0; - - if (!str1) - return 1; - if (!str2) - return -1; - - return strcmp (str1, str2); -} - -static int -_gvalues_compare_strv (const GValue *value1, const GValue *value2) -{ - char **strv1; - char **strv2; - int ret; - guint i = 0; - - strv1 = (char **) g_value_get_boxed (value1); - strv2 = (char **) g_value_get_boxed (value2); - - while (strv1[i] && strv2[i]) { - ret = strcmp (strv1[i], strv2[i]); - if (ret) - return ret; - i++; - } - - if (strv1[i] == NULL && strv2[i] == NULL) - return 0; - - if (strv1[i]) - return 1; - - return -1; -} - -static void -_gvalue_destroy (gpointer data) -{ - GValue *value = (GValue *) data; - - g_value_unset (value); - g_slice_free (GValue, value); -} - -static GValue * -_gvalue_dup (const GValue *value) -{ - GValue *dup; - - dup = g_slice_new0 (GValue); - g_value_init (dup, G_VALUE_TYPE (value)); - g_value_copy (value, dup); - - return dup; -} - -static void -iterate_collection (const GValue *value, gpointer user_data) -{ - GSList **list = (GSList **) user_data; - - *list = g_slist_prepend (*list, _gvalue_dup (value)); -} - -static int -_gvalues_compare_collection (const GValue *value1, const GValue *value2) -{ - int ret; - guint len1; - guint len2; - GType value_type = dbus_g_type_get_collection_specialization (G_VALUE_TYPE (value1)); - gsize element_size = 0; - - if (type_is_fixed_size (value_type, &element_size)) { - gpointer data1 = NULL; - gpointer data2 = NULL; - - dbus_g_type_collection_get_fixed ((GValue *) value1, &data1, &len1); - dbus_g_type_collection_get_fixed ((GValue *) value2, &data2, &len2); - - if (len1 != len2) - ret = len1 < len2 ? -1 : len1 > len2; - else - ret = memcmp (data1, data2, len1 * element_size); - } else { - GSList *list1 = NULL; - GSList *list2 = NULL; - - dbus_g_type_collection_value_iterate (value1, iterate_collection, &list1); - len1 = g_slist_length (list1); - dbus_g_type_collection_value_iterate (value2, iterate_collection, &list2); - len2 = g_slist_length (list2); - - if (len1 != len2) - ret = len1 < len2 ? -1 : len1 > len2; - else { - GSList *iter1; - GSList *iter2; - - for (iter1 = list1, iter2 = list2, ret = 0; - ret == 0 && iter1 && iter2; - iter1 = iter1->next, iter2 = iter2->next) - ret = _gvalues_compare ((GValue *) iter1->data, (GValue *) iter2->data); - } - - g_slist_free_full (list1, _gvalue_destroy); - g_slist_free_full (list2, _gvalue_destroy); - } - - return ret; -} - -static void -iterate_map (const GValue *key_val, - const GValue *value_val, - gpointer user_data) -{ - GHashTable **hash = (GHashTable **) user_data; - - g_hash_table_insert (*hash, g_value_dup_string (key_val), _gvalue_dup (value_val)); -} - -typedef struct { - GHashTable *hash2; - int ret; -} CompareMapInfo; - -static void -compare_one_map_item (gpointer key, gpointer val, gpointer user_data) -{ - CompareMapInfo *info = (CompareMapInfo *) user_data; - GValue *value2; - - if (info->ret) - return; - - value2 = (GValue *) g_hash_table_lookup (info->hash2, key); - if (value2) - info->ret = _gvalues_compare ((GValue *) val, value2); - else - info->ret = 1; -} - -static int -_gvalues_compare_map (const GValue *value1, const GValue *value2) -{ - GHashTable *hash1 = NULL; - GHashTable *hash2 = NULL; - guint len1; - guint len2; - int ret = 0; - - if (dbus_g_type_get_map_key_specialization (G_VALUE_TYPE (value1)) != G_TYPE_STRING) { - g_warning ("Can not compare maps with '%s' for keys", - g_type_name (dbus_g_type_get_map_key_specialization (G_VALUE_TYPE (value1)))); - return 0; - } - - hash1 = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, _gvalue_destroy); - dbus_g_type_map_value_iterate (value1, iterate_map, &hash1); - len1 = g_hash_table_size (hash1); - - hash2 = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, _gvalue_destroy); - dbus_g_type_map_value_iterate (value2, iterate_map, &hash2); - len2 = g_hash_table_size (hash2); - - if (len1 != len2) - ret = len1 < len2 ? -1 : len1 > len2; - else { - CompareMapInfo info; - - info.ret = 0; - info.hash2 = hash2; - g_hash_table_foreach (hash1, compare_one_map_item, &info); - ret = info.ret; - } - - g_hash_table_destroy (hash1); - g_hash_table_destroy (hash2); - - return ret; -} - -static int -_gvalue_ip6_address_compare (const GValue *value1, const GValue *value2) -{ - GValueArray *values1, *values2; - GValue *tmp_val; - GByteArray *addr1, *addr2; - guint32 prefix1, prefix2; - GByteArray *gw1, *gw2; - int ret = 0; - int i; - - /* IP6 addresses are GValueArrays (see nm-dbus-glib-types.h) */ - values1 = g_value_get_boxed (value1); - values2 = g_value_get_boxed (value2); - - /* Since they are NM IPv6 address structures, we expect both - * to contain two elements as specified in nm-dbus-glib-types.h. - */ - g_return_val_if_fail (values1->n_values == 3, 0); - g_return_val_if_fail (values2->n_values == 3, 0); - - /* First struct IPv6 address */ - tmp_val = g_value_array_get_nth (values1, 0); - addr1 = g_value_get_boxed (tmp_val); - /* First struct IPv6 prefix */ - tmp_val = g_value_array_get_nth (values1, 1); - prefix1 = g_value_get_uint (tmp_val); - /* First struct IPv6 gateway */ - tmp_val = g_value_array_get_nth (values1, 2); - gw1 = g_value_get_boxed (tmp_val); - - /* Second struct IPv6 address */ - tmp_val = g_value_array_get_nth (values2, 0); - addr2 = g_value_get_boxed (tmp_val); - /* Second struct IPv6 prefix */ - tmp_val = g_value_array_get_nth (values2, 1); - prefix2 = g_value_get_uint (tmp_val); - /* Second struct IPv6 gateway */ - tmp_val = g_value_array_get_nth (values2, 2); - gw2 = g_value_get_boxed (tmp_val); - - /* Compare IPv6 addresses */ - if (prefix1 != prefix2) - return prefix1 < prefix2 ? -1 : prefix1 > prefix2; - - if (!IN6_ARE_ADDR_EQUAL ((struct in6_addr *)addr1->data, (struct in6_addr *)addr2->data)) { - for (i = 0; ret == 0 && i < addr1->len; i++) - ret = addr1->data[i] < addr2->data[i] ? -1 : addr1->data[i] > addr2->data[i]; - } - - if (!IN6_ARE_ADDR_EQUAL ((struct in6_addr *) gw1->data, (struct in6_addr *) gw2->data)) { - for (i = 0; ret == 0 && i < gw1->len; i++) - ret = gw1->data[i] < gw2->data[i] ? -1 : gw1->data[i] > gw2->data[i]; - } - - return ret; -} - -static int -_gvalue_ip6_route_compare (const GValue *value1, const GValue *value2) -{ - GValueArray *values1, *values2; - GValue *tmp_val; - GByteArray *dest1, *dest2; - GByteArray *next_hop1, *next_hop2; - guint32 prefix1, prefix2; - guint32 metric1, metric2; - int ret = 0; - int i; - - /* IP6 routes are GValueArrays (see nm-dbus-glib-types.h) */ - values1 = g_value_get_boxed (value1); - values2 = g_value_get_boxed (value2); - - /* Since they are NM IPv6 route structures, we expect both - * to contain 4 elements as specified in nm-dbus-glib-types.h. - */ - g_return_val_if_fail (values1->n_values == 4, 0); - g_return_val_if_fail (values2->n_values == 4, 0); - - /* First struct IPv6 route */ - tmp_val = g_value_array_get_nth (values1, 0); - dest1 = g_value_get_boxed (tmp_val); - tmp_val = g_value_array_get_nth (values1, 1); - prefix1 = g_value_get_uint (tmp_val); - tmp_val = g_value_array_get_nth (values1, 2); - next_hop1 = g_value_get_boxed (tmp_val); - tmp_val = g_value_array_get_nth (values1, 3); - metric1 = g_value_get_uint (tmp_val); - - /* Second struct IPv6 route */ - tmp_val = g_value_array_get_nth (values2, 0); - dest2 = g_value_get_boxed (tmp_val); - tmp_val = g_value_array_get_nth (values2, 1); - prefix2 = g_value_get_uint (tmp_val); - tmp_val = g_value_array_get_nth (values2, 2); - next_hop2 = g_value_get_boxed (tmp_val); - tmp_val = g_value_array_get_nth (values2, 3); - metric2 = g_value_get_uint (tmp_val); - - /* Compare the routes */ - if (prefix1 != prefix2) - return prefix1 < prefix2 ? -1 : prefix1 > prefix2; - - if (!IN6_ARE_ADDR_EQUAL ((struct in6_addr *)dest1->data, (struct in6_addr *)dest2->data)) { - for (i = 0; ret == 0 && i < dest1->len; i++) - ret = dest1->data[i] < dest2->data[i] ? -1 : dest1->data[i] > dest2->data[i]; - } - - if (!IN6_ARE_ADDR_EQUAL ((struct in6_addr *)next_hop1->data, (struct in6_addr *)next_hop2->data)) { - for (i = 0; ret == 0 && i < next_hop1->len; i++) - ret = next_hop1->data[i] < next_hop2->data[i] ? -1 : next_hop1->data[i] > next_hop2->data[i]; - } - - if (metric1 != metric2) - ret = metric1 < metric2 ? -1 : metric1 > metric2; - - return ret; -} - -static int -_gvalues_compare_struct (const GValue *value1, const GValue *value2) -{ - /* value1 and value2 must contain the same type since - * _gvalues_compare() enforced that already. - */ - - if (G_VALUE_HOLDS (value1, DBUS_TYPE_G_IP6_ADDRESS)) { - return _gvalue_ip6_address_compare (value1, value2); - } else if (G_VALUE_HOLDS (value1, DBUS_TYPE_G_IP6_ROUTE)) { - return _gvalue_ip6_route_compare (value1, value2); - } else { - g_warning ("Don't know how to compare structures"); - return (value1 == value2); - } -} - -int -_gvalues_compare (const GValue *value1, const GValue *value2) -{ - GType type1; - GType type2; - int ret; - - if (value1 == value2) - return 0; - if (!value1) - return 1; - if (!value2) - return -1; - - type1 = G_VALUE_TYPE (value1); - type2 = G_VALUE_TYPE (value2); - - if (type1 != type2) - return type1 < type2 ? -1 : type1 > type2; - - if (type_is_fixed_size (type1, NULL)) - ret = _gvalues_compare_fixed (value1, value2); - else if (type1 == G_TYPE_STRING) - ret = _gvalues_compare_string (value1, value2); - else if (G_VALUE_HOLDS_BOXED (value1)) { - gpointer p1 = g_value_get_boxed (value1); - gpointer p2 = g_value_get_boxed (value2); - - if (p1 == p2) - ret = 0; /* Exactly the same values */ - else if (!p1) - ret = 1; /* The comparison functions below don't handle NULLs */ - else if (!p2) - ret = -1; /* The comparison functions below don't handle NULLs */ - else if (type1 == G_TYPE_STRV) - ret = _gvalues_compare_strv (value1, value2); - else if (dbus_g_type_is_collection (type1)) - ret = _gvalues_compare_collection (value1, value2); - else if (dbus_g_type_is_map (type1)) - ret = _gvalues_compare_map (value1, value2); - else if (dbus_g_type_is_struct (type1)) - ret = _gvalues_compare_struct (value1, value2); - else if (type1 == G_TYPE_VALUE) - ret = _gvalues_compare ((GValue *) g_value_get_boxed (value1), (GValue *) g_value_get_boxed (value2)); - else { - g_warning ("Don't know how to compare boxed types '%s'", g_type_name (type1)); - ret = value1 == value2; - } - } else { - g_warning ("Don't know how to compare types '%s'", g_type_name (type1)); - ret = value1 == value2; - } - - return ret; -} - -/*****************************************************************************/ - -static void -param_specialized_init (GParamSpec *pspec) -{ -} - -static void -param_specialized_set_default (GParamSpec *pspec, GValue *value) -{ - value->data[0].v_pointer = NULL; -} - -static gboolean -param_specialized_validate (GParamSpec *pspec, GValue *value) -{ - NMParamSpecSpecialized *sspec = NM_PARAM_SPEC_SPECIALIZED (pspec); - GType value_type = G_VALUE_TYPE (value); - gboolean changed = FALSE; - - if (!g_value_type_compatible (value_type, G_PARAM_SPEC_VALUE_TYPE (sspec))) { - g_value_reset (value); - changed = TRUE; - } - - return changed; -} - -static int -param_specialized_values_cmp (GParamSpec *pspec, - const GValue *value1, - const GValue *value2) -{ - return _gvalues_compare (value1, value2); -} - -GType -_nm_param_spec_specialized_get_type (void) -{ - static GType type; - - if (G_UNLIKELY (type) == 0) { - static const GParamSpecTypeInfo pspec_info = { - sizeof (NMParamSpecSpecialized), - 0, - param_specialized_init, - G_TYPE_OBJECT, /* value_type */ - NULL, /* finalize */ - param_specialized_set_default, - param_specialized_validate, - param_specialized_values_cmp, - }; - type = g_param_type_register_static ("NMParamSpecSpecialized", &pspec_info); - } - - return type; -} - -GParamSpec * -_nm_param_spec_specialized (const char *name, - const char *nick, - const char *blurb, - GType specialized_type, - GParamFlags flags) -{ - NMParamSpecSpecialized *pspec; - - g_return_val_if_fail (g_type_is_a (specialized_type, G_TYPE_BOXED), NULL); - - pspec = g_param_spec_internal (NM_TYPE_PARAM_SPEC_SPECIALIZED, - name, nick, blurb, flags); - - G_PARAM_SPEC (pspec)->value_type = specialized_type; - - return G_PARAM_SPEC (pspec); -} - -/*****************************************************************************/ -/* Tests */ - -#if 0 - -static void -compare_ints (void) -{ - GValue value1 = G_VALUE_INIT; - GValue value2 = G_VALUE_INIT; - - g_value_init (&value1, G_TYPE_INT); - g_value_init (&value2, G_TYPE_INT); - - g_value_set_int (&value1, 5); - g_value_set_int (&value2, 5); - g_print ("Comparing ints 5 and 5: %d\n", _gvalues_compare (&value1, &value2)); - - g_value_set_int (&value2, 10); - g_print ("Comparing ints 5 and 10: %d\n", _gvalues_compare (&value1, &value2)); - - g_value_set_int (&value2, 1); - g_print ("Comparing ints 5 and 1: %d\n", _gvalues_compare (&value1, &value2)); -} - -static void -compare_strings (void) -{ - GValue value1 = G_VALUE_INIT; - GValue value2 = G_VALUE_INIT; - const char *str1 = "hello"; - const char *str2 = "world"; - - g_value_init (&value1, G_TYPE_STRING); - g_value_init (&value2, G_TYPE_STRING); - - g_value_set_string (&value1, str1); - g_value_set_string (&value2, str1); - g_print ("Comparing identical strings: %d\n", _gvalues_compare (&value1, &value2)); - - g_value_set_string (&value2, str2); - g_print ("Comparing different strings: %d\n", _gvalues_compare (&value1, &value2)); -} - -static void -compare_strv (void) -{ - GValue value1 = G_VALUE_INIT; - GValue value2 = G_VALUE_INIT; - char *strv1[] = { "foo", "bar", "baz", NULL }; - char *strv2[] = { "foo", "bar", "bar", NULL }; - char *strv3[] = { "foo", "bar", NULL }; - char *strv4[] = { "foo", "bar", "baz", "bam", NULL }; - - g_value_init (&value1, G_TYPE_STRV); - g_value_init (&value2, G_TYPE_STRV); - - g_value_set_boxed (&value1, strv1); - g_value_set_boxed (&value2, strv1); - g_print ("Comparing identical strv's: %d\n", _gvalues_compare (&value1, &value2)); - - g_value_set_boxed (&value2, strv2); - g_print ("Comparing different strv's: %d\n", _gvalues_compare (&value1, &value2)); - - g_value_set_boxed (&value2, strv3); - g_print ("Comparing different len (smaller) strv's: %d\n", _gvalues_compare (&value1, &value2)); - - g_value_set_boxed (&value2, strv4); - g_print ("Comparing different len (longer) strv's: %d\n", _gvalues_compare (&value1, &value2)); -} - -static void -compare_garrays (void) -{ - GArray *array1; - GArray *array2; - GValue value1 = G_VALUE_INIT; - GValue value2 = G_VALUE_INIT; - int i; - - g_value_init (&value1, DBUS_TYPE_G_UINT_ARRAY); - array1 = g_array_new (FALSE, FALSE, sizeof (guint32)); - - g_value_init (&value2, DBUS_TYPE_G_UINT_ARRAY); - array2 = g_array_new (FALSE, FALSE, sizeof (guint32)); - - for (i = 0; i < 5; i++) { - g_array_append_val (array1, i); - g_array_append_val (array2, i); - } - - g_value_set_boxed (&value1, array1); - g_value_set_boxed (&value2, array2); - - g_print ("Comparing identical arrays's: %d\n", _gvalues_compare (&value1, &value2)); - - g_array_remove_index (array2, 0); - g_value_set_boxed (&value2, array2); - g_print ("Comparing different length arrays's: %d\n", _gvalues_compare (&value1, &value2)); - - i = 7; - g_array_prepend_val (array2, i); - g_value_set_boxed (&value2, array2); - g_print ("Comparing different arrays's: %d\n", _gvalues_compare (&value1, &value2)); -} - -static void -compare_ptrarrays (void) -{ - GPtrArray *array1; - GPtrArray *array2; - GValue value1 = G_VALUE_INIT; - GValue value2 = G_VALUE_INIT; - - g_value_init (&value1, dbus_g_type_get_collection ("GPtrArray", G_TYPE_STRING)); - array1 = g_ptr_array_new (); - - g_value_init (&value2, dbus_g_type_get_collection ("GPtrArray", G_TYPE_STRING)); - array2 = g_ptr_array_new (); - - g_ptr_array_add (array1, "hello"); - g_ptr_array_add (array1, "world"); - g_value_set_boxed (&value1, array1); - - g_ptr_array_add (array2, "hello"); - g_ptr_array_add (array2, "world"); - g_value_set_boxed (&value2, array2); - - g_print ("Comparing identical ptr arrays's: %d\n", _gvalues_compare (&value1, &value2)); - - g_ptr_array_add (array2, "boo"); - g_value_set_boxed (&value2, array2); - g_print ("Comparing different len ptr arrays's: %d\n", _gvalues_compare (&value1, &value2)); - - g_ptr_array_add (array1, "booz"); - g_value_set_boxed (&value1, array1); - g_print ("Comparing different ptr arrays's: %d\n", _gvalues_compare (&value1, &value2)); -} - -static void -compare_str_hash (void) -{ - GHashTable *hash1; - GHashTable *hash2; - GValue value1 = G_VALUE_INIT; - GValue value2 = G_VALUE_INIT; - - g_value_init (&value1, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_STRING)); - g_value_init (&value2, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_STRING)); - - hash1 = g_hash_table_new (g_str_hash, g_str_equal); - hash2 = g_hash_table_new (g_str_hash, g_str_equal); - - g_hash_table_insert (hash1, "key1", "hello"); - g_hash_table_insert (hash1, "key2", "world"); - - g_hash_table_insert (hash2, "key1", "hello"); - g_hash_table_insert (hash2, "key2", "world"); - - g_value_set_boxed (&value1, hash1); - g_value_set_boxed (&value2, hash2); - g_print ("Comparing identical str hashes: %d\n", _gvalues_compare (&value1, &value2)); - - g_hash_table_remove (hash2, "key2"); - g_value_set_boxed (&value2, hash2); - g_print ("Comparing different length str hashes: %d\n", _gvalues_compare (&value1, &value2)); - - g_hash_table_insert (hash2, "key2", "moon"); - g_value_set_boxed (&value2, hash2); - g_print ("Comparing different str hashes: %d\n", _gvalues_compare (&value1, &value2)); -} - -static GValue * -str_to_gvalue (const char *str) -{ - GValue *value; - - value = g_slice_new0 (GValue); - g_value_init (value, G_TYPE_STRING); - g_value_set_string (value, str); - - return value; -} - -static GValue * -int_to_gvalue (int i) -{ - GValue *value; - - value = g_slice_new0 (GValue); - g_value_init (value, G_TYPE_INT); - g_value_set_int (value, i); - - return value; -} - -static void -compare_gvalue_hash (void) -{ - GHashTable *hash1; - GHashTable *hash2; - GValue value1 = G_VALUE_INIT; - GValue value2 = G_VALUE_INIT; - - g_value_init (&value1, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE)); - g_value_init (&value2, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE)); - - hash1 = g_hash_table_new (g_str_hash, g_str_equal); - hash2 = g_hash_table_new (g_str_hash, g_str_equal); - - g_hash_table_insert (hash1, "key1", str_to_gvalue ("hello")); - g_hash_table_insert (hash1, "key2", int_to_gvalue (5)); - - g_hash_table_insert (hash2, "key1", str_to_gvalue ("hello")); - g_hash_table_insert (hash2, "key2", int_to_gvalue (5)); - - g_value_set_boxed (&value1, hash1); - g_value_set_boxed (&value2, hash2); - g_print ("Comparing identical gvalue hashes: %d\n", _gvalues_compare (&value1, &value2)); - - g_hash_table_remove (hash2, "key2"); - g_value_set_boxed (&value2, hash2); - g_print ("Comparing different length str hashes: %d\n", _gvalues_compare (&value1, &value2)); - - g_hash_table_insert (hash2, "key2", str_to_gvalue ("moon")); - g_value_set_boxed (&value2, hash2); - g_print ("Comparing different str hashes: %d\n", _gvalues_compare (&value1, &value2)); -} - -static void -compare_ip6_addresses (void) -{ - GValueArray *array1; - GValueArray *array2; - GValueArray *array3; - GByteArray *ba1; - GByteArray *ba2; - GByteArray *ba3; - GValue element = G_VALUE_INIT; - GValue value1 = G_VALUE_INIT; - GValue value2 = G_VALUE_INIT; - struct in6_addr addr1; - struct in6_addr addr2; - struct in6_addr addr3; - guint32 prefix1 = 64; - guint32 prefix2 = 64; - guint32 prefix3 = 0; - - inet_pton (AF_INET6, "1:2:3:4:5:6:7:8", &addr1, sizeof (struct in6_addr)); - inet_pton (AF_INET6, "ffff:2:3:4:5:6:7:8", &addr2, sizeof (struct in6_addr)); - inet_pton (AF_INET6, "::", &addr3, sizeof (struct in6_addr)); - - /* address 1 */ - ba1 = g_byte_array_new (); - array1 = g_value_array_new (2); - g_value_init (&element, DBUS_TYPE_G_UCHAR_ARRAY); - g_byte_array_append (ba1, (guint8 *) addr1.s6_addr, 16); - g_value_take_boxed (&element, ba1); - g_value_array_append (array1, &element); - g_value_unset (&element); - - g_value_init (&element, G_TYPE_UINT); - g_value_set_uint (&element, prefix1); - g_value_array_append (array1, &element); - g_value_unset (&element); - - /* address 2 */ - ba2 = g_byte_array_new (); - array2 = g_value_array_new (2); - g_value_init (&element, DBUS_TYPE_G_UCHAR_ARRAY); - g_byte_array_append (ba2, (guint8 *) addr2.s6_addr, 16); - g_value_take_boxed (&element, ba2); - g_value_array_append (array2, &element); - g_value_unset (&element); - - g_value_init (&element, G_TYPE_UINT); - g_value_set_uint (&element, prefix2); - g_value_array_append (array2, &element); - g_value_unset (&element); - - /* address 3 */ - ba3 = g_byte_array_new (); - array3 = g_value_array_new (2); - g_value_init (&element, DBUS_TYPE_G_UCHAR_ARRAY); - g_byte_array_append (ba3, (guint8 *) addr3.s6_addr, 16); - g_value_take_boxed (&element, ba3); - g_value_array_append (array3, &element); - g_value_unset (&element); - - g_value_init (&element, G_TYPE_UINT); - g_value_set_uint (&element, prefix3); - g_value_array_append (array3, &element); - g_value_unset (&element); - - g_value_init (&value1, DBUS_TYPE_G_IP6_ADDRESS); - g_value_init (&value2, DBUS_TYPE_G_IP6_ADDRESS); - - g_value_set_boxed (&value1, array1); - g_value_set_boxed (&value2, array1); - g_print ("Comparing identical IPv6 address structures: %d\n", _gvalues_compare (&value1, &value2)); - - g_value_set_boxed (&value1, array1); - g_value_set_boxed (&value2, array2); - g_print ("Comparing different IPv6 address structures: %d\n", _gvalues_compare (&value1, &value2)); - - g_value_set_boxed (&value1, array1); - g_value_set_boxed (&value2, array3); - g_print ("Comparing different IPv6 address structures: %d\n", _gvalues_compare (&value1, &value2)); -} - -int -main (int argc, char *argv[]) -{ - DBusGConnection *bus; - - bus = dbus_g_bus_get (DBUS_BUS_SESSION, NULL); - - compare_ints (); - compare_strings (); - compare_strv (); - compare_garrays (); - compare_ptrarrays (); - compare_str_hash (); - compare_gvalue_hash (); - compare_ip6_addresses (); - - return 0; -} - -#endif diff --git a/libnm-util/nm-param-spec-specialized.h b/libnm-util/nm-param-spec-specialized.h deleted file mode 100644 index 0c4b07e616..0000000000 --- a/libnm-util/nm-param-spec-specialized.h +++ /dev/null @@ -1,41 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#ifndef NM_PARAM_SPEC_SPECIALIZED_H -#define NM_PARAM_SPEC_SPECIALIZED_H - -typedef struct _NMParamSpecSpecialized NMParamSpecSpecialized; - -#define NM_TYPE_PARAM_SPEC_SPECIALIZED (_nm_param_spec_specialized_get_type ()) - -#define NM_IS_PARAM_SPEC_SPECIALIZED(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), NM_TYPE_PARAM_SPEC_SPECIALIZED)) -#define NM_PARAM_SPEC_SPECIALIZED(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), NM_TYPE_PARAM_SPEC_SPECIALIZED, NMParamSpecSpecialized)) - -GType _nm_param_spec_specialized_get_type (void); - -GParamSpec *_nm_param_spec_specialized (const char *name, - const char *nick, - const char *blurb, - GType specialized_type, - GParamFlags flags); - -#endif /* NM_PARAM_SPEC_SPECIALIZED_H */ diff --git a/libnm-util/nm-setting-8021x.c b/libnm-util/nm-setting-8021x.c deleted file mode 100644 index 805a5d25ad..0000000000 --- a/libnm-util/nm-setting-8021x.c +++ /dev/null @@ -1,3730 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2013 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#include "nm-default.h" - -#include "nm-setting-8021x.h" - -#include <string.h> -#include <dbus/dbus-glib.h> - -#include "nm-param-spec-specialized.h" -#include "nm-utils.h" -#include "nm-dbus-glib-types.h" -#include "crypto.h" -#include "nm-utils-private.h" -#include "nm-setting-private.h" - -/** - * SECTION:nm-setting-8021x - * @short_description: Describes 802.1x-authenticated connection properties - * @include: nm-setting-8021x.h - * - * The #NMSetting8021x object is a #NMSetting subclass that describes - * properties necessary for connection to 802.1x-authenticated networks, such as - * WPA and WPA2 Enterprise Wi-Fi networks and wired 802.1x networks. 802.1x - * connections typically use certificates and/or EAP authentication methods to - * securely verify, identify, and authenticate the client to the network itself, - * instead of simply relying on a widely shared static key. - * - * It's a good idea to read up on wpa_supplicant configuration before using this - * setting extensively, since most of the options here correspond closely with - * the relevant wpa_supplicant configuration options. - * - * Furthermore, to get a good idea of 802.1x, EAP, TLS, TTLS, etc and their - * applications to Wi-Fi and wired networks, you'll want to get copies of the - * following books. - * - * 802.11 Wireless Networks: The Definitive Guide, Second Edition - * Author: Matthew Gast - * ISBN: 978-0596100520 - * - * Cisco Wireless LAN Security - * Authors: Krishna Sankar, Sri Sundaralingam, Darrin Miller, and Andrew Balinsky - * ISBN: 978-1587051548 - **/ - -#define SCHEME_PATH "file://" - -/** - * nm_setting_802_1x_error_quark: - * - * Registers an error quark for #NMSetting8021x if necessary. - * - * Returns: the error quark used for #NMSetting8021x errors. - **/ -GQuark -nm_setting_802_1x_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-802-1x-error-quark"); - return quark; -} - -G_DEFINE_TYPE_WITH_CODE (NMSetting8021x, nm_setting_802_1x, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_802_1X_SETTING_NAME, - g_define_type_id, - 2, - NM_SETTING_802_1X_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_802_1X) - -#define NM_SETTING_802_1X_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_802_1X, NMSetting8021xPrivate)) - -G_STATIC_ASSERT ( (NM_SETTING_802_1X_CK_FORMAT_UNKNOWN == (NMSetting8021xCKFormat) NM_CRYPTO_FILE_FORMAT_UNKNOWN) ); -G_STATIC_ASSERT ( (NM_SETTING_802_1X_CK_FORMAT_X509 == (NMSetting8021xCKFormat) NM_CRYPTO_FILE_FORMAT_X509) ); -G_STATIC_ASSERT ( (NM_SETTING_802_1X_CK_FORMAT_RAW_KEY == (NMSetting8021xCKFormat) NM_CRYPTO_FILE_FORMAT_RAW_KEY) ); -G_STATIC_ASSERT ( (NM_SETTING_802_1X_CK_FORMAT_PKCS12 == (NMSetting8021xCKFormat) NM_CRYPTO_FILE_FORMAT_PKCS12) ); - -typedef struct { - GSList *eap; /* GSList of strings */ - char *identity; - char *anonymous_identity; - char *pac_file; - GByteArray *ca_cert; - char *ca_path; - char *subject_match; - GSList *altsubject_matches; - GByteArray *client_cert; - char *phase1_peapver; - char *phase1_peaplabel; - char *phase1_fast_provisioning; - char *phase2_auth; - char *phase2_autheap; - GByteArray *phase2_ca_cert; - char *phase2_ca_path; - char *phase2_subject_match; - GSList *phase2_altsubject_matches; - GByteArray *phase2_client_cert; - char *password; - NMSettingSecretFlags password_flags; - GByteArray *password_raw; - NMSettingSecretFlags password_raw_flags; - char *pin; - NMSettingSecretFlags pin_flags; - GByteArray *private_key; - char *private_key_password; - NMSettingSecretFlags private_key_password_flags; - GByteArray *phase2_private_key; - char *phase2_private_key_password; - NMSettingSecretFlags phase2_private_key_password_flags; - gboolean system_ca_certs; -} NMSetting8021xPrivate; - -enum { - PROP_0, - PROP_EAP, - PROP_IDENTITY, - PROP_ANONYMOUS_IDENTITY, - PROP_PAC_FILE, - PROP_CA_CERT, - PROP_CA_PATH, - PROP_SUBJECT_MATCH, - PROP_ALTSUBJECT_MATCHES, - PROP_CLIENT_CERT, - PROP_PHASE1_PEAPVER, - PROP_PHASE1_PEAPLABEL, - PROP_PHASE1_FAST_PROVISIONING, - PROP_PHASE2_AUTH, - PROP_PHASE2_AUTHEAP, - PROP_PHASE2_CA_CERT, - PROP_PHASE2_CA_PATH, - PROP_PHASE2_SUBJECT_MATCH, - PROP_PHASE2_ALTSUBJECT_MATCHES, - PROP_PHASE2_CLIENT_CERT, - PROP_PASSWORD, - PROP_PASSWORD_FLAGS, - PROP_PASSWORD_RAW, - PROP_PASSWORD_RAW_FLAGS, - PROP_PRIVATE_KEY, - PROP_PRIVATE_KEY_PASSWORD, - PROP_PRIVATE_KEY_PASSWORD_FLAGS, - PROP_PHASE2_PRIVATE_KEY, - PROP_PHASE2_PRIVATE_KEY_PASSWORD, - PROP_PHASE2_PRIVATE_KEY_PASSWORD_FLAGS, - PROP_PIN, - PROP_PIN_FLAGS, - PROP_SYSTEM_CA_CERTS, - - LAST_PROP -}; - -/** - * nm_setting_802_1x_new: - * - * Creates a new #NMSetting8021x object with default values. - * - * Returns: the new empty #NMSetting8021x object - **/ -NMSetting * -nm_setting_802_1x_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_802_1X, NULL); -} - -/** - * nm_setting_802_1x_get_num_eap_methods: - * @setting: the #NMSetting8021x - * - * Returns the number of eap methods allowed for use when connecting to the - * network. Generally only one EAP method is used. Use the functions - * nm_setting_802_1x_get_eap_method(), nm_setting_802_1x_add_eap_method(), - * and nm_setting_802_1x_remove_eap_method() for adding, removing, and retrieving - * allowed EAP methods. - * - * Returns: the number of allowed EAP methods - **/ -guint32 -nm_setting_802_1x_get_num_eap_methods (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), 0); - - return g_slist_length (NM_SETTING_802_1X_GET_PRIVATE (setting)->eap); -} - -/** - * nm_setting_802_1x_get_eap_method: - * @setting: the #NMSetting8021x - * @i: the index of the EAP method name to return - * - * Returns the name of the allowed EAP method at index @i. - * - * Returns: the name of the allowed EAP method at index @i - **/ -const char * -nm_setting_802_1x_get_eap_method (NMSetting8021x *setting, guint32 i) -{ - NMSetting8021xPrivate *priv; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - priv = NM_SETTING_802_1X_GET_PRIVATE (setting); - g_return_val_if_fail (i <= g_slist_length (priv->eap), NULL); - - return (const char *) g_slist_nth_data (priv->eap, i); -} - -/** - * nm_setting_802_1x_add_eap_method: - * @setting: the #NMSetting8021x - * @eap: the name of the EAP method to allow for this connection - * - * Adds an allowed EAP method. The setting is not valid until at least one - * EAP method has been added. See #NMSetting8021x:eap property for a list of - * allowed EAP methods. - * - * Returns: %TRUE if the EAP method was successfully added, %FALSE if it was - * not a valid method or if it was already allowed. - **/ -gboolean -nm_setting_802_1x_add_eap_method (NMSetting8021x *setting, const char *eap) -{ - NMSetting8021xPrivate *priv; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), FALSE); - g_return_val_if_fail (eap != NULL, FALSE); - - priv = NM_SETTING_802_1X_GET_PRIVATE (setting); - for (iter = priv->eap; iter; iter = g_slist_next (iter)) { - if (!strcmp (eap, (char *) iter->data)) - return FALSE; - } - - priv->eap = g_slist_append (priv->eap, g_ascii_strdown (eap, -1)); - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_EAP); - return TRUE; -} - -/** - * nm_setting_802_1x_remove_eap_method: - * @setting: the #NMSetting8021x - * @i: the index of the EAP method to remove - * - * Removes the allowed EAP method at the specified index. - **/ -void -nm_setting_802_1x_remove_eap_method (NMSetting8021x *setting, guint32 i) -{ - NMSetting8021xPrivate *priv; - GSList *elt; - - g_return_if_fail (NM_IS_SETTING_802_1X (setting)); - - priv = NM_SETTING_802_1X_GET_PRIVATE (setting); - elt = g_slist_nth (priv->eap, i); - g_return_if_fail (elt != NULL); - - g_free (elt->data); - priv->eap = g_slist_delete_link (priv->eap, elt); - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_EAP); -} - -/** - * nm_setting_802_1x_remove_eap_method_by_value: - * @setting: the #NMSetting8021x - * @eap: the name of the EAP method to remove - * - * Removes the allowed EAP method @method. - * - * Returns: %TRUE if the EAP method was founs and removed, %FALSE if it was not. - * - * Since: 0.9.10 - **/ -gboolean -nm_setting_802_1x_remove_eap_method_by_value (NMSetting8021x *setting, - const char *eap) -{ - NMSetting8021xPrivate *priv; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), FALSE); - g_return_val_if_fail (eap != NULL, FALSE); - - priv = NM_SETTING_802_1X_GET_PRIVATE (setting); - for (iter = priv->eap; iter; iter = g_slist_next (iter)) { - if (!strcmp (eap, (char *) iter->data)) { - priv->eap = g_slist_delete_link (priv->eap, iter); - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_EAP); - return TRUE; - } - } - return FALSE; -} - -/** - * nm_setting_802_1x_clear_eap_methods: - * @setting: the #NMSetting8021x - * - * Clears all allowed EAP methods. - **/ -void -nm_setting_802_1x_clear_eap_methods (NMSetting8021x *setting) -{ - NMSetting8021xPrivate *priv; - - g_return_if_fail (NM_IS_SETTING_802_1X (setting)); - - priv = NM_SETTING_802_1X_GET_PRIVATE (setting); - g_slist_free_full (priv->eap, g_free); - priv->eap = NULL; - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_EAP); -} - -/** - * nm_setting_802_1x_get_identity: - * @setting: the #NMSetting8021x - * - * Returns the identifier used by some EAP methods (like TLS) to - * authenticate the user. Often this is a username or login name. - * - * Returns: the user identifier - **/ -const char * -nm_setting_802_1x_get_identity (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->identity; -} - -/** - * nm_setting_802_1x_get_anonymous_identity: - * @setting: the #NMSetting8021x - * - * Returns the anonymous identifier used by some EAP methods (like TTLS) to - * authenticate the user in the outer unencrypted "phase 1" authentication. The - * inner "phase 2" authentication will use the #NMSetting8021x:identity in - * a secure form, if applicable for that EAP method. - * - * Returns: the anonymous identifier - **/ -const char * -nm_setting_802_1x_get_anonymous_identity (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->anonymous_identity; -} - -/** - * nm_setting_802_1x_get_pac_file: - * @setting: the #NMSetting8021x - * - * Returns the file containing PAC credentials used by EAP-FAST method. - * - * Returns: the PAC file - **/ -const char * -nm_setting_802_1x_get_pac_file (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->pac_file; -} - -/** - * nm_setting_802_1x_get_ca_path: - * @setting: the #NMSetting8021x - * - * Returns the path of the CA certificate directory if previously set. Systems - * will often have a directory that contains multiple individual CA certificates - * which the supplicant can then add to the verification chain. This may be - * used in addition to the #NMSetting8021x:ca-cert property to add more CA - * certificates for verifying the network to client. - * - * Returns: the CA certificate directory path - **/ -const char * -nm_setting_802_1x_get_ca_path (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->ca_path; -} - -/** - * nm_setting_802_1x_get_system_ca_certs: - * @setting: the #NMSetting8021x - * - * Sets the #NMSetting8021x:system-ca-certs property. The - * #NMSetting8021x:ca-path and #NMSetting8021x:phase2-ca-path - * properties are ignored if the #NMSetting8021x:system-ca-certs property is - * %TRUE, in which case a system-wide CA certificate directory specified at - * compile time (using the --system-ca-path configure option) is used in place - * of these properties. - * - * Returns: %TRUE if a system CA certificate path should be used, %FALSE if not - **/ -gboolean -nm_setting_802_1x_get_system_ca_certs (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), FALSE); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->system_ca_certs; -} - -static NMSetting8021xCKScheme -get_cert_scheme (GByteArray *array) -{ - if (!array || !array->len) - return NM_SETTING_802_1X_CK_SCHEME_UNKNOWN; - - /* interpret the blob as PATH if it starts with "file://". */ - if ( array->len >= NM_STRLEN (SCHEME_PATH) - && !memcmp (array->data, SCHEME_PATH, NM_STRLEN (SCHEME_PATH))) { - /* But it must also be NUL terminated, contain at least - * one non-NUL character, and contain only one trailing NUL - * character. - * And ensure it's UTF-8 valid too so we can pass it through - * D-Bus and stuff like that. */ - if ( array->len > NM_STRLEN (SCHEME_PATH) + 1 - && array->data[array->len - 1] == '\0' - && g_utf8_validate ((const char *) &array->data[NM_STRLEN (SCHEME_PATH)], array->len - (NM_STRLEN (SCHEME_PATH) + 1), NULL)) - return NM_SETTING_802_1X_CK_SCHEME_PATH; - return NM_SETTING_802_1X_CK_SCHEME_UNKNOWN; - } - - return NM_SETTING_802_1X_CK_SCHEME_BLOB; -} - -static GByteArray * -load_and_verify_certificate (const char *cert_path, - NMSetting8021xCKScheme scheme, - NMCryptoFileFormat *out_file_format, - GError **error) -{ - NMCryptoFileFormat format = NM_CRYPTO_FILE_FORMAT_UNKNOWN; - GByteArray *array; - - array = crypto_load_and_verify_certificate (cert_path, &format, error); - - if (!array || !array->len || format == NM_CRYPTO_FILE_FORMAT_UNKNOWN) - format = NM_CRYPTO_FILE_FORMAT_UNKNOWN; - else if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) { - /* If we load the file as blob, we must ensure that the binary data does not - * start with file://. NMSetting8021x cannot represent blobs that start with - * file://. - * If that's the case, coerce the format to UNKNOWN. The callers will take care - * of that and not set the blob. */ - if (get_cert_scheme (array) != NM_SETTING_802_1X_CK_SCHEME_BLOB) - format = NM_CRYPTO_FILE_FORMAT_UNKNOWN; - } - - if (out_file_format) - *out_file_format = format; - return array; -} - -/** - * nm_setting_802_1x_get_ca_cert_scheme: - * @setting: the #NMSetting8021x - * - * Returns the scheme used to store the CA certificate. If the returned scheme - * is %NM_SETTING_802_1X_CK_SCHEME_BLOB, use nm_setting_802_1x_get_ca_cert_blob(); - * if %NM_SETTING_802_1X_CK_SCHEME_PATH, use nm_setting_802_1x_get_ca_cert_path(). - * - * Returns: scheme used to store the CA certificate (blob or path) - **/ -NMSetting8021xCKScheme -nm_setting_802_1x_get_ca_cert_scheme (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NM_SETTING_802_1X_CK_SCHEME_UNKNOWN); - - return get_cert_scheme (NM_SETTING_802_1X_GET_PRIVATE (setting)->ca_cert); -} - -/** - * nm_setting_802_1x_get_ca_cert_blob: - * @setting: the #NMSetting8021x - * - * Returns the CA certificate blob if the CA certificate is stored using the - * %NM_SETTING_802_1X_CK_SCHEME_BLOB scheme. Not all EAP methods use a - * CA certificate (LEAP for example), and those that can take advantage of the - * CA certificate allow it to be unset. Note that lack of a CA certificate - * reduces security by allowing man-in-the-middle attacks, because the identity - * of the network cannot be confirmed by the client. - * - * Returns: the CA certificate data - **/ -const GByteArray * -nm_setting_802_1x_get_ca_cert_blob (NMSetting8021x *setting) -{ - NMSetting8021xCKScheme scheme; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - scheme = nm_setting_802_1x_get_ca_cert_scheme (setting); - g_return_val_if_fail (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB, NULL); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->ca_cert; -} - -/** - * nm_setting_802_1x_get_ca_cert_path: - * @setting: the #NMSetting8021x - * - * Returns the CA certificate path if the CA certificate is stored using the - * %NM_SETTING_802_1X_CK_SCHEME_PATH scheme. Not all EAP methods use a - * CA certificate (LEAP for example), and those that can take advantage of the - * CA certificate allow it to be unset. Note that lack of a CA certificate - * reduces security by allowing man-in-the-middle attacks, because the identity - * of the network cannot be confirmed by the client. - * - * Returns: path to the CA certificate file - **/ -const char * -nm_setting_802_1x_get_ca_cert_path (NMSetting8021x *setting) -{ - NMSetting8021xCKScheme scheme; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - scheme = nm_setting_802_1x_get_ca_cert_scheme (setting); - g_return_val_if_fail (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH, NULL); - - return (const char *) (NM_SETTING_802_1X_GET_PRIVATE (setting)->ca_cert->data + strlen (SCHEME_PATH)); -} - -static GByteArray * -path_to_scheme_value (const char *path) -{ - GByteArray *array; - gsize len; - - g_return_val_if_fail (path != NULL && path[0], NULL); - - len = strlen (path); - - /* Add the path scheme tag to the front, then the filename */ - array = g_byte_array_sized_new (len + strlen (SCHEME_PATH) + 1); - g_byte_array_append (array, (const guint8 *) SCHEME_PATH, strlen (SCHEME_PATH)); - g_byte_array_append (array, (const guint8 *) path, len); - g_byte_array_append (array, (const guint8 *) "\0", 1); - return array; -} - -/** - * nm_setting_802_1x_set_ca_cert: - * @setting: the #NMSetting8021x - * @cert_path: when @scheme is set to either %NM_SETTING_802_1X_CK_SCHEME_PATH - * or %NM_SETTING_802_1X_CK_SCHEME_BLOB, pass the path of the CA certificate - * file (PEM or DER format). The path must be UTF-8 encoded; use - * g_filename_to_utf8() to convert if needed. Passing %NULL with any @scheme - * clears the CA certificate. - * @scheme: desired storage scheme for the certificate - * @out_format: on successful return, the type of the certificate added - * @error: on unsuccessful return, an error - * - * Reads a certificate from disk and sets the #NMSetting8021x:ca-cert property - * with the raw certificate data if using the %NM_SETTING_802_1X_CK_SCHEME_BLOB - * scheme, or with the path to the certificate file if using the - * %NM_SETTING_802_1X_CK_SCHEME_PATH scheme. - * - * Returns: %TRUE if the operation succeeded, %FALSE if it was unsuccessful - **/ -gboolean -nm_setting_802_1x_set_ca_cert (NMSetting8021x *setting, - const char *cert_path, - NMSetting8021xCKScheme scheme, - NMSetting8021xCKFormat *out_format, - GError **error) -{ - NMSetting8021xPrivate *priv; - NMCryptoFileFormat format = NM_CRYPTO_FILE_FORMAT_UNKNOWN; - GByteArray *data; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), FALSE); - - if (cert_path) { - g_return_val_if_fail (g_utf8_validate (cert_path, -1, NULL), FALSE); - g_return_val_if_fail ( scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB - || scheme == NM_SETTING_802_1X_CK_SCHEME_PATH, - FALSE); - } - - if (out_format) - g_return_val_if_fail (*out_format == NM_SETTING_802_1X_CK_FORMAT_UNKNOWN, FALSE); - - priv = NM_SETTING_802_1X_GET_PRIVATE (setting); - - /* Clear out any previous ca_cert blob */ - if (priv->ca_cert) { - g_byte_array_free (priv->ca_cert, TRUE); - priv->ca_cert = NULL; - } - - if (!cert_path) { - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_CA_CERT); - return TRUE; - } - - data = load_and_verify_certificate (cert_path, scheme, &format, error); - if (data) { - /* wpa_supplicant can only use raw x509 CA certs */ - if (format == NM_CRYPTO_FILE_FORMAT_X509) { - if (out_format) - *out_format = NM_SETTING_802_1X_CK_FORMAT_X509; - - if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) - priv->ca_cert = g_byte_array_ref (data); - else if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH) - priv->ca_cert = path_to_scheme_value (cert_path); - else - g_assert_not_reached (); - } else { - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, - _("CA certificate must be in X.509 format")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_CA_CERT); - } - g_byte_array_unref (data); - } - - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_CA_CERT); - return priv->ca_cert != NULL; -} - -/** - * nm_setting_802_1x_get_subject_match: - * @setting: the #NMSetting8021x - * - * Returns: the #NMSetting8021x:subject-match property. This is the - * substring to be matched against the subject of the authentication - * server certificate, or %NULL no subject verification is to be - * performed. - **/ -const char * -nm_setting_802_1x_get_subject_match (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->subject_match; -} - -/** - * nm_setting_802_1x_get_num_altsubject_matches: - * @setting: the #NMSetting8021x - * - * Returns the number of entries in the - * #NMSetting8021x:altsubject-matches property of this setting. - * - * Returns: the number of altsubject-matches entries. - **/ -guint32 -nm_setting_802_1x_get_num_altsubject_matches (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), 0); - - return g_slist_length (NM_SETTING_802_1X_GET_PRIVATE (setting)->altsubject_matches); -} - -/** - * nm_setting_802_1x_get_altsubject_match: - * @setting: the #NMSettingConnection - * @i: the zero-based index of the array of altSubjectName matches - * - * Returns the altSubjectName match at index @i. - * - * Returns: the altSubjectName match at index @i - **/ -const char * -nm_setting_802_1x_get_altsubject_match (NMSetting8021x *setting, guint32 i) -{ - NMSetting8021xPrivate *priv; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - priv = NM_SETTING_802_1X_GET_PRIVATE (setting); - g_return_val_if_fail (i <= g_slist_length (priv->altsubject_matches), NULL); - - return (const char *) g_slist_nth_data (priv->altsubject_matches, i); -} - -/** - * nm_setting_802_1x_add_altsubject_match: - * @setting: the #NMSetting8021x - * @altsubject_match: the altSubjectName to allow for this connection - * - * Adds an allowed alternate subject name match. Until at least one - * match is added, the altSubjectName of the remote authentication - * server is not verified. - * - * Returns: %TRUE if the alternative subject name match was - * successfully added, %FALSE if it was already allowed. - **/ -gboolean -nm_setting_802_1x_add_altsubject_match (NMSetting8021x *setting, - const char *altsubject_match) -{ - NMSetting8021xPrivate *priv; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), FALSE); - g_return_val_if_fail (altsubject_match != NULL, FALSE); - - priv = NM_SETTING_802_1X_GET_PRIVATE (setting); - for (iter = priv->altsubject_matches; iter; iter = g_slist_next (iter)) { - if (!strcmp (altsubject_match, (char *) iter->data)) - return FALSE; - } - - priv->altsubject_matches = g_slist_append (priv->altsubject_matches, - g_strdup (altsubject_match)); - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_ALTSUBJECT_MATCHES); - return TRUE; -} - -/** - * nm_setting_802_1x_remove_altsubject_match: - * @setting: the #NMSetting8021x - * @i: the index of the altSubjectName match to remove - * - * Removes the allowed altSubjectName at the specified index. - **/ -void -nm_setting_802_1x_remove_altsubject_match (NMSetting8021x *setting, guint32 i) -{ - NMSetting8021xPrivate *priv; - GSList *elt; - - g_return_if_fail (NM_IS_SETTING_802_1X (setting)); - - priv = NM_SETTING_802_1X_GET_PRIVATE (setting); - elt = g_slist_nth (priv->altsubject_matches, i); - g_return_if_fail (elt != NULL); - - g_free (elt->data); - priv->altsubject_matches = g_slist_delete_link (priv->altsubject_matches, elt); - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_ALTSUBJECT_MATCHES); -} - -/** - * nm_setting_802_1x_remove_altsubject_match_by_value: - * @setting: the #NMSetting8021x - * @altsubject_match: the altSubjectName to remove - * - * Removes the allowed altSubjectName @altsubject_match. - * - * Returns: %TRUE if the alternative subject name match was found and removed, - * %FALSE if it was not. - * - * Since: 0.9.10 - **/ -gboolean -nm_setting_802_1x_remove_altsubject_match_by_value (NMSetting8021x *setting, - const char *altsubject_match) -{ - NMSetting8021xPrivate *priv; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), FALSE); - g_return_val_if_fail (altsubject_match != NULL, FALSE); - - priv = NM_SETTING_802_1X_GET_PRIVATE (setting); - for (iter = priv->altsubject_matches; iter; iter = g_slist_next (iter)) { - if (!strcmp (altsubject_match, (char *) iter->data)) { - priv->altsubject_matches = g_slist_delete_link (priv->altsubject_matches, iter); - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_ALTSUBJECT_MATCHES); - return TRUE; - } - } - return FALSE; -} - -/** - * nm_setting_802_1x_clear_altsubject_matches: - * @setting: the #NMSetting8021x - * - * Clears all altSubjectName matches. - **/ -void -nm_setting_802_1x_clear_altsubject_matches (NMSetting8021x *setting) -{ - NMSetting8021xPrivate *priv; - - g_return_if_fail (NM_IS_SETTING_802_1X (setting)); - - priv = NM_SETTING_802_1X_GET_PRIVATE (setting); - g_slist_free_full (priv->altsubject_matches, g_free); - priv->altsubject_matches = NULL; - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_ALTSUBJECT_MATCHES); -} - -/** - * nm_setting_802_1x_get_client_cert_scheme: - * @setting: the #NMSetting8021x - * - * Returns the scheme used to store the client certificate. If the returned scheme - * is %NM_SETTING_802_1X_CK_SCHEME_BLOB, use nm_setting_802_1x_get_client_cert_blob(); - * if %NM_SETTING_802_1X_CK_SCHEME_PATH, use nm_setting_802_1x_get_client_cert_path(). - * - * Returns: scheme used to store the client certificate (blob or path) - **/ -NMSetting8021xCKScheme -nm_setting_802_1x_get_client_cert_scheme (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NM_SETTING_802_1X_CK_SCHEME_UNKNOWN); - - return get_cert_scheme (NM_SETTING_802_1X_GET_PRIVATE (setting)->client_cert); -} - -/** - * nm_setting_802_1x_get_client_cert_blob: - * @setting: the #NMSetting8021x - * - * Client certificates are used to identify the connecting client to the network - * when EAP-TLS is used as either the "phase 1" or "phase 2" 802.1x - * authentication method. - * - * Returns: the client certificate data - **/ -const GByteArray * -nm_setting_802_1x_get_client_cert_blob (NMSetting8021x *setting) -{ - NMSetting8021xCKScheme scheme; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - scheme = nm_setting_802_1x_get_client_cert_scheme (setting); - g_return_val_if_fail (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB, NULL); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->client_cert; -} - -/** - * nm_setting_802_1x_get_client_cert_path: - * @setting: the #NMSetting8021x - * - * Client certificates are used to identify the connecting client to the network - * when EAP-TLS is used as either the "phase 1" or "phase 2" 802.1x - * authentication method. - * - * Returns: path to the client certificate file - **/ -const char * -nm_setting_802_1x_get_client_cert_path (NMSetting8021x *setting) -{ - NMSetting8021xCKScheme scheme; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - scheme = nm_setting_802_1x_get_client_cert_scheme (setting); - g_return_val_if_fail (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH, NULL); - - return (const char *) (NM_SETTING_802_1X_GET_PRIVATE (setting)->client_cert->data + strlen (SCHEME_PATH)); -} - -/** - * nm_setting_802_1x_set_client_cert: - * @setting: the #NMSetting8021x - * @cert_path: when @scheme is set to either %NM_SETTING_802_1X_CK_SCHEME_PATH - * or %NM_SETTING_802_1X_CK_SCHEME_BLOB, pass the path of the client - * certificate file (PEM, DER, or PKCS#<!-- -->12 format). The path must be UTF-8 - * encoded; use g_filename_to_utf8() to convert if needed. Passing %NULL with - * any @scheme clears the client certificate. - * @scheme: desired storage scheme for the certificate - * @out_format: on successful return, the type of the certificate added - * @error: on unsuccessful return, an error - * - * Reads a certificate from disk and sets the #NMSetting8021x:client-cert - * property with the raw certificate data if using the - * %NM_SETTING_802_1X_CK_SCHEME_BLOB scheme, or with the path to the certificate - * file if using the %NM_SETTING_802_1X_CK_SCHEME_PATH scheme. - * - * Client certificates are used to identify the connecting client to the network - * when EAP-TLS is used as either the "phase 1" or "phase 2" 802.1x - * authentication method. - * - * Returns: %TRUE if the operation succeeded, %FALSE if it was unsuccessful - **/ -gboolean -nm_setting_802_1x_set_client_cert (NMSetting8021x *setting, - const char *cert_path, - NMSetting8021xCKScheme scheme, - NMSetting8021xCKFormat *out_format, - GError **error) -{ - NMSetting8021xPrivate *priv; - NMCryptoFileFormat format = NM_CRYPTO_FILE_FORMAT_UNKNOWN; - GByteArray *data; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), FALSE); - - if (cert_path) { - g_return_val_if_fail (g_utf8_validate (cert_path, -1, NULL), FALSE); - g_return_val_if_fail ( scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB - || scheme == NM_SETTING_802_1X_CK_SCHEME_PATH, - FALSE); - } - - if (out_format) - g_return_val_if_fail (*out_format == NM_SETTING_802_1X_CK_FORMAT_UNKNOWN, FALSE); - - priv = NM_SETTING_802_1X_GET_PRIVATE (setting); - - /* Clear out any previous ca_cert blob */ - if (priv->client_cert) { - g_byte_array_free (priv->client_cert, TRUE); - priv->client_cert = NULL; - } - - if (!cert_path) { - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_CLIENT_CERT); - return TRUE; - } - - data = load_and_verify_certificate (cert_path, scheme, &format, error); - if (data) { - gboolean valid = FALSE; - - switch (format) { - case NM_CRYPTO_FILE_FORMAT_X509: - if (out_format) - *out_format = NM_SETTING_802_1X_CK_FORMAT_X509; - valid = TRUE; - break; - case NM_CRYPTO_FILE_FORMAT_PKCS12: - if (out_format) - *out_format = NM_SETTING_802_1X_CK_FORMAT_PKCS12; - valid = TRUE; - break; - default: - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, - _("invalid certificate format")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_CLIENT_CERT); - break; - } - - if (valid) { - if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) - priv->client_cert = g_byte_array_ref (data); - else if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH) - priv->client_cert = path_to_scheme_value (cert_path); - else - g_assert_not_reached (); - } - g_byte_array_unref (data); - } - - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_CLIENT_CERT); - return priv->client_cert != NULL; -} - -/** - * nm_setting_802_1x_get_phase1_peapver: - * @setting: the #NMSetting8021x - * - * Returns: the "phase 1" PEAP version to be used when authenticating with - * EAP-PEAP as contained in the #NMSetting8021x:phase1-peapver property. Valid - * values are %NULL (unset), "0" (PEAP version 0), and "1" (PEAP version 1). - **/ -const char * -nm_setting_802_1x_get_phase1_peapver (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->phase1_peapver; -} - -/** - * nm_setting_802_1x_get_phase1_peaplabel: - * @setting: the #NMSetting8021x - * - * Returns: whether the "phase 1" PEAP label is new-style or old-style, to be - * used when authenticating with EAP-PEAP, as contained in the - * #NMSetting8021x:phase1-peaplabel property. Valid values are %NULL (unset), - * "0" (use old-style label), and "1" (use new-style label). See the - * wpa_supplicant documentation for more details. - **/ -const char * -nm_setting_802_1x_get_phase1_peaplabel (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->phase1_peaplabel; -} - -/** - * nm_setting_802_1x_get_phase1_fast_provisioning: - * @setting: the #NMSetting8021x - * - * Returns: whether "phase 1" PEAP fast provisioning should be used, as specified - * by the #NMSetting8021x:phase1-fast-provisioning property. See the - * wpa_supplicant documentation for more details. - **/ -const char * -nm_setting_802_1x_get_phase1_fast_provisioning (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->phase1_fast_provisioning; -} - -/** - * nm_setting_802_1x_get_phase2_auth: - * @setting: the #NMSetting8021x - * - * Returns: the "phase 2" non-EAP (ex MD5) allowed authentication method as - * specified by the #NMSetting8021x:phase2-auth property. - **/ -const char * -nm_setting_802_1x_get_phase2_auth (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->phase2_auth; -} - -/** - * nm_setting_802_1x_get_phase2_autheap: - * @setting: the #NMSetting8021x - * - * Returns: the "phase 2" EAP-based (ex TLS) allowed authentication method as - * specified by the #NMSetting8021x:phase2-autheap property. - **/ -const char * -nm_setting_802_1x_get_phase2_autheap (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->phase2_autheap; -} - -/** - * nm_setting_802_1x_get_phase2_ca_path: - * @setting: the #NMSetting8021x - * - * Returns the path of the "phase 2" CA certificate directory if previously set. - * Systems will often have a directory that contains multiple individual CA - * certificates which the supplicant can then add to the verification chain. - * This may be used in addition to the #NMSetting8021x:phase2-ca-cert property - * to add more CA certificates for verifying the network to client. - * - * Returns: the "phase 2" CA certificate directory path - **/ -const char * -nm_setting_802_1x_get_phase2_ca_path (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->phase2_ca_path; -} - -/** - * nm_setting_802_1x_get_phase2_ca_cert_scheme: - * @setting: the #NMSetting8021x - * - * Returns the scheme used to store the "phase 2" CA certificate. If the - * returned scheme is %NM_SETTING_802_1X_CK_SCHEME_BLOB, use - * nm_setting_802_1x_get_ca_cert_blob(); if %NM_SETTING_802_1X_CK_SCHEME_PATH, - * use nm_setting_802_1x_get_ca_cert_path(). - * - * Returns: scheme used to store the "phase 2" CA certificate (blob or path) - **/ -NMSetting8021xCKScheme -nm_setting_802_1x_get_phase2_ca_cert_scheme (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NM_SETTING_802_1X_CK_SCHEME_UNKNOWN); - - return get_cert_scheme (NM_SETTING_802_1X_GET_PRIVATE (setting)->phase2_ca_cert); -} - -/** - * nm_setting_802_1x_get_phase2_ca_cert_blob: - * @setting: the #NMSetting8021x - * - * Returns the "phase 2" CA certificate blob if the CA certificate is stored - * using the %NM_SETTING_802_1X_CK_SCHEME_BLOB scheme. Not all EAP methods use - * a CA certificate (LEAP for example), and those that can take advantage of the - * CA certificate allow it to be unset. Note that lack of a CA certificate - * reduces security by allowing man-in-the-middle attacks, because the identity - * of the network cannot be confirmed by the client. - * - * Returns: the "phase 2" CA certificate data - **/ -const GByteArray * -nm_setting_802_1x_get_phase2_ca_cert_blob (NMSetting8021x *setting) -{ - NMSetting8021xCKScheme scheme; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - scheme = nm_setting_802_1x_get_phase2_ca_cert_scheme (setting); - g_return_val_if_fail (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB, NULL); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->phase2_ca_cert; -} - -/** - * nm_setting_802_1x_get_phase2_ca_cert_path: - * @setting: the #NMSetting8021x - * - * Returns the "phase 2" CA certificate path if the CA certificate is stored - * using the %NM_SETTING_802_1X_CK_SCHEME_PATH scheme. Not all EAP methods use - * a CA certificate (LEAP for example), and those that can take advantage of the - * CA certificate allow it to be unset. Note that lack of a CA certificate - * reduces security by allowing man-in-the-middle attacks, because the identity - * of the network cannot be confirmed by the client. - * - * Returns: path to the "phase 2" CA certificate file - **/ -const char * -nm_setting_802_1x_get_phase2_ca_cert_path (NMSetting8021x *setting) -{ - NMSetting8021xCKScheme scheme; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - scheme = nm_setting_802_1x_get_phase2_ca_cert_scheme (setting); - g_return_val_if_fail (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH, NULL); - - return (const char *) (NM_SETTING_802_1X_GET_PRIVATE (setting)->phase2_ca_cert->data + strlen (SCHEME_PATH)); -} - -/** - * nm_setting_802_1x_set_phase2_ca_cert: - * @setting: the #NMSetting8021x - * @cert_path: when @scheme is set to either %NM_SETTING_802_1X_CK_SCHEME_PATH - * or %NM_SETTING_802_1X_CK_SCHEME_BLOB, pass the path of the "phase2" CA - * certificate file (PEM or DER format). The path must be UTF-8 encoded; use - * g_filename_to_utf8() to convert if needed. Passing %NULL with any @scheme - * clears the "phase2" CA certificate. - * @scheme: desired storage scheme for the certificate - * @out_format: on successful return, the type of the certificate added - * @error: on unsuccessful return, an error - * - * Reads a certificate from disk and sets the #NMSetting8021x:phase2-ca-cert - * property with the raw certificate data if using the - * %NM_SETTING_802_1X_CK_SCHEME_BLOB scheme, or with the path to the certificate - * file if using the %NM_SETTING_802_1X_CK_SCHEME_PATH scheme. - * - * Returns: %TRUE if the operation succeeded, %FALSE if it was unsuccessful - **/ -gboolean -nm_setting_802_1x_set_phase2_ca_cert (NMSetting8021x *setting, - const char *cert_path, - NMSetting8021xCKScheme scheme, - NMSetting8021xCKFormat *out_format, - GError **error) -{ - NMSetting8021xPrivate *priv; - NMCryptoFileFormat format = NM_CRYPTO_FILE_FORMAT_UNKNOWN; - GByteArray *data; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), FALSE); - - if (cert_path) { - g_return_val_if_fail (g_utf8_validate (cert_path, -1, NULL), FALSE); - g_return_val_if_fail ( scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB - || scheme == NM_SETTING_802_1X_CK_SCHEME_PATH, - FALSE); - } - - if (out_format) - g_return_val_if_fail (*out_format == NM_SETTING_802_1X_CK_FORMAT_UNKNOWN, FALSE); - - priv = NM_SETTING_802_1X_GET_PRIVATE (setting); - - /* Clear out any previous ca_cert blob */ - if (priv->phase2_ca_cert) { - g_byte_array_free (priv->phase2_ca_cert, TRUE); - priv->phase2_ca_cert = NULL; - } - - if (!cert_path) { - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_PHASE2_CA_CERT); - return TRUE; - } - - data = load_and_verify_certificate (cert_path, scheme, &format, error); - if (data) { - /* wpa_supplicant can only use raw x509 CA certs */ - if (format == NM_CRYPTO_FILE_FORMAT_X509) { - if (out_format) - *out_format = NM_SETTING_802_1X_CK_FORMAT_X509; - - if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) - priv->phase2_ca_cert = g_byte_array_ref (data); - else if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH) - priv->phase2_ca_cert = path_to_scheme_value (cert_path); - else - g_assert_not_reached (); - } else { - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, - _("invalid certificate format")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_PHASE2_CA_CERT); - } - g_byte_array_unref (data); - } - - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_PHASE2_CA_CERT); - return priv->phase2_ca_cert != NULL; -} - -/** - * nm_setting_802_1x_get_phase2_subject_match: - * @setting: the #NMSetting8021x - * - * Returns: the #NMSetting8021x:phase2-subject-match property. This is - * the substring to be matched against the subject of the "phase 2" - * authentication server certificate, or %NULL no subject verification - * is to be performed. - **/ -const char * -nm_setting_802_1x_get_phase2_subject_match (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->phase2_subject_match; -} - -/** - * nm_setting_802_1x_get_num_phase2_altsubject_matches: - * @setting: the #NMSetting8021x - * - * Returns the number of entries in the - * #NMSetting8021x:phase2-altsubject-matches property of this setting. - * - * Returns: the number of phase2-altsubject-matches entries. - **/ -guint32 -nm_setting_802_1x_get_num_phase2_altsubject_matches (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), 0); - - return g_slist_length (NM_SETTING_802_1X_GET_PRIVATE (setting)->phase2_altsubject_matches); -} - -/** - * nm_setting_802_1x_get_phase2_altsubject_match: - * @setting: the #NMSettingConnection - * @i: the zero-based index of the array of "phase 2" altSubjectName matches - * - * Returns the "phase 2" altSubjectName match at index @i. - * - * Returns: the "phase 2" altSubjectName match at index @i - **/ -const char * -nm_setting_802_1x_get_phase2_altsubject_match (NMSetting8021x *setting, guint32 i) -{ - NMSetting8021xPrivate *priv; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - priv = NM_SETTING_802_1X_GET_PRIVATE (setting); - g_return_val_if_fail (i <= g_slist_length (priv->phase2_altsubject_matches), NULL); - - return (const char *) g_slist_nth_data (priv->phase2_altsubject_matches, i); -} - -/** - * nm_setting_802_1x_add_phase2_altsubject_match: - * @setting: the #NMSetting8021x - * @phase2_altsubject_match: the "phase 2" altSubjectName to allow for this - * connection - * - * Adds an allowed alternate subject name match for "phase 2". Until - * at least one match is added, the altSubjectName of the "phase 2" - * remote authentication server is not verified. - * - * Returns: %TRUE if the "phase 2" alternative subject name match was - * successfully added, %FALSE if it was already allowed. - **/ -gboolean -nm_setting_802_1x_add_phase2_altsubject_match (NMSetting8021x *setting, - const char *phase2_altsubject_match) -{ - NMSetting8021xPrivate *priv; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), FALSE); - g_return_val_if_fail (phase2_altsubject_match != NULL, FALSE); - - priv = NM_SETTING_802_1X_GET_PRIVATE (setting); - for (iter = priv->phase2_altsubject_matches; iter; iter = g_slist_next (iter)) { - if (!strcmp (phase2_altsubject_match, (char *) iter->data)) - return FALSE; - } - - priv->phase2_altsubject_matches = g_slist_append (priv->phase2_altsubject_matches, - g_strdup (phase2_altsubject_match)); - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_PHASE2_ALTSUBJECT_MATCHES); - return TRUE; -} - -/** - * nm_setting_802_1x_remove_phase2_altsubject_match: - * @setting: the #NMSetting8021x - * @i: the index of the "phase 2" altSubjectName match to remove - * - * Removes the allowed "phase 2" altSubjectName at the specified index. - **/ -void -nm_setting_802_1x_remove_phase2_altsubject_match (NMSetting8021x *setting, guint32 i) -{ - NMSetting8021xPrivate *priv; - GSList *elt; - - g_return_if_fail (NM_IS_SETTING_802_1X (setting)); - - priv = NM_SETTING_802_1X_GET_PRIVATE (setting); - elt = g_slist_nth (priv->phase2_altsubject_matches, i); - g_return_if_fail (elt != NULL); - - g_free (elt->data); - priv->phase2_altsubject_matches = g_slist_delete_link (priv->phase2_altsubject_matches, elt); - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_PHASE2_ALTSUBJECT_MATCHES); -} - -/** - * nm_setting_802_1x_remove_phase2_altsubject_match_by_value: - * @setting: the #NMSetting8021x - * @phase2_altsubject_match: the "phase 2" altSubjectName to remove - * - * Removes the allowed "phase 2" altSubjectName @phase2_altsubject_match. - * - * Returns: %TRUE if the alternative subject name match for "phase 2" was found and removed, - * %FALSE if it was not. - * - * Since: 0.9.10 - **/ -gboolean -nm_setting_802_1x_remove_phase2_altsubject_match_by_value (NMSetting8021x *setting, - const char *phase2_altsubject_match) -{ - NMSetting8021xPrivate *priv; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), FALSE); - g_return_val_if_fail (phase2_altsubject_match != NULL, FALSE); - - priv = NM_SETTING_802_1X_GET_PRIVATE (setting); - for (iter = priv->phase2_altsubject_matches; iter; iter = g_slist_next (iter)) { - if (!strcmp (phase2_altsubject_match, (char *) iter->data)) { - priv->phase2_altsubject_matches = g_slist_delete_link (priv->phase2_altsubject_matches, iter); - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_PHASE2_ALTSUBJECT_MATCHES); - return TRUE; - } - } - return FALSE; -} - -/** - * nm_setting_802_1x_clear_phase2_altsubject_matches: - * @setting: the #NMSetting8021x - * - * Clears all "phase 2" altSubjectName matches. - **/ -void -nm_setting_802_1x_clear_phase2_altsubject_matches (NMSetting8021x *setting) -{ - NMSetting8021xPrivate *priv; - - g_return_if_fail (NM_IS_SETTING_802_1X (setting)); - - priv = NM_SETTING_802_1X_GET_PRIVATE (setting); - g_slist_free_full (priv->phase2_altsubject_matches, g_free); - priv->phase2_altsubject_matches = NULL; - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_PHASE2_ALTSUBJECT_MATCHES); -} - -/** - * nm_setting_802_1x_get_phase2_client_cert_scheme: - * @setting: the #NMSetting8021x - * - * Returns the scheme used to store the "phase 2" client certificate. If the - * returned scheme is %NM_SETTING_802_1X_CK_SCHEME_BLOB, use - * nm_setting_802_1x_get_client_cert_blob(); if - * %NM_SETTING_802_1X_CK_SCHEME_PATH, use - * nm_setting_802_1x_get_client_cert_path(). - * - * Returns: scheme used to store the "phase 2" client certificate (blob or path) - **/ -NMSetting8021xCKScheme -nm_setting_802_1x_get_phase2_client_cert_scheme (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NM_SETTING_802_1X_CK_SCHEME_UNKNOWN); - - return get_cert_scheme (NM_SETTING_802_1X_GET_PRIVATE (setting)->phase2_client_cert); -} - -/** - * nm_setting_802_1x_get_phase2_client_cert_blob: - * @setting: the #NMSetting8021x - * - * Client certificates are used to identify the connecting client to the network - * when EAP-TLS is used as either the "phase 1" or "phase 2" 802.1x - * authentication method. - * - * Returns: the "phase 2" client certificate data - **/ -const GByteArray * -nm_setting_802_1x_get_phase2_client_cert_blob (NMSetting8021x *setting) -{ - NMSetting8021xCKScheme scheme; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - scheme = nm_setting_802_1x_get_phase2_client_cert_scheme (setting); - g_return_val_if_fail (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB, NULL); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->phase2_client_cert; -} - -/** - * nm_setting_802_1x_get_phase2_client_cert_path: - * @setting: the #NMSetting8021x - * - * Client certificates are used to identify the connecting client to the network - * when EAP-TLS is used as either the "phase 1" or "phase 2" 802.1x - * authentication method. - * - * Returns: path to the "phase 2" client certificate file - **/ -const char * -nm_setting_802_1x_get_phase2_client_cert_path (NMSetting8021x *setting) -{ - NMSetting8021xCKScheme scheme; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - scheme = nm_setting_802_1x_get_phase2_client_cert_scheme (setting); - g_return_val_if_fail (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH, NULL); - - return (const char *) (NM_SETTING_802_1X_GET_PRIVATE (setting)->phase2_client_cert->data + strlen (SCHEME_PATH)); -} - -/** - * nm_setting_802_1x_set_phase2_client_cert: - * @setting: the #NMSetting8021x - * @cert_path: when @scheme is set to either %NM_SETTING_802_1X_CK_SCHEME_PATH - * or %NM_SETTING_802_1X_CK_SCHEME_BLOB, pass the path of the "phase2" client - * certificate file (PEM, DER, or PKCS#<!-- -->12 format). The path must be UTF-8 - * encoded; use g_filename_to_utf8() to convert if needed. Passing %NULL with - * any @scheme clears the "phase2" client certificate. - * @scheme: desired storage scheme for the certificate - * @out_format: on successful return, the type of the certificate added - * @error: on unsuccessful return, an error - * - * Reads a certificate from disk and sets the #NMSetting8021x:phase2-client-cert - * property with the raw certificate data if using the - * %NM_SETTING_802_1X_CK_SCHEME_BLOB scheme, or with the path to the certificate - * file if using the %NM_SETTING_802_1X_CK_SCHEME_PATH scheme. - * - * Client certificates are used to identify the connecting client to the network - * when EAP-TLS is used as either the "phase 1" or "phase 2" 802.1x - * authentication method. - * - * Returns: %TRUE if the operation succeeded, %FALSE if it was unsuccessful - **/ -gboolean -nm_setting_802_1x_set_phase2_client_cert (NMSetting8021x *setting, - const char *cert_path, - NMSetting8021xCKScheme scheme, - NMSetting8021xCKFormat *out_format, - GError **error) -{ - NMSetting8021xPrivate *priv; - NMCryptoFileFormat format = NM_CRYPTO_FILE_FORMAT_UNKNOWN; - GByteArray *data; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), FALSE); - - if (cert_path) { - g_return_val_if_fail (g_utf8_validate (cert_path, -1, NULL), FALSE); - g_return_val_if_fail ( scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB - || scheme == NM_SETTING_802_1X_CK_SCHEME_PATH, - FALSE); - } - - if (out_format) - g_return_val_if_fail (*out_format == NM_SETTING_802_1X_CK_FORMAT_UNKNOWN, FALSE); - - priv = NM_SETTING_802_1X_GET_PRIVATE (setting); - - /* Clear out any previous ca_cert blob */ - if (priv->phase2_client_cert) { - g_byte_array_free (priv->phase2_client_cert, TRUE); - priv->phase2_client_cert = NULL; - } - - if (!cert_path) { - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_PHASE2_CLIENT_CERT); - return TRUE; - } - - data = load_and_verify_certificate (cert_path, scheme, &format, error); - if (data) { - gboolean valid = FALSE; - - /* wpa_supplicant can only use raw x509 CA certs */ - switch (format) { - case NM_CRYPTO_FILE_FORMAT_X509: - if (out_format) - *out_format = NM_SETTING_802_1X_CK_FORMAT_X509; - valid = TRUE; - break; - case NM_CRYPTO_FILE_FORMAT_PKCS12: - if (out_format) - *out_format = NM_SETTING_802_1X_CK_FORMAT_PKCS12; - valid = TRUE; - break; - default: - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, - _("invalid certificate format")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_PHASE2_CLIENT_CERT); - break; - } - - if (valid) { - if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) - priv->phase2_client_cert = g_byte_array_ref (data); - else if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH) - priv->phase2_client_cert = path_to_scheme_value (cert_path); - else - g_assert_not_reached (); - } - g_byte_array_unref (data); - } - - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_PHASE2_CLIENT_CERT); - return priv->phase2_client_cert != NULL; -} - -/** - * nm_setting_802_1x_get_password: - * @setting: the #NMSetting8021x - * - * Returns: the password used by the authentication method, if any, as specified - * by the #NMSetting8021x:password property - **/ -const char * -nm_setting_802_1x_get_password (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->password; -} - -/** - * nm_setting_802_1x_get_password_flags: - * @setting: the #NMSetting8021x - * - * Returns: the #NMSettingSecretFlags pertaining to the #NMSetting8021x:password - **/ -NMSettingSecretFlags -nm_setting_802_1x_get_password_flags (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NM_SETTING_SECRET_FLAG_NONE); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->password_flags; -} - -/** - * nm_setting_802_1x_get_password_raw: - * @setting: the #NMSetting8021x - * - * Returns: the password used by the authentication method as a - * UTF-8-encoded array of bytes, as specified by the - * #NMSetting8021x:password-raw property - **/ -const GByteArray * -nm_setting_802_1x_get_password_raw (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->password_raw; -} - -/** - * nm_setting_802_1x_get_password_raw_flags: - * @setting: the #NMSetting8021x - * - * Returns: the #NMSettingSecretFlags pertaining to the - * #NMSetting8021x:password-raw - **/ -NMSettingSecretFlags -nm_setting_802_1x_get_password_raw_flags (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NM_SETTING_SECRET_FLAG_NONE); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->password_raw_flags; -} - -/** - * nm_setting_802_1x_get_pin: - * @setting: the #NMSetting8021x - * - * Returns: the PIN used by the authentication method, if any, as specified - * by the #NMSetting8021x:pin property - **/ -const char * -nm_setting_802_1x_get_pin (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->pin; -} - -/** - * nm_setting_802_1x_get_pin_flags: - * @setting: the #NMSetting8021x - * - * Returns: the #NMSettingSecretFlags pertaining to the - * #NMSetting8021x:pin - **/ -NMSettingSecretFlags -nm_setting_802_1x_get_pin_flags (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NM_SETTING_SECRET_FLAG_NONE); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->pin_flags; -} - -/** - * nm_setting_802_1x_get_private_key_scheme: - * @setting: the #NMSetting8021x - * - * Returns the scheme used to store the private key. If the returned scheme is - * %NM_SETTING_802_1X_CK_SCHEME_BLOB, use - * nm_setting_802_1x_get_client_cert_blob(); if - * %NM_SETTING_802_1X_CK_SCHEME_PATH, use - * nm_setting_802_1x_get_client_cert_path(). - * - * Returns: scheme used to store the private key (blob or path) - **/ -NMSetting8021xCKScheme -nm_setting_802_1x_get_private_key_scheme (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NM_SETTING_802_1X_CK_SCHEME_UNKNOWN); - - return get_cert_scheme (NM_SETTING_802_1X_GET_PRIVATE (setting)->private_key); -} - -/** - * nm_setting_802_1x_get_private_key_blob: - * @setting: the #NMSetting8021x - * - * Private keys are used to authenticate the connecting client to the network - * when EAP-TLS is used as either the "phase 1" or "phase 2" 802.1x - * authentication method. - * - * WARNING: the private key property is not a "secret" property, and thus - * unencrypted private key data may be readable by unprivileged users. Private - * keys should always be encrypted with a private key password. - * - * Returns: the private key data - **/ -const GByteArray * -nm_setting_802_1x_get_private_key_blob (NMSetting8021x *setting) -{ - NMSetting8021xCKScheme scheme; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - scheme = nm_setting_802_1x_get_private_key_scheme (setting); - g_return_val_if_fail (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB, NULL); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->private_key; -} - -/** - * nm_setting_802_1x_get_private_key_path: - * @setting: the #NMSetting8021x - * - * Private keys are used to authenticate the connecting client to the network - * when EAP-TLS is used as either the "phase 1" or "phase 2" 802.1x - * authentication method. - * - * Returns: path to the private key file - **/ -const char * -nm_setting_802_1x_get_private_key_path (NMSetting8021x *setting) -{ - NMSetting8021xCKScheme scheme; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - scheme = nm_setting_802_1x_get_private_key_scheme (setting); - g_return_val_if_fail (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH, NULL); - - return (const char *) (NM_SETTING_802_1X_GET_PRIVATE (setting)->private_key->data + strlen (SCHEME_PATH)); -} - -static GByteArray * -file_to_byte_array (const char *filename) -{ - char *contents; - GByteArray *array = NULL; - gsize length = 0; - - if (g_file_get_contents (filename, &contents, &length, NULL)) { - array = g_byte_array_sized_new (length); - g_byte_array_append (array, (guint8 *) contents, length); - g_assert (array->len == length); - g_free (contents); - } - return array; -} - -/** - * nm_setting_802_1x_set_private_key: - * @setting: the #NMSetting8021x - * @key_path: when @scheme is set to either %NM_SETTING_802_1X_CK_SCHEME_PATH or - * %NM_SETTING_802_1X_CK_SCHEME_BLOB, pass the path of the private key file - * (PEM, DER, or PKCS#<!-- -->12 format). The path must be UTF-8 encoded; use - * g_filename_to_utf8() to convert if needed. Passing %NULL with any @scheme - * clears the private key. - * @password: password used to decrypt the private key, or %NULL if the password - * is unknown. If the password is given but fails to decrypt the private key, - * an error is returned. - * @scheme: desired storage scheme for the private key - * @out_format: on successful return, the type of the private key added - * @error: on unsuccessful return, an error - * - * Private keys are used to authenticate the connecting client to the network - * when EAP-TLS is used as either the "phase 1" or "phase 2" 802.1x - * authentication method. - * - * This function reads a private key from disk and sets the - * #NMSetting8021x:private-key property with the private key file data if using - * the %NM_SETTING_802_1X_CK_SCHEME_BLOB scheme, or with the path to the private - * key file if using the %NM_SETTING_802_1X_CK_SCHEME_PATH scheme. - * - * If @password is given, this function attempts to decrypt the private key to - * verify that @password is correct, and if it is, updates the - * #NMSetting8021x:private-key-password property with the given @password. If - * the decryption is unsuccessful, %FALSE is returned, @error is set, and no - * internal data is changed. If no @password is given, the private key is - * assumed to be valid, no decryption is performed, and the password may be set - * at a later time. - * - * WARNING: the private key property is not a "secret" property, and thus - * unencrypted private key data using the BLOB scheme may be readable by - * unprivileged users. Private keys should always be encrypted with a private - * key password to prevent unauthorized access to unencrypted private key data. - * - * Returns: %TRUE if the operation succeeded, %FALSE if it was unsuccessful - **/ -gboolean -nm_setting_802_1x_set_private_key (NMSetting8021x *setting, - const char *key_path, - const char *password, - NMSetting8021xCKScheme scheme, - NMSetting8021xCKFormat *out_format, - GError **error) -{ - NMSetting8021xPrivate *priv; - NMCryptoFileFormat format = NM_CRYPTO_FILE_FORMAT_UNKNOWN; - gboolean key_cleared = FALSE, password_cleared = FALSE; - GError *local_err = NULL; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), FALSE); - - if (key_path) { - g_return_val_if_fail (g_utf8_validate (key_path, -1, NULL), FALSE); - g_return_val_if_fail ( scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB - || scheme == NM_SETTING_802_1X_CK_SCHEME_PATH, - FALSE); - } - - if (out_format) - g_return_val_if_fail (*out_format == NM_SETTING_802_1X_CK_FORMAT_UNKNOWN, FALSE); - - /* Ensure the private key is a recognized format and if the password was - * given, that it decrypts the private key. - */ - if (key_path) { - format = crypto_verify_private_key (key_path, password, &local_err); - if (format == NM_CRYPTO_FILE_FORMAT_UNKNOWN) { - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, - local_err ? local_err->message : _("invalid private key")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_PRIVATE_KEY); - g_clear_error (&local_err); - return FALSE; - } - } - - priv = NM_SETTING_802_1X_GET_PRIVATE (setting); - - /* Clear out any previous private key data */ - if (priv->private_key) { - /* Try not to leave the private key around in memory */ - memset (priv->private_key->data, 0, priv->private_key->len); - g_byte_array_free (priv->private_key, TRUE); - priv->private_key = NULL; - key_cleared = TRUE; - } - - if (priv->private_key_password) { - g_free (priv->private_key_password); - priv->private_key_password = NULL; - password_cleared = TRUE; - } - - if (key_path == NULL) { - if (key_cleared) - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_PRIVATE_KEY); - if (password_cleared) - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD); - return TRUE; - } - - priv->private_key_password = g_strdup (password); - if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) { - /* Shouldn't fail this since we just verified the private key above */ - priv->private_key = file_to_byte_array (key_path); - g_assert (priv->private_key); - } else if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH) - priv->private_key = path_to_scheme_value (key_path); - else - g_assert_not_reached (); - - /* As required by NM and wpa_supplicant, set the client-cert - * property to the same PKCS#12 data. - */ - g_assert (format != NM_CRYPTO_FILE_FORMAT_UNKNOWN); - if (format == NM_CRYPTO_FILE_FORMAT_PKCS12) { - if (priv->client_cert) - g_byte_array_free (priv->client_cert, TRUE); - - priv->client_cert = g_byte_array_sized_new (priv->private_key->len); - g_byte_array_append (priv->client_cert, priv->private_key->data, priv->private_key->len); - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_CLIENT_CERT); - } - - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_PRIVATE_KEY); - if (password_cleared || password) - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD); - - if (out_format) - *out_format = (NMSetting8021xCKFormat) format; - return priv->private_key != NULL; -} - -/** - * nm_setting_802_1x_get_private_key_password: - * @setting: the #NMSetting8021x - * - * Returns: the private key password used to decrypt the private key if - * previously set with nm_setting_802_1x_set_private_key(), or the - * #NMSetting8021x:private-key-password property. - **/ -const char * -nm_setting_802_1x_get_private_key_password (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->private_key_password; -} - -/** - * nm_setting_802_1x_get_private_key_password_flags: - * @setting: the #NMSetting8021x - * - * Returns: the #NMSettingSecretFlags pertaining to the - * #NMSetting8021x:private-key-password - **/ -NMSettingSecretFlags -nm_setting_802_1x_get_private_key_password_flags (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NM_SETTING_SECRET_FLAG_NONE); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->private_key_password_flags; -} - -/** - * nm_setting_802_1x_get_private_key_format: - * @setting: the #NMSetting8021x - * - * Returns: the data format of the private key data stored in the - * #NMSetting8021x:private-key property - **/ -NMSetting8021xCKFormat -nm_setting_802_1x_get_private_key_format (NMSetting8021x *setting) -{ - NMSetting8021xPrivate *priv; - const char *path; - GError *error = NULL; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NM_SETTING_802_1X_CK_FORMAT_UNKNOWN); - priv = NM_SETTING_802_1X_GET_PRIVATE (setting); - - if (!priv->private_key) - return NM_SETTING_802_1X_CK_FORMAT_UNKNOWN; - - switch (nm_setting_802_1x_get_private_key_scheme (setting)) { - case NM_SETTING_802_1X_CK_SCHEME_BLOB: - if (crypto_is_pkcs12_data (priv->private_key)) - return NM_SETTING_802_1X_CK_FORMAT_PKCS12; - return NM_SETTING_802_1X_CK_FORMAT_RAW_KEY; - case NM_SETTING_802_1X_CK_SCHEME_PATH: - path = nm_setting_802_1x_get_private_key_path (setting); - if (crypto_is_pkcs12_file (path, &error)) - return NM_SETTING_802_1X_CK_FORMAT_PKCS12; - if (error) { - /* Couldn't read the file or something */ - g_error_free (error); - return NM_SETTING_802_1X_CK_FORMAT_UNKNOWN; - } - return NM_SETTING_802_1X_CK_FORMAT_RAW_KEY; - default: - break; - } - - return NM_SETTING_802_1X_CK_FORMAT_UNKNOWN; -} - -/** - * nm_setting_802_1x_get_phase2_private_key_password: - * @setting: the #NMSetting8021x - * - * Returns: the private key password used to decrypt the private key if - * previously set with nm_setting_802_1x_set_phase2_private_key() or the - * #NMSetting8021x:phase2-private-key-password property. - **/ -const char * -nm_setting_802_1x_get_phase2_private_key_password (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->phase2_private_key_password; -} - -/** - * nm_setting_802_1x_get_phase2_private_key_password_flags: - * @setting: the #NMSetting8021x - * - * Returns: the #NMSettingSecretFlags pertaining to the - * #NMSetting8021x:phase2-private-key-password - **/ -NMSettingSecretFlags -nm_setting_802_1x_get_phase2_private_key_password_flags (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NM_SETTING_SECRET_FLAG_NONE); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->phase2_private_key_password_flags; -} - -/** - * nm_setting_802_1x_get_phase2_private_key_scheme: - * @setting: the #NMSetting8021x - * - * Returns the scheme used to store the "phase 2" private key. If the returned - * scheme is %NM_SETTING_802_1X_CK_SCHEME_BLOB, use - * nm_setting_802_1x_get_client_cert_blob(); if - * %NM_SETTING_802_1X_CK_SCHEME_PATH, use - * nm_setting_802_1x_get_client_cert_path(). - * - * Returns: scheme used to store the "phase 2" private key (blob or path) - **/ -NMSetting8021xCKScheme -nm_setting_802_1x_get_phase2_private_key_scheme (NMSetting8021x *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NM_SETTING_802_1X_CK_SCHEME_UNKNOWN); - - return get_cert_scheme (NM_SETTING_802_1X_GET_PRIVATE (setting)->phase2_private_key); -} - -/** - * nm_setting_802_1x_get_phase2_private_key_blob: - * @setting: the #NMSetting8021x - * - * Private keys are used to authenticate the connecting client to the network - * when EAP-TLS is used as either the "phase 1" or "phase 2" 802.1x - * authentication method. - * - * WARNING: the phase2 private key property is not a "secret" property, and thus - * unencrypted private key data may be readable by unprivileged users. Private - * keys should always be encrypted with a private key password. - * - * Returns: the "phase 2" private key data - **/ -const GByteArray * -nm_setting_802_1x_get_phase2_private_key_blob (NMSetting8021x *setting) -{ - NMSetting8021xCKScheme scheme; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - scheme = nm_setting_802_1x_get_phase2_private_key_scheme (setting); - g_return_val_if_fail (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB, NULL); - - return NM_SETTING_802_1X_GET_PRIVATE (setting)->phase2_private_key; -} - -/** - * nm_setting_802_1x_get_phase2_private_key_path: - * @setting: the #NMSetting8021x - * - * Private keys are used to authenticate the connecting client to the network - * when EAP-TLS is used as either the "phase 1" or "phase 2" 802.1x - * authentication method. - * - * Returns: path to the "phase 2" private key file - **/ -const char * -nm_setting_802_1x_get_phase2_private_key_path (NMSetting8021x *setting) -{ - NMSetting8021xCKScheme scheme; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NULL); - - scheme = nm_setting_802_1x_get_phase2_private_key_scheme (setting); - g_return_val_if_fail (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH, NULL); - - return (const char *) (NM_SETTING_802_1X_GET_PRIVATE (setting)->phase2_private_key->data + strlen (SCHEME_PATH)); -} - -/** - * nm_setting_802_1x_set_phase2_private_key: - * @setting: the #NMSetting8021x - * @key_path: when @scheme is set to either %NM_SETTING_802_1X_CK_SCHEME_PATH or - * %NM_SETTING_802_1X_CK_SCHEME_BLOB, pass the path of the "phase2" private - * key file (PEM, DER, or PKCS#<!-- -->12 format). The path must be UTF-8 encoded; - * use g_filename_to_utf8() to convert if needed. Passing %NULL with any - * @scheme clears the private key. - * @password: password used to decrypt the private key, or %NULL if the password - * is unknown. If the password is given but fails to decrypt the private key, - * an error is returned. - * @scheme: desired storage scheme for the private key - * @out_format: on successful return, the type of the private key added - * @error: on unsuccessful return, an error - * - * Private keys are used to authenticate the connecting client to the network - * when EAP-TLS is used as either the "phase 1" or "phase 2" 802.1x - * authentication method. - * - * This function reads a private key from disk and sets the - * #NMSetting8021x:phase2-private-key property with the private key file data if - * using the %NM_SETTING_802_1X_CK_SCHEME_BLOB scheme, or with the path to the - * private key file if using the %NM_SETTING_802_1X_CK_SCHEME_PATH scheme. - * - * If @password is given, this function attempts to decrypt the private key to - * verify that @password is correct, and if it is, updates the - * #NMSetting8021x:phase2-private-key-password property with the given - * @password. If the decryption is unsuccessful, %FALSE is returned, @error is - * set, and no internal data is changed. If no @password is given, the private - * key is assumed to be valid, no decryption is performed, and the password may - * be set at a later time. - * - * WARNING: the "phase2" private key property is not a "secret" property, and - * thus unencrypted private key data using the BLOB scheme may be readable by - * unprivileged users. Private keys should always be encrypted with a private - * key password to prevent unauthorized access to unencrypted private key data. - * - * Returns: %TRUE if the operation succeeded, %FALSE if it was unsuccessful - **/ -gboolean -nm_setting_802_1x_set_phase2_private_key (NMSetting8021x *setting, - const char *key_path, - const char *password, - NMSetting8021xCKScheme scheme, - NMSetting8021xCKFormat *out_format, - GError **error) -{ - NMSetting8021xPrivate *priv; - NMCryptoFileFormat format = NM_CRYPTO_FILE_FORMAT_UNKNOWN; - gboolean key_cleared = FALSE, password_cleared = FALSE; - GError *local_err = NULL; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), FALSE); - - if (key_path) { - g_return_val_if_fail (g_utf8_validate (key_path, -1, NULL), FALSE); - g_return_val_if_fail ( scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB - || scheme == NM_SETTING_802_1X_CK_SCHEME_PATH, - FALSE); - } - - if (out_format) - g_return_val_if_fail (*out_format == NM_SETTING_802_1X_CK_FORMAT_UNKNOWN, FALSE); - - /* Ensure the private key is a recognized format and if the password was - * given, that it decrypts the private key. - */ - if (key_path) { - format = crypto_verify_private_key (key_path, password, &local_err); - if (format == NM_CRYPTO_FILE_FORMAT_UNKNOWN) { - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, - local_err ? local_err->message : _("invalid phase2 private key")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_PHASE2_PRIVATE_KEY); - g_clear_error (&local_err); - return FALSE; - } - } - - priv = NM_SETTING_802_1X_GET_PRIVATE (setting); - - /* Clear out any previous private key data */ - if (priv->phase2_private_key) { - /* Try not to leave the private key around in memory */ - memset (priv->phase2_private_key->data, 0, priv->phase2_private_key->len); - g_byte_array_free (priv->phase2_private_key, TRUE); - priv->phase2_private_key = NULL; - key_cleared = TRUE; - } - - if (priv->phase2_private_key_password) { - g_free (priv->phase2_private_key_password); - priv->phase2_private_key_password = NULL; - password_cleared = TRUE; - } - - if (key_path == NULL) { - if (key_cleared) - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_PHASE2_PRIVATE_KEY); - if (password_cleared) - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD); - return TRUE; - } - - priv->phase2_private_key_password = g_strdup (password); - if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) { - /* Shouldn't fail this since we just verified the private key above */ - priv->phase2_private_key = file_to_byte_array (key_path); - g_assert (priv->phase2_private_key); - } else if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH) - priv->phase2_private_key = path_to_scheme_value (key_path); - else - g_assert_not_reached (); - - /* As required by NM and wpa_supplicant, set the client-cert - * property to the same PKCS#12 data. - */ - g_assert (format != NM_CRYPTO_FILE_FORMAT_UNKNOWN); - if (format == NM_CRYPTO_FILE_FORMAT_PKCS12) { - if (priv->phase2_client_cert) - g_byte_array_free (priv->phase2_client_cert, TRUE); - - priv->phase2_client_cert = g_byte_array_sized_new (priv->phase2_private_key->len); - g_byte_array_append (priv->phase2_client_cert, priv->phase2_private_key->data, priv->phase2_private_key->len); - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_PHASE2_CLIENT_CERT); - } - - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_PHASE2_PRIVATE_KEY); - if (password_cleared || password) - g_object_notify (G_OBJECT (setting), NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD); - - if (out_format) - *out_format = (NMSetting8021xCKFormat) format; - return priv->phase2_private_key != NULL; -} - -/** - * nm_setting_802_1x_get_phase2_private_key_format: - * @setting: the #NMSetting8021x - * - * Returns: the data format of the "phase 2" private key data stored in the - * #NMSetting8021x:phase2-private-key property - **/ -NMSetting8021xCKFormat -nm_setting_802_1x_get_phase2_private_key_format (NMSetting8021x *setting) -{ - NMSetting8021xPrivate *priv; - const char *path; - GError *error = NULL; - - g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NM_SETTING_802_1X_CK_FORMAT_UNKNOWN); - priv = NM_SETTING_802_1X_GET_PRIVATE (setting); - - if (!priv->phase2_private_key) - return NM_SETTING_802_1X_CK_FORMAT_UNKNOWN; - - switch (nm_setting_802_1x_get_phase2_private_key_scheme (setting)) { - case NM_SETTING_802_1X_CK_SCHEME_BLOB: - if (crypto_is_pkcs12_data (priv->phase2_private_key)) - return NM_SETTING_802_1X_CK_FORMAT_PKCS12; - return NM_SETTING_802_1X_CK_FORMAT_RAW_KEY; - case NM_SETTING_802_1X_CK_SCHEME_PATH: - path = nm_setting_802_1x_get_phase2_private_key_path (setting); - if (crypto_is_pkcs12_file (path, &error)) - return NM_SETTING_802_1X_CK_FORMAT_PKCS12; - if (error) { - /* Couldn't read the file or something */ - g_error_free (error); - return NM_SETTING_802_1X_CK_FORMAT_UNKNOWN; - } - return NM_SETTING_802_1X_CK_FORMAT_RAW_KEY; - default: - break; - } - - return NM_SETTING_802_1X_CK_FORMAT_UNKNOWN; -} - -static void -need_secrets_password (NMSetting8021x *self, - GPtrArray *secrets, - gboolean phase2) -{ - NMSetting8021xPrivate *priv = NM_SETTING_802_1X_GET_PRIVATE (self); - - if ( (!priv->password || !strlen (priv->password)) - && (!priv->password_raw || !priv->password_raw->len)) { - g_ptr_array_add (secrets, NM_SETTING_802_1X_PASSWORD); - g_ptr_array_add (secrets, NM_SETTING_802_1X_PASSWORD_RAW); - } -} - -static void -need_secrets_sim (NMSetting8021x *self, - GPtrArray *secrets, - gboolean phase2) -{ - NMSetting8021xPrivate *priv = NM_SETTING_802_1X_GET_PRIVATE (self); - - if (!priv->pin || !strlen (priv->pin)) - g_ptr_array_add (secrets, NM_SETTING_802_1X_PIN); -} - -static gboolean -need_private_key_password (const GByteArray *blob, - const char *path, - const char *password) -{ - NMCryptoFileFormat format = NM_CRYPTO_FILE_FORMAT_UNKNOWN; - - /* Private key password is required */ - if (password) { - if (path) - format = crypto_verify_private_key (path, password, NULL); - else if (blob) - format = crypto_verify_private_key_data (blob, password, NULL); - else - g_warning ("%s: unknown private key password scheme", __func__); - } - - return (format == NM_CRYPTO_FILE_FORMAT_UNKNOWN); -} - -static void -need_secrets_tls (NMSetting8021x *self, - GPtrArray *secrets, - gboolean phase2) -{ - NMSetting8021xPrivate *priv = NM_SETTING_802_1X_GET_PRIVATE (self); - NMSetting8021xCKScheme scheme; - const GByteArray *blob = NULL; - const char *path = NULL; - - if (phase2) { - scheme = nm_setting_802_1x_get_phase2_private_key_scheme (self); - if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH) - path = nm_setting_802_1x_get_phase2_private_key_path (self); - else if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) - blob = nm_setting_802_1x_get_phase2_private_key_blob (self); - else { - g_warning ("%s: unknown phase2 private key scheme %d", __func__, scheme); - g_ptr_array_add (secrets, NM_SETTING_802_1X_PHASE2_PRIVATE_KEY); - return; - } - - if (need_private_key_password (blob, path, priv->phase2_private_key_password)) - g_ptr_array_add (secrets, NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD); - } else { - scheme = nm_setting_802_1x_get_private_key_scheme (self); - if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH) - path = nm_setting_802_1x_get_private_key_path (self); - else if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) - blob = nm_setting_802_1x_get_private_key_blob (self); - else { - g_warning ("%s: unknown private key scheme %d", __func__, scheme); - g_ptr_array_add (secrets, NM_SETTING_802_1X_PRIVATE_KEY); - return; - } - - if (need_private_key_password (blob, path, priv->private_key_password)) - g_ptr_array_add (secrets, NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD); - } -} - -static gboolean -verify_tls (NMSetting8021x *self, gboolean phase2, GError **error) -{ - NMSetting8021xPrivate *priv = NM_SETTING_802_1X_GET_PRIVATE (self); - - if (phase2) { - if (!priv->phase2_client_cert) { - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_PHASE2_CLIENT_CERT); - return FALSE; - } else if (!priv->phase2_client_cert->len) { - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, - _("property is empty")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_PHASE2_CLIENT_CERT); - return FALSE; - } - - /* Private key is required for TLS */ - if (!priv->phase2_private_key) { - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_PHASE2_PRIVATE_KEY); - return FALSE; - } else if (!priv->phase2_private_key->len) { - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, - _("property is empty")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_PHASE2_PRIVATE_KEY); - return FALSE; - } - - /* If the private key is PKCS#12, check that it matches the client cert */ - if (crypto_is_pkcs12_data (priv->phase2_private_key)) { - if (priv->phase2_private_key->len != priv->phase2_client_cert->len) { - g_set_error (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, - _("has to match '%s' property for PKCS#12"), - NM_SETTING_802_1X_PHASE2_PRIVATE_KEY); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_PHASE2_CLIENT_CERT); - return FALSE; - } - - if (memcmp (priv->phase2_private_key->data, - priv->phase2_client_cert->data, - priv->phase2_private_key->len)) { - g_set_error (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, - _("has to match '%s' property for PKCS#12"), - NM_SETTING_802_1X_PHASE2_PRIVATE_KEY); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_PHASE2_CLIENT_CERT); - return FALSE; - } - } - } else { - if (!priv->client_cert) { - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_CLIENT_CERT); - return FALSE; - } else if (!priv->client_cert->len) { - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, - _("property is empty")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_CLIENT_CERT); - return FALSE; - } - - /* Private key is required for TLS */ - if (!priv->private_key) { - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_PRIVATE_KEY); - return FALSE; - } else if (!priv->private_key->len) { - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, - _("property is empty")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_PRIVATE_KEY); - return FALSE; - } - - /* If the private key is PKCS#12, check that it matches the client cert */ - if (crypto_is_pkcs12_data (priv->private_key)) { - if (priv->private_key->len != priv->client_cert->len) { - g_set_error (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, - _("has to match '%s' property for PKCS#12"), - NM_SETTING_802_1X_PRIVATE_KEY); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_CLIENT_CERT); - return FALSE; - } - - if (memcmp (priv->private_key->data, - priv->client_cert->data, - priv->private_key->len)) { - g_set_error (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, - _("has to match '%s' property for PKCS#12"), - NM_SETTING_802_1X_PRIVATE_KEY); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_CLIENT_CERT); - return FALSE; - } - } - } - - return TRUE; -} - -static gboolean -verify_ttls (NMSetting8021x *self, gboolean phase2, GError **error) -{ - NMSetting8021xPrivate *priv = NM_SETTING_802_1X_GET_PRIVATE (self); - - if ( (!priv->identity || !strlen (priv->identity)) - && (!priv->anonymous_identity || !strlen (priv->anonymous_identity))) { - if (!priv->identity) { - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_IDENTITY); - } else if (!strlen (priv->identity)) { - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, - _("property is empty")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_IDENTITY); - } else if (!priv->anonymous_identity) { - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_ANONYMOUS_IDENTITY); - } else { - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, - _("property is empty")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_ANONYMOUS_IDENTITY); - } - return FALSE; - } - - if ( (!priv->phase2_auth || !strlen (priv->phase2_auth)) - && (!priv->phase2_autheap || !strlen (priv->phase2_autheap))) { - if (!priv->phase2_auth) { - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_PHASE2_AUTH); - } else if (!strlen (priv->phase2_auth)) { - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, - _("property is empty")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_PHASE2_AUTH); - } else if (!priv->phase2_autheap) { - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_PHASE2_AUTHEAP); - } else { - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, - _("property is empty")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_PHASE2_AUTHEAP); - } - return FALSE; - } - - return TRUE; -} - -static gboolean -verify_identity (NMSetting8021x *self, gboolean phase2, GError **error) -{ - NMSetting8021xPrivate *priv = NM_SETTING_802_1X_GET_PRIVATE (self); - - if (!priv->identity) { - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_IDENTITY); - return FALSE; - } else if (!strlen (priv->identity)) { - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, - _("property is empty")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_IDENTITY); - return FALSE; - } - - return TRUE; -} - -/* Implemented below... */ -static void need_secrets_phase2 (NMSetting8021x *self, - GPtrArray *secrets, - gboolean phase2); - -typedef void (*EAPMethodNeedSecretsFunc) (NMSetting8021x *self, - GPtrArray *secrets, - gboolean phase2); - -typedef gboolean (*EAPMethodValidateFunc)(NMSetting8021x *self, - gboolean phase2, - GError **error); - -typedef struct { - const char *method; - EAPMethodNeedSecretsFunc ns_func; - EAPMethodValidateFunc v_func; -} EAPMethodsTable; - -static EAPMethodsTable eap_methods_table[] = { - { "leap", need_secrets_password, verify_identity }, - { "pwd", need_secrets_password, verify_identity }, - { "md5", need_secrets_password, verify_identity }, - { "pap", need_secrets_password, verify_identity }, - { "chap", need_secrets_password, verify_identity }, - { "mschap", need_secrets_password, verify_identity }, - { "mschapv2", need_secrets_password, verify_identity }, - { "fast", need_secrets_password, verify_identity }, - { "tls", need_secrets_tls, verify_tls }, - { "peap", need_secrets_phase2, verify_ttls }, - { "ttls", need_secrets_phase2, verify_ttls }, - { "sim", need_secrets_sim, NULL }, - { "gtc", need_secrets_password, verify_identity }, - { "otp", NULL, NULL }, // FIXME: implement - { NULL, NULL, NULL } -}; - -static void -need_secrets_phase2 (NMSetting8021x *self, - GPtrArray *secrets, - gboolean phase2) -{ - NMSetting8021xPrivate *priv = NM_SETTING_802_1X_GET_PRIVATE (self); - char *method = NULL; - int i; - - g_return_if_fail (phase2 == FALSE); - - /* Check phase2_auth and phase2_autheap */ - method = priv->phase2_auth; - if (!method && priv->phase2_autheap) - method = priv->phase2_autheap; - - if (!method) { - g_warning ("Couldn't find EAP method."); - g_assert_not_reached(); - return; - } - - /* Ask the configured phase2 method if it needs secrets */ - for (i = 0; eap_methods_table[i].method; i++) { - if (eap_methods_table[i].ns_func == NULL) - continue; - if (!strcmp (eap_methods_table[i].method, method)) { - (*eap_methods_table[i].ns_func) (self, secrets, TRUE); - break; - } - } -} - -static GPtrArray * -need_secrets (NMSetting *setting) -{ - NMSetting8021x *self = NM_SETTING_802_1X (setting); - NMSetting8021xPrivate *priv = NM_SETTING_802_1X_GET_PRIVATE (self); - GSList *iter; - GPtrArray *secrets; - gboolean eap_method_found = FALSE; - - secrets = g_ptr_array_sized_new (4); - - /* Ask each configured EAP method if it needs secrets */ - for (iter = priv->eap; iter && !eap_method_found; iter = g_slist_next (iter)) { - const char *method = (const char *) iter->data; - int i; - - for (i = 0; eap_methods_table[i].method; i++) { - if (eap_methods_table[i].ns_func == NULL) - continue; - if (!strcmp (eap_methods_table[i].method, method)) { - (*eap_methods_table[i].ns_func) (self, secrets, FALSE); - - /* Only break out of the outer loop if this EAP method - * needed secrets. - */ - if (secrets->len > 0) - eap_method_found = TRUE; - break; - } - } - } - - if (secrets->len == 0) { - g_ptr_array_free (secrets, TRUE); - secrets = NULL; - } - - return secrets; -} - -static gboolean -verify_cert (GByteArray *array, const char *prop_name, GError **error) -{ - if ( !array - || get_cert_scheme (array) != NM_SETTING_802_1X_CK_SCHEME_UNKNOWN) - return TRUE; - - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, - _("property is invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, prop_name); - return FALSE; -} - -static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - NMSetting8021x *self = NM_SETTING_802_1X (setting); - NMSetting8021xPrivate *priv = NM_SETTING_802_1X_GET_PRIVATE (self); - const char *valid_eap[] = { "leap", "md5", "tls", "peap", "ttls", "sim", "fast", "pwd", NULL }; - const char *valid_phase1_peapver[] = { "0", "1", NULL }; - const char *valid_phase1_peaplabel[] = { "0", "1", NULL }; - const char *valid_phase1_fast_pac[] = { "0", "1", "2", "3", NULL }; - const char *valid_phase2_auth[] = { "pap", "chap", "mschap", "mschapv2", "gtc", "otp", "md5", "tls", NULL }; - const char *valid_phase2_autheap[] = { "md5", "mschapv2", "otp", "gtc", "tls", NULL }; - GSList *iter; - - if (error) - g_return_val_if_fail (*error == NULL, FALSE); - - if (!priv->eap) { - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_EAP); - return FALSE; - } - - if (!_nm_utils_string_slist_validate (priv->eap, valid_eap)) { - g_set_error_literal (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, - _("property is invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_EAP); - return FALSE; - } - - /* Ask each configured EAP method if its valid */ - for (iter = priv->eap; iter; iter = g_slist_next (iter)) { - const char *method = (const char *) iter->data; - int i; - - for (i = 0; eap_methods_table[i].method; i++) { - if (eap_methods_table[i].v_func == NULL) - continue; - if (!strcmp (eap_methods_table[i].method, method)) { - if (!(*eap_methods_table[i].v_func) (self, FALSE, error)) - return FALSE; - break; - } - } - } - - if (priv->phase1_peapver && !g_strv_contains (valid_phase1_peapver, priv->phase1_peapver)) { - g_set_error (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, - _("'%s' is not a valid value for the property"), - priv->phase1_peapver); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_PHASE1_PEAPVER); - return FALSE; - } - - if (priv->phase1_peaplabel && !g_strv_contains (valid_phase1_peaplabel, priv->phase1_peaplabel)) { - g_set_error (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, - _("'%s' is not a valid value for the property"), - priv->phase1_peaplabel); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_PHASE1_PEAPLABEL); - return FALSE; - } - - if (priv->phase1_fast_provisioning && !g_strv_contains (valid_phase1_fast_pac, priv->phase1_fast_provisioning)) { - g_set_error (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, - _("'%s' is not a valid value for the property"), - priv->phase1_fast_provisioning); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_PHASE1_FAST_PROVISIONING); - return FALSE; - } - - if (priv->phase2_auth && !g_strv_contains (valid_phase2_auth, priv->phase2_auth)) { - g_set_error (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, - _("'%s' is not a valid value for the property"), - priv->phase2_auth); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_PHASE2_AUTH); - return FALSE; - } - - if (priv->phase2_autheap && !g_strv_contains (valid_phase2_autheap, priv->phase2_autheap)) { - g_set_error (error, - NM_SETTING_802_1X_ERROR, - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, - _("'%s' is not a valid value for the property"), - priv->phase2_autheap); - g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_PHASE2_AUTHEAP); - return FALSE; - } - - if (!verify_cert (priv->ca_cert, NM_SETTING_802_1X_CA_CERT, error)) - return FALSE; - if (!verify_cert (priv->phase2_ca_cert, NM_SETTING_802_1X_PHASE2_CA_CERT, error)) - return FALSE; - - if (!verify_cert (priv->client_cert, NM_SETTING_802_1X_CLIENT_CERT, error)) - return FALSE; - if (!verify_cert (priv->phase2_client_cert, NM_SETTING_802_1X_PHASE2_CLIENT_CERT, error)) - return FALSE; - - if (!verify_cert (priv->private_key, NM_SETTING_802_1X_PRIVATE_KEY, error)) - return FALSE; - if (!verify_cert (priv->phase2_private_key, NM_SETTING_802_1X_PHASE2_PRIVATE_KEY, error)) - return FALSE; - - /* FIXME: finish */ - - return TRUE; -} - -static void -nm_setting_802_1x_init (NMSetting8021x *setting) -{ -} - -static void -finalize (GObject *object) -{ - NMSetting8021x *self = NM_SETTING_802_1X (object); - NMSetting8021xPrivate *priv = NM_SETTING_802_1X_GET_PRIVATE (self); - - /* Strings first. g_free() already checks for NULLs so we don't have to */ - - g_free (priv->identity); - g_free (priv->anonymous_identity); - g_free (priv->ca_path); - g_free (priv->subject_match); - g_free (priv->phase1_peapver); - g_free (priv->phase1_peaplabel); - g_free (priv->phase1_fast_provisioning); - g_free (priv->phase2_auth); - g_free (priv->phase2_autheap); - g_free (priv->phase2_ca_path); - g_free (priv->phase2_subject_match); - g_free (priv->password); - if (priv->password_raw) - g_byte_array_free (priv->password_raw, TRUE); - g_free (priv->pin); - - g_slist_free_full (priv->eap, g_free); - g_slist_free_full (priv->altsubject_matches, g_free); - g_slist_free_full (priv->phase2_altsubject_matches, g_free); - - if (priv->ca_cert) - g_byte_array_free (priv->ca_cert, TRUE); - if (priv->client_cert) - g_byte_array_free (priv->client_cert, TRUE); - if (priv->private_key) - g_byte_array_free (priv->private_key, TRUE); - g_free (priv->private_key_password); - if (priv->phase2_ca_cert) - g_byte_array_free (priv->phase2_ca_cert, TRUE); - if (priv->phase2_client_cert) - g_byte_array_free (priv->phase2_client_cert, TRUE); - if (priv->phase2_private_key) - g_byte_array_free (priv->phase2_private_key, TRUE); - g_free (priv->phase2_private_key_password); - - G_OBJECT_CLASS (nm_setting_802_1x_parent_class)->finalize (object); -} - -static GByteArray * -set_cert_prop_helper (const GValue *value, const char *prop_name, GError **error) -{ - gboolean valid; - GByteArray *data = NULL; - - data = g_value_dup_boxed (value); - /* Verify the new data */ - if (data) { - valid = verify_cert (data, prop_name, error); - if (!valid) { - g_byte_array_free (data, TRUE); - data = NULL; - } - } - return data; -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSetting8021x *setting = NM_SETTING_802_1X (object); - NMSetting8021xPrivate *priv = NM_SETTING_802_1X_GET_PRIVATE (setting); - GError *error = NULL; - - switch (prop_id) { - case PROP_EAP: - g_slist_free_full (priv->eap, g_free); - priv->eap = g_value_dup_boxed (value); - break; - case PROP_IDENTITY: - g_free (priv->identity); - priv->identity = g_value_dup_string (value); - break; - case PROP_ANONYMOUS_IDENTITY: - g_free (priv->anonymous_identity); - priv->anonymous_identity = g_value_dup_string (value); - break; - case PROP_PAC_FILE: - g_free (priv->pac_file); - priv->pac_file = g_value_dup_string (value); - break; - case PROP_CA_CERT: - if (priv->ca_cert) { - g_byte_array_free (priv->ca_cert, TRUE); - priv->ca_cert = NULL; - } - priv->ca_cert = set_cert_prop_helper (value, NM_SETTING_802_1X_CA_CERT, &error); - if (error) { - g_warning ("Error setting certificate (invalid data): %s", - error->message); - g_error_free (error); - } - break; - case PROP_CA_PATH: - g_free (priv->ca_path); - priv->ca_path = g_value_dup_string (value); - break; - case PROP_SUBJECT_MATCH: - g_free (priv->subject_match); - priv->subject_match = g_value_dup_string (value); - break; - case PROP_ALTSUBJECT_MATCHES: - g_slist_free_full (priv->altsubject_matches, g_free); - priv->altsubject_matches = g_value_dup_boxed (value); - break; - case PROP_CLIENT_CERT: - if (priv->client_cert) { - g_byte_array_free (priv->client_cert, TRUE); - priv->client_cert = NULL; - } - priv->client_cert = set_cert_prop_helper (value, NM_SETTING_802_1X_CLIENT_CERT, &error); - if (error) { - g_warning ("Error setting certificate (invalid data): %s", - error->message); - g_error_free (error); - } - break; - case PROP_PHASE1_PEAPVER: - g_free (priv->phase1_peapver); - priv->phase1_peapver = g_value_dup_string (value); - break; - case PROP_PHASE1_PEAPLABEL: - g_free (priv->phase1_peaplabel); - priv->phase1_peaplabel = g_value_dup_string (value); - break; - case PROP_PHASE1_FAST_PROVISIONING: - g_free (priv->phase1_fast_provisioning); - priv->phase1_fast_provisioning = g_value_dup_string (value); - break; - case PROP_PHASE2_AUTH: - g_free (priv->phase2_auth); - priv->phase2_auth = g_value_dup_string (value); - break; - case PROP_PHASE2_AUTHEAP: - g_free (priv->phase2_autheap); - priv->phase2_autheap = g_value_dup_string (value); - break; - case PROP_PHASE2_CA_CERT: - if (priv->phase2_ca_cert) { - g_byte_array_free (priv->phase2_ca_cert, TRUE); - priv->phase2_ca_cert = NULL; - } - priv->phase2_ca_cert = set_cert_prop_helper (value, NM_SETTING_802_1X_PHASE2_CA_CERT, &error); - if (error) { - g_warning ("Error setting certificate (invalid data): %s", - error->message); - g_error_free (error); - } - break; - case PROP_PHASE2_CA_PATH: - g_free (priv->phase2_ca_path); - priv->phase2_ca_path = g_value_dup_string (value); - break; - case PROP_PHASE2_SUBJECT_MATCH: - g_free (priv->phase2_subject_match); - priv->phase2_subject_match = g_value_dup_string (value); - break; - case PROP_PHASE2_ALTSUBJECT_MATCHES: - g_slist_free_full (priv->phase2_altsubject_matches, g_free); - priv->phase2_altsubject_matches = g_value_dup_boxed (value); - break; - case PROP_PHASE2_CLIENT_CERT: - if (priv->phase2_client_cert) { - g_byte_array_free (priv->phase2_client_cert, TRUE); - priv->phase2_client_cert = NULL; - } - priv->phase2_client_cert = set_cert_prop_helper (value, NM_SETTING_802_1X_PHASE2_CLIENT_CERT, &error); - if (error) { - g_warning ("Error setting certificate (invalid data): %s", - error->message); - g_error_free (error); - } - break; - case PROP_PASSWORD: - g_free (priv->password); - priv->password = g_value_dup_string (value); - break; - case PROP_PASSWORD_FLAGS: - priv->password_flags = g_value_get_uint (value); - break; - case PROP_PASSWORD_RAW: - if (priv->password_raw) - g_byte_array_free (priv->password_raw, TRUE); - priv->password_raw = g_value_dup_boxed (value); - break; - case PROP_PASSWORD_RAW_FLAGS: - priv->password_raw_flags = g_value_get_uint (value); - break; - case PROP_PRIVATE_KEY: - if (priv->private_key) { - g_byte_array_free (priv->private_key, TRUE); - priv->private_key = NULL; - } - priv->private_key = set_cert_prop_helper (value, NM_SETTING_802_1X_PRIVATE_KEY, &error); - if (error) { - g_warning ("Error setting private key (invalid data): %s", - error->message); - g_error_free (error); - } - break; - case PROP_PRIVATE_KEY_PASSWORD: - g_free (priv->private_key_password); - priv->private_key_password = g_value_dup_string (value); - break; - case PROP_PRIVATE_KEY_PASSWORD_FLAGS: - priv->private_key_password_flags = g_value_get_uint (value); - break; - case PROP_PHASE2_PRIVATE_KEY: - if (priv->phase2_private_key) { - g_byte_array_free (priv->phase2_private_key, TRUE); - priv->phase2_private_key = NULL; - } - priv->phase2_private_key = set_cert_prop_helper (value, NM_SETTING_802_1X_PHASE2_PRIVATE_KEY, &error); - if (error) { - g_warning ("Error setting private key (invalid data): %s", - error->message); - g_error_free (error); - } - break; - case PROP_PHASE2_PRIVATE_KEY_PASSWORD: - g_free (priv->phase2_private_key_password); - priv->phase2_private_key_password = g_value_dup_string (value); - break; - case PROP_PHASE2_PRIVATE_KEY_PASSWORD_FLAGS: - priv->phase2_private_key_password_flags = g_value_get_uint (value); - break; - case PROP_PIN: - g_free (priv->pin); - priv->pin = g_value_dup_string (value); - break; - case PROP_PIN_FLAGS: - priv->pin_flags = g_value_get_uint (value); - break; - case PROP_SYSTEM_CA_CERTS: - priv->system_ca_certs = g_value_get_boolean (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSetting8021x *setting = NM_SETTING_802_1X (object); - NMSetting8021xPrivate *priv = NM_SETTING_802_1X_GET_PRIVATE (setting); - - switch (prop_id) { - case PROP_EAP: - g_value_set_boxed (value, priv->eap); - break; - case PROP_IDENTITY: - g_value_set_string (value, priv->identity); - break; - case PROP_ANONYMOUS_IDENTITY: - g_value_set_string (value, priv->anonymous_identity); - break; - case PROP_PAC_FILE: - g_value_set_string (value, priv->pac_file); - break; - case PROP_CA_CERT: - g_value_set_boxed (value, priv->ca_cert); - break; - case PROP_CA_PATH: - g_value_set_string (value, priv->ca_path); - break; - case PROP_SUBJECT_MATCH: - g_value_set_string (value, priv->subject_match); - break; - case PROP_ALTSUBJECT_MATCHES: - g_value_set_boxed (value, priv->altsubject_matches); - break; - case PROP_CLIENT_CERT: - g_value_set_boxed (value, priv->client_cert); - break; - case PROP_PHASE1_PEAPVER: - g_value_set_string (value, priv->phase1_peapver); - break; - case PROP_PHASE1_PEAPLABEL: - g_value_set_string (value, priv->phase1_peaplabel); - break; - case PROP_PHASE1_FAST_PROVISIONING: - g_value_set_string (value, priv->phase1_fast_provisioning); - break; - case PROP_PHASE2_AUTH: - g_value_set_string (value, priv->phase2_auth); - break; - case PROP_PHASE2_AUTHEAP: - g_value_set_string (value, priv->phase2_autheap); - break; - case PROP_PHASE2_CA_CERT: - g_value_set_boxed (value, priv->phase2_ca_cert); - break; - case PROP_PHASE2_CA_PATH: - g_value_set_string (value, priv->phase2_ca_path); - break; - case PROP_PHASE2_SUBJECT_MATCH: - g_value_set_string (value, priv->phase2_subject_match); - break; - case PROP_PHASE2_ALTSUBJECT_MATCHES: - g_value_set_boxed (value, priv->phase2_altsubject_matches); - break; - case PROP_PHASE2_CLIENT_CERT: - g_value_set_boxed (value, priv->phase2_client_cert); - break; - case PROP_PASSWORD: - g_value_set_string (value, priv->password); - break; - case PROP_PASSWORD_FLAGS: - g_value_set_uint (value, priv->password_flags); - break; - case PROP_PASSWORD_RAW: - g_value_set_boxed (value, priv->password_raw); - break; - case PROP_PASSWORD_RAW_FLAGS: - g_value_set_uint (value, priv->password_raw_flags); - break; - case PROP_PRIVATE_KEY: - g_value_set_boxed (value, priv->private_key); - break; - case PROP_PRIVATE_KEY_PASSWORD: - g_value_set_string (value, priv->private_key_password); - break; - case PROP_PRIVATE_KEY_PASSWORD_FLAGS: - g_value_set_uint (value, priv->private_key_password_flags); - break; - case PROP_PHASE2_PRIVATE_KEY: - g_value_set_boxed (value, priv->phase2_private_key); - break; - case PROP_PHASE2_PRIVATE_KEY_PASSWORD: - g_value_set_string (value, priv->phase2_private_key_password); - break; - case PROP_PHASE2_PRIVATE_KEY_PASSWORD_FLAGS: - g_value_set_uint (value, priv->phase2_private_key_password_flags); - break; - case PROP_PIN: - g_value_set_string (value, priv->pin); - break; - case PROP_PIN_FLAGS: - g_value_set_uint (value, priv->pin_flags); - break; - case PROP_SYSTEM_CA_CERTS: - g_value_set_boolean (value, priv->system_ca_certs); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_setting_802_1x_class_init (NMSetting8021xClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class); - GError *error = NULL; - - g_type_class_add_private (setting_class, sizeof (NMSetting8021xPrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->finalize = finalize; - - parent_class->verify = verify; - parent_class->need_secrets = need_secrets; - - /* Properties */ - - /** - * NMSetting8021x:eap: - * - * The allowed EAP method to be used when authenticating to the network with - * 802.1x. Valid methods are: "leap", "md5", "tls", "peap", "ttls", "pwd", - * and "fast". Each method requires different configuration using the - * properties of this setting; refer to wpa_supplicant documentation for the - * allowed combinations. - **/ - g_object_class_install_property - (object_class, PROP_EAP, - _nm_param_spec_specialized (NM_SETTING_802_1X_EAP, "", "", - DBUS_TYPE_G_LIST_OF_STRING, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:identity: - * - * Identity string for EAP authentication methods. Often the user's user or - * login name. - **/ - g_object_class_install_property - (object_class, PROP_IDENTITY, - g_param_spec_string (NM_SETTING_802_1X_IDENTITY, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:anonymous-identity: - * - * Anonymous identity string for EAP authentication methods. Used as the - * unencrypted identity with EAP types that support different tunneled - * identity like EAP-TTLS. - **/ - g_object_class_install_property - (object_class, PROP_ANONYMOUS_IDENTITY, - g_param_spec_string (NM_SETTING_802_1X_ANONYMOUS_IDENTITY, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:pac-file: - * - * UTF-8 encoded file path containing PAC for EAP-FAST. - **/ - g_object_class_install_property - (object_class, PROP_PAC_FILE, - g_param_spec_string (NM_SETTING_802_1X_PAC_FILE, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:ca-cert: - * - * Contains the CA certificate if used by the EAP method specified in the - * #NMSetting8021x:eap property. - * - * Certificate data is specified using a "scheme"; two are currently - * supported: blob and path. When using the blob scheme (which is backwards - * compatible with NM 0.7.x) this property should be set to the - * certificate's DER encoded data. When using the path scheme, this property - * should be set to the full UTF-8 encoded path of the certificate, prefixed - * with the string "file://" and ending with a terminating NUL byte. This - * property can be unset even if the EAP method supports CA certificates, - * but this allows man-in-the-middle attacks and is NOT recommended. - * - * Setting this property directly is discouraged; use the - * nm_setting_802_1x_set_ca_cert() function instead. - **/ - g_object_class_install_property - (object_class, PROP_CA_CERT, - _nm_param_spec_specialized (NM_SETTING_802_1X_CA_CERT, "", "", - DBUS_TYPE_G_UCHAR_ARRAY, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:ca-path: - * - * UTF-8 encoded path to a directory containing PEM or DER formatted - * certificates to be added to the verification chain in addition to the - * certificate specified in the #NMSetting8021x:ca-cert property. - **/ - g_object_class_install_property - (object_class, PROP_CA_PATH, - g_param_spec_string (NM_SETTING_802_1X_CA_PATH, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:subject-match: - * - * Substring to be matched against the subject of the certificate presented - * by the authentication server. When unset, no verification of the - * authentication server certificate's subject is performed. - **/ - g_object_class_install_property - (object_class, PROP_SUBJECT_MATCH, - g_param_spec_string (NM_SETTING_802_1X_SUBJECT_MATCH, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:altsubject-matches: - * - * List of strings to be matched against the altSubjectName of the - * certificate presented by the authentication server. If the list is empty, - * no verification of the server certificate's altSubjectName is performed. - **/ - g_object_class_install_property - (object_class, PROP_ALTSUBJECT_MATCHES, - _nm_param_spec_specialized (NM_SETTING_802_1X_ALTSUBJECT_MATCHES, "", "", - DBUS_TYPE_G_LIST_OF_STRING, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:client-cert: - * - * Contains the client certificate if used by the EAP method specified in - * the #NMSetting8021x:eap property. - * - * Certificate data is specified using a "scheme"; two are currently - * supported: blob and path. When using the blob scheme (which is backwards - * compatible with NM 0.7.x) this property should be set to the - * certificate's DER encoded data. When using the path scheme, this property - * should be set to the full UTF-8 encoded path of the certificate, prefixed - * with the string "file://" and ending with a terminating NUL byte. - * - * Setting this property directly is discouraged; use the - * nm_setting_802_1x_set_client_cert() function instead. - **/ - g_object_class_install_property - (object_class, PROP_CLIENT_CERT, - _nm_param_spec_specialized (NM_SETTING_802_1X_CLIENT_CERT, "", "", - DBUS_TYPE_G_UCHAR_ARRAY, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:phase1-peapver: - * - * Forces which PEAP version is used when PEAP is set as the EAP method in - * the #NMSetting8021x:eap property. When unset, the version reported by - * the server will be used. Sometimes when using older RADIUS servers, it - * is necessary to force the client to use a particular PEAP version. To do - * so, this property may be set to "0" or "1" to force that specific PEAP - * version. - **/ - g_object_class_install_property - (object_class, PROP_PHASE1_PEAPVER, - g_param_spec_string (NM_SETTING_802_1X_PHASE1_PEAPVER, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:phase1-peaplabel: - * - * Forces use of the new PEAP label during key derivation. Some RADIUS - * servers may require forcing the new PEAP label to interoperate with - * PEAPv1. Set to "1" to force use of the new PEAP label. See the - * wpa_supplicant documentation for more details. - **/ - g_object_class_install_property - (object_class, PROP_PHASE1_PEAPLABEL, - g_param_spec_string (NM_SETTING_802_1X_PHASE1_PEAPLABEL, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:phase1-fast-provisioning: - * - * Enables or disables in-line provisioning of EAP-FAST credentials when - * FAST is specified as the EAP method in the #NMSetting8021x:eap property. - * Recognized values are "0" (disabled), "1" (allow unauthenticated - * provisioning), "2" (allow authenticated provisioning), and "3" (allow - * both authenticated and unauthenticated provisioning). See the - * wpa_supplicant documentation for more details. - **/ - g_object_class_install_property - (object_class, PROP_PHASE1_FAST_PROVISIONING, - g_param_spec_string (NM_SETTING_802_1X_PHASE1_FAST_PROVISIONING, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:phase2-auth: - * - * Specifies the allowed "phase 2" inner non-EAP authentication methods when - * an EAP method that uses an inner TLS tunnel is specified in the - * #NMSetting8021x:eap property. Recognized non-EAP "phase 2" methods are - * "pap", "chap", "mschap", "mschapv2", "gtc", "otp", "md5", and "tls". - * Each "phase 2" inner method requires specific parameters for successful - * authentication; see the wpa_supplicant documentation for more details. - **/ - g_object_class_install_property - (object_class, PROP_PHASE2_AUTH, - g_param_spec_string (NM_SETTING_802_1X_PHASE2_AUTH, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:phase2-autheap: - * - * Specifies the allowed "phase 2" inner EAP-based authentication methods - * when an EAP method that uses an inner TLS tunnel is specified in the - * #NMSetting8021x:eap property. Recognized EAP-based "phase 2" methods are - * "md5", "mschapv2", "otp", "gtc", and "tls". Each "phase 2" inner method - * requires specific parameters for successful authentication; see the - * wpa_supplicant documentation for more details. - **/ - g_object_class_install_property - (object_class, PROP_PHASE2_AUTHEAP, - g_param_spec_string (NM_SETTING_802_1X_PHASE2_AUTHEAP, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:phase2-ca-cert: - * - * Contains the "phase 2" CA certificate if used by the EAP method specified - * in the #NMSetting8021x:phase2-auth or #NMSetting8021x:phase2-autheap - * properties. - * - * Certificate data is specified using a "scheme"; two are currently - * supported: blob and path. When using the blob scheme (which is backwards - * compatible with NM 0.7.x) this property should be set to the - * certificate's DER encoded data. When using the path scheme, this property - * should be set to the full UTF-8 encoded path of the certificate, prefixed - * with the string "file://" and ending with a terminating NUL byte. This - * property can be unset even if the EAP method supports CA certificates, - * but this allows man-in-the-middle attacks and is NOT recommended. - * - * Setting this property directly is discouraged; use the - * nm_setting_802_1x_set_phase2_ca_cert() function instead. - **/ - g_object_class_install_property - (object_class, PROP_PHASE2_CA_CERT, - _nm_param_spec_specialized (NM_SETTING_802_1X_PHASE2_CA_CERT, "", "", - DBUS_TYPE_G_UCHAR_ARRAY, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:phase2-ca-path: - * - * UTF-8 encoded path to a directory containing PEM or DER formatted - * certificates to be added to the verification chain in addition to the - * certificate specified in the #NMSetting8021x:phase2-ca-cert property. - **/ - g_object_class_install_property - (object_class, PROP_PHASE2_CA_PATH, - g_param_spec_string (NM_SETTING_802_1X_PHASE2_CA_PATH, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:phase2-subject-match: - * - * Substring to be matched against the subject of the certificate presented - * by the authentication server during the inner "phase 2" - * authentication. When unset, no verification of the authentication server - * certificate's subject is performed. - **/ - g_object_class_install_property - (object_class, PROP_PHASE2_SUBJECT_MATCH, - g_param_spec_string (NM_SETTING_802_1X_PHASE2_SUBJECT_MATCH, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:phase2-altsubject-matches: - * - * List of strings to be matched against the altSubjectName of the - * certificate presented by the authentication server during the inner - * "phase 2" authentication. If the list is empty, no verification of the - * server certificate's altSubjectName is performed. - **/ - g_object_class_install_property - (object_class, PROP_PHASE2_ALTSUBJECT_MATCHES, - _nm_param_spec_specialized (NM_SETTING_802_1X_PHASE2_ALTSUBJECT_MATCHES, "", "", - DBUS_TYPE_G_LIST_OF_STRING, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:phase2-client-cert: - * - * Contains the "phase 2" client certificate if used by the EAP method - * specified in the #NMSetting8021x:phase2-auth or - * #NMSetting8021x:phase2-autheap properties. - * - * Certificate data is specified using a "scheme"; two are currently - * supported: blob and path. When using the blob scheme (which is backwards - * compatible with NM 0.7.x) this property should be set to the - * certificate's DER encoded data. When using the path scheme, this property - * should be set to the full UTF-8 encoded path of the certificate, prefixed - * with the string "file://" and ending with a terminating NUL byte. This - * property can be unset even if the EAP method supports CA certificates, - * but this allows man-in-the-middle attacks and is NOT recommended. - * - * Setting this property directly is discouraged; use the - * nm_setting_802_1x_set_phase2_client_cert() function instead. - **/ - g_object_class_install_property - (object_class, PROP_PHASE2_CLIENT_CERT, - _nm_param_spec_specialized (NM_SETTING_802_1X_PHASE2_CLIENT_CERT, "", "", - DBUS_TYPE_G_UCHAR_ARRAY, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:password: - * - * UTF-8 encoded password used for EAP authentication methods. If both the - * #NMSetting8021x:password property and the #NMSetting8021x:password-raw - * property are specified, #NMSetting8021x:password is preferred. - **/ - g_object_class_install_property - (object_class, PROP_PASSWORD, - g_param_spec_string (NM_SETTING_802_1X_PASSWORD, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_SECRET | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:password-flags: - * - * Flags indicating how to handle the #NMSetting8021x:password property. - **/ - g_object_class_install_property - (object_class, PROP_PASSWORD_FLAGS, - g_param_spec_uint (NM_SETTING_802_1X_PASSWORD_FLAGS, "", "", - NM_SETTING_SECRET_FLAG_NONE, - NM_SETTING_SECRET_FLAGS_ALL, - NM_SETTING_SECRET_FLAG_NONE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:password-raw: - * - * Password used for EAP authentication methods, given as a byte array to - * allow passwords in other encodings than UTF-8 to be used. If both the - * #NMSetting8021x:password property and the #NMSetting8021x:password-raw - * property are specified, #NMSetting8021x:password is preferred. - **/ - g_object_class_install_property - (object_class, PROP_PASSWORD_RAW, - _nm_param_spec_specialized (NM_SETTING_802_1X_PASSWORD_RAW, "", "", - DBUS_TYPE_G_UCHAR_ARRAY, - G_PARAM_READWRITE | - NM_SETTING_PARAM_SECRET | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:password-raw-flags: - * - * Flags indicating how to handle the #NMSetting8021x:password-raw property. - **/ - g_object_class_install_property - (object_class, PROP_PASSWORD_RAW_FLAGS, - g_param_spec_uint (NM_SETTING_802_1X_PASSWORD_RAW_FLAGS, "", "", - NM_SETTING_SECRET_FLAG_NONE, - NM_SETTING_SECRET_FLAGS_ALL, - NM_SETTING_SECRET_FLAG_NONE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:private-key: - * - * Contains the private key when the #NMSetting8021x:eap property is set to - * "tls". - * - * Key data is specified using a "scheme"; two are currently supported: blob - * and path. When using the blob scheme and private keys, this property - * should be set to the key's encrypted PEM encoded data. When using private - * keys with the path scheme, this property should be set to the full UTF-8 - * encoded path of the key, prefixed with the string "file://" and ending - * with a terminating NUL byte. When using PKCS#<!-- -->12 format private keys and - * the blob scheme, this property should be set to the PKCS#<!-- -->12 data and the - * #NMSetting8021x:private-key-password property must be set to password - * used to decrypt the PKCS#<!-- -->12 certificate and key. When using PKCS#<!-- -->12 files - * and the path scheme, this property should be set to the full UTF-8 - * encoded path of the key, prefixed with the string "file://" and - * ending with a terminating NUL byte, and as with the blob scheme the - * "private-key-password" property must be set to the password used to - * decode the PKCS#<!-- -->12 private key and certificate. - * - * Setting this property directly is discouraged; use the - * nm_setting_802_1x_set_private_key() function instead. - * - * WARNING: #NMSetting8021x:private-key is not a "secret" property, and thus - * unencrypted private key data using the BLOB scheme may be readable by - * unprivileged users. Private keys should always be encrypted with a - * private key password to prevent unauthorized access to unencrypted - * private key data. - **/ - g_object_class_install_property - (object_class, PROP_PRIVATE_KEY, - _nm_param_spec_specialized (NM_SETTING_802_1X_PRIVATE_KEY, "", "", - DBUS_TYPE_G_UCHAR_ARRAY, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:private-key-password: - * - * The password used to decrypt the private key specified in the - * #NMSetting8021x:private-key property when the private key either uses the - * path scheme, or if the private key is a PKCS#<!-- -->12 format key. Setting this - * property directly is not generally necessary except when returning - * secrets to NetworkManager; it is generally set automatically when setting - * the private key by the nm_setting_802_1x_set_private_key() function. - **/ - g_object_class_install_property - (object_class, PROP_PRIVATE_KEY_PASSWORD, - g_param_spec_string (NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_SECRET | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:private-key-password-flags: - * - * Flags indicating how to handle the #NMSetting8021x:private-key-password - * property. - **/ - g_object_class_install_property - (object_class, PROP_PRIVATE_KEY_PASSWORD_FLAGS, - g_param_spec_uint (NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD_FLAGS, "", "", - NM_SETTING_SECRET_FLAG_NONE, - NM_SETTING_SECRET_FLAGS_ALL, - NM_SETTING_SECRET_FLAG_NONE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:phase2-private-key: - * - * Contains the "phase 2" inner private key when the - * #NMSetting8021x:phase2-auth or #NMSetting8021x:phase2-autheap property is - * set to "tls". - * - * Key data is specified using a "scheme"; two are currently supported: blob - * and path. When using the blob scheme and private keys, this property - * should be set to the key's encrypted PEM encoded data. When using private - * keys with the path scheme, this property should be set to the full UTF-8 - * encoded path of the key, prefixed with the string "file://" and ending - * with a terminating NUL byte. When using PKCS#<!-- -->12 format private keys and - * the blob scheme, this property should be set to the PKCS#<!-- -->12 data and the - * #NMSetting8021x:phase2-private-key-password property must be set to - * password used to decrypt the PKCS#<!-- -->12 certificate and key. When using - * PKCS#<!-- -->12 files and the path scheme, this property should be set to the - * full UTF-8 encoded path of the key, prefixed with the string "file://" - * and ending with a terminating NUL byte, and as with the blob scheme - * the #NMSetting8021x:phase2-private-key-password property must be set to - * the password used to decode the PKCS#<!-- -->12 private key and certificate. - * - * Setting this property directly is discouraged; use the - * nm_setting_802_1x_set_phase2_private_key() function instead. - **/ - g_object_class_install_property - (object_class, PROP_PHASE2_PRIVATE_KEY, - _nm_param_spec_specialized (NM_SETTING_802_1X_PHASE2_PRIVATE_KEY, "", "", - DBUS_TYPE_G_UCHAR_ARRAY, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:phase2-private-key-password: - * - * The password used to decrypt the "phase 2" private key specified in the - * #NMSetting8021x:phase2-private-key property when the private key either - * uses the path scheme, or is a PKCS#<!-- -->12 format key. Setting this property - * directly is not generally necessary except when returning secrets to - * NetworkManager; it is generally set automatically when setting the - * private key by the nm_setting_802_1x_set_phase2_private_key() function. - **/ - g_object_class_install_property - (object_class, PROP_PHASE2_PRIVATE_KEY_PASSWORD, - g_param_spec_string (NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_SECRET | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:phase2-private-key-password-flags: - * - * Flags indicating how to handle the - * #NMSetting8021x:phase2-private-key-password property. - **/ - g_object_class_install_property - (object_class, PROP_PHASE2_PRIVATE_KEY_PASSWORD_FLAGS, - g_param_spec_uint (NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD_FLAGS, "", "", - NM_SETTING_SECRET_FLAG_NONE, - NM_SETTING_SECRET_FLAGS_ALL, - NM_SETTING_SECRET_FLAG_NONE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:pin: - * - * PIN used for EAP authentication methods. - **/ - g_object_class_install_property - (object_class, PROP_PIN, - g_param_spec_string (NM_SETTING_802_1X_PIN, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_SECRET | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:pin-flags: - * - * Flags indicating how to handle the #NMSetting8021x:pin property. - **/ - g_object_class_install_property - (object_class, PROP_PIN_FLAGS, - g_param_spec_uint (NM_SETTING_802_1X_PIN_FLAGS, "", "", - NM_SETTING_SECRET_FLAG_NONE, - NM_SETTING_SECRET_FLAGS_ALL, - NM_SETTING_SECRET_FLAG_NONE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSetting8021x:system-ca-certs: - * - * When %TRUE, overrides the #NMSetting8021x:ca-path and - * #NMSetting8021x:phase2-ca-path properties using the system CA directory - * specified at configure time with the --system-ca-path switch. The - * certificates in this directory are added to the verification chain in - * addition to any certificates specified by the #NMSetting8021x:ca-cert and - * #NMSetting8021x:phase2-ca-cert properties. - **/ - g_object_class_install_property - (object_class, PROP_SYSTEM_CA_CERTS, - g_param_spec_boolean (NM_SETTING_802_1X_SYSTEM_CA_CERTS, "", "", - FALSE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /* Initialize crypto lbrary. */ - if (!nm_utils_init (&error)) { - g_warning ("Couldn't initialize nm-utils/crypto system: %s", - error->message); - g_error_free (error); - } -} diff --git a/libnm-util/nm-setting-8021x.h b/libnm-util/nm-setting-8021x.h deleted file mode 100644 index b3e1e540a7..0000000000 --- a/libnm-util/nm-setting-8021x.h +++ /dev/null @@ -1,294 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2014 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#ifndef NM_SETTING_8021X_H -#define NM_SETTING_8021X_H - -#include "nm-setting.h" - -G_BEGIN_DECLS - -/** - * NMSetting8021xCKFormat: - * @NM_SETTING_802_1X_CK_FORMAT_UNKNOWN: unknown file format - * @NM_SETTING_802_1X_CK_FORMAT_X509: file contains an X.509 format certificate - * @NM_SETTING_802_1X_CK_FORMAT_RAW_KEY: file contains an old-style OpenSSL PEM - * or DER private key - * @NM_SETTING_802_1X_CK_FORMAT_PKCS12: file contains a PKCS#<!-- -->12 certificate - * and private key - * - * #NMSetting8021xCKFormat values indicate the general type of a certificate - * or private key - */ -typedef enum { /*< underscore_name=nm_setting_802_1x_ck_format >*/ - NM_SETTING_802_1X_CK_FORMAT_UNKNOWN = 0, - NM_SETTING_802_1X_CK_FORMAT_X509, - NM_SETTING_802_1X_CK_FORMAT_RAW_KEY, - NM_SETTING_802_1X_CK_FORMAT_PKCS12 -} NMSetting8021xCKFormat; - -/** - * NMSetting8021xCKScheme: - * @NM_SETTING_802_1X_CK_SCHEME_UNKNOWN: unknown certificate or private key - * scheme - * @NM_SETTING_802_1X_CK_SCHEME_BLOB: certificate or key is stored as the raw - * item data - * @NM_SETTING_802_1X_CK_SCHEME_PATH: certificate or key is stored as a path - * to a file containing the certificate or key data - * - * #NMSetting8021xCKScheme values indicate how a certificate or private key is - * stored in the setting properties, either as a blob of the item's data, or as - * a path to a certificate or private key file on the filesystem - */ -typedef enum { /*< underscore_name=nm_setting_802_1x_ck_scheme >*/ - NM_SETTING_802_1X_CK_SCHEME_UNKNOWN = 0, - NM_SETTING_802_1X_CK_SCHEME_BLOB, - NM_SETTING_802_1X_CK_SCHEME_PATH -} NMSetting8021xCKScheme; - -#define NM_TYPE_SETTING_802_1X (nm_setting_802_1x_get_type ()) -#define NM_SETTING_802_1X(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_802_1X, NMSetting8021x)) -#define NM_SETTING_802_1X_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_802_1X, NMSetting8021xClass)) -#define NM_IS_SETTING_802_1X(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_802_1X)) -#define NM_IS_SETTING_802_1X_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_802_1X)) -#define NM_SETTING_802_1X_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_802_1X, NMSetting8021xClass)) - -#define NM_SETTING_802_1X_SETTING_NAME "802-1x" - -/** - * NMSetting8021xError: - * @NM_SETTING_802_1X_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_802_1X_ERROR_INVALID_PROPERTY: the property was invalid - * @NM_SETTING_802_1X_ERROR_MISSING_PROPERTY: the property was missing and is - * required - */ -typedef enum { /*< underscore_name=nm_setting_802_1x_error >*/ - NM_SETTING_802_1X_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_SETTING_802_1X_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/ - NM_SETTING_802_1X_ERROR_MISSING_PROPERTY /*< nick=MissingProperty >*/ -} NMSetting8021xError; - -#define NM_SETTING_802_1X_ERROR nm_setting_802_1x_error_quark () -GQuark nm_setting_802_1x_error_quark (void); - -#define NM_SETTING_802_1X_EAP "eap" -#define NM_SETTING_802_1X_IDENTITY "identity" -#define NM_SETTING_802_1X_ANONYMOUS_IDENTITY "anonymous-identity" -#define NM_SETTING_802_1X_PAC_FILE "pac-file" -#define NM_SETTING_802_1X_CA_CERT "ca-cert" -#define NM_SETTING_802_1X_CA_PATH "ca-path" -#define NM_SETTING_802_1X_SUBJECT_MATCH "subject-match" -#define NM_SETTING_802_1X_ALTSUBJECT_MATCHES "altsubject-matches" -#define NM_SETTING_802_1X_CLIENT_CERT "client-cert" -#define NM_SETTING_802_1X_PHASE1_PEAPVER "phase1-peapver" -#define NM_SETTING_802_1X_PHASE1_PEAPLABEL "phase1-peaplabel" -#define NM_SETTING_802_1X_PHASE1_FAST_PROVISIONING "phase1-fast-provisioning" -#define NM_SETTING_802_1X_PHASE2_AUTH "phase2-auth" -#define NM_SETTING_802_1X_PHASE2_AUTHEAP "phase2-autheap" -#define NM_SETTING_802_1X_PHASE2_CA_CERT "phase2-ca-cert" -#define NM_SETTING_802_1X_PHASE2_CA_PATH "phase2-ca-path" -#define NM_SETTING_802_1X_PHASE2_SUBJECT_MATCH "phase2-subject-match" -#define NM_SETTING_802_1X_PHASE2_ALTSUBJECT_MATCHES "phase2-altsubject-matches" -#define NM_SETTING_802_1X_PHASE2_CLIENT_CERT "phase2-client-cert" -#define NM_SETTING_802_1X_PASSWORD "password" -#define NM_SETTING_802_1X_PASSWORD_FLAGS "password-flags" -#define NM_SETTING_802_1X_PASSWORD_RAW "password-raw" -#define NM_SETTING_802_1X_PASSWORD_RAW_FLAGS "password-raw-flags" -#define NM_SETTING_802_1X_PRIVATE_KEY "private-key" -#define NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD "private-key-password" -#define NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD_FLAGS "private-key-password-flags" -#define NM_SETTING_802_1X_PHASE2_PRIVATE_KEY "phase2-private-key" -#define NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD "phase2-private-key-password" -#define NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD_FLAGS "phase2-private-key-password-flags" -#define NM_SETTING_802_1X_PIN "pin" -#define NM_SETTING_802_1X_PIN_FLAGS "pin-flags" -#define NM_SETTING_802_1X_SYSTEM_CA_CERTS "system-ca-certs" - -/* PRIVATE KEY NOTE: when setting PKCS#12 private keys directly via properties - * using the "blob" scheme, the data must be passed in PKCS#12 binary format. - * In this case, the appropriate "client-cert" (or "phase2-client-cert") - * property of the NMSetting8021x object must also contain the exact same - * PKCS#12 binary data that the private key does. This is because the - * PKCS#12 file contains both the private key and client certificate, so both - * properties need to be set to the same thing. When using the "path" scheme, - * just set both the private-key and client-cert properties to the same path. - * - * When setting OpenSSL-derived "traditional" format (ie S/MIME style, not - * PKCS#8) RSA and DSA keys directly via properties with the "blob" scheme, they - * should be passed to NetworkManager in PEM format with the "DEK-Info" and - * "Proc-Type" tags intact. Decrypted private keys should not be used as this - * is insecure and could allow unprivileged users to access the decrypted - * private key data. - * - * When using the "path" scheme, just set the private-key and client-cert - * properties to the paths to their respective objects. - */ - -typedef struct { - NMSetting parent; -} NMSetting8021x; - -typedef struct { - NMSettingClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); -} NMSetting8021xClass; - -GType nm_setting_802_1x_get_type (void); - -NMSetting *nm_setting_802_1x_new (void); - -guint32 nm_setting_802_1x_get_num_eap_methods (NMSetting8021x *setting); -const char * nm_setting_802_1x_get_eap_method (NMSetting8021x *setting, guint32 i); -gboolean nm_setting_802_1x_add_eap_method (NMSetting8021x *setting, const char *eap); -void nm_setting_802_1x_remove_eap_method (NMSetting8021x *setting, guint32 i); -NM_AVAILABLE_IN_0_9_10 -gboolean nm_setting_802_1x_remove_eap_method_by_value (NMSetting8021x *setting, const char *eap); -void nm_setting_802_1x_clear_eap_methods (NMSetting8021x *setting); - -const char * nm_setting_802_1x_get_identity (NMSetting8021x *setting); - -const char * nm_setting_802_1x_get_anonymous_identity (NMSetting8021x *setting); - -const char * nm_setting_802_1x_get_pac_file (NMSetting8021x *setting); - -gboolean nm_setting_802_1x_get_system_ca_certs (NMSetting8021x *setting); -const char * nm_setting_802_1x_get_ca_path (NMSetting8021x *setting); -const char * nm_setting_802_1x_get_phase2_ca_path (NMSetting8021x *setting); - -NMSetting8021xCKScheme nm_setting_802_1x_get_ca_cert_scheme (NMSetting8021x *setting); -const GByteArray * nm_setting_802_1x_get_ca_cert_blob (NMSetting8021x *setting); -const char * nm_setting_802_1x_get_ca_cert_path (NMSetting8021x *setting); -gboolean nm_setting_802_1x_set_ca_cert (NMSetting8021x *setting, - const char *cert_path, - NMSetting8021xCKScheme scheme, - NMSetting8021xCKFormat *out_format, - GError **error); - -const char * nm_setting_802_1x_get_subject_match (NMSetting8021x *setting); - -guint32 nm_setting_802_1x_get_num_altsubject_matches (NMSetting8021x *setting); -const char * nm_setting_802_1x_get_altsubject_match (NMSetting8021x *setting, - guint32 i); -gboolean nm_setting_802_1x_add_altsubject_match (NMSetting8021x *setting, - const char *altsubject_match); -void nm_setting_802_1x_remove_altsubject_match (NMSetting8021x *setting, - guint32 i); -NM_AVAILABLE_IN_0_9_10 -gboolean nm_setting_802_1x_remove_altsubject_match_by_value (NMSetting8021x *setting, - const char *altsubject_match); -void nm_setting_802_1x_clear_altsubject_matches (NMSetting8021x *setting); - -NMSetting8021xCKScheme nm_setting_802_1x_get_client_cert_scheme (NMSetting8021x *setting); -const GByteArray * nm_setting_802_1x_get_client_cert_blob (NMSetting8021x *setting); -const char * nm_setting_802_1x_get_client_cert_path (NMSetting8021x *setting); -gboolean nm_setting_802_1x_set_client_cert (NMSetting8021x *setting, - const char *cert_path, - NMSetting8021xCKScheme scheme, - NMSetting8021xCKFormat *out_format, - GError **error); - -const char * nm_setting_802_1x_get_phase1_peapver (NMSetting8021x *setting); - -const char * nm_setting_802_1x_get_phase1_peaplabel (NMSetting8021x *setting); - -const char * nm_setting_802_1x_get_phase1_fast_provisioning (NMSetting8021x *setting); - -const char * nm_setting_802_1x_get_phase2_auth (NMSetting8021x *setting); - -const char * nm_setting_802_1x_get_phase2_autheap (NMSetting8021x *setting); - -NMSetting8021xCKScheme nm_setting_802_1x_get_phase2_ca_cert_scheme (NMSetting8021x *setting); -const GByteArray * nm_setting_802_1x_get_phase2_ca_cert_blob (NMSetting8021x *setting); -const char * nm_setting_802_1x_get_phase2_ca_cert_path (NMSetting8021x *setting); -gboolean nm_setting_802_1x_set_phase2_ca_cert (NMSetting8021x *setting, - const char *cert_path, - NMSetting8021xCKScheme scheme, - NMSetting8021xCKFormat *out_format, - GError **error); - -const char * nm_setting_802_1x_get_phase2_subject_match (NMSetting8021x *setting); - -guint32 nm_setting_802_1x_get_num_phase2_altsubject_matches (NMSetting8021x *setting); -const char * nm_setting_802_1x_get_phase2_altsubject_match (NMSetting8021x *setting, - guint32 i); -gboolean nm_setting_802_1x_add_phase2_altsubject_match (NMSetting8021x *setting, - const char *phase2_altsubject_match); -void nm_setting_802_1x_remove_phase2_altsubject_match (NMSetting8021x *setting, - guint32 i); -NM_AVAILABLE_IN_0_9_10 -gboolean nm_setting_802_1x_remove_phase2_altsubject_match_by_value (NMSetting8021x *setting, - const char *phase2_altsubject_match); -void nm_setting_802_1x_clear_phase2_altsubject_matches (NMSetting8021x *setting); - -NMSetting8021xCKScheme nm_setting_802_1x_get_phase2_client_cert_scheme (NMSetting8021x *setting); -const GByteArray * nm_setting_802_1x_get_phase2_client_cert_blob (NMSetting8021x *setting); -const char * nm_setting_802_1x_get_phase2_client_cert_path (NMSetting8021x *setting); -gboolean nm_setting_802_1x_set_phase2_client_cert (NMSetting8021x *setting, - const char *cert_path, - NMSetting8021xCKScheme scheme, - NMSetting8021xCKFormat *out_format, - GError **error); - -const char * nm_setting_802_1x_get_password (NMSetting8021x *setting); -NMSettingSecretFlags nm_setting_802_1x_get_password_flags (NMSetting8021x *setting); -const GByteArray * nm_setting_802_1x_get_password_raw (NMSetting8021x *setting); -NMSettingSecretFlags nm_setting_802_1x_get_password_raw_flags (NMSetting8021x *setting); - -const char * nm_setting_802_1x_get_pin (NMSetting8021x *setting); -NMSettingSecretFlags nm_setting_802_1x_get_pin_flags (NMSetting8021x *setting); - -NMSetting8021xCKScheme nm_setting_802_1x_get_private_key_scheme (NMSetting8021x *setting); -const GByteArray * nm_setting_802_1x_get_private_key_blob (NMSetting8021x *setting); -const char * nm_setting_802_1x_get_private_key_path (NMSetting8021x *setting); -gboolean nm_setting_802_1x_set_private_key (NMSetting8021x *setting, - const char *key_path, - const char *password, - NMSetting8021xCKScheme scheme, - NMSetting8021xCKFormat *out_format, - GError **error); -const char * nm_setting_802_1x_get_private_key_password (NMSetting8021x *setting); -NMSettingSecretFlags nm_setting_802_1x_get_private_key_password_flags (NMSetting8021x *setting); - -NMSetting8021xCKFormat nm_setting_802_1x_get_private_key_format (NMSetting8021x *setting); - -NMSetting8021xCKScheme nm_setting_802_1x_get_phase2_private_key_scheme (NMSetting8021x *setting); -const GByteArray * nm_setting_802_1x_get_phase2_private_key_blob (NMSetting8021x *setting); -const char * nm_setting_802_1x_get_phase2_private_key_path (NMSetting8021x *setting); -gboolean nm_setting_802_1x_set_phase2_private_key (NMSetting8021x *setting, - const char *key_path, - const char *password, - NMSetting8021xCKScheme scheme, - NMSetting8021xCKFormat *out_format, - GError **error); -const char * nm_setting_802_1x_get_phase2_private_key_password (NMSetting8021x *setting); -NMSettingSecretFlags nm_setting_802_1x_get_phase2_private_key_password_flags (NMSetting8021x *setting); - -NMSetting8021xCKFormat nm_setting_802_1x_get_phase2_private_key_format (NMSetting8021x *setting); - -G_END_DECLS - -#endif /* NM_SETTING_8021X_H */ diff --git a/libnm-util/nm-setting-adsl.c b/libnm-util/nm-setting-adsl.c deleted file mode 100644 index f2305b38df..0000000000 --- a/libnm-util/nm-setting-adsl.c +++ /dev/null @@ -1,462 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2011 - 2013 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> - -#include "nm-setting-adsl.h" -#include "nm-setting-ppp.h" -#include "nm-setting-private.h" -#include "nm-utils.h" - -/** - * SECTION:nm-setting-adsl - * @short_description: Describes ADSL-based properties - * @include: nm-setting-adsl.h - * - * The #NMSettingAdsl object is a #NMSetting subclass that describes - * properties of ADSL connections. - */ - -/** - * nm_setting_adsl_error_quark: - * - * Registers an error quark for #NMSettingAdsl if necessary. - * - * Returns: the error quark used for #NMSettingAdsl errors. - **/ -GQuark -nm_setting_adsl_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-adsl-error-quark"); - return quark; -} - -G_DEFINE_TYPE_WITH_CODE (NMSettingAdsl, nm_setting_adsl, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_ADSL_SETTING_NAME, - g_define_type_id, - 1, - NM_SETTING_ADSL_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_ADSL) - -#define NM_SETTING_ADSL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_ADSL, NMSettingAdslPrivate)) - -typedef struct { - char * username; - char * password; - NMSettingSecretFlags password_flags; - char * protocol; - char * encapsulation; - guint32 vpi; - guint32 vci; -} NMSettingAdslPrivate; - -enum { - PROP_0, - PROP_USERNAME, - PROP_PASSWORD, - PROP_PASSWORD_FLAGS, - PROP_PROTOCOL, - PROP_ENCAPSULATION, - PROP_VPI, - PROP_VCI, - - LAST_PROP -}; - -/** - * nm_setting_adsl_new: - * - * Creates a new #NMSettingAdsl object with default values. - * - * Returns: the new empty #NMSettingAdsl object - **/ -NMSetting * -nm_setting_adsl_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_ADSL, NULL); -} - -/** - * nm_setting_adsl_get_username: - * @setting: the #NMSettingAdsl - * - * Returns: the #NMSettingAdsl:username property of the setting - **/ -const char * -nm_setting_adsl_get_username (NMSettingAdsl *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_ADSL (setting), NULL); - - return NM_SETTING_ADSL_GET_PRIVATE (setting)->username; -} - -/** - * nm_setting_adsl_get_password: - * @setting: the #NMSettingAdsl - * - * Returns: the #NMSettingAdsl:password property of the setting - **/ -const char * -nm_setting_adsl_get_password (NMSettingAdsl *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_ADSL (setting), NULL); - - return NM_SETTING_ADSL_GET_PRIVATE (setting)->password; -} - -/** - * nm_setting_adsl_get_password_flags: - * @setting: the #NMSettingAdsl - * - * Returns: the #NMSettingSecretFlags pertaining to the #NMSettingAdsl:password - **/ -NMSettingSecretFlags -nm_setting_adsl_get_password_flags (NMSettingAdsl *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_ADSL (setting), NM_SETTING_SECRET_FLAG_NONE); - - return NM_SETTING_ADSL_GET_PRIVATE (setting)->password_flags; -} - -/** - * nm_setting_adsl_get_protocol: - * @setting: the #NMSettingAdsl - * - * Returns: the #NMSettingAdsl:protocol property of the setting - **/ -const char * -nm_setting_adsl_get_protocol (NMSettingAdsl *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_ADSL (setting), NULL); - - return NM_SETTING_ADSL_GET_PRIVATE (setting)->protocol; -} - -/** - * nm_setting_adsl_get_encapsulation: - * @setting: the #NMSettingAdsl - * - * Returns: the #NMSettingAdsl:encapsulation property of the setting - **/ -const char * -nm_setting_adsl_get_encapsulation (NMSettingAdsl *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_ADSL (setting), NULL); - - return NM_SETTING_ADSL_GET_PRIVATE (setting)->encapsulation; -} - -/** - * nm_setting_adsl_get_vpi: - * @setting: the #NMSettingAdsl - * - * Returns: the #NMSettingAdsl:vpi property of the setting - **/ -guint32 -nm_setting_adsl_get_vpi (NMSettingAdsl *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_ADSL (setting), 0); - - return NM_SETTING_ADSL_GET_PRIVATE (setting)->vpi; -} - -/** - * nm_setting_adsl_get_vci: - * @setting: the #NMSettingAdsl - * - * Returns: the #NMSettingAdsl:vci property of the setting - **/ -guint32 -nm_setting_adsl_get_vci (NMSettingAdsl *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_ADSL (setting), 0); - - return NM_SETTING_ADSL_GET_PRIVATE (setting)->vci; -} - -static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - NMSettingAdslPrivate *priv = NM_SETTING_ADSL_GET_PRIVATE (setting); - - if (!priv->username) { - g_set_error_literal (error, - NM_SETTING_ADSL_ERROR, - NM_SETTING_ADSL_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_ADSL_SETTING_NAME, NM_SETTING_ADSL_USERNAME); - return FALSE; - } else if (!strlen (priv->username)) { - g_set_error_literal (error, - NM_SETTING_ADSL_ERROR, - NM_SETTING_ADSL_ERROR_INVALID_PROPERTY, - _("property is empty")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_ADSL_SETTING_NAME, NM_SETTING_ADSL_USERNAME); - return FALSE; - } - - if ( !priv->protocol - || ( strcmp (priv->protocol, NM_SETTING_ADSL_PROTOCOL_PPPOA) - && strcmp (priv->protocol, NM_SETTING_ADSL_PROTOCOL_PPPOE) - && strcmp (priv->protocol, NM_SETTING_ADSL_PROTOCOL_IPOATM))){ - g_set_error (error, - NM_SETTING_ADSL_ERROR, - NM_SETTING_ADSL_ERROR_INVALID_PROPERTY, - _("'%s' is not a valid value for the property"), - priv->protocol ?: "(null)"); - g_prefix_error (error, "%s.%s: ", NM_SETTING_ADSL_SETTING_NAME, NM_SETTING_ADSL_PROTOCOL); - return FALSE; - } - - if ( priv->encapsulation - && ( strcmp (priv->encapsulation, NM_SETTING_ADSL_ENCAPSULATION_VCMUX) - && strcmp (priv->encapsulation, NM_SETTING_ADSL_ENCAPSULATION_LLC) )) { - g_set_error (error, - NM_SETTING_ADSL_ERROR, - NM_SETTING_ADSL_ERROR_INVALID_PROPERTY, - _("'%s' is not a valid value for the property"), - priv->encapsulation); - g_prefix_error (error, "%s.%s: ", NM_SETTING_ADSL_SETTING_NAME, NM_SETTING_ADSL_ENCAPSULATION); - return FALSE; - } - - return TRUE; -} - -static GPtrArray * -need_secrets (NMSetting *setting) -{ - NMSettingAdslPrivate *priv = NM_SETTING_ADSL_GET_PRIVATE (setting); - GPtrArray *secrets = NULL; - - if (priv->password && *priv->password) - return NULL; - - if (!(priv->password_flags & NM_SETTING_SECRET_FLAG_NOT_REQUIRED)) { - secrets = g_ptr_array_sized_new (1); - g_ptr_array_add (secrets, NM_SETTING_ADSL_PASSWORD); - } - - return secrets; -} - -static void -nm_setting_adsl_init (NMSettingAdsl *setting) -{ -} - -static void -finalize (GObject *object) -{ - NMSettingAdslPrivate *priv = NM_SETTING_ADSL_GET_PRIVATE (object); - - g_free (priv->username); - g_free (priv->password); - g_free (priv->protocol); - g_free (priv->encapsulation); - - G_OBJECT_CLASS (nm_setting_adsl_parent_class)->finalize (object); -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSettingAdslPrivate *priv = NM_SETTING_ADSL_GET_PRIVATE (object); - const char *str; - - switch (prop_id) { - case PROP_USERNAME: - g_free (priv->username); - priv->username = g_value_dup_string (value); - break; - case PROP_PASSWORD: - g_free (priv->password); - priv->password = g_value_dup_string (value); - break; - case PROP_PASSWORD_FLAGS: - priv->password_flags = g_value_get_uint (value); - break; - case PROP_PROTOCOL: - g_free (priv->protocol); - str = g_value_get_string (value); - priv->protocol = str ? g_ascii_strdown (str, -1) : NULL; - break; - case PROP_ENCAPSULATION: - g_free (priv->encapsulation); - str = g_value_get_string (value); - priv->encapsulation = str ? g_ascii_strdown (str, -1) : NULL; - break; - case PROP_VPI: - priv->vpi = g_value_get_uint (value); - break; - case PROP_VCI: - priv->vci = g_value_get_uint (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSettingAdsl *setting = NM_SETTING_ADSL (object); - - switch (prop_id) { - case PROP_USERNAME: - g_value_set_string (value, nm_setting_adsl_get_username (setting)); - break; - case PROP_PASSWORD: - g_value_set_string (value, nm_setting_adsl_get_password (setting)); - break; - case PROP_PASSWORD_FLAGS: - g_value_set_uint (value, nm_setting_adsl_get_password_flags (setting)); - break; - case PROP_PROTOCOL: - g_value_set_string (value, nm_setting_adsl_get_protocol (setting)); - break; - case PROP_ENCAPSULATION: - g_value_set_string (value, nm_setting_adsl_get_encapsulation (setting)); - break; - case PROP_VPI: - g_value_set_uint (value, nm_setting_adsl_get_vpi (setting)); - break; - case PROP_VCI: - g_value_set_uint (value, nm_setting_adsl_get_vci (setting)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_setting_adsl_class_init (NMSettingAdslClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingAdslPrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->finalize = finalize; - parent_class->verify = verify; - parent_class->need_secrets = need_secrets; - - /* Properties */ - - /** - * NMSettingAdsl:username: - * - * Username used to authenticate with the ADSL service. - **/ - g_object_class_install_property - (object_class, PROP_USERNAME, - g_param_spec_string (NM_SETTING_ADSL_USERNAME, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingAdsl:password: - * - * Password used to authenticate with the ADSL service. - **/ - g_object_class_install_property - (object_class, PROP_PASSWORD, - g_param_spec_string (NM_SETTING_ADSL_PASSWORD, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_SECRET | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingAdsl:password-flags: - * - * Flags indicating how to handle the #NMSettingAdsl:password property. - **/ - g_object_class_install_property - (object_class, PROP_PASSWORD_FLAGS, - g_param_spec_uint (NM_SETTING_ADSL_PASSWORD_FLAGS, "", "", - NM_SETTING_SECRET_FLAG_NONE, - NM_SETTING_SECRET_FLAGS_ALL, - NM_SETTING_SECRET_FLAG_NONE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingAdsl:protocol: - * - * ADSL connection protocol. Can be "pppoa", "pppoe" or "ipoatm". - **/ - g_object_class_install_property - (object_class, PROP_PROTOCOL, - g_param_spec_string (NM_SETTING_ADSL_PROTOCOL, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingAdsl:encapsulation: - * - * Encapsulation of ADSL connection. Can be "vcmux" or "llc". - **/ - g_object_class_install_property - (object_class, PROP_ENCAPSULATION, - g_param_spec_string (NM_SETTING_ADSL_ENCAPSULATION, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingAdsl:vpi: - * - * VPI of ADSL connection - **/ - g_object_class_install_property - (object_class, PROP_VPI, - g_param_spec_uint (NM_SETTING_ADSL_VPI, "", "", - 0, 65536, 0, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingAdsl:vci: - * - * VCI of ADSL connection - **/ - g_object_class_install_property - (object_class, PROP_VCI, - g_param_spec_uint (NM_SETTING_ADSL_VCI, "", "", - 0, 65536, 0, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-util/nm-setting-adsl.h b/libnm-util/nm-setting-adsl.h deleted file mode 100644 index 777f0b3636..0000000000 --- a/libnm-util/nm-setting-adsl.h +++ /dev/null @@ -1,96 +0,0 @@ -/* -*- mode: c; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Red Hat, Inc. - */ - -#ifndef NM_SETTING_ADSL_H -#define NM_SETTING_ADSL_H - -#include "nm-setting.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SETTING_ADSL (nm_setting_adsl_get_type ()) -#define NM_SETTING_ADSL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_ADSL, NMSettingAdsl)) -#define NM_SETTING_ADSL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_ADSL, NMSettingAdslClass)) -#define NM_IS_SETTING_ADSL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_ADSL)) -#define NM_IS_SETTING_ADSL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_ADSL)) -#define NM_SETTING_ADSL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_ADSL, NMSettingAdslClass)) - -#define NM_SETTING_ADSL_SETTING_NAME "adsl" - -/** - * NMSettingAdslError: - * @NM_SETTING_ADSL_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_ADSL_ERROR_INVALID_PROPERTY: the property was invalid - * @NM_SETTING_ADSL_ERROR_MISSING_PROPERTY: the property was missing and is - * required - */ -typedef enum { - NM_SETTING_ADSL_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_SETTING_ADSL_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/ - NM_SETTING_ADSL_ERROR_MISSING_PROPERTY /*< nick=MissingProperty >*/ -} NMSettingAdslError; - -#define NM_SETTING_ADSL_ERROR nm_setting_adsl_error_quark () -GQuark nm_setting_adsl_error_quark (void); - -#define NM_SETTING_ADSL_USERNAME "username" -#define NM_SETTING_ADSL_PASSWORD "password" -#define NM_SETTING_ADSL_PASSWORD_FLAGS "password-flags" -#define NM_SETTING_ADSL_PROTOCOL "protocol" -#define NM_SETTING_ADSL_ENCAPSULATION "encapsulation" -#define NM_SETTING_ADSL_VPI "vpi" -#define NM_SETTING_ADSL_VCI "vci" - -#define NM_SETTING_ADSL_PROTOCOL_PPPOA "pppoa" -#define NM_SETTING_ADSL_PROTOCOL_PPPOE "pppoe" -#define NM_SETTING_ADSL_PROTOCOL_IPOATM "ipoatm" - -#define NM_SETTING_ADSL_ENCAPSULATION_VCMUX "vcmux" -#define NM_SETTING_ADSL_ENCAPSULATION_LLC "llc" - -typedef struct { - NMSetting parent; -} NMSettingAdsl; - -typedef struct { - NMSettingClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); -} NMSettingAdslClass; - -GType nm_setting_adsl_get_type (void); - -NMSetting *nm_setting_adsl_new (void); -const char *nm_setting_adsl_get_username (NMSettingAdsl *setting); -const char *nm_setting_adsl_get_password (NMSettingAdsl *setting); -const char *nm_setting_adsl_get_protocol (NMSettingAdsl *setting); -const char *nm_setting_adsl_get_encapsulation (NMSettingAdsl *setting); -guint32 nm_setting_adsl_get_vpi (NMSettingAdsl *setting); -guint32 nm_setting_adsl_get_vci (NMSettingAdsl *setting); -NMSettingSecretFlags nm_setting_adsl_get_password_flags (NMSettingAdsl *setting); - -G_END_DECLS - -#endif /* NM_SETTING_ADSL_H */ diff --git a/libnm-util/nm-setting-bluetooth.c b/libnm-util/nm-setting-bluetooth.c deleted file mode 100644 index d26a5b8f07..0000000000 --- a/libnm-util/nm-setting-bluetooth.c +++ /dev/null @@ -1,298 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2013 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <net/ethernet.h> - -#include "nm-param-spec-specialized.h" -#include "nm-dbus-glib-types.h" -#include "nm-setting-bluetooth.h" -#include "nm-setting-cdma.h" -#include "nm-setting-gsm.h" -#include "nm-setting-private.h" - -/** - * SECTION:nm-setting-bluetooth - * @short_description: Describes Bluetooth connection properties - * @include: nm-setting-bluetooth.h - * - * The #NMSettingBluetooth object is a #NMSetting subclass that describes - * properties necessary for connection to devices that provide network - * connections via the Bluetooth Dial-Up Networking (DUN) and Network Access - * Point (NAP) profiles. - **/ - -/** - * nm_setting_bluetooth_error_quark: - * - * Registers an error quark for #NMSettingBluetooth if necessary. - * - * Returns: the error quark used for #NMSettingBluetooth errors. - **/ -GQuark -nm_setting_bluetooth_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-bluetooth-error-quark"); - return quark; -} - -G_DEFINE_TYPE_WITH_CODE (NMSettingBluetooth, nm_setting_bluetooth, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_BLUETOOTH_SETTING_NAME, - g_define_type_id, - 1, - NM_SETTING_BLUETOOTH_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_BLUETOOTH) - -#define NM_SETTING_BLUETOOTH_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_BLUETOOTH, NMSettingBluetoothPrivate)) - -typedef struct { - GByteArray *bdaddr; - char *type; -} NMSettingBluetoothPrivate; - -enum { - PROP_0, - PROP_BDADDR, - PROP_TYPE, - - LAST_PROP -}; - -/** - * nm_setting_bluetooth_new: - * - * Creates a new #NMSettingBluetooth object with default values. - * - * Returns: (transfer full): the new empty #NMSettingBluetooth object - **/ -NMSetting *nm_setting_bluetooth_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_BLUETOOTH, NULL); -} - -/** - * nm_setting_bluetooth_get_connection_type: - * @setting: the #NMSettingBluetooth - * - * Returns the connection method for communicating with the remote device (i.e. - * either DUN to a DUN-capable device or PANU to a NAP-capable device). - * - * Returns: the type, either %NM_SETTING_BLUETOOTH_TYPE_PANU or - * %NM_SETTING_BLUETOOTH_TYPE_DUN - **/ -const char * -nm_setting_bluetooth_get_connection_type (NMSettingBluetooth *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_BLUETOOTH (setting), NULL); - - return NM_SETTING_BLUETOOTH_GET_PRIVATE (setting)->type; -} - -/** - * nm_setting_bluetooth_get_bdaddr: - * @setting: the #NMSettingBluetooth - * - * Gets the Bluetooth address of the remote device which this setting - * describes a connection to. - * - * Returns: the Bluetooth address - **/ -const GByteArray * -nm_setting_bluetooth_get_bdaddr (NMSettingBluetooth *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_BLUETOOTH (setting), NULL); - - return NM_SETTING_BLUETOOTH_GET_PRIVATE (setting)->bdaddr; -} - -static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - NMSettingBluetoothPrivate *priv = NM_SETTING_BLUETOOTH_GET_PRIVATE (setting); - - if (!priv->bdaddr) { - g_set_error_literal (error, - NM_SETTING_BLUETOOTH_ERROR, - NM_SETTING_BLUETOOTH_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_BLUETOOTH_SETTING_NAME, NM_SETTING_BLUETOOTH_BDADDR); - return FALSE; - } - - if (priv->bdaddr && priv->bdaddr->len != ETH_ALEN) { - g_set_error_literal (error, - NM_SETTING_BLUETOOTH_ERROR, - NM_SETTING_BLUETOOTH_ERROR_INVALID_PROPERTY, - _("property is invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_BLUETOOTH_SETTING_NAME, NM_SETTING_BLUETOOTH_BDADDR); - return FALSE; - } - - if (!priv->type) { - g_set_error_literal (error, - NM_SETTING_BLUETOOTH_ERROR, - NM_SETTING_BLUETOOTH_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_BLUETOOTH_SETTING_NAME, NM_SETTING_BLUETOOTH_TYPE); - return FALSE; - } else if (!g_str_equal (priv->type, NM_SETTING_BLUETOOTH_TYPE_DUN) && - !g_str_equal (priv->type, NM_SETTING_BLUETOOTH_TYPE_PANU)) { - g_set_error (error, - NM_SETTING_BLUETOOTH_ERROR, - NM_SETTING_BLUETOOTH_ERROR_INVALID_PROPERTY, - _("'%s' is not a valid value for the property"), - priv->type); - g_prefix_error (error, "%s.%s: ", NM_SETTING_BLUETOOTH_SETTING_NAME, NM_SETTING_BLUETOOTH_TYPE); - return FALSE; - } - - /* Make sure the corresponding 'type' setting is present */ - if ( all_settings - && !strcmp (priv->type, NM_SETTING_BLUETOOTH_TYPE_DUN)) { - gboolean gsm = FALSE, cdma = FALSE; - - gsm = !!nm_setting_find_in_list (all_settings, NM_SETTING_GSM_SETTING_NAME); - cdma = !!nm_setting_find_in_list (all_settings, NM_SETTING_CDMA_SETTING_NAME); - - if (!gsm && !cdma) { - g_set_error (error, - NM_SETTING_BLUETOOTH_ERROR, - NM_SETTING_BLUETOOTH_ERROR_TYPE_SETTING_NOT_FOUND, - _("requires '%s' or '%s' setting"), - NM_SETTING_GSM_SETTING_NAME, NM_SETTING_CDMA_SETTING_NAME); - g_prefix_error (error, "%s.%s: ", NM_SETTING_BLUETOOTH_SETTING_NAME, NM_SETTING_BLUETOOTH_TYPE); - return FALSE; - } - } - /* PANU doesn't need a 'type' setting since no further configuration - * is required at the interface level. - */ - - return TRUE; -} - -static void -nm_setting_bluetooth_init (NMSettingBluetooth *setting) -{ -} - -static void -finalize (GObject *object) -{ - NMSettingBluetoothPrivate *priv = NM_SETTING_BLUETOOTH_GET_PRIVATE (object); - - if (priv->bdaddr) - g_byte_array_free (priv->bdaddr, TRUE); - g_free (priv->type); - - G_OBJECT_CLASS (nm_setting_bluetooth_parent_class)->finalize (object); -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSettingBluetoothPrivate *priv = NM_SETTING_BLUETOOTH_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_BDADDR: - if (priv->bdaddr) - g_byte_array_free (priv->bdaddr, TRUE); - priv->bdaddr = g_value_dup_boxed (value); - break; - case PROP_TYPE: - g_free (priv->type); - priv->type = g_value_dup_string (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSettingBluetooth *setting = NM_SETTING_BLUETOOTH (object); - - switch (prop_id) { - case PROP_BDADDR: - g_value_set_boxed (value, nm_setting_bluetooth_get_bdaddr (setting)); - break; - case PROP_TYPE: - g_value_set_string (value, nm_setting_bluetooth_get_connection_type (setting)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_setting_bluetooth_class_init (NMSettingBluetoothClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingBluetoothPrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->finalize = finalize; - parent_class->verify = verify; - - /* Properties */ - - /** - * NMSettingBluetooth:bdaddr: - * - * The Bluetooth address of the device. - **/ - g_object_class_install_property - (object_class, PROP_BDADDR, - _nm_param_spec_specialized (NM_SETTING_BLUETOOTH_BDADDR, "", "", - DBUS_TYPE_G_UCHAR_ARRAY, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingBluetooth:type: - * - * Either "dun" for Dial-Up Networking connections or "panu" for Personal - * Area Networking connections to devices supporting the NAP profile. - **/ - g_object_class_install_property - (object_class, PROP_TYPE, - g_param_spec_string (NM_SETTING_BLUETOOTH_TYPE, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-util/nm-setting-bluetooth.h b/libnm-util/nm-setting-bluetooth.h deleted file mode 100644 index caf12158c0..0000000000 --- a/libnm-util/nm-setting-bluetooth.h +++ /dev/null @@ -1,100 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2009 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#ifndef NM_SETTING_BLUETOOTH_H -#define NM_SETTING_BLUETOOTH_H - -#include "nm-setting.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SETTING_BLUETOOTH (nm_setting_bluetooth_get_type ()) -#define NM_SETTING_BLUETOOTH(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_BLUETOOTH, NMSettingBluetooth)) -#define NM_SETTING_BLUETOOTH_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_BLUETOOTH, NMSettingBluetoothClass)) -#define NM_IS_SETTING_BLUETOOTH(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_BLUETOOTH)) -#define NM_IS_SETTING_BLUETOOTH_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_BLUETOOTH)) -#define NM_SETTING_BLUETOOTH_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_BLUETOOTH, NMSettingBluetoothClass)) - -#define NM_SETTING_BLUETOOTH_SETTING_NAME "bluetooth" - -/** - * NMSettingBluetoothError: - * @NM_SETTING_BLUETOOTH_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_BLUETOOTH_ERROR_INVALID_PROPERTY: the property was invalid - * @NM_SETTING_BLUETOOTH_ERROR_MISSING_PROPERTY: the property was missing and is - * required - * @NM_SETTING_BLUETOOTH_ERROR_TYPE_SETTING_NOT_FOUND: the connection - * did not contain a required type setting, ie for DUN connections the connection - * must also contain an #NMSettingGsm or #NMSettingCdma as appropriate - */ -typedef enum { - NM_SETTING_BLUETOOTH_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_SETTING_BLUETOOTH_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/ - NM_SETTING_BLUETOOTH_ERROR_MISSING_PROPERTY, /*< nick=MissingProperty >*/ - NM_SETTING_BLUETOOTH_ERROR_TYPE_SETTING_NOT_FOUND, /*< nick=TypeSettingNotFound >*/ -} NMSettingBluetoothError; - -#define NM_SETTING_BLUETOOTH_ERROR nm_setting_bluetooth_error_quark () -GQuark nm_setting_bluetooth_error_quark (void); - -#define NM_SETTING_BLUETOOTH_BDADDR "bdaddr" -#define NM_SETTING_BLUETOOTH_TYPE "type" - -/** - * NM_SETTING_BLUETOOTH_TYPE_DUN: - * - * Connection type describing a connection to devices that support the Bluetooth - * DUN profile. - */ -#define NM_SETTING_BLUETOOTH_TYPE_DUN "dun" - -/** - * NM_SETTING_BLUETOOTH_TYPE_PANU: - * - * Connection type describing a connection to devices that support the Bluetooth - * NAP (Network Access Point) protocol, which accepts connections via PANU. - */ -#define NM_SETTING_BLUETOOTH_TYPE_PANU "panu" - -typedef struct { - NMSetting parent; -} NMSettingBluetooth; - -typedef struct { - NMSettingClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); -} NMSettingBluetoothClass; - -GType nm_setting_bluetooth_get_type (void); - -NMSetting * nm_setting_bluetooth_new (void); -const GByteArray *nm_setting_bluetooth_get_bdaddr (NMSettingBluetooth *setting); -const char * nm_setting_bluetooth_get_connection_type (NMSettingBluetooth *setting); - -G_END_DECLS - -#endif /* NM_SETTING_BLUETOOTH_H */ diff --git a/libnm-util/nm-setting-bond.c b/libnm-util/nm-setting-bond.c deleted file mode 100644 index 9a1c5c7391..0000000000 --- a/libnm-util/nm-setting-bond.c +++ /dev/null @@ -1,834 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2011 - 2013 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <stdlib.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <dbus/dbus-glib.h> - -#include "nm-setting-bond.h" -#include "nm-param-spec-specialized.h" -#include "nm-utils.h" -#include "nm-utils-private.h" -#include "nm-dbus-glib-types.h" -#include "nm-setting-private.h" - -/** - * SECTION:nm-setting-bond - * @short_description: Describes connection properties for bonds - * @include: nm-setting-bond.h - * - * The #NMSettingBond object is a #NMSetting subclass that describes properties - * necessary for bond connections. - **/ - -/** - * nm_setting_bond_error_quark: - * - * Registers an error quark for #NMSettingBond if necessary. - * - * Returns: the error quark used for #NMSettingBond errors. - **/ -GQuark -nm_setting_bond_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-bond-error-quark"); - return quark; -} - -G_DEFINE_TYPE_WITH_CODE (NMSettingBond, nm_setting_bond, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_BOND_SETTING_NAME, - g_define_type_id, - 1, - NM_SETTING_BOND_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_BOND) - -#define NM_SETTING_BOND_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_BOND, NMSettingBondPrivate)) - -typedef struct { - char *interface_name; - GHashTable *options; -} NMSettingBondPrivate; - -enum { - PROP_0, - PROP_INTERFACE_NAME, - PROP_OPTIONS, - LAST_PROP -}; - -enum { - TYPE_INT, - TYPE_STR, - TYPE_BOTH, - TYPE_IP, - TYPE_IFNAME, -}; - -typedef struct { - const char *opt; - const char *val; - guint opt_type; - guint min; - guint max; - char *list[10]; -} BondDefault; - -static const BondDefault defaults[] = { - { NM_SETTING_BOND_OPTION_MODE, "balance-rr", TYPE_BOTH, 0, 6, - { "balance-rr", "active-backup", "balance-xor", "broadcast", "802.3ad", "balance-tlb", "balance-alb", NULL } }, - { NM_SETTING_BOND_OPTION_MIIMON, "100", TYPE_INT, 0, G_MAXINT }, - { NM_SETTING_BOND_OPTION_DOWNDELAY, "0", TYPE_INT, 0, G_MAXINT }, - { NM_SETTING_BOND_OPTION_UPDELAY, "0", TYPE_INT, 0, G_MAXINT }, - { NM_SETTING_BOND_OPTION_ARP_INTERVAL, "0", TYPE_INT, 0, G_MAXINT }, - { NM_SETTING_BOND_OPTION_ARP_IP_TARGET, "", TYPE_IP }, - { NM_SETTING_BOND_OPTION_ARP_VALIDATE, "0", TYPE_BOTH, 0, 3, - { "none", "active", "backup", "all", NULL } }, - { NM_SETTING_BOND_OPTION_PRIMARY, "", TYPE_IFNAME }, - { NM_SETTING_BOND_OPTION_PRIMARY_RESELECT, "0", TYPE_BOTH, 0, 2, - { "always", "better", "failure", NULL } }, - { NM_SETTING_BOND_OPTION_FAIL_OVER_MAC, "0", TYPE_BOTH, 0, 2, - { "none", "active", "follow", NULL } }, - { NM_SETTING_BOND_OPTION_USE_CARRIER, "1", TYPE_INT, 0, 1 }, - { NM_SETTING_BOND_OPTION_AD_SELECT, "0", TYPE_BOTH, 0, 2, - { "stable", "bandwidth", "count", NULL } }, - { NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY, "0", TYPE_BOTH, 0, 2, - { "layer2", "layer3+4", "layer2+3", NULL } }, - { NM_SETTING_BOND_OPTION_RESEND_IGMP, "1", TYPE_INT, 0, 255 }, - { NM_SETTING_BOND_OPTION_LACP_RATE, "0", TYPE_BOTH, 0, 1, - { "slow", "fast", NULL } }, -}; - -/** - * nm_setting_bond_new: - * - * Creates a new #NMSettingBond object with default values. - * - * Returns: (transfer full): the new empty #NMSettingBond object - **/ -NMSetting * -nm_setting_bond_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_BOND, NULL); -} - -/** - * nm_setting_bond_get_interface_name: - * @setting: the #NMSettingBond - * - * Returns: the #NMSettingBond:interface-name property of the setting - **/ -const char * -nm_setting_bond_get_interface_name (NMSettingBond *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_BOND (setting), NULL); - - return NM_SETTING_BOND_GET_PRIVATE (setting)->interface_name; -} - -/** - * nm_setting_bond_get_num_options: - * @setting: the #NMSettingBond - * - * Returns the number of options that should be set for this bond when it - * is activated. This can be used to retrieve each option individually - * using nm_setting_bond_get_option(). - * - * Returns: the number of bonding options - **/ -guint32 -nm_setting_bond_get_num_options (NMSettingBond *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_BOND (setting), 0); - - return g_hash_table_size (NM_SETTING_BOND_GET_PRIVATE (setting)->options); -} - -/** - * nm_setting_bond_get_option: - * @setting: the #NMSettingBond - * @idx: index of the desired option, from 0 to - * nm_setting_bond_get_num_options() - 1 - * @out_name: (out): on return, the name of the bonding option; this - * value is owned by the setting and should not be modified - * @out_value: (out): on return, the value of the name of the bonding - * option; this value is owned by the setting and should not be modified - * - * Given an index, return the value of the bonding option at that index. Indexes - * are *not* guaranteed to be static across modifications to options done by - * nm_setting_bond_add_option() and nm_setting_bond_remove_option(), - * and should not be used to refer to options except for short periods of time - * such as during option iteration. - * - * Returns: %TRUE on success if the index was valid and an option was found, - * %FALSE if the index was invalid (ie, greater than the number of options - * currently held by the setting) - **/ -gboolean -nm_setting_bond_get_option (NMSettingBond *setting, - guint32 idx, - const char **out_name, - const char **out_value) -{ - NMSettingBondPrivate *priv; - GList *keys; - const char *_key = NULL, *_value = NULL; - - g_return_val_if_fail (NM_IS_SETTING_BOND (setting), FALSE); - - priv = NM_SETTING_BOND_GET_PRIVATE (setting); - - if (idx >= nm_setting_bond_get_num_options (setting)) - return FALSE; - - keys = g_hash_table_get_keys (priv->options); - _key = g_list_nth_data (keys, idx); - _value = g_hash_table_lookup (priv->options, _key); - - if (out_name) - *out_name = _key; - if (out_value) - *out_value = _value; - - g_list_free (keys); - return TRUE; -} - -static gboolean -validate_int (const char *name, const char *value, const BondDefault *def) -{ - long num; - guint i; - - for (i = 0; i < strlen (value); i++) { - if (!g_ascii_isdigit (value[i]) && value[i] != '-') - return FALSE; - } - - errno = 0; - num = strtol (value, NULL, 10); - if (errno) - return FALSE; - if (num < def->min || num > def->max) - return FALSE; - - return TRUE; -} - -static gboolean -validate_list (const char *name, const char *value, const BondDefault *def) -{ - guint i; - - for (i = 0; i < G_N_ELEMENTS (def->list) && def->list[i]; i++) { - if (g_strcmp0 (def->list[i], value) == 0) - return TRUE; - } - - /* empty validation list means all values pass */ - return def->list[0] == NULL ? TRUE : FALSE; -} - -static gboolean -validate_ip (const char *name, const char *value) -{ - gs_free char *value_clone = NULL; - struct in_addr addr; - - if (!value || !value[0]) - return FALSE; - - value_clone = g_strdup (value); - value = value_clone; - for (;;) { - char *eow; - - /* we do not skip over empty words. E.g - * "192.168.1.1," is an error. - * - * ... for no particular reason. */ - - eow = strchr (value, ','); - if (eow) - *eow = '\0'; - - if (inet_pton (AF_INET, value, &addr) != 1) - return FALSE; - - if (!eow) - break; - value = eow + 1; - } - return TRUE; -} - -static gboolean -validate_ifname (const char *name, const char *value) -{ - if (!value || !value[0]) - return FALSE; - - return nm_utils_iface_valid_name (value); -} - -/** - * nm_setting_bond_validate_option: - * @name: the name of the option to validate - * @value: the value of the option to validate - * - * Checks whether @name is a valid bond option and @value is a valid value for - * the @name. If @value is %NULL, the function only validates the option name. - * - * Returns: %TRUE, if the @value is valid for the given name. - * If the @name is not a valid option, %FALSE will be returned. - * - * Since: 0.9.10 - **/ -gboolean -nm_setting_bond_validate_option (const char *name, - const char *value) -{ - guint i; - - if (!name || !name[0]) - return FALSE; - - for (i = 0; i < G_N_ELEMENTS (defaults); i++) { - if (g_strcmp0 (defaults[i].opt, name) == 0) { - if (value == NULL) - return TRUE; - switch (defaults[i].opt_type) { - case TYPE_INT: - return validate_int (name, value, &defaults[i]); - case TYPE_STR: - return validate_list (name, value, &defaults[i]); - case TYPE_BOTH: - return ( validate_int (name, value, &defaults[i]) - || validate_list (name, value, &defaults[i])); - case TYPE_IP: - return validate_ip (name, value); - case TYPE_IFNAME: - return validate_ifname (name, value); - } - return FALSE; - } - } - return FALSE; -} - -/** - * nm_setting_bond_get_option_by_name: - * @setting: the #NMSettingBond - * @name: the option name for which to retrieve the value - * - * Returns the value associated with the bonding option specified by - * @name, if it exists. - * - * Returns: the value, or %NULL if the key/value pair was never added to the - * setting; the value is owned by the setting and must not be modified - **/ -const char * -nm_setting_bond_get_option_by_name (NMSettingBond *setting, - const char *name) -{ - g_return_val_if_fail (NM_IS_SETTING_BOND (setting), NULL); - - if (!nm_setting_bond_validate_option (name, NULL)) - return NULL; - - return g_hash_table_lookup (NM_SETTING_BOND_GET_PRIVATE (setting)->options, name); -} - -/** - * nm_setting_bond_add_option: - * @setting: the #NMSettingBond - * @name: name for the option - * @value: value for the option - * - * Add an option to the table. The option is compared to an internal list - * of allowed options. Option names may contain only alphanumeric characters - * (ie [a-zA-Z0-9]). Adding a new name replaces any existing name/value pair - * that may already exist. - * - * The order of how to set several options is relevant because there are options - * that conflict with each other. - * - * Returns: %TRUE if the option was valid and was added to the internal option - * list, %FALSE if it was not. - **/ -gboolean -nm_setting_bond_add_option (NMSettingBond *setting, - const char *name, - const char *value) -{ - NMSettingBondPrivate *priv; - - g_return_val_if_fail (NM_IS_SETTING_BOND (setting), FALSE); - - if (!value || !nm_setting_bond_validate_option (name, value)) - return FALSE; - - priv = NM_SETTING_BOND_GET_PRIVATE (setting); - - g_hash_table_insert (priv->options, g_strdup (name), g_strdup (value)); - - if ( !strcmp (name, NM_SETTING_BOND_OPTION_MIIMON) - && strcmp (value, "0") != 0) { - g_hash_table_remove (priv->options, NM_SETTING_BOND_OPTION_ARP_INTERVAL); - g_hash_table_remove (priv->options, NM_SETTING_BOND_OPTION_ARP_IP_TARGET); - } else if ( !strcmp (name, NM_SETTING_BOND_OPTION_ARP_INTERVAL) - && strcmp (value, "0") != 0) { - g_hash_table_remove (priv->options, NM_SETTING_BOND_OPTION_MIIMON); - g_hash_table_remove (priv->options, NM_SETTING_BOND_OPTION_DOWNDELAY); - g_hash_table_remove (priv->options, NM_SETTING_BOND_OPTION_UPDELAY); - } - - g_object_notify (G_OBJECT (setting), NM_SETTING_BOND_OPTIONS); - - return TRUE; -} - -/** - * nm_setting_bond_remove_option: - * @setting: the #NMSettingBond - * @name: name of the option to remove - * - * Remove the bonding option referenced by @name from the internal option - * list. - * - * Returns: %TRUE if the option was found and removed from the internal option - * list, %FALSE if it was not. - **/ -gboolean -nm_setting_bond_remove_option (NMSettingBond *setting, - const char *name) -{ - gboolean found; - - g_return_val_if_fail (NM_IS_SETTING_BOND (setting), FALSE); - - if (!nm_setting_bond_validate_option (name, NULL)) - return FALSE; - - found = g_hash_table_remove (NM_SETTING_BOND_GET_PRIVATE (setting)->options, name); - if (found) - g_object_notify (G_OBJECT (setting), NM_SETTING_BOND_OPTIONS); - return found; -} - -/** - * nm_setting_bond_get_valid_options: - * @setting: the #NMSettingBond - * - * Returns a list of valid bond options. - * - * Returns: (transfer none): a %NULL-terminated array of strings of valid bond options. - **/ -const char ** -nm_setting_bond_get_valid_options (NMSettingBond *setting) -{ - static const char *array[G_N_ELEMENTS (defaults) + 1] = { NULL }; - int i; - - /* initialize the array once */ - if (G_UNLIKELY (array[0] == NULL)) { - for (i = 0; i < G_N_ELEMENTS (defaults); i++) - array[i] = defaults[i].opt; - array[i] = NULL; - } - return array; -} - -/** - * nm_setting_bond_get_option_default: - * @setting: the #NMSettingBond - * @name: the name of the option - * - * Returns: the value of the bond option if not overridden by an entry in - * the #NMSettingBond:options property. - **/ -const char * -nm_setting_bond_get_option_default (NMSettingBond *setting, const char *name) -{ - guint i; - - g_return_val_if_fail (NM_IS_SETTING_BOND (setting), NULL); - g_return_val_if_fail (nm_setting_bond_validate_option (name, NULL), NULL); - - for (i = 0; i < G_N_ELEMENTS (defaults); i++) { - if (g_strcmp0 (defaults[i].opt, name) == 0) - return defaults[i].val; - } - /* Any option that passes nm_setting_bond_validate_option() should also be found in defaults */ - g_assert_not_reached (); -} - -static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - NMSettingBondPrivate *priv = NM_SETTING_BOND_GET_PRIVATE (setting); - GHashTableIter iter; - const char *key, *value; - const char *valid_modes[] = { "balance-rr", - "active-backup", - "balance-xor", - "broadcast", - "802.3ad", - "balance-tlb", - "balance-alb", - NULL }; - int miimon = 0, arp_interval = 0; - const char *arp_ip_target = NULL; - const char *lacp_rate; - const char *primary; - - g_hash_table_iter_init (&iter, priv->options); - while (g_hash_table_iter_next (&iter, (gpointer) &key, (gpointer) &value)) { - if (!value[0] || !nm_setting_bond_validate_option (key, value)) { - g_set_error (error, - NM_SETTING_BOND_ERROR, - NM_SETTING_BOND_ERROR_INVALID_OPTION, - _("invalid option '%s' or its value '%s'"), - key, value); - g_prefix_error (error, "%s.%s: ", NM_SETTING_BOND_SETTING_NAME, NM_SETTING_BOND_OPTIONS); - return FALSE; - } - } - - value = g_hash_table_lookup (priv->options, NM_SETTING_BOND_OPTION_MIIMON); - if (value) - miimon = atoi (value); - value = g_hash_table_lookup (priv->options, NM_SETTING_BOND_OPTION_ARP_INTERVAL); - if (value) - arp_interval = atoi (value); - - /* Can only set one of miimon and arp_interval */ - if (miimon > 0 && arp_interval > 0) { - g_set_error (error, - NM_SETTING_BOND_ERROR, - NM_SETTING_BOND_ERROR_INVALID_OPTION, - _("only one of '%s' and '%s' can be set"), - NM_SETTING_BOND_OPTION_MIIMON, - NM_SETTING_BOND_OPTION_ARP_INTERVAL); - g_prefix_error (error, "%s.%s: ", NM_SETTING_BOND_SETTING_NAME, NM_SETTING_BOND_OPTIONS); - } - - value = g_hash_table_lookup (priv->options, NM_SETTING_BOND_OPTION_MODE); - if (!value) { - g_set_error (error, - NM_SETTING_BOND_ERROR, - NM_SETTING_BOND_ERROR_MISSING_OPTION, - _("mandatory option '%s' is missing"), - NM_SETTING_BOND_OPTION_MODE); - g_prefix_error (error, "%s.%s: ", NM_SETTING_BOND_SETTING_NAME, NM_SETTING_BOND_OPTIONS); - return FALSE; - } - if (!g_strv_contains (valid_modes, value)) { - g_set_error (error, - NM_SETTING_BOND_ERROR, - NM_SETTING_BOND_ERROR_INVALID_OPTION, - _("'%s' is not a valid value for '%s'"), - value, NM_SETTING_BOND_OPTION_MODE); - g_prefix_error (error, "%s.%s: ", NM_SETTING_BOND_SETTING_NAME, NM_SETTING_BOND_OPTIONS); - return FALSE; - } - - /* Make sure mode is compatible with other settings */ - if ( strcmp (value, "balance-alb") == 0 - || strcmp (value, "balance-tlb") == 0) { - if (arp_interval > 0) { - g_set_error (error, - NM_SETTING_BOND_ERROR, - NM_SETTING_BOND_ERROR_INVALID_OPTION, - _("'%s=%s' is incompatible with '%s > 0'"), - NM_SETTING_BOND_OPTION_MODE, value, NM_SETTING_BOND_OPTION_ARP_INTERVAL); - g_prefix_error (error, "%s.%s: ", NM_SETTING_BOND_SETTING_NAME, NM_SETTING_BOND_OPTIONS); - return FALSE; - } - } - - primary = g_hash_table_lookup (priv->options, NM_SETTING_BOND_OPTION_PRIMARY); - if (strcmp (value, "active-backup") == 0) { - if (primary && !nm_utils_iface_valid_name (primary)) { - g_set_error (error, - NM_SETTING_BOND_ERROR, - NM_SETTING_BOND_ERROR_INVALID_OPTION, - _("'%s' is not a valid interface name for '%s' option"), - primary, NM_SETTING_BOND_OPTION_PRIMARY); - g_prefix_error (error, "%s.%s: ", NM_SETTING_BOND_SETTING_NAME, NM_SETTING_BOND_OPTIONS); - return FALSE; - } - } else { - if (primary) { - g_set_error (error, - NM_SETTING_BOND_ERROR, - NM_SETTING_BOND_ERROR_INVALID_OPTION, - _("'%s' option is only valid for '%s=%s'"), - NM_SETTING_BOND_OPTION_PRIMARY, - NM_SETTING_BOND_OPTION_MODE, "active-backup"); - g_prefix_error (error, "%s.%s: ", NM_SETTING_BOND_SETTING_NAME, NM_SETTING_BOND_OPTIONS); - return FALSE; - } - } - - if (nm_setting_find_in_list (all_settings, NM_SETTING_INFINIBAND_SETTING_NAME)) { - if (strcmp (value, "active-backup") != 0) { - g_set_error (error, - NM_SETTING_BOND_ERROR, - NM_SETTING_BOND_ERROR_INVALID_OPTION, - _("'%s=%s' is not a valid configuration for '%s'"), - NM_SETTING_BOND_OPTION_MODE, value, NM_SETTING_INFINIBAND_SETTING_NAME); - g_prefix_error (error, "%s.%s: ", NM_SETTING_BOND_SETTING_NAME, NM_SETTING_BOND_OPTIONS); - return FALSE; - } - } - - if (miimon == 0) { - /* updelay and downdelay can only be used with miimon */ - if (g_hash_table_lookup (priv->options, NM_SETTING_BOND_OPTION_UPDELAY)) { - g_set_error (error, - NM_SETTING_BOND_ERROR, - NM_SETTING_BOND_ERROR_INVALID_OPTION, - _("'%s' option requires '%s' option to be set"), - NM_SETTING_BOND_OPTION_UPDELAY, NM_SETTING_BOND_OPTION_MIIMON); - g_prefix_error (error, "%s.%s: ", NM_SETTING_BOND_SETTING_NAME, NM_SETTING_BOND_OPTIONS); - return FALSE; - } - if (g_hash_table_lookup (priv->options, NM_SETTING_BOND_OPTION_DOWNDELAY)) { - g_set_error (error, - NM_SETTING_BOND_ERROR, - NM_SETTING_BOND_ERROR_INVALID_OPTION, - _("'%s' option requires '%s' option to be set"), - NM_SETTING_BOND_OPTION_DOWNDELAY, NM_SETTING_BOND_OPTION_MIIMON); - g_prefix_error (error, "%s.%s: ", NM_SETTING_BOND_SETTING_NAME, NM_SETTING_BOND_OPTIONS); - return FALSE; - } - } - - /* arp_ip_target can only be used with arp_interval, and must - * contain a comma-separated list of IPv4 addresses. - */ - arp_ip_target = g_hash_table_lookup (priv->options, NM_SETTING_BOND_OPTION_ARP_IP_TARGET); - if (arp_interval > 0) { - char **addrs; - guint32 addr; - int i; - - if (!arp_ip_target) { - g_set_error (error, - NM_SETTING_BOND_ERROR, - NM_SETTING_BOND_ERROR_MISSING_OPTION, - _("'%s' option requires '%s' option to be set"), - NM_SETTING_BOND_OPTION_ARP_INTERVAL, NM_SETTING_BOND_OPTION_ARP_IP_TARGET); - g_prefix_error (error, "%s.%s: ", NM_SETTING_BOND_SETTING_NAME, NM_SETTING_BOND_OPTIONS); - return FALSE; - } - - addrs = g_strsplit (arp_ip_target, ",", -1); - if (!addrs[0]) { - g_set_error (error, - NM_SETTING_BOND_ERROR, - NM_SETTING_BOND_ERROR_INVALID_OPTION, - _("'%s' option is empty"), - NM_SETTING_BOND_OPTION_ARP_IP_TARGET); - g_prefix_error (error, "%s.%s: ", NM_SETTING_BOND_SETTING_NAME, NM_SETTING_BOND_OPTIONS); - g_strfreev (addrs); - return FALSE; - } - - for (i = 0; addrs[i]; i++) { - if (!inet_pton (AF_INET, addrs[i], &addr)) { - g_set_error (error, - NM_SETTING_BOND_ERROR, - NM_SETTING_BOND_ERROR_INVALID_OPTION, - _("'%s' is not a valid IPv4 address for '%s' option"), - NM_SETTING_BOND_OPTION_ARP_IP_TARGET, addrs[i]); - g_prefix_error (error, "%s.%s: ", NM_SETTING_BOND_SETTING_NAME, NM_SETTING_BOND_OPTIONS); - g_strfreev (addrs); - return FALSE; - } - } - g_strfreev (addrs); - } else { - if (arp_ip_target) { - g_set_error (error, - NM_SETTING_BOND_ERROR, - NM_SETTING_BOND_ERROR_INVALID_OPTION, - _("'%s' option requires '%s' option to be set"), - NM_SETTING_BOND_OPTION_ARP_IP_TARGET, NM_SETTING_BOND_OPTION_ARP_INTERVAL); - g_prefix_error (error, "%s.%s: ", NM_SETTING_BOND_SETTING_NAME, NM_SETTING_BOND_OPTIONS); - return FALSE; - } - } - - lacp_rate = g_hash_table_lookup (priv->options, NM_SETTING_BOND_OPTION_LACP_RATE); - if ( lacp_rate - && (g_strcmp0 (value, "802.3ad") != 0 && g_strcmp0 (value, "4") != 0) - && (strcmp (lacp_rate, "slow") != 0 && strcmp (lacp_rate, "0") != 0)) { - g_set_error (error, - NM_SETTING_BOND_ERROR, - NM_SETTING_BOND_ERROR_INVALID_OPTION, - _("'%s' option is only valid with mode '%s'"), - NM_SETTING_BOND_OPTION_LACP_RATE, "802.3ad"); - g_prefix_error (error, "%s.%s: ", NM_SETTING_BOND_SETTING_NAME, NM_SETTING_BOND_OPTIONS); - return FALSE; - } - - return _nm_setting_verify_deprecated_virtual_iface_name ( - priv->interface_name, FALSE, - NM_SETTING_BOND_SETTING_NAME, NM_SETTING_BOND_INTERFACE_NAME, - NM_SETTING_BOND_ERROR, - NM_SETTING_BOND_ERROR_INVALID_PROPERTY, - NM_SETTING_BOND_ERROR_MISSING_PROPERTY, - all_settings, error); -} - -static const char * -get_virtual_iface_name (NMSetting *setting) -{ - NMSettingBond *self = NM_SETTING_BOND (setting); - - return nm_setting_bond_get_interface_name (self); -} - -static void -nm_setting_bond_init (NMSettingBond *setting) -{ - NMSettingBondPrivate *priv = NM_SETTING_BOND_GET_PRIVATE (setting); - - priv->options = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); - - /* Default values: */ - nm_setting_bond_add_option (setting, NM_SETTING_BOND_OPTION_MODE, "balance-rr"); -} - -static void -finalize (GObject *object) -{ - NMSettingBondPrivate *priv = NM_SETTING_BOND_GET_PRIVATE (object); - - g_free (priv->interface_name); - g_hash_table_destroy (priv->options); - - G_OBJECT_CLASS (nm_setting_bond_parent_class)->finalize (object); -} - -static void -copy_hash (gpointer key, gpointer value, gpointer user_data) -{ - g_hash_table_insert ((GHashTable *) user_data, g_strdup (key), g_strdup (value)); -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSettingBondPrivate *priv = NM_SETTING_BOND_GET_PRIVATE (object); - GHashTable *new_hash; - - switch (prop_id) { - case PROP_INTERFACE_NAME: - g_free (priv->interface_name); - priv->interface_name = g_value_dup_string (value); - break; - case PROP_OPTIONS: - /* Must make a deep copy of the hash table here... */ - g_hash_table_remove_all (priv->options); - new_hash = g_value_get_boxed (value); - if (new_hash) - g_hash_table_foreach (new_hash, copy_hash, priv->options); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSettingBondPrivate *priv = NM_SETTING_BOND_GET_PRIVATE (object); - NMSettingBond *setting = NM_SETTING_BOND (object); - - switch (prop_id) { - case PROP_INTERFACE_NAME: - g_value_set_string (value, nm_setting_bond_get_interface_name (setting)); - break; - case PROP_OPTIONS: - g_value_set_boxed (value, priv->options); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_setting_bond_class_init (NMSettingBondClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingBondPrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->finalize = finalize; - parent_class->verify = verify; - parent_class->get_virtual_iface_name = get_virtual_iface_name; - - /* Properties */ - /** - * NMSettingBond:interface-name: - * - * The name of the virtual in-kernel bonding network interface - **/ - g_object_class_install_property - (object_class, PROP_INTERFACE_NAME, - g_param_spec_string (NM_SETTING_BOND_INTERFACE_NAME, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingBond:options: - * - * Dictionary of key/value pairs of bonding options. Both keys and values - * must be strings. Option names must contain only alphanumeric characters - * (ie, [a-zA-Z0-9]). - **/ - g_object_class_install_property - (object_class, PROP_OPTIONS, - _nm_param_spec_specialized (NM_SETTING_BOND_OPTIONS, "", "", - DBUS_TYPE_G_MAP_OF_STRING, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-util/nm-setting-bond.h b/libnm-util/nm-setting-bond.h deleted file mode 100644 index efef82c882..0000000000 --- a/libnm-util/nm-setting-bond.h +++ /dev/null @@ -1,120 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2011 - 2013 Red Hat, Inc. - */ - -#ifndef NM_SETTING_BOND_H -#define NM_SETTING_BOND_H - -#include "nm-setting.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SETTING_BOND (nm_setting_bond_get_type ()) -#define NM_SETTING_BOND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_BOND, NMSettingBond)) -#define NM_SETTING_BOND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_BOND, NMSettingBondClass)) -#define NM_IS_SETTING_BOND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_BOND)) -#define NM_IS_SETTING_BOND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_BOND)) -#define NM_SETTING_BOND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_BOND, NMSettingBondClass)) - -#define NM_SETTING_BOND_SETTING_NAME "bond" - -/** - * NMSettingBondError: - * @NM_SETTING_BOND_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_BOND_ERROR_INVALID_PROPERTY: the property was invalid - * @NM_SETTING_BOND_ERROR_MISSING_PROPERTY: the property was missing and is - * @NM_SETTING_BOND_ERROR_INVALID_OPTION: the option was invalid - * @NM_SETTING_BOND_ERROR_MISSING_OPTION: the option was missing - * required - */ -typedef enum { - NM_SETTING_BOND_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_SETTING_BOND_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/ - NM_SETTING_BOND_ERROR_MISSING_PROPERTY, /*< nick=MissingProperty >*/ - NM_SETTING_BOND_ERROR_INVALID_OPTION, /*< nick=InvalidOption >*/ - NM_SETTING_BOND_ERROR_MISSING_OPTION, /*< nick=MissingOption >*/ -} NMSettingBondError; - -#define NM_SETTING_BOND_ERROR nm_setting_bond_error_quark () -GQuark nm_setting_bond_error_quark (void); - -#define NM_SETTING_BOND_INTERFACE_NAME "interface-name" -#define NM_SETTING_BOND_OPTIONS "options" - -/* Valid options for the 'options' property */ -#define NM_SETTING_BOND_OPTION_MODE "mode" -#define NM_SETTING_BOND_OPTION_MIIMON "miimon" -#define NM_SETTING_BOND_OPTION_DOWNDELAY "downdelay" -#define NM_SETTING_BOND_OPTION_UPDELAY "updelay" -#define NM_SETTING_BOND_OPTION_ARP_INTERVAL "arp_interval" -#define NM_SETTING_BOND_OPTION_ARP_IP_TARGET "arp_ip_target" -#define NM_SETTING_BOND_OPTION_ARP_VALIDATE "arp_validate" -#define NM_SETTING_BOND_OPTION_PRIMARY "primary" -#define NM_SETTING_BOND_OPTION_PRIMARY_RESELECT "primary_reselect" -#define NM_SETTING_BOND_OPTION_FAIL_OVER_MAC "fail_over_mac" -#define NM_SETTING_BOND_OPTION_USE_CARRIER "use_carrier" -#define NM_SETTING_BOND_OPTION_AD_SELECT "ad_select" -#define NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY "xmit_hash_policy" -#define NM_SETTING_BOND_OPTION_RESEND_IGMP "resend_igmp" -#define NM_SETTING_BOND_OPTION_LACP_RATE "lacp_rate" - -typedef struct { - NMSetting parent; -} NMSettingBond; - -typedef struct { - NMSettingClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); -} NMSettingBondClass; - -GType nm_setting_bond_get_type (void); - -NMSetting * nm_setting_bond_new (void); -const char * nm_setting_bond_get_interface_name (NMSettingBond *setting); -guint32 nm_setting_bond_get_num_options (NMSettingBond *setting); -gboolean nm_setting_bond_get_option (NMSettingBond *setting, - guint32 idx, - const char **out_name, - const char **out_value); -const char * nm_setting_bond_get_option_by_name (NMSettingBond *setting, - const char *name); -gboolean nm_setting_bond_add_option (NMSettingBond *setting, - const char *name, - const char *value); -gboolean nm_setting_bond_remove_option (NMSettingBond *setting, - const char *name); - -NM_AVAILABLE_IN_0_9_10 -gboolean nm_setting_bond_validate_option (const char *name, - const char *value); - -const char **nm_setting_bond_get_valid_options (NMSettingBond *setting); - -const char * nm_setting_bond_get_option_default (NMSettingBond *setting, - const char *name); - -G_END_DECLS - -#endif /* NM_SETTING_BOND_H */ diff --git a/libnm-util/nm-setting-bridge-port.c b/libnm-util/nm-setting-bridge-port.c deleted file mode 100644 index 41d5a6f8a8..0000000000 --- a/libnm-util/nm-setting-bridge-port.c +++ /dev/null @@ -1,279 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2012 - 2013 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <ctype.h> -#include <stdlib.h> -#include <dbus/dbus-glib.h> - -#include "nm-setting-bridge-port.h" -#include "nm-utils.h" -#include "nm-utils-private.h" -#include "nm-setting-private.h" - -/** - * SECTION:nm-setting-bridge-port - * @short_description: Describes connection properties for bridge ports - * @include: nm-setting-bridge-port.h - * - * The #NMSettingBridgePort object is a #NMSetting subclass that describes - * optional properties that apply to bridge ports. - * - * Since: 0.9.8 - **/ - -/** - * nm_setting_bridge_port_error_quark: - * - * Registers an error quark for #NMSettingBridgePort if necessary. - * - * Returns: the error quark used for #NMSettingBridgePort errors. - * - * Since: 0.9.8 - **/ -GQuark -nm_setting_bridge_port_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-bridge-port-error-quark"); - return quark; -} - -G_DEFINE_TYPE_WITH_CODE (NMSettingBridgePort, nm_setting_bridge_port, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_BRIDGE_PORT_SETTING_NAME, - g_define_type_id, - 3, - NM_SETTING_BRIDGE_PORT_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_BRIDGE_PORT) - -#define NM_SETTING_BRIDGE_PORT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_BRIDGE_PORT, NMSettingBridgePortPrivate)) - -typedef struct { - guint16 priority; - guint16 path_cost; - gboolean hairpin_mode; -} NMSettingBridgePortPrivate; - -enum { - PROP_0, - PROP_PRIORITY, - PROP_PATH_COST, - PROP_HAIRPIN_MODE, - LAST_PROP -}; - -/*****************************************************************************/ - -/** - * nm_setting_bridge_port_get_priority: - * @setting: the #NMSettingBridgePort - * - * Returns: the #NMSettingBridgePort:priority property of the setting - * - * Since: 0.9.8 - **/ -guint16 -nm_setting_bridge_port_get_priority (NMSettingBridgePort *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_BRIDGE_PORT (setting), 0); - - return NM_SETTING_BRIDGE_PORT_GET_PRIVATE (setting)->priority; -} - -/** - * nm_setting_bridge_port_get_path_cost: - * @setting: the #NMSettingBridgePort - * - * Returns: the #NMSettingBridgePort:path-cost property of the setting - * - * Since: 0.9.8 - **/ -guint16 -nm_setting_bridge_port_get_path_cost (NMSettingBridgePort *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_BRIDGE_PORT (setting), 0); - - return NM_SETTING_BRIDGE_PORT_GET_PRIVATE (setting)->path_cost; -} - -/** - * nm_setting_bridge_port_get_hairpin_mode: - * @setting: the #NMSettingBridgePort - * - * Returns: the #NMSettingBridgePort:hairpin-mode property of the setting - * - * Since: 0.9.8 - **/ -gboolean -nm_setting_bridge_port_get_hairpin_mode (NMSettingBridgePort *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_BRIDGE_PORT (setting), FALSE); - - return NM_SETTING_BRIDGE_PORT_GET_PRIVATE (setting)->hairpin_mode; -} - -/*****************************************************************************/ - -#define BR_MAX_PORT_PRIORITY 63 -#define BR_DEF_PRIORITY 32 - -#define BR_MIN_PATH_COST 1 -#define BR_MAX_PATH_COST 65535 - -static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - return TRUE; -} - -/*****************************************************************************/ - -/** - * nm_setting_bridge_port_new: - * - * Creates a new #NMSettingBridgePort object with default values. - * - * Returns: (transfer full): the new empty #NMSettingBridgePort object - * - * Since: 0.9.8 - **/ -NMSetting * -nm_setting_bridge_port_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_BRIDGE_PORT, NULL); -} - -static void -nm_setting_bridge_port_init (NMSettingBridgePort *setting) -{ -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSettingBridgePortPrivate *priv = NM_SETTING_BRIDGE_PORT_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_PRIORITY: - priv->priority = g_value_get_uint (value); - break; - case PROP_PATH_COST: - priv->path_cost = g_value_get_uint (value); - break; - case PROP_HAIRPIN_MODE: - priv->hairpin_mode = g_value_get_boolean (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSettingBridgePortPrivate *priv = NM_SETTING_BRIDGE_PORT_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_PRIORITY: - g_value_set_uint (value, priv->priority); - break; - case PROP_PATH_COST: - g_value_set_uint (value, priv->path_cost); - break; - case PROP_HAIRPIN_MODE: - g_value_set_boolean (value, priv->hairpin_mode); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_setting_bridge_port_class_init (NMSettingBridgePortClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingBridgePortPrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - parent_class->verify = verify; - - /* Properties */ - /** - * NMSettingBridgePort:priority: - * - * The Spanning Tree Protocol (STP) priority of this bridge port. - * - * Since: 0.9.8 - **/ - g_object_class_install_property - (object_class, PROP_PRIORITY, - g_param_spec_uint (NM_SETTING_BRIDGE_PORT_PRIORITY, "", "", - 0, BR_MAX_PORT_PRIORITY, BR_DEF_PRIORITY, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingBridgePort:path-cost: - * - * The Spanning Tree Protocol (STP) port cost for destinations via this - * port. - * - * Since: 0.9.8 - **/ - g_object_class_install_property - (object_class, PROP_PATH_COST, - g_param_spec_uint (NM_SETTING_BRIDGE_PORT_PATH_COST, "", "", - 0, BR_MAX_PATH_COST, 100, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingBridgePort:hairpin-mode: - * - * Enables or disables "hairpin mode" for the port, which allows frames to - * be sent back out through the port the frame was received on. - * - * Since: 0.9.8 - **/ - g_object_class_install_property - (object_class, PROP_HAIRPIN_MODE, - g_param_spec_boolean (NM_SETTING_BRIDGE_PORT_HAIRPIN_MODE, "", "", - FALSE, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-util/nm-setting-bridge-port.h b/libnm-util/nm-setting-bridge-port.h deleted file mode 100644 index 76527aefdf..0000000000 --- a/libnm-util/nm-setting-bridge-port.h +++ /dev/null @@ -1,86 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2012 Red Hat, Inc. - */ - -#ifndef NM_SETTING_BRIDGE_PORT_H -#define NM_SETTING_BRIDGE_PORT_H - -#include "nm-setting.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SETTING_BRIDGE_PORT (nm_setting_bridge_port_get_type ()) -#define NM_SETTING_BRIDGE_PORT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_BRIDGE_PORT, NMSettingBridgePort)) -#define NM_SETTING_BRIDGE_PORT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_BRIDGE_PORT, NMSettingBridgePortClass)) -#define NM_IS_SETTING_BRIDGE_PORT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_BRIDGE_PORT)) -#define NM_IS_SETTING_BRIDGE_PORT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_BRIDGE_PORT)) -#define NM_SETTING_BRIDGE_PORT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_BRIDGE_PORT, NMSettingBridgePortClass)) - -#define NM_SETTING_BRIDGE_PORT_SETTING_NAME "bridge-port" - -/** - * NMSettingBridgePortError: - * @NM_SETTING_BRIDGE_PORT_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_BRIDGE_PORT_ERROR_INVALID_PROPERTY: the property was invalid - * @NM_SETTING_BRIDGE_PORT_ERROR_MISSING_PROPERTY: the property was missing and - * is required - * - * Since: 0.9.8 - */ -typedef enum { - NM_SETTING_BRIDGE_PORT_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_SETTING_BRIDGE_PORT_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/ - NM_SETTING_BRIDGE_PORT_ERROR_MISSING_PROPERTY, /*< nick=MissingProperty >*/ -} NMSettingBridgePortError; - -#define NM_SETTING_BRIDGE_PORT_ERROR nm_setting_bridge_port_error_quark () -GQuark nm_setting_bridge_port_error_quark (void); - -#define NM_SETTING_BRIDGE_PORT_PRIORITY "priority" -#define NM_SETTING_BRIDGE_PORT_PATH_COST "path-cost" -#define NM_SETTING_BRIDGE_PORT_HAIRPIN_MODE "hairpin-mode" - -typedef struct { - NMSetting parent; -} NMSettingBridgePort; - -typedef struct { - NMSettingClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); -} NMSettingBridgePortClass; - -GType nm_setting_bridge_port_get_type (void); - -NMSetting * nm_setting_bridge_port_new (void); - -guint16 nm_setting_bridge_port_get_priority (NMSettingBridgePort *setting); - -guint16 nm_setting_bridge_port_get_path_cost (NMSettingBridgePort *setting); - -gboolean nm_setting_bridge_port_get_hairpin_mode (NMSettingBridgePort *setting); - -G_END_DECLS - -#endif /* NM_SETTING_BRIDGE_PORT_H */ diff --git a/libnm-util/nm-setting-bridge.c b/libnm-util/nm-setting-bridge.c deleted file mode 100644 index ceebb98294..0000000000 --- a/libnm-util/nm-setting-bridge.c +++ /dev/null @@ -1,576 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2011 - 2013 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <ctype.h> -#include <stdlib.h> -#include <dbus/dbus-glib.h> -#include <linux/if_ether.h> - -#include "nm-setting-bridge.h" -#include "nm-param-spec-specialized.h" -#include "nm-setting-private.h" -#include "nm-utils.h" -#include "nm-utils-private.h" -#include "nm-dbus-glib-types.h" - -/** - * SECTION:nm-setting-bridge - * @short_description: Describes connection properties for bridges - * @include: nm-setting-bridge.h - * - * The #NMSettingBridge object is a #NMSetting subclass that describes properties - * necessary for bridging connections. - * - * Since: 0.9.8 - **/ - -/** - * nm_setting_bridge_error_quark: - * - * Registers an error quark for #NMSettingBridge if necessary. - * - * Returns: the error quark used for #NMSettingBridge errors. - * - * Since: 0.9.8 - **/ -GQuark -nm_setting_bridge_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-bridge-error-quark"); - return quark; -} - -G_DEFINE_TYPE_WITH_CODE (NMSettingBridge, nm_setting_bridge, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_BRIDGE_SETTING_NAME, - g_define_type_id, - 1, - NM_SETTING_BRIDGE_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_BRIDGE) - -#define NM_SETTING_BRIDGE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_BRIDGE, NMSettingBridgePrivate)) - -typedef struct { - char * interface_name; - GByteArray *mac_address; - gboolean stp; - guint16 priority; - guint16 forward_delay; - guint16 hello_time; - guint16 max_age; - guint32 ageing_time; -} NMSettingBridgePrivate; - -enum { - PROP_0, - PROP_INTERFACE_NAME, - PROP_MAC_ADDRESS, - PROP_STP, - PROP_PRIORITY, - PROP_FORWARD_DELAY, - PROP_HELLO_TIME, - PROP_MAX_AGE, - PROP_AGEING_TIME, - LAST_PROP -}; - -/** - * nm_setting_bridge_new: - * - * Creates a new #NMSettingBridge object with default values. - * - * Returns: (transfer full): the new empty #NMSettingBridge object - * - * Since: 0.9.8 - **/ -NMSetting * -nm_setting_bridge_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_BRIDGE, NULL); -} - -/** - * nm_setting_bridge_get_interface_name: - * @setting: the #NMSettingBridge - * - * Returns: the #NMSettingBridge:interface-name property of the setting - * - * Since: 0.9.8 - **/ -const char * -nm_setting_bridge_get_interface_name (NMSettingBridge *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_BRIDGE (setting), 0); - - return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->interface_name; -} - -/** - * nm_setting_bridge_get_mac_address: - * @setting: the #NMSettingBridge - * - * Returns: the #NMSettingBridge:mac-address property of the setting - * - * Since: 0.9.10 - **/ -const GByteArray * -nm_setting_bridge_get_mac_address (NMSettingBridge *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_BRIDGE (setting), NULL); - - return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->mac_address; -} - -/** - * nm_setting_bridge_get_stp: - * @setting: the #NMSettingBridge - * - * Returns: the #NMSettingBridge:stp property of the setting - * - * Since: 0.9.8 - **/ -gboolean -nm_setting_bridge_get_stp (NMSettingBridge *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_BRIDGE (setting), FALSE); - - return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->stp; -} - -/** - * nm_setting_bridge_get_priority: - * @setting: the #NMSettingBridge - * - * Returns: the #NMSettingBridge:priority property of the setting - * - * Since: 0.9.8 - **/ -guint16 -nm_setting_bridge_get_priority (NMSettingBridge *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_BRIDGE (setting), 0); - - return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->priority; -} - -/** - * nm_setting_bridge_get_forward_delay: - * @setting: the #NMSettingBridge - * - * Returns: the #NMSettingBridge:forward-delay property of the setting - * - * Since: 0.9.8 - **/ -guint16 -nm_setting_bridge_get_forward_delay (NMSettingBridge *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_BRIDGE (setting), 0); - - return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->forward_delay; -} - -/** - * nm_setting_bridge_get_hello_time: - * @setting: the #NMSettingBridge - * - * Returns: the #NMSettingBridge:hello-time property of the setting - * - * Since: 0.9.8 - **/ -guint16 -nm_setting_bridge_get_hello_time (NMSettingBridge *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_BRIDGE (setting), 0); - - return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->hello_time; -} - -/** - * nm_setting_bridge_get_max_age: - * @setting: the #NMSettingBridge - * - * Returns: the #NMSettingBridge:max-age property of the setting - * - * Since: 0.9.8 - **/ -guint16 -nm_setting_bridge_get_max_age (NMSettingBridge *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_BRIDGE (setting), 0); - - return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->max_age; -} - -/** - * nm_setting_bridge_get_ageing_time: - * @setting: the #NMSettingBridge - * - * Returns: the #NMSettingBridge:ageing-time property of the setting - * - * Since: 0.9.8 - **/ -guint -nm_setting_bridge_get_ageing_time (NMSettingBridge *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_BRIDGE (setting), 0); - - return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->ageing_time; -} - -/* IEEE 802.1D-1998 timer values */ -#define BR_MIN_HELLO_TIME 1 -#define BR_MAX_HELLO_TIME 10 - -#define BR_MIN_FORWARD_DELAY 2 -#define BR_MAX_FORWARD_DELAY 30 - -#define BR_MIN_MAX_AGE 6 -#define BR_MAX_MAX_AGE 40 - -/* IEEE 802.1D-1998 Table 7.4 */ -#define BR_MIN_AGEING_TIME 0 -#define BR_MAX_AGEING_TIME 1000000 - -static gboolean -check_range (guint32 val, - guint32 min, - guint32 max, - const char *prop, - GError **error) -{ - if ((val != 0) && (val < min || val > max)) { - g_set_error (error, - NM_SETTING_BRIDGE_ERROR, - NM_SETTING_BRIDGE_ERROR_INVALID_PROPERTY, - _("value '%d' is out of range <%d-%d>"), - val, min, max); - g_prefix_error (error, "%s.%s: ", NM_SETTING_BRIDGE_SETTING_NAME, prop); - return FALSE; - } - return TRUE; -} - -static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - NMSettingBridgePrivate *priv = NM_SETTING_BRIDGE_GET_PRIVATE (setting); - - if (priv->mac_address && priv->mac_address->len != ETH_ALEN) { - g_set_error_literal (error, - NM_SETTING_BRIDGE_ERROR, - NM_SETTING_BRIDGE_ERROR_INVALID_PROPERTY, - _("is not a valid MAC address")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_BRIDGE_SETTING_NAME, NM_SETTING_BRIDGE_MAC_ADDRESS); - return FALSE; - } - - if (!check_range (priv->forward_delay, - BR_MIN_FORWARD_DELAY, - BR_MAX_FORWARD_DELAY, - NM_SETTING_BRIDGE_FORWARD_DELAY, - error)) - return FALSE; - - if (!check_range (priv->hello_time, - BR_MIN_HELLO_TIME, - BR_MAX_HELLO_TIME, - NM_SETTING_BRIDGE_HELLO_TIME, - error)) - return FALSE; - - if (!check_range (priv->max_age, - BR_MIN_MAX_AGE, - BR_MAX_MAX_AGE, - NM_SETTING_BRIDGE_MAX_AGE, - error)) - return FALSE; - - if (!check_range (priv->ageing_time, - BR_MIN_AGEING_TIME, - BR_MAX_AGEING_TIME, - NM_SETTING_BRIDGE_AGEING_TIME, - error)) - return FALSE; - - return _nm_setting_verify_deprecated_virtual_iface_name ( - priv->interface_name, FALSE, - NM_SETTING_BRIDGE_SETTING_NAME, NM_SETTING_BRIDGE_INTERFACE_NAME, - NM_SETTING_BRIDGE_ERROR, - NM_SETTING_BRIDGE_ERROR_INVALID_PROPERTY, - NM_SETTING_BRIDGE_ERROR_MISSING_PROPERTY, - all_settings, error); -} - -static const char * -get_virtual_iface_name (NMSetting *setting) -{ - NMSettingBridge *self = NM_SETTING_BRIDGE (setting); - - return nm_setting_bridge_get_interface_name (self); -} - -static void -nm_setting_bridge_init (NMSettingBridge *setting) -{ -} - -static void -finalize (GObject *object) -{ - NMSettingBridgePrivate *priv = NM_SETTING_BRIDGE_GET_PRIVATE (object); - - g_free (priv->interface_name); - - if (priv->mac_address) - g_byte_array_free (priv->mac_address, TRUE); - - G_OBJECT_CLASS (nm_setting_bridge_parent_class)->finalize (object); -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSettingBridgePrivate *priv = NM_SETTING_BRIDGE_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_INTERFACE_NAME: - g_free (priv->interface_name); - priv->interface_name = g_value_dup_string (value); - break; - case PROP_MAC_ADDRESS: - if (priv->mac_address) - g_byte_array_free (priv->mac_address, TRUE); - priv->mac_address = g_value_dup_boxed (value); - break; - case PROP_STP: - priv->stp = g_value_get_boolean (value); - break; - case PROP_PRIORITY: - priv->priority = (guint16) g_value_get_uint (value); - break; - case PROP_FORWARD_DELAY: - priv->forward_delay = (guint16) g_value_get_uint (value); - break; - case PROP_HELLO_TIME: - priv->hello_time = (guint16) g_value_get_uint (value); - break; - case PROP_MAX_AGE: - priv->max_age = (guint16) g_value_get_uint (value); - break; - case PROP_AGEING_TIME: - priv->ageing_time = g_value_get_uint (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSettingBridgePrivate *priv = NM_SETTING_BRIDGE_GET_PRIVATE (object); - NMSettingBridge *setting = NM_SETTING_BRIDGE (object); - - switch (prop_id) { - case PROP_INTERFACE_NAME: - g_value_set_string (value, nm_setting_bridge_get_interface_name (setting)); - break; - case PROP_MAC_ADDRESS: - g_value_set_boxed (value, nm_setting_bridge_get_mac_address (setting)); - break; - case PROP_STP: - g_value_set_boolean (value, priv->stp); - break; - case PROP_PRIORITY: - g_value_set_uint (value, priv->priority); - break; - case PROP_FORWARD_DELAY: - g_value_set_uint (value, priv->forward_delay); - break; - case PROP_HELLO_TIME: - g_value_set_uint (value, priv->hello_time); - break; - case PROP_MAX_AGE: - g_value_set_uint (value, priv->max_age); - break; - case PROP_AGEING_TIME: - g_value_set_uint (value, priv->ageing_time); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_setting_bridge_class_init (NMSettingBridgeClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingBridgePrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->finalize = finalize; - parent_class->verify = verify; - parent_class->get_virtual_iface_name = get_virtual_iface_name; - - /* Properties */ - /** - * NMSettingBridge:interface-name: - * - * The name of the virtual in-kernel bridging network interface - * - * Since: 0.9.8 - **/ - g_object_class_install_property - (object_class, PROP_INTERFACE_NAME, - g_param_spec_string (NM_SETTING_BRIDGE_INTERFACE_NAME, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingBridge:mac-address: - * - * If specified, the MAC address of bridge. When creating a new bridge, this - * MAC address will be set. When matching an existing (outside - * NetworkManager created) bridge, this MAC address must match. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_MAC_ADDRESS, - _nm_param_spec_specialized (NM_SETTING_BRIDGE_MAC_ADDRESS, "", "", - DBUS_TYPE_G_UCHAR_ARRAY, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingBridge:stp: - * - * Controls whether Spanning Tree Protocol (STP) is enabled for this bridge. - * - * Since: 0.9.8 - **/ - g_object_class_install_property - (object_class, PROP_STP, - g_param_spec_boolean (NM_SETTING_BRIDGE_STP, "", "", - TRUE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingBridge:priority: - * - * Sets the Spanning Tree Protocol (STP) priority for this bridge. Lower - * values are "better"; the lowest priority bridge will be elected the root - * bridge. - * - * Since: 0.9.8 - **/ - g_object_class_install_property - (object_class, PROP_PRIORITY, - g_param_spec_uint (NM_SETTING_BRIDGE_PRIORITY, "", "", - 0, G_MAXUINT16, 0x8000, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingBridge:forward-delay: - * - * The Spanning Tree Protocol (STP) forwarding delay, in seconds. - * - * Since: 0.9.8 - **/ - g_object_class_install_property - (object_class, PROP_FORWARD_DELAY, - g_param_spec_uint (NM_SETTING_BRIDGE_FORWARD_DELAY, "", "", - 0, BR_MAX_FORWARD_DELAY, 15, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingBridge:hello-time: - * - * The Spanning Tree Protocol (STP) hello time, in seconds. - * - * Since: 0.9.8 - **/ - g_object_class_install_property - (object_class, PROP_HELLO_TIME, - g_param_spec_uint (NM_SETTING_BRIDGE_HELLO_TIME, "", "", - 0, BR_MAX_HELLO_TIME, 2, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingBridge:max-age: - * - * The Spanning Tree Protocol (STP) maximum message age, in seconds. - * - * Since: 0.9.8 - **/ - g_object_class_install_property - (object_class, PROP_MAX_AGE, - g_param_spec_uint (NM_SETTING_BRIDGE_MAX_AGE, "", "", - 0, BR_MAX_MAX_AGE, 20, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingBridge:ageing-time: - * - * The Ethernet MAC address aging time, in seconds. - * - * Since: 0.9.8 - **/ - g_object_class_install_property - (object_class, PROP_AGEING_TIME, - g_param_spec_uint (NM_SETTING_BRIDGE_AGEING_TIME, "", "", - 0, BR_MAX_AGEING_TIME, 300, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-util/nm-setting-bridge.h b/libnm-util/nm-setting-bridge.h deleted file mode 100644 index bd74141591..0000000000 --- a/libnm-util/nm-setting-bridge.h +++ /dev/null @@ -1,102 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2011 - 2012 Red Hat, Inc. - */ - -#ifndef NM_SETTING_BRIDGE_H -#define NM_SETTING_BRIDGE_H - -#include "nm-setting.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SETTING_BRIDGE (nm_setting_bridge_get_type ()) -#define NM_SETTING_BRIDGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_BRIDGE, NMSettingBridge)) -#define NM_SETTING_BRIDGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_BRIDGE, NMSettingBridgeClass)) -#define NM_IS_SETTING_BRIDGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_BRIDGE)) -#define NM_IS_SETTING_BRIDGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_BRIDGE)) -#define NM_SETTING_BRIDGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_BRIDGE, NMSettingBridgeClass)) - -#define NM_SETTING_BRIDGE_SETTING_NAME "bridge" - -/** - * NMSettingBridgeError: - * @NM_SETTING_BRIDGE_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_BRIDGE_ERROR_INVALID_PROPERTY: the property was invalid - * @NM_SETTING_BRIDGE_ERROR_MISSING_PROPERTY: the property was missing and is - * required - * - * Since: 0.9.8 - */ -typedef enum { - NM_SETTING_BRIDGE_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_SETTING_BRIDGE_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/ - NM_SETTING_BRIDGE_ERROR_MISSING_PROPERTY, /*< nick=MissingProperty >*/ -} NMSettingBridgeError; - -#define NM_SETTING_BRIDGE_ERROR nm_setting_bridge_error_quark () -GQuark nm_setting_bridge_error_quark (void); - -#define NM_SETTING_BRIDGE_INTERFACE_NAME "interface-name" -#define NM_SETTING_BRIDGE_MAC_ADDRESS "mac-address" -#define NM_SETTING_BRIDGE_STP "stp" -#define NM_SETTING_BRIDGE_PRIORITY "priority" -#define NM_SETTING_BRIDGE_FORWARD_DELAY "forward-delay" -#define NM_SETTING_BRIDGE_HELLO_TIME "hello-time" -#define NM_SETTING_BRIDGE_MAX_AGE "max-age" -#define NM_SETTING_BRIDGE_AGEING_TIME "ageing-time" - -typedef struct { - NMSetting parent; -} NMSettingBridge; - -typedef struct { - NMSettingClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); -} NMSettingBridgeClass; - -GType nm_setting_bridge_get_type (void); - -NMSetting * nm_setting_bridge_new (void); - -const char * nm_setting_bridge_get_interface_name (NMSettingBridge *setting); - -NM_AVAILABLE_IN_0_9_10 -const GByteArray *nm_setting_bridge_get_mac_address (NMSettingBridge *setting); - -gboolean nm_setting_bridge_get_stp (NMSettingBridge *setting); - -guint16 nm_setting_bridge_get_priority (NMSettingBridge *setting); - -guint16 nm_setting_bridge_get_forward_delay (NMSettingBridge *setting); - -guint16 nm_setting_bridge_get_hello_time (NMSettingBridge *setting); - -guint16 nm_setting_bridge_get_max_age (NMSettingBridge *setting); - -guint32 nm_setting_bridge_get_ageing_time (NMSettingBridge *setting); - -G_END_DECLS - -#endif /* NM_SETTING_BRIDGE_H */ diff --git a/libnm-util/nm-setting-cdma.c b/libnm-util/nm-setting-cdma.c deleted file mode 100644 index fc76be60e1..0000000000 --- a/libnm-util/nm-setting-cdma.c +++ /dev/null @@ -1,347 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2013 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> - -#include "nm-setting-cdma.h" -#include "nm-utils.h" -#include "nm-setting-private.h" - -/** - * SECTION:nm-setting-cdma - * @short_description: Describes CDMA-based mobile broadband properties - * @include: nm-setting-cdma.h - * - * The #NMSettingCdma object is a #NMSetting subclass that describes - * properties that allow connections to IS-95-based mobile broadband - * networks, including those using CDMA2000/EVDO technology. - */ - -/** - * nm_setting_cdma_error_quark: - * - * Registers an error quark for #NMSettingCdma if necessary. - * - * Returns: the error quark used for #NMSettingCdma errors. - **/ -GQuark -nm_setting_cdma_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-cdma-error-quark"); - return quark; -} - -G_DEFINE_TYPE_WITH_CODE (NMSettingCdma, nm_setting_cdma, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_CDMA_SETTING_NAME, - g_define_type_id, - 1, - NM_SETTING_CDMA_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_CDMA) - -#define NM_SETTING_CDMA_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_CDMA, NMSettingCdmaPrivate)) - -typedef struct { - char *number; /* For dialing, duh */ - char *username; - char *password; - NMSettingSecretFlags password_flags; -} NMSettingCdmaPrivate; - -enum { - PROP_0, - PROP_NUMBER, - PROP_USERNAME, - PROP_PASSWORD, - PROP_PASSWORD_FLAGS, - - LAST_PROP -}; - -/** - * nm_setting_cdma_new: - * - * Creates a new #NMSettingCdma object with default values. - * - * Returns: the new empty #NMSettingCdma object - **/ -NMSetting * -nm_setting_cdma_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_CDMA, NULL); -} - -/** - * nm_setting_cdma_get_number: - * @setting: the #NMSettingCdma - * - * Returns: the #NMSettingCdma:number property of the setting - **/ -const char * -nm_setting_cdma_get_number (NMSettingCdma *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_CDMA (setting), NULL); - - return NM_SETTING_CDMA_GET_PRIVATE (setting)->number; -} - -/** - * nm_setting_cdma_get_username: - * @setting: the #NMSettingCdma - * - * Returns: the #NMSettingCdma:username property of the setting - **/ -const char * -nm_setting_cdma_get_username (NMSettingCdma *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_CDMA (setting), NULL); - - return NM_SETTING_CDMA_GET_PRIVATE (setting)->username; -} - -/** - * nm_setting_cdma_get_password: - * @setting: the #NMSettingCdma - * - * Returns: the #NMSettingCdma:password property of the setting - **/ -const char * -nm_setting_cdma_get_password (NMSettingCdma *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_CDMA (setting), NULL); - - return NM_SETTING_CDMA_GET_PRIVATE (setting)->password; -} - -/** - * nm_setting_cdma_get_password_flags: - * @setting: the #NMSettingCdma - * - * Returns: the #NMSettingSecretFlags pertaining to the #NMSettingCdma:password - **/ -NMSettingSecretFlags -nm_setting_cdma_get_password_flags (NMSettingCdma *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_CDMA (setting), NM_SETTING_SECRET_FLAG_NONE); - - return NM_SETTING_CDMA_GET_PRIVATE (setting)->password_flags; -} - -static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - NMSettingCdmaPrivate *priv = NM_SETTING_CDMA_GET_PRIVATE (setting); - - if (!priv->number) { - g_set_error_literal (error, - NM_SETTING_CDMA_ERROR, - NM_SETTING_CDMA_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_CDMA_SETTING_NAME, NM_SETTING_CDMA_NUMBER); - return FALSE; - } else if (!strlen (priv->number)) { - g_set_error_literal (error, - NM_SETTING_CDMA_ERROR, - NM_SETTING_CDMA_ERROR_INVALID_PROPERTY, - _("property is empty")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_CDMA_SETTING_NAME, NM_SETTING_CDMA_NUMBER); - return FALSE; - } - - if (priv->username && !strlen (priv->username)) { - g_set_error_literal (error, - NM_SETTING_CDMA_ERROR, - NM_SETTING_CDMA_ERROR_INVALID_PROPERTY, - _("property is empty")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_CDMA_SETTING_NAME, NM_SETTING_CDMA_USERNAME); - return FALSE; - } - - return TRUE; -} - -static GPtrArray * -need_secrets (NMSetting *setting) -{ - NMSettingCdmaPrivate *priv = NM_SETTING_CDMA_GET_PRIVATE (setting); - GPtrArray *secrets = NULL; - - if (priv->password && *priv->password) - return NULL; - - if (priv->username) { - if (!(priv->password_flags & NM_SETTING_SECRET_FLAG_NOT_REQUIRED)) { - secrets = g_ptr_array_sized_new (1); - g_ptr_array_add (secrets, NM_SETTING_CDMA_PASSWORD); - } - } - - return secrets; -} - -static void -nm_setting_cdma_init (NMSettingCdma *setting) -{ -} - -static void -finalize (GObject *object) -{ - NMSettingCdmaPrivate *priv = NM_SETTING_CDMA_GET_PRIVATE (object); - - g_free (priv->number); - g_free (priv->username); - g_free (priv->password); - - G_OBJECT_CLASS (nm_setting_cdma_parent_class)->finalize (object); -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSettingCdmaPrivate *priv = NM_SETTING_CDMA_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_NUMBER: - g_free (priv->number); - priv->number = g_value_dup_string (value); - break; - case PROP_USERNAME: - g_free (priv->username); - priv->username = g_value_dup_string (value); - break; - case PROP_PASSWORD: - g_free (priv->password); - priv->password = g_value_dup_string (value); - break; - case PROP_PASSWORD_FLAGS: - priv->password_flags = g_value_get_uint (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSettingCdma *setting = NM_SETTING_CDMA (object); - - switch (prop_id) { - case PROP_NUMBER: - g_value_set_string (value, nm_setting_cdma_get_number (setting)); - break; - case PROP_USERNAME: - g_value_set_string (value, nm_setting_cdma_get_username (setting)); - break; - case PROP_PASSWORD: - g_value_set_string (value, nm_setting_cdma_get_password (setting)); - break; - case PROP_PASSWORD_FLAGS: - g_value_set_uint (value, nm_setting_cdma_get_password_flags (setting)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_setting_cdma_class_init (NMSettingCdmaClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingCdmaPrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->finalize = finalize; - parent_class->verify = verify; - parent_class->need_secrets = need_secrets; - - /* Properties */ - - /** - * NMSettingCdma:number: - * - * The number to dial to establish the connection to the CDMA-based mobile - * broadband network, if any. If not specified, the default number (#777) - * is used when required. - **/ - g_object_class_install_property - (object_class, PROP_NUMBER, - g_param_spec_string (NM_SETTING_CDMA_NUMBER, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingCdma:username: - * - * The username used to authenticate with the network, if required. Many - * providers do not require a username, or accept any username. But if a - * username is required, it is specified here. - **/ - g_object_class_install_property - (object_class, PROP_USERNAME, - g_param_spec_string (NM_SETTING_CDMA_USERNAME, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingCdma:password: - * - * The password used to authenticate with the network, if required. Many - * providers do not require a password, or accept any password. But if a - * password is required, it is specified here. - **/ - g_object_class_install_property - (object_class, PROP_PASSWORD, - g_param_spec_string (NM_SETTING_CDMA_PASSWORD, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_SECRET | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingCdma:password-flags: - * - * Flags indicating how to handle the #NMSettingCdma:password property. - **/ - g_object_class_install_property - (object_class, PROP_PASSWORD_FLAGS, - g_param_spec_uint (NM_SETTING_CDMA_PASSWORD_FLAGS, "", "", - NM_SETTING_SECRET_FLAG_NONE, - NM_SETTING_SECRET_FLAGS_ALL, - NM_SETTING_SECRET_FLAG_NONE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-util/nm-setting-cdma.h b/libnm-util/nm-setting-cdma.h deleted file mode 100644 index e2c0376eb4..0000000000 --- a/libnm-util/nm-setting-cdma.h +++ /dev/null @@ -1,87 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2011 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#ifndef NM_SETTING_CDMA_H -#define NM_SETTING_CDMA_H - -#include "nm-setting.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SETTING_CDMA (nm_setting_cdma_get_type ()) -#define NM_SETTING_CDMA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_CDMA, NMSettingCdma)) -#define NM_SETTING_CDMA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_CDMA, NMSettingCdmaClass)) -#define NM_IS_SETTING_CDMA(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_CDMA)) -#define NM_IS_SETTING_CDMA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_CDMA)) -#define NM_SETTING_CDMA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_CDMA, NMSettingCdmaClass)) - -#define NM_SETTING_CDMA_SETTING_NAME "cdma" - -/** - * NMSettingCdmaError: - * @NM_SETTING_CDMA_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_CDMA_ERROR_INVALID_PROPERTY: the property was invalid - * @NM_SETTING_CDMA_ERROR_MISSING_PROPERTY: the property was missing and is - * required - * @NM_SETTING_CDMA_ERROR_MISSING_SERIAL_SETTING: the required #NMSettingSerial - * is missing in the connection - */ -typedef enum { - NM_SETTING_CDMA_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_SETTING_CDMA_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/ - NM_SETTING_CDMA_ERROR_MISSING_PROPERTY, /*< nick=MissingProperty >*/ - NM_SETTING_CDMA_ERROR_MISSING_SERIAL_SETTING /*< nick=MissingSerialSetting >*/ -} NMSettingCdmaError; - -#define NM_SETTING_CDMA_ERROR nm_setting_cdma_error_quark () -GQuark nm_setting_cdma_error_quark (void); - -#define NM_SETTING_CDMA_NUMBER "number" -#define NM_SETTING_CDMA_USERNAME "username" -#define NM_SETTING_CDMA_PASSWORD "password" -#define NM_SETTING_CDMA_PASSWORD_FLAGS "password-flags" - -typedef struct { - NMSetting parent; -} NMSettingCdma; - -typedef struct { - NMSettingClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); -} NMSettingCdmaClass; - -GType nm_setting_cdma_get_type (void); - -NMSetting *nm_setting_cdma_new (void); -const char *nm_setting_cdma_get_number (NMSettingCdma *setting); -const char *nm_setting_cdma_get_username (NMSettingCdma *setting); -const char *nm_setting_cdma_get_password (NMSettingCdma *setting); -NMSettingSecretFlags nm_setting_cdma_get_password_flags (NMSettingCdma *setting); - -G_END_DECLS - -#endif /* NM_SETTING_CDMA_H */ diff --git a/libnm-util/nm-setting-connection.c b/libnm-util/nm-setting-connection.c deleted file mode 100644 index 4750733f2a..0000000000 --- a/libnm-util/nm-setting-connection.c +++ /dev/null @@ -1,1332 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2013 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#include "nm-default.h" - -#include <string.h> - -#include "nm-utils.h" -#include "nm-dbus-glib-types.h" -#include "nm-param-spec-specialized.h" -#include "nm-setting-connection.h" -#include "nm-setting-private.h" - -/** - * SECTION:nm-setting-connection - * @short_description: Describes general connection properties - * @include: nm-setting-connection.h - * - * The #NMSettingConnection object is a #NMSetting subclass that describes - * properties that apply to all #NMConnection objects, regardless of what type - * of network connection they describe. Each #NMConnection object must contain - * a #NMSettingConnection setting. - **/ - -/** - * nm_setting_connection_error_quark: - * - * Registers an error quark for #NMSettingConnection if necessary. - * - * Returns: the error quark used for #NMSettingConnection errors. - **/ -GQuark -nm_setting_connection_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-connection-error-quark"); - return quark; -} - -G_DEFINE_TYPE_WITH_CODE (NMSettingConnection, nm_setting_connection, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_CONNECTION_SETTING_NAME, - g_define_type_id, - 0, - NM_SETTING_CONNECTION_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_CONNECTION) - -#define NM_SETTING_CONNECTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_CONNECTION, NMSettingConnectionPrivate)) - -typedef enum { - PERM_TYPE_USER = 0, -} PermType; - -typedef struct { - guint8 ptype; - char *item; -} Permission; - -typedef struct { - char *id; - char *uuid; - char *interface_name; - char *type; - char *master; - char *slave_type; - GSList *permissions; /* list of Permission structs */ - gboolean autoconnect; - guint64 timestamp; - gboolean read_only; - char *zone; - GSList *secondaries; /* secondary connections to activate with the base connection */ - guint gateway_ping_timeout; -} NMSettingConnectionPrivate; - -enum { - PROP_0, - PROP_ID, - PROP_UUID, - PROP_INTERFACE_NAME, - PROP_TYPE, - PROP_PERMISSIONS, - PROP_AUTOCONNECT, - PROP_TIMESTAMP, - PROP_READ_ONLY, - PROP_ZONE, - PROP_MASTER, - PROP_SLAVE_TYPE, - PROP_SECONDARIES, - PROP_GATEWAY_PING_TIMEOUT, - - LAST_PROP -}; - -/*****************************************************************************/ - -#define PERM_USER_PREFIX "user:" - -static Permission * -permission_new_from_str (const char *str) -{ - Permission *p; - const char *last_colon; - size_t ulen = 0, i; - - g_return_val_if_fail (strncmp (str, PERM_USER_PREFIX, strlen (PERM_USER_PREFIX)) == 0, NULL); - str += strlen (PERM_USER_PREFIX); - - last_colon = strrchr (str, ':'); - if (last_colon) { - /* Ensure that somebody didn't pass "user::" */ - g_return_val_if_fail (last_colon > str, NULL); - - /* Reject :[detail] for now */ - g_return_val_if_fail (*(last_colon + 1) == '\0', NULL); - - /* Make sure we don't include detail in the username */ - ulen = last_colon - str; - } else - ulen = strlen (str); - - /* Sanity check the length of the username */ - g_return_val_if_fail (ulen < 100, NULL); - - /* Make sure there's no ':' in the username */ - for (i = 0; i < ulen; i++) - g_return_val_if_fail (str[i] != ':', NULL); - - /* And the username must be valid UTF-8 */ - g_return_val_if_fail (g_utf8_validate (str, -1, NULL) == TRUE, NULL); - - /* Yay, valid... create the new permission */ - p = g_slice_new0 (Permission); - p->ptype = PERM_TYPE_USER; - if (last_colon) { - p->item = g_malloc (ulen + 1); - memcpy (p->item, str, ulen); - p->item[ulen] = '\0'; - } else - p->item = g_strdup (str); - - return p; -} - -static Permission * -permission_new (const char *uname) -{ - Permission *p; - - g_return_val_if_fail (uname, NULL); - g_return_val_if_fail (uname[0] != '\0', NULL); - g_return_val_if_fail (strchr (uname, ':') == NULL, NULL); - g_return_val_if_fail (g_utf8_validate (uname, -1, NULL) == TRUE, NULL); - - /* Yay, valid... create the new permission */ - p = g_slice_new0 (Permission); - p->ptype = PERM_TYPE_USER; - p->item = g_strdup (uname); - return p; -} - -static char * -permission_to_string (Permission *p) -{ - return g_strdup_printf (PERM_USER_PREFIX "%s:", p->item); -} - -static void -permission_free (Permission *p) -{ - g_free (p->item); - memset (p, 0, sizeof (*p)); - g_slice_free (Permission, p); -} - -/*****************************************************************************/ - -/** - * nm_setting_connection_new: - * - * Creates a new #NMSettingConnection object with default values. - * - * Returns: the new empty #NMSettingConnection object - **/ -NMSetting *nm_setting_connection_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_CONNECTION, NULL); -} - -/** - * nm_setting_connection_get_id: - * @setting: the #NMSettingConnection - * - * Returns the #NMSettingConnection:id property of the connection. - * - * Returns: the connection ID - **/ -const char * -nm_setting_connection_get_id (NMSettingConnection *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), NULL); - - return NM_SETTING_CONNECTION_GET_PRIVATE (setting)->id; -} - -/** - * nm_setting_connection_get_uuid: - * @setting: the #NMSettingConnection - * - * Returns the #NMSettingConnection:uuid property of the connection. - * - * Returns: the connection UUID - **/ -const char * -nm_setting_connection_get_uuid (NMSettingConnection *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), NULL); - - return NM_SETTING_CONNECTION_GET_PRIVATE (setting)->uuid; -} - -/** - * nm_setting_connection_get_interface_name: - * @setting: the #NMSettingConnection - * - * Returns the #NMSettingConnection:interface-name property of the connection. - * - * Returns: the connection's interface name - * - * Since: 0.9.10 - **/ -const char * -nm_setting_connection_get_interface_name (NMSettingConnection *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), NULL); - - return NM_SETTING_CONNECTION_GET_PRIVATE (setting)->interface_name; -} - -/** - * nm_setting_connection_get_connection_type: - * @setting: the #NMSettingConnection - * - * Returns the #NMSettingConnection:type property of the connection. - * - * Returns: the connection type - **/ -const char * -nm_setting_connection_get_connection_type (NMSettingConnection *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), NULL); - - return NM_SETTING_CONNECTION_GET_PRIVATE (setting)->type; -} - -/** - * nm_setting_connection_get_num_permissions: - * @setting: the #NMSettingConnection - * - * Returns the number of entries in the #NMSettingConnection:permissions - * property of this setting. - * - * Returns: the number of permissions entries - */ -guint32 -nm_setting_connection_get_num_permissions (NMSettingConnection *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), 0); - - return g_slist_length (NM_SETTING_CONNECTION_GET_PRIVATE (setting)->permissions); -} - -/** - * nm_setting_connection_get_permission: - * @setting: the #NMSettingConnection - * @idx: the zero-based index of the permissions entry - * @out_ptype: on return, the permission type (at this time, always "user") - * @out_pitem: on return, the permission item (formatted according to @ptype, see - * #NMSettingConnection:permissions for more detail - * @out_detail: on return, the permission detail (at this time, always %NULL) - * - * Retrieve one of the entries of the #NMSettingConnection:permissions property - * of this setting. - * - * Returns: %TRUE if a permission was returned, %FALSE if @idx was invalid - */ -gboolean -nm_setting_connection_get_permission (NMSettingConnection *setting, - guint32 idx, - const char **out_ptype, - const char **out_pitem, - const char **out_detail) -{ - NMSettingConnectionPrivate *priv; - Permission *p; - - g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), FALSE); - - priv = NM_SETTING_CONNECTION_GET_PRIVATE (setting); - - g_return_val_if_fail (idx < g_slist_length (priv->permissions), FALSE); - - p = g_slist_nth_data (priv->permissions, idx); - if (out_ptype) - *out_ptype = "user"; - if (out_pitem) - *out_pitem = p->item; - if (out_detail) - *out_detail = NULL; - - return TRUE; -} - -/** - * nm_setting_connection_permissions_user_allowed: - * @setting: the #NMSettingConnection - * @uname: the user name to check permissions for - * - * Checks whether the given username is allowed to view/access this connection. - * - * Returns: %TRUE if the requested user is allowed to view this connection, - * %FALSE if the given user is not allowed to view this connection - */ -gboolean -nm_setting_connection_permissions_user_allowed (NMSettingConnection *setting, - const char *uname) -{ - NMSettingConnectionPrivate *priv; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), FALSE); - g_return_val_if_fail (uname != NULL, FALSE); - g_return_val_if_fail (*uname != '\0', FALSE); - - priv = NM_SETTING_CONNECTION_GET_PRIVATE (setting); - - /* If no permissions, visible to all */ - if (priv->permissions == NULL) - return TRUE; - - /* Find the username in the permissions list */ - for (iter = priv->permissions; iter; iter = g_slist_next (iter)) { - Permission *p = iter->data; - - if (strcmp (uname, p->item) == 0) - return TRUE; - } - - return FALSE; -} - -/** - * nm_setting_connection_add_permission: - * @setting: the #NMSettingConnection - * @ptype: the permission type; at this time only "user" is supported - * @pitem: the permission item formatted as required for @ptype - * @detail: (allow-none): unused at this time; must be %NULL - * - * Adds a permission to the connection's permission list. At this time, only - * the "user" permission type is supported, and @pitem must be a username. See - * #NMSettingConnection:permissions: for more details. - * - * Returns: %TRUE if the permission was unique and was successfully added to the - * list, %FALSE if @ptype or @pitem was invalid or it the permission was already - * present in the list - */ -gboolean -nm_setting_connection_add_permission (NMSettingConnection *setting, - const char *ptype, - const char *pitem, - const char *detail) -{ - NMSettingConnectionPrivate *priv; - Permission *p; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), FALSE); - g_return_val_if_fail (ptype, FALSE); - g_return_val_if_fail (strlen (ptype) > 0, FALSE); - g_return_val_if_fail (detail == NULL, FALSE); - - /* Only "user" for now... */ - g_return_val_if_fail (strcmp (ptype, "user") == 0, FALSE); - - priv = NM_SETTING_CONNECTION_GET_PRIVATE (setting); - - /* No dupes */ - for (iter = priv->permissions; iter; iter = g_slist_next (iter)) { - p = iter->data; - if (strcmp (pitem, p->item) == 0) - return FALSE; - } - - p = permission_new (pitem); - g_return_val_if_fail (p != NULL, FALSE); - priv->permissions = g_slist_append (priv->permissions, p); - g_object_notify (G_OBJECT (setting), NM_SETTING_CONNECTION_PERMISSIONS); - - return TRUE; -} - -/** - * nm_setting_connection_remove_permission: - * @setting: the #NMSettingConnection - * @idx: the zero-based index of the permission to remove - * - * Removes the permission at index @idx from the connection. - */ -void -nm_setting_connection_remove_permission (NMSettingConnection *setting, - guint32 idx) -{ - NMSettingConnectionPrivate *priv; - GSList *iter; - - g_return_if_fail (NM_IS_SETTING_CONNECTION (setting)); - - priv = NM_SETTING_CONNECTION_GET_PRIVATE (setting); - iter = g_slist_nth (priv->permissions, idx); - g_return_if_fail (iter != NULL); - - permission_free ((Permission *) iter->data); - priv->permissions = g_slist_delete_link (priv->permissions, iter); - g_object_notify (G_OBJECT (setting), NM_SETTING_CONNECTION_PERMISSIONS); -} - -/** - * nm_setting_connection_remove_permission_by_value: - * @setting: the #NMSettingConnection - * @ptype: the permission type; at this time only "user" is supported - * @pitem: the permission item formatted as required for @ptype - * @detail: (allow-none): unused at this time; must be %NULL - * - * Removes the permission from the connection. - * At this time, only the "user" permission type is supported, and @pitem must - * be a username. See #NMSettingConnection:permissions: for more details. - * - * Returns: %TRUE if the permission was found and removed; %FALSE if it was not. - * - * Since: 0.9.10 - */ -gboolean -nm_setting_connection_remove_permission_by_value (NMSettingConnection *setting, - const char *ptype, - const char *pitem, - const char *detail) -{ - NMSettingConnectionPrivate *priv; - Permission *p; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), FALSE); - g_return_val_if_fail (ptype, FALSE); - g_return_val_if_fail (strlen (ptype) > 0, FALSE); - g_return_val_if_fail (detail == NULL, FALSE); - - /* Only "user" for now... */ - g_return_val_if_fail (strcmp (ptype, "user") == 0, FALSE); - - priv = NM_SETTING_CONNECTION_GET_PRIVATE (setting); - for (iter = priv->permissions; iter; iter = g_slist_next (iter)) { - p = iter->data; - if (strcmp (pitem, p->item) == 0) { - permission_free ((Permission *) iter->data); - priv->permissions = g_slist_delete_link (priv->permissions, iter); - g_object_notify (G_OBJECT (setting), NM_SETTING_CONNECTION_PERMISSIONS); - return TRUE; - } - } - return FALSE; -} - -/** - * nm_setting_connection_get_autoconnect: - * @setting: the #NMSettingConnection - * - * Returns the #NMSettingConnection:autoconnect property of the connection. - * - * Returns: the connection's autoconnect behavior - **/ -gboolean -nm_setting_connection_get_autoconnect (NMSettingConnection *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), FALSE); - - return NM_SETTING_CONNECTION_GET_PRIVATE (setting)->autoconnect; -} - -/** - * nm_setting_connection_get_timestamp: - * @setting: the #NMSettingConnection - * - * Returns the #NMSettingConnection:timestamp property of the connection. - * - * Returns: the connection's timestamp - **/ -guint64 -nm_setting_connection_get_timestamp (NMSettingConnection *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), 0); - - return NM_SETTING_CONNECTION_GET_PRIVATE (setting)->timestamp; -} - -/** - * nm_setting_connection_get_read_only: - * @setting: the #NMSettingConnection - * - * Returns the #NMSettingConnection:read-only property of the connection. - * - * Returns: %TRUE if the connection is read-only, %FALSE if it is not - **/ -gboolean -nm_setting_connection_get_read_only (NMSettingConnection *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), TRUE); - - return NM_SETTING_CONNECTION_GET_PRIVATE (setting)->read_only; -} - -/** - * nm_setting_connection_get_zone: - * @setting: the #NMSettingConnection - * - * Returns the #NMSettingConnection:zone property of the connection. - * - * Returns: the trust level of a connection - **/ -const char * -nm_setting_connection_get_zone (NMSettingConnection *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), NULL); - - return NM_SETTING_CONNECTION_GET_PRIVATE (setting)->zone; -} - -/** - * nm_setting_connection_get_master: - * @setting: the #NMSettingConnection - * - * Returns the #NMSettingConnection:master property of the connection. - * - * Returns: interface name of the master device or UUID of the master - * connection. - */ -const char * -nm_setting_connection_get_master (NMSettingConnection *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), NULL); - - return NM_SETTING_CONNECTION_GET_PRIVATE (setting)->master; -} - -/** - * nm_setting_connection_get_slave_type: - * @setting: the #NMSettingConnection - * - * Returns the #NMSettingConnection:slave-type property of the connection. - * - * Returns: the type of slave this connection is, if any - */ -const char * -nm_setting_connection_get_slave_type (NMSettingConnection *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), NULL); - - return NM_SETTING_CONNECTION_GET_PRIVATE (setting)->slave_type; -} - -/** - * nm_setting_connection_is_slave_type: - * @setting: the #NMSettingConnection - * @type: the setting name (ie #NM_SETTING_BOND_SETTING_NAME) to be matched - * against @setting's slave type - * - * Returns: %TRUE if connection is of the given slave @type - */ -gboolean -nm_setting_connection_is_slave_type (NMSettingConnection *setting, - const char *type) -{ - g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), FALSE); - - return !g_strcmp0 (NM_SETTING_CONNECTION_GET_PRIVATE (setting)->slave_type, type); -} - -/** - * nm_setting_connection_get_num_secondaries: - * @setting: the #NMSettingConnection - * - * Returns: the number of configured secondary connection UUIDs - * - * Since: 0.9.8 - **/ -guint32 -nm_setting_connection_get_num_secondaries (NMSettingConnection *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), 0); - - return g_slist_length (NM_SETTING_CONNECTION_GET_PRIVATE (setting)->secondaries); -} - -/** - * nm_setting_connection_get_secondary: - * @setting: the #NMSettingConnection - * @idx: the zero-based index of the secondary connection UUID entry - * - * Returns: the secondary connection UUID at index @idx - * - * Since: 0.9.8 - **/ -const char * -nm_setting_connection_get_secondary (NMSettingConnection *setting, guint32 idx) -{ - NMSettingConnectionPrivate *priv; - - g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), NULL); - - priv = NM_SETTING_CONNECTION_GET_PRIVATE (setting); - g_return_val_if_fail (idx <= g_slist_length (priv->secondaries), NULL); - - return (const char *) g_slist_nth_data (priv->secondaries, idx); -} - -/** - * nm_setting_connection_add_secondary: - * @setting: the #NMSettingConnection - * @sec_uuid: the secondary connection UUID to add - * - * Adds a new secondary connection UUID to the setting. - * - * Returns: %TRUE if the secondary connection UUID was added; %FALSE if the UUID - * was already present - * - * Since: 0.9.8 - **/ -gboolean -nm_setting_connection_add_secondary (NMSettingConnection *setting, - const char *sec_uuid) -{ - NMSettingConnectionPrivate *priv; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), FALSE); - g_return_val_if_fail (sec_uuid != NULL, FALSE); - g_return_val_if_fail (sec_uuid[0] != '\0', FALSE); - - priv = NM_SETTING_CONNECTION_GET_PRIVATE (setting); - for (iter = priv->secondaries; iter; iter = g_slist_next (iter)) { - if (!strcmp (sec_uuid, (char *) iter->data)) - return FALSE; - } - - priv->secondaries = g_slist_append (priv->secondaries, g_strdup (sec_uuid)); - g_object_notify (G_OBJECT (setting), NM_SETTING_CONNECTION_SECONDARIES); - return TRUE; -} - -/** - * nm_setting_connection_remove_secondary: - * @setting: the #NMSettingConnection - * @idx: index number of the secondary connection UUID - * - * Removes the secondary coonnection UUID at index @idx. - * - * Since: 0.9.8 - **/ -void -nm_setting_connection_remove_secondary (NMSettingConnection *setting, guint32 idx) -{ - NMSettingConnectionPrivate *priv; - GSList *elt; - - g_return_if_fail (NM_IS_SETTING_CONNECTION (setting)); - - priv = NM_SETTING_CONNECTION_GET_PRIVATE (setting); - elt = g_slist_nth (priv->secondaries, idx); - g_return_if_fail (elt != NULL); - - g_free (elt->data); - priv->secondaries = g_slist_delete_link (priv->secondaries, elt); - g_object_notify (G_OBJECT (setting), NM_SETTING_CONNECTION_SECONDARIES); -} - -/** - * nm_setting_connection_remove_secondary_by_value: - * @setting: the #NMSettingConnection - * @sec_uuid: the secondary connection UUID to remove - * - * Removes the secondary coonnection UUID @sec_uuid. - * - * Returns: %TRUE if the secondary connection UUID was found and removed; %FALSE if it was not. - * - * Since: 0.9.10 - **/ -gboolean -nm_setting_connection_remove_secondary_by_value (NMSettingConnection *setting, - const char *sec_uuid) -{ - NMSettingConnectionPrivate *priv; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), FALSE); - g_return_val_if_fail (sec_uuid != NULL, FALSE); - g_return_val_if_fail (sec_uuid[0] != '\0', FALSE); - - priv = NM_SETTING_CONNECTION_GET_PRIVATE (setting); - for (iter = priv->secondaries; iter; iter = g_slist_next (iter)) { - if (!strcmp (sec_uuid, (char *) iter->data)) { - priv->secondaries = g_slist_delete_link (priv->secondaries, iter); - g_object_notify (G_OBJECT (setting), NM_SETTING_CONNECTION_SECONDARIES); - return TRUE; - } - } - return FALSE; -} - -/** - * nm_setting_connection_get_gateway_ping_timeout: - * @setting: the #NMSettingConnection - * - * Returns: the value contained in the #NMSettingConnection:gateway-ping-timeout - * property. - * - * Since: 0.9.10 - **/ -guint32 -nm_setting_connection_get_gateway_ping_timeout (NMSettingConnection *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), 0); - - return NM_SETTING_CONNECTION_GET_PRIVATE (setting)->gateway_ping_timeout; -} - -static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - NMSettingConnectionPrivate *priv = NM_SETTING_CONNECTION_GET_PRIVATE (setting); - gboolean is_slave; - GSList *iter; - - if (!priv->id) { - g_set_error_literal (error, - NM_SETTING_CONNECTION_ERROR, - NM_SETTING_CONNECTION_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_CONNECTION_SETTING_NAME, NM_SETTING_CONNECTION_ID); - return FALSE; - } else if (!strlen (priv->id)) { - g_set_error_literal (error, - NM_SETTING_CONNECTION_ERROR, - NM_SETTING_CONNECTION_ERROR_INVALID_PROPERTY, - _("property is empty")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_CONNECTION_SETTING_NAME, NM_SETTING_CONNECTION_ID); - return FALSE; - } - - if (!priv->uuid) { - g_set_error_literal (error, - NM_SETTING_CONNECTION_ERROR, - NM_SETTING_CONNECTION_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_CONNECTION_SETTING_NAME, NM_SETTING_CONNECTION_UUID); - return FALSE; - } else if (!nm_utils_is_uuid (priv->uuid)) { - g_set_error (error, - NM_SETTING_CONNECTION_ERROR, - NM_SETTING_CONNECTION_ERROR_INVALID_PROPERTY, - _("'%s' is not a valid UUID"), - priv->uuid); - g_prefix_error (error, "%s.%s: ", NM_SETTING_CONNECTION_SETTING_NAME, NM_SETTING_CONNECTION_UUID); - return FALSE; - } - - /* FIXME: previously, verify() set the NMSettingConnection:interface_name property, - * thus modifying the setting. verify() should not do this, but keep this not to change - * behaviour. - */ - if (!priv->interface_name) { - for (iter = all_settings; iter; iter = iter->next) { - NMSetting *s_current = iter->data; - char *virtual_iface_name = NULL; - - if (NM_IS_SETTING_BOND (s_current)) - g_object_get (s_current, NM_SETTING_BOND_INTERFACE_NAME, &virtual_iface_name, NULL); - else if (NM_IS_SETTING_BRIDGE (s_current)) - g_object_get (s_current, NM_SETTING_BRIDGE_INTERFACE_NAME, &virtual_iface_name, NULL); - else if (NM_IS_SETTING_TEAM (s_current)) - g_object_get (s_current, NM_SETTING_TEAM_INTERFACE_NAME, &virtual_iface_name, NULL); - else if (NM_IS_SETTING_VLAN (s_current)) - g_object_get (s_current, NM_SETTING_VLAN_INTERFACE_NAME, &virtual_iface_name, NULL); - /* For NMSettingInfiniband, virtual_iface_name has no backing field. - * No need to set the (unset) interface_name to the default value. - **/ - - if (virtual_iface_name) { - if (nm_utils_iface_valid_name (virtual_iface_name)) { - /* found a new interface name. */ - priv->interface_name = virtual_iface_name; - break; - } - g_free (virtual_iface_name); - } - } - } - - if (priv->interface_name) { - if (!nm_utils_iface_valid_name (priv->interface_name)) { - g_set_error (error, - NM_SETTING_CONNECTION_ERROR, - NM_SETTING_CONNECTION_ERROR_INVALID_PROPERTY, - _("'%s' is not a valid interface name"), - priv->interface_name); - g_prefix_error (error, "%s.%s: ", NM_SETTING_CONNECTION_SETTING_NAME, NM_SETTING_CONNECTION_INTERFACE_NAME); - return FALSE; - } - } - - if (!priv->type) { - g_set_error_literal (error, - NM_SETTING_CONNECTION_ERROR, - NM_SETTING_CONNECTION_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_CONNECTION_SETTING_NAME, NM_SETTING_CONNECTION_TYPE); - return FALSE; - } else if (!strlen (priv->type)) { - g_set_error_literal (error, - NM_SETTING_CONNECTION_ERROR, - NM_SETTING_CONNECTION_ERROR_INVALID_PROPERTY, - _("property is empty")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_CONNECTION_SETTING_NAME, NM_SETTING_CONNECTION_TYPE); - return FALSE; - } - - /* Make sure the corresponding 'type' item is present */ - if (all_settings && !nm_setting_find_in_list (all_settings, priv->type)) { - g_set_error (error, - NM_SETTING_CONNECTION_ERROR, - NM_SETTING_CONNECTION_ERROR_TYPE_SETTING_NOT_FOUND, - _("requires presence of '%s' setting in the connection"), - priv->type); - g_prefix_error (error, "%s.%s: ", NM_SETTING_CONNECTION_SETTING_NAME, NM_SETTING_CONNECTION_TYPE); - return FALSE; - } - - is_slave = ( priv->slave_type - && ( !strcmp (priv->slave_type, NM_SETTING_BOND_SETTING_NAME) - || !strcmp (priv->slave_type, NM_SETTING_BRIDGE_SETTING_NAME) - || !strcmp (priv->slave_type, NM_SETTING_TEAM_SETTING_NAME))); - - if (priv->slave_type && !is_slave) { - g_set_error (error, - NM_SETTING_CONNECTION_ERROR, - NM_SETTING_CONNECTION_ERROR_INVALID_PROPERTY, - _("Unknown slave type '%s'"), priv->slave_type); - g_prefix_error (error, "%s.%s: ", NM_SETTING_CONNECTION_SETTING_NAME, NM_SETTING_CONNECTION_SLAVE_TYPE); - return NM_SETTING_VERIFY_ERROR; - } - - if (is_slave) { - if (!priv->master) { - g_set_error (error, - NM_SETTING_CONNECTION_ERROR, - NM_SETTING_CONNECTION_ERROR_MISSING_PROPERTY, - _("Slave connections need a valid '%s' property"), - NM_SETTING_CONNECTION_MASTER); - g_prefix_error (error, "%s.%s: ", NM_SETTING_CONNECTION_SETTING_NAME, NM_SETTING_CONNECTION_MASTER); - return NM_SETTING_VERIFY_ERROR; - } - } else { - if (priv->master) { - g_set_error (error, - NM_SETTING_CONNECTION_ERROR, - NM_SETTING_CONNECTION_ERROR_MISSING_PROPERTY, - _("Cannot set '%s' without '%s'"), - NM_SETTING_CONNECTION_MASTER, NM_SETTING_CONNECTION_SLAVE_TYPE); - g_prefix_error (error, "%s.%s: ", NM_SETTING_CONNECTION_SETTING_NAME, NM_SETTING_CONNECTION_SLAVE_TYPE); - return NM_SETTING_VERIFY_ERROR; - } - } - - return TRUE; -} - -static gboolean -compare_property (NMSetting *setting, - NMSetting *other, - const GParamSpec *prop_spec, - NMSettingCompareFlags flags) -{ - /* Handle ignore ID */ - if ( (flags & NM_SETTING_COMPARE_FLAG_IGNORE_ID) - && g_strcmp0 (prop_spec->name, NM_SETTING_CONNECTION_ID) == 0) - return TRUE; - - return NM_SETTING_CLASS (nm_setting_connection_parent_class)->compare_property (setting, other, prop_spec, flags); -} - -static void -nm_setting_connection_init (NMSettingConnection *setting) -{ -} - -static void -finalize (GObject *object) -{ - NMSettingConnectionPrivate *priv = NM_SETTING_CONNECTION_GET_PRIVATE (object); - - g_free (priv->id); - g_free (priv->uuid); - g_free (priv->interface_name); - g_free (priv->type); - g_free (priv->zone); - g_free (priv->master); - g_free (priv->slave_type); - g_slist_free_full (priv->permissions, (GDestroyNotify) permission_free); - g_slist_free_full (priv->secondaries, g_free); - - G_OBJECT_CLASS (nm_setting_connection_parent_class)->finalize (object); -} - -static GSList * -perm_stringlist_to_permlist (GSList *strlist) -{ - GSList *list = NULL, *iter; - - for (iter = strlist; iter; iter = g_slist_next (iter)) { - Permission *p; - - p = permission_new_from_str ((const char *) iter->data); - if (p) - list = g_slist_append (list, p); - } - - return list; -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSettingConnectionPrivate *priv = NM_SETTING_CONNECTION_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_ID: - g_free (priv->id); - priv->id = g_value_dup_string (value); - break; - case PROP_UUID: - g_free (priv->uuid); - priv->uuid = g_value_dup_string (value); - break; - case PROP_INTERFACE_NAME: - g_free (priv->interface_name); - priv->interface_name = g_value_dup_string (value); - break; - case PROP_TYPE: - g_free (priv->type); - priv->type = g_value_dup_string (value); - break; - case PROP_PERMISSIONS: - g_slist_free_full (priv->permissions, (GDestroyNotify) permission_free); - priv->permissions = perm_stringlist_to_permlist (g_value_get_boxed (value)); - break; - case PROP_AUTOCONNECT: - priv->autoconnect = g_value_get_boolean (value); - break; - case PROP_TIMESTAMP: - priv->timestamp = g_value_get_uint64 (value); - break; - case PROP_READ_ONLY: - priv->read_only = g_value_get_boolean (value); - break; - case PROP_ZONE: - g_free (priv->zone); - priv->zone = g_value_dup_string (value); - break; - case PROP_MASTER: - g_free (priv->master); - priv->master = g_value_dup_string (value); - break; - case PROP_SLAVE_TYPE: - g_free (priv->slave_type); - priv->slave_type = g_value_dup_string (value); - break; - case PROP_SECONDARIES: - g_slist_free_full (priv->secondaries, g_free); - priv->secondaries = g_value_dup_boxed (value); - break; - case PROP_GATEWAY_PING_TIMEOUT: - priv->gateway_ping_timeout = g_value_get_uint (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static GSList * -perm_permlist_to_stringlist (GSList *permlist) -{ - GSList *list = NULL, *iter; - - for (iter = permlist; iter; iter = g_slist_next (iter)) - list = g_slist_append (list, permission_to_string ((Permission *) iter->data)); - return list; -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSettingConnection *setting = NM_SETTING_CONNECTION (object); - NMSettingConnectionPrivate *priv = NM_SETTING_CONNECTION_GET_PRIVATE (setting); - - switch (prop_id) { - case PROP_ID: - g_value_set_string (value, nm_setting_connection_get_id (setting)); - break; - case PROP_UUID: - g_value_set_string (value, nm_setting_connection_get_uuid (setting)); - break; - case PROP_INTERFACE_NAME: - g_value_set_string (value, nm_setting_connection_get_interface_name (setting)); - break; - case PROP_TYPE: - g_value_set_string (value, nm_setting_connection_get_connection_type (setting)); - break; - case PROP_PERMISSIONS: - g_value_take_boxed (value, perm_permlist_to_stringlist (priv->permissions)); - break; - case PROP_AUTOCONNECT: - g_value_set_boolean (value, nm_setting_connection_get_autoconnect (setting)); - break; - case PROP_TIMESTAMP: - g_value_set_uint64 (value, nm_setting_connection_get_timestamp (setting)); - break; - case PROP_READ_ONLY: - g_value_set_boolean (value, nm_setting_connection_get_read_only (setting)); - break; - case PROP_ZONE: - g_value_set_string (value, nm_setting_connection_get_zone (setting)); - break; - case PROP_MASTER: - g_value_set_string (value, nm_setting_connection_get_master (setting)); - break; - case PROP_SLAVE_TYPE: - g_value_set_string (value, nm_setting_connection_get_slave_type (setting)); - break; - case PROP_SECONDARIES: - g_value_set_boxed (value, priv->secondaries); - break; - case PROP_GATEWAY_PING_TIMEOUT: - g_value_set_uint (value, priv->gateway_ping_timeout); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_setting_connection_class_init (NMSettingConnectionClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingConnectionPrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->finalize = finalize; - parent_class->verify = verify; - parent_class->compare_property = compare_property; - - /* Properties */ - - /** - * NMSettingConnection:id: - * - * A human readable unique identifier for the connection, like "Work Wi-Fi" - * or "T-Mobile 3G". - **/ - g_object_class_install_property - (object_class, PROP_ID, - g_param_spec_string (NM_SETTING_CONNECTION_ID, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_FUZZY_IGNORE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingConnection:uuid: - * - * A universally unique identifier for the connection, for example generated - * with libuuid. It should be assigned when the connection is created, and - * never changed as long as the connection still applies to the same - * network. For example, it should not be changed when the - * #NMSettingConnection:id property or #NMSettingIP4Config changes, but - * might need to be re-created when the Wi-Fi SSID, mobile broadband network - * provider, or #NMSettingConnection:type property changes. - * - * The UUID must be in the format "2815492f-7e56-435e-b2e9-246bd7cdc664" - * (ie, contains only hexadecimal characters and "-"). A suitable UUID may - * be generated by nm_utils_uuid_generate() or - * nm_utils_uuid_generate_from_string(). - **/ - g_object_class_install_property - (object_class, PROP_UUID, - g_param_spec_string (NM_SETTING_CONNECTION_UUID, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_FUZZY_IGNORE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingConnection:interface-name: - * - * The name of the network interface this connection is bound to. If not - * set, then the connection can be attached to any interface of the - * appropriate type (subject to restrictions imposed by other settings). - * - * For software devices this specifies the name of the created device. - * - * For connection types where interface names cannot easily be made - * persistent (e.g. mobile broadband or USB Ethernet), this property should - * not be used. Setting this property restricts the interfaces a connection - * can be used with, and if interface names change or are reordered the - * connection may be applied to the wrong interface. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_INTERFACE_NAME, - g_param_spec_string (NM_SETTING_CONNECTION_INTERFACE_NAME, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingConnection:type: - * - * Base type of the connection. For hardware-dependent connections, should - * contain the setting name of the hardware-type specific setting (ie, - * "802-3-ethernet" or "802-11-wireless" or "bluetooth", etc), and for - * non-hardware dependent connections like VPN or otherwise, should contain - * the setting name of that setting type (ie, "vpn" or "bridge", etc). - **/ - g_object_class_install_property - (object_class, PROP_TYPE, - g_param_spec_string (NM_SETTING_CONNECTION_TYPE, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingConnection:permissions: - * - * An array of strings defining what access a given user has to this - * connection. If this is %NULL or empty, all users are allowed to access - * this connection. Otherwise a user is allowed to access this connection - * if and only if they are in this list. Each entry is of the form - * "[type]:[id]:[reserved]"; for example, "user:dcbw:blah". - * - * At this time only the "user" [type] is allowed. Any other values are - * ignored and reserved for future use. [id] is the username that this - * permission refers to, which may not contain the ":" character. Any - * [reserved] information present must be ignored and is reserved for future - * use. All of [type], [id], and [reserved] must be valid UTF-8. - */ - g_object_class_install_property - (object_class, PROP_PERMISSIONS, - _nm_param_spec_specialized (NM_SETTING_CONNECTION_PERMISSIONS, "", "", - DBUS_TYPE_G_LIST_OF_STRING, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingConnection:autoconnect: - * - * Whether or not the connection should be automatically connected by - * NetworkManager when the resources for the connection are available. - * %TRUE to automatically activate the connection, %FALSE to require manual - * intervention to activate the connection. - **/ - g_object_class_install_property - (object_class, PROP_AUTOCONNECT, - g_param_spec_boolean (NM_SETTING_CONNECTION_AUTOCONNECT, "", "", - TRUE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_FUZZY_IGNORE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingConnection:timestamp: - * - * The time, in seconds since the Unix Epoch, that the connection was last - * _successfully_ fully activated. - * - * NetworkManager updates the connection timestamp periodically when the - * connection is active to ensure that an active connection has the latest - * timestamp. The property is only meant for reading (changes to this - * property will not be preserved). - **/ - g_object_class_install_property - (object_class, PROP_TIMESTAMP, - g_param_spec_uint64 (NM_SETTING_CONNECTION_TIMESTAMP, "", "", - 0, G_MAXUINT64, 0, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_FUZZY_IGNORE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingConnection:read-only: - * - * %FALSE if the connection can be modified using the provided settings - * service's D-Bus interface with the right privileges, or %TRUE if the - * connection is read-only and cannot be modified. - **/ - g_object_class_install_property - (object_class, PROP_READ_ONLY, - g_param_spec_boolean (NM_SETTING_CONNECTION_READ_ONLY, "", "", - FALSE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_FUZZY_IGNORE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingConnection:zone: - * - * The trust level of a the connection. Free form case-insensitive string - * (for example "Home", "Work", "Public"). %NULL or unspecified zone means - * the connection will be placed in the default zone as defined by the - * firewall. - **/ - g_object_class_install_property - (object_class, PROP_ZONE, - g_param_spec_string (NM_SETTING_CONNECTION_ZONE, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_FUZZY_IGNORE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingConnection:master: - * - * Interface name of the master device or UUID of the master connection. - **/ - g_object_class_install_property - (object_class, PROP_MASTER, - g_param_spec_string (NM_SETTING_CONNECTION_MASTER, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_FUZZY_IGNORE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingConnection:slave-type: - * - * Setting name of the device type of this slave's master connection (eg, - * %NM_SETTING_BOND_SETTING_NAME), or %NULL if this connection is not a - * slave. - **/ - g_object_class_install_property - (object_class, PROP_SLAVE_TYPE, - g_param_spec_string (NM_SETTING_CONNECTION_SLAVE_TYPE, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_FUZZY_IGNORE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingConnection:secondaries: - * - * List of connection UUIDs that should be activated when the base - * connection itself is activated. Currently only VPN connections are - * supported. - * - * Since: 0.9.8 - **/ - g_object_class_install_property - (object_class, PROP_SECONDARIES, - _nm_param_spec_specialized (NM_SETTING_CONNECTION_SECONDARIES, "", "", - DBUS_TYPE_G_LIST_OF_STRING, - G_PARAM_READWRITE | - NM_SETTING_PARAM_FUZZY_IGNORE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingConnection:gateway-ping-timeout: - * - * If greater than zero, delay success of IP addressing until either the - * timeout is reached, or an IP gateway replies to a ping. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_GATEWAY_PING_TIMEOUT, - g_param_spec_uint (NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT, "", "", - 0, 30, 0, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-util/nm-setting-connection.h b/libnm-util/nm-setting-connection.h deleted file mode 100644 index 143fa11d58..0000000000 --- a/libnm-util/nm-setting-connection.h +++ /dev/null @@ -1,151 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2014 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#ifndef NM_SETTING_CONNECTION_H -#define NM_SETTING_CONNECTION_H - -#include "nm-setting.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SETTING_CONNECTION (nm_setting_connection_get_type ()) -#define NM_SETTING_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_CONNECTION, NMSettingConnection)) -#define NM_SETTING_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_CONNECTION, NMSettingConnectionClass)) -#define NM_IS_SETTING_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_CONNECTION)) -#define NM_IS_SETTING_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_CONNECTION)) -#define NM_SETTING_CONNECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_CONNECTION, NMSettingConnectionClass)) - -#define NM_SETTING_CONNECTION_SETTING_NAME "connection" - -/** - * NMSettingConnectionError: - * @NM_SETTING_CONNECTION_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_CONNECTION_ERROR_INVALID_PROPERTY: the property's value is - * invalid - * @NM_SETTING_CONNECTION_ERROR_MISSING_PROPERTY: a required property is not - * present - * @NM_SETTING_CONNECTION_ERROR_TYPE_SETTING_NOT_FOUND: the #NMSetting object - * referenced by the setting name contained in the - * #NMSettingConnection:type property was not present in the #NMConnection - * @NM_SETTING_CONNECTION_ERROR_IP_CONFIG_NOT_ALLOWED: ip configuration is not - * allowed to be present. - * - * Describes errors that may result from operations involving a - * #NMSettingConnection. - * - **/ -typedef enum -{ - NM_SETTING_CONNECTION_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_SETTING_CONNECTION_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/ - NM_SETTING_CONNECTION_ERROR_MISSING_PROPERTY, /*< nick=MissingProperty >*/ - NM_SETTING_CONNECTION_ERROR_TYPE_SETTING_NOT_FOUND, /*< nick=TypeSettingNotFound >*/ - NM_SETTING_CONNECTION_ERROR_IP_CONFIG_NOT_ALLOWED, /*< nick=IpConfigNotAllowed >*/ -} NMSettingConnectionError; - -#define NM_SETTING_CONNECTION_ERROR nm_setting_connection_error_quark () -GQuark nm_setting_connection_error_quark (void); - -#define NM_SETTING_CONNECTION_ID "id" -#define NM_SETTING_CONNECTION_UUID "uuid" -#define NM_SETTING_CONNECTION_INTERFACE_NAME "interface-name" -#define NM_SETTING_CONNECTION_TYPE "type" -#define NM_SETTING_CONNECTION_AUTOCONNECT "autoconnect" -#define NM_SETTING_CONNECTION_TIMESTAMP "timestamp" -#define NM_SETTING_CONNECTION_READ_ONLY "read-only" -#define NM_SETTING_CONNECTION_PERMISSIONS "permissions" -#define NM_SETTING_CONNECTION_ZONE "zone" -#define NM_SETTING_CONNECTION_MASTER "master" -#define NM_SETTING_CONNECTION_SLAVE_TYPE "slave-type" -#define NM_SETTING_CONNECTION_SECONDARIES "secondaries" -#define NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT "gateway-ping-timeout" - -/** - * NMSettingConnection: - * - * The NMSettingConnection struct contains only private data. - * It should only be accessed through the functions described below. - */ -typedef struct { - NMSetting parent; -} NMSettingConnection; - -typedef struct { - NMSettingClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); -} NMSettingConnectionClass; - -GType nm_setting_connection_get_type (void); - -NMSetting * nm_setting_connection_new (void); -const char *nm_setting_connection_get_id (NMSettingConnection *setting); -const char *nm_setting_connection_get_uuid (NMSettingConnection *setting); -NM_AVAILABLE_IN_0_9_10 -const char *nm_setting_connection_get_interface_name (NMSettingConnection *setting); -const char *nm_setting_connection_get_connection_type (NMSettingConnection *setting); -gboolean nm_setting_connection_get_autoconnect (NMSettingConnection *setting); -guint64 nm_setting_connection_get_timestamp (NMSettingConnection *setting); -gboolean nm_setting_connection_get_read_only (NMSettingConnection *setting); - -guint32 nm_setting_connection_get_num_permissions (NMSettingConnection *setting); -gboolean nm_setting_connection_get_permission (NMSettingConnection *setting, - guint32 idx, - const char **out_ptype, - const char **out_pitem, - const char **out_detail); -const char *nm_setting_connection_get_zone (NMSettingConnection *setting); -gboolean nm_setting_connection_permissions_user_allowed (NMSettingConnection *setting, const char *uname); -gboolean nm_setting_connection_add_permission (NMSettingConnection *setting, - const char *ptype, - const char *pitem, - const char *detail); -void nm_setting_connection_remove_permission (NMSettingConnection *setting, - guint32 idx); -NM_AVAILABLE_IN_0_9_10 -gboolean nm_setting_connection_remove_permission_by_value (NMSettingConnection *setting, - const char *ptype, - const char *pitem, - const char *detail); - -const char *nm_setting_connection_get_master (NMSettingConnection *setting); -gboolean nm_setting_connection_is_slave_type (NMSettingConnection *setting, - const char *type); -const char *nm_setting_connection_get_slave_type (NMSettingConnection *setting); - -guint32 nm_setting_connection_get_num_secondaries (NMSettingConnection *setting); -const char *nm_setting_connection_get_secondary (NMSettingConnection *setting, guint32 idx); -gboolean nm_setting_connection_add_secondary (NMSettingConnection *setting, const char *sec_uuid); -void nm_setting_connection_remove_secondary (NMSettingConnection *setting, guint32 idx); -NM_AVAILABLE_IN_0_9_10 -gboolean nm_setting_connection_remove_secondary_by_value (NMSettingConnection *setting, const char *sec_uuid); - -NM_AVAILABLE_IN_0_9_10 -guint32 nm_setting_connection_get_gateway_ping_timeout (NMSettingConnection *setting); - -G_END_DECLS - -#endif /* NM_SETTING_CONNECTION_H */ diff --git a/libnm-util/nm-setting-dcb.c b/libnm-util/nm-setting-dcb.c deleted file mode 100644 index c3cf89dd7f..0000000000 --- a/libnm-util/nm-setting-dcb.c +++ /dev/null @@ -1,1219 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2013 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <dbus/dbus-glib.h> - -#include "nm-setting-dcb.h" -#include "nm-param-spec-specialized.h" -#include "nm-utils.h" -#include "nm-utils-private.h" -#include "nm-dbus-glib-types.h" -#include "nm-setting-private.h" - -/** - * SECTION:nm-setting-dcb - * @short_description: Connection properties for Data Center Bridging - * @include: nm-setting-dcb.h - * - * The #NMSettingDcb object is a #NMSetting subclass that describes properties - * for enabling and using Data Center Bridging (DCB) on Ethernet networks. - * DCB is a set of protocols (including 802.1Qbb, 802.1Qaz, 802.1Qau, and - * 802.1AB) to eliminate packet loss in Ethernet networks and support the use - * of storage technologies like Fibre Channel over Ethernet (FCoE) and iSCSI. - * - * Since: 0.9.10 - **/ - -/** - * nm_setting_dcb_error_quark: - * - * Registers an error quark for #NMSettingDcb if necessary. - * - * Returns: the error quark used for #NMSettingDcb errors. - * - * Since: 0.9.10 - **/ -GQuark -nm_setting_dcb_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-dcb-error-quark"); - return quark; -} - -G_DEFINE_TYPE_WITH_CODE (NMSettingDcb, nm_setting_dcb, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_DCB_SETTING_NAME, - g_define_type_id, - 2, - NM_SETTING_DCB_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_DCB) - -#define NM_SETTING_DCB_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_DCB, NMSettingDcbPrivate)) - -typedef struct { - NMSettingDcbFlags app_fcoe_flags; - int app_fcoe_priority; - char * app_fcoe_mode; - - NMSettingDcbFlags app_iscsi_flags; - int app_iscsi_priority; - - NMSettingDcbFlags app_fip_flags; - int app_fip_priority; - - /* Priority Flow Control */ - NMSettingDcbFlags pfc_flags; - guint pfc[8]; - - /* Priority Groups */ - NMSettingDcbFlags priority_group_flags; - guint priority_group_id[8]; - guint priority_group_bandwidth[8]; - guint priority_bandwidth[8]; - guint priority_strict[8]; - guint priority_traffic_class[8]; -} NMSettingDcbPrivate; - -enum { - PROP_0, - PROP_APP_FCOE_FLAGS, - PROP_APP_FCOE_PRIORITY, - PROP_APP_FCOE_MODE, - - PROP_APP_ISCSI_FLAGS, - PROP_APP_ISCSI_PRIORITY, - - PROP_APP_FIP_FLAGS, - PROP_APP_FIP_PRIORITY, - - PROP_PFC_FLAGS, - PROP_PFC, - - PROP_PRIORITY_GROUP_FLAGS, - PROP_PRIORITY_GROUP_ID, - PROP_PRIORITY_GROUP_BANDWIDTH, - PROP_PRIORITY_BANDWIDTH, - PROP_PRIORITY_STRICT, - PROP_PRIORITY_TRAFFIC_CLASS, - - LAST_PROP -}; - -/** - * nm_setting_dcb_new: - * - * Creates a new #NMSettingDcb object with default values. - * - * Returns: (transfer full): the new empty #NMSettingDcb object - * - * Since: 0.9.10 - **/ -NMSetting * -nm_setting_dcb_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_DCB, NULL); -} - -/** - * nm_setting_dcb_get_app_fcoe_flags: - * @setting: the #NMSettingDcb - * - * Returns: the #NMSettingDcb:app-fcoe-flags property of the setting - * - * Since: 0.9.10 - **/ -NMSettingDcbFlags -nm_setting_dcb_get_app_fcoe_flags (NMSettingDcb *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), 0); - - return NM_SETTING_DCB_GET_PRIVATE (setting)->app_fcoe_flags; -} - -/** - * nm_setting_dcb_get_app_fcoe_priority: - * @setting: the #NMSettingDcb - * - * Returns: the #NMSettingDcb:app-fcoe-priority property of the setting - * - * Since: 0.9.10 - **/ -int -nm_setting_dcb_get_app_fcoe_priority (NMSettingDcb *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), 0); - - return NM_SETTING_DCB_GET_PRIVATE (setting)->app_fcoe_priority; -} - -/** - * nm_setting_dcb_get_app_fcoe_mode: - * @setting: the #NMSettingDcb - * - * Returns: the #NMSettingDcb:app-fcoe-mode property of the setting - * - * Since: 0.9.10 - **/ -const char * -nm_setting_dcb_get_app_fcoe_mode (NMSettingDcb *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), NULL); - - return NM_SETTING_DCB_GET_PRIVATE (setting)->app_fcoe_mode; -} - -/** - * nm_setting_dcb_get_app_iscsi_flags: - * @setting: the #NMSettingDcb - * - * Returns: the #NMSettingDcb:app-iscsi-flags property of the setting - * - * Since: 0.9.10 - **/ -NMSettingDcbFlags -nm_setting_dcb_get_app_iscsi_flags (NMSettingDcb *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), 0); - - return NM_SETTING_DCB_GET_PRIVATE (setting)->app_iscsi_flags; -} - -/** - * nm_setting_dcb_get_app_iscsi_priority: - * @setting: the #NMSettingDcb - * - * Returns: the #NMSettingDcb:app-iscsi-priority property of the setting - * - * Since: 0.9.10 - **/ -int -nm_setting_dcb_get_app_iscsi_priority (NMSettingDcb *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), 0); - - return NM_SETTING_DCB_GET_PRIVATE (setting)->app_iscsi_priority; -} - -/** - * nm_setting_dcb_get_app_fip_flags: - * @setting: the #NMSettingDcb - * - * Returns: the #NMSettingDcb:app-fip-flags property of the setting - * - * Since: 0.9.10 - **/ -NMSettingDcbFlags -nm_setting_dcb_get_app_fip_flags (NMSettingDcb *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), 0); - - return NM_SETTING_DCB_GET_PRIVATE (setting)->app_fip_flags; -} - -/** - * nm_setting_dcb_get_app_fip_priority: - * @setting: the #NMSettingDcb - * - * Returns: the #NMSettingDcb:app-fip-priority property of the setting - * - * Since: 0.9.10 - **/ -int -nm_setting_dcb_get_app_fip_priority (NMSettingDcb *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), 0); - - return NM_SETTING_DCB_GET_PRIVATE (setting)->app_fip_priority; -} - -/** - * nm_setting_dcb_get_priority_flow_control_flags: - * @setting: the #NMSettingDcb - * - * Returns: the #NMSettingDcb:priority-flow-control-flags property of the setting - * - * Since: 0.9.10 - **/ -NMSettingDcbFlags -nm_setting_dcb_get_priority_flow_control_flags (NMSettingDcb *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), 0); - - return NM_SETTING_DCB_GET_PRIVATE (setting)->pfc_flags; -} - -/** - * nm_setting_dcb_get_priority_flow_control: - * @setting: the #NMSettingDcb - * @user_priority: the User Priority (0 - 7) to retrieve flow control for - * - * Returns: %TRUE if flow control is enabled for the given @user_priority, - * %FALSE if not enabled - * - * Since: 0.9.10 - **/ -gboolean -nm_setting_dcb_get_priority_flow_control (NMSettingDcb *setting, guint user_priority) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), FALSE); - g_return_val_if_fail (user_priority <= 7, FALSE); - - return !!NM_SETTING_DCB_GET_PRIVATE (setting)->pfc[user_priority]; -} - -/** - * nm_setting_dcb_set_priority_flow_control: - * @setting: the #NMSettingDcb - * @user_priority: the User Priority (0 - 7) to set flow control for - * @enabled: %TRUE to enable flow control for this priority, %FALSE to disable it - * - * These values are only valid when #NMSettingDcb:priority-flow-control includes - * the %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ -void -nm_setting_dcb_set_priority_flow_control (NMSettingDcb *setting, - guint user_priority, - gboolean enabled) -{ - NMSettingDcbPrivate *priv; - guint uint_enabled = enabled ? 1 : 0; - - g_return_if_fail (NM_IS_SETTING_DCB (setting)); - g_return_if_fail (user_priority <= 7); - - priv = NM_SETTING_DCB_GET_PRIVATE (setting); - if (priv->pfc[user_priority] != uint_enabled) { - priv->pfc[user_priority] = uint_enabled; - g_object_notify (G_OBJECT (setting), NM_SETTING_DCB_PRIORITY_FLOW_CONTROL); - } -} - -/** - * nm_setting_dcb_get_priority_group_flags: - * @setting: the #NMSettingDcb - * - * Returns: the #NMSettingDcb:priority-group-flags property of the setting - * - * Since: 0.9.10 - **/ -NMSettingDcbFlags -nm_setting_dcb_get_priority_group_flags (NMSettingDcb *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), 0); - - return NM_SETTING_DCB_GET_PRIVATE (setting)->priority_group_flags; -} - -/** - * nm_setting_dcb_get_priority_group_id: - * @setting: the #NMSettingDcb - * @user_priority: the User Priority (0 - 7) to retrieve the group ID for - * - * Returns: the group number @user_priority is assigned to. These values are - * only valid when #NMSettingDcb:priority-group-flags includes the - * %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ -guint -nm_setting_dcb_get_priority_group_id (NMSettingDcb *setting, guint user_priority) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), 0); - g_return_val_if_fail (user_priority <= 7, 0); - - return NM_SETTING_DCB_GET_PRIVATE (setting)->priority_group_id[user_priority]; -} - -/** - * nm_setting_dcb_set_priority_group_id: - * @setting: the #NMSettingDcb - * @user_priority: the User Priority (0 - 7) to set flow control for - * @group_id: the group (0 - 7) to assign @user_priority to, or 15 for the - * unrestricted group. - * - * These values are only valid when #NMSettingDcb:priority-group-flags includes - * the %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ -void -nm_setting_dcb_set_priority_group_id (NMSettingDcb *setting, - guint user_priority, - guint group_id) -{ - NMSettingDcbPrivate *priv; - - g_return_if_fail (NM_IS_SETTING_DCB (setting)); - g_return_if_fail (user_priority <= 7); - g_return_if_fail (group_id <= 7 || group_id == 15); - - priv = NM_SETTING_DCB_GET_PRIVATE (setting); - if (priv->priority_group_id[user_priority] != group_id) { - priv->priority_group_id[user_priority] = group_id; - g_object_notify (G_OBJECT (setting), NM_SETTING_DCB_PRIORITY_GROUP_ID); - } -} - -/** - * nm_setting_dcb_get_priority_group_bandwidth: - * @setting: the #NMSettingDcb - * @group_id: the priority group (0 - 7) to retrieve the bandwidth percentage for - * - * Returns: the bandwidth percentage assigned to @group_id. These values are - * only valid when #NMSettingDcb:priority-group-flags includes the - * %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ -guint -nm_setting_dcb_get_priority_group_bandwidth (NMSettingDcb *setting, guint group_id) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), 0); - g_return_val_if_fail (group_id <= 7, FALSE); - - return NM_SETTING_DCB_GET_PRIVATE (setting)->priority_group_bandwidth[group_id]; -} - -/** - * nm_setting_dcb_set_priority_group_bandwidth: - * @setting: the #NMSettingDcb - * @group_id: the priority group (0 - 7) to set the bandwidth percentage for - * @bandwidth_percent: the bandwidth percentage (0 - 100) to assign to @group_id to - * - * These values are only valid when #NMSettingDcb:priority-group-flags includes - * the %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ -void -nm_setting_dcb_set_priority_group_bandwidth (NMSettingDcb *setting, - guint group_id, - guint bandwidth_percent) -{ - NMSettingDcbPrivate *priv; - - g_return_if_fail (NM_IS_SETTING_DCB (setting)); - g_return_if_fail (group_id <= 7); - g_return_if_fail (bandwidth_percent <= 100); - - priv = NM_SETTING_DCB_GET_PRIVATE (setting); - if (priv->priority_group_bandwidth[group_id] != bandwidth_percent) { - priv->priority_group_bandwidth[group_id] = bandwidth_percent; - g_object_notify (G_OBJECT (setting), NM_SETTING_DCB_PRIORITY_GROUP_BANDWIDTH); - } -} - -/** - * nm_setting_dcb_get_priority_bandwidth: - * @setting: the #NMSettingDcb - * @user_priority: the User Priority (0 - 7) to retrieve the group bandwidth percentage for - * - * Returns: the allowed bandwidth percentage of @user_priority in its priority group. - * These values are only valid when #NMSettingDcb:priority-group-flags includes the - * %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ -guint -nm_setting_dcb_get_priority_bandwidth (NMSettingDcb *setting, guint user_priority) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), 0); - g_return_val_if_fail (user_priority <= 7, FALSE); - - return NM_SETTING_DCB_GET_PRIVATE (setting)->priority_bandwidth[user_priority]; -} - -/** - * nm_setting_dcb_set_priority_bandwidth: - * @setting: the #NMSettingDcb - * @user_priority: the User Priority (0 - 7) to set the bandwidth percentage for - * @bandwidth_percent: the bandwidth percentage (0 - 100) that @user_priority is - * allowed to use within its priority group - * - * These values are only valid when #NMSettingDcb:priority-group-flags includes - * the %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ -void -nm_setting_dcb_set_priority_bandwidth (NMSettingDcb *setting, - guint user_priority, - guint bandwidth_percent) -{ - NMSettingDcbPrivate *priv; - - g_return_if_fail (NM_IS_SETTING_DCB (setting)); - g_return_if_fail (user_priority <= 7); - g_return_if_fail (bandwidth_percent <= 100); - - priv = NM_SETTING_DCB_GET_PRIVATE (setting); - if (priv->priority_bandwidth[user_priority] != bandwidth_percent) { - priv->priority_bandwidth[user_priority] = bandwidth_percent; - g_object_notify (G_OBJECT (setting), NM_SETTING_DCB_PRIORITY_BANDWIDTH); - } -} - -/** - * nm_setting_dcb_get_priority_strict_bandwidth: - * @setting: the #NMSettingDcb - * @user_priority: the User Priority (0 - 7) to retrieve strict bandwidth for - * - * Returns: %TRUE if @user_priority may use all of the bandwidth allocated to its - * assigned group, or %FALSE if not. These values are only valid when - * #NMSettingDcb:priority-group-flags includes the %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ -gboolean -nm_setting_dcb_get_priority_strict_bandwidth (NMSettingDcb *setting, guint user_priority) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), 0); - g_return_val_if_fail (user_priority <= 7, FALSE); - - return !!NM_SETTING_DCB_GET_PRIVATE (setting)->priority_strict[user_priority]; -} - -/** - * nm_setting_dcb_set_priority_strict_bandwidth: - * @setting: the #NMSettingDcb - * @user_priority: the User Priority (0 - 7) to set strict bandwidth for - * @strict: %TRUE to allow @user_priority to use all the bandwidth allocated to - * its priority group, or %FALSE if not - * - * These values are only valid when #NMSettingDcb:priority-group-flags includes - * the %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ -void -nm_setting_dcb_set_priority_strict_bandwidth (NMSettingDcb *setting, - guint user_priority, - gboolean strict) -{ - NMSettingDcbPrivate *priv; - guint uint_strict = strict ? 1 : 0; - - g_return_if_fail (NM_IS_SETTING_DCB (setting)); - g_return_if_fail (user_priority <= 7); - - priv = NM_SETTING_DCB_GET_PRIVATE (setting); - if (priv->priority_strict[user_priority] != uint_strict) { - priv->priority_strict[user_priority] = uint_strict; - g_object_notify (G_OBJECT (setting), NM_SETTING_DCB_PRIORITY_STRICT_BANDWIDTH); - } -} - -/** - * nm_setting_dcb_get_priority_traffic_class: - * @setting: the #NMSettingDcb - * @user_priority: the User Priority (0 - 7) to retrieve the traffic class for - * - * Returns: the traffic class assigned to @user_priority. These values are only - * valid when #NMSettingDcb:priority-group-flags includes the - * %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ -guint -nm_setting_dcb_get_priority_traffic_class (NMSettingDcb *setting, guint user_priority) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), 0); - g_return_val_if_fail (user_priority <= 7, FALSE); - - return NM_SETTING_DCB_GET_PRIVATE (setting)->priority_traffic_class[user_priority]; -} - -/** - * nm_setting_dcb_set_priority_traffic_clas: - * @setting: the #NMSettingDcb - * @user_priority: the User Priority (0 - 7) to set the bandwidth percentage for - * @traffic_class: the traffic_class (0 - 7) that @user_priority should map to - * - * These values are only valid when #NMSettingDcb:priority-group-flags includes - * the %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ -void -nm_setting_dcb_set_priority_traffic_class (NMSettingDcb *setting, - guint user_priority, - guint traffic_class) -{ - NMSettingDcbPrivate *priv; - - g_return_if_fail (NM_IS_SETTING_DCB (setting)); - g_return_if_fail (user_priority <= 7); - g_return_if_fail (traffic_class <= 7); - - priv = NM_SETTING_DCB_GET_PRIVATE (setting); - if (priv->priority_traffic_class[user_priority] != traffic_class) { - priv->priority_traffic_class[user_priority] = traffic_class; - g_object_notify (G_OBJECT (setting), NM_SETTING_DCB_PRIORITY_TRAFFIC_CLASS); - } -} - -/*****************************************************************************/ - -#define DCB_FLAGS_ALL (NM_SETTING_DCB_FLAG_ENABLE | \ - NM_SETTING_DCB_FLAG_ADVERTISE | \ - NM_SETTING_DCB_FLAG_WILLING) - -static gboolean -check_dcb_flags (NMSettingDcbFlags flags, const char *prop_name, GError **error) -{ - if (flags & ~DCB_FLAGS_ALL) { - g_set_error_literal (error, - NM_SETTING_DCB_ERROR, - NM_SETTING_DCB_ERROR_INVALID_PROPERTY, - _("flags invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_DCB_SETTING_NAME, prop_name); - return FALSE; - } - - if (!(flags & NM_SETTING_DCB_FLAG_ENABLE) && (flags & ~NM_SETTING_DCB_FLAG_ENABLE)) { - g_set_error_literal (error, - NM_SETTING_DCB_ERROR, - NM_SETTING_DCB_ERROR_INVALID_PROPERTY, - _("flags invalid - disabled")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_DCB_SETTING_NAME, prop_name); - return FALSE; - } - - return TRUE; -} - -static gboolean -check_uint_array (const guint *array, - guint len, - NMSettingDcbFlags flags, - guint max, - guint extra, - gboolean sum_pct, - const char *prop_name, - GError **error) -{ - guint i, sum = 0; - - /* Ensure each element is <= to max or equals extra */ - for (i = 0; i < len; i++) { - if (!(flags & NM_SETTING_DCB_FLAG_ENABLE) && array[i]) { - g_set_error_literal (error, - NM_SETTING_DCB_ERROR, - NM_SETTING_DCB_ERROR_INVALID_PROPERTY, - _("property invalid (not enabled)")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_DCB_SETTING_NAME, prop_name); - return FALSE; - } - - if ((array[i] > max) && (array[i] != extra)) { - g_set_error_literal (error, - NM_SETTING_DCB_ERROR, - NM_SETTING_DCB_ERROR_INVALID_PROPERTY, - _("element invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_DCB_SETTING_NAME, prop_name); - return FALSE; - } - sum += array[i]; - } - - /* Verify sum of percentages */ - if (sum_pct) { - if (flags & NM_SETTING_DCB_FLAG_ENABLE) { - /* If the feature is enabled, sum must equal 100% */ - if (sum != 100) { - g_set_error_literal (error, - NM_SETTING_DCB_ERROR, - NM_SETTING_DCB_ERROR_INVALID_PROPERTY, - _("sum not 100%")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_DCB_SETTING_NAME, prop_name); - return FALSE; - } - } else { - /* If the feature is disabled, sum must equal 0%, which was checked - * by the for() loop above. - */ - g_assert_cmpint (sum, ==, 0); - } - } - - return TRUE; -} - -static gboolean -check_priority (int val, - NMSettingDcbFlags flags, - const char *prop_name, - GError **error) -{ - if (!(flags & NM_SETTING_DCB_FLAG_ENABLE) && (val >= 0)) { - g_set_error_literal (error, - NM_SETTING_DCB_ERROR, - NM_SETTING_DCB_ERROR_INVALID_PROPERTY, - _("property invalid (not enabled)")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_DCB_SETTING_NAME, prop_name); - return FALSE; - } - - if (val < -1 || val > 7) { - g_set_error_literal (error, - NM_SETTING_DCB_ERROR, - NM_SETTING_DCB_ERROR_INVALID_PROPERTY, - _("property invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_DCB_SETTING_NAME, prop_name); - return FALSE; - } - return TRUE; -} - -static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - NMSettingDcbPrivate *priv = NM_SETTING_DCB_GET_PRIVATE (setting); - - if (!check_dcb_flags (priv->app_fcoe_flags, NM_SETTING_DCB_APP_FCOE_FLAGS, error)) - return FALSE; - - if (!check_priority (priv->app_fcoe_priority, priv->app_fcoe_flags, NM_SETTING_DCB_APP_FCOE_PRIORITY, error)) - return FALSE; - - if (!priv->app_fcoe_mode) { - g_set_error_literal (error, - NM_SETTING_DCB_ERROR, - NM_SETTING_DCB_ERROR_MISSING_PROPERTY, - _("property missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_DCB_SETTING_NAME, NM_SETTING_DCB_APP_FCOE_MODE); - return FALSE; - } - - if (strcmp (priv->app_fcoe_mode, NM_SETTING_DCB_FCOE_MODE_FABRIC) && - strcmp (priv->app_fcoe_mode, NM_SETTING_DCB_FCOE_MODE_VN2VN)) { - g_set_error_literal (error, - NM_SETTING_DCB_ERROR, - NM_SETTING_DCB_ERROR_INVALID_PROPERTY, - _("property invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_DCB_SETTING_NAME, NM_SETTING_DCB_APP_FCOE_MODE); - return FALSE; - } - - if (!check_dcb_flags (priv->app_iscsi_flags, NM_SETTING_DCB_APP_ISCSI_FLAGS, error)) - return FALSE; - - if (!check_priority (priv->app_iscsi_priority, priv->app_iscsi_flags, NM_SETTING_DCB_APP_ISCSI_PRIORITY, error)) - return FALSE; - - if (!check_dcb_flags (priv->app_fip_flags, NM_SETTING_DCB_APP_FIP_FLAGS, error)) - return FALSE; - - if (!check_priority (priv->app_fip_priority, priv->app_fip_flags, NM_SETTING_DCB_APP_FIP_PRIORITY, error)) - return FALSE; - - if (!check_dcb_flags (priv->pfc_flags, NM_SETTING_DCB_PRIORITY_FLOW_CONTROL_FLAGS, error)) - return FALSE; - - if (!check_uint_array (priv->pfc, G_N_ELEMENTS (priv->pfc), priv->pfc_flags, 1, 0, FALSE, NM_SETTING_DCB_PRIORITY_FLOW_CONTROL, error)) - return FALSE; - - if (!check_dcb_flags (priv->priority_group_flags, NM_SETTING_DCB_PRIORITY_GROUP_FLAGS, error)) - return FALSE; - - if (!check_uint_array (priv->priority_group_id, - G_N_ELEMENTS (priv->priority_group_id), - priv->priority_group_flags, - 7, - 15, - FALSE, - NM_SETTING_DCB_PRIORITY_GROUP_ID, - error)) - return FALSE; - - if (!check_uint_array (priv->priority_group_bandwidth, - G_N_ELEMENTS (priv->priority_group_bandwidth), - priv->priority_group_flags, - 100, - 0, - TRUE, - NM_SETTING_DCB_PRIORITY_GROUP_BANDWIDTH, - error)) - return FALSE; - - /* FIXME: sum bandwidths in each group */ - if (!check_uint_array (priv->priority_bandwidth, - G_N_ELEMENTS (priv->priority_bandwidth), - priv->priority_group_flags, - 100, - 0, - FALSE, - NM_SETTING_DCB_PRIORITY_BANDWIDTH, - error)) - return FALSE; - - if (!check_uint_array (priv->priority_strict, - G_N_ELEMENTS (priv->priority_strict), - priv->priority_group_flags, - 1, - 0, - FALSE, - NM_SETTING_DCB_PRIORITY_STRICT_BANDWIDTH, - error)) - return FALSE; - - if (!check_uint_array (priv->priority_traffic_class, - G_N_ELEMENTS (priv->priority_traffic_class), - priv->priority_group_flags, - 7, - 0, - FALSE, - NM_SETTING_DCB_PRIORITY_TRAFFIC_CLASS, - error)) - return FALSE; - - return TRUE; -} - -/*****************************************************************************/ - -static void -nm_setting_dcb_init (NMSettingDcb *setting) -{ -} - -static void -set_uint_array (const GValue *v, uint *a, size_t len) -{ - GArray *src = g_value_get_boxed (v); - const guint total_len = len * sizeof (a[0]); - - memset (a, 0, total_len); - if (src) { - g_return_if_fail (g_array_get_element_size (src) == sizeof (a[0])); - g_return_if_fail (src->len == len); - memcpy (a, src->data, total_len); - } -} -#define SET_UINT_ARRAY(v, a) set_uint_array (v, a, G_N_ELEMENTS (a)) - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSettingDcbPrivate *priv = NM_SETTING_DCB_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_APP_FCOE_FLAGS: - priv->app_fcoe_flags = g_value_get_uint (value); - break; - case PROP_APP_FCOE_PRIORITY: - priv->app_fcoe_priority = g_value_get_int (value); - break; - case PROP_APP_FCOE_MODE: - g_free (priv->app_fcoe_mode); - priv->app_fcoe_mode = g_value_dup_string (value); - break; - case PROP_APP_ISCSI_FLAGS: - priv->app_iscsi_flags = g_value_get_uint (value); - break; - case PROP_APP_ISCSI_PRIORITY: - priv->app_iscsi_priority = g_value_get_int (value); - break; - case PROP_APP_FIP_FLAGS: - priv->app_fip_flags = g_value_get_uint (value); - break; - case PROP_APP_FIP_PRIORITY: - priv->app_fip_priority = g_value_get_int (value); - break; - case PROP_PFC_FLAGS: - priv->pfc_flags = g_value_get_uint (value); - break; - case PROP_PFC: - SET_UINT_ARRAY (value, priv->pfc); - break; - case PROP_PRIORITY_GROUP_FLAGS: - priv->priority_group_flags = g_value_get_uint (value); - break; - case PROP_PRIORITY_GROUP_ID: - SET_UINT_ARRAY (value, priv->priority_group_id); - break; - case PROP_PRIORITY_GROUP_BANDWIDTH: - SET_UINT_ARRAY (value, priv->priority_group_bandwidth); - break; - case PROP_PRIORITY_BANDWIDTH: - SET_UINT_ARRAY (value, priv->priority_bandwidth); - break; - case PROP_PRIORITY_STRICT: - SET_UINT_ARRAY (value, priv->priority_strict); - break; - case PROP_PRIORITY_TRAFFIC_CLASS: - SET_UINT_ARRAY (value, priv->priority_traffic_class); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -#define TAKE_UINT_ARRAY(v, a) \ -{ \ - guint len = G_N_ELEMENTS (a); \ - GArray *dst = g_array_sized_new (FALSE, TRUE, sizeof (guint), len); \ - g_array_append_vals (dst, (a), len); \ - g_value_take_boxed (v, dst); \ -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSettingDcb *setting = NM_SETTING_DCB (object); - NMSettingDcbPrivate *priv = NM_SETTING_DCB_GET_PRIVATE (setting); - - switch (prop_id) { - case PROP_APP_FCOE_FLAGS: - g_value_set_uint (value, priv->app_fcoe_flags); - break; - case PROP_APP_FCOE_PRIORITY: - g_value_set_int (value, priv->app_fcoe_priority); - break; - case PROP_APP_FCOE_MODE: - g_value_set_string (value, priv->app_fcoe_mode); - break; - case PROP_APP_ISCSI_FLAGS: - g_value_set_uint (value, priv->app_iscsi_flags); - break; - case PROP_APP_ISCSI_PRIORITY: - g_value_set_int (value, priv->app_iscsi_priority); - break; - case PROP_APP_FIP_FLAGS: - g_value_set_uint (value, priv->app_fip_flags); - break; - case PROP_APP_FIP_PRIORITY: - g_value_set_int (value, priv->app_fip_priority); - break; - case PROP_PFC_FLAGS: - g_value_set_uint (value, priv->pfc_flags); - break; - case PROP_PFC: - TAKE_UINT_ARRAY (value, priv->pfc); - break; - case PROP_PRIORITY_GROUP_FLAGS: - g_value_set_uint (value, priv->priority_group_flags); - break; - case PROP_PRIORITY_GROUP_ID: - TAKE_UINT_ARRAY (value, priv->priority_group_id); - break; - case PROP_PRIORITY_GROUP_BANDWIDTH: - TAKE_UINT_ARRAY (value, priv->priority_group_bandwidth); - break; - case PROP_PRIORITY_BANDWIDTH: - TAKE_UINT_ARRAY (value, priv->priority_bandwidth); - break; - case PROP_PRIORITY_STRICT: - TAKE_UINT_ARRAY (value, priv->priority_strict); - break; - case PROP_PRIORITY_TRAFFIC_CLASS: - TAKE_UINT_ARRAY (value, priv->priority_traffic_class); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -finalize (GObject *object) -{ - NMSettingDcbPrivate *priv = NM_SETTING_DCB_GET_PRIVATE (object); - - g_free (priv->app_fcoe_mode); - - G_OBJECT_CLASS (nm_setting_dcb_parent_class)->finalize (object); -} - -static void -nm_setting_dcb_class_init (NMSettingDcbClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingDcbPrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->finalize = finalize; - parent_class->verify = verify; - - /* Properties */ - /** - * NMSettingDcb:app-fcoe-flags: - * - * Specifies the #NMSettingDcbFlags for the DCB FCoE application. Flags may - * be any combination of %NM_SETTING_DCB_FLAG_ENABLE, - * %NM_SETTING_DCB_FLAG_ADVERTISE, and %NM_SETTING_DCB_FLAG_WILLING. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_APP_FCOE_FLAGS, - g_param_spec_uint (NM_SETTING_DCB_APP_FCOE_FLAGS, "", "", - 0, DCB_FLAGS_ALL, 0, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:app-fcoe-priority: - * - * The highest User Priority (0 - 7) which FCoE frames should use, or -1 for - * default priority. Only used when the #NMSettingDcb:app-fcoe-flags - * property includes the %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_APP_FCOE_PRIORITY, - g_param_spec_int (NM_SETTING_DCB_APP_FCOE_PRIORITY, "", "", - -1, 7, -1, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:app-fcoe-mode: - * - * The FCoE controller mode; either %NM_SETTING_DCB_FCOE_MODE_FABRIC - * (default) or %NM_SETTING_DCB_FCOE_MODE_VN2VN. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_APP_FCOE_MODE, - g_param_spec_string (NM_SETTING_DCB_APP_FCOE_MODE, "", "", - NM_SETTING_DCB_FCOE_MODE_FABRIC, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:app-iscsi-flags: - * - * Specifies the #NMSettingDcbFlags for the DCB iSCSI application. Flags - * may be any combination of %NM_SETTING_DCB_FLAG_ENABLE, - * %NM_SETTING_DCB_FLAG_ADVERTISE, and %NM_SETTING_DCB_FLAG_WILLING. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_APP_ISCSI_FLAGS, - g_param_spec_uint (NM_SETTING_DCB_APP_ISCSI_FLAGS, "", "", - 0, DCB_FLAGS_ALL, 0, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:app-iscsi-priority: - * - * The highest User Priority (0 - 7) which iSCSI frames should use, or -1 - * for default priority. Only used when the #NMSettingDcb:app-iscsi-flags - * property includes the %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_APP_ISCSI_PRIORITY, - g_param_spec_int (NM_SETTING_DCB_APP_ISCSI_PRIORITY, "", "", - -1, 7, -1, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:app-fip-flags: - * - * Specifies the #NMSettingDcbFlags for the DCB FIP application. Flags may - * be any combination of %NM_SETTING_DCB_FLAG_ENABLE, - * %NM_SETTING_DCB_FLAG_ADVERTISE, and %NM_SETTING_DCB_FLAG_WILLING. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_APP_FIP_FLAGS, - g_param_spec_uint (NM_SETTING_DCB_APP_FIP_FLAGS, "", "", - 0, DCB_FLAGS_ALL, 0, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:app-fip-priority: - * - * The highest User Priority (0 - 7) which FIP frames should use, or -1 for - * default priority. Only used when the #NMSettingDcb:app-fip-flags - * property includes the %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_APP_FIP_PRIORITY, - g_param_spec_int (NM_SETTING_DCB_APP_FIP_PRIORITY, "", "", - -1, 7, -1, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:priority-flow-control-flags: - * - * Specifies the #NMSettingDcbFlags for DCB Priority Flow Control (PFC). - * Flags may be any combination of %NM_SETTING_DCB_FLAG_ENABLE, - * %NM_SETTING_DCB_FLAG_ADVERTISE, and %NM_SETTING_DCB_FLAG_WILLING. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_PFC_FLAGS, - g_param_spec_uint (NM_SETTING_DCB_PRIORITY_FLOW_CONTROL_FLAGS, "", "", - 0, DCB_FLAGS_ALL, 0, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:priority-flow-control: - * - * An array of 8 uint values, where the array index corresponds to the User - * Priority (0 - 7) and the value indicates whether or not the corresponding - * priority should transmit priority pause. Allowed values are 0 (do not - * transmit pause) and 1 (transmit pause). - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_PFC, - _nm_param_spec_specialized (NM_SETTING_DCB_PRIORITY_FLOW_CONTROL, "", "", - DBUS_TYPE_G_UINT_ARRAY, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:priority-group-flags: - * - * Specifies the #NMSettingDcbFlags for DCB Priority Groups. Flags may be - * any combination of %NM_SETTING_DCB_FLAG_ENABLE, - * %NM_SETTING_DCB_FLAG_ADVERTISE, and %NM_SETTING_DCB_FLAG_WILLING. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_PRIORITY_GROUP_FLAGS, - g_param_spec_uint (NM_SETTING_DCB_PRIORITY_GROUP_FLAGS, "", "", - 0, DCB_FLAGS_ALL, 0, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:priority-group-id: - * - * An array of 8 uint values, where the array index corresponds to the User - * Priority (0 - 7) and the value indicates the Priority Group ID. Allowed - * Priority Group ID values are 0 - 7 or 15 for the unrestricted group. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_PRIORITY_GROUP_ID, - _nm_param_spec_specialized (NM_SETTING_DCB_PRIORITY_GROUP_ID, "", "", - DBUS_TYPE_G_UINT_ARRAY, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:priority-group-bandwidth: - * - * An array of 8 uint values, where the array index corresponds to the - * Priority Group ID (0 - 7) and the value indicates the percentage of link - * bandwidth allocated to that group. Allowed values are 0 - 100, and the - * sum of all values must total 100 percents. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_PRIORITY_GROUP_BANDWIDTH, - _nm_param_spec_specialized (NM_SETTING_DCB_PRIORITY_GROUP_BANDWIDTH, "", "", - DBUS_TYPE_G_UINT_ARRAY, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:priority-bandwidth: - * - * An array of 8 uint values, where the array index corresponds to the User - * Priority (0 - 7) and the value indicates the percentage of bandwidth of - * the priority's assigned group that the priority may use. The sum of all - * percentages for priorities which belong to the same group must total 100 - * percents. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_PRIORITY_BANDWIDTH, - _nm_param_spec_specialized (NM_SETTING_DCB_PRIORITY_BANDWIDTH, "", "", - DBUS_TYPE_G_UINT_ARRAY, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:priority-strict-bandwidth: - * - * An array of 8 uint values, where the array index corresponds to the User - * Priority (0 - 7) and the value indicates whether or not the priority may - * use all of the bandwidth allocated to its assigned group. Allowed values - * are 0 (the priority may not utilize all bandwidth) or 1 (the priority may - * utilize all bandwidth). - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_PRIORITY_STRICT, - _nm_param_spec_specialized (NM_SETTING_DCB_PRIORITY_STRICT_BANDWIDTH, "", "", - DBUS_TYPE_G_UINT_ARRAY, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:priority-traffic-class: - * - * An array of 8 uint values, where the array index corresponds to the User - * Priority (0 - 7) and the value indicates the traffic class (0 - 7) to - * which the priority is mapped. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_PRIORITY_TRAFFIC_CLASS, - _nm_param_spec_specialized (NM_SETTING_DCB_PRIORITY_TRAFFIC_CLASS, "", "", - DBUS_TYPE_G_UINT_ARRAY, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-util/nm-setting-dcb.h b/libnm-util/nm-setting-dcb.h deleted file mode 100644 index 04863545ca..0000000000 --- a/libnm-util/nm-setting-dcb.h +++ /dev/null @@ -1,185 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2013 Red Hat, Inc. - */ - -#ifndef NM_SETTING_DCB_H -#define NM_SETTING_DCB_H - -#include "nm-setting.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SETTING_DCB (nm_setting_dcb_get_type ()) -#define NM_SETTING_DCB(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_DCB, NMSettingDcb)) -#define NM_SETTING_DCB_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_DCB, NMSettingDcbClass)) -#define NM_IS_SETTING_DCB(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_DCB)) -#define NM_IS_SETTING_DCB_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_DCB)) -#define NM_SETTING_DCB_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_DCB, NMSettingDcbClass)) - -#define NM_SETTING_DCB_SETTING_NAME "dcb" - -/** - * NMSettingDcbError: - * @NM_SETTING_DCB_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_DCB_ERROR_INVALID_PROPERTY: the property was invalid - * @NM_SETTING_DCB_ERROR_MISSING_PROPERTY: the property was missing and is - * required - */ -typedef enum { - NM_SETTING_DCB_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_SETTING_DCB_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/ - NM_SETTING_DCB_ERROR_MISSING_PROPERTY /*< nick=MissingProperty >*/ -} NMSettingDcbError; - -#define NM_SETTING_DCB_ERROR nm_setting_dcb_error_quark () -GQuark nm_setting_dcb_error_quark (void); - -/** - * NMSettingDcbFlags: - * @NM_SETTING_DCB_FLAG_NONE: no flag - * @NM_SETTING_DCB_FLAG_ENABLE: the feature is enabled - * @NM_SETTING_DCB_FLAG_ADVERTISE: the feature is advertised - * @NM_SETTING_DCB_FLAG_WILLING: the feature is willing to change based on - * peer configuration advertisements - * - * DCB feature flags. - * - * Since: 0.9.10 - **/ -typedef enum { - NM_SETTING_DCB_FLAG_NONE = 0x00000000, - NM_SETTING_DCB_FLAG_ENABLE = 0x00000001, - NM_SETTING_DCB_FLAG_ADVERTISE = 0x00000002, - NM_SETTING_DCB_FLAG_WILLING = 0x00000004 -} NMSettingDcbFlags; - -/** - * NM_SETTING_DCB_FCOE_MODE_FABRIC: - * - * Indicates that the FCoE controller should use "fabric" mode (default) - * - * Since: 0.9.10 - */ -#define NM_SETTING_DCB_FCOE_MODE_FABRIC "fabric" - -/** - * NM_SETTING_DCB_FCOE_MODE_VN2VN: - * - * Indicates that the FCoE controller should use "VN2VN" mode. - * - * Since: 0.9.10 - */ -#define NM_SETTING_DCB_FCOE_MODE_VN2VN "vn2vn" - -/* Properties */ -#define NM_SETTING_DCB_APP_FCOE_FLAGS "app-fcoe-flags" -#define NM_SETTING_DCB_APP_FCOE_PRIORITY "app-fcoe-priority" -#define NM_SETTING_DCB_APP_FCOE_MODE "app-fcoe-mode" - -#define NM_SETTING_DCB_APP_ISCSI_FLAGS "app-iscsi-flags" -#define NM_SETTING_DCB_APP_ISCSI_PRIORITY "app-iscsi-priority" - -#define NM_SETTING_DCB_APP_FIP_FLAGS "app-fip-flags" -#define NM_SETTING_DCB_APP_FIP_PRIORITY "app-fip-priority" - -#define NM_SETTING_DCB_PRIORITY_FLOW_CONTROL_FLAGS "priority-flow-control-flags" -#define NM_SETTING_DCB_PRIORITY_FLOW_CONTROL "priority-flow-control" - -#define NM_SETTING_DCB_PRIORITY_GROUP_FLAGS "priority-group-flags" -#define NM_SETTING_DCB_PRIORITY_GROUP_ID "priority-group-id" -#define NM_SETTING_DCB_PRIORITY_GROUP_BANDWIDTH "priority-group-bandwidth" -#define NM_SETTING_DCB_PRIORITY_BANDWIDTH "priority-bandwidth" -#define NM_SETTING_DCB_PRIORITY_STRICT_BANDWIDTH "priority-strict-bandwidth" -#define NM_SETTING_DCB_PRIORITY_TRAFFIC_CLASS "priority-traffic-class" - -typedef struct { - NMSetting parent; -} NMSettingDcb; - -typedef struct { - NMSettingClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); -} NMSettingDcbClass; - -NM_AVAILABLE_IN_0_9_10 -GType nm_setting_dcb_get_type (void); - -NM_AVAILABLE_IN_0_9_10 -NMSetting * nm_setting_dcb_new (void); - -NMSettingDcbFlags nm_setting_dcb_get_app_fcoe_flags (NMSettingDcb *setting); -int nm_setting_dcb_get_app_fcoe_priority (NMSettingDcb *setting); -const char * nm_setting_dcb_get_app_fcoe_mode (NMSettingDcb *setting); - -NMSettingDcbFlags nm_setting_dcb_get_app_iscsi_flags (NMSettingDcb *setting); -int nm_setting_dcb_get_app_iscsi_priority (NMSettingDcb *setting); - -NMSettingDcbFlags nm_setting_dcb_get_app_fip_flags (NMSettingDcb *setting); -int nm_setting_dcb_get_app_fip_priority (NMSettingDcb *setting); - -/* Priority Flow Control */ -NMSettingDcbFlags nm_setting_dcb_get_priority_flow_control_flags (NMSettingDcb *setting); -gboolean nm_setting_dcb_get_priority_flow_control (NMSettingDcb *setting, - guint user_priority); -void nm_setting_dcb_set_priority_flow_control (NMSettingDcb *setting, - guint user_priority, - gboolean enabled); - -/* Priority Groups */ -NMSettingDcbFlags nm_setting_dcb_get_priority_group_flags (NMSettingDcb *setting); - -guint nm_setting_dcb_get_priority_group_id (NMSettingDcb *setting, - guint user_priority); -void nm_setting_dcb_set_priority_group_id (NMSettingDcb *setting, - guint user_priority, - guint group_id); - -guint nm_setting_dcb_get_priority_group_bandwidth (NMSettingDcb *setting, - guint group_id); -void nm_setting_dcb_set_priority_group_bandwidth (NMSettingDcb *setting, - guint group_id, - guint bandwidth_percent); - -guint nm_setting_dcb_get_priority_bandwidth (NMSettingDcb *setting, - guint user_priority); -void nm_setting_dcb_set_priority_bandwidth (NMSettingDcb *setting, - guint user_priority, - guint bandwidth_percent); - -gboolean nm_setting_dcb_get_priority_strict_bandwidth (NMSettingDcb *setting, - guint user_priority); -void nm_setting_dcb_set_priority_strict_bandwidth (NMSettingDcb *setting, - guint user_priority, - gboolean strict); - -guint nm_setting_dcb_get_priority_traffic_class (NMSettingDcb *setting, - guint user_priority); -void nm_setting_dcb_set_priority_traffic_class (NMSettingDcb *setting, - guint user_priority, - guint traffic_class); - -G_END_DECLS - -#endif /* NM_SETTING_DCB_H */ diff --git a/libnm-util/nm-setting-generic.c b/libnm-util/nm-setting-generic.c deleted file mode 100644 index 573be86a5b..0000000000 --- a/libnm-util/nm-setting-generic.c +++ /dev/null @@ -1,100 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2013 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include "nm-setting-generic.h" -#include "nm-setting-private.h" - -/** - * SECTION:nm-setting-generic - * @short_description: Describes connection properties for generic devices - * @include: nm-setting-generic.h - * - * The #NMSettingGeneric object is a #NMSetting subclass that describes - * optional properties that apply to "generic" devices (ie, devices that - * NetworkManager does not specifically recognize). - * - * There are currently no properties on this object; it exists only to be - * the "connection type" setting on #NMConnections for generic devices. - * - * Since: 0.9.10 - **/ - -/** - * nm_setting_generic_error_quark: - * - * Registers an error quark for #NMSettingGeneric if necessary. - * - * Returns: the error quark used for #NMSettingGeneric errors. - * - * Since: 0.9.10 - **/ -GQuark -nm_setting_generic_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-generic-error-quark"); - return quark; -} - -G_DEFINE_TYPE_WITH_CODE (NMSettingGeneric, nm_setting_generic, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_GENERIC_SETTING_NAME, - g_define_type_id, - 1, - NM_SETTING_GENERIC_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_GENERIC) - -#define NM_SETTING_GENERIC_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_GENERIC, NMSettingGenericPrivate)) - -typedef struct { - int dummy; -} NMSettingGenericPrivate; - -/*****************************************************************************/ - -/** - * nm_setting_generic_new: - * - * Creates a new #NMSettingGeneric object with default values. - * - * Returns: (transfer full): the new empty #NMSettingGeneric object - * - * Since: 0.9.10 - **/ -NMSetting * -nm_setting_generic_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_GENERIC, NULL); -} - -static void -nm_setting_generic_init (NMSettingGeneric *setting) -{ -} - -static void -nm_setting_generic_class_init (NMSettingGenericClass *setting_class) -{ - g_type_class_add_private (setting_class, sizeof (NMSettingGenericPrivate)); -} diff --git a/libnm-util/nm-setting-generic.h b/libnm-util/nm-setting-generic.h deleted file mode 100644 index f3b07f69bd..0000000000 --- a/libnm-util/nm-setting-generic.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2013 Red Hat, Inc. - */ - -#ifndef NM_SETTING_GENERIC_H -#define NM_SETTING_GENERIC_H - -#include "nm-setting.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SETTING_GENERIC (nm_setting_generic_get_type ()) -#define NM_SETTING_GENERIC(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_GENERIC, NMSettingGeneric)) -#define NM_SETTING_GENERIC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_GENERIC, NMSettingGenericClass)) -#define NM_IS_SETTING_GENERIC(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_GENERIC)) -#define NM_IS_SETTING_GENERIC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_GENERIC)) -#define NM_SETTING_GENERIC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_GENERIC, NMSettingGenericClass)) - -#define NM_SETTING_GENERIC_SETTING_NAME "generic" - -/** - * NMSettingGenericError: - * @NM_SETTING_GENERIC_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_GENERIC_ERROR_INVALID_PROPERTY: the property was invalid - * @NM_SETTING_GENERIC_ERROR_MISSING_PROPERTY: the property was missing and - * is required - * - * Since: 0.9.10 - */ -typedef enum { - NM_SETTING_GENERIC_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_SETTING_GENERIC_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/ - NM_SETTING_GENERIC_ERROR_MISSING_PROPERTY, /*< nick=MissingProperty >*/ -} NMSettingGenericError; - -#define NM_SETTING_GENERIC_ERROR nm_setting_generic_error_quark () -GQuark nm_setting_generic_error_quark (void); - -typedef struct { - NMSetting parent; -} NMSettingGeneric; - -typedef struct { - NMSettingClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); -} NMSettingGenericClass; - -NM_AVAILABLE_IN_0_9_10 -GType nm_setting_generic_get_type (void); - -NM_AVAILABLE_IN_0_9_10 -NMSetting * nm_setting_generic_new (void); - -G_END_DECLS - -#endif /* NM_SETTING_GENERIC_H */ diff --git a/libnm-util/nm-setting-gsm.c b/libnm-util/nm-setting-gsm.c deleted file mode 100644 index 82ebde335e..0000000000 --- a/libnm-util/nm-setting-gsm.c +++ /dev/null @@ -1,714 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2013 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#include "nm-default.h" - -#include <string.h> - -#include "nm-setting-gsm.h" -#include "nm-utils.h" -#include "nm-setting-private.h" - -/** - * SECTION:nm-setting-gsm - * @short_description: Describes GSM/3GPP-based mobile broadband properties - * @include: nm-setting-gsm.h - * - * The #NMSettingGsm object is a #NMSetting subclass that describes - * properties that allow connections to 3GPP-based mobile broadband - * networks, including those using GPRS/EDGE and UMTS/HSPA technology. - */ - -/** - * nm_setting_gsm_error_quark: - * - * Registers an error quark for #NMSettingGsm if necessary. - * - * Returns: the error quark used for #NMSettingGsm errors. - **/ -GQuark -nm_setting_gsm_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-gsm-error-quark"); - return quark; -} - -G_DEFINE_TYPE_WITH_CODE (NMSettingGsm, nm_setting_gsm, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_GSM_SETTING_NAME, - g_define_type_id, - 1, - NM_SETTING_GSM_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_GSM) - -#define NM_SETTING_GSM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_GSM, NMSettingGsmPrivate)) - -typedef struct { - char *number; /* For dialing, duh */ - char *username; - char *password; - NMSettingSecretFlags password_flags; - - char *apn; /* NULL for dynamic */ - char *network_id; /* for manual registration or NULL for automatic */ - int network_type; /* One of the NM_SETTING_GSM_NETWORK_TYPE_* */ - guint32 allowed_bands; /* A bitfield of NM_SETTING_GSM_BAND_* */ - - char *pin; - NMSettingSecretFlags pin_flags; - - gboolean home_only; -} NMSettingGsmPrivate; - -enum { - PROP_0, - PROP_NUMBER, - PROP_USERNAME, - PROP_PASSWORD, - PROP_PASSWORD_FLAGS, - PROP_APN, - PROP_NETWORK_ID, - PROP_NETWORK_TYPE, - PROP_PIN, - PROP_PIN_FLAGS, - PROP_ALLOWED_BANDS, - PROP_HOME_ONLY, - - LAST_PROP -}; - -/** - * nm_setting_gsm_new: - * - * Creates a new #NMSettingGsm object with default values. - * - * Returns: the new empty #NMSettingGsm object - **/ -NMSetting * -nm_setting_gsm_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_GSM, NULL); -} - -/** - * nm_setting_gsm_get_number: - * @setting: the #NMSettingGsm - * - * Returns: the #NMSettingGsm:number property of the setting - **/ -const char * -nm_setting_gsm_get_number (NMSettingGsm *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_GSM (setting), NULL); - - return NM_SETTING_GSM_GET_PRIVATE (setting)->number; -} - -/** - * nm_setting_gsm_get_username: - * @setting: the #NMSettingGsm - * - * Returns: the #NMSettingGsm:username property of the setting - **/ -const char * -nm_setting_gsm_get_username (NMSettingGsm *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_GSM (setting), NULL); - - return NM_SETTING_GSM_GET_PRIVATE (setting)->username; -} - -/** - * nm_setting_gsm_get_password: - * @setting: the #NMSettingGsm - * - * Returns: the #NMSettingGsm:password property of the setting - **/ -const char * -nm_setting_gsm_get_password (NMSettingGsm *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_GSM (setting), NULL); - - return NM_SETTING_GSM_GET_PRIVATE (setting)->password; -} - -/** - * nm_setting_gsm_get_password_flags: - * @setting: the #NMSettingGsm - * - * Returns: the #NMSettingSecretFlags pertaining to the #NMSettingGsm:password - **/ -NMSettingSecretFlags -nm_setting_gsm_get_password_flags (NMSettingGsm *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_GSM (setting), NM_SETTING_SECRET_FLAG_NONE); - - return NM_SETTING_GSM_GET_PRIVATE (setting)->password_flags; -} - -/** - * nm_setting_gsm_get_apn: - * @setting: the #NMSettingGsm - * - * Returns: the #NMSettingGsm:apn property of the setting - **/ -const char * -nm_setting_gsm_get_apn (NMSettingGsm *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_GSM (setting), NULL); - - return NM_SETTING_GSM_GET_PRIVATE (setting)->apn; -} - -/** - * nm_setting_gsm_get_network_id: - * @setting: the #NMSettingGsm - * - * Returns: the #NMSettingGsm:network-id property of the setting - **/ -const char * -nm_setting_gsm_get_network_id (NMSettingGsm *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_GSM (setting), NULL); - - return NM_SETTING_GSM_GET_PRIVATE (setting)->network_id; -} - -/** - * nm_setting_gsm_get_network_type: - * @setting: the #NMSettingGsm - * - * Returns: the #NMSettingGsm:network-type property of the setting - * - * Deprecated: 0.9.10: No longer used. Network type setting should be done talking to ModemManager directly. - **/ -int -nm_setting_gsm_get_network_type (NMSettingGsm *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_GSM (setting), -1); - - return NM_SETTING_GSM_GET_PRIVATE (setting)->network_type; -} - -/** - * nm_setting_gsm_get_allowed_bands: - * @setting: the #NMSettingGsm - * - * Returns: the #NMSettingGsm:allowed-bands property of the setting - * - * Deprecated: 0.9.10: No longer used. Bands setting should be done talking to ModemManager directly. - **/ -guint32 -nm_setting_gsm_get_allowed_bands (NMSettingGsm *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_GSM (setting), NM_SETTING_GSM_BAND_UNKNOWN); - - return NM_SETTING_GSM_GET_PRIVATE (setting)->allowed_bands; -} - -/** - * nm_setting_gsm_get_pin: - * @setting: the #NMSettingGsm - * - * Returns: the #NMSettingGsm:pin property of the setting - **/ -const char * -nm_setting_gsm_get_pin (NMSettingGsm *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_GSM (setting), NULL); - - return NM_SETTING_GSM_GET_PRIVATE (setting)->pin; -} - -/** - * nm_setting_gsm_get_pin_flags: - * @setting: the #NMSettingGsm - * - * Returns: the #NMSettingSecretFlags pertaining to the #NMSettingGsm:pin - **/ -NMSettingSecretFlags -nm_setting_gsm_get_pin_flags (NMSettingGsm *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_GSM (setting), NM_SETTING_SECRET_FLAG_NONE); - - return NM_SETTING_GSM_GET_PRIVATE (setting)->pin_flags; -} - -/** - * nm_setting_gsm_get_home_only: - * @setting: the #NMSettingGsm - * - * Returns: the #NMSettingGsm:home-only property of the setting - **/ -gboolean -nm_setting_gsm_get_home_only (NMSettingGsm *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_GSM (setting), FALSE); - - return NM_SETTING_GSM_GET_PRIVATE (setting)->home_only; -} - -static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - NMSettingGsmPrivate *priv = NM_SETTING_GSM_GET_PRIVATE (setting); - - if (priv->number && !priv->number[0]) { - g_set_error_literal (error, - NM_SETTING_GSM_ERROR, - NM_SETTING_GSM_ERROR_INVALID_PROPERTY, - _("property is empty")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_GSM_SETTING_NAME, NM_SETTING_GSM_NUMBER); - return FALSE; - } - - if (priv->apn) { - guint32 apn_len = strlen (priv->apn); - guint32 i; - - if (apn_len < 1 || apn_len > 64) { - g_set_error (error, - NM_SETTING_GSM_ERROR, - NM_SETTING_GSM_ERROR_INVALID_PROPERTY, - _("property value '%s' is empty or too long (>64)"), - priv->apn); - g_prefix_error (error, "%s.%s: ", NM_SETTING_GSM_SETTING_NAME, NM_SETTING_GSM_APN); - return FALSE; - } - - /* APNs roughly follow the same rules as DNS domain names. Allowed - * characters are a-z, 0-9, . and -. GSM 03.03 Section 9.1 states: - * - * The syntax of the APN shall follow the Name Syntax defined in - * RFC 2181 [14] and RFC 1035 [15]. The APN consists of one or - * more labels. Each label is coded as one octet length field - * followed by that number of octets coded as 8 bit ASCII characters. - * Following RFC 1035 [15] the labels should consist only of the - * alphabetic characters (A-Z and a-z), digits (0-9) and the - * dash (-). The case of alphabetic characters is not significant. - * - * A dot (.) is commonly used to separate parts of the APN, and - * apparently the underscore (_) is used as well. RFC 2181 indicates - * that no restrictions of any kind are placed on DNS labels, and thus - * it would appear that none are placed on APNs either, but many modems - * and networks will fail to accept APNs that include odd characters - * like space ( ) and such. - */ - for (i = 0; i < apn_len; i++) { - if ( !g_ascii_isalnum (priv->apn[i]) - && (priv->apn[i] != '.') - && (priv->apn[i] != '_') - && (priv->apn[i] != '-')) { - g_set_error (error, - NM_SETTING_GSM_ERROR, - NM_SETTING_GSM_ERROR_INVALID_PROPERTY, - _("'%s' contains invalid char(s) (use [A-Za-z._-])"), - priv->apn); - g_prefix_error (error, "%s.%s: ", NM_SETTING_GSM_SETTING_NAME, NM_SETTING_GSM_APN); - return FALSE; - } - } - } - - if (priv->username && !strlen (priv->username)) { - g_set_error_literal (error, - NM_SETTING_GSM_ERROR, - NM_SETTING_GSM_ERROR_INVALID_PROPERTY, - _("property is empty")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_GSM_SETTING_NAME, NM_SETTING_GSM_USERNAME); - return FALSE; - } - - if (priv->network_id) { - guint32 nid_len = strlen (priv->network_id); - guint32 i; - - /* Accept both 5 and 6 digit MCC/MNC codes */ - if ((nid_len < 5) || (nid_len > 6)) { - g_set_error (error, - NM_SETTING_GSM_ERROR, - NM_SETTING_GSM_ERROR_INVALID_PROPERTY, - _("'%s' length is invalid (should be 5 or 6 digits)"), - priv->network_id); - g_prefix_error (error, "%s.%s: ", NM_SETTING_GSM_SETTING_NAME, NM_SETTING_GSM_NETWORK_ID); - return FALSE; - } - - for (i = 0; i < nid_len; i++) { - if (!g_ascii_isdigit (priv->network_id[i])) { - g_set_error (error, - NM_SETTING_GSM_ERROR, - NM_SETTING_GSM_ERROR_INVALID_PROPERTY, - _("'%s' is not a number"), - priv->network_id); - g_prefix_error (error, "%s.%s: ", NM_SETTING_GSM_SETTING_NAME, NM_SETTING_GSM_NETWORK_ID); - return FALSE; - } - } - } - - return TRUE; -} - -static GPtrArray * -need_secrets (NMSetting *setting) -{ - NMSettingGsmPrivate *priv = NM_SETTING_GSM_GET_PRIVATE (setting); - GPtrArray *secrets = NULL; - - if (priv->password && *priv->password) - return NULL; - - if (priv->username) { - if (!(priv->password_flags & NM_SETTING_SECRET_FLAG_NOT_REQUIRED)) { - secrets = g_ptr_array_sized_new (1); - g_ptr_array_add (secrets, NM_SETTING_GSM_PASSWORD); - } - } - - return secrets; -} - -static void -nm_setting_gsm_init (NMSettingGsm *setting) -{ -} - -static void -finalize (GObject *object) -{ - NMSettingGsmPrivate *priv = NM_SETTING_GSM_GET_PRIVATE (object); - - g_free (priv->number); - g_free (priv->username); - g_free (priv->password); - g_free (priv->apn); - g_free (priv->network_id); - g_free (priv->pin); - - G_OBJECT_CLASS (nm_setting_gsm_parent_class)->finalize (object); -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSettingGsmPrivate *priv = NM_SETTING_GSM_GET_PRIVATE (object); - char *tmp; - - switch (prop_id) { - case PROP_NUMBER: - g_free (priv->number); - priv->number = g_value_dup_string (value); - break; - case PROP_USERNAME: - g_free (priv->username); - priv->username = g_value_dup_string (value); - break; - case PROP_PASSWORD: - g_free (priv->password); - priv->password = g_value_dup_string (value); - break; - case PROP_PASSWORD_FLAGS: - priv->password_flags = g_value_get_uint (value); - break; - case PROP_APN: - g_free (priv->apn); - priv->apn = NULL; - tmp = g_value_dup_string (value); - if (tmp) - priv->apn = g_strstrip (tmp); - break; - case PROP_NETWORK_ID: - g_free (priv->network_id); - priv->network_id = NULL; - tmp = g_value_dup_string (value); - if (tmp) - priv->network_id = g_strstrip (tmp); - break; - case PROP_NETWORK_TYPE: - priv->network_type = g_value_get_int (value); - break; - case PROP_ALLOWED_BANDS: - priv->allowed_bands = g_value_get_uint (value); - break; - case PROP_PIN: - g_free (priv->pin); - priv->pin = g_value_dup_string (value); - break; - case PROP_PIN_FLAGS: - priv->pin_flags = g_value_get_uint (value); - break; - case PROP_HOME_ONLY: - priv->home_only = g_value_get_boolean (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSettingGsm *setting = NM_SETTING_GSM (object); - - switch (prop_id) { - case PROP_NUMBER: - g_value_set_string (value, nm_setting_gsm_get_number (setting)); - break; - case PROP_USERNAME: - g_value_set_string (value, nm_setting_gsm_get_username (setting)); - break; - case PROP_PASSWORD: - g_value_set_string (value, nm_setting_gsm_get_password (setting)); - break; - case PROP_PASSWORD_FLAGS: - g_value_set_uint (value, nm_setting_gsm_get_password_flags (setting)); - break; - case PROP_APN: - g_value_set_string (value, nm_setting_gsm_get_apn (setting)); - break; - case PROP_NETWORK_ID: - g_value_set_string (value, nm_setting_gsm_get_network_id (setting)); - break; - case PROP_NETWORK_TYPE: - g_value_set_int (value, NM_SETTING_GSM_GET_PRIVATE (setting)->network_type); - break; - case PROP_ALLOWED_BANDS: - g_value_set_uint (value, NM_SETTING_GSM_GET_PRIVATE (setting)->allowed_bands); - break; - case PROP_PIN: - g_value_set_string (value, nm_setting_gsm_get_pin (setting)); - break; - case PROP_PIN_FLAGS: - g_value_set_uint (value, nm_setting_gsm_get_pin_flags (setting)); - break; - case PROP_HOME_ONLY: - g_value_set_boolean (value, nm_setting_gsm_get_home_only (setting)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_setting_gsm_class_init (NMSettingGsmClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingGsmPrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->finalize = finalize; - parent_class->verify = verify; - parent_class->need_secrets = need_secrets; - - /* Properties */ - - /** - * NMSettingGsm:number: - * - * Number to dial when establishing a PPP data session with the GSM-based - * mobile broadband network. Many modems do not require PPP for connections - * to the mobile network and thus this property should be left blank, which - * allows NetworkManager to select the appropriate settings automatically. - **/ - g_object_class_install_property - (object_class, PROP_NUMBER, - g_param_spec_string (NM_SETTING_GSM_NUMBER, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingGsm:username: - * - * The username used to authenticate with the network, if required. Many - * providers do not require a username, or accept any username. But if a - * username is required, it is specified here. - **/ - g_object_class_install_property - (object_class, PROP_USERNAME, - g_param_spec_string (NM_SETTING_GSM_USERNAME, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingGsm:password: - * - * The password used to authenticate with the network, if required. Many - * providers do not require a password, or accept any password. But if a - * password is required, it is specified here. - **/ - g_object_class_install_property - (object_class, PROP_PASSWORD, - g_param_spec_string (NM_SETTING_GSM_PASSWORD, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_SECRET | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingGsm:password-flags: - * - * Flags indicating how to handle the #NMSettingGsm:password property. - **/ - g_object_class_install_property - (object_class, PROP_PASSWORD_FLAGS, - g_param_spec_uint (NM_SETTING_GSM_PASSWORD_FLAGS, "", "", - NM_SETTING_SECRET_FLAG_NONE, - NM_SETTING_SECRET_FLAGS_ALL, - NM_SETTING_SECRET_FLAG_NONE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingGsm:apn: - * - * The GPRS Access Point Name specifying the APN used when establishing a - * data session with the GSM-based network. The APN often determines how - * the user will be billed for their network usage and whether the user has - * access to the Internet or just a provider-specific walled-garden, so it - * is important to use the correct APN for the user's mobile broadband plan. - * The APN may only be composed of the characters a-z, 0-9, ., and - per GSM - * 03.60 Section 14.9. - **/ - g_object_class_install_property - (object_class, PROP_APN, - g_param_spec_string (NM_SETTING_GSM_APN, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingGsm:network-id: - * - * The Network ID (GSM LAI format, ie MCC-MNC) to force specific network - * registration. If the Network ID is specified, NetworkManager will - * attempt to force the device to register only on the specified network. - * This can be used to ensure that the device does not roam when direct - * roaming control of the device is not otherwise possible. - **/ - g_object_class_install_property - (object_class, PROP_NETWORK_ID, - g_param_spec_string (NM_SETTING_GSM_NETWORK_ID, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingGsm:network-type: - * - * Network preference to force the device to only use specific network - * technologies. The permitted values are %NM_SETTING_GSM_NETWORK_TYPE_ANY, - * %NM_SETTING_GSM_NETWORK_TYPE_UMTS_HSPA, - * %NM_SETTING_GSM_NETWORK_TYPE_GPRS_EDGE, - * %NM_SETTING_GSM_NETWORK_TYPE_PREFER_UMTS_HSPA, - * %NM_SETTING_GSM_NETWORK_TYPE_PREFER_GPRS_EDGE, - * %NM_SETTING_GSM_NETWORK_TYPE_PREFER_4G, and - * %NM_SETTING_GSM_NETWORK_TYPE_4G. Note that not all devices allow network - * preference control. - * - * Deprecated: 0.9.10: No longer used. Network type setting should be done - * by talking to ModemManager directly. - **/ - g_object_class_install_property - (object_class, PROP_NETWORK_TYPE, - g_param_spec_int (NM_SETTING_GSM_NETWORK_TYPE, "", "", - NM_SETTING_GSM_NETWORK_TYPE_ANY, - NM_SETTING_GSM_NETWORK_TYPE_4G, - NM_SETTING_GSM_NETWORK_TYPE_ANY, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingGsm:allowed-bands: - * - * Bitfield of allowed frequency bands. Note that not all devices allow - * frequency band control. Permitted values are those specified by - * #NMSettingGsmNetworkBand. - * - * Deprecated: 0.9.10: No longer used. Band setting should be done by - * talking to ModemManager directly. - **/ - g_object_class_install_property - (object_class, PROP_ALLOWED_BANDS, - g_param_spec_uint (NM_SETTING_GSM_ALLOWED_BANDS, "", "", - NM_SETTING_GSM_BAND_UNKNOWN, - NM_SETTING_GSM_BANDS_MAX, - NM_SETTING_GSM_BAND_ANY, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingGsm:pin: - * - * If the SIM is locked with a PIN it must be unlocked before any other - * operations are requested. Specify the PIN here to allow operation of the - * device. - **/ - g_object_class_install_property - (object_class, PROP_PIN, - g_param_spec_string (NM_SETTING_GSM_PIN, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_SECRET | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingGsm:pin-flags: - * - * Flags indicating how to handle the #NMSettingGsm:pin property. - **/ - g_object_class_install_property - (object_class, PROP_PIN_FLAGS, - g_param_spec_uint (NM_SETTING_GSM_PIN_FLAGS, "", "", - NM_SETTING_SECRET_FLAG_NONE, - NM_SETTING_SECRET_FLAGS_ALL, - NM_SETTING_SECRET_FLAG_NONE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingGsm:home-only: - * - * When %TRUE, only connections to the home network will be allowed. - * Connections to roaming networks will not be made. - **/ - g_object_class_install_property - (object_class, PROP_HOME_ONLY, - g_param_spec_boolean (NM_SETTING_GSM_HOME_ONLY, "", "", - FALSE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-util/nm-setting-gsm.h b/libnm-util/nm-setting-gsm.h deleted file mode 100644 index 438c6b3b32..0000000000 --- a/libnm-util/nm-setting-gsm.h +++ /dev/null @@ -1,204 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2011 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#ifndef NM_SETTING_GSM_H -#define NM_SETTING_GSM_H - -#include "nm-setting.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SETTING_GSM (nm_setting_gsm_get_type ()) -#define NM_SETTING_GSM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_GSM, NMSettingGsm)) -#define NM_SETTING_GSM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_GSM, NMSettingGsmClass)) -#define NM_IS_SETTING_GSM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_GSM)) -#define NM_IS_SETTING_GSM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_GSM)) -#define NM_SETTING_GSM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_GSM, NMSettingGsmClass)) - -#define NM_SETTING_GSM_SETTING_NAME "gsm" - -/** - * NMSettingGsmError: - * @NM_SETTING_GSM_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_GSM_ERROR_INVALID_PROPERTY: the property was invalid - * @NM_SETTING_GSM_ERROR_MISSING_PROPERTY: the property was missing and is - * required - * @NM_SETTING_GSM_ERROR_MISSING_SERIAL_SETTING: the required #NMSettingSerial - * is missing in the connection - */ -typedef enum { - NM_SETTING_GSM_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_SETTING_GSM_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/ - NM_SETTING_GSM_ERROR_MISSING_PROPERTY, /*< nick=MissingProperty >*/ - NM_SETTING_GSM_ERROR_MISSING_SERIAL_SETTING /*< nick=MissingSerialSetting >*/ -} NMSettingGsmError; - -#define NM_SETTING_GSM_ERROR nm_setting_gsm_error_quark () -GQuark nm_setting_gsm_error_quark (void); - -#define NM_SETTING_GSM_NUMBER "number" -#define NM_SETTING_GSM_USERNAME "username" -#define NM_SETTING_GSM_PASSWORD "password" -#define NM_SETTING_GSM_PASSWORD_FLAGS "password-flags" -#define NM_SETTING_GSM_APN "apn" -#define NM_SETTING_GSM_NETWORK_ID "network-id" -#define NM_SETTING_GSM_PIN "pin" -#define NM_SETTING_GSM_PIN_FLAGS "pin-flags" -#define NM_SETTING_GSM_HOME_ONLY "home-only" - -/* Deprecated */ -#define NM_SETTING_GSM_ALLOWED_BANDS "allowed-bands" -#define NM_SETTING_GSM_NETWORK_TYPE "network-type" - -/** - * NMSettingGsmNetworkType: - * @NM_SETTING_GSM_NETWORK_TYPE_ANY: any access technology may be used - * @NM_SETTING_GSM_NETWORK_TYPE_UMTS_HSPA: only 3G-type (UMTS and HSPA) - * technologies may be used - * @NM_SETTING_GSM_NETWORK_TYPE_GPRS_EDGE: only 2G-type (GPRS and EDGE) - * technologies may be used - * @NM_SETTING_GSM_NETWORK_TYPE_PREFER_UMTS_HSPA: 3G-type technologies are - * preferred but 2G-type technologies may be used as a fallback - * @NM_SETTING_GSM_NETWORK_TYPE_PREFER_GPRS_EDGE: 2G-type technologies are - * preferred but 3G-type technologies may be used as a fallback - * @NM_SETTING_GSM_NETWORK_TYPE_PREFER_4G: 4G/LTE-type technologies are - * preferred but 3G/2/-type technologies may be used as a fallback - * @NM_SETTING_GSM_NETWORK_TYPE_4G: only 4G/LTE type - * technologies may be used - * - * #NMSettingGsmNetworkType values indicate the allowed access technologies - * the device may use when connecting to this network. - * - * Deprecated: 0.9.10: No longer used. - */ -typedef enum { - NM_SETTING_GSM_NETWORK_TYPE_ANY = -1, - NM_SETTING_GSM_NETWORK_TYPE_UMTS_HSPA = 0, - NM_SETTING_GSM_NETWORK_TYPE_GPRS_EDGE = 1, - NM_SETTING_GSM_NETWORK_TYPE_PREFER_UMTS_HSPA = 2, - NM_SETTING_GSM_NETWORK_TYPE_PREFER_GPRS_EDGE = 3, - NM_SETTING_GSM_NETWORK_TYPE_PREFER_4G = 4, - NM_SETTING_GSM_NETWORK_TYPE_4G = 5 -} NMSettingGsmNetworkType; - -/** - * NMSettingGsmNetworkBand: - * @NM_SETTING_GSM_BAND_UNKNOWN: unknown or no band specified - * @NM_SETTING_GSM_BAND_ANY: any band is allowed - * @NM_SETTING_GSM_BAND_EGSM: 900 MHz original GSM band - * @NM_SETTING_GSM_BAND_DCS: 1800 MHz DCS band - * @NM_SETTING_GSM_BAND_PCS: US 1900 MHz PCS band - * @NM_SETTING_GSM_BAND_G850: US 850 MHz Cellular band - * @NM_SETTING_GSM_BAND_U2100: WCDMA 3GPP UMTS 2100 MHz (Class I) - * @NM_SETTING_GSM_BAND_U1800: WCDMA 3GPP UMTS 1800 MHz (Class III) - * @NM_SETTING_GSM_BAND_U17IV: WCDMA 3GPP AWS 1700/2100 MHz (Class IV) - * @NM_SETTING_GSM_BAND_U800: WCDMA 3GPP UMTS 800 MHz (Class VI) - * @NM_SETTING_GSM_BAND_U850: WCDMA 3GPP UMTS 850 MHz (Class V) - * @NM_SETTING_GSM_BAND_U900: WCDMA 3GPP UMTS 900 MHz (Class VIII) - * @NM_SETTING_GSM_BAND_U17IX: WCDMA 3GPP UMTS 1700 MHz (Class IX) - * @NM_SETTING_GSM_BAND_U1900: WCDMA 3GPP UMTS 1900 MHz (Class II) - * @NM_SETTING_GSM_BAND_U2600: WCDMA 3GPP UMTS 2600 MHz (Class VII, internal) - * - * #NMSettingGsmNetworkBand values indicate the allowed frequency bands - * the device may use when connecting to this network. - * - * Deprecated: 0.9.10: No longer used. - */ -typedef enum { - NM_SETTING_GSM_BAND_UNKNOWN = 0x00000000, - NM_SETTING_GSM_BAND_ANY = 0x00000001, - NM_SETTING_GSM_BAND_EGSM = 0x00000002, /* 900 MHz */ - NM_SETTING_GSM_BAND_DCS = 0x00000004, /* 1800 MHz */ - NM_SETTING_GSM_BAND_PCS = 0x00000008, /* 1900 MHz */ - NM_SETTING_GSM_BAND_G850 = 0x00000010, /* 850 MHz */ - NM_SETTING_GSM_BAND_U2100 = 0x00000020, /* WCDMA 3GPP UMTS 2100 MHz (Class I) */ - NM_SETTING_GSM_BAND_U1800 = 0x00000040, /* WCDMA 3GPP UMTS 1800 MHz (Class III) */ - NM_SETTING_GSM_BAND_U17IV = 0x00000080, /* WCDMA 3GPP AWS 1700/2100 MHz (Class IV) */ - NM_SETTING_GSM_BAND_U800 = 0x00000100, /* WCDMA 3GPP UMTS 800 MHz (Class VI) */ - NM_SETTING_GSM_BAND_U850 = 0x00000200, /* WCDMA 3GPP UMTS 850 MHz (Class V) */ - NM_SETTING_GSM_BAND_U900 = 0x00000400, /* WCDMA 3GPP UMTS 900 MHz (Class VIII) */ - NM_SETTING_GSM_BAND_U17IX = 0x00000800, /* WCDMA 3GPP UMTS 1700 MHz (Class IX) */ - NM_SETTING_GSM_BAND_U1900 = 0x00001000, /* WCDMA 3GPP UMTS 1900 MHz (Class II) */ - NM_SETTING_GSM_BAND_U2600 = 0x00002000, /* WCDMA 3GPP UMTS 2600 MHz (Class VII, internal) */ -} NMSettingGsmNetworkBand; - -/** - * NM_SETTING_GSM_BANDS_MAX: - * - * #NM_SETTING_GSM_BANDS_MAX macro indicate the maximal value that can be used - * as the allowed frequency bands (#NMSettingGsm:allowed-bands property). - * - * Deprecated: 0.9.10: No longer used. - */ -#define NM_SETTING_GSM_BANDS_MAX ( NM_SETTING_GSM_BAND_UNKNOWN \ - | NM_SETTING_GSM_BAND_ANY \ - | NM_SETTING_GSM_BAND_EGSM \ - | NM_SETTING_GSM_BAND_DCS \ - | NM_SETTING_GSM_BAND_PCS \ - | NM_SETTING_GSM_BAND_G850 \ - | NM_SETTING_GSM_BAND_U2100 \ - | NM_SETTING_GSM_BAND_U1800 \ - | NM_SETTING_GSM_BAND_U17IV \ - | NM_SETTING_GSM_BAND_U800 \ - | NM_SETTING_GSM_BAND_U850 \ - | NM_SETTING_GSM_BAND_U900 \ - | NM_SETTING_GSM_BAND_U17IX \ - | NM_SETTING_GSM_BAND_U1900 \ - | NM_SETTING_GSM_BAND_U2600) - -typedef struct { - NMSetting parent; -} NMSettingGsm; - -typedef struct { - NMSettingClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); -} NMSettingGsmClass; - -GType nm_setting_gsm_get_type (void); - -NMSetting *nm_setting_gsm_new (void); -const char *nm_setting_gsm_get_number (NMSettingGsm *setting); -const char *nm_setting_gsm_get_username (NMSettingGsm *setting); -const char *nm_setting_gsm_get_password (NMSettingGsm *setting); -const char *nm_setting_gsm_get_apn (NMSettingGsm *setting); -const char *nm_setting_gsm_get_network_id (NMSettingGsm *setting); -const char *nm_setting_gsm_get_pin (NMSettingGsm *setting); -gboolean nm_setting_gsm_get_home_only (NMSettingGsm *setting); - -NMSettingSecretFlags nm_setting_gsm_get_pin_flags (NMSettingGsm *setting); -NMSettingSecretFlags nm_setting_gsm_get_password_flags (NMSettingGsm *setting); - -/* Deprecated */ -NM_DEPRECATED_IN_0_9_10 -int nm_setting_gsm_get_network_type (NMSettingGsm *setting); -NM_DEPRECATED_IN_0_9_10 -guint32 nm_setting_gsm_get_allowed_bands (NMSettingGsm *setting); - -G_END_DECLS - -#endif /* NM_SETTING_GSM_H */ diff --git a/libnm-util/nm-setting-infiniband.c b/libnm-util/nm-setting-infiniband.c deleted file mode 100644 index c9fa8ec9eb..0000000000 --- a/libnm-util/nm-setting-infiniband.c +++ /dev/null @@ -1,474 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2011 - 2013 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <stdlib.h> -#include <dbus/dbus-glib.h> -#include <linux/if_infiniband.h> - -#include "nm-setting-infiniband.h" -#include "nm-param-spec-specialized.h" -#include "nm-utils.h" -#include "nm-utils-private.h" -#include "nm-setting-private.h" -#include "nm-setting-connection.h" - -/** - * SECTION:nm-setting-infiniband - * @short_description: Describes connection properties for IP-over-InfiniBand networks - * @include: nm-setting-infiniband.h - * - * The #NMSettingInfiniband object is a #NMSetting subclass that describes properties - * necessary for connection to IP-over-InfiniBand networks. - **/ - -/** - * nm_setting_infiniband_error_quark: - * - * Registers an error quark for #NMSettingInfiniband if necessary. - * - * Returns: the error quark used for #NMSettingInfiniband errors. - **/ -GQuark -nm_setting_infiniband_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-infiniband-error-quark"); - return quark; -} - -G_DEFINE_TYPE_WITH_CODE (NMSettingInfiniband, nm_setting_infiniband, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_INFINIBAND_SETTING_NAME, - g_define_type_id, - 1, - NM_SETTING_INFINIBAND_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_INFINIBAND) - -#define NM_SETTING_INFINIBAND_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_INFINIBAND, NMSettingInfinibandPrivate)) - -typedef struct { - GByteArray *mac_address; - char *transport_mode; - guint32 mtu; - int p_key; - char *parent, *virtual_iface_name; -} NMSettingInfinibandPrivate; - -enum { - PROP_0, - PROP_MAC_ADDRESS, - PROP_MTU, - PROP_TRANSPORT_MODE, - PROP_P_KEY, - PROP_PARENT, - - LAST_PROP -}; - -/** - * nm_setting_infiniband_new: - * - * Creates a new #NMSettingInfiniband object with default values. - * - * Returns: (transfer full): the new empty #NMSettingInfiniband object - **/ -NMSetting * -nm_setting_infiniband_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_INFINIBAND, NULL); -} - -/** - * nm_setting_infiniband_get_mac_address: - * @setting: the #NMSettingInfiniband - * - * Returns: the #NMSettingInfiniband:mac-address property of the setting - **/ -const GByteArray * -nm_setting_infiniband_get_mac_address (NMSettingInfiniband *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_INFINIBAND (setting), NULL); - - return NM_SETTING_INFINIBAND_GET_PRIVATE (setting)->mac_address; -} - -/** - * nm_setting_infiniband_get_mtu: - * @setting: the #NMSettingInfiniband - * - * Returns: the #NMSettingInfiniband:mtu property of the setting - **/ -guint32 -nm_setting_infiniband_get_mtu (NMSettingInfiniband *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_INFINIBAND (setting), 0); - - return NM_SETTING_INFINIBAND_GET_PRIVATE (setting)->mtu; -} - -/** - * nm_setting_infiniband_get_transport_mode: - * @setting: the #NMSettingInfiniband - * - * Returns the transport mode for this device. Either 'datagram' or - * 'connected'. - * - * Returns: the IPoIB transport mode - **/ -const char * -nm_setting_infiniband_get_transport_mode (NMSettingInfiniband *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_INFINIBAND (setting), NULL); - - return NM_SETTING_INFINIBAND_GET_PRIVATE (setting)->transport_mode; -} - -/** - * nm_setting_infiniband_get_p_key: - * @setting: the #NMSettingInfiniband - * - * Returns the P_Key to use for this device. A value of -1 means to - * use the default P_Key (aka "the P_Key at index 0"). Otherwise it is - * a 16-bit unsigned integer. - * - * Returns: the IPoIB P_Key - **/ -int -nm_setting_infiniband_get_p_key (NMSettingInfiniband *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_INFINIBAND (setting), -1); - - return NM_SETTING_INFINIBAND_GET_PRIVATE (setting)->p_key; -} - -/** - * nm_setting_infiniband_get_parent: - * @setting: the #NMSettingInfiniband - * - * Returns the parent interface name for this device, if set. - * - * Returns: the parent interface name - **/ -const char * -nm_setting_infiniband_get_parent (NMSettingInfiniband *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_INFINIBAND (setting), NULL); - - return NM_SETTING_INFINIBAND_GET_PRIVATE (setting)->parent; -} - -static const char * -get_virtual_iface_name (NMSetting *setting) -{ - NMSettingInfinibandPrivate *priv = NM_SETTING_INFINIBAND_GET_PRIVATE (setting); - - if (priv->p_key == -1 || !priv->parent) - return NULL; - - if (!priv->virtual_iface_name) - priv->virtual_iface_name = g_strdup_printf ("%s.%04x", priv->parent, priv->p_key); - - return NM_SETTING_INFINIBAND_GET_PRIVATE (setting)->virtual_iface_name; -} - -static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - NMSettingConnection *s_con; - NMSettingInfinibandPrivate *priv = NM_SETTING_INFINIBAND_GET_PRIVATE (setting); - - if (priv->mac_address && priv->mac_address->len != INFINIBAND_ALEN) { - g_set_error_literal (error, - NM_SETTING_INFINIBAND_ERROR, - NM_SETTING_INFINIBAND_ERROR_INVALID_PROPERTY, - _("property is invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_INFINIBAND_SETTING_NAME, NM_SETTING_INFINIBAND_MAC_ADDRESS); - return FALSE; - } - - /* FIXME: verify() should not modify the setting, but return NORMALIZABLE success. */ - if (!g_strcmp0 (priv->transport_mode, "datagram")) { - if (priv->mtu > 2044) - priv->mtu = 2044; - } else if (!g_strcmp0 (priv->transport_mode, "connected")) { - if (priv->mtu > 65520) - priv->mtu = 65520; - } else { - g_set_error_literal (error, - NM_SETTING_INFINIBAND_ERROR, - NM_SETTING_INFINIBAND_ERROR_INVALID_PROPERTY, - _("property is invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_INFINIBAND_SETTING_NAME, NM_SETTING_INFINIBAND_TRANSPORT_MODE); - return FALSE; - } - - if (priv->parent) { - if (!nm_utils_iface_valid_name (priv->parent)) { - g_set_error_literal (error, - NM_SETTING_INFINIBAND_ERROR, - NM_SETTING_INFINIBAND_ERROR_INVALID_PROPERTY, - _("not a valid interface name")); - g_prefix_error (error, "%s: ", NM_SETTING_INFINIBAND_PARENT); - return FALSE; - } - if (priv->p_key == -1) { - g_set_error_literal (error, - NM_SETTING_INFINIBAND_ERROR, - NM_SETTING_INFINIBAND_ERROR_INVALID_PROPERTY, - _("Must specify a P_Key if specifying parent")); - g_prefix_error (error, "%s: ", NM_SETTING_INFINIBAND_PARENT); - } - } - - if (priv->p_key != -1) { - if (!priv->mac_address && !priv->parent) { - g_set_error_literal (error, - NM_SETTING_INFINIBAND_ERROR, - NM_SETTING_INFINIBAND_ERROR_MISSING_PROPERTY, - _("InfiniBand P_Key connection did not specify parent interface name")); - g_prefix_error (error, "%s: ", NM_SETTING_INFINIBAND_PARENT); - return FALSE; - } - } - - s_con = NM_SETTING_CONNECTION (nm_setting_find_in_list (all_settings, NM_SETTING_CONNECTION_SETTING_NAME)); - if (s_con) { - const char *interface_name = nm_setting_connection_get_interface_name (s_con); - - if (!interface_name) - ; - else if (!nm_utils_iface_valid_name (interface_name)) { - /* report the error for NMSettingConnection:interface-name, because - * it's that property that is invalid -- although we currently verify() - * NMSettingInfiniband. - **/ - g_set_error (error, - NM_SETTING_CONNECTION_ERROR, - NM_SETTING_CONNECTION_ERROR_INVALID_PROPERTY, - _("'%s' is not a valid interface name"), - interface_name); - g_prefix_error (error, "%s.%s: ", NM_SETTING_CONNECTION_SETTING_NAME, NM_SETTING_CONNECTION_INTERFACE_NAME); - return FALSE; - } else { - if (priv->p_key != -1) { - if (!priv->virtual_iface_name) - priv->virtual_iface_name = g_strdup_printf ("%s.%04x", priv->parent, priv->p_key); - - if (strcmp (interface_name, priv->virtual_iface_name) != 0) { - /* We don't support renaming software infiniband devices. Later we might, but - * for now just reject such connections. - **/ - g_set_error (error, - NM_SETTING_CONNECTION_ERROR, - NM_SETTING_CONNECTION_ERROR_INVALID_PROPERTY, - _("interface name of software infiniband device must be '%s' or unset (instead it is '%s')"), - priv->virtual_iface_name, interface_name); - g_prefix_error (error, "%s.%s: ", NM_SETTING_CONNECTION_SETTING_NAME, NM_SETTING_CONNECTION_INTERFACE_NAME); - return FALSE; - } - } - } - } - - return TRUE; -} - -static void -nm_setting_infiniband_init (NMSettingInfiniband *setting) -{ -} - -static void -finalize (GObject *object) -{ - NMSettingInfinibandPrivate *priv = NM_SETTING_INFINIBAND_GET_PRIVATE (object); - - g_free (priv->transport_mode); - if (priv->mac_address) - g_byte_array_free (priv->mac_address, TRUE); - g_free (priv->parent); - g_free (priv->virtual_iface_name); - - G_OBJECT_CLASS (nm_setting_infiniband_parent_class)->finalize (object); -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSettingInfinibandPrivate *priv = NM_SETTING_INFINIBAND_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_MAC_ADDRESS: - if (priv->mac_address) - g_byte_array_free (priv->mac_address, TRUE); - priv->mac_address = g_value_dup_boxed (value); - break; - case PROP_MTU: - priv->mtu = g_value_get_uint (value); - break; - case PROP_TRANSPORT_MODE: - g_free (priv->transport_mode); - priv->transport_mode = g_value_dup_string (value); - break; - case PROP_P_KEY: - priv->p_key = g_value_get_int (value); - g_clear_pointer (&priv->virtual_iface_name, g_free); - break; - case PROP_PARENT: - g_free (priv->parent); - priv->parent = g_value_dup_string (value); - g_clear_pointer (&priv->virtual_iface_name, g_free); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSettingInfiniband *setting = NM_SETTING_INFINIBAND (object); - - switch (prop_id) { - case PROP_MAC_ADDRESS: - g_value_set_boxed (value, nm_setting_infiniband_get_mac_address (setting)); - break; - case PROP_MTU: - g_value_set_uint (value, nm_setting_infiniband_get_mtu (setting)); - break; - case PROP_TRANSPORT_MODE: - g_value_set_string (value, nm_setting_infiniband_get_transport_mode (setting)); - break; - case PROP_P_KEY: - g_value_set_int (value, nm_setting_infiniband_get_p_key (setting)); - break; - case PROP_PARENT: - g_value_set_string (value, nm_setting_infiniband_get_parent (setting)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_setting_infiniband_class_init (NMSettingInfinibandClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingInfinibandPrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->finalize = finalize; - - parent_class->verify = verify; - parent_class->get_virtual_iface_name = get_virtual_iface_name; - - /* Properties */ - /** - * NMSettingInfiniband:mac-address: - * - * If specified, this connection will only apply to the IPoIB device whose - * permanent MAC address matches. This property does not change the MAC - * address of the device (i.e. MAC spoofing). - **/ - g_object_class_install_property - (object_class, PROP_MAC_ADDRESS, - _nm_param_spec_specialized (NM_SETTING_INFINIBAND_MAC_ADDRESS, "", "", - DBUS_TYPE_G_UCHAR_ARRAY, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingInfiniband:mtu: - * - * If non-zero, only transmit packets of the specified size or smaller, - * breaking larger packets up into multiple frames. - **/ - g_object_class_install_property - (object_class, PROP_MTU, - g_param_spec_uint (NM_SETTING_INFINIBAND_MTU, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_FUZZY_IGNORE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingInfiniband:transport-mode: - * - * The IP-over-InfiniBand transport mode. Either "datagram" or - * "connected". - **/ - g_object_class_install_property - (object_class, PROP_TRANSPORT_MODE, - g_param_spec_string (NM_SETTING_INFINIBAND_TRANSPORT_MODE, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingInfiniband:p-key: - * - * The InfiniBand P_Key to use for this device. A value of -1 means to use - * the default P_Key (aka "the P_Key at index 0"). Otherwise it is a 16-bit - * unsigned integer, whose high bit is set if it is a "full membership" - * P_Key. - **/ - g_object_class_install_property - (object_class, PROP_P_KEY, - g_param_spec_int (NM_SETTING_INFINIBAND_P_KEY, "", "", - -1, 0xFFFF, -1, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingInfiniband:parent: - * - * The interface name of the parent device of this device. Normally %NULL, - * but if the #NMSettingInfiniband:p_key property is set, then you must - * specify the base device by setting either this property or - * #NMSettingInfiniband:mac-address. - **/ - g_object_class_install_property - (object_class, PROP_PARENT, - g_param_spec_string (NM_SETTING_INFINIBAND_PARENT, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - -} diff --git a/libnm-util/nm-setting-infiniband.h b/libnm-util/nm-setting-infiniband.h deleted file mode 100644 index 95d343e963..0000000000 --- a/libnm-util/nm-setting-infiniband.h +++ /dev/null @@ -1,85 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2011 Red Hat, Inc. - */ - -#ifndef NM_SETTING_INFINIBAND_H -#define NM_SETTING_INFINIBAND_H - -#include "nm-setting.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SETTING_INFINIBAND (nm_setting_infiniband_get_type ()) -#define NM_SETTING_INFINIBAND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_INFINIBAND, NMSettingInfiniband)) -#define NM_SETTING_INFINIBAND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_INFINIBAND, NMSettingInfinibandClass)) -#define NM_IS_SETTING_INFINIBAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_INFINIBAND)) -#define NM_IS_SETTING_INFINIBAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_INFINIBAND)) -#define NM_SETTING_INFINIBAND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_INFINIBAND, NMSettingInfinibandClass)) - -#define NM_SETTING_INFINIBAND_SETTING_NAME "infiniband" - -/** - * NMSettingInfinibandError: - * @NM_SETTING_INFINIBAND_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_INFINIBAND_ERROR_INVALID_PROPERTY: the property was invalid - * @NM_SETTING_INFINIBAND_ERROR_MISSING_PROPERTY: the property was missing and is - * required - */ -typedef enum { - NM_SETTING_INFINIBAND_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_SETTING_INFINIBAND_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/ - NM_SETTING_INFINIBAND_ERROR_MISSING_PROPERTY /*< nick=MissingProperty >*/ -} NMSettingInfinibandError; - -#define NM_SETTING_INFINIBAND_ERROR nm_setting_infiniband_error_quark () -GQuark nm_setting_infiniband_error_quark (void); - -#define NM_SETTING_INFINIBAND_MAC_ADDRESS "mac-address" -#define NM_SETTING_INFINIBAND_MTU "mtu" -#define NM_SETTING_INFINIBAND_TRANSPORT_MODE "transport-mode" -#define NM_SETTING_INFINIBAND_P_KEY "p-key" -#define NM_SETTING_INFINIBAND_PARENT "parent" - -typedef struct { - NMSetting parent; -} NMSettingInfiniband; - -typedef struct { - NMSettingClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); -} NMSettingInfinibandClass; - -GType nm_setting_infiniband_get_type (void); - -NMSetting * nm_setting_infiniband_new (void); -const GByteArray *nm_setting_infiniband_get_mac_address (NMSettingInfiniband *setting); -guint32 nm_setting_infiniband_get_mtu (NMSettingInfiniband *setting); -const char * nm_setting_infiniband_get_transport_mode (NMSettingInfiniband *setting); -int nm_setting_infiniband_get_p_key (NMSettingInfiniband *setting); -const char * nm_setting_infiniband_get_parent (NMSettingInfiniband *setting); - -G_END_DECLS - -#endif /* NM_SETTING_INFINIBAND_H */ diff --git a/libnm-util/nm-setting-ip4-config.c b/libnm-util/nm-setting-ip4-config.c deleted file mode 100644 index 6a01fca926..0000000000 --- a/libnm-util/nm-setting-ip4-config.c +++ /dev/null @@ -1,1853 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2014 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <dbus/dbus-glib.h> - -#include "nm-setting-ip4-config.h" -#include "nm-param-spec-specialized.h" -#include "nm-utils.h" -#include "nm-dbus-glib-types.h" -#include "nm-setting-private.h" - -/** - * SECTION:nm-setting-ip4-config - * @short_description: Describes IPv4 addressing, routing, and name service properties - * @include: nm-setting-ip4-config.h - * - * The #NMSettingIP4Config object is a #NMSetting subclass that describes - * properties related to IPv4 addressing, routing, and Domain Name Service - **/ - -/** - * nm_setting_ip4_config_error_quark: - * - * Registers an error quark for #NMSettingIP4Config if necessary. - * - * Returns: the error quark used for #NMSettingIP4Config errors. - **/ -GQuark -nm_setting_ip4_config_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-ip4-config-error-quark"); - return quark; -} - -G_DEFINE_BOXED_TYPE (NMIP4Address, nm_ip4_address, nm_ip4_address_dup, nm_ip4_address_unref) -G_DEFINE_BOXED_TYPE (NMIP4Route, nm_ip4_route, nm_ip4_route_dup, nm_ip4_route_unref) - -G_DEFINE_TYPE_WITH_CODE (NMSettingIP4Config, nm_setting_ip4_config, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_IP4_CONFIG_SETTING_NAME, - g_define_type_id, - 4, - NM_SETTING_IP4_CONFIG_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_IP4_CONFIG) - -#define NM_SETTING_IP4_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_IP4_CONFIG, NMSettingIP4ConfigPrivate)) - -typedef struct { - char *method; - GArray *dns; /* array of guint32; elements in network byte order */ - GSList *dns_search; /* list of strings */ - GSList *addresses; /* array of NMIP4Address */ - GSList *routes; /* array of NMIP4Route */ - gint64 route_metric; - gboolean ignore_auto_routes; - gboolean ignore_auto_dns; - char *dhcp_client_id; - gboolean dhcp_send_hostname; - char *dhcp_hostname; - int dhcp_timeout; - gboolean never_default; - gboolean may_fail; -} NMSettingIP4ConfigPrivate; - -enum { - PROP_0, - PROP_METHOD, - PROP_DNS, - PROP_DNS_SEARCH, - PROP_ADDRESSES, - PROP_ROUTES, - PROP_ROUTE_METRIC, - PROP_IGNORE_AUTO_ROUTES, - PROP_IGNORE_AUTO_DNS, - PROP_DHCP_CLIENT_ID, - PROP_DHCP_TIMEOUT, - PROP_DHCP_SEND_HOSTNAME, - PROP_DHCP_HOSTNAME, - PROP_NEVER_DEFAULT, - PROP_MAY_FAIL, - - LAST_PROP -}; - -/** - * nm_setting_ip4_config_new: - * - * Creates a new #NMSettingIP4Config object with default values. - * - * Returns: (transfer full): the new empty #NMSettingIP4Config object - **/ -NMSetting * -nm_setting_ip4_config_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_IP4_CONFIG, NULL); -} - -/** - * nm_setting_ip4_config_get_method: - * @setting: the #NMSettingIP4Config - * - * Returns: the #NMSettingIP4Config:method property of the setting - **/ -const char * -nm_setting_ip4_config_get_method (NMSettingIP4Config *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), NULL); - - return NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting)->method; -} - -/** - * nm_setting_ip4_config_get_num_dns: - * @setting: the #NMSettingIP4Config - * - * Returns: the number of configured DNS servers - **/ -guint32 -nm_setting_ip4_config_get_num_dns (NMSettingIP4Config *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), 0); - - return NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting)->dns->len; -} - -/** - * nm_setting_ip4_config_get_dns: - * @setting: the #NMSettingIP4Config - * @i: index number of the DNS server to return - * - * Returns: the IPv4 address (network byte order) of the DNS server at index - * @i - **/ -guint32 -nm_setting_ip4_config_get_dns (NMSettingIP4Config *setting, guint32 i) -{ - NMSettingIP4ConfigPrivate *priv; - - g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), 0); - - priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting); - g_return_val_if_fail (i <= priv->dns->len, 0); - - return g_array_index (priv->dns, guint32, i); -} - -/** - * nm_setting_ip4_config_add_dns: - * @setting: the #NMSettingIP4Config - * @dns: the IPv4 address (network byte order) of the DNS server to add - * - * Adds a new DNS server to the setting. - * - * Returns: %TRUE if the DNS server was added; %FALSE if the server was already - * known - **/ -gboolean -nm_setting_ip4_config_add_dns (NMSettingIP4Config *setting, guint32 dns) -{ - NMSettingIP4ConfigPrivate *priv; - int i; - - g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), FALSE); - - priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting); - for (i = 0; i < priv->dns->len; i++) { - if (dns == g_array_index (priv->dns, guint32, i)) - return FALSE; - } - - g_array_append_val (priv->dns, dns); - g_object_notify (G_OBJECT (setting), NM_SETTING_IP4_CONFIG_DNS); - return TRUE; -} - -/** - * nm_setting_ip4_config_remove_dns: - * @setting: the #NMSettingIP4Config - * @i: index number of the DNS server to remove - * - * Removes the DNS server at index @i. - **/ -void -nm_setting_ip4_config_remove_dns (NMSettingIP4Config *setting, guint32 i) -{ - NMSettingIP4ConfigPrivate *priv; - - g_return_if_fail (NM_IS_SETTING_IP4_CONFIG (setting)); - - priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting); - g_return_if_fail (i <= priv->dns->len); - - g_array_remove_index (priv->dns, i); - g_object_notify (G_OBJECT (setting), NM_SETTING_IP4_CONFIG_DNS); -} - -/** - * nm_setting_ip4_config_remove_dns_by_value: - * @setting: the #NMSettingIP4Config - * @dns: the DNS server to remove - * - * Removes the DNS server @dns. - * - * Returns: %TRUE if the DNS server was found and removed; %FALSE if it was not. - * domain was already known - * - * Since: 0.9.10 - **/ -gboolean -nm_setting_ip4_config_remove_dns_by_value (NMSettingIP4Config *setting, guint32 dns) -{ - NMSettingIP4ConfigPrivate *priv; - int i; - - g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), FALSE); - - priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting); - for (i = 0; i < priv->dns->len; i++) { - if (dns == g_array_index (priv->dns, guint32, i)) { - g_array_remove_index (priv->dns, i); - g_object_notify (G_OBJECT (setting), NM_SETTING_IP4_CONFIG_DNS); - return TRUE; - } - } - return FALSE; -} - -/** - * nm_setting_ip4_config_clear_dns: - * @setting: the #NMSettingIP4Config - * - * Removes all configured DNS servers. - **/ -void -nm_setting_ip4_config_clear_dns (NMSettingIP4Config *setting) -{ - NMSettingIP4ConfigPrivate *priv; - - g_return_if_fail (NM_IS_SETTING_IP4_CONFIG (setting)); - - priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting); - g_array_remove_range (priv->dns, 0, priv->dns->len); - g_object_notify (G_OBJECT (setting), NM_SETTING_IP4_CONFIG_DNS); -} - -/** - * nm_setting_ip4_config_get_num_dns_searches: - * @setting: the #NMSettingIP4Config - * - * Returns: the number of configured DNS search domains - **/ -guint32 -nm_setting_ip4_config_get_num_dns_searches (NMSettingIP4Config *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), 0); - - return g_slist_length (NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting)->dns_search); -} - -/** - * nm_setting_ip4_config_get_dns_search: - * @setting: the #NMSettingIP4Config - * @i: index number of the DNS search domain to return - * - * Returns: the DNS search domain at index @i - **/ -const char * -nm_setting_ip4_config_get_dns_search (NMSettingIP4Config *setting, guint32 i) -{ - NMSettingIP4ConfigPrivate *priv; - - g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), NULL); - - priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting); - g_return_val_if_fail (i <= g_slist_length (priv->dns_search), NULL); - - return (const char *) g_slist_nth_data (priv->dns_search, i); -} - -/** - * nm_setting_ip4_config_add_dns_search: - * @setting: the #NMSettingIP4Config - * @dns_search: the search domain to add - * - * Adds a new DNS search domain to the setting. - * - * Returns: %TRUE if the DNS search domain was added; %FALSE if the search - * domain was already known - **/ -gboolean -nm_setting_ip4_config_add_dns_search (NMSettingIP4Config *setting, - const char *dns_search) -{ - NMSettingIP4ConfigPrivate *priv; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), FALSE); - g_return_val_if_fail (dns_search != NULL, FALSE); - g_return_val_if_fail (dns_search[0] != '\0', FALSE); - - priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting); - for (iter = priv->dns_search; iter; iter = g_slist_next (iter)) { - if (!strcmp (dns_search, (char *) iter->data)) - return FALSE; - } - - priv->dns_search = g_slist_append (priv->dns_search, g_strdup (dns_search)); - g_object_notify (G_OBJECT (setting), NM_SETTING_IP4_CONFIG_DNS_SEARCH); - return TRUE; -} - -/** - * nm_setting_ip4_config_remove_dns_search: - * @setting: the #NMSettingIP4Config - * @i: index number of the DNS search domain - * - * Removes the DNS search domain at index @i. - **/ -void -nm_setting_ip4_config_remove_dns_search (NMSettingIP4Config *setting, guint32 i) -{ - NMSettingIP4ConfigPrivate *priv; - GSList *elt; - - g_return_if_fail (NM_IS_SETTING_IP4_CONFIG (setting)); - - priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting); - elt = g_slist_nth (priv->dns_search, i); - g_return_if_fail (elt != NULL); - - g_free (elt->data); - priv->dns_search = g_slist_delete_link (priv->dns_search, elt); - g_object_notify (G_OBJECT (setting), NM_SETTING_IP4_CONFIG_DNS_SEARCH); -} - -/** - * nm_setting_ip4_config_remove_dns_search_by_value: - * @setting: the #NMSettingIP4Config - * @dns_search: the search domain to remove - * - * Removes the DNS search domain @dns_search. - * - * Returns: %TRUE if the DNS search domain was found and removed; %FALSE if it was not. - * - * Since 0.9.10 - **/ -gboolean -nm_setting_ip4_config_remove_dns_search_by_value (NMSettingIP4Config *setting, - const char *dns_search) -{ - NMSettingIP4ConfigPrivate *priv; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), FALSE); - g_return_val_if_fail (dns_search != NULL, FALSE); - g_return_val_if_fail (dns_search[0] != '\0', FALSE); - - priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting); - for (iter = priv->dns_search; iter; iter = g_slist_next (iter)) { - if (!strcmp (dns_search, (char *) iter->data)) { - priv->dns_search = g_slist_delete_link (priv->dns_search, iter); - g_object_notify (G_OBJECT (setting), NM_SETTING_IP4_CONFIG_DNS_SEARCH); - return TRUE; - } - } - return FALSE; -} - -/** - * nm_setting_ip4_config_clear_dns_searches: - * @setting: the #NMSettingIP4Config - * - * Removes all configured DNS search domains. - **/ -void -nm_setting_ip4_config_clear_dns_searches (NMSettingIP4Config *setting) -{ - g_return_if_fail (NM_IS_SETTING_IP4_CONFIG (setting)); - - g_slist_free_full (NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting)->dns_search, g_free); - NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting)->dns_search = NULL; - g_object_notify (G_OBJECT (setting), NM_SETTING_IP4_CONFIG_DNS_SEARCH); -} - -/** - * nm_setting_ip4_config_get_num_addresses: - * @setting: the #NMSettingIP4Config - * - * Returns: the number of configured addresses - **/ -guint32 -nm_setting_ip4_config_get_num_addresses (NMSettingIP4Config *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), 0); - - return g_slist_length (NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting)->addresses); -} - -/** - * nm_setting_ip4_config_get_address: - * @setting: the #NMSettingIP4Config - * @i: index number of the address to return - * - * Returns: the address at index @i - **/ -NMIP4Address * -nm_setting_ip4_config_get_address (NMSettingIP4Config *setting, guint32 i) -{ - NMSettingIP4ConfigPrivate *priv; - - g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), NULL); - - priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting); - g_return_val_if_fail (i <= g_slist_length (priv->addresses), NULL); - - return (NMIP4Address *) g_slist_nth_data (priv->addresses, i); -} - -/** - * nm_setting_ip4_config_add_address: - * @setting: the #NMSettingIP4Config - * @address: the new address to add - * - * Adds a new IPv4 address and associated information to the setting. The - * given address is duplicated internally and is not changed by this function. - * - * Returns: %TRUE if the address was added; %FALSE if the address was already - * known. - **/ -gboolean -nm_setting_ip4_config_add_address (NMSettingIP4Config *setting, - NMIP4Address *address) -{ - NMSettingIP4ConfigPrivate *priv; - NMIP4Address *copy; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), FALSE); - g_return_val_if_fail (address != NULL, FALSE); - - priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting); - for (iter = priv->addresses; iter; iter = g_slist_next (iter)) { - if (nm_ip4_address_compare ((NMIP4Address *) iter->data, address)) - return FALSE; - } - - copy = nm_ip4_address_dup (address); - priv->addresses = g_slist_append (priv->addresses, copy); - g_object_notify (G_OBJECT (setting), NM_SETTING_IP4_CONFIG_ADDRESSES); - return TRUE; -} - -/** - * nm_setting_ip4_config_remove_address: - * @setting: the #NMSettingIP4Config - * @i: index number of the address to remove - * - * Removes the address at index @i. - **/ -void -nm_setting_ip4_config_remove_address (NMSettingIP4Config *setting, guint32 i) -{ - NMSettingIP4ConfigPrivate *priv; - GSList *elt; - - g_return_if_fail (NM_IS_SETTING_IP4_CONFIG (setting)); - - priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting); - elt = g_slist_nth (priv->addresses, i); - g_return_if_fail (elt != NULL); - - nm_ip4_address_unref ((NMIP4Address *) elt->data); - priv->addresses = g_slist_delete_link (priv->addresses, elt); - g_object_notify (G_OBJECT (setting), NM_SETTING_IP4_CONFIG_ADDRESSES); -} - -/** - * nm_setting_ip4_config_remove_address_by_value: - * @setting: the #NMSettingIP4Config - * @address: the IP address to remove - * - * Removes the address @address. - * - * Returns: %TRUE if the address was found and removed; %FALSE if it was not. - * - * Since: 0.9.10 - **/ -gboolean -nm_setting_ip4_config_remove_address_by_value (NMSettingIP4Config *setting, - NMIP4Address *address) -{ - NMSettingIP4ConfigPrivate *priv; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), FALSE); - g_return_val_if_fail (address != NULL, FALSE); - - priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting); - for (iter = priv->addresses; iter; iter = g_slist_next (iter)) { - if (nm_ip4_address_compare ((NMIP4Address *) iter->data, address)) { - nm_ip4_address_unref ((NMIP4Address *) iter->data); - priv->addresses = g_slist_delete_link (priv->addresses, iter); - g_object_notify (G_OBJECT (setting), NM_SETTING_IP4_CONFIG_ADDRESSES); - return TRUE; - } - } - return FALSE; -} - -/** - * nm_setting_ip4_config_clear_addresses: - * @setting: the #NMSettingIP4Config - * - * Removes all configured addresses. - **/ -void -nm_setting_ip4_config_clear_addresses (NMSettingIP4Config *setting) -{ - NMSettingIP4ConfigPrivate *priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting); - - g_return_if_fail (NM_IS_SETTING_IP4_CONFIG (setting)); - - g_slist_free_full (priv->addresses, (GDestroyNotify) nm_ip4_address_unref); - priv->addresses = NULL; - g_object_notify (G_OBJECT (setting), NM_SETTING_IP4_CONFIG_ADDRESSES); -} - -/** - * nm_setting_ip4_config_get_num_routes: - * @setting: the #NMSettingIP4Config - * - * Returns: the number of configured routes - **/ -guint32 -nm_setting_ip4_config_get_num_routes (NMSettingIP4Config *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), 0); - - return g_slist_length (NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting)->routes); -} - -/** - * nm_setting_ip4_config_get_route: - * @setting: the #NMSettingIP4Config - * @i: index number of the route to return - * - * Returns: the route at index @i - **/ -NMIP4Route * -nm_setting_ip4_config_get_route (NMSettingIP4Config *setting, guint32 i) -{ - NMSettingIP4ConfigPrivate *priv; - - g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), NULL); - - priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting); - g_return_val_if_fail (i <= g_slist_length (priv->routes), NULL); - - return (NMIP4Route *) g_slist_nth_data (priv->routes, i); -} - -/** - * nm_setting_ip4_config_add_route: - * @setting: the #NMSettingIP4Config - * @route: the route to add - * - * Adds a new IPv4 route and associated information to the setting. The - * given route is duplicated internally and is not changed by this function. - * - * Returns: %TRUE if the route was added; %FALSE if the route was already known. - **/ -gboolean -nm_setting_ip4_config_add_route (NMSettingIP4Config *setting, - NMIP4Route *route) -{ - NMSettingIP4ConfigPrivate *priv; - NMIP4Route *copy; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), FALSE); - g_return_val_if_fail (route != NULL, FALSE); - - priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting); - for (iter = priv->routes; iter; iter = g_slist_next (iter)) { - if (nm_ip4_route_compare ((NMIP4Route *) iter->data, route)) - return FALSE; - } - - copy = nm_ip4_route_dup (route); - priv->routes = g_slist_append (priv->routes, copy); - g_object_notify (G_OBJECT (setting), NM_SETTING_IP4_CONFIG_ROUTES); - return TRUE; -} - -/** - * nm_setting_ip4_config_remove_route: - * @setting: the #NMSettingIP4Config - * @i: index number of the route - * - * Removes the route at index @i. - **/ -void -nm_setting_ip4_config_remove_route (NMSettingIP4Config *setting, guint32 i) -{ - NMSettingIP4ConfigPrivate *priv; - GSList *elt; - - g_return_if_fail (NM_IS_SETTING_IP4_CONFIG (setting)); - - priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting); - elt = g_slist_nth (priv->routes, i); - g_return_if_fail (elt != NULL); - - nm_ip4_route_unref ((NMIP4Route *) elt->data); - priv->routes = g_slist_delete_link (priv->routes, elt); - g_object_notify (G_OBJECT (setting), NM_SETTING_IP4_CONFIG_ROUTES); -} - -/** - * nm_setting_ip4_config_remove_route_by_value: - * @setting: the #NMSettingIP4Config - * @route: the route to remove - * - * Removes the route @route. - * - * Returns: %TRUE if the route was found and removed; %FALSE if it was not. - * - * Since: 0.9.10 - **/ -gboolean -nm_setting_ip4_config_remove_route_by_value (NMSettingIP4Config *setting, - NMIP4Route *route) -{ - NMSettingIP4ConfigPrivate *priv; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), FALSE); - g_return_val_if_fail (route != NULL, FALSE); - - priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting); - for (iter = priv->routes; iter; iter = g_slist_next (iter)) { - if (nm_ip4_route_compare ((NMIP4Route *) iter->data, route)) { - nm_ip4_route_unref ((NMIP4Route *) iter->data); - priv->routes = g_slist_delete_link (priv->routes, iter); - g_object_notify (G_OBJECT (setting), NM_SETTING_IP4_CONFIG_ROUTES); - return TRUE; - } - } - return FALSE; -} - -/** - * nm_setting_ip4_config_clear_routes: - * @setting: the #NMSettingIP4Config - * - * Removes all configured routes. - **/ -void -nm_setting_ip4_config_clear_routes (NMSettingIP4Config *setting) -{ - NMSettingIP4ConfigPrivate *priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting); - - g_return_if_fail (NM_IS_SETTING_IP4_CONFIG (setting)); - - g_slist_free_full (priv->routes, (GDestroyNotify) nm_ip4_route_unref); - priv->routes = NULL; - g_object_notify (G_OBJECT (setting), NM_SETTING_IP4_CONFIG_ROUTES); -} - -/** - * nm_setting_ip4_config_get_route_metric: - * @setting: the #NMSettingIP4Config - * - * Returns the value contained in the #NMSettingIP4Config:route-metric - * property. - * - * Returns: the route metric that is used for IPv4 routes that don't explicitly - * specify a metric. See #NMSettingIP4Config:route-metric for more details. - * - * Since: 1.0 - **/ -gint64 -nm_setting_ip4_config_get_route_metric (NMSettingIP4Config *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), -1); - - return NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting)->route_metric; -} - -/** - * nm_setting_ip4_config_get_ignore_auto_routes: - * @setting: the #NMSettingIP4Config - * - * Returns the value contained in the #NMSettingIP4Config:ignore-auto-routes - * property. - * - * Returns: %TRUE if automatically configured (ie via DHCP) routes should be - * ignored. - **/ -gboolean -nm_setting_ip4_config_get_ignore_auto_routes (NMSettingIP4Config *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), FALSE); - - return NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting)->ignore_auto_routes; -} - -/** - * nm_setting_ip4_config_get_ignore_auto_dns: - * @setting: the #NMSettingIP4Config - * - * Returns the value contained in the #NMSettingIP4Config:ignore-auto-dns - * property. - * - * Returns: %TRUE if automatically configured (ie via DHCP) DNS information - * should be ignored. - **/ -gboolean -nm_setting_ip4_config_get_ignore_auto_dns (NMSettingIP4Config *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), FALSE); - - return NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting)->ignore_auto_dns; -} - -/** - * nm_setting_ip4_config_get_dhcp_client_id: - * @setting: the #NMSettingIP4Config - * - * Returns the value contained in the #NMSettingIP4Config:dhcp-client-id - * property. - * - * Returns: the configured Client ID to send to the DHCP server when requesting - * addresses via DHCP. - **/ -const char * -nm_setting_ip4_config_get_dhcp_client_id (NMSettingIP4Config *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), NULL); - - return NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting)->dhcp_client_id; -} - -/** - * nm_setting_ip4_config_get_dhcp_send_hostname: - * @setting: the #NMSettingIP4Config - * - * Returns the value contained in the #NMSettingIP4Config:dhcp-send-hostname - * property. - * - * Returns: %TRUE if NetworkManager should send the machine hostname to the - * DHCP server when requesting addresses to allow the server to automatically - * update DNS information for this machine. - **/ -gboolean -nm_setting_ip4_config_get_dhcp_send_hostname (NMSettingIP4Config *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), FALSE); - - return NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting)->dhcp_send_hostname; -} - -/** - * nm_setting_ip4_config_get_dhcp_hostname: - * @setting: the #NMSettingIP4Config - * - * Returns the value contained in the #NMSettingIP4Config:dhcp-hostname - * property. - * - * Returns: the configured hostname to send to the DHCP server - **/ -const char * -nm_setting_ip4_config_get_dhcp_hostname (NMSettingIP4Config *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), NULL); - - return NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting)->dhcp_hostname; -} - -/** - * nm_setting_ip4_config_get_dhcp_timeout: - * @setting: the #NMSettingIP4Config - * - * Returns the value contained in the #NMSettingIP4Config:dhcp-timeout - * property. - * - * Returns: The number of seconds after which unfinished DHCP transaction - * fails or zero for "default". - **/ -int -nm_setting_ip4_config_get_dhcp_timeout (NMSettingIP4Config *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), 0); - - return NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting)->dhcp_timeout; -} - -/** - * nm_setting_ip4_config_get_never_default: - * @setting: the #NMSettingIP4Config - * - * Returns the value contained in the #NMSettingIP4Config:never-default - * property. - * - * Returns: %TRUE if this connection should never be the default connection - * for IPv4 addressing - **/ -gboolean -nm_setting_ip4_config_get_never_default (NMSettingIP4Config *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), FALSE); - - return NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting)->never_default; -} - -/** - * nm_setting_ip4_config_get_may_fail: - * @setting: the #NMSettingIP4Config - * - * Returns the value contained in the #NMSettingIP4Config:may-fail - * property. - * - * Returns: %TRUE if this connection doesn't require IPv4 addressing to complete - * for the connection to succeed. - **/ -gboolean -nm_setting_ip4_config_get_may_fail (NMSettingIP4Config *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), FALSE); - - return NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting)->may_fail; -} - -static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - NMSettingIP4ConfigPrivate *priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting); - GSList *iter; - int i; - - if (!priv->method) { - g_set_error_literal (error, - NM_SETTING_IP4_CONFIG_ERROR, - NM_SETTING_IP4_CONFIG_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_IP4_CONFIG_SETTING_NAME, NM_SETTING_IP4_CONFIG_METHOD); - return FALSE; - } - - if (!strcmp (priv->method, NM_SETTING_IP4_CONFIG_METHOD_MANUAL)) { - if (!priv->addresses) { - g_set_error (error, - NM_SETTING_IP4_CONFIG_ERROR, - NM_SETTING_IP4_CONFIG_ERROR_MISSING_PROPERTY, - _("this property cannot be empty for '%s=%s'"), - NM_SETTING_IP4_CONFIG_METHOD, priv->method); - g_prefix_error (error, "%s.%s: ", NM_SETTING_IP4_CONFIG_SETTING_NAME, NM_SETTING_IP4_CONFIG_ADDRESSES); - return FALSE; - } - } else if ( !strcmp (priv->method, NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL) - || !strcmp (priv->method, NM_SETTING_IP4_CONFIG_METHOD_SHARED) - || !strcmp (priv->method, NM_SETTING_IP4_CONFIG_METHOD_DISABLED)) { - if (priv->dns && priv->dns->len) { - g_set_error (error, - NM_SETTING_IP4_CONFIG_ERROR, - NM_SETTING_IP4_CONFIG_ERROR_NOT_ALLOWED_FOR_METHOD, - _("this property is not allowed for '%s=%s'"), - NM_SETTING_IP4_CONFIG_METHOD, priv->method); - g_prefix_error (error, "%s.%s: ", NM_SETTING_IP4_CONFIG_SETTING_NAME, NM_SETTING_IP4_CONFIG_DNS); - return FALSE; - } - - if (g_slist_length (priv->dns_search)) { - g_set_error (error, - NM_SETTING_IP4_CONFIG_ERROR, - NM_SETTING_IP4_CONFIG_ERROR_NOT_ALLOWED_FOR_METHOD, - _("this property is not allowed for '%s=%s'"), - NM_SETTING_IP4_CONFIG_METHOD, priv->method); - g_prefix_error (error, "%s.%s: ", NM_SETTING_IP4_CONFIG_SETTING_NAME, NM_SETTING_IP4_CONFIG_DNS_SEARCH); - return FALSE; - } - - /* Shared allows IP addresses; link-local and disabled do not */ - if (strcmp (priv->method, NM_SETTING_IP4_CONFIG_METHOD_SHARED) != 0) { - if (g_slist_length (priv->addresses)) { - g_set_error (error, - NM_SETTING_IP4_CONFIG_ERROR, - NM_SETTING_IP4_CONFIG_ERROR_NOT_ALLOWED_FOR_METHOD, - _("this property is not allowed for '%s=%s'"), - NM_SETTING_IP4_CONFIG_METHOD, priv->method); - g_prefix_error (error, "%s.%s: ", NM_SETTING_IP4_CONFIG_SETTING_NAME, NM_SETTING_IP4_CONFIG_ADDRESSES); - return FALSE; - } - } - } else if (!strcmp (priv->method, NM_SETTING_IP4_CONFIG_METHOD_AUTO)) { - /* nothing to do */ - } else { - g_set_error_literal (error, - NM_SETTING_IP4_CONFIG_ERROR, - NM_SETTING_IP4_CONFIG_ERROR_INVALID_PROPERTY, - _("property is invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_IP4_CONFIG_SETTING_NAME, NM_SETTING_IP4_CONFIG_METHOD); - return FALSE; - } - - if (priv->dhcp_client_id && !strlen (priv->dhcp_client_id)) { - g_set_error_literal (error, - NM_SETTING_IP4_CONFIG_ERROR, - NM_SETTING_IP4_CONFIG_ERROR_INVALID_PROPERTY, - _("property is empty")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_IP4_CONFIG_SETTING_NAME, NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID); - return FALSE; - } - - if (priv->dhcp_hostname && !strlen (priv->dhcp_hostname)) { - g_set_error_literal (error, - NM_SETTING_IP4_CONFIG_ERROR, - NM_SETTING_IP4_CONFIG_ERROR_INVALID_PROPERTY, - _("property is empty")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_IP4_CONFIG_SETTING_NAME, NM_SETTING_IP4_CONFIG_DHCP_HOSTNAME); - return FALSE; - } - - /* Validate addresses */ - for (iter = priv->addresses, i = 0; iter; iter = g_slist_next (iter), i++) { - NMIP4Address *addr = (NMIP4Address *) iter->data; - guint32 prefix = nm_ip4_address_get_prefix (addr); - - if (!nm_ip4_address_get_address (addr)) { - g_set_error (error, - NM_SETTING_IP4_CONFIG_ERROR, - NM_SETTING_IP4_CONFIG_ERROR_INVALID_PROPERTY, - _("%d. IPv4 address is invalid"), - i+1); - g_prefix_error (error, "%s.%s: ", NM_SETTING_IP4_CONFIG_SETTING_NAME, NM_SETTING_IP4_CONFIG_ADDRESSES); - return FALSE; - } - - if (!prefix || prefix > 32) { - g_set_error (error, - NM_SETTING_IP4_CONFIG_ERROR, - NM_SETTING_IP4_CONFIG_ERROR_INVALID_PROPERTY, - _("%d. IPv4 address has invalid prefix"), - i+1); - g_prefix_error (error, "%s.%s: ", NM_SETTING_IP4_CONFIG_SETTING_NAME, NM_SETTING_IP4_CONFIG_ADDRESSES); - return FALSE; - } - } - - /* Validate routes */ - for (iter = priv->routes, i = 0; iter; iter = g_slist_next (iter), i++) { - NMIP4Route *route = (NMIP4Route *) iter->data; - guint32 prefix = nm_ip4_route_get_prefix (route); - - if (!prefix || prefix > 32) { - g_set_error (error, - NM_SETTING_IP4_CONFIG_ERROR, - NM_SETTING_IP4_CONFIG_ERROR_INVALID_PROPERTY, - _("%d. route has invalid prefix"), - i+1); - g_prefix_error (error, "%s.%s: ", NM_SETTING_IP4_CONFIG_SETTING_NAME, NM_SETTING_IP4_CONFIG_ROUTES); - return FALSE; - } - } - - return TRUE; -} - -static void -nm_setting_ip4_config_init (NMSettingIP4Config *setting) -{ - NMSettingIP4ConfigPrivate *priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting); - - priv->dns = g_array_sized_new (FALSE, TRUE, sizeof (guint32), 3); -} - -static void -finalize (GObject *object) -{ - NMSettingIP4Config *self = NM_SETTING_IP4_CONFIG (object); - NMSettingIP4ConfigPrivate *priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (self); - - g_free (priv->method); - g_free (priv->dhcp_hostname); - g_free (priv->dhcp_client_id); - - g_array_free (priv->dns, TRUE); - - g_slist_free_full (priv->dns_search, g_free); - g_slist_free_full (priv->addresses, (GDestroyNotify) nm_ip4_address_unref); - g_slist_free_full (priv->routes, (GDestroyNotify) nm_ip4_route_unref); - - G_OBJECT_CLASS (nm_setting_ip4_config_parent_class)->finalize (object); -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSettingIP4Config *setting = NM_SETTING_IP4_CONFIG (object); - NMSettingIP4ConfigPrivate *priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting); - - switch (prop_id) { - case PROP_METHOD: - g_free (priv->method); - priv->method = g_value_dup_string (value); - break; - case PROP_DNS: - g_array_free (priv->dns, TRUE); - priv->dns = g_value_dup_boxed (value); - if (!priv->dns) - priv->dns = g_array_sized_new (FALSE, TRUE, sizeof (guint32), 3); - break; - case PROP_DNS_SEARCH: - g_slist_free_full (priv->dns_search, g_free); - priv->dns_search = g_value_dup_boxed (value); - break; - case PROP_ADDRESSES: - g_slist_free_full (priv->addresses, (GDestroyNotify) nm_ip4_address_unref); - priv->addresses = nm_utils_ip4_addresses_from_gvalue (value); - break; - case PROP_ROUTES: - g_slist_free_full (priv->routes, (GDestroyNotify) nm_ip4_route_unref); - priv->routes = nm_utils_ip4_routes_from_gvalue (value); - break; - case PROP_ROUTE_METRIC: - priv->route_metric = g_value_get_int64 (value); - break; - case PROP_IGNORE_AUTO_ROUTES: - priv->ignore_auto_routes = g_value_get_boolean (value); - break; - case PROP_IGNORE_AUTO_DNS: - priv->ignore_auto_dns = g_value_get_boolean (value); - break; - case PROP_DHCP_CLIENT_ID: - g_free (priv->dhcp_client_id); - priv->dhcp_client_id = g_value_dup_string (value); - break; - case PROP_DHCP_SEND_HOSTNAME: - priv->dhcp_send_hostname = g_value_get_boolean (value); - break; - case PROP_DHCP_HOSTNAME: - g_free (priv->dhcp_hostname); - priv->dhcp_hostname = g_value_dup_string (value); - break; - case PROP_DHCP_TIMEOUT: - priv->dhcp_timeout = g_value_get_uint (value); - break; - case PROP_NEVER_DEFAULT: - priv->never_default = g_value_get_boolean (value); - break; - case PROP_MAY_FAIL: - priv->may_fail = g_value_get_boolean (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSettingIP4Config *setting = NM_SETTING_IP4_CONFIG (object); - NMSettingIP4ConfigPrivate *priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting); - - switch (prop_id) { - case PROP_METHOD: - g_value_set_string (value, nm_setting_ip4_config_get_method (setting)); - break; - case PROP_DNS: - g_value_set_boxed (value, priv->dns); - break; - case PROP_DNS_SEARCH: - g_value_set_boxed (value, priv->dns_search); - break; - case PROP_ADDRESSES: - nm_utils_ip4_addresses_to_gvalue (priv->addresses, value); - break; - case PROP_ROUTES: - nm_utils_ip4_routes_to_gvalue (priv->routes, value); - break; - case PROP_ROUTE_METRIC: - g_value_set_int64 (value, priv->route_metric); - break; - case PROP_IGNORE_AUTO_ROUTES: - g_value_set_boolean (value, nm_setting_ip4_config_get_ignore_auto_routes (setting)); - break; - case PROP_IGNORE_AUTO_DNS: - g_value_set_boolean (value, nm_setting_ip4_config_get_ignore_auto_dns (setting)); - break; - case PROP_DHCP_CLIENT_ID: - g_value_set_string (value, nm_setting_ip4_config_get_dhcp_client_id (setting)); - break; - case PROP_DHCP_SEND_HOSTNAME: - g_value_set_boolean (value, nm_setting_ip4_config_get_dhcp_send_hostname (setting)); - break; - case PROP_DHCP_HOSTNAME: - g_value_set_string (value, nm_setting_ip4_config_get_dhcp_hostname (setting)); - break; - case PROP_DHCP_TIMEOUT: - g_value_set_uint (value, nm_setting_ip4_config_get_dhcp_timeout (setting)); - break; - case PROP_NEVER_DEFAULT: - g_value_set_boolean (value, priv->never_default); - break; - case PROP_MAY_FAIL: - g_value_set_boolean (value, priv->may_fail); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_setting_ip4_config_class_init (NMSettingIP4ConfigClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingIP4ConfigPrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->finalize = finalize; - parent_class->verify = verify; - - /* Properties */ - /** - * NMSettingIP4Config:method: - * - * IPv4 configuration method. If "auto" is specified then the appropriate - * automatic method (DHCP, PPP, etc) is used for the interface and most - * other properties can be left unset. If "link-local" is specified, then a - * link-local address in the 169.254/16 range will be assigned to the - * interface. If "manual" is specified, static IP addressing is used and at - * least one IP address must be given in the "addresses" property. If - * "shared" is specified (indicating that this connection will provide - * network access to other computers) then the interface is assigned an - * address in the 10.42.x.1/24 range and a DHCP and forwarding DNS server - * are started, and the interface is NAT-ed to the current default network - * connection. "disabled" means IPv4 will not be used on this connection. - * This property must be set. - **/ - g_object_class_install_property - (object_class, PROP_METHOD, - g_param_spec_string (NM_SETTING_IP4_CONFIG_METHOD, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingIP4Config:dns: - * - * List of DNS servers (network byte order). For the "auto" method, these - * DNS servers are appended to those (if any) returned by automatic - * configuration. DNS servers cannot be used with the "shared", - * "link-local", or "disabled" methods as there is no upstream network. In - * all other methods, these DNS servers are used as the only DNS servers for - * this connection. - **/ - g_object_class_install_property - (object_class, PROP_DNS, - _nm_param_spec_specialized (NM_SETTING_IP4_CONFIG_DNS, "", "", - DBUS_TYPE_G_UINT_ARRAY, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingIP4Config:dns-search: - * - * List of DNS search domains. For the "auto" method, these search domains - * are appended to those returned by automatic configuration. Search domains - * cannot be used with the "shared", "link-local", or "disabled" methods as - * there is no upstream network. In all other methods, these search domains - * are used as the only search domains for this connection. - **/ - g_object_class_install_property - (object_class, PROP_DNS_SEARCH, - _nm_param_spec_specialized (NM_SETTING_IP4_CONFIG_DNS_SEARCH, "", "", - DBUS_TYPE_G_LIST_OF_STRING, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingIP4Config:addresses: - * - * Array of IPv4 address structures. Each IPv4 address structure is - * composed of 3 32-bit values; the first being the IPv4 address (network - * byte order), the second the prefix (1 - 32), and last the IPv4 gateway - * (network byte order). The gateway may be left as 0 if no gateway exists - * for that subnet. For the "auto" method, given IP addresses are appended - * to those returned by automatic configuration. Addresses cannot be used - * with the "shared", "link-local", or "disabled" methods as addressing is - * either automatic or disabled with these methods. - **/ - g_object_class_install_property - (object_class, PROP_ADDRESSES, - _nm_param_spec_specialized (NM_SETTING_IP4_CONFIG_ADDRESSES, "", "", - DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UINT, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingIP4Config:routes: - * - * Array of IPv4 route structures. Each IPv4 route structure is composed of - * 4 32-bit values; the first being the destination IPv4 network or address - * (network byte order), the second the destination network or address - * prefix (1 - 32), the third being the next-hop (network byte order) if - * any, and the fourth being the route metric. For the "auto" method, given - * IP routes are appended to those returned by automatic configuration. - * Routes cannot be used with the "shared", "link-local", or "disabled" - * methods because there is no upstream network. - **/ - g_object_class_install_property - (object_class, PROP_ROUTES, - _nm_param_spec_specialized (NM_SETTING_IP4_CONFIG_ROUTES, "", "", - DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UINT, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingIP4Config:route-metric: - * - * The default metric for routes that don't explicitly specify a metric. - * The default value -1 means that the metric is chosen automatically - * based on the device type. - * The metric applies to dynamic routes, manual (static) routes that - * don't have an explicit metric setting, address prefix routes, and - * the default route. - * As the linux kernel accepts zero (0) as a valid metric, zero is - * a valid value. - * - * Since: 1.0 - **/ - g_object_class_install_property - (object_class, PROP_ROUTE_METRIC, - g_param_spec_int64 (NM_SETTING_IP4_CONFIG_ROUTE_METRIC, "", "", - -1, G_MAXUINT32, -1, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingIP4Config:ignore-auto-routes: - * - * When the method is set to "auto" and this property to %TRUE, - * automatically configured routes are ignored and only routes specified in - * the #NMSettingIP4Config:routes property, if any, are used. - **/ - g_object_class_install_property - (object_class, PROP_IGNORE_AUTO_ROUTES, - g_param_spec_boolean (NM_SETTING_IP4_CONFIG_IGNORE_AUTO_ROUTES, "", "", - FALSE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingIP4Config:ignore-auto-dns: - * - * When the method is set to "auto" and this property to %TRUE, - * automatically configured nameservers and search domains are ignored and - * only nameservers and search domains specified in the - * #NMSettingIP4Config:dns and #NMSettingIP4Config:dns-search properties, if - * any, are used. - **/ - g_object_class_install_property - (object_class, PROP_IGNORE_AUTO_DNS, - g_param_spec_boolean (NM_SETTING_IP4_CONFIG_IGNORE_AUTO_DNS, "", "", - FALSE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingIP4Config:dhcp-client-id: - * - * A string sent to the DHCP server to identify the local machine which the - * DHCP server may use to customize the DHCP lease and options. - **/ - g_object_class_install_property - (object_class, PROP_DHCP_CLIENT_ID, - g_param_spec_string (NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingIP4Config:dhcp-send-hostname: - * - * If %TRUE, a hostname is sent to the DHCP server when acquiring a lease. - * Some DHCP servers use this hostname to update DNS databases, essentially - * providing a static hostname for the computer. If the - * #NMSettingIP4Config:dhcp-hostname property is empty and this property is - * %TRUE, the current persistent hostname of the computer is sent. - **/ - g_object_class_install_property - (object_class, PROP_DHCP_SEND_HOSTNAME, - g_param_spec_boolean (NM_SETTING_IP4_CONFIG_DHCP_SEND_HOSTNAME, "", "", - TRUE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingIP4Config:dhcp-hostname: - * - * If the #NMSettingIP4Config:dhcp-send-hostname property is %TRUE, then the - * specified name will be sent to the DHCP server when acquiring a lease. - **/ - g_object_class_install_property - (object_class, PROP_DHCP_HOSTNAME, - g_param_spec_string (NM_SETTING_IP4_CONFIG_DHCP_HOSTNAME, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingIP4Config:dhcp-timeout: - * - * Number of seconds after which the unfinished DHCP transaction fails - * or zero for default. - **/ - g_object_class_install_property - (object_class, PROP_DHCP_TIMEOUT, - g_param_spec_uint (NM_SETTING_IP4_CONFIG_DHCP_TIMEOUT, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingIP4Config:never-default: - * - * If %TRUE, this connection will never be the default IPv4 connection, - * meaning it will never be assigned the default route by NetworkManager. - **/ - g_object_class_install_property - (object_class, PROP_NEVER_DEFAULT, - g_param_spec_boolean (NM_SETTING_IP4_CONFIG_NEVER_DEFAULT, "", "", - FALSE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingIP4Config:may-fail: - * - * If %TRUE, allow overall network configuration to proceed even if IPv4 - * configuration times out. Note that at least one IP configuration must - * succeed or overall network configuration will still fail. For example, - * in IPv6-only networks, setting this property to %TRUE allows the overall - * network configuration to succeed if IPv4 configuration fails but IPv6 - * configuration completes successfully. - **/ - g_object_class_install_property - (object_class, PROP_MAY_FAIL, - g_param_spec_boolean (NM_SETTING_IP4_CONFIG_MAY_FAIL, "", "", - TRUE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); -} - -struct NMIP4Address { - guint32 refcount; - guint32 address; /* network byte order */ - guint32 prefix; - guint32 gateway; /* network byte order */ -}; - -/** - * nm_ip4_address_new: - * - * Creates and returns a new #NMIP4Address object. - * - * Returns: (transfer full): the new empty #NMIP4Address object - **/ -NMIP4Address * -nm_ip4_address_new (void) -{ - NMIP4Address *address; - - address = g_malloc0 (sizeof (NMIP4Address)); - address->refcount = 1; - return address; -} - -/** - * nm_ip4_address_dup: - * @source: the #NMIP4Address object to copy - * - * Copies a given #NMIP4Address object and returns the copy. - * - * Returns: (transfer full): the copy of the given #NMIP4Address copy - **/ -NMIP4Address * -nm_ip4_address_dup (NMIP4Address *source) -{ - NMIP4Address *address; - - g_return_val_if_fail (source != NULL, NULL); - g_return_val_if_fail (source->refcount > 0, NULL); - - address = nm_ip4_address_new (); - address->address = source->address; - address->prefix = source->prefix; - address->gateway = source->gateway; - - return address; -} - -/** - * nm_ip4_address_ref: - * @address: the #NMIP4Address - * - * Increases the reference count of the object. - **/ -void -nm_ip4_address_ref (NMIP4Address *address) -{ - g_return_if_fail (address != NULL); - g_return_if_fail (address->refcount > 0); - - address->refcount++; -} - -/** - * nm_ip4_address_unref: - * @address: the #NMIP4Address - * - * Decreases the reference count of the object. If the reference count - * reaches zero, the object will be destroyed. - **/ -void -nm_ip4_address_unref (NMIP4Address *address) -{ - g_return_if_fail (address != NULL); - g_return_if_fail (address->refcount > 0); - - address->refcount--; - if (address->refcount == 0) { - memset (address, 0, sizeof (NMIP4Address)); - g_free (address); - } -} - -/** - * nm_ip4_address_compare: - * @address: the #NMIP4Address - * @other: the #NMIP4Address to compare @address to. - * - * Determines if two #NMIP4Address objects contain the same values. - * - * Returns: %TRUE if the objects contain the same values, %FALSE if they do not. - **/ -gboolean -nm_ip4_address_compare (NMIP4Address *address, NMIP4Address *other) -{ - g_return_val_if_fail (address != NULL, FALSE); - g_return_val_if_fail (address->refcount > 0, FALSE); - - g_return_val_if_fail (other != NULL, FALSE); - g_return_val_if_fail (other->refcount > 0, FALSE); - - if ( address->address != other->address - || address->prefix != other->prefix - || address->gateway != other->gateway) - return FALSE; - return TRUE; -} - -/** - * nm_ip4_address_get_address: - * @address: the #NMIP4Address - * - * Gets the IPv4 address property of this address object. - * - * Returns: the IPv4 address in network byte order - **/ -guint32 -nm_ip4_address_get_address (NMIP4Address *address) -{ - g_return_val_if_fail (address != NULL, 0); - g_return_val_if_fail (address->refcount > 0, 0); - - return address->address; -} - -/** - * nm_ip4_address_set_address: - * @address: the #NMIP4Address - * @addr: the IPv4 address in network byte order - * - * Sets the IPv4 address property of this object. - **/ -void -nm_ip4_address_set_address (NMIP4Address *address, guint32 addr) -{ - g_return_if_fail (address != NULL); - g_return_if_fail (address->refcount > 0); - - address->address = addr; -} - -/** - * nm_ip4_address_get_prefix: - * @address: the #NMIP4Address - * - * Gets the IPv4 address prefix (ie "24" or "30" etc) property of this address - * object. - * - * Returns: the IPv4 address prefix - **/ -guint32 -nm_ip4_address_get_prefix (NMIP4Address *address) -{ - g_return_val_if_fail (address != NULL, 0); - g_return_val_if_fail (address->refcount > 0, 0); - - return address->prefix; -} - -/** - * nm_ip4_address_set_prefix: - * @address: the #NMIP4Address - * @prefix: the address prefix, a number between 1 and 32 inclusive - * - * Sets the IPv4 address prefix. - **/ -void -nm_ip4_address_set_prefix (NMIP4Address *address, guint32 prefix) -{ - g_return_if_fail (address != NULL); - g_return_if_fail (address->refcount > 0); - g_return_if_fail (prefix <= 32); - g_return_if_fail (prefix > 0); - - address->prefix = prefix; -} - -/** - * nm_ip4_address_get_gateway: - * @address: the #NMIP4Address - * - * Gets the IPv4 default gateway property of this address object. - * - * Returns: the IPv4 gateway address in network byte order - **/ -guint32 -nm_ip4_address_get_gateway (NMIP4Address *address) -{ - g_return_val_if_fail (address != NULL, 0); - g_return_val_if_fail (address->refcount > 0, 0); - - return address->gateway; -} - -/** - * nm_ip4_address_set_gateway: - * @address: the #NMIP4Address - * @gateway: the IPv4 default gateway in network byte order - * - * Sets the IPv4 default gateway property of this address object. - **/ -void -nm_ip4_address_set_gateway (NMIP4Address *address, guint32 gateway) -{ - g_return_if_fail (address != NULL); - g_return_if_fail (address->refcount > 0); - - address->gateway = gateway; -} - -struct NMIP4Route { - guint32 refcount; - - guint32 dest; /* network byte order */ - guint32 prefix; - guint32 next_hop; /* network byte order */ - guint32 metric; /* lower metric == more preferred */ -}; - -/** - * nm_ip4_route_new: - * - * Creates and returns a new #NMIP4Route object. - * - * Returns: (transfer full): the new empty #NMIP4Route object - **/ -NMIP4Route * -nm_ip4_route_new (void) -{ - NMIP4Route *route; - - route = g_malloc0 (sizeof (NMIP4Route)); - route->refcount = 1; - return route; -} - -/** - * nm_ip4_route_dup: - * @source: the #NMIP4Route object to copy - * - * Copies a given #NMIP4Route object and returns the copy. - * - * Returns: (transfer full): the copy of the given #NMIP4Route copy - **/ -NMIP4Route * -nm_ip4_route_dup (NMIP4Route *source) -{ - NMIP4Route *route; - - g_return_val_if_fail (source != NULL, NULL); - g_return_val_if_fail (source->refcount > 0, NULL); - - route = nm_ip4_route_new (); - route->dest = source->dest; - route->prefix = source->prefix; - route->next_hop = source->next_hop; - route->metric = source->metric; - - return route; -} - -/** - * nm_ip4_route_ref: - * @route: the #NMIP4Route - * - * Increases the reference count of the object. - **/ -void -nm_ip4_route_ref (NMIP4Route *route) -{ - g_return_if_fail (route != NULL); - g_return_if_fail (route->refcount > 0); - - route->refcount++; -} - -/** - * nm_ip4_route_unref: - * @route: the #NMIP4Route - * - * Decreases the reference count of the object. If the reference count - * reaches zero, the object will be destroyed. - **/ -void -nm_ip4_route_unref (NMIP4Route *route) -{ - g_return_if_fail (route != NULL); - g_return_if_fail (route->refcount > 0); - - route->refcount--; - if (route->refcount == 0) { - memset (route, 0, sizeof (NMIP4Route)); - g_free (route); - } -} - -/** - * nm_ip4_route_compare: - * @route: the #NMIP4Route - * @other: the #NMIP4Route to compare @route to. - * - * Determines if two #NMIP4Route objects contain the same values. - * - * Returns: %TRUE if the objects contain the same values, %FALSE if they do not. - **/ -gboolean -nm_ip4_route_compare (NMIP4Route *route, NMIP4Route *other) -{ - g_return_val_if_fail (route != NULL, FALSE); - g_return_val_if_fail (route->refcount > 0, FALSE); - - g_return_val_if_fail (other != NULL, FALSE); - g_return_val_if_fail (other->refcount > 0, FALSE); - - if ( route->dest != other->dest - || route->prefix != other->prefix - || route->next_hop != other->next_hop - || route->metric != other->metric) - return FALSE; - return TRUE; -} - -/** - * nm_ip4_route_get_dest: - * @route: the #NMIP4Route - * - * Gets the IPv4 destination address property of this route object. - * - * Returns: the IPv4 address in network byte order - **/ -guint32 -nm_ip4_route_get_dest (NMIP4Route *route) -{ - g_return_val_if_fail (route != NULL, 0); - g_return_val_if_fail (route->refcount > 0, 0); - - return route->dest; -} - -/** - * nm_ip4_route_set_dest: - * @route: the #NMIP4Route - * @dest: the destination address in network byte order - * - * Sets the IPv4 destination address property of this route object. - **/ -void -nm_ip4_route_set_dest (NMIP4Route *route, guint32 dest) -{ - g_return_if_fail (route != NULL); - g_return_if_fail (route->refcount > 0); - - route->dest = dest; -} - -/** - * nm_ip4_route_get_prefix: - * @route: the #NMIP4Route - * - * Gets the IPv4 prefix (ie "24" or "30" etc) of this route. - * - * Returns: the IPv4 prefix - **/ -guint32 -nm_ip4_route_get_prefix (NMIP4Route *route) -{ - g_return_val_if_fail (route != NULL, 0); - g_return_val_if_fail (route->refcount > 0, 0); - - return route->prefix; -} - -/** - * nm_ip4_route_set_prefix: - * @route: the #NMIP4Route - * @prefix: the prefix, a number between 1 and 32 inclusive - * - * Sets the IPv4 prefix of this route. - **/ -void -nm_ip4_route_set_prefix (NMIP4Route *route, guint32 prefix) -{ - g_return_if_fail (route != NULL); - g_return_if_fail (route->refcount > 0); - g_return_if_fail (prefix <= 32); - g_return_if_fail (prefix > 0); - - route->prefix = prefix; -} - -/** - * nm_ip4_route_get_next_hop: - * @route: the #NMIP4Route - * - * Gets the IPv4 address of the next hop of this route. - * - * Returns: the IPv4 address in network byte order - **/ -guint32 -nm_ip4_route_get_next_hop (NMIP4Route *route) -{ - g_return_val_if_fail (route != NULL, 0); - g_return_val_if_fail (route->refcount > 0, 0); - - return route->next_hop; -} - -/** - * nm_ip4_route_set_next_hop: - * @route: the #NMIP4Route - * @next_hop: the IPv4 address of the next hop in network byte order - * - * Sets the IPv4 address of the next hop of this route. - **/ -void -nm_ip4_route_set_next_hop (NMIP4Route *route, guint32 next_hop) -{ - g_return_if_fail (route != NULL); - g_return_if_fail (route->refcount > 0); - - route->next_hop = next_hop; -} - -/** - * nm_ip4_route_get_metric: - * @route: the #NMIP4Route - * - * Gets the route metric property of this route object; lower values indicate - * "better" or more preferred routes. - * - * Returns: the route metric - **/ -guint32 -nm_ip4_route_get_metric (NMIP4Route *route) -{ - g_return_val_if_fail (route != NULL, 0); - g_return_val_if_fail (route->refcount > 0, 0); - - return route->metric; -} - -/** - * nm_ip4_route_set_metric: - * @route: the #NMIP4Route - * @metric: the route metric - * - * Sets the route metric property of this route object; lower values indicate - * "better" or more preferred routes. - **/ -void -nm_ip4_route_set_metric (NMIP4Route *route, guint32 metric) -{ - g_return_if_fail (route != NULL); - g_return_if_fail (route->refcount > 0); - - route->metric = metric; -} diff --git a/libnm-util/nm-setting-ip4-config.h b/libnm-util/nm-setting-ip4-config.h deleted file mode 100644 index 4d50547d79..0000000000 --- a/libnm-util/nm-setting-ip4-config.h +++ /dev/null @@ -1,235 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2014 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#ifndef NM_SETTING_IP4_CONFIG_H -#define NM_SETTING_IP4_CONFIG_H - -#include "nm-setting.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SETTING_IP4_CONFIG (nm_setting_ip4_config_get_type ()) -#define NM_SETTING_IP4_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_IP4_CONFIG, NMSettingIP4Config)) -#define NM_SETTING_IP4_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_IP4CONFIG, NMSettingIP4ConfigClass)) -#define NM_IS_SETTING_IP4_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_IP4_CONFIG)) -#define NM_IS_SETTING_IP4_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_IP4_CONFIG)) -#define NM_SETTING_IP4_CONFIG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_IP4_CONFIG, NMSettingIP4ConfigClass)) - -#define NM_SETTING_IP4_CONFIG_SETTING_NAME "ipv4" - -/** - * NMSettingIP4ConfigError: - * @NM_SETTING_IP4_CONFIG_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_IP4_CONFIG_ERROR_INVALID_PROPERTY: the property was invalid - * @NM_SETTING_IP4_CONFIG_ERROR_MISSING_PROPERTY: the property was missing and is - * required - * @NM_SETTING_IP4_CONFIG_ERROR_NOT_ALLOWED_FOR_METHOD: the property's value is - * not valid with the given IP4 method - */ -typedef enum { - NM_SETTING_IP4_CONFIG_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_SETTING_IP4_CONFIG_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/ - NM_SETTING_IP4_CONFIG_ERROR_MISSING_PROPERTY, /*< nick=MissingProperty >*/ - NM_SETTING_IP4_CONFIG_ERROR_NOT_ALLOWED_FOR_METHOD /*< nick=NotAllowedForMethod >*/ -} NMSettingIP4ConfigError; - -#define NM_SETTING_IP4_CONFIG_ERROR nm_setting_ip4_config_error_quark () -GQuark nm_setting_ip4_config_error_quark (void); - -#define NM_SETTING_IP4_CONFIG_METHOD "method" -#define NM_SETTING_IP4_CONFIG_DNS "dns" -#define NM_SETTING_IP4_CONFIG_DNS_SEARCH "dns-search" -#define NM_SETTING_IP4_CONFIG_ADDRESSES "addresses" -#define NM_SETTING_IP4_CONFIG_ROUTES "routes" -#define NM_SETTING_IP4_CONFIG_ROUTE_METRIC "route-metric" -#define NM_SETTING_IP4_CONFIG_IGNORE_AUTO_ROUTES "ignore-auto-routes" -#define NM_SETTING_IP4_CONFIG_IGNORE_AUTO_DNS "ignore-auto-dns" -#define NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID "dhcp-client-id" -#define NM_SETTING_IP4_CONFIG_DHCP_SEND_HOSTNAME "dhcp-send-hostname" -#define NM_SETTING_IP4_CONFIG_DHCP_HOSTNAME "dhcp-hostname" -#define NM_SETTING_IP4_CONFIG_DHCP_TIMEOUT "dhcp-timeout" -#define NM_SETTING_IP4_CONFIG_NEVER_DEFAULT "never-default" -#define NM_SETTING_IP4_CONFIG_MAY_FAIL "may-fail" - -/** - * NM_SETTING_IP4_CONFIG_METHOD_AUTO: - * - * IPv4 configuration should be automatically determined via a method appropriate - * for the hardware interface, ie DHCP or PPP or some other device-specific - * manner. - */ -#define NM_SETTING_IP4_CONFIG_METHOD_AUTO "auto" - -/** - * NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL: - * - * IPv4 configuration should be automatically configured for link-local-only - * operation. - */ -#define NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL "link-local" - -/** - * NM_SETTING_IP4_CONFIG_METHOD_MANUAL: - * - * All necessary IPv4 configuration (addresses, prefix, DNS, etc) is specified - * in the setting's properties. - */ -#define NM_SETTING_IP4_CONFIG_METHOD_MANUAL "manual" - -/** - * NM_SETTING_IP4_CONFIG_METHOD_SHARED: - * - * This connection specifies configuration that allows other computers to - * connect through it to the default network (usually the Internet). The - * connection's interface will be assigned a private address, and a DHCP server, - * caching DNS server, and Network Address Translation (NAT) functionality will - * be started on this connection's interface to allow other devices to connect - * through that interface to the default network. - */ -#define NM_SETTING_IP4_CONFIG_METHOD_SHARED "shared" - -/** - * NM_SETTING_IP4_CONFIG_METHOD_DISABLED: - * - * This connection does not use or require IPv4 address and it should be disabled. - */ -#define NM_SETTING_IP4_CONFIG_METHOD_DISABLED "disabled" - -typedef struct NMIP4Address NMIP4Address; - -GType nm_ip4_address_get_type (void); - -NMIP4Address * nm_ip4_address_new (void); -NMIP4Address * nm_ip4_address_dup (NMIP4Address *source); -void nm_ip4_address_ref (NMIP4Address *address); -void nm_ip4_address_unref (NMIP4Address *address); -/* Return TRUE if addresses are identical */ -gboolean nm_ip4_address_compare (NMIP4Address *address, NMIP4Address *other); - -guint32 nm_ip4_address_get_address (NMIP4Address *address); -void nm_ip4_address_set_address (NMIP4Address *address, - guint32 addr); /* network byte order */ - -guint32 nm_ip4_address_get_prefix (NMIP4Address *address); -void nm_ip4_address_set_prefix (NMIP4Address *address, - guint32 prefix); - -guint32 nm_ip4_address_get_gateway (NMIP4Address *address); -void nm_ip4_address_set_gateway (NMIP4Address *address, - guint32 gateway); /* network byte order */ - -typedef struct NMIP4Route NMIP4Route; - -GType nm_ip4_route_get_type (void); - -NMIP4Route * nm_ip4_route_new (void); -NMIP4Route * nm_ip4_route_dup (NMIP4Route *source); -void nm_ip4_route_ref (NMIP4Route *route); -void nm_ip4_route_unref (NMIP4Route *route); -/* Return TRUE if routes are identical */ -gboolean nm_ip4_route_compare (NMIP4Route *route, NMIP4Route *other); - -guint32 nm_ip4_route_get_dest (NMIP4Route *route); -void nm_ip4_route_set_dest (NMIP4Route *route, - guint32 dest); /* network byte order */ - -guint32 nm_ip4_route_get_prefix (NMIP4Route *route); -void nm_ip4_route_set_prefix (NMIP4Route *route, - guint32 prefix); - -guint32 nm_ip4_route_get_next_hop (NMIP4Route *route); -void nm_ip4_route_set_next_hop (NMIP4Route *route, - guint32 next_hop); /* network byte order */ - -guint32 nm_ip4_route_get_metric (NMIP4Route *route); -void nm_ip4_route_set_metric (NMIP4Route *route, - guint32 metric); - -typedef struct { - NMSetting parent; -} NMSettingIP4Config; - -typedef struct { - NMSettingClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); -} NMSettingIP4ConfigClass; - -GType nm_setting_ip4_config_get_type (void); - -NMSetting * nm_setting_ip4_config_new (void); -const char * nm_setting_ip4_config_get_method (NMSettingIP4Config *setting); - -guint32 nm_setting_ip4_config_get_num_dns (NMSettingIP4Config *setting); -guint32 nm_setting_ip4_config_get_dns (NMSettingIP4Config *setting, guint32 i); -gboolean nm_setting_ip4_config_add_dns (NMSettingIP4Config *setting, guint32 dns); -void nm_setting_ip4_config_remove_dns (NMSettingIP4Config *setting, guint32 i); -NM_AVAILABLE_IN_0_9_10 -gboolean nm_setting_ip4_config_remove_dns_by_value (NMSettingIP4Config *setting, guint32 dns); -void nm_setting_ip4_config_clear_dns (NMSettingIP4Config *setting); - -guint32 nm_setting_ip4_config_get_num_dns_searches (NMSettingIP4Config *setting); -const char * nm_setting_ip4_config_get_dns_search (NMSettingIP4Config *setting, guint32 i); -gboolean nm_setting_ip4_config_add_dns_search (NMSettingIP4Config *setting, const char *dns_search); -void nm_setting_ip4_config_remove_dns_search (NMSettingIP4Config *setting, guint32 i); -NM_AVAILABLE_IN_0_9_10 -gboolean nm_setting_ip4_config_remove_dns_search_by_value (NMSettingIP4Config *setting, const char *dns_search); -void nm_setting_ip4_config_clear_dns_searches (NMSettingIP4Config *setting); - -guint32 nm_setting_ip4_config_get_num_addresses (NMSettingIP4Config *setting); -NMIP4Address *nm_setting_ip4_config_get_address (NMSettingIP4Config *setting, guint32 i); -gboolean nm_setting_ip4_config_add_address (NMSettingIP4Config *setting, NMIP4Address *address); -void nm_setting_ip4_config_remove_address (NMSettingIP4Config *setting, guint32 i); -NM_AVAILABLE_IN_0_9_10 -gboolean nm_setting_ip4_config_remove_address_by_value (NMSettingIP4Config *setting, NMIP4Address *address); -void nm_setting_ip4_config_clear_addresses (NMSettingIP4Config *setting); - -guint32 nm_setting_ip4_config_get_num_routes (NMSettingIP4Config *setting); -NMIP4Route * nm_setting_ip4_config_get_route (NMSettingIP4Config *setting, guint32 i); -gboolean nm_setting_ip4_config_add_route (NMSettingIP4Config *setting, NMIP4Route *route); -void nm_setting_ip4_config_remove_route (NMSettingIP4Config *setting, guint32 i); -NM_AVAILABLE_IN_0_9_10 -gboolean nm_setting_ip4_config_remove_route_by_value (NMSettingIP4Config *setting, NMIP4Route *route); -void nm_setting_ip4_config_clear_routes (NMSettingIP4Config *setting); - -NM_AVAILABLE_IN_1_0 -gint64 nm_setting_ip4_config_get_route_metric (NMSettingIP4Config *setting); - -gboolean nm_setting_ip4_config_get_ignore_auto_routes (NMSettingIP4Config *setting); -gboolean nm_setting_ip4_config_get_ignore_auto_dns (NMSettingIP4Config *setting); -const char * nm_setting_ip4_config_get_dhcp_client_id (NMSettingIP4Config *setting); -gboolean nm_setting_ip4_config_get_dhcp_send_hostname (NMSettingIP4Config *setting); -const char * nm_setting_ip4_config_get_dhcp_hostname (NMSettingIP4Config *setting); -NM_AVAILABLE_IN_1_2 -int nm_setting_ip4_config_get_dhcp_timeout (NMSettingIP4Config *setting); - -gboolean nm_setting_ip4_config_get_never_default (NMSettingIP4Config *setting); - -gboolean nm_setting_ip4_config_get_may_fail (NMSettingIP4Config *setting); - -G_END_DECLS - -#endif /* NM_SETTING_IP4_CONFIG_H */ diff --git a/libnm-util/nm-setting-ip6-config.c b/libnm-util/nm-setting-ip6-config.c deleted file mode 100644 index 6beeb7da21..0000000000 --- a/libnm-util/nm-setting-ip6-config.c +++ /dev/null @@ -1,1776 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2014 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <dbus/dbus-glib.h> - -#include "nm-setting-ip6-config.h" -#include "nm-param-spec-specialized.h" -#include "nm-utils.h" -#include "nm-dbus-glib-types.h" -#include "nm-setting-private.h" - -/** - * SECTION:nm-setting-ip6-config - * @short_description: Describes IPv6 addressing, routing, and name service properties - * @include: nm-setting-ip6-config.h - * - * The #NMSettingIP6Config object is a #NMSetting subclass that describes - * properties related to IPv6 addressing, routing, and Domain Name Service - **/ - -/** - * nm_setting_ip6_config_error_quark: - * - * Registers an error quark for #NMSettingIP6Config if necessary. - * - * Returns: the error quark used for #NMSettingIP6Config errors. - **/ -GQuark -nm_setting_ip6_config_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-ip6-config-error-quark"); - return quark; -} - -G_DEFINE_BOXED_TYPE (NMIP6Address, nm_ip6_address, nm_ip6_address_dup, nm_ip6_address_unref) -G_DEFINE_BOXED_TYPE (NMIP6Route, nm_ip6_route, nm_ip6_route_dup, nm_ip6_route_unref) - -G_DEFINE_TYPE_WITH_CODE (NMSettingIP6Config, nm_setting_ip6_config, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_IP6_CONFIG_SETTING_NAME, - g_define_type_id, - 4, - NM_SETTING_IP6_CONFIG_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_IP6_CONFIG) - -#define NM_SETTING_IP6_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_IP6_CONFIG, NMSettingIP6ConfigPrivate)) - -typedef struct { - char *method; - char *dhcp_hostname; - GSList *dns; /* array of struct in6_addr */ - GSList *dns_search; /* list of strings */ - GSList *addresses; /* array of NMIP6Address */ - GSList *routes; /* array of NMIP6Route */ - gint64 route_metric; - gboolean ignore_auto_routes; - gboolean ignore_auto_dns; - gboolean never_default; - gboolean may_fail; - NMSettingIP6ConfigPrivacy ip6_privacy; -} NMSettingIP6ConfigPrivate; - -enum { - PROP_0, - PROP_METHOD, - PROP_DHCP_HOSTNAME, - PROP_DNS, - PROP_DNS_SEARCH, - PROP_ADDRESSES, - PROP_ROUTES, - PROP_ROUTE_METRIC, - PROP_IGNORE_AUTO_ROUTES, - PROP_IGNORE_AUTO_DNS, - PROP_NEVER_DEFAULT, - PROP_MAY_FAIL, - PROP_IP6_PRIVACY, - - LAST_PROP -}; - -/** - * nm_setting_ip6_config_new: - * - * Creates a new #NMSettingIP6Config object with default values. - * - * Returns: (transfer full): the new empty #NMSettingIP6Config object - **/ -NMSetting * -nm_setting_ip6_config_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_IP6_CONFIG, NULL); -} - -/** - * nm_setting_ip6_config_get_method: - * @setting: the #NMSettingIP6Config - * - * Returns: the #NMSettingIP6Config:method property of the setting - **/ -const char * -nm_setting_ip6_config_get_method (NMSettingIP6Config *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), NULL); - - return NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->method; -} - -/** - * nm_setting_ip6_config_get_dhcp_hostname: - * @setting: the #NMSettingIP6Config - * - * Returns the value contained in the #NMSettingIP6Config:dhcp-hostname - * property. - * - * Returns: the configured hostname to send to the DHCP server - * - * Since: 0.9.8 - **/ -const char * -nm_setting_ip6_config_get_dhcp_hostname (NMSettingIP6Config *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), NULL); - - return NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->dhcp_hostname; -} - -/** - * nm_setting_ip6_config_get_num_dns: - * @setting: the #NMSettingIP6Config - * - * Returns: the number of configured DNS servers - **/ -guint32 -nm_setting_ip6_config_get_num_dns (NMSettingIP6Config *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), 0); - - return g_slist_length (NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->dns); -} - -/** - * nm_setting_ip6_config_get_dns: - * @setting: the #NMSettingIP6Config - * @i: index number of the DNS server to return - * - * Returns: (transfer none): the IPv6 address of the DNS server at index @i - **/ -const struct in6_addr * -nm_setting_ip6_config_get_dns (NMSettingIP6Config *setting, guint32 i) -{ - NMSettingIP6ConfigPrivate *priv; - - g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), NULL); - - priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); - g_return_val_if_fail (i <= g_slist_length (priv->dns), NULL); - - return (const struct in6_addr *) g_slist_nth_data (priv->dns, i); -} - -/** - * nm_setting_ip6_config_add_dns: - * @setting: the #NMSettingIP6Config - * @dns: the IPv6 address of the DNS server to add - * - * Adds a new DNS server to the setting. - * - * Returns: %TRUE if the DNS server was added; %FALSE if the server was already - * known - **/ -gboolean -nm_setting_ip6_config_add_dns (NMSettingIP6Config *setting, const struct in6_addr *addr) -{ - NMSettingIP6ConfigPrivate *priv; - struct in6_addr *copy; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), FALSE); - - priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); - for (iter = priv->dns; iter; iter = g_slist_next (iter)) { - if (!memcmp (addr, (struct in6_addr *) iter->data, sizeof (struct in6_addr))) - return FALSE; - } - - copy = g_malloc0 (sizeof (struct in6_addr)); - memcpy (copy, addr, sizeof (struct in6_addr)); - priv->dns = g_slist_append (priv->dns, copy); - g_object_notify (G_OBJECT (setting), NM_SETTING_IP6_CONFIG_DNS); - - return TRUE; -} - -/** - * nm_setting_ip6_config_remove_dns: - * @setting: the #NMSettingIP6Config - * @i: index number of the DNS server to remove - * - * Removes the DNS server at index @i. - **/ -void -nm_setting_ip6_config_remove_dns (NMSettingIP6Config *setting, guint32 i) -{ - NMSettingIP6ConfigPrivate *priv; - GSList *elt; - - g_return_if_fail (NM_IS_SETTING_IP6_CONFIG (setting)); - - priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); - elt = g_slist_nth (priv->dns, i); - g_return_if_fail (elt != NULL); - - g_free (elt->data); - priv->dns = g_slist_delete_link (priv->dns, elt); - g_object_notify (G_OBJECT (setting), NM_SETTING_IP6_CONFIG_DNS); -} - -/** - * nm_setting_ip6_config_remove_dns_by_value: - * @setting: the #NMSettingIP6Config - * @dns: the IPv6 address of the DNS server to remove - * - * Removes the DNS server at index @i. - * - * Returns: %TRUE if the DNS server was found and removed; %FALSE if it was not. - * - * Since: 0.9.10 - **/ -gboolean -nm_setting_ip6_config_remove_dns_by_value (NMSettingIP6Config *setting, - const struct in6_addr *addr) -{ - NMSettingIP6ConfigPrivate *priv; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), FALSE); - - priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); - for (iter = priv->dns; iter; iter = g_slist_next (iter)) { - if (!memcmp (addr, (struct in6_addr *) iter->data, sizeof (struct in6_addr))) { - priv->dns = g_slist_delete_link (priv->dns, iter); - g_object_notify (G_OBJECT (setting), NM_SETTING_IP6_CONFIG_DNS); - return TRUE; - } - } - return FALSE; -} - -/** - * nm_setting_ip6_config_clear_dns: - * @setting: the #NMSettingIP6Config - * - * Removes all configured DNS servers. - **/ -void -nm_setting_ip6_config_clear_dns (NMSettingIP6Config *setting) -{ - g_return_if_fail (NM_IS_SETTING_IP6_CONFIG (setting)); - - g_slist_free_full (NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->dns, g_free); - NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->dns = NULL; - g_object_notify (G_OBJECT (setting), NM_SETTING_IP6_CONFIG_DNS); -} - -/** - * nm_setting_ip6_config_get_num_dns_searches: - * @setting: the #NMSettingIP6Config - * - * Returns: the number of configured DNS search domains - **/ -guint32 -nm_setting_ip6_config_get_num_dns_searches (NMSettingIP6Config *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), 0); - - return g_slist_length (NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->dns_search); -} - -/** - * nm_setting_ip6_config_get_dns_search: - * @setting: the #NMSettingIP6Config - * @i: index number of the DNS search domain to return - * - * Returns: the DNS search domain at index @i - **/ -const char * -nm_setting_ip6_config_get_dns_search (NMSettingIP6Config *setting, guint32 i) -{ - NMSettingIP6ConfigPrivate *priv; - - g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), NULL); - - priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); - g_return_val_if_fail (i <= g_slist_length (priv->dns_search), NULL); - - return (const char *) g_slist_nth_data (priv->dns_search, i); -} - -/** - * nm_setting_ip6_config_add_dns_search: - * @setting: the #NMSettingIP6Config - * @dns_search: the search domain to add - * - * Adds a new DNS search domain to the setting. - * - * Returns: %TRUE if the DNS search domain was added; %FALSE if the search - * domain was already known - **/ -gboolean -nm_setting_ip6_config_add_dns_search (NMSettingIP6Config *setting, - const char *dns_search) -{ - NMSettingIP6ConfigPrivate *priv; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), FALSE); - g_return_val_if_fail (dns_search != NULL, FALSE); - g_return_val_if_fail (dns_search[0] != '\0', FALSE); - - priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); - for (iter = priv->dns_search; iter; iter = g_slist_next (iter)) { - if (!strcmp (dns_search, (char *) iter->data)) - return FALSE; - } - - priv->dns_search = g_slist_append (priv->dns_search, g_strdup (dns_search)); - g_object_notify (G_OBJECT (setting), NM_SETTING_IP6_CONFIG_DNS_SEARCH); - return TRUE; -} - -/** - * nm_setting_ip6_config_remove_dns_search: - * @setting: the #NMSettingIP6Config - * @i: index number of the DNS search domain - * - * Removes the DNS search domain at index @i. - **/ -void -nm_setting_ip6_config_remove_dns_search (NMSettingIP6Config *setting, guint32 i) -{ - NMSettingIP6ConfigPrivate *priv; - GSList *elt; - - g_return_if_fail (NM_IS_SETTING_IP6_CONFIG (setting)); - - priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); - elt = g_slist_nth (priv->dns_search, i); - g_return_if_fail (elt != NULL); - - g_free (elt->data); - priv->dns_search = g_slist_delete_link (priv->dns_search, elt); - g_object_notify (G_OBJECT (setting), NM_SETTING_IP6_CONFIG_DNS_SEARCH); -} - -/** - * nm_setting_ip6_config_remove_dns_search_by_value: - * @setting: the #NMSettingIP6Config - * @dns_search: the search domain to remove - * - * Removes the DNS search domain @dns_search. - * - * Returns: %TRUE if the DNS search domain was found and removed; %FALSE if it was not. - * - * Since 0.9.10 - **/ -gboolean -nm_setting_ip6_config_remove_dns_search_by_value (NMSettingIP6Config *setting, - const char *dns_search) -{ - NMSettingIP6ConfigPrivate *priv; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), FALSE); - g_return_val_if_fail (dns_search != NULL, FALSE); - g_return_val_if_fail (dns_search[0] != '\0', FALSE); - - priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); - for (iter = priv->dns_search; iter; iter = g_slist_next (iter)) { - if (!strcmp (dns_search, (char *) iter->data)) { - priv->dns_search = g_slist_delete_link (priv->dns_search, iter); - g_object_notify (G_OBJECT (setting), NM_SETTING_IP6_CONFIG_DNS_SEARCH); - return TRUE; - } - } - return FALSE; -} - -/** - * nm_setting_ip6_config_clear_dns_searches: - * @setting: the #NMSettingIP6Config - * - * Removes all configured DNS search domains. - **/ -void -nm_setting_ip6_config_clear_dns_searches (NMSettingIP6Config *setting) -{ - g_return_if_fail (NM_IS_SETTING_IP6_CONFIG (setting)); - - g_slist_free_full (NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->dns_search, g_free); - NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->dns_search = NULL; - g_object_notify (G_OBJECT (setting), NM_SETTING_IP6_CONFIG_DNS_SEARCH); -} - -/** - * nm_setting_ip6_config_get_num_addresses: - * @setting: the #NMSettingIP6Config - * - * Returns: the number of configured addresses - **/ -guint32 -nm_setting_ip6_config_get_num_addresses (NMSettingIP6Config *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), 0); - - return g_slist_length (NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->addresses); -} - -/** - * nm_setting_ip6_config_get_address: - * @setting: the #NMSettingIP6Config - * @i: index number of the address to return - * - * Returns: the address at index @i - **/ -NMIP6Address * -nm_setting_ip6_config_get_address (NMSettingIP6Config *setting, guint32 i) -{ - NMSettingIP6ConfigPrivate *priv; - - g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), NULL); - - priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); - g_return_val_if_fail (i <= g_slist_length (priv->addresses), NULL); - - return (NMIP6Address *) g_slist_nth_data (priv->addresses, i); -} - -/** - * nm_setting_ip6_config_add_address: - * @setting: the #NMSettingIP6Config - * @address: the new address to add - * - * Adds a new IPv6 address and associated information to the setting. The - * given address is duplicated internally and is not changed by this function. - * - * Returns: %TRUE if the address was added; %FALSE if the address was already - * known. - **/ -gboolean -nm_setting_ip6_config_add_address (NMSettingIP6Config *setting, - NMIP6Address *address) -{ - NMSettingIP6ConfigPrivate *priv; - NMIP6Address *copy; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), FALSE); - g_return_val_if_fail (address != NULL, FALSE); - - priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); - for (iter = priv->addresses; iter; iter = g_slist_next (iter)) { - if (nm_ip6_address_compare ((NMIP6Address *) iter->data, address)) - return FALSE; - } - - copy = nm_ip6_address_dup (address); - priv->addresses = g_slist_append (priv->addresses, copy); - g_object_notify (G_OBJECT (setting), NM_SETTING_IP6_CONFIG_ADDRESSES); - return TRUE; -} - -/** - * nm_setting_ip6_config_remove_address: - * @setting: the #NMSettingIP6Config - * @i: index number of the address to remove - * - * Removes the address at index @i. - **/ -void -nm_setting_ip6_config_remove_address (NMSettingIP6Config *setting, guint32 i) -{ - NMSettingIP6ConfigPrivate *priv; - GSList *elt; - - g_return_if_fail (NM_IS_SETTING_IP6_CONFIG (setting)); - - priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); - elt = g_slist_nth (priv->addresses, i); - g_return_if_fail (elt != NULL); - - nm_ip6_address_unref ((NMIP6Address *) elt->data); - priv->addresses = g_slist_delete_link (priv->addresses, elt); - g_object_notify (G_OBJECT (setting), NM_SETTING_IP6_CONFIG_ADDRESSES); -} - -/** - * nm_setting_ip6_config_remove_address_by_value: - * @setting: the #NMSettingIP6Config - * @address: the address to remove - * - * Removes the address @address. - * - * Returns: %TRUE if the address was found and removed; %FALSE if it was not. - * - * Since: 0.9.10 - **/ -gboolean -nm_setting_ip6_config_remove_address_by_value (NMSettingIP6Config *setting, - NMIP6Address *address) -{ - NMSettingIP6ConfigPrivate *priv; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), FALSE); - g_return_val_if_fail (address != NULL, FALSE); - - priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); - for (iter = priv->addresses; iter; iter = g_slist_next (iter)) { - if (nm_ip6_address_compare ((NMIP6Address *) iter->data, address)) { - priv->addresses = g_slist_delete_link (priv->addresses, iter); - g_object_notify (G_OBJECT (setting), NM_SETTING_IP6_CONFIG_ADDRESSES); - return TRUE; - } - } - return FALSE; -} - -/** - * nm_setting_ip6_config_clear_addresses: - * @setting: the #NMSettingIP6Config - * - * Removes all configured addresses. - **/ -void -nm_setting_ip6_config_clear_addresses (NMSettingIP6Config *setting) -{ - NMSettingIP6ConfigPrivate *priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); - - g_return_if_fail (NM_IS_SETTING_IP6_CONFIG (setting)); - - g_slist_free_full (priv->addresses, (GDestroyNotify) nm_ip6_address_unref); - priv->addresses = NULL; - g_object_notify (G_OBJECT (setting), NM_SETTING_IP6_CONFIG_ADDRESSES); -} - -/** - * nm_setting_ip6_config_get_num_routes: - * @setting: the #NMSettingIP6Config - * - * Returns: the number of configured routes - **/ -guint32 -nm_setting_ip6_config_get_num_routes (NMSettingIP6Config *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), 0); - - return g_slist_length (NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->routes); -} - -/** - * nm_setting_ip6_config_get_route: - * @setting: the #NMSettingIP6Config - * @i: index number of the route to return - * - * Returns: the route at index @i - **/ -NMIP6Route * -nm_setting_ip6_config_get_route (NMSettingIP6Config *setting, guint32 i) -{ - NMSettingIP6ConfigPrivate *priv; - - g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), NULL); - - priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); - g_return_val_if_fail (i <= g_slist_length (priv->routes), NULL); - - return (NMIP6Route *) g_slist_nth_data (priv->routes, i); -} - -/** - * nm_setting_ip6_config_add_route: - * @setting: the #NMSettingIP6Config - * @route: the route to add - * - * Adds a new IPv6 route and associated information to the setting. The - * given route is duplicated internally and is not changed by this function. - * - * Returns: %TRUE if the route was added; %FALSE if the route was already known. - **/ -gboolean -nm_setting_ip6_config_add_route (NMSettingIP6Config *setting, - NMIP6Route *route) -{ - NMSettingIP6ConfigPrivate *priv; - NMIP6Route *copy; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), FALSE); - g_return_val_if_fail (route != NULL, FALSE); - - priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); - for (iter = priv->routes; iter; iter = g_slist_next (iter)) { - if (nm_ip6_route_compare ((NMIP6Route *) iter->data, route)) - return FALSE; - } - - copy = nm_ip6_route_dup (route); - priv->routes = g_slist_append (priv->routes, copy); - g_object_notify (G_OBJECT (setting), NM_SETTING_IP6_CONFIG_ROUTES); - return TRUE; -} - -/** - * nm_setting_ip6_config_remove_route: - * @setting: the #NMSettingIP6Config - * @i: index number of the route - * - * Removes the route at index @i. - **/ -void -nm_setting_ip6_config_remove_route (NMSettingIP6Config *setting, guint32 i) -{ - NMSettingIP6ConfigPrivate *priv; - GSList *elt; - - g_return_if_fail (NM_IS_SETTING_IP6_CONFIG (setting)); - - priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); - elt = g_slist_nth (priv->routes, i); - g_return_if_fail (elt != NULL); - - nm_ip6_route_unref ((NMIP6Route *) elt->data); - priv->routes = g_slist_delete_link (priv->routes, elt); - g_object_notify (G_OBJECT (setting), NM_SETTING_IP6_CONFIG_ROUTES); -} - -/** - * nm_setting_ip6_config_remove_route_by_value: - * @setting: the #NMSettingIP6Config - * @route: the route to remove - * - * Removes the route @route. - * - * Returns: %TRUE if the route was found and removed; %FALSE if it was not. - * - * Since: 0.9.10 - **/ -gboolean -nm_setting_ip6_config_remove_route_by_value (NMSettingIP6Config *setting, - NMIP6Route *route) -{ - NMSettingIP6ConfigPrivate *priv; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), FALSE); - g_return_val_if_fail (route != NULL, FALSE); - - priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); - for (iter = priv->routes; iter; iter = g_slist_next (iter)) { - if (nm_ip6_route_compare ((NMIP6Route *) iter->data, route)) { - nm_ip6_route_unref ((NMIP6Route *) iter->data); - priv->routes = g_slist_delete_link (priv->routes, iter); - g_object_notify (G_OBJECT (setting), NM_SETTING_IP6_CONFIG_ROUTES); - return TRUE; - } - } - return FALSE; -} - -/** - * nm_setting_ip6_config_clear_routes: - * @setting: the #NMSettingIP6Config - * - * Removes all configured routes. - **/ -void -nm_setting_ip6_config_clear_routes (NMSettingIP6Config *setting) -{ - NMSettingIP6ConfigPrivate *priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); - - g_return_if_fail (NM_IS_SETTING_IP6_CONFIG (setting)); - - g_slist_free_full (priv->routes, (GDestroyNotify) nm_ip6_route_unref); - priv->routes = NULL; - g_object_notify (G_OBJECT (setting), NM_SETTING_IP6_CONFIG_ROUTES); -} - -/** - * nm_setting_ip6_config_get_route_metric: - * @setting: the #NMSettingIP6Config - * - * Returns the value contained in the #NMSettingIP6Config:route-metric - * property. - * - * Returns: the route metric that is used for IPv6 routes that don't explicitly - * specify a metric. See #NMSettingIP6Config:route-metric for more details. - * - * Since: 1.0 - **/ -gint64 -nm_setting_ip6_config_get_route_metric (NMSettingIP6Config *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), -1); - - return NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->route_metric; -} - -/** - * nm_setting_ip6_config_get_ignore_auto_routes: - * @setting: the #NMSettingIP6Config - * - * Returns the value contained in the #NMSettingIP6Config:ignore-auto-routes - * property. - * - * Returns: %TRUE if automatically configured (ie via DHCP) routes should be - * ignored. - **/ -gboolean -nm_setting_ip6_config_get_ignore_auto_routes (NMSettingIP6Config *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), FALSE); - - return NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->ignore_auto_routes; -} - -/** - * nm_setting_ip6_config_get_ignore_auto_dns: - * @setting: the #NMSettingIP6Config - * - * Returns the value contained in the #NMSettingIP6Config:ignore-auto-dns - * property. - * - * Returns: %TRUE if automatically configured (ie via DHCP or router - * advertisements) DNS information should be ignored. - **/ -gboolean -nm_setting_ip6_config_get_ignore_auto_dns (NMSettingIP6Config *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), FALSE); - - return NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->ignore_auto_dns; -} - -/** - * nm_setting_ip6_config_get_never_default: - * @setting: the #NMSettingIP6Config - * - * Returns the value contained in the #NMSettingIP6Config:never-default - * property. - * - * Returns: %TRUE if this connection should never be the default connection - * for IPv6 addressing - **/ -gboolean -nm_setting_ip6_config_get_never_default (NMSettingIP6Config *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), FALSE); - - return NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->never_default; -} - -/** - * nm_setting_ip6_config_get_may_fail: - * @setting: the #NMSettingIP6Config - * - * Returns the value contained in the #NMSettingIP6Config:may-fail - * property. - * - * Returns: %TRUE if this connection doesn't require IPv6 addressing to complete - * for the connection to succeed. - **/ -gboolean -nm_setting_ip6_config_get_may_fail (NMSettingIP6Config *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), FALSE); - - return NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->may_fail; -} - -/** - * nm_setting_ip6_config_get_ip6_privacy: - * @setting: the #NMSettingIP6Config - * - * Returns the value contained in the #NMSettingIP6Config:ip6-privacy - * property. - * - * Returns: IPv6 Privacy Extensions configuration value (#NMSettingIP6ConfigPrivacy). - **/ -NMSettingIP6ConfigPrivacy -nm_setting_ip6_config_get_ip6_privacy (NMSettingIP6Config *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN); - - return NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->ip6_privacy; -} - -static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - NMSettingIP6ConfigPrivate *priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); - GSList *iter; - int i; - - if (!priv->method) { - g_set_error_literal (error, - NM_SETTING_IP6_CONFIG_ERROR, - NM_SETTING_IP6_CONFIG_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_IP6_CONFIG_SETTING_NAME, NM_SETTING_IP6_CONFIG_METHOD); - return FALSE; - } - - if (!strcmp (priv->method, NM_SETTING_IP6_CONFIG_METHOD_MANUAL)) { - if (!priv->addresses) { - g_set_error (error, - NM_SETTING_IP6_CONFIG_ERROR, - NM_SETTING_IP6_CONFIG_ERROR_MISSING_PROPERTY, - _("this property cannot be empty for '%s=%s'"), - NM_SETTING_IP6_CONFIG_METHOD, priv->method); - g_prefix_error (error, "%s.%s: ", NM_SETTING_IP6_CONFIG_SETTING_NAME, NM_SETTING_IP6_CONFIG_ADDRESSES); - return FALSE; - } - } else if ( !strcmp (priv->method, NM_SETTING_IP6_CONFIG_METHOD_IGNORE) - || !strcmp (priv->method, NM_SETTING_IP6_CONFIG_METHOD_LINK_LOCAL) - || !strcmp (priv->method, NM_SETTING_IP6_CONFIG_METHOD_SHARED)) { - if (g_slist_length (priv->dns)) { - g_set_error (error, - NM_SETTING_IP6_CONFIG_ERROR, - NM_SETTING_IP6_CONFIG_ERROR_NOT_ALLOWED_FOR_METHOD, - _("this property is not allowed for '%s=%s'"), - NM_SETTING_IP6_CONFIG_METHOD, priv->method); - g_prefix_error (error, "%s.%s: ", NM_SETTING_IP6_CONFIG_SETTING_NAME, NM_SETTING_IP6_CONFIG_DNS); - return FALSE; - } - - if (g_slist_length (priv->dns_search)) { - g_set_error (error, - NM_SETTING_IP6_CONFIG_ERROR, - NM_SETTING_IP6_CONFIG_ERROR_NOT_ALLOWED_FOR_METHOD, - _("this property is not allowed for '%s=%s'"), - NM_SETTING_IP6_CONFIG_METHOD, priv->method); - g_prefix_error (error, "%s.%s: ", NM_SETTING_IP6_CONFIG_SETTING_NAME, NM_SETTING_IP6_CONFIG_DNS_SEARCH); - return FALSE; - } - - /* Shared allows IP addresses; link-local and disabled do not */ - if (strcmp (priv->method, NM_SETTING_IP6_CONFIG_METHOD_SHARED) != 0) { - if (g_slist_length (priv->addresses)) { - g_set_error (error, - NM_SETTING_IP6_CONFIG_ERROR, - NM_SETTING_IP6_CONFIG_ERROR_NOT_ALLOWED_FOR_METHOD, - _("this property is not allowed for '%s=%s'"), - NM_SETTING_IP6_CONFIG_METHOD, priv->method); - g_prefix_error (error, "%s.%s: ", NM_SETTING_IP6_CONFIG_SETTING_NAME, NM_SETTING_IP6_CONFIG_ADDRESSES); - return FALSE; - } - } - } else if ( !strcmp (priv->method, NM_SETTING_IP6_CONFIG_METHOD_AUTO) - || !strcmp (priv->method, NM_SETTING_IP6_CONFIG_METHOD_DHCP)) { - /* nothing to do */ - } else { - g_set_error_literal (error, - NM_SETTING_IP6_CONFIG_ERROR, - NM_SETTING_IP6_CONFIG_ERROR_INVALID_PROPERTY, - _("property is invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_IP6_CONFIG_SETTING_NAME, NM_SETTING_IP6_CONFIG_METHOD); - return FALSE; - } - - if (priv->dhcp_hostname && !strlen (priv->dhcp_hostname)) { - g_set_error_literal (error, - NM_SETTING_IP6_CONFIG_ERROR, - NM_SETTING_IP6_CONFIG_ERROR_INVALID_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_IP6_CONFIG_SETTING_NAME, NM_SETTING_IP6_CONFIG_DHCP_HOSTNAME); - return FALSE; - } - - /* Validate addresses */ - for (iter = priv->addresses, i = 0; iter; iter = g_slist_next (iter), i++) { - NMIP6Address *addr = (NMIP6Address *) iter->data; - guint32 prefix = nm_ip6_address_get_prefix (addr); - - if (IN6_IS_ADDR_UNSPECIFIED (nm_ip6_address_get_address (addr))) { - g_set_error (error, - NM_SETTING_IP6_CONFIG_ERROR, - NM_SETTING_IP6_CONFIG_ERROR_INVALID_PROPERTY, - _("%d. IPv6 address is invalid"), - i+1); - g_prefix_error (error, "%s.%s: ", NM_SETTING_IP6_CONFIG_SETTING_NAME, NM_SETTING_IP6_CONFIG_ADDRESSES); - return FALSE; - } - - if (!prefix || prefix > 128) { - g_set_error (error, - NM_SETTING_IP6_CONFIG_ERROR, - NM_SETTING_IP6_CONFIG_ERROR_INVALID_PROPERTY, - _("%d. IPv6 address has invalid prefix"), - i+1); - g_prefix_error (error, "%s.%s: ", NM_SETTING_IP6_CONFIG_SETTING_NAME, NM_SETTING_IP6_CONFIG_ADDRESSES); - return FALSE; - } - } - - /* Validate routes */ - for (iter = priv->routes, i = 0; iter; iter = g_slist_next (iter), i++) { - NMIP6Route *route = (NMIP6Route *) iter->data; - guint32 prefix = nm_ip6_route_get_prefix (route); - - if (!prefix || prefix > 128) { - g_set_error (error, - NM_SETTING_IP6_CONFIG_ERROR, - NM_SETTING_IP6_CONFIG_ERROR_INVALID_PROPERTY, - _("%d. route has invalid prefix"), - i+1); - g_prefix_error (error, "%s.%s: ", NM_SETTING_IP6_CONFIG_SETTING_NAME, NM_SETTING_IP6_CONFIG_ROUTES); - return FALSE; - } - } - - return TRUE; -} - -static void -nm_setting_ip6_config_init (NMSettingIP6Config *setting) -{ -} - -static void -finalize (GObject *object) -{ - NMSettingIP6ConfigPrivate *priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (object); - - g_free (priv->method); - g_free (priv->dhcp_hostname); - - g_slist_free_full (priv->dns, g_free); - g_slist_free_full (priv->dns_search, g_free); - g_slist_free_full (priv->addresses, g_free); - g_slist_free_full (priv->routes, g_free); - - G_OBJECT_CLASS (nm_setting_ip6_config_parent_class)->finalize (object); -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSettingIP6ConfigPrivate *priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_METHOD: - g_free (priv->method); - priv->method = g_value_dup_string (value); - break; - case PROP_DNS: - g_slist_free_full (priv->dns, g_free); - priv->dns = nm_utils_ip6_dns_from_gvalue (value); - break; - case PROP_DNS_SEARCH: - g_slist_free_full (priv->dns_search, g_free); - priv->dns_search = g_value_dup_boxed (value); - break; - case PROP_ADDRESSES: - g_slist_free_full (priv->addresses, g_free); - priv->addresses = nm_utils_ip6_addresses_from_gvalue (value); - break; - case PROP_ROUTES: - g_slist_free_full (priv->routes, g_free); - priv->routes = nm_utils_ip6_routes_from_gvalue (value); - break; - case PROP_ROUTE_METRIC: - priv->route_metric = g_value_get_int64 (value); - break; - case PROP_IGNORE_AUTO_ROUTES: - priv->ignore_auto_routes = g_value_get_boolean (value); - break; - case PROP_IGNORE_AUTO_DNS: - priv->ignore_auto_dns = g_value_get_boolean (value); - break; - case PROP_DHCP_HOSTNAME: - g_free (priv->dhcp_hostname); - priv->dhcp_hostname = g_value_dup_string (value); - break; - case PROP_NEVER_DEFAULT: - priv->never_default = g_value_get_boolean (value); - break; - case PROP_MAY_FAIL: - priv->may_fail = g_value_get_boolean (value); - break; - case PROP_IP6_PRIVACY: - priv->ip6_privacy = g_value_get_int (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSettingIP6ConfigPrivate *priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_METHOD: - g_value_set_string (value, priv->method); - break; - case PROP_DNS: - nm_utils_ip6_dns_to_gvalue (priv->dns, value); - break; - case PROP_DNS_SEARCH: - g_value_set_boxed (value, priv->dns_search); - break; - case PROP_ADDRESSES: - nm_utils_ip6_addresses_to_gvalue (priv->addresses, value); - break; - case PROP_ROUTES: - nm_utils_ip6_routes_to_gvalue (priv->routes, value); - break; - case PROP_ROUTE_METRIC: - g_value_set_int64 (value, priv->route_metric); - break; - case PROP_IGNORE_AUTO_ROUTES: - g_value_set_boolean (value, priv->ignore_auto_routes); - break; - case PROP_IGNORE_AUTO_DNS: - g_value_set_boolean (value, priv->ignore_auto_dns); - break; - case PROP_DHCP_HOSTNAME: - g_value_set_string (value, priv->dhcp_hostname); - break; - case PROP_NEVER_DEFAULT: - g_value_set_boolean (value, priv->never_default); - break; - case PROP_MAY_FAIL: - g_value_set_boolean (value, priv->may_fail); - break; - case PROP_IP6_PRIVACY: - g_value_set_int (value, priv->ip6_privacy); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_setting_ip6_config_class_init (NMSettingIP6ConfigClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingIP6ConfigPrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->finalize = finalize; - parent_class->verify = verify; - - /* Properties */ - /** - * NMSettingIP6Config:method: - * - * IPv6 configuration method. If "auto" is specified then the appropriate - * automatic method (PPP, router advertisement, etc) is used for the device - * and most other properties can be left unset. To force the use of DHCP - * only, specify "dhcp"; this method is only valid for Ethernet- based - * hardware. If "link-local" is specified, then an IPv6 link-local address - * will be assigned to the interface. If "manual" is specified, static IP - * addressing is used and at least one IP address must be given in the - * "addresses" property. If "ignore" is specified, IPv6 configuration is - * not done. This property must be set. Note: the "shared" method is not - * yet supported. - **/ - g_object_class_install_property - (object_class, PROP_METHOD, - g_param_spec_string (NM_SETTING_IP6_CONFIG_METHOD, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingIP6Config:dhcp-hostname: - * - * The specified name will be sent to the DHCP server when acquiring a - * lease. - * - * Since: 0.9.8 - **/ - g_object_class_install_property - (object_class, PROP_DHCP_HOSTNAME, - g_param_spec_string (NM_SETTING_IP6_CONFIG_DHCP_HOSTNAME, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingIP6Config:dns: - * - * Array of DNS servers, where each member of the array is a byte array - * containing the IPv6 address of the DNS server (in network byte order). - * For the "auto" method, these DNS servers are appended to those (if any) - * returned by automatic configuration. DNS servers cannot be used with the - * "shared" or "link-local" methods as there is no usptream network. In all - * other methods, these DNS servers are used as the only DNS servers for - * this connection. - **/ - g_object_class_install_property - (object_class, PROP_DNS, - _nm_param_spec_specialized (NM_SETTING_IP6_CONFIG_DNS, "", "", - DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UCHAR, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingIP6Config:dns-search: - * - * List of DNS search domains. For the "auto" method, these search domains - * are appended to those returned by automatic configuration. Search domains - * cannot be used with the "shared" or "link-local" methods as there is no - * upstream network. In all other methods, these search domains are used as - * the only search domains for this connection. - **/ - g_object_class_install_property - (object_class, PROP_DNS_SEARCH, - _nm_param_spec_specialized (NM_SETTING_IP6_CONFIG_DNS_SEARCH, "", "", - DBUS_TYPE_G_LIST_OF_STRING, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingIP6Config:addresses: - * - * Array of IPv6 address structures. Each IPv6 address structure is - * composed of 3 members, the first being a byte array containing the IPv6 - * address (network byte order), the second a 32-bit integer containing the - * IPv6 address prefix, and the third a byte array containing the IPv6 - * address (network byte order) of the gateway associated with this address, - * if any. If no gateway is given, the third element should be given as all - * zeros. For the "auto" method, given IP addresses are appended to those - * returned by automatic configuration. Addresses cannot be used with the - * "shared" or "link-local" methods as the interface is automatically - * assigned an address with these methods. - **/ - g_object_class_install_property - (object_class, PROP_ADDRESSES, - _nm_param_spec_specialized (NM_SETTING_IP6_CONFIG_ADDRESSES, "", "", - DBUS_TYPE_G_ARRAY_OF_IP6_ADDRESS, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingIP6Config:routes: - * - * Array of IPv6 route structures. Each IPv6 route structure is composed of - * 4 members; the first being the destination IPv6 network or address - * (network byte order) as a byte array, the second the destination network - * or address IPv6 prefix, the third being the next-hop IPv6 address - * (network byte order) if any, and the fourth being the route metric. For - * the "auto" method, given IP routes are appended to those returned by - * automatic configuration. Routes cannot be used with the "shared" or - * "link-local" methods because there is no upstream network. - **/ - g_object_class_install_property - (object_class, PROP_ROUTES, - _nm_param_spec_specialized (NM_SETTING_IP6_CONFIG_ROUTES, "", "", - DBUS_TYPE_G_ARRAY_OF_IP6_ROUTE, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingIP6Config:route-metric: - * - * The default metric for routes that don't explicitly specify a metric. - * The default value -1 means that the metric is chosen automatically - * based on the device type. - * The metric applies to dynamic routes, manual (static) routes that - * don't have an explicit metric setting, address prefix routes, and - * the default route. - * As the linux kernel replaces zero (0) by 1024 (user-default), setting - * this property to 0 means effectively setting it to 1024. - * - * Since: 1.0 - **/ - g_object_class_install_property - (object_class, PROP_ROUTE_METRIC, - g_param_spec_int64 (NM_SETTING_IP6_CONFIG_ROUTE_METRIC, "", "", - -1, G_MAXUINT32, -1, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingIP6Config:ignore-auto-routes: - * - * When the method is set to "auto" or "dhcp" and this property is set to - * %TRUE, automatically configured routes are ignored and only routes - * specified in the #NMSettingIP6Config:routes property, if any, are used. - **/ - g_object_class_install_property - (object_class, PROP_IGNORE_AUTO_ROUTES, - g_param_spec_boolean (NM_SETTING_IP6_CONFIG_IGNORE_AUTO_ROUTES, "", "", - FALSE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingIP6Config:ignore-auto-dns: - * - * When the method is set to "auto" or "dhcp" and this property is set to - * %TRUE, automatically configured nameservers and search domains are - * ignored and only nameservers and search domains specified in the - * #NMSettingIP6Config:dns and #NMSettingIP6Config:dns-search properties, if - * any, are used. - **/ - g_object_class_install_property - (object_class, PROP_IGNORE_AUTO_DNS, - g_param_spec_boolean (NM_SETTING_IP6_CONFIG_IGNORE_AUTO_DNS, "", "", - FALSE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingIP6Config:never-default: - * - * If %TRUE, this connection will never be the default IPv6 connection, - * meaning it will never be assigned the default IPv6 route by - * NetworkManager. - **/ - g_object_class_install_property - (object_class, PROP_NEVER_DEFAULT, - g_param_spec_boolean (NM_SETTING_IP6_CONFIG_NEVER_DEFAULT, "", "", - FALSE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingIP6Config:may-fail: - * - * If %TRUE, allow overall network configuration to proceed even if IPv6 - * configuration times out. Note that at least one IP configuration must - * succeed or overall network configuration will still fail. For example, - * in IPv4-only networks, setting this property to %TRUE allows the overall - * network configuration to succeed if IPv6 configuration fails but IPv4 - * configuration completes successfully. - **/ - g_object_class_install_property - (object_class, PROP_MAY_FAIL, - g_param_spec_boolean (NM_SETTING_IP6_CONFIG_MAY_FAIL, "", "", - TRUE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingIP6Config:ip6-privacy: - * - * Configure IPv6 Privacy Extensions for SLAAC, described in RFC4941. If - * enabled, it makes the kernel generate a temporary IPv6 address in - * addition to the public one generated from MAC address via modified - * EUI-64. This enhances privacy, but could cause problems in some - * applications, on the other hand. The permitted values are: 0: disabled, - * 1: enabled (prefer public address), 2: enabled (prefer temporary - * addresses). - **/ - g_object_class_install_property - (object_class, PROP_IP6_PRIVACY, - g_param_spec_int (NM_SETTING_IP6_CONFIG_IP6_PRIVACY, "", "", - NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN, - NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_TEMP_ADDR, - NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); -} - -/*****************************************************************************/ - -struct NMIP6Address { - guint32 refcount; - struct in6_addr address; - guint32 prefix; - struct in6_addr gateway; -}; - -/** - * nm_ip6_address_new: - * - * Creates and returns a new #NMIP6Address object. - * - * Returns: (transfer full): the new empty #NMIP6Address object - **/ -NMIP6Address * -nm_ip6_address_new (void) -{ - NMIP6Address *address; - - address = g_malloc0 (sizeof (NMIP6Address)); - address->refcount = 1; - return address; -} - -/** - * nm_ip6_address_dup: - * @source: the #NMIP6Address object to copy - * - * Copies a given #NMIP6Address object and returns the copy. - * - * Returns: (transfer full): the copy of the given #NMIP6Address copy - **/ -NMIP6Address * -nm_ip6_address_dup (NMIP6Address *source) -{ - NMIP6Address *address; - - g_return_val_if_fail (source != NULL, NULL); - g_return_val_if_fail (source->refcount > 0, NULL); - - address = nm_ip6_address_new (); - address->prefix = source->prefix; - memcpy (&address->address, &source->address, sizeof (struct in6_addr)); - memcpy (&address->gateway, &source->gateway, sizeof (struct in6_addr)); - - return address; -} - -/** - * nm_ip6_address_ref: - * @address: the #NMIP6Address - * - * Increases the reference count of the object. - **/ -void -nm_ip6_address_ref (NMIP6Address *address) -{ - g_return_if_fail (address != NULL); - g_return_if_fail (address->refcount > 0); - - address->refcount++; -} - -/** - * nm_ip6_address_unref: - * @address: the #NMIP6Address - * - * Decreases the reference count of the object. If the reference count - * reaches zero, the object will be destroyed. - **/ -void -nm_ip6_address_unref (NMIP6Address *address) -{ - g_return_if_fail (address != NULL); - g_return_if_fail (address->refcount > 0); - - address->refcount--; - if (address->refcount == 0) { - memset (address, 0, sizeof (NMIP6Address)); - g_free (address); - } -} - -/** - * nm_ip6_address_compare: - * @address: the #NMIP6Address - * @other: the #NMIP6Address to compare @address to. - * - * Determines if two #NMIP6Address objects contain the same values. - * - * Returns: %TRUE if the objects contain the same values, %FALSE if they do not. - **/ -gboolean -nm_ip6_address_compare (NMIP6Address *address, NMIP6Address *other) -{ - g_return_val_if_fail (address != NULL, FALSE); - g_return_val_if_fail (address->refcount > 0, FALSE); - - g_return_val_if_fail (other != NULL, FALSE); - g_return_val_if_fail (other->refcount > 0, FALSE); - - if ( memcmp (&address->address, &other->address, sizeof (struct in6_addr)) - || address->prefix != other->prefix - || memcmp (&address->gateway, &other->gateway, sizeof (struct in6_addr))) - return FALSE; - return TRUE; -} - -/** - * nm_ip6_address_get_address: - * @address: the #NMIP6Address - * - * Gets the IPv6 address property of this address object. - * - * Returns: (array fixed-size=16) (element-type guint8) (transfer none): - * the IPv6 address - **/ -const struct in6_addr * -nm_ip6_address_get_address (NMIP6Address *address) -{ - g_return_val_if_fail (address != NULL, NULL); - g_return_val_if_fail (address->refcount > 0, NULL); - - return &address->address; -} - -/** - * nm_ip6_address_set_address: - * @address: the #NMIP6Address - * @addr: the IPv6 address - * - * Sets the IPv6 address property of this object. - **/ -void -nm_ip6_address_set_address (NMIP6Address *address, const struct in6_addr *addr) -{ - g_return_if_fail (address != NULL); - g_return_if_fail (address->refcount > 0); - g_return_if_fail (addr != NULL); - - memcpy (&address->address, addr, sizeof (struct in6_addr)); -} - -/** - * nm_ip6_address_get_prefix: - * @address: the #NMIP6Address - * - * Gets the IPv6 address prefix property of this address object. - * - * Returns: the IPv6 address prefix - **/ -guint32 -nm_ip6_address_get_prefix (NMIP6Address *address) -{ - g_return_val_if_fail (address != NULL, 0); - g_return_val_if_fail (address->refcount > 0, 0); - - return address->prefix; -} - -/** - * nm_ip6_address_set_prefix: - * @address: the #NMIP6Address - * @prefix: the address prefix, a number between 0 and 128 inclusive - * - * Sets the IPv6 address prefix. - **/ -void -nm_ip6_address_set_prefix (NMIP6Address *address, guint32 prefix) -{ - g_return_if_fail (address != NULL); - g_return_if_fail (address->refcount > 0); - g_return_if_fail (prefix <= 128); - g_return_if_fail (prefix > 0); - - address->prefix = prefix; -} - -/** - * nm_ip6_address_get_gateway: - * @address: the #NMIP6Address - * - * Gets the IPv6 default gateway property of this address object. - * - * Returns: (array fixed-size=16) (element-type guint8) (transfer none): - * the IPv6 gateway address - **/ -const struct in6_addr * -nm_ip6_address_get_gateway (NMIP6Address *address) -{ - g_return_val_if_fail (address != NULL, NULL); - g_return_val_if_fail (address->refcount > 0, NULL); - - return &address->gateway; -} - -/** - * nm_ip6_address_set_gateway: - * @address: the #NMIP6Address - * @gateway: the IPv6 default gateway - * - * Sets the IPv6 default gateway property of this address object. - **/ -void -nm_ip6_address_set_gateway (NMIP6Address *address, const struct in6_addr *gateway) -{ - g_return_if_fail (address != NULL); - g_return_if_fail (address->refcount > 0); - g_return_if_fail (gateway != NULL); - - memcpy (&address->gateway, gateway, sizeof (struct in6_addr)); -} - -/*****************************************************************************/ - -struct NMIP6Route { - guint32 refcount; - - struct in6_addr dest; - guint32 prefix; - struct in6_addr next_hop; - guint32 metric; /* lower metric == more preferred */ -}; - -/** - * nm_ip6_route_new: - * - * Creates and returns a new #NMIP6Route object. - * - * Returns: (transfer full): the new empty #NMIP6Route object - **/ -NMIP6Route * -nm_ip6_route_new (void) -{ - NMIP6Route *route; - - route = g_malloc0 (sizeof (NMIP6Route)); - route->refcount = 1; - return route; -} - -/** - * nm_ip6_route_dup: - * @source: the #NMIP6Route object to copy - * - * Copies a given #NMIP6Route object and returns the copy. - * - * Returns: (transfer full): the copy of the given #NMIP6Route copy - **/ -NMIP6Route * -nm_ip6_route_dup (NMIP6Route *source) -{ - NMIP6Route *route; - - g_return_val_if_fail (source != NULL, NULL); - g_return_val_if_fail (source->refcount > 0, NULL); - - route = nm_ip6_route_new (); - route->prefix = source->prefix; - route->metric = source->metric; - memcpy (&route->dest, &source->dest, sizeof (struct in6_addr)); - memcpy (&route->next_hop, &source->next_hop, sizeof (struct in6_addr)); - - return route; -} - -/** - * nm_ip6_route_ref: - * @route: the #NMIP6Route - * - * Increases the reference count of the object. - **/ -void -nm_ip6_route_ref (NMIP6Route *route) -{ - g_return_if_fail (route != NULL); - g_return_if_fail (route->refcount > 0); - - route->refcount++; -} - -/** - * nm_ip6_route_unref: - * @route: the #NMIP6Route - * - * Decreases the reference count of the object. If the reference count - * reaches zero, the object will be destroyed. - **/ -void -nm_ip6_route_unref (NMIP6Route *route) -{ - g_return_if_fail (route != NULL); - g_return_if_fail (route->refcount > 0); - - route->refcount--; - if (route->refcount == 0) { - memset (route, 0, sizeof (NMIP6Route)); - g_free (route); - } -} - -/** - * nm_ip6_route_compare: - * @route: the #NMIP6Route - * @other: the #NMIP6Route to compare @route to. - * - * Determines if two #NMIP6Route objects contain the same values. - * - * Returns: %TRUE if the objects contain the same values, %FALSE if they do not. - **/ -gboolean -nm_ip6_route_compare (NMIP6Route *route, NMIP6Route *other) -{ - g_return_val_if_fail (route != NULL, FALSE); - g_return_val_if_fail (route->refcount > 0, FALSE); - - g_return_val_if_fail (other != NULL, FALSE); - g_return_val_if_fail (other->refcount > 0, FALSE); - - if ( memcmp (&route->dest, &other->dest, sizeof (struct in6_addr)) - || route->prefix != other->prefix - || memcmp (&route->next_hop, &other->next_hop, sizeof (struct in6_addr)) - || route->metric != other->metric) - return FALSE; - return TRUE; -} - -/** - * nm_ip6_route_get_dest: - * @route: the #NMIP6Route - * - * Gets the IPv6 destination address property of this route object. - * - * Returns: (array fixed-size=16) (element-type guint8) (transfer none): - * the IPv6 address of destination - **/ -const struct in6_addr * -nm_ip6_route_get_dest (NMIP6Route *route) -{ - g_return_val_if_fail (route != NULL, NULL); - g_return_val_if_fail (route->refcount > 0, NULL); - - return &route->dest; -} - -/** - * nm_ip6_route_set_dest: - * @route: the #NMIP6Route - * @dest: the destination address - * - * Sets the IPv6 destination address property of this route object. - **/ -void -nm_ip6_route_set_dest (NMIP6Route *route, const struct in6_addr *dest) -{ - g_return_if_fail (route != NULL); - g_return_if_fail (route->refcount > 0); - g_return_if_fail (dest != NULL); - - memcpy (&route->dest, dest, sizeof (struct in6_addr)); -} - -/** - * nm_ip6_route_get_prefix: - * @route: the #NMIP6Route - * - * Gets the IPv6 prefix (ie "32" or "64" etc) of this route. - * - * Returns: the IPv6 prefix - **/ -guint32 -nm_ip6_route_get_prefix (NMIP6Route *route) -{ - g_return_val_if_fail (route != NULL, 0); - g_return_val_if_fail (route->refcount > 0, 0); - - return route->prefix; -} - -/** - * nm_ip6_route_set_prefix: - * @route: the #NMIP6Route - * @prefix: the prefix, a number between 1 and 128 inclusive - * - * Sets the IPv6 prefix of this route. - **/ -void -nm_ip6_route_set_prefix (NMIP6Route *route, guint32 prefix) -{ - g_return_if_fail (route != NULL); - g_return_if_fail (route->refcount > 0); - g_return_if_fail (prefix <= 128); - g_return_if_fail (prefix > 0); - - route->prefix = prefix; -} - -/** - * nm_ip6_route_get_next_hop: - * @route: the #NMIP6Route - * - * Gets the IPv6 address of the next hop of this route. - * - * Returns: (array fixed-size=16) (element-type guint8) (transfer none): - * the IPv6 address of next hop - **/ -const struct in6_addr * -nm_ip6_route_get_next_hop (NMIP6Route *route) -{ - g_return_val_if_fail (route != NULL, NULL); - g_return_val_if_fail (route->refcount > 0, NULL); - - return &route->next_hop; -} - -/** - * nm_ip6_route_set_next_hop: - * @route: the #NMIP6Route - * @next_hop: the IPv6 address of the next hop - * - * Sets the IPv6 address of the next hop of this route. - **/ -void -nm_ip6_route_set_next_hop (NMIP6Route *route, const struct in6_addr *next_hop) -{ - g_return_if_fail (route != NULL); - g_return_if_fail (route->refcount > 0); - g_return_if_fail (next_hop != NULL); - - memcpy (&route->next_hop, next_hop, sizeof (struct in6_addr)); -} - -/** - * nm_ip6_route_get_metric: - * @route: the #NMIP6Route - * - * Gets the route metric property of this route object; lower values indicate - * "better" or more preferred routes. - * - * Returns: the route metric - **/ -guint32 -nm_ip6_route_get_metric (NMIP6Route *route) -{ - g_return_val_if_fail (route != NULL, 0); - g_return_val_if_fail (route->refcount > 0, 0); - - return route->metric; -} - -/** - * nm_ip6_route_set_metric: - * @route: the #NMIP6Route - * @metric: the route metric - * - * Sets the route metric property of this route object; lower values indicate - * "better" or more preferred routes. - **/ -void -nm_ip6_route_set_metric (NMIP6Route *route, guint32 metric) -{ - g_return_if_fail (route != NULL); - g_return_if_fail (route->refcount > 0); - - route->metric = metric; -} diff --git a/libnm-util/nm-setting-ip6-config.h b/libnm-util/nm-setting-ip6-config.h deleted file mode 100644 index 2a32a92035..0000000000 --- a/libnm-util/nm-setting-ip6-config.h +++ /dev/null @@ -1,258 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2014 Red Hat, Inc. - */ - -#ifndef NM_SETTING_IP6_CONFIG_H -#define NM_SETTING_IP6_CONFIG_H - -#include <arpa/inet.h> - -#include "nm-setting.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SETTING_IP6_CONFIG (nm_setting_ip6_config_get_type ()) -#define NM_SETTING_IP6_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_IP6_CONFIG, NMSettingIP6Config)) -#define NM_SETTING_IP6_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_IP6CONFIG, NMSettingIP6ConfigClass)) -#define NM_IS_SETTING_IP6_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_IP6_CONFIG)) -#define NM_IS_SETTING_IP6_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_IP6_CONFIG)) -#define NM_SETTING_IP6_CONFIG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_IP6_CONFIG, NMSettingIP6ConfigClass)) - -#define NM_SETTING_IP6_CONFIG_SETTING_NAME "ipv6" - -/** - * NMSettingIP6ConfigError: - * @NM_SETTING_IP6_CONFIG_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_IP6_CONFIG_ERROR_INVALID_PROPERTY: the property was invalid - * @NM_SETTING_IP6_CONFIG_ERROR_MISSING_PROPERTY: the property was missing and is - * required - * @NM_SETTING_IP6_CONFIG_ERROR_NOT_ALLOWED_FOR_METHOD: the property's value is - * not valid with the given IPv6 method - */ -typedef enum { - NM_SETTING_IP6_CONFIG_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_SETTING_IP6_CONFIG_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/ - NM_SETTING_IP6_CONFIG_ERROR_MISSING_PROPERTY, /*< nick=MissingProperty >*/ - NM_SETTING_IP6_CONFIG_ERROR_NOT_ALLOWED_FOR_METHOD /*< nick=NotAllowedForMethod >*/ -} NMSettingIP6ConfigError; - -#define NM_SETTING_IP6_CONFIG_ERROR nm_setting_ip6_config_error_quark () -GQuark nm_setting_ip6_config_error_quark (void); - -#define NM_SETTING_IP6_CONFIG_METHOD "method" -#define NM_SETTING_IP6_CONFIG_DNS "dns" -#define NM_SETTING_IP6_CONFIG_DNS_SEARCH "dns-search" -#define NM_SETTING_IP6_CONFIG_ADDRESSES "addresses" -#define NM_SETTING_IP6_CONFIG_ROUTES "routes" -#define NM_SETTING_IP6_CONFIG_ROUTE_METRIC "route-metric" -#define NM_SETTING_IP6_CONFIG_IGNORE_AUTO_ROUTES "ignore-auto-routes" -#define NM_SETTING_IP6_CONFIG_IGNORE_AUTO_DNS "ignore-auto-dns" -#define NM_SETTING_IP6_CONFIG_NEVER_DEFAULT "never-default" -#define NM_SETTING_IP6_CONFIG_MAY_FAIL "may-fail" -#define NM_SETTING_IP6_CONFIG_IP6_PRIVACY "ip6-privacy" -#define NM_SETTING_IP6_CONFIG_DHCP_HOSTNAME "dhcp-hostname" - -/** - * NM_SETTING_IP6_CONFIG_METHOD_IGNORE: - * - * IPv6 is not required or is handled by some other mechanism, and NetworkManager - * should not configure IPv6 for this connection. - */ -#define NM_SETTING_IP6_CONFIG_METHOD_IGNORE "ignore" - -/** - * NM_SETTING_IP6_CONFIG_METHOD_AUTO: - * - * IPv6 configuration should be automatically determined via a method appropriate - * for the hardware interface, ie router advertisements, DHCP, or PPP or some - * other device-specific manner. - */ -#define NM_SETTING_IP6_CONFIG_METHOD_AUTO "auto" - -/** - * NM_SETTING_IP6_CONFIG_METHOD_DHCP: - * - * IPv6 configuration should be automatically determined via DHCPv6 only and - * router advertisements should be ignored. - */ -#define NM_SETTING_IP6_CONFIG_METHOD_DHCP "dhcp" - -/** - * NM_SETTING_IP6_CONFIG_METHOD_LINK_LOCAL: - * - * IPv6 configuration should be automatically configured for link-local-only - * operation. - */ -#define NM_SETTING_IP6_CONFIG_METHOD_LINK_LOCAL "link-local" - -/** - * NM_SETTING_IP6_CONFIG_METHOD_MANUAL: - * - * All necessary IPv6 configuration (addresses, prefix, DNS, etc) is specified - * in the setting's properties. - */ -#define NM_SETTING_IP6_CONFIG_METHOD_MANUAL "manual" - -/** - * NM_SETTING_IP6_CONFIG_METHOD_SHARED: - * - * This connection specifies configuration that allows other computers to - * connect through it to the default network (usually the Internet). The - * connection's interface will be assigned a private address, and router - * advertisements, a caching DNS server, and Network Address Translation (NAT) - * functionality will be started on this connection's interface to allow other - * devices to connect through that interface to the default network. (not yet - * supported for IPv6) - */ -#define NM_SETTING_IP6_CONFIG_METHOD_SHARED "shared" - -/** - * NMSettingIP6ConfigPrivacy: - * @NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN: unknown or no value specified - * @NM_SETTING_IP6_CONFIG_PRIVACY_DISABLED: IPv6 Privacy Extensions are disabled - * @NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_PUBLIC_ADDR: IPv6 Privacy Extensions - * are enabled, but public addresses are preferred over temporary addresses - * @NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_TEMP_ADDR: IPv6 Privacy Extensions - * are enabled and temporary addresses are preferred over public addresses - * - * #NMSettingIP6ConfigPrivacy values indicate if and how IPv6 Privacy - * Extensions are used (RFC4941). - */ -typedef enum { - NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN = -1, - NM_SETTING_IP6_CONFIG_PRIVACY_DISABLED = 0, - NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_PUBLIC_ADDR = 1, - NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_TEMP_ADDR = 2 -} NMSettingIP6ConfigPrivacy; - -typedef struct NMIP6Address NMIP6Address; - -GType nm_ip6_address_get_type (void); - -NMIP6Address * nm_ip6_address_new (void); -NMIP6Address * nm_ip6_address_dup (NMIP6Address *source); -void nm_ip6_address_ref (NMIP6Address *address); -void nm_ip6_address_unref (NMIP6Address *address); -/* Return TRUE if addresses are identical */ -gboolean nm_ip6_address_compare (NMIP6Address *address, NMIP6Address *other); - -const struct in6_addr *nm_ip6_address_get_address (NMIP6Address *address); -void nm_ip6_address_set_address (NMIP6Address *address, - const struct in6_addr *addr); - -guint32 nm_ip6_address_get_prefix (NMIP6Address *address); -void nm_ip6_address_set_prefix (NMIP6Address *address, - guint32 prefix); - -const struct in6_addr *nm_ip6_address_get_gateway (NMIP6Address *address); -void nm_ip6_address_set_gateway (NMIP6Address *address, - const struct in6_addr *gateway); - -typedef struct NMIP6Route NMIP6Route; - -GType nm_ip6_route_get_type (void); - -NMIP6Route * nm_ip6_route_new (void); -NMIP6Route * nm_ip6_route_dup (NMIP6Route *source); -void nm_ip6_route_ref (NMIP6Route *route); -void nm_ip6_route_unref (NMIP6Route *route); -/* Return TRUE if routes are identical */ -gboolean nm_ip6_route_compare (NMIP6Route *route, NMIP6Route *other); - -const struct in6_addr *nm_ip6_route_get_dest (NMIP6Route *route); -void nm_ip6_route_set_dest (NMIP6Route *route, - const struct in6_addr *dest); - -guint32 nm_ip6_route_get_prefix (NMIP6Route *route); -void nm_ip6_route_set_prefix (NMIP6Route *route, - guint32 prefix); - -const struct in6_addr *nm_ip6_route_get_next_hop (NMIP6Route *route); -void nm_ip6_route_set_next_hop (NMIP6Route *route, - const struct in6_addr *next_hop); - -guint32 nm_ip6_route_get_metric (NMIP6Route *route); -void nm_ip6_route_set_metric (NMIP6Route *route, - guint32 metric); - -typedef struct { - NMSetting parent; -} NMSettingIP6Config; - -typedef struct { - NMSettingClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); -} NMSettingIP6ConfigClass; - -GType nm_setting_ip6_config_get_type (void); - -NMSetting * nm_setting_ip6_config_new (void); -const char * nm_setting_ip6_config_get_method (NMSettingIP6Config *setting); - -guint32 nm_setting_ip6_config_get_num_dns (NMSettingIP6Config *setting); -const struct in6_addr *nm_setting_ip6_config_get_dns (NMSettingIP6Config *setting, guint32 i); -gboolean nm_setting_ip6_config_add_dns (NMSettingIP6Config *setting, const struct in6_addr *dns); -void nm_setting_ip6_config_remove_dns (NMSettingIP6Config *setting, guint32 i); -NM_AVAILABLE_IN_0_9_10 -gboolean nm_setting_ip6_config_remove_dns_by_value (NMSettingIP6Config *setting, const struct in6_addr *dns); -void nm_setting_ip6_config_clear_dns (NMSettingIP6Config *setting); - -guint32 nm_setting_ip6_config_get_num_dns_searches (NMSettingIP6Config *setting); -const char * nm_setting_ip6_config_get_dns_search (NMSettingIP6Config *setting, guint32 i); -gboolean nm_setting_ip6_config_add_dns_search (NMSettingIP6Config *setting, const char *dns_search); -void nm_setting_ip6_config_remove_dns_search (NMSettingIP6Config *setting, guint32 i); -NM_AVAILABLE_IN_0_9_10 -gboolean nm_setting_ip6_config_remove_dns_search_by_value (NMSettingIP6Config *setting, const char *dns_search); -void nm_setting_ip6_config_clear_dns_searches (NMSettingIP6Config *setting); - -guint32 nm_setting_ip6_config_get_num_addresses (NMSettingIP6Config *setting); -NMIP6Address * nm_setting_ip6_config_get_address (NMSettingIP6Config *setting, guint32 i); -gboolean nm_setting_ip6_config_add_address (NMSettingIP6Config *setting, NMIP6Address *address); -void nm_setting_ip6_config_remove_address (NMSettingIP6Config *setting, guint32 i); -NM_AVAILABLE_IN_0_9_10 -gboolean nm_setting_ip6_config_remove_address_by_value (NMSettingIP6Config *setting, NMIP6Address *address); -void nm_setting_ip6_config_clear_addresses (NMSettingIP6Config *setting); - -guint32 nm_setting_ip6_config_get_num_routes (NMSettingIP6Config *setting); -NMIP6Route * nm_setting_ip6_config_get_route (NMSettingIP6Config *setting, guint32 i); -gboolean nm_setting_ip6_config_add_route (NMSettingIP6Config *setting, NMIP6Route *route); -void nm_setting_ip6_config_remove_route (NMSettingIP6Config *setting, guint32 i); -NM_AVAILABLE_IN_0_9_10 -gboolean nm_setting_ip6_config_remove_route_by_value (NMSettingIP6Config *setting, NMIP6Route *route); -void nm_setting_ip6_config_clear_routes (NMSettingIP6Config *setting); -gboolean nm_setting_ip6_config_get_ignore_auto_routes (NMSettingIP6Config *setting); - -NM_AVAILABLE_IN_1_0 -gint64 nm_setting_ip6_config_get_route_metric (NMSettingIP6Config *setting); - -gboolean nm_setting_ip6_config_get_ignore_auto_dns (NMSettingIP6Config *setting); -const char * nm_setting_ip6_config_get_dhcp_hostname (NMSettingIP6Config *setting); -gboolean nm_setting_ip6_config_get_never_default (NMSettingIP6Config *setting); -gboolean nm_setting_ip6_config_get_may_fail (NMSettingIP6Config *setting); -NMSettingIP6ConfigPrivacy nm_setting_ip6_config_get_ip6_privacy (NMSettingIP6Config *setting); - -G_END_DECLS - -#endif /* NM_SETTING_IP6_CONFIG_H */ diff --git a/libnm-util/nm-setting-olpc-mesh.c b/libnm-util/nm-setting-olpc-mesh.c deleted file mode 100644 index 7785d860a4..0000000000 --- a/libnm-util/nm-setting-olpc-mesh.c +++ /dev/null @@ -1,275 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2013 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - * Copyright 2009 One Laptop per Child - */ - -#include "nm-default.h" - -#include <string.h> -#include <netinet/ether.h> -#include <dbus/dbus-glib.h> - -#include "NetworkManager.h" -#include "nm-setting-olpc-mesh.h" -#include "nm-param-spec-specialized.h" -#include "nm-utils.h" -#include "nm-dbus-glib-types.h" -#include "nm-utils-private.h" -#include "nm-setting-private.h" - -GQuark -nm_setting_olpc_mesh_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-olpc-mesh-error-quark"); - return quark; -} - -static void nm_setting_olpc_mesh_init (NMSettingOlpcMesh *setting); - -G_DEFINE_TYPE_WITH_CODE (NMSettingOlpcMesh, nm_setting_olpc_mesh, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_OLPC_MESH_SETTING_NAME, - g_define_type_id, - 1, - NM_SETTING_OLPC_MESH_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_OLPC_MESH) - -#define NM_SETTING_OLPC_MESH_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_OLPC_MESH, NMSettingOlpcMeshPrivate)) - -typedef struct { - GByteArray *ssid; - guint32 channel; - GByteArray *dhcp_anycast_addr; -} NMSettingOlpcMeshPrivate; - -enum { - PROP_0, - PROP_SSID, - PROP_CHANNEL, - PROP_DHCP_ANYCAST_ADDRESS, - - LAST_PROP -}; - -/** - * nm_setting_olpc_mesh_new: - * - * Creates a new #NMSettingOlpcMesh object with default values. - * - * Returns: the new empty #NMSettingOlpcMesh object - **/ -NMSetting *nm_setting_olpc_mesh_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_OLPC_MESH, NULL); -} - -static void -nm_setting_olpc_mesh_init (NMSettingOlpcMesh *setting) -{ -} - -const GByteArray * -nm_setting_olpc_mesh_get_ssid (NMSettingOlpcMesh *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_OLPC_MESH (setting), NULL); - - return NM_SETTING_OLPC_MESH_GET_PRIVATE (setting)->ssid; -} - -guint32 -nm_setting_olpc_mesh_get_channel (NMSettingOlpcMesh *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_OLPC_MESH (setting), 0); - - return NM_SETTING_OLPC_MESH_GET_PRIVATE (setting)->channel; -} - -const GByteArray * -nm_setting_olpc_mesh_get_dhcp_anycast_address (NMSettingOlpcMesh *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_OLPC_MESH (setting), NULL); - - return NM_SETTING_OLPC_MESH_GET_PRIVATE (setting)->dhcp_anycast_addr; -} - -static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - NMSettingOlpcMeshPrivate *priv = NM_SETTING_OLPC_MESH_GET_PRIVATE (setting); - - if (!priv->ssid) { - g_set_error_literal (error, - NM_SETTING_OLPC_MESH_ERROR, - NM_SETTING_OLPC_MESH_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_OLPC_MESH_SETTING_NAME, NM_SETTING_OLPC_MESH_SSID); - return FALSE; - } - - if (!priv->ssid->len || priv->ssid->len > 32) { - g_set_error_literal (error, - NM_SETTING_OLPC_MESH_ERROR, - NM_SETTING_OLPC_MESH_ERROR_INVALID_PROPERTY, - _("SSID length is out of range <1-32> bytes")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_OLPC_MESH_SETTING_NAME, NM_SETTING_OLPC_MESH_SSID); - return FALSE; - } - - if (priv->channel == 0 || priv->channel > 13) { - g_set_error (error, - NM_SETTING_OLPC_MESH_ERROR, - NM_SETTING_OLPC_MESH_ERROR_INVALID_PROPERTY, - _("'%d' is not a valid channel"), - priv->channel); - g_prefix_error (error, "%s.%s: ", NM_SETTING_OLPC_MESH_SETTING_NAME, NM_SETTING_OLPC_MESH_CHANNEL); - return FALSE; - } - - if (priv->dhcp_anycast_addr && priv->dhcp_anycast_addr->len != ETH_ALEN) { - g_set_error_literal (error, - NM_SETTING_OLPC_MESH_ERROR, - NM_SETTING_OLPC_MESH_ERROR_INVALID_PROPERTY, - _("property is invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_OLPC_MESH_SETTING_NAME, NM_SETTING_OLPC_MESH_DHCP_ANYCAST_ADDRESS); - return FALSE; - } - - return TRUE; -} - -static void -finalize (GObject *object) -{ - NMSettingOlpcMeshPrivate *priv = NM_SETTING_OLPC_MESH_GET_PRIVATE (object); - - if (priv->ssid) - g_byte_array_free (priv->ssid, TRUE); - if (priv->dhcp_anycast_addr) - g_byte_array_free (priv->dhcp_anycast_addr, TRUE); - - G_OBJECT_CLASS (nm_setting_olpc_mesh_parent_class)->finalize (object); -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSettingOlpcMeshPrivate *priv = NM_SETTING_OLPC_MESH_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_SSID: - if (priv->ssid) - g_byte_array_free (priv->ssid, TRUE); - priv->ssid = g_value_dup_boxed (value); - break; - case PROP_CHANNEL: - priv->channel = g_value_get_uint (value); - break; - case PROP_DHCP_ANYCAST_ADDRESS: - if (priv->dhcp_anycast_addr) - g_byte_array_free (priv->dhcp_anycast_addr, TRUE); - priv->dhcp_anycast_addr = g_value_dup_boxed (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSettingOlpcMesh *setting = NM_SETTING_OLPC_MESH (object); - - switch (prop_id) { - case PROP_SSID: - g_value_set_boxed (value, nm_setting_olpc_mesh_get_ssid (setting)); - break; - case PROP_CHANNEL: - g_value_set_uint (value, nm_setting_olpc_mesh_get_channel (setting)); - break; - case PROP_DHCP_ANYCAST_ADDRESS: - g_value_set_boxed (value, nm_setting_olpc_mesh_get_dhcp_anycast_address (setting)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_setting_olpc_mesh_class_init (NMSettingOlpcMeshClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingOlpcMeshPrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->finalize = finalize; - parent_class->verify = verify; - - /* Properties */ - /** - * NMSettingOlpcMesh:ssid: - * - * SSID of the mesh network to join. - **/ - g_object_class_install_property - (object_class, PROP_SSID, - _nm_param_spec_specialized (NM_SETTING_OLPC_MESH_SSID, "", "", - DBUS_TYPE_G_UCHAR_ARRAY, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingOlpcMesh:channel: - * - * Channel on which the mesh network to join is located. - **/ - g_object_class_install_property - (object_class, PROP_CHANNEL, - g_param_spec_uint (NM_SETTING_OLPC_MESH_CHANNEL, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingOlpcMesh:dhcp-anycast-address: - * - * Anycast DHCP MAC address used when requesting an IP address via DHCP. - * The specific anycast address used determines which DHCP server class - * answers the request. - **/ - g_object_class_install_property - (object_class, PROP_DHCP_ANYCAST_ADDRESS, - _nm_param_spec_specialized (NM_SETTING_OLPC_MESH_DHCP_ANYCAST_ADDRESS, "", "", - DBUS_TYPE_G_UCHAR_ARRAY, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-util/nm-setting-olpc-mesh.h b/libnm-util/nm-setting-olpc-mesh.h deleted file mode 100644 index 1764406ef6..0000000000 --- a/libnm-util/nm-setting-olpc-mesh.h +++ /dev/null @@ -1,82 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - * Copyright 2009 One Laptop per Child - */ - -#ifndef NM_SETTING_OLPC_MESH_H -#define NM_SETTING_OLPC_MESH_H - -#include "nm-setting.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SETTING_OLPC_MESH (nm_setting_olpc_mesh_get_type ()) -#define NM_SETTING_OLPC_MESH(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_OLPC_MESH, NMSettingOlpcMesh)) -#define NM_SETTING_OLPC_MESH_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_OLPC_MESH, NMSettingOlpcMeshClass)) -#define NM_IS_SETTING_OLPC_MESH(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_OLPC_MESH)) -#define NM_IS_SETTING_OLPC_MESH_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_OLPC_MESH)) -#define NM_SETTING_OLPC_MESH_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_OLPC_MESH, NMSettingOlpcMeshClass)) - -#define NM_SETTING_OLPC_MESH_SETTING_NAME "802-11-olpc-mesh" - -/** - * NMSettingOlpcMeshError: - * @NM_SETTING_OLPC_MESH_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_OLPC_MESH_ERROR_INVALID_PROPERTY: the property was invalid - * @NM_SETTING_OLPC_MESH_ERROR_MISSING_PROPERTY: the property was missing and is - * required - */ -typedef enum { - NM_SETTING_OLPC_MESH_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_SETTING_OLPC_MESH_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/ - NM_SETTING_OLPC_MESH_ERROR_MISSING_PROPERTY /*< nick=MissingProperty >*/ -} NMSettingOlpcMeshError; - -#define NM_SETTING_OLPC_MESH_ERROR nm_setting_olpc_mesh_error_quark () -GQuark nm_setting_olpc_mesh_error_quark (void); - -#define NM_SETTING_OLPC_MESH_SSID "ssid" -#define NM_SETTING_OLPC_MESH_CHANNEL "channel" -#define NM_SETTING_OLPC_MESH_DHCP_ANYCAST_ADDRESS "dhcp-anycast-address" - -typedef struct { - NMSetting parent; -} NMSettingOlpcMesh; - -typedef struct { - NMSettingClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); -} NMSettingOlpcMeshClass; - -GType nm_setting_olpc_mesh_get_type (void); - -NMSetting * nm_setting_olpc_mesh_new (void); -const GByteArray *nm_setting_olpc_mesh_get_ssid (NMSettingOlpcMesh *setting); -guint32 nm_setting_olpc_mesh_get_channel (NMSettingOlpcMesh *setting); -const GByteArray *nm_setting_olpc_mesh_get_dhcp_anycast_address (NMSettingOlpcMesh *setting); - -G_END_DECLS - -#endif /* NM_SETTING_OLPC_MESH_H */ diff --git a/libnm-util/nm-setting-ppp.c b/libnm-util/nm-setting-ppp.c deleted file mode 100644 index 3437d1a1f8..0000000000 --- a/libnm-util/nm-setting-ppp.c +++ /dev/null @@ -1,822 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2013 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#include "nm-default.h" - -#include "nm-setting-ppp.h" -#include "nm-setting-private.h" - -/** - * SECTION:nm-setting-ppp - * @short_description: Describes connection properties for devices/networks - * that require PPP to deliver IP capability - * @include: nm-setting-ppp.h - * - * The #NMSettingPPP object is a #NMSetting subclass that describes properties - * necessary for connection to networks that require PPP transport, like PPPoE - * cable and DSL modems and some mobile broadband devices. - **/ - -/** - * nm_setting_ppp_error_quark: - * - * Registers an error quark for #NMSettingPPP if necessary. - * - * Returns: the error quark used for #NMSettingPPP errors. - **/ -GQuark -nm_setting_ppp_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-ppp-error-quark"); - return quark; -} - -G_DEFINE_TYPE_WITH_CODE (NMSettingPPP, nm_setting_ppp, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_PPP_SETTING_NAME, - g_define_type_id, - 3, - NM_SETTING_PPP_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_PPP) - -#define NM_SETTING_PPP_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_PPP, NMSettingPPPPrivate)) - -typedef struct { - gboolean noauth; - gboolean refuse_eap; - gboolean refuse_pap; - gboolean refuse_chap; - gboolean refuse_mschap; - gboolean refuse_mschapv2; - gboolean nobsdcomp; - gboolean nodeflate; - gboolean no_vj_comp; - gboolean require_mppe; - gboolean require_mppe_128; - gboolean mppe_stateful; - gboolean crtscts; - guint32 baud; - guint32 mru; - guint32 mtu; - guint32 lcp_echo_failure; - guint32 lcp_echo_interval; -} NMSettingPPPPrivate; - -enum { - PROP_0, - PROP_NOAUTH, - PROP_REFUSE_EAP, - PROP_REFUSE_PAP, - PROP_REFUSE_CHAP, - PROP_REFUSE_MSCHAP, - PROP_REFUSE_MSCHAPV2, - PROP_NOBSDCOMP, - PROP_NODEFLATE, - PROP_NO_VJ_COMP, - PROP_REQUIRE_MPPE, - PROP_REQUIRE_MPPE_128, - PROP_MPPE_STATEFUL, - PROP_CRTSCTS, - PROP_BAUD, - PROP_MRU, - PROP_MTU, - PROP_LCP_ECHO_FAILURE, - PROP_LCP_ECHO_INTERVAL, - - LAST_PROP -}; - -/** - * nm_setting_ppp_new: - * - * Creates a new #NMSettingPPP object with default values. - * - * Returns: (transfer full): the new empty #NMSettingPPP object - **/ -NMSetting * -nm_setting_ppp_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_PPP, NULL); -} - -/** - * nm_setting_ppp_get_noauth: - * @setting: the #NMSettingPPP - * - * Returns: the #NMSettingPPP:noauth property of the setting - **/ -gboolean -nm_setting_ppp_get_noauth (NMSettingPPP *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_PPP (setting), FALSE); - - return NM_SETTING_PPP_GET_PRIVATE (setting)->noauth; -} - -/** - * nm_setting_ppp_get_refuse_eap: - * @setting: the #NMSettingPPP - * - * Returns: the #NMSettingPPP:refuse-eap property of the setting - **/ -gboolean -nm_setting_ppp_get_refuse_eap (NMSettingPPP *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_PPP (setting), FALSE); - - return NM_SETTING_PPP_GET_PRIVATE (setting)->refuse_eap; -} - -/** - * nm_setting_ppp_get_refuse_pap: - * @setting: the #NMSettingPPP - * - * Returns: the #NMSettingPPP:refuse-pap property of the setting - **/ -gboolean -nm_setting_ppp_get_refuse_pap (NMSettingPPP *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_PPP (setting), FALSE); - - return NM_SETTING_PPP_GET_PRIVATE (setting)->refuse_pap; -} - -/** - * nm_setting_ppp_get_refuse_chap: - * @setting: the #NMSettingPPP - * - * Returns: the #NMSettingPPP:refuse-chap property of the setting - **/ -gboolean -nm_setting_ppp_get_refuse_chap (NMSettingPPP *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_PPP (setting), FALSE); - - return NM_SETTING_PPP_GET_PRIVATE (setting)->refuse_chap; -} - -/** - * nm_setting_ppp_get_refuse_mschap: - * @setting: the #NMSettingPPP - * - * Returns: the #NMSettingPPP:refuse-mschap property of the setting - **/ -gboolean -nm_setting_ppp_get_refuse_mschap (NMSettingPPP *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_PPP (setting), FALSE); - - return NM_SETTING_PPP_GET_PRIVATE (setting)->refuse_mschap; -} - -/** - * nm_setting_ppp_get_refuse_mschapv2: - * @setting: the #NMSettingPPP - * - * Returns: the #NMSettingPPP:refuse-mschapv2 property of the setting - **/ -gboolean -nm_setting_ppp_get_refuse_mschapv2 (NMSettingPPP *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_PPP (setting), FALSE); - - return NM_SETTING_PPP_GET_PRIVATE (setting)->refuse_mschapv2; -} - -/** - * nm_setting_ppp_get_nobsdcomp: - * @setting: the #NMSettingPPP - * - * Returns: the #NMSettingPPP:nobsdcomp property of the setting - **/ -gboolean -nm_setting_ppp_get_nobsdcomp (NMSettingPPP *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_PPP (setting), FALSE); - - return NM_SETTING_PPP_GET_PRIVATE (setting)->nobsdcomp; -} - -/** - * nm_setting_ppp_get_nodeflate: - * @setting: the #NMSettingPPP - * - * Returns: the #NMSettingPPP:nodeflate property of the setting - **/ -gboolean -nm_setting_ppp_get_nodeflate (NMSettingPPP *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_PPP (setting), FALSE); - - return NM_SETTING_PPP_GET_PRIVATE (setting)->nodeflate; -} - -/** - * nm_setting_ppp_get_no_vj_comp: - * @setting: the #NMSettingPPP - * - * Returns: the #NMSettingPPP:no-vj-comp property of the setting - **/ -gboolean -nm_setting_ppp_get_no_vj_comp (NMSettingPPP *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_PPP (setting), FALSE); - - return NM_SETTING_PPP_GET_PRIVATE (setting)->no_vj_comp; -} - -/** - * nm_setting_ppp_get_require_mppe: - * @setting: the #NMSettingPPP - * - * Returns: the #NMSettingPPP:require-mppe property of the setting - **/ -gboolean -nm_setting_ppp_get_require_mppe (NMSettingPPP *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_PPP (setting), FALSE); - - return NM_SETTING_PPP_GET_PRIVATE (setting)->require_mppe; -} - -/** - * nm_setting_ppp_get_require_mppe_128: - * @setting: the #NMSettingPPP - * - * Returns: the #NMSettingPPP:require-mppe-128 property of the setting - **/ -gboolean -nm_setting_ppp_get_require_mppe_128 (NMSettingPPP *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_PPP (setting), FALSE); - - return NM_SETTING_PPP_GET_PRIVATE (setting)->require_mppe_128; -} - -/** - * nm_setting_ppp_get_mppe_stateful: - * @setting: the #NMSettingPPP - * - * Returns: the #NMSettingPPP:mppe-stateful property of the setting - **/ -gboolean -nm_setting_ppp_get_mppe_stateful (NMSettingPPP *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_PPP (setting), FALSE); - - return NM_SETTING_PPP_GET_PRIVATE (setting)->mppe_stateful; -} - -/** - * nm_setting_ppp_get_crtscts: - * @setting: the #NMSettingPPP - * - * Returns: the #NMSettingPPP:crtscts property of the setting - **/ -gboolean -nm_setting_ppp_get_crtscts (NMSettingPPP *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_PPP (setting), FALSE); - - return NM_SETTING_PPP_GET_PRIVATE (setting)->crtscts; -} - -/** - * nm_setting_ppp_get_baud: - * @setting: the #NMSettingPPP - * - * Returns: the #NMSettingPPP:baud property of the setting - **/ -guint32 -nm_setting_ppp_get_baud (NMSettingPPP *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_PPP (setting), 0); - - return NM_SETTING_PPP_GET_PRIVATE (setting)->baud; -} - -/** - * nm_setting_ppp_get_mru: - * @setting: the #NMSettingPPP - * - * Returns: the #NMSettingPPP:mru property of the setting - **/ -guint32 -nm_setting_ppp_get_mru (NMSettingPPP *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_PPP (setting), 0); - - return NM_SETTING_PPP_GET_PRIVATE (setting)->mru; -} - -/** - * nm_setting_ppp_get_mtu: - * @setting: the #NMSettingPPP - * - * Returns: the #NMSettingPPP:mtu property of the setting - **/ -guint32 -nm_setting_ppp_get_mtu (NMSettingPPP *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_PPP (setting), 0); - - return NM_SETTING_PPP_GET_PRIVATE (setting)->mtu; -} - -/** - * nm_setting_ppp_get_lcp_echo_failure: - * @setting: the #NMSettingPPP - * - * Returns: the #NMSettingPPP:lcp-echo-failure property of the setting - **/ -guint32 -nm_setting_ppp_get_lcp_echo_failure (NMSettingPPP *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_PPP (setting), 0); - - return NM_SETTING_PPP_GET_PRIVATE (setting)->lcp_echo_failure; -} - -/** - * nm_setting_ppp_get_lcp_echo_interval: - * @setting: the #NMSettingPPP - * - * Returns: the #NMSettingPPP:lcp-echo-interval property of the setting - **/ -guint32 -nm_setting_ppp_get_lcp_echo_interval (NMSettingPPP *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_PPP (setting), 0); - - return NM_SETTING_PPP_GET_PRIVATE (setting)->lcp_echo_interval; -} - -static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - NMSettingPPPPrivate *priv = NM_SETTING_PPP_GET_PRIVATE (setting); - - /* FIXME: Do we even want this or can we just let pppd evaluate the options? */ - if (priv->mru > 0) { - if (priv->mru < 128 || priv->mru > 16384) { - g_set_error (error, - NM_SETTING_PPP_ERROR, - NM_SETTING_PPP_ERROR_INVALID_PROPERTY, - _("'%d' is out of valid range <128-16384>"), - priv->mru); - g_prefix_error (error, "%s.%s: ", NM_SETTING_PPP_SETTING_NAME, NM_SETTING_PPP_MRU); - return FALSE; - } - } - - if (priv->lcp_echo_failure > 0) { - /* lcp_echo_interval must also be non-zero */ - if (priv->lcp_echo_interval == 0) { - g_set_error (error, - NM_SETTING_PPP_ERROR, - NM_SETTING_PPP_ERROR_INVALID_PROPERTY, - _("setting this property requires non-zero '%s' property"), - NM_SETTING_PPP_LCP_ECHO_INTERVAL); - g_prefix_error (error, "%s.%s: ", NM_SETTING_PPP_SETTING_NAME, NM_SETTING_PPP_LCP_ECHO_FAILURE); - return FALSE; - } - } - - return TRUE; -} - -static void -nm_setting_ppp_init (NMSettingPPP *setting) -{ -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSettingPPPPrivate *priv = NM_SETTING_PPP_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_NOAUTH: - priv->noauth = g_value_get_boolean (value); - break; - case PROP_REFUSE_EAP: - priv->refuse_eap = g_value_get_boolean (value); - break; - case PROP_REFUSE_PAP: - priv->refuse_pap = g_value_get_boolean (value); - break; - case PROP_REFUSE_CHAP: - priv->refuse_chap = g_value_get_boolean (value); - break; - case PROP_REFUSE_MSCHAP: - priv->refuse_mschap = g_value_get_boolean (value); - break; - case PROP_REFUSE_MSCHAPV2: - priv->refuse_mschapv2 = g_value_get_boolean (value); - break; - case PROP_NOBSDCOMP: - priv->nobsdcomp = g_value_get_boolean (value); - break; - case PROP_NODEFLATE: - priv->nodeflate = g_value_get_boolean (value); - break; - case PROP_NO_VJ_COMP: - priv->no_vj_comp = g_value_get_boolean (value); - break; - case PROP_REQUIRE_MPPE: - priv->require_mppe = g_value_get_boolean (value); - break; - case PROP_REQUIRE_MPPE_128: - priv->require_mppe_128 = g_value_get_boolean (value); - break; - case PROP_MPPE_STATEFUL: - priv->mppe_stateful = g_value_get_boolean (value); - break; - case PROP_CRTSCTS: - priv->crtscts = g_value_get_boolean (value); - break; - case PROP_BAUD: - priv->baud = g_value_get_uint (value); - break; - case PROP_MRU: - priv->mru = g_value_get_uint (value); - break; - case PROP_MTU: - priv->mtu = g_value_get_uint (value); - break; - case PROP_LCP_ECHO_FAILURE: - priv->lcp_echo_failure = g_value_get_uint (value); - break; - case PROP_LCP_ECHO_INTERVAL: - priv->lcp_echo_interval = g_value_get_uint (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSettingPPP *setting = NM_SETTING_PPP (object); - - switch (prop_id) { - case PROP_NOAUTH: - g_value_set_boolean (value, nm_setting_ppp_get_noauth (setting)); - break; - case PROP_REFUSE_EAP: - g_value_set_boolean (value, nm_setting_ppp_get_refuse_eap (setting)); - break; - case PROP_REFUSE_PAP: - g_value_set_boolean (value, nm_setting_ppp_get_refuse_pap (setting)); - break; - case PROP_REFUSE_CHAP: - g_value_set_boolean (value, nm_setting_ppp_get_refuse_chap (setting)); - break; - case PROP_REFUSE_MSCHAP: - g_value_set_boolean (value, nm_setting_ppp_get_refuse_mschap (setting)); - break; - case PROP_REFUSE_MSCHAPV2: - g_value_set_boolean (value, nm_setting_ppp_get_refuse_mschapv2 (setting)); - break; - case PROP_NOBSDCOMP: - g_value_set_boolean (value, nm_setting_ppp_get_nobsdcomp (setting)); - break; - case PROP_NODEFLATE: - g_value_set_boolean (value, nm_setting_ppp_get_nodeflate (setting)); - break; - case PROP_NO_VJ_COMP: - g_value_set_boolean (value, nm_setting_ppp_get_no_vj_comp (setting)); - break; - case PROP_REQUIRE_MPPE: - g_value_set_boolean (value, nm_setting_ppp_get_require_mppe (setting)); - break; - case PROP_REQUIRE_MPPE_128: - g_value_set_boolean (value, nm_setting_ppp_get_require_mppe_128 (setting)); - break; - case PROP_MPPE_STATEFUL: - g_value_set_boolean (value, nm_setting_ppp_get_mppe_stateful (setting)); - break; - case PROP_CRTSCTS: - g_value_set_boolean (value, nm_setting_ppp_get_crtscts (setting)); - break; - case PROP_BAUD: - g_value_set_uint (value, nm_setting_ppp_get_baud (setting)); - break; - case PROP_MRU: - g_value_set_uint (value, nm_setting_ppp_get_mru (setting)); - break; - case PROP_MTU: - g_value_set_uint (value, nm_setting_ppp_get_mtu (setting)); - break; - case PROP_LCP_ECHO_FAILURE: - g_value_set_uint (value, nm_setting_ppp_get_lcp_echo_failure (setting)); - break; - case PROP_LCP_ECHO_INTERVAL: - g_value_set_uint (value, nm_setting_ppp_get_lcp_echo_interval (setting)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_setting_ppp_class_init (NMSettingPPPClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingPPPPrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - parent_class->verify = verify; - - /* Properties */ - /** - * NMSettingPPP:noauth: - * - * If %TRUE, do not require the other side (usually the PPP server) to - * authenticate itself to the client. If %FALSE, require authentication - * from the remote side. In almost all cases, this should be %TRUE. - **/ - g_object_class_install_property - (object_class, PROP_NOAUTH, - g_param_spec_boolean (NM_SETTING_PPP_NOAUTH, "", "", - TRUE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingPPP:refuse-eap: - * - * If %TRUE, the EAP authentication method will not be used. - **/ - g_object_class_install_property - (object_class, PROP_REFUSE_EAP, - g_param_spec_boolean (NM_SETTING_PPP_REFUSE_EAP, "", "", - FALSE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingPPP:refuse-pap: - * - * If %TRUE, the PAP authentication method will not be used. - **/ - g_object_class_install_property - (object_class, PROP_REFUSE_PAP, - g_param_spec_boolean (NM_SETTING_PPP_REFUSE_PAP, "", "", - FALSE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingPPP:refuse-chap: - * - * If %TRUE, the CHAP authentication method will not be used. - **/ - g_object_class_install_property - (object_class, PROP_REFUSE_CHAP, - g_param_spec_boolean (NM_SETTING_PPP_REFUSE_CHAP, "", "", - FALSE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingPPP:refuse-mschap: - * - * If %TRUE, the MSCHAP authentication method will not be used. - **/ - g_object_class_install_property - (object_class, PROP_REFUSE_MSCHAP, - g_param_spec_boolean (NM_SETTING_PPP_REFUSE_MSCHAP, "", "", - FALSE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingPPP:refuse-mschapv2: - * - * If %TRUE, the MSCHAPv2 authentication method will not be used. - **/ - g_object_class_install_property - (object_class, PROP_REFUSE_MSCHAPV2, - g_param_spec_boolean (NM_SETTING_PPP_REFUSE_MSCHAPV2, "", "", - FALSE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingPPP:nobsdcomp: - * - * If %TRUE, BSD compression will not be requested. - **/ - g_object_class_install_property - (object_class, PROP_NOBSDCOMP, - g_param_spec_boolean (NM_SETTING_PPP_NOBSDCOMP, "", "", - FALSE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_FUZZY_IGNORE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingPPP:nodeflate: - * - * If %TRUE, "deflate" compression will not be requested. - **/ - g_object_class_install_property - (object_class, PROP_NODEFLATE, - g_param_spec_boolean (NM_SETTING_PPP_NODEFLATE, "", "", - FALSE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_FUZZY_IGNORE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingPPP:no-vj-comp: - * - * If %TRUE, Van Jacobsen TCP header compression will not be requested. - **/ - g_object_class_install_property - (object_class, PROP_NO_VJ_COMP, - g_param_spec_boolean (NM_SETTING_PPP_NO_VJ_COMP, "", "", - FALSE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_FUZZY_IGNORE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingPPP:require-mppe: - * - * If %TRUE, MPPE (Microsoft Point-to-Point Encryption) will be required for - * the PPP session. If either 64-bit or 128-bit MPPE is not available the - * session will fail. Note that MPPE is not used on mobile broadband - * connections. - **/ - g_object_class_install_property - (object_class, PROP_REQUIRE_MPPE, - g_param_spec_boolean (NM_SETTING_PPP_REQUIRE_MPPE, "", "", - FALSE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingPPP:require-mppe-128: - * - * If %TRUE, 128-bit MPPE (Microsoft Point-to-Point Encryption) will be - * required for the PPP session, and the "require-mppe" property must also - * be set to %TRUE. If 128-bit MPPE is not available the session will fail. - **/ - g_object_class_install_property - (object_class, PROP_REQUIRE_MPPE_128, - g_param_spec_boolean (NM_SETTING_PPP_REQUIRE_MPPE_128, "", "", - FALSE, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingPPP:mppe-stateful: - * - * If %TRUE, stateful MPPE is used. See pppd documentation for more - * information on stateful MPPE. - **/ - g_object_class_install_property - (object_class, PROP_MPPE_STATEFUL, - g_param_spec_boolean (NM_SETTING_PPP_MPPE_STATEFUL, "", "", - FALSE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingPPP:crtscts: - * - * If %TRUE, specify that pppd should set the serial port to use hardware - * flow control with RTS and CTS signals. This value should normally be set - * to %FALSE. - **/ - g_object_class_install_property - (object_class, PROP_CRTSCTS, - g_param_spec_boolean (NM_SETTING_PPP_CRTSCTS, "", "", - FALSE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingPPP:baud: - * - * If non-zero, instruct pppd to set the serial port to the specified - * baudrate. This value should normally be left as 0 to automatically - * choose the speed. - **/ - g_object_class_install_property - (object_class, PROP_BAUD, - g_param_spec_uint (NM_SETTING_PPP_BAUD, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_FUZZY_IGNORE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingPPP:mru: - * - * If non-zero, instruct pppd to request that the peer send packets no - * larger than the specified size. If non-zero, the MRU should be between - * 128 and 16384. - */ - g_object_class_install_property - (object_class, PROP_MRU, - g_param_spec_uint (NM_SETTING_PPP_MRU, "", "", - 0, 16384, 0, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingPPP:mtu: - * - * If non-zero, instruct pppd to send packets no larger than the specified - * size. - **/ - g_object_class_install_property - (object_class, PROP_MTU, - g_param_spec_uint (NM_SETTING_PPP_MTU, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_FUZZY_IGNORE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingPPP:lcp-echo-failure: - * - * If non-zero, instruct pppd to presume the connection to the peer has - * failed if the specified number of LCP echo-requests go unanswered by the - * peer. The "lcp-echo-interval" property must also be set to a non-zero - * value if this property is used. - **/ - g_object_class_install_property - (object_class, PROP_LCP_ECHO_FAILURE, - g_param_spec_uint (NM_SETTING_PPP_LCP_ECHO_FAILURE, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_FUZZY_IGNORE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingPPP:lcp-echo-interval: - * - * If non-zero, instruct pppd to send an LCP echo-request frame to the peer - * every n seconds (where n is the specified value). Note that some PPP - * peers will respond to echo requests and some will not, and it is not - * possible to autodetect this. - **/ - g_object_class_install_property - (object_class, PROP_LCP_ECHO_INTERVAL, - g_param_spec_uint (NM_SETTING_PPP_LCP_ECHO_INTERVAL, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_FUZZY_IGNORE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-util/nm-setting-ppp.h b/libnm-util/nm-setting-ppp.h deleted file mode 100644 index 52856463a4..0000000000 --- a/libnm-util/nm-setting-ppp.h +++ /dev/null @@ -1,115 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#ifndef NM_SETTING_PPP_H -#define NM_SETTING_PPP_H - -#include "nm-setting.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SETTING_PPP (nm_setting_ppp_get_type ()) -#define NM_SETTING_PPP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_PPP, NMSettingPPP)) -#define NM_SETTING_PPP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_PPP, NMSettingPPPClass)) -#define NM_IS_SETTING_PPP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_PPP)) -#define NM_IS_SETTING_PPP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_PPP)) -#define NM_SETTING_PPP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_PPP, NMSettingPPPClass)) - -#define NM_SETTING_PPP_SETTING_NAME "ppp" - -/** - * NMSettingPPPError: - * @NM_SETTING_PPP_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_PPP_ERROR_INVALID_PROPERTY: the property was invalid - * @NM_SETTING_PPP_ERROR_MISSING_PROPERTY: the property was missing and is - * required - * @NM_SETTING_PPP_ERROR_REQUIRE_MPPE_NOT_ALLOWED: requiring MPPE is not compatible - * with other setting configuration parameters - */ -typedef enum { - NM_SETTING_PPP_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_SETTING_PPP_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/ - NM_SETTING_PPP_ERROR_MISSING_PROPERTY, /*< nick=MissingProperty >*/ - NM_SETTING_PPP_ERROR_REQUIRE_MPPE_NOT_ALLOWED /*< nick=RequireMPPENotAllowed >*/ -} NMSettingPPPError; - -#define NM_SETTING_PPP_ERROR nm_setting_ppp_error_quark () -GQuark nm_setting_ppp_error_quark (void); - -#define NM_SETTING_PPP_NOAUTH "noauth" -#define NM_SETTING_PPP_REFUSE_EAP "refuse-eap" -#define NM_SETTING_PPP_REFUSE_PAP "refuse-pap" -#define NM_SETTING_PPP_REFUSE_CHAP "refuse-chap" -#define NM_SETTING_PPP_REFUSE_MSCHAP "refuse-mschap" -#define NM_SETTING_PPP_REFUSE_MSCHAPV2 "refuse-mschapv2" -#define NM_SETTING_PPP_NOBSDCOMP "nobsdcomp" -#define NM_SETTING_PPP_NODEFLATE "nodeflate" -#define NM_SETTING_PPP_NO_VJ_COMP "no-vj-comp" -#define NM_SETTING_PPP_REQUIRE_MPPE "require-mppe" -#define NM_SETTING_PPP_REQUIRE_MPPE_128 "require-mppe-128" -#define NM_SETTING_PPP_MPPE_STATEFUL "mppe-stateful" -#define NM_SETTING_PPP_CRTSCTS "crtscts" -#define NM_SETTING_PPP_BAUD "baud" -#define NM_SETTING_PPP_MRU "mru" -#define NM_SETTING_PPP_MTU "mtu" -#define NM_SETTING_PPP_LCP_ECHO_FAILURE "lcp-echo-failure" -#define NM_SETTING_PPP_LCP_ECHO_INTERVAL "lcp-echo-interval" - -typedef struct { - NMSetting parent; -} NMSettingPPP; - -typedef struct { - NMSettingClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); -} NMSettingPPPClass; - -GType nm_setting_ppp_get_type (void); - -NMSetting *nm_setting_ppp_new (void); -gboolean nm_setting_ppp_get_noauth (NMSettingPPP *setting); -gboolean nm_setting_ppp_get_refuse_eap (NMSettingPPP *setting); -gboolean nm_setting_ppp_get_refuse_pap (NMSettingPPP *setting); -gboolean nm_setting_ppp_get_refuse_chap (NMSettingPPP *setting); -gboolean nm_setting_ppp_get_refuse_mschap (NMSettingPPP *setting); -gboolean nm_setting_ppp_get_refuse_mschapv2 (NMSettingPPP *setting); -gboolean nm_setting_ppp_get_nobsdcomp (NMSettingPPP *setting); -gboolean nm_setting_ppp_get_nodeflate (NMSettingPPP *setting); -gboolean nm_setting_ppp_get_no_vj_comp (NMSettingPPP *setting); -gboolean nm_setting_ppp_get_require_mppe (NMSettingPPP *setting); -gboolean nm_setting_ppp_get_require_mppe_128 (NMSettingPPP *setting); -gboolean nm_setting_ppp_get_mppe_stateful (NMSettingPPP *setting); -gboolean nm_setting_ppp_get_crtscts (NMSettingPPP *setting); -guint32 nm_setting_ppp_get_baud (NMSettingPPP *setting); -guint32 nm_setting_ppp_get_mru (NMSettingPPP *setting); -guint32 nm_setting_ppp_get_mtu (NMSettingPPP *setting); -guint32 nm_setting_ppp_get_lcp_echo_failure (NMSettingPPP *setting); -guint32 nm_setting_ppp_get_lcp_echo_interval (NMSettingPPP *setting); - -G_END_DECLS - -#endif /* NM_SETTING_PPP_H */ diff --git a/libnm-util/nm-setting-pppoe.c b/libnm-util/nm-setting-pppoe.c deleted file mode 100644 index e66165fd09..0000000000 --- a/libnm-util/nm-setting-pppoe.c +++ /dev/null @@ -1,342 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2013 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#include "nm-default.h" - -#include <string.h> - -#include "nm-setting-pppoe.h" -#include "nm-setting-ppp.h" -#include "nm-setting-private.h" - -/** - * SECTION:nm-setting-pppoe - * @short_description: Describes PPPoE connection properties - * @include: nm-setting-pppoe.h - * - * The #NMSettingPPPOE object is a #NMSetting subclass that describes - * properties necessary for connection to networks that require PPPoE connections - * to provide IP transport, for example cable or DSL modems. - **/ - -/** - * nm_setting_pppoe_error_quark: - * - * Registers an error quark for #NMSettingPPPOE if necessary. - * - * Returns: the error quark used for #NMSettingPPPOE errors. - **/ -GQuark -nm_setting_pppoe_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-pppoe-error-quark"); - return quark; -} - -G_DEFINE_TYPE_WITH_CODE (NMSettingPPPOE, nm_setting_pppoe, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_PPPOE_SETTING_NAME, - g_define_type_id, - 3, - NM_SETTING_PPPOE_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_PPPOE) - -#define NM_SETTING_PPPOE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_PPPOE, NMSettingPPPOEPrivate)) - -typedef struct { - char *service; - char *username; - char *password; - NMSettingSecretFlags password_flags; -} NMSettingPPPOEPrivate; - -enum { - PROP_0, - PROP_SERVICE, - PROP_USERNAME, - PROP_PASSWORD, - PROP_PASSWORD_FLAGS, - - LAST_PROP -}; - -/** - * nm_setting_pppoe_new: - * - * Creates a new #NMSettingPPPOE object with default values. - * - * Returns: (transfer full): the new empty #NMSettingPPPOE object - **/ -NMSetting * -nm_setting_pppoe_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_PPPOE, NULL); -} - -/** - * nm_setting_pppoe_get_service: - * @setting: the #NMSettingPPPOE - * - * Returns: the #NMSettingPPPOE:service property of the setting - **/ -const char * -nm_setting_pppoe_get_service (NMSettingPPPOE *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_PPPOE (setting), NULL); - - return NM_SETTING_PPPOE_GET_PRIVATE (setting)->service; -} - -/** - * nm_setting_pppoe_get_username: - * @setting: the #NMSettingPPPOE - * - * Returns: the #NMSettingPPPOE:username property of the setting - **/ -const char * -nm_setting_pppoe_get_username (NMSettingPPPOE *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_PPPOE (setting), NULL); - - return NM_SETTING_PPPOE_GET_PRIVATE (setting)->username; -} - -/** - * nm_setting_pppoe_get_password: - * @setting: the #NMSettingPPPOE - * - * Returns: the #NMSettingPPPOE:password property of the setting - **/ -const char * -nm_setting_pppoe_get_password (NMSettingPPPOE *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_PPPOE (setting), NULL); - - return NM_SETTING_PPPOE_GET_PRIVATE (setting)->password; -} - -/** - * nm_setting_pppoe_get_password_flags: - * @setting: the #NMSettingPPPOE - * - * Returns: the #NMSettingSecretFlags pertaining to the #NMSettingPPPOE:password - **/ -NMSettingSecretFlags -nm_setting_pppoe_get_password_flags (NMSettingPPPOE *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_PPPOE (setting), NM_SETTING_SECRET_FLAG_NONE); - - return NM_SETTING_PPPOE_GET_PRIVATE (setting)->password_flags; -} - -static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - NMSettingPPPOEPrivate *priv = NM_SETTING_PPPOE_GET_PRIVATE (setting); - - if (!priv->username) { - g_set_error_literal (error, - NM_SETTING_PPPOE_ERROR, - NM_SETTING_PPPOE_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_PPPOE_SETTING_NAME, NM_SETTING_PPPOE_USERNAME); - return FALSE; - } else if (!strlen (priv->username)) { - g_set_error_literal (error, - NM_SETTING_PPPOE_ERROR, - NM_SETTING_PPPOE_ERROR_INVALID_PROPERTY, - _("property is empty")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_PPPOE_SETTING_NAME, NM_SETTING_PPPOE_USERNAME); - return FALSE; - } - - if (priv->service && !strlen (priv->service)) { - g_set_error_literal (error, - NM_SETTING_PPPOE_ERROR, - NM_SETTING_PPPOE_ERROR_INVALID_PROPERTY, - _("property is empty")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_PPPOE_SETTING_NAME, NM_SETTING_PPPOE_SERVICE); - return FALSE; - } - - return TRUE; -} - -static GPtrArray * -need_secrets (NMSetting *setting) -{ - NMSettingPPPOEPrivate *priv = NM_SETTING_PPPOE_GET_PRIVATE (setting); - GPtrArray *secrets = NULL; - - if (priv->password) - return NULL; - - if (!(priv->password_flags & NM_SETTING_SECRET_FLAG_NOT_REQUIRED)) { - secrets = g_ptr_array_sized_new (1); - g_ptr_array_add (secrets, NM_SETTING_PPPOE_PASSWORD); - } - - return secrets; -} - -static void -nm_setting_pppoe_init (NMSettingPPPOE *setting) -{ -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSettingPPPOEPrivate *priv = NM_SETTING_PPPOE_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_SERVICE: - g_free (priv->service); - priv->service = g_value_dup_string (value); - break; - case PROP_USERNAME: - g_free (priv->username); - priv->username = g_value_dup_string (value); - break; - case PROP_PASSWORD: - g_free (priv->password); - priv->password = g_value_dup_string (value); - break; - case PROP_PASSWORD_FLAGS: - priv->password_flags = g_value_get_uint (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSettingPPPOE *setting = NM_SETTING_PPPOE (object); - - switch (prop_id) { - case PROP_SERVICE: - g_value_set_string (value, nm_setting_pppoe_get_service (setting)); - break; - case PROP_USERNAME: - g_value_set_string (value, nm_setting_pppoe_get_username (setting)); - break; - case PROP_PASSWORD: - g_value_set_string (value, nm_setting_pppoe_get_password (setting)); - break; - case PROP_PASSWORD_FLAGS: - g_value_set_uint (value, nm_setting_pppoe_get_password_flags (setting)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -finalize (GObject *object) -{ - NMSettingPPPOEPrivate *priv = NM_SETTING_PPPOE_GET_PRIVATE (object); - - g_free (priv->username); - g_free (priv->password); - g_free (priv->service); - - G_OBJECT_CLASS (nm_setting_pppoe_parent_class)->finalize (object); -} - -static void -nm_setting_pppoe_class_init (NMSettingPPPOEClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingPPPOEPrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->finalize = finalize; - parent_class->verify = verify; - parent_class->need_secrets = need_secrets; - - /* Properties */ - /** - * NMSettingPPPOE:service: - * - * If specified, instruct PPPoE to only initiate sessions with access - * concentrators that provide the specified service. For most providers, - * this should be left blank. It is only required if there are multiple - * access concentrators or a specific service is known to be required. - **/ - g_object_class_install_property - (object_class, PROP_SERVICE, - g_param_spec_string (NM_SETTING_PPPOE_SERVICE, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingPPPOE:username: - * - * Username used to authenticate with the PPPoE service. - **/ - g_object_class_install_property - (object_class, PROP_USERNAME, - g_param_spec_string (NM_SETTING_PPPOE_USERNAME, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingPPPOE:password: - * - * Password used to authenticate with the PPPoE service. - **/ - g_object_class_install_property - (object_class, PROP_PASSWORD, - g_param_spec_string (NM_SETTING_PPPOE_PASSWORD, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_SECRET | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingPPPOE:password-flags: - * - * Flags indicating how to handle the #NMSettingPPPOE:password property. - **/ - g_object_class_install_property - (object_class, PROP_PASSWORD_FLAGS, - g_param_spec_uint (NM_SETTING_PPPOE_PASSWORD_FLAGS, "", "", - NM_SETTING_SECRET_FLAG_NONE, - NM_SETTING_SECRET_FLAGS_ALL, - NM_SETTING_SECRET_FLAG_NONE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-util/nm-setting-pppoe.h b/libnm-util/nm-setting-pppoe.h deleted file mode 100644 index 9f8add4e63..0000000000 --- a/libnm-util/nm-setting-pppoe.h +++ /dev/null @@ -1,87 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2011 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#ifndef NM_SETTING_PPPOE_H -#define NM_SETTING_PPPOE_H - -#include "nm-setting.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SETTING_PPPOE (nm_setting_pppoe_get_type ()) -#define NM_SETTING_PPPOE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_PPPOE, NMSettingPPPOE)) -#define NM_SETTING_PPPOE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_PPPOE, NMSettingPPPOEClass)) -#define NM_IS_SETTING_PPPOE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_PPPOE)) -#define NM_IS_SETTING_PPPOE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_PPPOE)) -#define NM_SETTING_PPPOE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_PPPOE, NMSettingPPPOEClass)) - -#define NM_SETTING_PPPOE_SETTING_NAME "pppoe" - -/** - * NMSettingPPPOEError: - * @NM_SETTING_PPPOE_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_PPPOE_ERROR_INVALID_PROPERTY: the property was invalid - * @NM_SETTING_PPPOE_ERROR_MISSING_PROPERTY: the property was missing and is - * required - * @NM_SETTING_PPPOE_ERROR_MISSING_PPP_SETTING: the connection - * did not contain a required PPP setting for PPP related options - */ -typedef enum { - NM_SETTING_PPPOE_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_SETTING_PPPOE_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/ - NM_SETTING_PPPOE_ERROR_MISSING_PROPERTY, /*< nick=MissingProperty >*/ - NM_SETTING_PPPOE_ERROR_MISSING_PPP_SETTING /*< nick=MissingPPPSetting >*/ -} NMSettingPPPOEError; - -#define NM_SETTING_PPPOE_ERROR nm_setting_pppoe_error_quark () -GQuark nm_setting_pppoe_error_quark (void); - -#define NM_SETTING_PPPOE_SERVICE "service" -#define NM_SETTING_PPPOE_USERNAME "username" -#define NM_SETTING_PPPOE_PASSWORD "password" -#define NM_SETTING_PPPOE_PASSWORD_FLAGS "password-flags" - -typedef struct { - NMSetting parent; -} NMSettingPPPOE; - -typedef struct { - NMSettingClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); -} NMSettingPPPOEClass; - -GType nm_setting_pppoe_get_type (void); - -NMSetting *nm_setting_pppoe_new (void); -const char *nm_setting_pppoe_get_service (NMSettingPPPOE *setting); -const char *nm_setting_pppoe_get_username (NMSettingPPPOE *setting); -const char *nm_setting_pppoe_get_password (NMSettingPPPOE *setting); -NMSettingSecretFlags nm_setting_pppoe_get_password_flags (NMSettingPPPOE *setting); - -G_END_DECLS - -#endif /* NM_SETTING_PPPOE_H */ diff --git a/libnm-util/nm-setting-private.h b/libnm-util/nm-setting-private.h deleted file mode 100644 index 9b8e946454..0000000000 --- a/libnm-util/nm-setting-private.h +++ /dev/null @@ -1,125 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2011 Red Hat, Inc. - */ - -#ifndef NM_SETTING_PRIVATE_H -#define NM_SETTING_PRIVATE_H - -#include "nm-connection.h" - -#define NM_SETTING_SECRET_FLAGS_ALL \ - (NM_SETTING_SECRET_FLAG_NONE | \ - NM_SETTING_SECRET_FLAG_AGENT_OWNED | \ - NM_SETTING_SECRET_FLAG_NOT_SAVED | \ - NM_SETTING_SECRET_FLAG_NOT_REQUIRED) - -/** - * NMSettingVerifyResult: - * @NM_SETTING_VERIFY_SUCCESS: the setting verifies successfully - * @NM_SETTING_VERIFY_ERROR: the setting has a serious misconfiguration - * @NM_SETTING_VERIFY_NORMALIZABLE: the setting is valid but has properties - * that should be normalized - * @NM_SETTING_VERIFY_NORMALIZABLE_ERROR: the setting is invalid but the - * errors can be fixed by nm_connection_normalize(). - */ -typedef enum { - NM_SETTING_VERIFY_SUCCESS = TRUE, - NM_SETTING_VERIFY_ERROR = FALSE, - NM_SETTING_VERIFY_NORMALIZABLE = 2, - NM_SETTING_VERIFY_NORMALIZABLE_ERROR = 3, -} NMSettingVerifyResult; - -void _nm_register_setting (const char *name, - const GType type, - const guint32 priority, - const GQuark error_quark); - -/* Ensure, that name is a compile time constant string. Put the function name in parenthesis to suppress expansion. */ -#define _nm_register_setting(name, type, priority, error_quark) _nm_register_setting ((name ""), type, priority, error_quark) - -gboolean _nm_setting_is_base_type (NMSetting *setting); -gboolean _nm_setting_type_is_base_type (GType type); -guint32 _nm_setting_get_setting_priority (NMSetting *setting); -GType _nm_setting_lookup_setting_type (const char *name); -GType _nm_setting_lookup_setting_type_by_quark (GQuark error_quark); -int _nm_setting_compare_priority (gconstpointer a, gconstpointer b); - -gboolean _nm_setting_get_property (NMSetting *setting, const char *name, GValue *value); - -NMConnection *_nm_connection_new_from_hash (GHashTable *hash); -void _nm_connection_replace_settings (NMConnection *connection, - GHashTable *new_settings); - -typedef enum NMSettingUpdateSecretResult { - NM_SETTING_UPDATE_SECRET_ERROR = FALSE, - NM_SETTING_UPDATE_SECRET_SUCCESS_MODIFIED = TRUE, - NM_SETTING_UPDATE_SECRET_SUCCESS_UNCHANGED = 2, -} NMSettingUpdateSecretResult; - -NMSettingUpdateSecretResult _nm_setting_update_secrets (NMSetting *setting, - GHashTable *secrets, - GError **error); -gboolean _nm_setting_clear_secrets (NMSetting *setting); -gboolean _nm_setting_clear_secrets_with_flags (NMSetting *setting, - NMSettingClearSecretsWithFlagsFn func, - gpointer user_data); - -/* NM_SETTING_COMPARE_FLAG_INFERRABLE: check whether a device-generated - * connection can be replaced by a already-defined connection. This flag only - * takes into account properties marked with the %NM_SETTING_PARAM_INFERRABLE - * flag. - */ -#define NM_SETTING_COMPARE_FLAG_INFERRABLE 0x80000000 - -/* The property of the #NMSetting should be considered during comparisons that - * use the %NM_SETTING_COMPARE_FLAG_INFERRABLE flag. Properties that don't have - * this flag, are ignored when doing an infrerrable comparison. This flag should - * be set on all properties that are read from the kernel or the system when a - * connection is generated. eg, IP addresses/routes can be read from the - * kernel, but the 'autoconnect' property cannot, so - * %NM_SETTING_IP4_CONFIG_ADDRESSES gets the INFERRABLE flag, but - * %NM_SETTING_CONNECTION_AUTOCONNECT would not. - * - * This flag should not be used with properties where the default cannot be - * read separately from the current value, like MTU or wired duplex mode. - */ -#define NM_SETTING_PARAM_INFERRABLE (1 << (4 + G_PARAM_USER_SHIFT)) - -/* Ensure the setting's GType is registered at library load time */ -#define NM_SETTING_REGISTER_TYPE(x) \ -static void __attribute__((constructor)) register_setting (void) \ -{ g_type_ensure (x); } - -NMSetting *nm_setting_find_in_list (GSList *settings_list, const char *setting_name); - -NMSettingVerifyResult _nm_setting_verify_deprecated_virtual_iface_name (const char *interface_name, - gboolean allow_missing, - const char *setting_name, - const char *setting_property, - GQuark error_quark, - int e_invalid_property, - int e_missing_property, - GSList *all_settings, - GError **error); - -NMSettingVerifyResult _nm_setting_verify (NMSetting *setting, - GSList *all_settings, - GError **error); - -#endif /* NM_SETTING_PRIVATE_H */ diff --git a/libnm-util/nm-setting-serial.c b/libnm-util/nm-setting-serial.c deleted file mode 100644 index 369c4b109e..0000000000 --- a/libnm-util/nm-setting-serial.c +++ /dev/null @@ -1,319 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2011 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#include "nm-default.h" - -#include <string.h> - -#include "nm-setting-serial.h" -#include "nm-setting-private.h" - -/** - * SECTION:nm-setting-serial - * @short_description: Describes connection properties for devices that use - * serial communications - * @include: nm-setting-serial.h - * - * The #NMSettingSerial object is a #NMSetting subclass that describes - * properties necessary for connections that may use serial communications, - * such as mobile broadband or analog telephone connections. - **/ - -/** - * nm_setting_serial_error_quark: - * - * Registers an error quark for #NMSettingSerial if necessary. - * - * Returns: the error quark used for #NMSettingSerial errors. - **/ -GQuark -nm_setting_serial_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-serial-error-quark"); - return quark; -} - -G_DEFINE_TYPE_WITH_CODE (NMSettingSerial, nm_setting_serial, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_SERIAL_SETTING_NAME, - g_define_type_id, - 2, - NM_SETTING_SERIAL_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_SERIAL) - -#define NM_SETTING_SERIAL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_SERIAL, NMSettingSerialPrivate)) - -typedef struct { - guint baud; - guint bits; - char parity; - guint stopbits; - guint64 send_delay; -} NMSettingSerialPrivate; - -enum { - PROP_0, - PROP_BAUD, - PROP_BITS, - PROP_PARITY, - PROP_STOPBITS, - PROP_SEND_DELAY, - - LAST_PROP -}; - -/** - * nm_setting_serial_new: - * - * Creates a new #NMSettingSerial object with default values. - * - * Returns: (transfer full): the new empty #NMSettingSerial object - **/ -NMSetting * -nm_setting_serial_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_SERIAL, NULL); -} - -/** - * nm_setting_serial_get_baud: - * @setting: the #NMSettingSerial - * - * Returns: the #NMSettingSerial:baud property of the setting - **/ -guint -nm_setting_serial_get_baud (NMSettingSerial *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_SERIAL (setting), 0); - - return NM_SETTING_SERIAL_GET_PRIVATE (setting)->baud; -} - -/** - * nm_setting_serial_get_bits: - * @setting: the #NMSettingSerial - * - * Returns: the #NMSettingSerial:bits property of the setting - **/ -guint -nm_setting_serial_get_bits (NMSettingSerial *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_SERIAL (setting), 0); - - return NM_SETTING_SERIAL_GET_PRIVATE (setting)->bits; -} - -/** - * nm_setting_serial_get_parity: - * @setting: the #NMSettingSerial - * - * Returns: the #NMSettingSerial:parity property of the setting - **/ -char -nm_setting_serial_get_parity (NMSettingSerial *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_SERIAL (setting), 0); - - return NM_SETTING_SERIAL_GET_PRIVATE (setting)->parity; -} - -/** - * nm_setting_serial_get_stopbits: - * @setting: the #NMSettingSerial - * - * Returns: the #NMSettingSerial:stopbits property of the setting - **/ -guint -nm_setting_serial_get_stopbits (NMSettingSerial *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_SERIAL (setting), 0); - - return NM_SETTING_SERIAL_GET_PRIVATE (setting)->stopbits; -} - -/** - * nm_setting_serial_get_send_delay: - * @setting: the #NMSettingSerial - * - * Returns: the #NMSettingSerial:send-delay property of the setting - **/ -guint64 -nm_setting_serial_get_send_delay (NMSettingSerial *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_SERIAL (setting), 0); - - return NM_SETTING_SERIAL_GET_PRIVATE (setting)->send_delay; -} - -static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - return TRUE; -} - -static void -nm_setting_serial_init (NMSettingSerial *setting) -{ -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSettingSerialPrivate *priv = NM_SETTING_SERIAL_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_BAUD: - priv->baud = g_value_get_uint (value); - break; - case PROP_BITS: - priv->bits = g_value_get_uint (value); - break; - case PROP_PARITY: - priv->parity = g_value_get_schar (value); - break; - case PROP_STOPBITS: - priv->stopbits = g_value_get_uint (value); - break; - case PROP_SEND_DELAY: - priv->send_delay = g_value_get_uint64 (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSettingSerial *setting = NM_SETTING_SERIAL (object); - - switch (prop_id) { - case PROP_BAUD: - g_value_set_uint (value, nm_setting_serial_get_baud (setting)); - break; - case PROP_BITS: - g_value_set_uint (value, nm_setting_serial_get_bits (setting)); - break; - case PROP_PARITY: - g_value_set_schar (value, nm_setting_serial_get_parity (setting)); - break; - case PROP_STOPBITS: - g_value_set_uint (value, nm_setting_serial_get_stopbits (setting)); - break; - case PROP_SEND_DELAY: - g_value_set_uint64 (value, nm_setting_serial_get_send_delay (setting)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_setting_serial_class_init (NMSettingSerialClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingSerialPrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - parent_class->verify = verify; - - /* Properties */ - - /** - * NMSettingSerial:baud: - * - * Speed to use for communication over the serial port. Note that this - * value usually has no effect for mobile broadband modems as they generally - * ignore speed settings and use the highest available speed. - **/ - g_object_class_install_property - (object_class, PROP_BAUD, - g_param_spec_uint (NM_SETTING_SERIAL_BAUD, "", "", - 0, G_MAXUINT, 57600, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingSerial:bits: - * - * Byte-width of the serial communication. The 8 in "8n1" for example. - **/ - g_object_class_install_property - (object_class, PROP_BITS, - g_param_spec_uint (NM_SETTING_SERIAL_BITS, "", "", - 5, 8, 8, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingSerial:parity: - * - * Parity setting of the serial port. Either 'E' for even parity, 'o' for - * odd parity, or 'n' for no parity. - **/ - g_object_class_install_property - (object_class, PROP_PARITY, - g_param_spec_char (NM_SETTING_SERIAL_PARITY, "", "", - 'E', 'o', 'n', - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingSerial:stopbits: - * - * Number of stop bits for communication on the serial port. Either 1 or 2. - * The 1 in "8n1" for example. - **/ - g_object_class_install_property - (object_class, PROP_STOPBITS, - g_param_spec_uint (NM_SETTING_SERIAL_STOPBITS, "", "", - 1, 2, 1, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingSerial:send-delay: - * - * Time to delay between each byte sent to the modem, in microseconds. - **/ - g_object_class_install_property - (object_class, PROP_SEND_DELAY, - g_param_spec_uint64 (NM_SETTING_SERIAL_SEND_DELAY, "", "", - 0, G_MAXUINT64, 0, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-util/nm-setting-serial.h b/libnm-util/nm-setting-serial.h deleted file mode 100644 index bca9abae92..0000000000 --- a/libnm-util/nm-setting-serial.h +++ /dev/null @@ -1,89 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#ifndef NM_SETTING_SERIAL_H -#define NM_SETTING_SERIAL_H - -#include "nm-setting.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SETTING_SERIAL (nm_setting_serial_get_type ()) -#define NM_SETTING_SERIAL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_SERIAL, NMSettingSerial)) -#define NM_SETTING_SERIAL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_SERIAL, NMSettingSerialClass)) -#define NM_IS_SETTING_SERIAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_SERIAL)) -#define NM_IS_SETTING_SERIAL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_SERIAL)) -#define NM_SETTING_SERIAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_SERIAL, NMSettingSerialClass)) - -#define NM_SETTING_SERIAL_SETTING_NAME "serial" - -/** - * NMSettingSerialError: - * @NM_SETTING_SERIAL_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_SERIAL_ERROR_INVALID_PROPERTY: the property was invalid - * @NM_SETTING_SERIAL_ERROR_MISSING_PROPERTY: the property was missing and is - * required - * @NM_SETTING_SERIAL_ERROR_MISSING_PPP_SETTING: one of the properties of the - * setting requires the connection to contain an #NMSettingPPP setting - */ -typedef enum { - NM_SETTING_SERIAL_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_SETTING_SERIAL_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/ - NM_SETTING_SERIAL_ERROR_MISSING_PROPERTY, /*< nick=MissingProperty >*/ - NM_SETTING_SERIAL_ERROR_MISSING_PPP_SETTING /*< nick=MissingPPPSetting >*/ -} NMSettingSerialError; - -#define NM_SETTING_SERIAL_ERROR nm_setting_serial_error_quark () -GQuark nm_setting_serial_error_quark (void); - -#define NM_SETTING_SERIAL_BAUD "baud" -#define NM_SETTING_SERIAL_BITS "bits" -#define NM_SETTING_SERIAL_PARITY "parity" -#define NM_SETTING_SERIAL_STOPBITS "stopbits" -#define NM_SETTING_SERIAL_SEND_DELAY "send-delay" - -typedef struct { - NMSetting parent; -} NMSettingSerial; - -typedef struct { - NMSettingClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); -} NMSettingSerialClass; - -GType nm_setting_serial_get_type (void); - -NMSetting *nm_setting_serial_new (void); -guint nm_setting_serial_get_baud (NMSettingSerial *setting); -guint nm_setting_serial_get_bits (NMSettingSerial *setting); -char nm_setting_serial_get_parity (NMSettingSerial *setting); -guint nm_setting_serial_get_stopbits (NMSettingSerial *setting); -guint64 nm_setting_serial_get_send_delay (NMSettingSerial *setting); - -G_END_DECLS - -#endif /* NM_SETTING_SERIAL_H */ diff --git a/libnm-util/nm-setting-team-port.c b/libnm-util/nm-setting-team-port.c deleted file mode 100644 index 5fa511d988..0000000000 --- a/libnm-util/nm-setting-team-port.c +++ /dev/null @@ -1,197 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2013 Jiri Pirko <jiri@resnulli.us> - */ - -#include "nm-default.h" - -#include <string.h> -#include <ctype.h> -#include <stdlib.h> -#include <dbus/dbus-glib.h> - -#include "nm-setting-team-port.h" -#include "nm-utils.h" -#include "nm-utils-private.h" -#include "nm-setting-private.h" - -/** - * SECTION:nm-setting-team-port - * @short_description: Describes connection properties for team ports - * @include: nm-setting-team-port.h - * - * The #NMSettingTeamPort object is a #NMSetting subclass that describes - * optional properties that apply to team ports. - * - * Since: 0.9.10 - **/ - -/** - * nm_setting_team_port_error_quark: - * - * Registers an error quark for #NMSettingTeamPort if necessary. - * - * Returns: the error quark used for #NMSettingTeamPort errors. - * - * Since: 0.9.10 - **/ -GQuark -nm_setting_team_port_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-team-port-error-quark"); - return quark; -} - -G_DEFINE_TYPE_WITH_CODE (NMSettingTeamPort, nm_setting_team_port, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_TEAM_PORT_SETTING_NAME, - g_define_type_id, - 3, - NM_SETTING_TEAM_PORT_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_TEAM_PORT) - -#define NM_SETTING_TEAM_PORT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_TEAM_PORT, NMSettingTeamPortPrivate)) - -typedef struct { - char *config; -} NMSettingTeamPortPrivate; - -enum { - PROP_0, - PROP_CONFIG, - LAST_PROP -}; - -/** - * nm_setting_team_port_new: - * - * Creates a new #NMSettingTeamPort object with default values. - * - * Returns: (transfer full): the new empty #NMSettingTeamPort object - * - * Since: 0.9.10 - **/ -NMSetting * -nm_setting_team_port_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_TEAM_PORT, NULL); -} - -/** - * nm_setting_team_port_get_config: - * @setting: the #NMSettingTeamPort - * - * Returns: the #NMSettingTeamPort:config property of the setting - * - * Since: 0.9.10 - **/ -const char * -nm_setting_team_port_get_config (NMSettingTeamPort *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_TEAM_PORT (setting), NULL); - - return NM_SETTING_TEAM_PORT_GET_PRIVATE (setting)->config; -} - -static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - return TRUE; -} - -static void -nm_setting_team_port_init (NMSettingTeamPort *setting) -{ -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSettingTeamPortPrivate *priv = NM_SETTING_TEAM_PORT_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_CONFIG: - g_free (priv->config); - priv->config = g_value_dup_string (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSettingTeamPort *setting = NM_SETTING_TEAM_PORT (object); - - switch (prop_id) { - case PROP_CONFIG: - g_value_set_string (value, nm_setting_team_port_get_config (setting)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -finalize (GObject *object) -{ - NMSettingTeamPortPrivate *priv = NM_SETTING_TEAM_PORT_GET_PRIVATE (object); - - g_free (priv->config); - - G_OBJECT_CLASS (nm_setting_team_port_parent_class)->finalize (object); -} - -static void -nm_setting_team_port_class_init (NMSettingTeamPortClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingTeamPortPrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->finalize = finalize; - parent_class->verify = verify; - - /* Properties */ - /** - * NMSettingTeamPort:config: - * - * The JSON configuration for the team port. The property should contain raw - * JSON configuration data suitable for teamd, because the value is passed - * directly to teamd. If not specified, the default configuration is - * used. See man teamd.conf for the format details. - **/ - g_object_class_install_property - (object_class, PROP_CONFIG, - g_param_spec_string (NM_SETTING_TEAM_PORT_CONFIG, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-util/nm-setting-team-port.h b/libnm-util/nm-setting-team-port.h deleted file mode 100644 index 2da6518b7a..0000000000 --- a/libnm-util/nm-setting-team-port.h +++ /dev/null @@ -1,79 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2013 Jiri Pirko <jiri@resnulli.us> - */ - -#ifndef NM_SETTING_TEAM_PORT_H -#define NM_SETTING_TEAM_PORT_H - -#include "nm-setting.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SETTING_TEAM_PORT (nm_setting_team_port_get_type ()) -#define NM_SETTING_TEAM_PORT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_TEAM_PORT, NMSettingTeamPort)) -#define NM_SETTING_TEAM_PORT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_TEAM_PORT, NMSettingTeamPortClass)) -#define NM_IS_SETTING_TEAM_PORT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_TEAM_PORT)) -#define NM_IS_SETTING_TEAM_PORT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_TEAM_PORT)) -#define NM_SETTING_TEAM_PORT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_TEAM_PORT, NMSettingTeamPortClass)) - -#define NM_SETTING_TEAM_PORT_SETTING_NAME "team-port" - -/** - * NMSettingTeamPortError: - * @NM_SETTING_TEAM_PORT_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_TEAM_PORT_ERROR_INVALID_PROPERTY: the property was invalid - * @NM_SETTING_TEAM_PORT_ERROR_MISSING_PROPERTY: the property was missing and - * is required - */ -typedef enum { - NM_SETTING_TEAM_PORT_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_SETTING_TEAM_PORT_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/ - NM_SETTING_TEAM_PORT_ERROR_MISSING_PROPERTY, /*< nick=MissingProperty >*/ -} NMSettingTeamPortError; - -#define NM_SETTING_TEAM_PORT_ERROR nm_setting_team_port_error_quark () -GQuark nm_setting_team_port_error_quark (void); - -#define NM_SETTING_TEAM_PORT_CONFIG "config" - -typedef struct { - NMSetting parent; -} NMSettingTeamPort; - -typedef struct { - NMSettingClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); -} NMSettingTeamPortClass; - -NM_AVAILABLE_IN_0_9_10 -GType nm_setting_team_port_get_type (void); - -NM_AVAILABLE_IN_0_9_10 -NMSetting * nm_setting_team_port_new (void); - -const char * nm_setting_team_port_get_config (NMSettingTeamPort *setting); - -G_END_DECLS - -#endif /* NM_SETTING_TEAM_PORT_H */ diff --git a/libnm-util/nm-setting-team.c b/libnm-util/nm-setting-team.c deleted file mode 100644 index 0ec40320c6..0000000000 --- a/libnm-util/nm-setting-team.c +++ /dev/null @@ -1,254 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2013 Jiri Pirko <jiri@resnulli.us> - */ - -#include "nm-default.h" - -#include <string.h> -#include <stdlib.h> -#include <dbus/dbus-glib.h> - -#include "nm-setting-team.h" -#include "nm-param-spec-specialized.h" -#include "nm-utils.h" -#include "nm-utils-private.h" -#include "nm-dbus-glib-types.h" -#include "nm-setting-private.h" - -/** - * SECTION:nm-setting-team - * @short_description: Describes connection properties for teams - * @include: nm-setting-team.h - * - * The #NMSettingTeam object is a #NMSetting subclass that describes properties - * necessary for team connections. - * - * Since: 0.9.10 - **/ - -/** - * nm_setting_team_error_quark: - * - * Registers an error quark for #NMSettingTeam if necessary. - * - * Returns: the error quark used for #NMSettingTeam errors. - * - * Since: 0.9.10 - **/ -GQuark -nm_setting_team_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-team-error-quark"); - return quark; -} - -G_DEFINE_TYPE_WITH_CODE (NMSettingTeam, nm_setting_team, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_TEAM_SETTING_NAME, - g_define_type_id, - 1, - NM_SETTING_TEAM_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_TEAM) - -#define NM_SETTING_TEAM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_TEAM, NMSettingTeamPrivate)) - -typedef struct { - char *interface_name; - char *config; -} NMSettingTeamPrivate; - -enum { - PROP_0, - PROP_INTERFACE_NAME, - PROP_CONFIG, - LAST_PROP -}; - -/** - * nm_setting_team_new: - * - * Creates a new #NMSettingTeam object with default values. - * - * Returns: (transfer full): the new empty #NMSettingTeam object - * - * Since: 0.9.10 - **/ -NMSetting * -nm_setting_team_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_TEAM, NULL); -} - -/** - * nm_setting_team_get_interface_name: - * @setting: the #NMSettingTeam - * - * Returns: the #NMSettingTeam:interface-name property of the setting - * - * Since: 0.9.10 - **/ -const char * -nm_setting_team_get_interface_name (NMSettingTeam *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_TEAM (setting), NULL); - - return NM_SETTING_TEAM_GET_PRIVATE (setting)->interface_name; -} - -/** - * nm_setting_team_get_config: - * @setting: the #NMSettingTeam - * - * Returns: the #NMSettingTeam:config property of the setting - * - * Since: 0.9.10 - **/ -const char * -nm_setting_team_get_config (NMSettingTeam *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_TEAM (setting), NULL); - - return NM_SETTING_TEAM_GET_PRIVATE (setting)->config; -} - -static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - NMSettingTeamPrivate *priv = NM_SETTING_TEAM_GET_PRIVATE (setting); - - return _nm_setting_verify_deprecated_virtual_iface_name ( - priv->interface_name, FALSE, - NM_SETTING_TEAM_SETTING_NAME, NM_SETTING_TEAM_INTERFACE_NAME, - NM_SETTING_TEAM_ERROR, - NM_SETTING_TEAM_ERROR_INVALID_PROPERTY, - NM_SETTING_TEAM_ERROR_MISSING_PROPERTY, - all_settings, error); -} - -static const char * -get_virtual_iface_name (NMSetting *setting) -{ - NMSettingTeam *self = NM_SETTING_TEAM (setting); - - return nm_setting_team_get_interface_name (self); -} - -static void -nm_setting_team_init (NMSettingTeam *setting) -{ -} - -static void -finalize (GObject *object) -{ - NMSettingTeamPrivate *priv = NM_SETTING_TEAM_GET_PRIVATE (object); - - g_free (priv->interface_name); - g_free (priv->config); - - G_OBJECT_CLASS (nm_setting_team_parent_class)->finalize (object); -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSettingTeamPrivate *priv = NM_SETTING_TEAM_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_INTERFACE_NAME: - g_free (priv->interface_name); - priv->interface_name = g_value_dup_string (value); - break; - case PROP_CONFIG: - g_free (priv->config); - priv->config = g_value_dup_string (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSettingTeam *setting = NM_SETTING_TEAM (object); - - switch (prop_id) { - case PROP_INTERFACE_NAME: - g_value_set_string (value, nm_setting_team_get_interface_name (setting)); - break; - case PROP_CONFIG: - g_value_set_string (value, nm_setting_team_get_config (setting)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_setting_team_class_init (NMSettingTeamClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingTeamPrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->finalize = finalize; - parent_class->verify = verify; - parent_class->get_virtual_iface_name = get_virtual_iface_name; - - /* Properties */ - /** - * NMSettingTeam:interface-name: - * - * The name of the virtual in-kernel team network interface - **/ - g_object_class_install_property - (object_class, PROP_INTERFACE_NAME, - g_param_spec_string (NM_SETTING_TEAM_INTERFACE_NAME, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingTeam:config: - * - * The JSON configuration for the team network interface. The property - * should contain raw JSON configuration data suitable for teamd, because - * the value is passed directly to teamd. If not specified, the default - * configuration is used. See man teamd.conf for the format details. - **/ - g_object_class_install_property - (object_class, PROP_CONFIG, - g_param_spec_string (NM_SETTING_TEAM_CONFIG, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-util/nm-setting-team.h b/libnm-util/nm-setting-team.h deleted file mode 100644 index 87aa769506..0000000000 --- a/libnm-util/nm-setting-team.h +++ /dev/null @@ -1,81 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2013 Jiri Pirko <jiri@resnulli.us> - */ - -#ifndef NM_SETTING_TEAM_H -#define NM_SETTING_TEAM_H - -#include "nm-setting.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SETTING_TEAM (nm_setting_team_get_type ()) -#define NM_SETTING_TEAM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_TEAM, NMSettingTeam)) -#define NM_SETTING_TEAM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_TEAM, NMSettingTeamClass)) -#define NM_IS_SETTING_TEAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_TEAM)) -#define NM_IS_SETTING_TEAM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_TEAM)) -#define NM_SETTING_TEAM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_TEAM, NMSettingTeamClass)) - -#define NM_SETTING_TEAM_SETTING_NAME "team" - -/** - * NMSettingTeamError: - * @NM_SETTING_TEAM_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_TEAM_ERROR_INVALID_PROPERTY: the property was invalid - * @NM_SETTING_TEAM_ERROR_MISSING_PROPERTY: the property was missing and is - * required - */ -typedef enum { - NM_SETTING_TEAM_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_SETTING_TEAM_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/ - NM_SETTING_TEAM_ERROR_MISSING_PROPERTY, /*< nick=MissingProperty >*/ -} NMSettingTeamError; - -#define NM_SETTING_TEAM_ERROR nm_setting_team_error_quark () -GQuark nm_setting_team_error_quark (void); - -#define NM_SETTING_TEAM_INTERFACE_NAME "interface-name" -#define NM_SETTING_TEAM_CONFIG "config" - -typedef struct { - NMSetting parent; -} NMSettingTeam; - -typedef struct { - NMSettingClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); -} NMSettingTeamClass; - -NM_AVAILABLE_IN_0_9_10 -GType nm_setting_team_get_type (void); - -NM_AVAILABLE_IN_0_9_10 -NMSetting * nm_setting_team_new (void); - -const char * nm_setting_team_get_interface_name (NMSettingTeam *setting); -const char * nm_setting_team_get_config (NMSettingTeam *setting); - -G_END_DECLS - -#endif /* NM_SETTING_TEAM_H */ diff --git a/libnm-util/nm-setting-vlan.c b/libnm-util/nm-setting-vlan.c deleted file mode 100644 index f835e07f4c..0000000000 --- a/libnm-util/nm-setting-vlan.c +++ /dev/null @@ -1,852 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2011 - 2014 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <stdlib.h> -#include <string.h> -#include <dbus/dbus-glib.h> - -#include "nm-setting-vlan.h" -#include "nm-param-spec-specialized.h" -#include "nm-utils.h" -#include "nm-dbus-glib-types.h" -#include "nm-setting-connection.h" -#include "nm-setting-private.h" - -/** - * SECTION:nm-setting-vlan - * @short_description: Describes connection properties for VLAN interfaces - * @include: nm-setting-vlan.h - * - * The #NMSettingVlan object is a #NMSetting subclass that describes properties - * necessary for connection to VLAN interfaces. - **/ - -/** - * nm_setting_vlan_error_quark: - * - * Registers an error quark for #NMSettingVlan if necessary. - * - * Returns: the error quark used for #NMSettingVlan errors. - **/ -GQuark -nm_setting_vlan_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-vlan-error-quark"); - return quark; -} - -G_DEFINE_TYPE_WITH_CODE (NMSettingVlan, nm_setting_vlan, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_VLAN_SETTING_NAME, - g_define_type_id, - 1, - NM_SETTING_VLAN_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_VLAN) - -#define NM_SETTING_VLAN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_VLAN, NMSettingVlanPrivate)) - -typedef struct { - char *interface_name; - char *parent; - guint32 id; - guint32 flags; - GSList *ingress_priority_map; - GSList *egress_priority_map; -} NMSettingVlanPrivate; - -enum { - PROP_0, - PROP_INTERFACE_NAME, - PROP_PARENT, - PROP_ID, - PROP_FLAGS, - PROP_INGRESS_PRIORITY_MAP, - PROP_EGRESS_PRIORITY_MAP, - LAST_PROP -}; - -#define MAX_SKB_PRIO G_MAXUINT32 -#define MAX_8021P_PRIO 7 /* Max 802.1p priority */ - -typedef struct { - guint32 from; - guint32 to; -} PriorityMap; - -/** - * nm_setting_vlan_new: - * - * Creates a new #NMSettingVlan object with default values. - * - * Returns: (transfer full): the new empty #NMSettingVlan object - **/ -NMSetting * -nm_setting_vlan_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_VLAN, NULL); -} - -/** - * nm_setting_vlan_get_interface_name: - * @setting: the #NMSettingVlan - * - * Returns: the #NMSettingVlan:interface_name property of the setting - **/ -const char * -nm_setting_vlan_get_interface_name (NMSettingVlan *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_VLAN (setting), NULL); - return NM_SETTING_VLAN_GET_PRIVATE (setting)->interface_name; -} - -/** - * nm_setting_vlan_get_parent: - * @setting: the #NMSettingVlan - * - * Returns: the #NMSettingVlan:parent property of the setting - **/ -const char * -nm_setting_vlan_get_parent (NMSettingVlan *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_VLAN (setting), NULL); - return NM_SETTING_VLAN_GET_PRIVATE (setting)->parent; -} - -/** - * nm_setting_vlan_get_id: - * @setting: the #NMSettingVlan - * - * Returns: the #NMSettingVlan:id property of the setting - **/ -guint32 -nm_setting_vlan_get_id (NMSettingVlan *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_VLAN (setting), 0); - return NM_SETTING_VLAN_GET_PRIVATE (setting)->id; -} - -/** - * nm_setting_vlan_get_flags: - * @setting: the #NMSettingVlan - * - * Returns: the #NMSettingVlan:flags property of the setting - **/ -guint32 -nm_setting_vlan_get_flags (NMSettingVlan *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_VLAN (setting), 0); - return NM_SETTING_VLAN_GET_PRIVATE (setting)->flags; -} - -static guint32 -get_max_prio (NMVlanPriorityMap map, gboolean from) -{ - if (map == NM_VLAN_INGRESS_MAP) - return from ? MAX_8021P_PRIO : MAX_SKB_PRIO; - else if (map == NM_VLAN_EGRESS_MAP) - return from ? MAX_SKB_PRIO : MAX_8021P_PRIO; - g_assert_not_reached (); -} - -static PriorityMap * -priority_map_new_from_str (NMVlanPriorityMap map, const char *str) -{ - PriorityMap *p = NULL; - char **t = NULL; - guint32 len; - guint64 from, to; - - g_return_val_if_fail (str && str[0], NULL); - - t = g_strsplit (str, ":", 0); - len = g_strv_length (t); - if (len == 2) { - from = g_ascii_strtoull (t[0], NULL, 10); - to = g_ascii_strtoull (t[1], NULL, 10); - - if ((from <= get_max_prio (map, TRUE)) && (to <= get_max_prio (map, FALSE))) { - p = g_malloc0 (sizeof (PriorityMap)); - p->from = from; - p->to = to; - } - } else { - /* Warn */ - g_warn_if_fail (len == 2); - } - - g_strfreev (t); - return p; -} - -static void -priority_map_free (PriorityMap *map) -{ - g_return_if_fail (map != NULL); - g_free (map); -} - -static GSList * -get_map (NMSettingVlan *self, NMVlanPriorityMap map) -{ - if (map == NM_VLAN_INGRESS_MAP) - return NM_SETTING_VLAN_GET_PRIVATE (self)->ingress_priority_map; - else if (map == NM_VLAN_EGRESS_MAP) - return NM_SETTING_VLAN_GET_PRIVATE (self)->egress_priority_map; - g_assert_not_reached (); - return NULL; -} - -static void -set_map (NMSettingVlan *self, NMVlanPriorityMap map, GSList *list) -{ - if (map == NM_VLAN_INGRESS_MAP) { - NM_SETTING_VLAN_GET_PRIVATE (self)->ingress_priority_map = list; - g_object_notify (G_OBJECT (self), NM_SETTING_VLAN_INGRESS_PRIORITY_MAP); - } else if (map == NM_VLAN_EGRESS_MAP) { - NM_SETTING_VLAN_GET_PRIVATE (self)->egress_priority_map = list; - g_object_notify (G_OBJECT (self), NM_SETTING_VLAN_EGRESS_PRIORITY_MAP); - } else - g_assert_not_reached (); -} - -/** - * nm_setting_vlan_add_priority_str: - * @setting: the #NMSettingVlan - * @map: the type of priority map - * @str: the string which contains a priority map, like "3:7" - * - * Adds a priority map entry into either the #NMSettingVlan:ingress_priority_map - * or the #NMSettingVlan:egress_priority_map properties. The priority map maps - * the Linux SKB priorities to 802.1p priorities. - * - * Returns: %TRUE if the entry was successfully added to the list, or it - * overwrote the old value, %FALSE if error - */ -gboolean -nm_setting_vlan_add_priority_str (NMSettingVlan *setting, - NMVlanPriorityMap map, - const char *str) -{ - GSList *list = NULL, *iter = NULL; - PriorityMap *item = NULL; - - g_return_val_if_fail (NM_IS_SETTING_VLAN (setting), FALSE); - g_return_val_if_fail (map == NM_VLAN_INGRESS_MAP || map == NM_VLAN_EGRESS_MAP, FALSE); - g_return_val_if_fail (str && str[0], FALSE); - - list = get_map (setting, map); - - item = priority_map_new_from_str (map, str); - if (!item) - g_return_val_if_reached (FALSE); - - /* Duplicates get replaced */ - for (iter = list; iter; iter = g_slist_next (iter)) { - PriorityMap *p = iter->data; - - if (p->from == item->from) { - p->to = item->to; - g_free (item); - if (map == NM_VLAN_INGRESS_MAP) - g_object_notify (G_OBJECT (setting), NM_SETTING_VLAN_INGRESS_PRIORITY_MAP); - else - g_object_notify (G_OBJECT (setting), NM_SETTING_VLAN_EGRESS_PRIORITY_MAP); - return TRUE; - } - } - - set_map (setting, map, g_slist_append (list, item)); - return TRUE; -} - -/** - * nm_setting_vlan_get_num_priorities: - * @setting: the #NMSettingVlan - * @map: the type of priority map - * - * Returns the number of entries in the - * #NMSettingVlan:ingress_priority_map or #NMSettingVlan:egress_priority_map - * properties of this setting. - * - * Returns: return the number of ingress/egress priority entries, -1 if error - **/ -gint32 -nm_setting_vlan_get_num_priorities (NMSettingVlan *setting, NMVlanPriorityMap map) -{ - g_return_val_if_fail (NM_IS_SETTING_VLAN (setting), -1); - g_return_val_if_fail (map == NM_VLAN_INGRESS_MAP || map == NM_VLAN_EGRESS_MAP, -1); - - return g_slist_length (get_map (setting, map)); -} - -/** - * nm_setting_vlan_get_priority: - * @setting: the #NMSettingVlan - * @map: the type of priority map - * @idx: the zero-based index of the ingress/egress priority map entry - * @out_from: (out): on return the value of the priority map's 'from' item - * @out_to: (out): on return the value of priority map's 'to' item - * - * Retrieve one of the entries of the #NMSettingVlan:ingress_priority_map - * or #NMSettingVlan:egress_priority_map properties of this setting. - * - * Returns: %TRUE if a priority map was returned, %FALSE if error - **/ -gboolean -nm_setting_vlan_get_priority (NMSettingVlan *setting, - NMVlanPriorityMap map, - guint32 idx, - guint32 *out_from, - guint32 *out_to) -{ - GSList *list = NULL; - PriorityMap *item = NULL; - - g_return_val_if_fail (NM_IS_SETTING_VLAN (setting), FALSE); - g_return_val_if_fail (map == NM_VLAN_INGRESS_MAP || map == NM_VLAN_EGRESS_MAP, FALSE); - g_return_val_if_fail (out_from != NULL, FALSE); - g_return_val_if_fail (out_to != NULL, FALSE); - - list = get_map (setting, map); - g_return_val_if_fail (idx < g_slist_length (list), FALSE); - - item = g_slist_nth_data (list, idx); - g_assert (item); - *out_from = item->from; - *out_to = item->to; - return TRUE; -} - -/** - * nm_setting_vlan_add_priority: - * @setting: the #NMSettingVlan - * @map: the type of priority map - * @from: the priority to map to @to - * @to: the priority to map @from to - * - * Adds a priority mapping to the #NMSettingVlan:ingress_priority_map or - * #NMSettingVlan:egress_priority_map properties of the setting. If @from is - * already in the given priority map, this function will overwrite the - * existing entry with the new @to. - * - * If @map is #NM_VLAN_INGRESS_MAP then @from is the incoming 802.1q VLAN - * Priority Code Point (PCP) value, and @to is the Linux SKB priority value. - * - * If @map is #NM_VLAN_EGRESS_MAP then @from is the Linux SKB priority value and - * @to is the outgoing 802.1q VLAN Priority Code Point (PCP) value. - * - * Returns: %TRUE if the new priority mapping was successfully added to the - * list, %FALSE if error - */ -gboolean -nm_setting_vlan_add_priority (NMSettingVlan *setting, - NMVlanPriorityMap map, - guint32 from, - guint32 to) -{ - GSList *list = NULL, *iter = NULL; - PriorityMap *item; - - g_return_val_if_fail (NM_IS_SETTING_VLAN (setting), FALSE); - g_return_val_if_fail (map == NM_VLAN_INGRESS_MAP || map == NM_VLAN_EGRESS_MAP, FALSE); - - list = get_map (setting, map); - for (iter = list; iter; iter = g_slist_next (iter)) { - item = iter->data; - if (item->from == from) { - item->to = to; - if (map == NM_VLAN_INGRESS_MAP) - g_object_notify (G_OBJECT (setting), NM_SETTING_VLAN_INGRESS_PRIORITY_MAP); - else - g_object_notify (G_OBJECT (setting), NM_SETTING_VLAN_EGRESS_PRIORITY_MAP); - return TRUE; - } - } - - item = g_malloc0 (sizeof (PriorityMap)); - item->from = from; - item->to = to; - set_map (setting, map, g_slist_append (list, item)); - - return TRUE; -} - -/** - * nm_setting_vlan_remove_priority: - * @setting: the #NMSettingVlan - * @map: the type of priority map - * @idx: the zero-based index of the priority map to remove - * - * Removes the priority map at index @idx from the - * #NMSettingVlan:ingress_priority_map or #NMSettingVlan:egress_priority_map - * properties. - */ -void -nm_setting_vlan_remove_priority (NMSettingVlan *setting, - NMVlanPriorityMap map, - guint32 idx) -{ - GSList *list = NULL, *item = NULL; - - g_return_if_fail (NM_IS_SETTING_VLAN (setting)); - g_return_if_fail (map == NM_VLAN_INGRESS_MAP || map == NM_VLAN_EGRESS_MAP); - - list = get_map (setting, map); - g_return_if_fail (idx < g_slist_length (list)); - - item = g_slist_nth (list, idx); - priority_map_free ((PriorityMap *) (item->data)); - set_map (setting, map, g_slist_delete_link (list, item)); -} - -/** - * nm_setting_vlan_remove_priority_by_value: - * @setting: the #NMSettingVlan - * @map: the type of priority map - * @from: the priority to map to @to - * @to: the priority to map @from to - * - * Removes the priority map @form:@to from the #NMSettingVlan:ingress_priority_map - * or #NMSettingVlan:egress_priority_map (according to @map argument) - * properties. - * - * Returns: %TRUE if the priority mapping was found and removed; %FALSE if it was not. - * - * Since: 0.9.10 - */ -gboolean -nm_setting_vlan_remove_priority_by_value (NMSettingVlan *setting, - NMVlanPriorityMap map, - guint32 from, - guint32 to) -{ - GSList *list = NULL, *iter = NULL; - PriorityMap *item; - - g_return_val_if_fail (NM_IS_SETTING_VLAN (setting), FALSE); - g_return_val_if_fail (map == NM_VLAN_INGRESS_MAP || map == NM_VLAN_EGRESS_MAP, FALSE); - - list = get_map (setting, map); - for (iter = list; iter; iter = g_slist_next (iter)) { - item = iter->data; - if (item->from == from && item->to == to) { - priority_map_free ((PriorityMap *) (iter->data)); - set_map (setting, map, g_slist_delete_link (list, iter)); - return TRUE; - } - } - return FALSE; -} - -/** - * nm_setting_vlan_remove_priority_str_by_value: - * @setting: the #NMSettingVlan - * @map: the type of priority map - * @str: the string which contains a priority map, like "3:7" - * - * Removes the priority map @str from the #NMSettingVlan:ingress_priority_map - * or #NMSettingVlan:egress_priority_map (according to @map argument) - * properties. - * - * Returns: %TRUE if the priority mapping was found and removed; %FALSE if it was not. - * - * Since: 0.9.10 - */ -gboolean -nm_setting_vlan_remove_priority_str_by_value (NMSettingVlan *setting, - NMVlanPriorityMap map, - const char *str) -{ - PriorityMap *item; - gboolean found; - - g_return_val_if_fail (NM_IS_SETTING_VLAN (setting), FALSE); - g_return_val_if_fail (map == NM_VLAN_INGRESS_MAP || map == NM_VLAN_EGRESS_MAP, FALSE); - - item = priority_map_new_from_str (map, str); - if (!item) - return FALSE; - - found = nm_setting_vlan_remove_priority_by_value (setting, map, item->from, item->to); - g_free (item); - return found; -} - -/** - * nm_setting_vlan_clear_priorities: - * @setting: the #NMSettingVlan - * @map: the type of priority map - * - * Clear all the entries from #NMSettingVlan:ingress_priority_map or - * #NMSettingVlan:egress_priority_map properties. - */ -void -nm_setting_vlan_clear_priorities (NMSettingVlan *setting, NMVlanPriorityMap map) -{ - GSList *list = NULL; - - g_return_if_fail (NM_IS_SETTING_VLAN (setting)); - g_return_if_fail (map == NM_VLAN_INGRESS_MAP || map == NM_VLAN_EGRESS_MAP); - - list = get_map (setting, map); - g_slist_free_full (list, g_free); - set_map (setting, map, NULL); -} - -/*****************************************************************************/ - -static void -nm_setting_vlan_init (NMSettingVlan *setting) -{ -} - -static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - NMSettingVlanPrivate *priv = NM_SETTING_VLAN_GET_PRIVATE (setting); - NMSettingConnection *s_con = NULL; - NMSettingWired *s_wired = NULL; - GSList *iter; - - for (iter = all_settings; iter; iter = iter->next) { - if (NM_IS_SETTING_CONNECTION (iter->data)) - s_con = iter->data; - else if (NM_IS_SETTING_WIRED (iter->data)) - s_wired = iter->data; - } - - if (priv->parent) { - if (nm_utils_is_uuid (priv->parent)) { - /* If we have an NMSettingConnection:master with slave-type="vlan", - * then it must be the same UUID. - */ - if (s_con) { - const char *master = NULL, *slave_type = NULL; - - slave_type = nm_setting_connection_get_slave_type (s_con); - if (!g_strcmp0 (slave_type, NM_SETTING_VLAN_SETTING_NAME)) - master = nm_setting_connection_get_master (s_con); - - if (master && g_strcmp0 (priv->parent, master) != 0) { - g_set_error (error, - NM_SETTING_VLAN_ERROR, - NM_SETTING_VLAN_ERROR_INVALID_PARENT, - _("'%s' value doesn't match '%s=%s'"), - priv->parent, NM_SETTING_CONNECTION_MASTER, master); - g_prefix_error (error, "%s.%s: ", NM_SETTING_VLAN_SETTING_NAME, NM_SETTING_VLAN_PARENT); - return FALSE; - } - } - } else if (!nm_utils_iface_valid_name (priv->parent)) { - /* parent must be either a UUID or an interface name */ - g_set_error (error, - NM_SETTING_VLAN_ERROR, - NM_SETTING_VLAN_ERROR_INVALID_PROPERTY, - _("'%s' is neither an UUID nor an interface name"), - priv->parent); - g_prefix_error (error, "%s.%s: ", NM_SETTING_VLAN_SETTING_NAME, NM_SETTING_VLAN_PARENT); - return FALSE; - } - } else { - /* If parent is NULL, the parent must be specified via - * NMSettingWired:mac-address. - */ - if (!s_wired || !nm_setting_wired_get_mac_address (s_wired)) { - g_set_error (error, - NM_SETTING_VLAN_ERROR, - NM_SETTING_VLAN_ERROR_MISSING_PROPERTY, - _("property is not specified and neither is '%s:%s'"), - NM_SETTING_WIRED_SETTING_NAME, NM_SETTING_WIRED_MAC_ADDRESS); - g_prefix_error (error, "%s.%s: ", NM_SETTING_VLAN_SETTING_NAME, NM_SETTING_VLAN_PARENT); - return FALSE; - } - } - - if (priv->flags & ~NM_VLAN_FLAGS_ALL) { - g_set_error_literal (error, - NM_SETTING_VLAN_ERROR, - NM_SETTING_VLAN_ERROR_INVALID_PROPERTY, - _("flags are invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_VLAN_SETTING_NAME, NM_SETTING_VLAN_FLAGS); - return FALSE; - } - - if (priv->id >= 4095) { - g_set_error (error, - NM_SETTING_VLAN_ERROR, - NM_SETTING_VLAN_ERROR_INVALID_PROPERTY, - _("the vlan id must be in range 0-4094 but is %u"), - priv->id); - g_prefix_error (error, "%s.%s: ", NM_SETTING_VLAN_SETTING_NAME, NM_SETTING_VLAN_ID); - return FALSE; - } - - /* If interface_name is specified, it must be a valid interface name. We - * don't check that it matches parent and/or id, because we allow - * renaming vlans to arbitrary names. - */ - return _nm_setting_verify_deprecated_virtual_iface_name ( - priv->interface_name, TRUE, - NM_SETTING_VLAN_SETTING_NAME, NM_SETTING_VLAN_INTERFACE_NAME, - NM_SETTING_VLAN_ERROR, - NM_SETTING_VLAN_ERROR_INVALID_PROPERTY, - NM_SETTING_VLAN_ERROR_MISSING_PROPERTY, - all_settings, error); -} - -static const char * -get_virtual_iface_name (NMSetting *setting) -{ - return nm_setting_vlan_get_interface_name (NM_SETTING_VLAN (setting)); -} - -static GSList * -priority_stringlist_to_maplist (NMVlanPriorityMap map, GSList *strlist) -{ - GSList *list = NULL, *iter; - - for (iter = strlist; iter; iter = g_slist_next (iter)) { - PriorityMap *item; - - item = priority_map_new_from_str (map, (const char *) iter->data); - if (item) - list = g_slist_prepend (list, item); - } - return g_slist_reverse (list); -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSettingVlan *setting = NM_SETTING_VLAN (object); - NMSettingVlanPrivate *priv = NM_SETTING_VLAN_GET_PRIVATE (setting); - - switch (prop_id) { - case PROP_INTERFACE_NAME: - g_free (priv->interface_name); - priv->interface_name = g_value_dup_string (value); - break; - case PROP_PARENT: - g_free (priv->parent); - priv->parent = g_value_dup_string (value); - break; - case PROP_ID: - priv->id = g_value_get_uint (value); - break; - case PROP_FLAGS: - priv->flags = g_value_get_uint (value); - break; - case PROP_INGRESS_PRIORITY_MAP: - g_slist_free_full (priv->ingress_priority_map, g_free); - priv->ingress_priority_map = - priority_stringlist_to_maplist (NM_VLAN_INGRESS_MAP, g_value_get_boxed (value)); - break; - case PROP_EGRESS_PRIORITY_MAP: - g_slist_free_full (priv->egress_priority_map, g_free); - priv->egress_priority_map = - priority_stringlist_to_maplist (NM_VLAN_EGRESS_MAP, g_value_get_boxed (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static GSList * -priority_maplist_to_stringlist (GSList *list) -{ - GSList *strlist = NULL, *iter; - - for (iter = list; iter; iter = g_slist_next (iter)) { - PriorityMap *item = iter->data; - - strlist = g_slist_prepend (strlist, g_strdup_printf ("%d:%d", item->from, item->to)); - } - return g_slist_reverse (strlist); -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSettingVlan *setting = NM_SETTING_VLAN (object); - NMSettingVlanPrivate *priv = NM_SETTING_VLAN_GET_PRIVATE (setting); - - switch (prop_id) { - case PROP_INTERFACE_NAME: - g_value_set_string (value, priv->interface_name); - break; - case PROP_PARENT: - g_value_set_string (value, priv->parent); - break; - case PROP_ID: - g_value_set_uint (value, priv->id); - break; - case PROP_FLAGS: - g_value_set_uint (value, priv->flags); - break; - case PROP_INGRESS_PRIORITY_MAP: - g_value_take_boxed (value, priority_maplist_to_stringlist (priv->ingress_priority_map)); - break; - case PROP_EGRESS_PRIORITY_MAP: - g_value_take_boxed (value, priority_maplist_to_stringlist (priv->egress_priority_map)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -finalize (GObject *object) -{ - NMSettingVlan *setting = NM_SETTING_VLAN (object); - NMSettingVlanPrivate *priv = NM_SETTING_VLAN_GET_PRIVATE (setting); - - g_free (priv->interface_name); - g_free (priv->parent); - g_slist_free_full (priv->ingress_priority_map, g_free); - g_slist_free_full (priv->egress_priority_map, g_free); - - G_OBJECT_CLASS (nm_setting_vlan_parent_class)->finalize (object); -} - -static void -nm_setting_vlan_class_init (NMSettingVlanClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingVlanPrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->finalize = finalize; - parent_class->verify = verify; - parent_class->get_virtual_iface_name = get_virtual_iface_name; - - /* Properties */ - - /** - * NMSettingVlan:interface-name: - * - * If given, specifies the kernel name of the VLAN interface. If not given, - * a default name will be constructed from the interface described by the - * parent interface and the #NMSettingVlan:id property, eg "eth2.1". The - * parent interface may be given by the #NMSettingVlan:parent property or by - * the #NMSettingWired:mac-address property of an #NMSettingWired setting. - **/ - g_object_class_install_property - (object_class, PROP_INTERFACE_NAME, - g_param_spec_string (NM_SETTING_VLAN_INTERFACE_NAME, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingVlan:parent: - * - * If given, specifies the parent interface name or parent connection UUID - * from which this VLAN interface should be created. If this property is - * not specified, the connection must contain an #NMSettingWired setting - * with a #NMSettingWired:mac-address property. - **/ - g_object_class_install_property - (object_class, PROP_PARENT, - g_param_spec_string (NM_SETTING_VLAN_PARENT, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingVlan:id: - * - * The VLAN identifier that the interface created by this connection should - * be assigned. - **/ - g_object_class_install_property - (object_class, PROP_ID, - g_param_spec_uint (NM_SETTING_VLAN_ID, "", "", - 0, 4095, 0, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingVlan:flags: - * - * One or more flags which control the behavior and features of the VLAN - * interface. Flags include %NM_VLAN_FLAG_REORDER_HEADERS (reordering of - * output packet headers), %NM_VLAN_FLAG_GVRP (use of the GVRP protocol), - * and %NM_VLAN_FLAG_LOOSE_BINDING (loose binding of the interface to its - * master device's operating state), %NM_VLAN_FLAG_MVRP (use of the MVRP - * protocol). - **/ - g_object_class_install_property - (object_class, PROP_FLAGS, - g_param_spec_uint (NM_SETTING_VLAN_FLAGS, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingVlan:ingress-priority-map: - * - * For incoming packets, a list of mappings from 802.1p priorities to Linux - * SKB priorities. The mapping is given in the format "from:to" where both - * "from" and "to" are unsigned integers, ie "7:3". - **/ - g_object_class_install_property - (object_class, PROP_INGRESS_PRIORITY_MAP, - _nm_param_spec_specialized (NM_SETTING_VLAN_INGRESS_PRIORITY_MAP, "", "", - DBUS_TYPE_G_LIST_OF_STRING, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingVlan:egress-priority-map: - * - * For outgoing packets, a list of mappings from Linux SKB priorities to - * 802.1p priorities. The mapping is given in the format "from:to" where - * both "from" and "to" are unsigned integers, ie "7:3". - **/ - g_object_class_install_property - (object_class, PROP_EGRESS_PRIORITY_MAP, - _nm_param_spec_specialized (NM_SETTING_VLAN_EGRESS_PRIORITY_MAP, "", "", - DBUS_TYPE_G_LIST_OF_STRING, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-util/nm-setting-vlan.h b/libnm-util/nm-setting-vlan.h deleted file mode 100644 index ce42dd4154..0000000000 --- a/libnm-util/nm-setting-vlan.h +++ /dev/null @@ -1,164 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2011 - 2014 Red Hat, Inc. - */ - -#ifndef NM_SETTING_VLAN_H -#define NM_SETTING_VLAN_H - -#include "nm-setting.h" -#include <linux/if_vlan.h> - -G_BEGIN_DECLS - -#define NM_TYPE_SETTING_VLAN (nm_setting_vlan_get_type ()) -#define NM_SETTING_VLAN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_VLAN, NMSettingVlan)) -#define NM_SETTING_VLAN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_VLANCONFIG, NMSettingVlanClass)) -#define NM_IS_SETTING_VLAN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_VLAN)) -#define NM_IS_SETTING_VLAN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_VLAN)) -#define NM_SETTING_VLAN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_VLAN, NMSettingVlanClass)) - -#define NM_SETTING_VLAN_SETTING_NAME "vlan" - -/** - * NMSettingVlanError: - * @NM_SETTING_VLAN_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_VLAN_ERROR_INVALID_PROPERTY: the property was invalid - * @NM_SETTING_VLAN_ERROR_MISSING_PROPERTY: the property was missing and is - * required - * @NM_SETTING_VLAN_ERROR_INVALID_PARENT: the VLAN parent was specified - * inconsistently - */ -typedef enum { - NM_SETTING_VLAN_ERROR_UNKNOWN = 0, /*< nick=Unknown >*/ - NM_SETTING_VLAN_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/ - NM_SETTING_VLAN_ERROR_MISSING_PROPERTY, /*< nick=MissingProperty >*/ - NM_SETTING_VLAN_ERROR_INVALID_PARENT /*< nick=InvalidParent >*/ -} NMSettingVlanError; - -#define NM_SETTING_VLAN_ERROR nm_setting_vlan_error_quark () -GQuark nm_setting_vlan_error_quark (void); - -#define NM_SETTING_VLAN_INTERFACE_NAME "interface-name" -#define NM_SETTING_VLAN_PARENT "parent" -#define NM_SETTING_VLAN_ID "id" -#define NM_SETTING_VLAN_FLAGS "flags" -#define NM_SETTING_VLAN_INGRESS_PRIORITY_MAP "ingress-priority-map" -#define NM_SETTING_VLAN_EGRESS_PRIORITY_MAP "egress-priority-map" - -typedef struct { - NMSetting parent; -} NMSettingVlan; - -typedef struct { - NMSettingClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); -} NMSettingVlanClass; - -/** - * NMVlanPriorityMap: - * @NM_VLAN_INGRESS_MAP: map for incoming data - * @NM_VLAN_EGRESS_MAP: map for outgoing data - * - * A selector for traffic priority maps; these map Linux SKB priorities - * to 802.1p priorities used in VLANs. - **/ -typedef enum { - NM_VLAN_INGRESS_MAP, - NM_VLAN_EGRESS_MAP -} NMVlanPriorityMap; - -/** - * NMVlanFlags: - * @NM_VLAN_FLAG_REORDER_HEADERS: indicates that this interface should reorder - * outgoing packet headers to look more like a non-VLAN Ethernet interface - * @NM_VLAN_FLAG_GVRP: indicates that this interface should use GVRP to register - * itself with it's switch - * @NM_VLAN_FLAG_LOOSE_BINDING: indicates that this interface's operating - * state is tied to the underlying network interface but other details - * (like routing) are not. - * @NM_VLAN_FLAG_MVRP: indicates that this interface should use MVRP to register - * itself with it's switch - * - * #NMVlanFlags values control the behavior of the VLAN interface. - **/ -typedef enum { - NM_VLAN_FLAG_REORDER_HEADERS = 0x1, - NM_VLAN_FLAG_GVRP = 0x2, - NM_VLAN_FLAG_LOOSE_BINDING = 0x4, - NM_VLAN_FLAG_MVRP = 0x8, - - /* NOTE: if adding flags update nm-setting-vlan.c::verify() */ -} NMVlanFlags; - -#define NM_VLAN_FLAGS_ALL (NM_VLAN_FLAG_REORDER_HEADERS | \ - NM_VLAN_FLAG_GVRP | \ - NM_VLAN_FLAG_LOOSE_BINDING | \ - NM_VLAN_FLAG_MVRP) - -GType nm_setting_vlan_get_type (void); -NMSetting *nm_setting_vlan_new (void); - -const char *nm_setting_vlan_get_interface_name (NMSettingVlan *setting); -const char *nm_setting_vlan_get_parent (NMSettingVlan *setting); -guint32 nm_setting_vlan_get_id (NMSettingVlan *setting); -guint32 nm_setting_vlan_get_flags (NMSettingVlan *setting); - -gint32 nm_setting_vlan_get_num_priorities (NMSettingVlan *setting, NMVlanPriorityMap map); - -gboolean nm_setting_vlan_get_priority (NMSettingVlan *setting, - NMVlanPriorityMap map, - guint32 idx, - guint32 *out_from, - guint32 *out_to); - -gboolean nm_setting_vlan_add_priority (NMSettingVlan *setting, - NMVlanPriorityMap map, - guint32 from, - guint32 to); - -void nm_setting_vlan_remove_priority (NMSettingVlan *setting, - NMVlanPriorityMap map, - guint32 idx); - -NM_AVAILABLE_IN_0_9_10 -gboolean nm_setting_vlan_remove_priority_by_value (NMSettingVlan *setting, - NMVlanPriorityMap map, - guint32 from, - guint32 to); - -NM_AVAILABLE_IN_0_9_10 -gboolean nm_setting_vlan_remove_priority_str_by_value (NMSettingVlan *setting, - NMVlanPriorityMap map, - const char *str); - -void nm_setting_vlan_clear_priorities (NMSettingVlan *setting, NMVlanPriorityMap map); - -gboolean nm_setting_vlan_add_priority_str (NMSettingVlan *setting, - NMVlanPriorityMap map, - const char *str); - -G_END_DECLS - -#endif /* NM_SETTING_VLAN_H */ diff --git a/libnm-util/nm-setting-vpn.c b/libnm-util/nm-setting-vpn.c deleted file mode 100644 index 626ba4ca84..0000000000 --- a/libnm-util/nm-setting-vpn.c +++ /dev/null @@ -1,922 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2013 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <stdlib.h> -#include <dbus/dbus-glib.h> - -#include "nm-setting-vpn.h" -#include "nm-param-spec-specialized.h" -#include "nm-utils.h" -#include "nm-dbus-glib-types.h" -#include "nm-setting-private.h" - -/** - * SECTION:nm-setting-vpn - * @short_description: Describes connection properties for Virtual Private Networks - * @include: nm-setting-vpn.h - * - * The #NMSettingVPN object is a #NMSetting subclass that describes properties - * necessary for connection to Virtual Private Networks. NetworkManager uses - * a plugin architecture to allow easier use of new VPN types, and this - * setting abstracts the configuration for those plugins. Since the configuration - * options are only known to the VPN plugins themselves, the VPN configuration - * options are stored as key/value pairs of strings rather than GObject - * properties. - **/ - -/** - * nm_setting_vpn_error_quark: - * - * Registers an error quark for #NMSettingVPN if necessary. - * - * Returns: the error quark used for #NMSettingVPN errors. - **/ -GQuark -nm_setting_vpn_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-vpn-error-quark"); - return quark; -} - -G_DEFINE_TYPE_WITH_CODE (NMSettingVPN, nm_setting_vpn, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_VPN_SETTING_NAME, - g_define_type_id, - 1, - NM_SETTING_VPN_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_VPN) - -#define NM_SETTING_VPN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_VPN, NMSettingVPNPrivate)) - -typedef struct { - char *service_type; - - /* username of the user requesting this connection, thus - * it's really only valid for user connections, and it also - * should never be saved out to persistent config. - */ - char *user_name; - - /* Whether the VPN stays up across link changes, until the user - * explicitly disconnects it. - */ - gboolean persistent; - - /* The hash table is created at setting object - * init time and should not be replaced. It is - * a char * -> char * mapping, and both the key - * and value are owned by the hash table, and should - * be allocated with functions whose value can be - * freed with g_free(). Should not contain secrets. - */ - GHashTable *data; - - /* The hash table is created at setting object - * init time and should not be replaced. It is - * a char * -> char * mapping, and both the key - * and value are owned by the hash table, and should - * be allocated with functions whose value can be - * freed with g_free(). Should contain secrets only. - */ - GHashTable *secrets; -} NMSettingVPNPrivate; - -enum { - PROP_0, - PROP_SERVICE_TYPE, - PROP_USER_NAME, - PROP_PERSISTENT, - PROP_DATA, - PROP_SECRETS, - - LAST_PROP -}; - -/** - * nm_setting_vpn_new: - * - * Creates a new #NMSettingVPN object with default values. - * - * Returns: (transfer full): the new empty #NMSettingVPN object - **/ -NMSetting * -nm_setting_vpn_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_VPN, NULL); -} - -/** - * nm_setting_vpn_get_service_type: - * @setting: the #NMSettingVPN - * - * Returns the service name of the VPN, which identifies the specific VPN - * plugin that should be used to connect to this VPN. - * - * Returns: the VPN plugin's service name - **/ -const char * -nm_setting_vpn_get_service_type (NMSettingVPN *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_VPN (setting), NULL); - - return NM_SETTING_VPN_GET_PRIVATE (setting)->service_type; -} - -/** - * nm_setting_vpn_get_user_name: - * @setting: the #NMSettingVPN - * - * Returns: the #NMSettingVPN:user-name property of the setting - **/ -const char * -nm_setting_vpn_get_user_name (NMSettingVPN *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_VPN (setting), NULL); - - return NM_SETTING_VPN_GET_PRIVATE (setting)->user_name; -} - -/** - * nm_setting_vpn_get_persistent: - * @setting: the #NMSettingVPN - * - * Returns: the #NMSettingVPN:persistent property of the setting - **/ -gboolean -nm_setting_vpn_get_persistent (NMSettingVPN *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_VPN (setting), FALSE); - - return NM_SETTING_VPN_GET_PRIVATE (setting)->persistent; -} - -/** - * nm_setting_vpn_get_num_data_items: - * @setting: the #NMSettingVPN - * - * Gets number of key/value pairs of VPN configuration data. - * - * Returns: the number of VPN plugin specific configuration data items - **/ -guint32 -nm_setting_vpn_get_num_data_items (NMSettingVPN *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_VPN (setting), 0); - - return g_hash_table_size (NM_SETTING_VPN_GET_PRIVATE (setting)->data); -} - -/** - * nm_setting_vpn_add_data_item: - * @setting: the #NMSettingVPN - * @key: a name that uniquely identifies the given value @item - * @item: the value to be referenced by @key - * - * Establishes a relationship between @key and @item internally in the - * setting which may be retrieved later. Should not be used to store passwords - * or other secrets, which is what nm_setting_vpn_add_secret() is for. - **/ -void -nm_setting_vpn_add_data_item (NMSettingVPN *setting, - const char *key, - const char *item) -{ - g_return_if_fail (NM_IS_SETTING_VPN (setting)); - g_return_if_fail (key != NULL); - g_return_if_fail (strlen (key) > 0); - g_return_if_fail (item != NULL); - g_return_if_fail (strlen (item) > 0); - - g_hash_table_insert (NM_SETTING_VPN_GET_PRIVATE (setting)->data, - g_strdup (key), g_strdup (item)); - g_object_notify (G_OBJECT (setting), NM_SETTING_VPN_DATA); -} - -/** - * nm_setting_vpn_get_data_item: - * @setting: the #NMSettingVPN - * @key: the name of the data item to retrieve - * - * Retrieves the data item of a key/value relationship previously established - * by nm_setting_vpn_add_data_item(). - * - * Returns: the data item, if any - **/ -const char * -nm_setting_vpn_get_data_item (NMSettingVPN *setting, const char *key) -{ - g_return_val_if_fail (NM_IS_SETTING_VPN (setting), NULL); - - return (const char *) g_hash_table_lookup (NM_SETTING_VPN_GET_PRIVATE (setting)->data, key); -} - -/** - * nm_setting_vpn_remove_data_item: - * @setting: the #NMSettingVPN - * @key: the name of the data item to remove - * - * Deletes a key/value relationship previously established by - * nm_setting_vpn_add_data_item(). - * - * Returns: %TRUE if the data item was found and removed from the internal list, - * %FALSE if it was not. - **/ -gboolean -nm_setting_vpn_remove_data_item (NMSettingVPN *setting, const char *key) -{ - gboolean found; - - g_return_val_if_fail (NM_IS_SETTING_VPN (setting), FALSE); - - found = g_hash_table_remove (NM_SETTING_VPN_GET_PRIVATE (setting)->data, key); - if (found) - g_object_notify (G_OBJECT (setting), NM_SETTING_VPN_DATA); - return found; -} - -static void -foreach_item_helper (GHashTable *hash, - NMVPNIterFunc func, - gpointer user_data) -{ - GList *keys, *liter; - GSList *copied = NULL, *siter; - - g_return_if_fail (hash != NULL); - - /* Grab keys and copy them so that the callback func can modify - * the hash table items if it wants to. - */ - keys = g_hash_table_get_keys (hash); - for (liter = keys; liter; liter = g_list_next (liter)) - copied = g_slist_prepend (copied, g_strdup (liter->data)); - copied = g_slist_reverse (copied); - g_list_free (keys); - - for (siter = copied; siter; siter = g_slist_next (siter)) { - gpointer value; - - value = g_hash_table_lookup (hash, siter->data); - func (siter->data, value, user_data); - } - - g_slist_free_full (copied, g_free); -} - -/** - * nm_setting_vpn_foreach_data_item: - * @setting: a #NMSettingVPN - * @func: (scope call): an user provided function - * @user_data: data to be passed to @func - * - * Iterates all data items stored in this setting. It is safe to add, remove, - * and modify data items inside @func, though any additions or removals made - * during iteration will not be part of the iteration. - */ -void -nm_setting_vpn_foreach_data_item (NMSettingVPN *setting, - NMVPNIterFunc func, - gpointer user_data) -{ - g_return_if_fail (NM_IS_SETTING_VPN (setting)); - - foreach_item_helper (NM_SETTING_VPN_GET_PRIVATE (setting)->data, func, user_data); -} - -/** - * nm_setting_vpn_get_num_secrets: - * @setting: the #NMSettingVPN - * - * Gets number of VPN plugin specific secrets in the setting. - * - * Returns: the number of VPN plugin specific secrets - **/ -guint32 -nm_setting_vpn_get_num_secrets (NMSettingVPN *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_VPN (setting), 0); - - return g_hash_table_size (NM_SETTING_VPN_GET_PRIVATE (setting)->secrets); -} - -/** - * nm_setting_vpn_add_secret: - * @setting: the #NMSettingVPN - * @key: a name that uniquely identifies the given secret @secret - * @secret: the secret to be referenced by @key - * - * Establishes a relationship between @key and @secret internally in the - * setting which may be retrieved later. - **/ -void -nm_setting_vpn_add_secret (NMSettingVPN *setting, - const char *key, - const char *secret) -{ - g_return_if_fail (NM_IS_SETTING_VPN (setting)); - g_return_if_fail (key != NULL); - g_return_if_fail (strlen (key) > 0); - g_return_if_fail (secret != NULL); - g_return_if_fail (strlen (secret) > 0); - - g_hash_table_insert (NM_SETTING_VPN_GET_PRIVATE (setting)->secrets, - g_strdup (key), g_strdup (secret)); - g_object_notify (G_OBJECT (setting), NM_SETTING_VPN_SECRETS); -} - -/** - * nm_setting_vpn_get_secret: - * @setting: the #NMSettingVPN - * @key: the name of the secret to retrieve - * - * Retrieves the secret of a key/value relationship previously established - * by nm_setting_vpn_add_secret(). - * - * Returns: the secret, if any - **/ -const char * -nm_setting_vpn_get_secret (NMSettingVPN *setting, const char *key) -{ - g_return_val_if_fail (NM_IS_SETTING_VPN (setting), NULL); - - return (const char *) g_hash_table_lookup (NM_SETTING_VPN_GET_PRIVATE (setting)->secrets, key); -} - -/** - * nm_setting_vpn_remove_secret: - * @setting: the #NMSettingVPN - * @key: the name of the secret to remove - * - * Deletes a key/value relationship previously established by - * nm_setting_vpn_add_secret(). - * - * Returns: %TRUE if the secret was found and removed from the internal list, - * %FALSE if it was not. - **/ -gboolean -nm_setting_vpn_remove_secret (NMSettingVPN *setting, const char *key) -{ - gboolean found; - - g_return_val_if_fail (NM_IS_SETTING_VPN (setting), FALSE); - - found = g_hash_table_remove (NM_SETTING_VPN_GET_PRIVATE (setting)->secrets, key); - if (found) - g_object_notify (G_OBJECT (setting), NM_SETTING_VPN_SECRETS); - return found; -} - -/** - * nm_setting_vpn_foreach_secret: - * @setting: a #NMSettingVPN - * @func: (scope call): an user provided function - * @user_data: data to be passed to @func - * - * Iterates all secrets stored in this setting. It is safe to add, remove, - * and modify secrets inside @func, though any additions or removals made during - * iteration will not be part of the iteration. - */ -void -nm_setting_vpn_foreach_secret (NMSettingVPN *setting, - NMVPNIterFunc func, - gpointer user_data) -{ - g_return_if_fail (NM_IS_SETTING_VPN (setting)); - - foreach_item_helper (NM_SETTING_VPN_GET_PRIVATE (setting)->secrets, func, user_data); -} - -static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - NMSettingVPNPrivate *priv = NM_SETTING_VPN_GET_PRIVATE (setting); - - if (!priv->service_type) { - g_set_error_literal (error, - NM_SETTING_VPN_ERROR, - NM_SETTING_VPN_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_VPN_SETTING_NAME, NM_SETTING_VPN_SERVICE_TYPE); - return FALSE; - } - - if (!strlen (priv->service_type)) { - g_set_error_literal (error, - NM_SETTING_VPN_ERROR, - NM_SETTING_VPN_ERROR_INVALID_PROPERTY, - _("property is empty")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_VPN_SETTING_NAME, NM_SETTING_VPN_SERVICE_TYPE); - return FALSE; - } - - /* default username can be NULL, but can't be zero-length */ - if (priv->user_name && !strlen (priv->user_name)) { - g_set_error_literal (error, - NM_SETTING_VPN_ERROR, - NM_SETTING_VPN_ERROR_INVALID_PROPERTY, - _("property is empty")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_VPN_SETTING_NAME, NM_SETTING_VPN_USER_NAME); - return FALSE; - } - - return TRUE; -} - -static NMSettingUpdateSecretResult -update_secret_string (NMSetting *setting, - const char *key, - const char *value, - GError **error) -{ - NMSettingVPNPrivate *priv = NM_SETTING_VPN_GET_PRIVATE (setting); - - g_return_val_if_fail (key != NULL, NM_SETTING_UPDATE_SECRET_ERROR); - g_return_val_if_fail (value != NULL, NM_SETTING_UPDATE_SECRET_ERROR); - - if (!value || !strlen (value)) { - g_set_error (error, NM_SETTING_ERROR, - NM_SETTING_ERROR_PROPERTY_TYPE_MISMATCH, - "Secret %s was empty", key); - return NM_SETTING_UPDATE_SECRET_ERROR; - } - - if (g_strcmp0 (g_hash_table_lookup (priv->secrets, key), value) == 0) - return NM_SETTING_UPDATE_SECRET_SUCCESS_UNCHANGED; - - g_hash_table_insert (priv->secrets, g_strdup (key), g_strdup (value)); - return NM_SETTING_UPDATE_SECRET_SUCCESS_MODIFIED; -} - -static NMSettingUpdateSecretResult -update_secret_hash (NMSetting *setting, - GHashTable *secrets, - GError **error) -{ - NMSettingVPNPrivate *priv = NM_SETTING_VPN_GET_PRIVATE (setting); - GHashTableIter iter; - const char *name, *value; - NMSettingUpdateSecretResult result = NM_SETTING_UPDATE_SECRET_SUCCESS_UNCHANGED; - - g_return_val_if_fail (secrets != NULL, NM_SETTING_UPDATE_SECRET_ERROR); - - /* Make sure the items are valid */ - g_hash_table_iter_init (&iter, secrets); - while (g_hash_table_iter_next (&iter, (gpointer *) &name, (gpointer *) &value)) { - if (!name || !strlen (name)) { - g_set_error_literal (error, NM_SETTING_ERROR, - NM_SETTING_ERROR_PROPERTY_TYPE_MISMATCH, - "Secret name was empty"); - return NM_SETTING_UPDATE_SECRET_ERROR; - } - - if (!value || !strlen (value)) { - g_set_error (error, NM_SETTING_ERROR, - NM_SETTING_ERROR_PROPERTY_TYPE_MISMATCH, - "Secret %s value was empty", name); - return NM_SETTING_UPDATE_SECRET_ERROR; - } - } - - /* Now add the items to the settings' secrets list */ - g_hash_table_iter_init (&iter, secrets); - while (g_hash_table_iter_next (&iter, (gpointer *) &name, (gpointer *) &value)) { - if (value == NULL) { - g_warn_if_fail (value != NULL); - continue; - } - if (strlen (value) == 0) { - g_warn_if_fail (strlen (value) > 0); - continue; - } - - if (g_strcmp0 (g_hash_table_lookup (priv->secrets, name), value) == 0) - continue; - - g_hash_table_insert (priv->secrets, g_strdup (name), g_strdup (value)); - result = NM_SETTING_UPDATE_SECRET_SUCCESS_MODIFIED; - } - - return result; -} - -static int -update_one_secret (NMSetting *setting, const char *key, GValue *value, GError **error) -{ - NMSettingUpdateSecretResult success = NM_SETTING_UPDATE_SECRET_ERROR; - - g_return_val_if_fail (key != NULL, NM_SETTING_UPDATE_SECRET_ERROR); - g_return_val_if_fail (value != NULL, NM_SETTING_UPDATE_SECRET_ERROR); - - if (G_VALUE_HOLDS_STRING (value)) { - /* Passing the string properties individually isn't correct, and won't - * produce the correct result, but for some reason that's how it used - * to be done. So even though it's not correct, keep the code around - * for compatibility's sake. - */ - success = update_secret_string (setting, key, g_value_get_string (value), error); - } else if (G_VALUE_HOLDS (value, DBUS_TYPE_G_MAP_OF_STRING)) { - if (strcmp (key, NM_SETTING_VPN_SECRETS) != 0) { - g_set_error (error, NM_SETTING_ERROR, NM_SETTING_ERROR_PROPERTY_NOT_SECRET, - "Property %s not a secret property", key); - } else - success = update_secret_hash (setting, g_value_get_boxed (value), error); - } else - g_set_error_literal (error, NM_SETTING_ERROR, NM_SETTING_ERROR_PROPERTY_TYPE_MISMATCH, key); - - if (success == NM_SETTING_UPDATE_SECRET_SUCCESS_MODIFIED) - g_object_notify (G_OBJECT (setting), NM_SETTING_VPN_SECRETS); - - return success; -} - -static gboolean -get_secret_flags (NMSetting *setting, - const char *secret_name, - gboolean verify_secret, - NMSettingSecretFlags *out_flags, - GError **error) -{ - NMSettingVPNPrivate *priv = NM_SETTING_VPN_GET_PRIVATE (setting); - gboolean success = FALSE; - char *flags_key; - gpointer val; - unsigned long tmp; - NMSettingSecretFlags flags = NM_SETTING_SECRET_FLAG_NONE; - - flags_key = g_strdup_printf ("%s-flags", secret_name); - if (g_hash_table_lookup_extended (priv->data, flags_key, NULL, &val)) { - errno = 0; - tmp = strtoul ((const char *) val, NULL, 10); - if ((errno == 0) && (tmp <= NM_SETTING_SECRET_FLAGS_ALL)) { - flags = (NMSettingSecretFlags) tmp; - success = TRUE; - } else { - g_set_error (error, - NM_SETTING_ERROR, - NM_SETTING_ERROR_PROPERTY_TYPE_MISMATCH, - _("Failed to convert '%s' value '%s' to uint"), - flags_key, (const char *) val); - } - } else { - g_set_error (error, - NM_SETTING_ERROR, - NM_SETTING_ERROR_PROPERTY_NOT_FOUND, - _("Secret flags property '%s' not found"), flags_key); - } - g_free (flags_key); - if (out_flags) - *out_flags = flags; - return success; -} - -static gboolean -set_secret_flags (NMSetting *setting, - const char *secret_name, - gboolean verify_secret, - NMSettingSecretFlags flags, - GError **error) -{ - g_hash_table_insert (NM_SETTING_VPN_GET_PRIVATE (setting)->data, - g_strdup_printf ("%s-flags", secret_name), - g_strdup_printf ("%u", flags)); - g_object_notify (G_OBJECT (setting), NM_SETTING_VPN_SECRETS); - return TRUE; -} - -static GPtrArray * -need_secrets (NMSetting *setting) -{ - /* Assume that VPN connections need secrets since they almost always will */ - return g_ptr_array_sized_new (1); -} - -static gboolean -_compare_secrets (NMSettingVPN *a, - NMSettingVPN *b, - NMSettingCompareFlags flags) -{ - GHashTable *a_secrets; - GHashTableIter iter; - const char *key, *val; - - a_secrets = NM_SETTING_VPN_GET_PRIVATE (a)->secrets; - g_hash_table_iter_init (&iter, a_secrets); - while (g_hash_table_iter_next (&iter, (gpointer) &key, (gpointer) &val)) { - NMSettingSecretFlags a_secret_flags = NM_SETTING_SECRET_FLAG_NONE; - NMSettingSecretFlags b_secret_flags = NM_SETTING_SECRET_FLAG_NONE; - - nm_setting_get_secret_flags (NM_SETTING (a), key, &a_secret_flags, NULL); - nm_setting_get_secret_flags (NM_SETTING (b), key, &b_secret_flags, NULL); - - /* If the secret flags aren't the same, the settings aren't the same */ - if (a_secret_flags != b_secret_flags) - return FALSE; - - if ( (flags & NM_SETTING_COMPARE_FLAG_IGNORE_AGENT_OWNED_SECRETS) - && (a_secret_flags & NM_SETTING_SECRET_FLAG_AGENT_OWNED)) - continue; - - if ( (flags & NM_SETTING_COMPARE_FLAG_IGNORE_NOT_SAVED_SECRETS) - && (a_secret_flags & NM_SETTING_SECRET_FLAG_NOT_SAVED)) - continue; - - /* Now compare the values themselves */ - if (g_strcmp0 (val, nm_setting_vpn_get_secret (b, key)) != 0) - return FALSE; - } - - return TRUE; -} - -static gboolean -compare_one_secret (NMSettingVPN *a, - NMSettingVPN *b, - NMSettingCompareFlags flags) -{ - if (!_compare_secrets (a, b, flags)) - return FALSE; - if (!_compare_secrets (b, a, flags)) - return FALSE; - - return TRUE; -} - -static gboolean -compare_property (NMSetting *setting, - NMSetting *other, - const GParamSpec *prop_spec, - NMSettingCompareFlags flags) -{ - gboolean same; - - /* We only need to treat the 'secrets' property specially */ - if (g_strcmp0 (prop_spec->name, NM_SETTING_VPN_SECRETS) != 0) - return NM_SETTING_CLASS (nm_setting_vpn_parent_class)->compare_property (setting, other, prop_spec, flags); - - /* Compare A to B to ensure everything in A is found in B */ - same = compare_one_secret (NM_SETTING_VPN (setting), NM_SETTING_VPN (other), flags); - if (same) { - /* And then B to A to ensure everything in B is also found in A */ - same = compare_one_secret (NM_SETTING_VPN (other), NM_SETTING_VPN (setting), flags); - } - - return same; -} - -static gboolean -clear_secrets_with_flags (NMSetting *setting, - GParamSpec *pspec, - NMSettingClearSecretsWithFlagsFn func, - gpointer user_data) -{ - NMSettingVPNPrivate *priv = NM_SETTING_VPN_GET_PRIVATE (setting); - GHashTableIter iter; - const char *secret; - gboolean changed = TRUE; - - if (priv->secrets == NULL) - return FALSE; - - /* Iterate through secrets hash and check each entry */ - g_hash_table_iter_init (&iter, priv->secrets); - while (g_hash_table_iter_next (&iter, (gpointer) &secret, NULL)) { - NMSettingSecretFlags flags = NM_SETTING_SECRET_FLAG_NONE; - - nm_setting_get_secret_flags (setting, secret, &flags, NULL); - if (func (setting, pspec->name, flags, user_data) == TRUE) { - g_hash_table_iter_remove (&iter); - changed = TRUE; - } - } - - if (changed) - g_object_notify (G_OBJECT (setting), NM_SETTING_VPN_SECRETS); - - return changed; -} - -static void -destroy_one_secret (gpointer data) -{ - char *secret = (char *) data; - - /* Don't leave the secret lying around in memory */ - memset (secret, 0, strlen (secret)); - g_free (secret); -} - -static void -nm_setting_vpn_init (NMSettingVPN *setting) -{ - NMSettingVPNPrivate *priv = NM_SETTING_VPN_GET_PRIVATE (setting); - - priv->data = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); - priv->secrets = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, destroy_one_secret); -} - -static void -finalize (GObject *object) -{ - NMSettingVPNPrivate *priv = NM_SETTING_VPN_GET_PRIVATE (object); - - g_free (priv->service_type); - g_free (priv->user_name); - g_hash_table_destroy (priv->data); - g_hash_table_destroy (priv->secrets); - - G_OBJECT_CLASS (nm_setting_vpn_parent_class)->finalize (object); -} - -static void -copy_hash (gpointer key, gpointer value, gpointer user_data) -{ - g_return_if_fail (value != NULL); - g_return_if_fail (strlen (value)); - g_hash_table_insert ((GHashTable *) user_data, g_strdup (key), g_strdup (value)); -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSettingVPNPrivate *priv = NM_SETTING_VPN_GET_PRIVATE (object); - GHashTable *new_hash; - - switch (prop_id) { - case PROP_SERVICE_TYPE: - g_free (priv->service_type); - priv->service_type = g_value_dup_string (value); - break; - case PROP_USER_NAME: - g_free (priv->user_name); - priv->user_name = g_value_dup_string (value); - break; - case PROP_PERSISTENT: - priv->persistent = g_value_get_boolean (value); - break; - case PROP_DATA: - /* Must make a deep copy of the hash table here... */ - g_hash_table_remove_all (priv->data); - new_hash = g_value_get_boxed (value); - if (new_hash) - g_hash_table_foreach (new_hash, copy_hash, priv->data); - break; - case PROP_SECRETS: - /* Must make a deep copy of the hash table here... */ - g_hash_table_remove_all (priv->secrets); - new_hash = g_value_get_boxed (value); - if (new_hash) - g_hash_table_foreach (new_hash, copy_hash, priv->secrets); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSettingVPN *setting = NM_SETTING_VPN (object); - NMSettingVPNPrivate *priv = NM_SETTING_VPN_GET_PRIVATE (setting); - - switch (prop_id) { - case PROP_SERVICE_TYPE: - g_value_set_string (value, nm_setting_vpn_get_service_type (setting)); - break; - case PROP_USER_NAME: - g_value_set_string (value, nm_setting_vpn_get_user_name (setting)); - break; - case PROP_PERSISTENT: - g_value_set_boolean (value, priv->persistent); - break; - case PROP_DATA: - g_value_set_boxed (value, priv->data); - break; - case PROP_SECRETS: - g_value_set_boxed (value, priv->secrets); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_setting_vpn_class_init (NMSettingVPNClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingVPNPrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->finalize = finalize; - - parent_class->verify = verify; - parent_class->update_one_secret = update_one_secret; - parent_class->get_secret_flags = get_secret_flags; - parent_class->set_secret_flags = set_secret_flags; - parent_class->need_secrets = need_secrets; - parent_class->compare_property = compare_property; - parent_class->clear_secrets_with_flags = clear_secrets_with_flags; - - /* Properties */ - /** - * NMSettingVPN:service-type: - * - * D-Bus service name of the VPN plugin that this setting uses to connect to - * its network. i.e. org.freedesktop.NetworkManager.vpnc for the vpnc - * plugin. - **/ - g_object_class_install_property - (object_class, PROP_SERVICE_TYPE, - g_param_spec_string (NM_SETTING_VPN_SERVICE_TYPE, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingVPN:user-name: - * - * If the VPN connection requires a user name for authentication, that name - * should be provided here. If the connection is available to more than one - * user, and the VPN requires each user to supply a different name, then - * leave this property empty. If this property is empty, NetworkManager - * will automatically supply the username of the user which requested the - * VPN connection. - **/ - g_object_class_install_property - (object_class, PROP_USER_NAME, - g_param_spec_string (NM_SETTING_VPN_USER_NAME, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingVPN:persistent: - * - * If the VPN service supports persistence, and this property is %TRUE, - * the VPN will attempt to stay connected across link changes and outages, - * until explicitly disconnected. - **/ - g_object_class_install_property - (object_class, PROP_PERSISTENT, - g_param_spec_boolean (NM_SETTING_VPN_PERSISTENT, "", "", - FALSE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingVPN:data: - * - * Dictionary of key/value pairs of VPN plugin specific data. Both keys and - * values must be strings. - **/ - g_object_class_install_property - (object_class, PROP_DATA, - _nm_param_spec_specialized (NM_SETTING_VPN_DATA, "", "", - DBUS_TYPE_G_MAP_OF_STRING, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingVPN:secrets: - * - * Dictionary of key/value pairs of VPN plugin specific secrets like - * passwords or private keys. Both keys and values must be strings. - **/ - g_object_class_install_property - (object_class, PROP_SECRETS, - _nm_param_spec_specialized (NM_SETTING_VPN_SECRETS, "", "", - DBUS_TYPE_G_MAP_OF_STRING, - G_PARAM_READWRITE | - NM_SETTING_PARAM_SECRET | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-util/nm-setting-vpn.h b/libnm-util/nm-setting-vpn.h deleted file mode 100644 index ba952f4263..0000000000 --- a/libnm-util/nm-setting-vpn.h +++ /dev/null @@ -1,121 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2013 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#ifndef NM_SETTING_VPN_H -#define NM_SETTING_VPN_H - -#include "nm-setting.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SETTING_VPN (nm_setting_vpn_get_type ()) -#define NM_SETTING_VPN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_VPN, NMSettingVPN)) -#define NM_SETTING_VPN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_VPN, NMSettingVPNClass)) -#define NM_IS_SETTING_VPN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_VPN)) -#define NM_IS_SETTING_VPN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_VPN)) -#define NM_SETTING_VPN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_VPN, NMSettingVPNClass)) - -#define NM_SETTING_VPN_SETTING_NAME "vpn" - -/** - * NMSettingVpnError: - * @NM_SETTING_VPN_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_VPN_ERROR_INVALID_PROPERTY: the property was invalid - * @NM_SETTING_VPN_ERROR_MISSING_PROPERTY: the property was missing and is - * required - */ -typedef enum { - NM_SETTING_VPN_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_SETTING_VPN_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/ - NM_SETTING_VPN_ERROR_MISSING_PROPERTY, /*< nick=MissingProperty >*/ -} NMSettingVpnError; - -#define NM_SETTING_VPN_ERROR nm_setting_vpn_error_quark () -GQuark nm_setting_vpn_error_quark (void); - -#define NM_SETTING_VPN_SERVICE_TYPE "service-type" -#define NM_SETTING_VPN_USER_NAME "user-name" -#define NM_SETTING_VPN_PERSISTENT "persistent" -#define NM_SETTING_VPN_DATA "data" -#define NM_SETTING_VPN_SECRETS "secrets" - -typedef struct { - NMSetting parent; -} NMSettingVPN; - -typedef struct { - NMSettingClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); -} NMSettingVPNClass; - -/** - * NMVPNIterFunc: - * @key: the name of the data or secret item - * @value: the value of the data or secret item - * @user_data: User data passed to nm_setting_vpn_foreach_data_item() or - * nm_setting_vpn_foreach_secret() - **/ -typedef void (*NMVPNIterFunc) (const char *key, const char *value, gpointer user_data); - -GType nm_setting_vpn_get_type (void); - -NMSetting *nm_setting_vpn_new (void); -const char *nm_setting_vpn_get_service_type (NMSettingVPN *setting); -const char *nm_setting_vpn_get_user_name (NMSettingVPN *setting); -gboolean nm_setting_vpn_get_persistent (NMSettingVPN *setting); - -guint32 nm_setting_vpn_get_num_data_items (NMSettingVPN *setting); -void nm_setting_vpn_add_data_item (NMSettingVPN *setting, - const char *key, - const char *item); -const char * nm_setting_vpn_get_data_item (NMSettingVPN *setting, - const char *key); -gboolean nm_setting_vpn_remove_data_item (NMSettingVPN *setting, - const char *key); -void nm_setting_vpn_foreach_data_item (NMSettingVPN *setting, - NMVPNIterFunc func, - gpointer user_data); - -guint32 nm_setting_vpn_get_num_secrets (NMSettingVPN *setting); -void nm_setting_vpn_add_secret (NMSettingVPN *setting, - const char *key, - const char *secret); -const char * nm_setting_vpn_get_secret (NMSettingVPN *setting, - const char *key); -gboolean nm_setting_vpn_remove_secret (NMSettingVPN *setting, - const char *key); -void nm_setting_vpn_foreach_secret (NMSettingVPN *setting, - NMVPNIterFunc func, - gpointer user_data); - -#ifdef NM_VPN_LIBNM_COMPAT -#define NMSettingVpn NMSettingVPN -#endif - -G_END_DECLS - -#endif /* NM_SETTING_VPN_H */ diff --git a/libnm-util/nm-setting-wimax.c b/libnm-util/nm-setting-wimax.c deleted file mode 100644 index 102fbb5cf7..0000000000 --- a/libnm-util/nm-setting-wimax.c +++ /dev/null @@ -1,278 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2011 - 2013 Red Hat, Inc. - * Copyright 2009 Novell, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <net/ethernet.h> -#include <dbus/dbus-glib.h> - -#include "nm-setting-wimax.h" -#include "nm-param-spec-specialized.h" -#include "nm-setting-private.h" - -/** - * SECTION:nm-setting-wimax - * @short_description: Describes 802.16e Mobile WiMAX connection properties - * @include: nm-setting-wimax.h - * - * The #NMSettingWimax object is a #NMSetting subclass that describes properties - * necessary for connection to 802.16e Mobile WiMAX networks. - * - * NetworkManager no longer supports WiMAX; while this API remains available for - * backward-compatibility reasons, it serves no real purpose, since WiMAX - * connections cannot be activated. - **/ - -/** - * nm_setting_wimax_error_quark: - * - * Registers an error quark for #NMSettingWimax if necessary. - * - * Returns: the error quark used for #NMSettingWimax errors. - * - * Deprecated: 1.2: WiMAX is no longer supported. - **/ -GQuark -nm_setting_wimax_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-wimax-error-quark"); - return quark; -} - -G_DEFINE_TYPE_WITH_CODE (NMSettingWimax, nm_setting_wimax, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_WIMAX_SETTING_NAME, - g_define_type_id, - 1, - NM_SETTING_WIMAX_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_WIMAX) - -#define NM_SETTING_WIMAX_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_WIMAX, NMSettingWimaxPrivate)) - -typedef struct { - char *network_name; - GByteArray *mac_address; -} NMSettingWimaxPrivate; - -enum { - PROP_0, - PROP_NETWORK_NAME, - PROP_MAC_ADDRESS, - - LAST_PROP -}; - -/** - * nm_setting_wimax_new: - * - * Creates a new #NMSettingWimax object with default values. - * - * Returns: the new empty #NMSettingWimax object - * - * Deprecated: 1.2: WiMAX is no longer supported. - **/ -NMSetting * -nm_setting_wimax_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_WIMAX, NULL); -} - -/** - * nm_setting_wimax_get_network_name: - * @setting: the #NMSettingWimax - * - * Returns the WiMAX NSP name (ex "Sprint" or "CLEAR") which identifies the - * specific WiMAX network this setting describes a connection to. - * - * Returns: the WiMAX NSP name - * - * Deprecated: 1.2: WiMAX is no longer supported. - **/ -const char * -nm_setting_wimax_get_network_name (NMSettingWimax *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIMAX (setting), NULL); - - return NM_SETTING_WIMAX_GET_PRIVATE (setting)->network_name; -} - -/** - * nm_setting_wimax_get_mac_address: - * @setting: the #NMSettingWimax - * - * Returns the MAC address of a WiMAX device which this connection is locked - * to. - * - * Returns: the MAC address - * - * Deprecated: 1.2: WiMAX is no longer supported. - **/ -const GByteArray * -nm_setting_wimax_get_mac_address (NMSettingWimax *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIMAX (setting), NULL); - - return NM_SETTING_WIMAX_GET_PRIVATE (setting)->mac_address; -} - -static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - NMSettingWimaxPrivate *priv = NM_SETTING_WIMAX_GET_PRIVATE (setting); - - if (!priv->network_name) { - g_set_error_literal (error, - NM_SETTING_WIMAX_ERROR, - NM_SETTING_WIMAX_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIMAX_SETTING_NAME, NM_SETTING_WIMAX_NETWORK_NAME); - return FALSE; - } - - if (!strlen (priv->network_name)) { - g_set_error_literal (error, - NM_SETTING_WIMAX_ERROR, - NM_SETTING_WIMAX_ERROR_INVALID_PROPERTY, - _("property is empty")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIMAX_SETTING_NAME, NM_SETTING_WIMAX_NETWORK_NAME); - return FALSE; - } - - if (priv->mac_address && priv->mac_address->len != ETH_ALEN) { - g_set_error_literal (error, - NM_SETTING_WIMAX_ERROR, - NM_SETTING_WIMAX_ERROR_INVALID_PROPERTY, - _("property is invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIMAX_SETTING_NAME, NM_SETTING_WIMAX_MAC_ADDRESS); - return FALSE; - } - - return TRUE; -} - -static void -nm_setting_wimax_init (NMSettingWimax *setting) -{ -} - -static void -finalize (GObject *object) -{ - NMSettingWimaxPrivate *priv = NM_SETTING_WIMAX_GET_PRIVATE (object); - - g_free (priv->network_name); - if (priv->mac_address) - g_byte_array_free (priv->mac_address, TRUE); - - G_OBJECT_CLASS (nm_setting_wimax_parent_class)->finalize (object); -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSettingWimaxPrivate *priv = NM_SETTING_WIMAX_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_NETWORK_NAME: - g_free (priv->network_name); - priv->network_name = g_value_dup_string (value); - break; - case PROP_MAC_ADDRESS: - if (priv->mac_address) - g_byte_array_free (priv->mac_address, TRUE); - priv->mac_address = g_value_dup_boxed (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSettingWimax *setting = NM_SETTING_WIMAX (object); - - switch (prop_id) { - case PROP_NETWORK_NAME: - g_value_set_string (value, nm_setting_wimax_get_network_name (setting)); - break; - case PROP_MAC_ADDRESS: - g_value_set_boxed (value, nm_setting_wimax_get_mac_address (setting)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_setting_wimax_class_init (NMSettingWimaxClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingWimaxPrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->finalize = finalize; - parent_class->verify = verify; - - /* Properties */ - /** - * NMSettingWimax:network-name: - * - * Network Service Provider (NSP) name of the WiMAX network this connection - * should use. - * - * Deprecated: 1.2: WiMAX is no longer supported. - **/ - g_object_class_install_property - (object_class, PROP_NETWORK_NAME, - g_param_spec_string (NM_SETTING_WIMAX_NETWORK_NAME, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWimax:mac-address: - * - * If specified, this connection will only apply to the WiMAX device whose - * MAC address matches. This property does not change the MAC address of the - * device (known as MAC spoofing). - * - * Deprecated: 1.2: WiMAX is no longer supported. - **/ - g_object_class_install_property - (object_class, PROP_MAC_ADDRESS, - _nm_param_spec_specialized (NM_SETTING_WIMAX_MAC_ADDRESS, "", "", - DBUS_TYPE_G_UCHAR_ARRAY, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-util/nm-setting-wimax.h b/libnm-util/nm-setting-wimax.h deleted file mode 100644 index 45e533527b..0000000000 --- a/libnm-util/nm-setting-wimax.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2009 Novell, Inc. - */ - -#ifndef NM_SETTING_WIMAX_H -#define NM_SETTING_WIMAX_H - -#include "nm-setting.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SETTING_WIMAX (nm_setting_wimax_get_type ()) -#define NM_SETTING_WIMAX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_WIMAX, NMSettingWimax)) -#define NM_SETTING_WIMAX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_WIMAX, NMSettingWimaxClass)) -#define NM_IS_SETTING_WIMAX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_WIMAX)) -#define NM_IS_SETTING_WIMAX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_WIMAX)) -#define NM_SETTING_WIMAX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_WIMAX, NMSettingWimaxClass)) - -#define NM_SETTING_WIMAX_SETTING_NAME "wimax" - -/** - * NMSettingWimaxError: - * @NM_SETTING_WIMAX_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_WIMAX_ERROR_INVALID_PROPERTY: the property was invalid - * @NM_SETTING_WIMAX_ERROR_MISSING_PROPERTY: the property was missing and is - * required - */ -typedef enum { - NM_SETTING_WIMAX_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_SETTING_WIMAX_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/ - NM_SETTING_WIMAX_ERROR_MISSING_PROPERTY /*< nick=MissingProperty >*/ -} NMSettingWimaxError; - -#define NM_SETTING_WIMAX_ERROR nm_setting_wimax_error_quark () -NM_DEPRECATED_IN_1_2 -GQuark nm_setting_wimax_error_quark (void); - -#define NM_SETTING_WIMAX_NETWORK_NAME "network-name" -#define NM_SETTING_WIMAX_MAC_ADDRESS "mac-address" - -typedef struct { - NMSetting parent; -} NMSettingWimax; - -typedef struct { - NMSettingClass parent; -} NMSettingWimaxClass; - -NM_DEPRECATED_IN_1_2 -GType nm_setting_wimax_get_type (void); - -NM_DEPRECATED_IN_1_2 -NMSetting *nm_setting_wimax_new (void); -NM_DEPRECATED_IN_1_2 -const char *nm_setting_wimax_get_network_name (NMSettingWimax *setting); -NM_DEPRECATED_IN_1_2 -const GByteArray *nm_setting_wimax_get_mac_address (NMSettingWimax *setting); - -G_END_DECLS - -#endif /* NM_SETTING_WIMAX_H */ diff --git a/libnm-util/nm-setting-wired.c b/libnm-util/nm-setting-wired.c deleted file mode 100644 index 8b297ee68a..0000000000 --- a/libnm-util/nm-setting-wired.c +++ /dev/null @@ -1,1029 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2014 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <net/ethernet.h> -#include <netinet/ether.h> -#include <dbus/dbus-glib.h> - -#include "nm-setting-wired.h" -#include "nm-param-spec-specialized.h" -#include "nm-utils.h" -#include "nm-utils-private.h" -#include "nm-dbus-glib-types.h" -#include "nm-setting-private.h" - -/** - * SECTION:nm-setting-wired - * @short_description: Describes connection properties for Ethernet-based networks - * @include: nm-setting-wired.h - * - * The #NMSettingWired object is a #NMSetting subclass that describes properties - * necessary for connection to Ethernet networks. - **/ - -/** - * nm_setting_wired_error_quark: - * - * Registers an error quark for #NMSettingWired if necessary. - * - * Returns: the error quark used for #NMSettingWired errors. - **/ -GQuark -nm_setting_wired_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-wired-error-quark"); - return quark; -} - -G_DEFINE_TYPE_WITH_CODE (NMSettingWired, nm_setting_wired, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_WIRED_SETTING_NAME, - g_define_type_id, - 1, - NM_SETTING_WIRED_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_WIRED) - -#define NM_SETTING_WIRED_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_WIRED, NMSettingWiredPrivate)) - -typedef struct { - char *port; - guint32 speed; - char *duplex; - gboolean auto_negotiate; - GByteArray *device_mac_address; - GByteArray *cloned_mac_address; - GSList *mac_address_blacklist; - guint32 mtu; - GPtrArray *s390_subchannels; - char *s390_nettype; - GHashTable *s390_options; -} NMSettingWiredPrivate; - -enum { - PROP_0, - PROP_PORT, - PROP_SPEED, - PROP_DUPLEX, - PROP_AUTO_NEGOTIATE, - PROP_MAC_ADDRESS, - PROP_CLONED_MAC_ADDRESS, - PROP_MAC_ADDRESS_BLACKLIST, - PROP_MTU, - PROP_S390_SUBCHANNELS, - PROP_S390_NETTYPE, - PROP_S390_OPTIONS, - - LAST_PROP -}; - -static const char *valid_s390_opts[] = { - "portno", "layer2", "portname", "protocol", "priority_queueing", - "buffer_count", "isolation", "total", "inter", "inter_jumbo", "route4", - "route6", "fake_broadcast", "broadcast_mode", "canonical_macaddr", - "checksumming", "sniffer", "large_send", "ipato_enable", "ipato_invert4", - "ipato_add4", "ipato_invert6", "ipato_add6", "vipa_add4", "vipa_add6", - "rxip_add4", "rxip_add6", "lancmd_timeout", "ctcprot", - NULL -}; - -/** - * nm_setting_wired_new: - * - * Creates a new #NMSettingWired object with default values. - * - * Returns: (transfer full): the new empty #NMSettingWired object - **/ -NMSetting * -nm_setting_wired_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_WIRED, NULL); -} - -/** - * nm_setting_wired_get_port: - * @setting: the #NMSettingWired - * - * Returns: the #NMSettingWired:port property of the setting - **/ -const char * -nm_setting_wired_get_port (NMSettingWired *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRED (setting), NULL); - - return NM_SETTING_WIRED_GET_PRIVATE (setting)->port; -} - -/** - * nm_setting_wired_get_speed: - * @setting: the #NMSettingWired - * - * Returns: the #NMSettingWired:speed property of the setting - **/ -guint32 -nm_setting_wired_get_speed (NMSettingWired *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRED (setting), 0); - - return NM_SETTING_WIRED_GET_PRIVATE (setting)->speed; -} - -/** - * nm_setting_wired_get_duplex: - * @setting: the #NMSettingWired - * - * Returns: the #NMSettingWired:duplex property of the setting - **/ -const char * -nm_setting_wired_get_duplex (NMSettingWired *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRED (setting), NULL); - - return NM_SETTING_WIRED_GET_PRIVATE (setting)->duplex; -} - -/** - * nm_setting_wired_get_auto_negotiate: - * @setting: the #NMSettingWired - * - * Returns: the #NMSettingWired:auto-negotiate property of the setting - **/ -gboolean -nm_setting_wired_get_auto_negotiate (NMSettingWired *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRED (setting), FALSE); - - return NM_SETTING_WIRED_GET_PRIVATE (setting)->auto_negotiate; -} - -/** - * nm_setting_wired_get_mac_address: - * @setting: the #NMSettingWired - * - * Returns: the #NMSettingWired:mac-address property of the setting - **/ -const GByteArray * -nm_setting_wired_get_mac_address (NMSettingWired *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRED (setting), NULL); - - return NM_SETTING_WIRED_GET_PRIVATE (setting)->device_mac_address; -} - -/** - * nm_setting_wired_get_cloned_mac_address: - * @setting: the #NMSettingWired - * - * Returns: the #NMSettingWired:cloned-mac-address property of the setting - **/ -const GByteArray * -nm_setting_wired_get_cloned_mac_address (NMSettingWired *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRED (setting), NULL); - - return NM_SETTING_WIRED_GET_PRIVATE (setting)->cloned_mac_address; -} - -/** - * nm_setting_wired_get_mac_address_blacklist: - * @setting: the #NMSettingWired - * - * Returns: (element-type GLib.ByteArray): the #NMSettingWired:mac-address-blacklist - * property of the setting - **/ -const GSList * -nm_setting_wired_get_mac_address_blacklist (NMSettingWired *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRED (setting), NULL); - - return NM_SETTING_WIRED_GET_PRIVATE (setting)->mac_address_blacklist; -} - -/** - * nm_setting_wired_get_num_mac_blacklist_items: - * @setting: the #NMSettingWired - * - * Returns: the number of blacklisted MAC addresses - * - * Since: 0.9.10 - **/ -guint32 -nm_setting_wired_get_num_mac_blacklist_items (NMSettingWired *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRED (setting), 0); - - return g_slist_length (NM_SETTING_WIRED_GET_PRIVATE (setting)->mac_address_blacklist); -} - -/** - * nm_setting_wired_get_mac_blacklist_item: - * @setting: the #NMSettingWired - * @idx: the zero-based index of the MAC address entry - * - * Returns: the blacklisted MAC address string (hex-digits-and-colons notation) - * at index @idx - * - * Since: 0.9.10 - **/ -const char * -nm_setting_wired_get_mac_blacklist_item (NMSettingWired *setting, guint32 idx) -{ - NMSettingWiredPrivate *priv; - - g_return_val_if_fail (NM_IS_SETTING_WIRED (setting), NULL); - - priv = NM_SETTING_WIRED_GET_PRIVATE (setting); - g_return_val_if_fail (idx <= g_slist_length (priv->mac_address_blacklist), NULL); - - return (const char *) g_slist_nth_data (priv->mac_address_blacklist, idx); -} - -/** - * nm_setting_wired_add_mac_blacklist_item: - * @setting: the #NMSettingWired - * @mac: the MAC address string (hex-digits-and-colons notation) to blacklist - * - * Adds a new MAC address to the #NMSettingWired:mac-address-blacklist property. - * - * Returns: %TRUE if the MAC address was added; %FALSE if the MAC address - * is invalid or was already present - * - * Since: 0.9.10 - **/ -gboolean -nm_setting_wired_add_mac_blacklist_item (NMSettingWired *setting, const char *mac) -{ - NMSettingWiredPrivate *priv; - GSList *iter; - guint8 buf[32]; - - g_return_val_if_fail (NM_IS_SETTING_WIRED (setting), FALSE); - g_return_val_if_fail (mac != NULL, FALSE); - - if (!nm_utils_hwaddr_aton (mac, ARPHRD_ETHER, buf)) - return FALSE; - - priv = NM_SETTING_WIRED_GET_PRIVATE (setting); - for (iter = priv->mac_address_blacklist; iter; iter = g_slist_next (iter)) { - if (!strcasecmp (mac, (char *) iter->data)) - return FALSE; - } - - priv->mac_address_blacklist = g_slist_append (priv->mac_address_blacklist, - g_ascii_strup (mac, -1)); - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRED_MAC_ADDRESS_BLACKLIST); - return TRUE; -} - -/** - * nm_setting_wired_remove_mac_blacklist_item: - * @setting: the #NMSettingWired - * @idx: index number of the MAC address - * - * Removes the MAC address at index @idx from the blacklist. - * - * Since: 0.9.10 - **/ -void -nm_setting_wired_remove_mac_blacklist_item (NMSettingWired *setting, guint32 idx) -{ - NMSettingWiredPrivate *priv; - GSList *elt; - - g_return_if_fail (NM_IS_SETTING_WIRED (setting)); - - priv = NM_SETTING_WIRED_GET_PRIVATE (setting); - elt = g_slist_nth (priv->mac_address_blacklist, idx); - g_return_if_fail (elt != NULL); - - g_free (elt->data); - priv->mac_address_blacklist = g_slist_delete_link (priv->mac_address_blacklist, elt); - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRED_MAC_ADDRESS_BLACKLIST); -} - -/** - * nm_setting_wired_remove_mac_blacklist_item_by_value: - * @setting: the #NMSettingWired - * @mac: the MAC address string (hex-digits-and-colons notation) to remove from - * the blacklist - * - * Removes the MAC address @mac from the blacklist. - * - * Returns: %TRUE if the MAC address was found and removed; %FALSE if it was not. - * - * Since: 0.9.10 - **/ -gboolean -nm_setting_wired_remove_mac_blacklist_item_by_value (NMSettingWired *setting, const char *mac) -{ - NMSettingWiredPrivate *priv; - GSList *iter; - guint8 buf[32]; - - g_return_val_if_fail (NM_IS_SETTING_WIRED (setting), FALSE); - g_return_val_if_fail (mac != NULL, FALSE); - - if (!nm_utils_hwaddr_aton (mac, ARPHRD_ETHER, buf)) - return FALSE; - - priv = NM_SETTING_WIRED_GET_PRIVATE (setting); - for (iter = priv->mac_address_blacklist; iter; iter = g_slist_next (iter)) { - if (!strcasecmp (mac, (char *) iter->data)) { - priv->mac_address_blacklist = g_slist_delete_link (priv->mac_address_blacklist, iter); - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRED_MAC_ADDRESS_BLACKLIST); - return TRUE; - } - } - return FALSE; -} - -/** - * nm_setting_wired_clear_mac_blacklist_items: - * @setting: the #NMSettingWired - * - * Removes all blacklisted MAC addresses. - * - * Since: 0.9.10 - **/ -void -nm_setting_wired_clear_mac_blacklist_items (NMSettingWired *setting) -{ - g_return_if_fail (NM_IS_SETTING_WIRED (setting)); - - g_slist_free_full (NM_SETTING_WIRED_GET_PRIVATE (setting)->mac_address_blacklist, g_free); - NM_SETTING_WIRED_GET_PRIVATE (setting)->mac_address_blacklist = NULL; - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRED_MAC_ADDRESS_BLACKLIST); -} - -/** - * nm_setting_wired_get_mtu: - * @setting: the #NMSettingWired - * - * Returns: the #NMSettingWired:mtu property of the setting - **/ -guint32 -nm_setting_wired_get_mtu (NMSettingWired *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRED (setting), 0); - - return NM_SETTING_WIRED_GET_PRIVATE (setting)->mtu; -} - -/** - * nm_setting_wired_get_s390_subchannels: - * @setting: the #NMSettingWired - * - * Return the list of s390 subchannels that identify the device that this - * connection is applicable to. The connection should only be used in - * conjunction with that device. - * - * Returns: (element-type utf8): #GPtrArray of strings, each specifying one - * subchannel the s390 device uses to communicate to the host. - **/ -const GPtrArray * -nm_setting_wired_get_s390_subchannels (NMSettingWired *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRED (setting), NULL); - - return NM_SETTING_WIRED_GET_PRIVATE (setting)->s390_subchannels; -} - -/** - * nm_setting_wired_get_s390_nettype: - * @setting: the #NMSettingWired - * - * Returns the s390 device type this connection should apply to. Will be one - * of 'qeth', 'lcs', or 'ctc'. - * - * Returns: the s390 device type - **/ -const char * -nm_setting_wired_get_s390_nettype (NMSettingWired *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRED (setting), NULL); - - return NM_SETTING_WIRED_GET_PRIVATE (setting)->s390_nettype; -} - -/** - * nm_setting_wired_get_num_s390_options: - * @setting: the #NMSettingWired - * - * Returns the number of s390-specific options that should be set for this - * device when it is activated. This can be used to retrieve each s390 - * option individually using nm_setting_wired_get_s390_option(). - * - * Returns: the number of s390-specific device options - **/ -guint32 -nm_setting_wired_get_num_s390_options (NMSettingWired *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRED (setting), 0); - - return g_hash_table_size (NM_SETTING_WIRED_GET_PRIVATE (setting)->s390_options); -} - -/** - * nm_setting_wired_get_s390_option: - * @setting: the #NMSettingWired - * @idx: index of the desired option, from 0 to - * nm_setting_wired_get_num_s390_options() - 1 - * @out_key: (out): on return, the key name of the s390 specific option; this - * value is owned by the setting and should not be modified - * @out_value: (out): on return, the value of the key of the s390 specific - * option; this value is owned by the setting and should not be modified - * - * Given an index, return the value of the s390 option at that index. indexes - * are *not* guaranteed to be static across modifications to options done by - * nm_setting_wired_add_s390_option() and nm_setting_wired_remove_s390_option(), - * and should not be used to refer to options except for short periods of time - * such as during option iteration. - * - * Returns: %TRUE on success if the index was valid and an option was found, - * %FALSE if the index was invalid (ie, greater than the number of options - * currently held by the setting) - **/ -gboolean -nm_setting_wired_get_s390_option (NMSettingWired *setting, - guint32 idx, - const char **out_key, - const char **out_value) -{ - const char *_key, *_value; - GHashTableIter iter; - guint i = 0; - - g_return_val_if_fail (NM_IS_SETTING_WIRED (setting), FALSE); - - g_hash_table_iter_init (&iter, NM_SETTING_WIRED_GET_PRIVATE (setting)->s390_options); - while (g_hash_table_iter_next (&iter, (gpointer) &_key, (gpointer) &_value)) { - if (i == idx) { - if (out_key) - *out_key = _key; - if (out_value) - *out_value = _value; - return TRUE; - } - i++; - } - g_return_val_if_reached (FALSE); -} - -/** - * nm_setting_wired_get_s390_option_by_key: - * @setting: the #NMSettingWired - * @key: the key for which to retrieve the value - * - * Returns the value associated with the s390-specific option specified by - * @key, if it exists. - * - * Returns: the value, or %NULL if the key/value pair was never added to the - * setting; the value is owned by the setting and must not be modified - **/ -const char * -nm_setting_wired_get_s390_option_by_key (NMSettingWired *setting, - const char *key) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRED (setting), NULL); - g_return_val_if_fail (key != NULL, NULL); - g_return_val_if_fail (strlen (key), NULL); - - return g_hash_table_lookup (NM_SETTING_WIRED_GET_PRIVATE (setting)->s390_options, key); -} - -/** - * nm_setting_wired_add_s390_option: - * @setting: the #NMSettingWired - * @key: key name for the option - * @value: value for the option - * - * Add an option to the table. The option is compared to an internal list - * of allowed options. Key names may contain only alphanumeric characters - * (ie [a-zA-Z0-9]). Adding a new key replaces any existing key/value pair that - * may already exist. - * - * Returns: %TRUE if the option was valid and was added to the internal option - * list, %FALSE if it was not. - **/ -gboolean -nm_setting_wired_add_s390_option (NMSettingWired *setting, - const char *key, - const char *value) -{ - size_t value_len; - - g_return_val_if_fail (NM_IS_SETTING_WIRED (setting), FALSE); - g_return_val_if_fail (key != NULL, FALSE); - g_return_val_if_fail (strlen (key), FALSE); - g_return_val_if_fail (g_strv_contains (valid_s390_opts, key), FALSE); - g_return_val_if_fail (value != NULL, FALSE); - - value_len = strlen (value); - g_return_val_if_fail (value_len > 0 && value_len < 200, FALSE); - - g_hash_table_insert (NM_SETTING_WIRED_GET_PRIVATE (setting)->s390_options, - g_strdup (key), - g_strdup (value)); - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRED_S390_OPTIONS); - return TRUE; -} - -/** - * nm_setting_wired_remove_s390_option: - * @setting: the #NMSettingWired - * @key: key name for the option to remove - * - * Remove the s390-specific option referenced by @key from the internal option - * list. - * - * Returns: %TRUE if the option was found and removed from the internal option - * list, %FALSE if it was not. - **/ -gboolean -nm_setting_wired_remove_s390_option (NMSettingWired *setting, - const char *key) -{ - gboolean found; - - g_return_val_if_fail (NM_IS_SETTING_WIRED (setting), FALSE); - g_return_val_if_fail (key != NULL, FALSE); - g_return_val_if_fail (strlen (key), FALSE); - - found = g_hash_table_remove (NM_SETTING_WIRED_GET_PRIVATE (setting)->s390_options, key); - if (found) - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRED_S390_OPTIONS); - return found; -} - -/** - * nm_setting_wired_get_valid_s390_options: - * @setting: the #NMSettingWired - * - * Returns a list of valid s390 options. - * - * Returns: (transfer none): a %NULL-terminated array of strings of valid s390 options. - * - * Since: 0.9.10 - **/ -const char ** -nm_setting_wired_get_valid_s390_options (NMSettingWired *setting) -{ - return valid_s390_opts; -} - -static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - NMSettingWiredPrivate *priv = NM_SETTING_WIRED_GET_PRIVATE (setting); - const char *valid_ports[] = { "tp", "aui", "bnc", "mii", NULL }; - const char *valid_duplex[] = { "half", "full", NULL }; - const char *valid_nettype[] = { "qeth", "lcs", "ctc", NULL }; - GHashTableIter iter; - GSList* mac_blacklist_iter; - const char *key, *value; - - if (priv->port && !g_strv_contains (valid_ports, priv->port)) { - g_set_error (error, - NM_SETTING_WIRED_ERROR, - NM_SETTING_WIRED_ERROR_INVALID_PROPERTY, - _("'%s' is not a valid Ethernet port value"), - priv->port); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRED_SETTING_NAME, NM_SETTING_WIRED_PORT); - return FALSE; - } - - if (priv->duplex && !g_strv_contains (valid_duplex, priv->duplex)) { - g_set_error (error, - NM_SETTING_WIRED_ERROR, - NM_SETTING_WIRED_ERROR_INVALID_PROPERTY, - _("'%s' is not a valid duplex value"), - priv->duplex); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRED_SETTING_NAME, NM_SETTING_WIRED_DUPLEX); - return FALSE; - } - - if (priv->device_mac_address && priv->device_mac_address->len != ETH_ALEN) { - g_set_error_literal (error, - NM_SETTING_WIRED_ERROR, - NM_SETTING_WIRED_ERROR_INVALID_PROPERTY, - _("is not a valid MAC address")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRED_SETTING_NAME, NM_SETTING_WIRED_MAC_ADDRESS); - return FALSE; - } - - for (mac_blacklist_iter = priv->mac_address_blacklist; mac_blacklist_iter; - mac_blacklist_iter = mac_blacklist_iter->next) { - struct ether_addr addr; - - if (!ether_aton_r (mac_blacklist_iter->data, &addr)) { - g_set_error (error, - NM_SETTING_WIRED_ERROR, - NM_SETTING_WIRED_ERROR_INVALID_PROPERTY, - _("'%s' is not a valid MAC address"), - (const char *) mac_blacklist_iter->data); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRED_SETTING_NAME, NM_SETTING_WIRED_MAC_ADDRESS_BLACKLIST); - return FALSE; - } - } - - if ( priv->s390_subchannels - && !(priv->s390_subchannels->len == 3 || priv->s390_subchannels->len == 2)) { - g_set_error_literal (error, - NM_SETTING_WIRED_ERROR, - NM_SETTING_WIRED_ERROR_INVALID_PROPERTY, - _("property is invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRED_SETTING_NAME, NM_SETTING_WIRED_S390_SUBCHANNELS); - return FALSE; - } - - if (priv->s390_nettype && !g_strv_contains (valid_nettype, priv->s390_nettype)) { - g_set_error_literal (error, - NM_SETTING_WIRED_ERROR, - NM_SETTING_WIRED_ERROR_INVALID_PROPERTY, - _("property is invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRED_SETTING_NAME, NM_SETTING_WIRED_S390_NETTYPE); - return FALSE; - } - - g_hash_table_iter_init (&iter, priv->s390_options); - while (g_hash_table_iter_next (&iter, (gpointer) &key, (gpointer) &value)) { - if ( !g_strv_contains (valid_s390_opts, key) - || !strlen (value) - || (strlen (value) > 200)) { - g_set_error (error, - NM_SETTING_WIRED_ERROR, - NM_SETTING_WIRED_ERROR_INVALID_PROPERTY, - _("invalid '%s' or its value '%s'"), - key, value); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRED_SETTING_NAME, NM_SETTING_WIRED_S390_OPTIONS); - return FALSE; - } - } - - if (priv->cloned_mac_address && priv->cloned_mac_address->len != ETH_ALEN) { - g_set_error_literal (error, - NM_SETTING_WIRED_ERROR, - NM_SETTING_WIRED_ERROR_INVALID_PROPERTY, - _("is not a valid MAC address")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRED_SETTING_NAME, NM_SETTING_WIRED_CLONED_MAC_ADDRESS); - return FALSE; - } - - return TRUE; -} - -static void -nm_setting_wired_init (NMSettingWired *setting) -{ - NMSettingWiredPrivate *priv = NM_SETTING_WIRED_GET_PRIVATE (setting); - - priv->s390_options = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); -} - -static void -finalize (GObject *object) -{ - NMSettingWiredPrivate *priv = NM_SETTING_WIRED_GET_PRIVATE (object); - - g_free (priv->port); - g_free (priv->duplex); - g_free (priv->s390_nettype); - - g_hash_table_destroy (priv->s390_options); - - if (priv->device_mac_address) - g_byte_array_free (priv->device_mac_address, TRUE); - - if (priv->cloned_mac_address) - g_byte_array_free (priv->cloned_mac_address, TRUE); - - g_slist_free_full (priv->mac_address_blacklist, g_free); - - if (priv->s390_subchannels) { - g_ptr_array_set_free_func (priv->s390_subchannels, g_free); - g_ptr_array_free (priv->s390_subchannels, TRUE); - } - - G_OBJECT_CLASS (nm_setting_wired_parent_class)->finalize (object); -} - -static void -copy_hash (gpointer key, gpointer value, gpointer user_data) -{ - g_hash_table_insert ((GHashTable *) user_data, g_strdup (key), g_strdup (value)); -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSettingWiredPrivate *priv = NM_SETTING_WIRED_GET_PRIVATE (object); - GHashTable *new_hash; - - switch (prop_id) { - case PROP_PORT: - g_free (priv->port); - priv->port = g_value_dup_string (value); - break; - case PROP_SPEED: - priv->speed = g_value_get_uint (value); - break; - case PROP_DUPLEX: - g_free (priv->duplex); - priv->duplex = g_value_dup_string (value); - break; - case PROP_AUTO_NEGOTIATE: - priv->auto_negotiate = g_value_get_boolean (value); - break; - case PROP_MAC_ADDRESS: - if (priv->device_mac_address) - g_byte_array_free (priv->device_mac_address, TRUE); - priv->device_mac_address = g_value_dup_boxed (value); - break; - case PROP_CLONED_MAC_ADDRESS: - if (priv->cloned_mac_address) - g_byte_array_free (priv->cloned_mac_address, TRUE); - priv->cloned_mac_address = g_value_dup_boxed (value); - break; - case PROP_MAC_ADDRESS_BLACKLIST: - g_slist_free_full (priv->mac_address_blacklist, g_free); - priv->mac_address_blacklist = g_value_dup_boxed (value); - break; - case PROP_MTU: - priv->mtu = g_value_get_uint (value); - break; - case PROP_S390_SUBCHANNELS: - if (priv->s390_subchannels) { - g_ptr_array_set_free_func (priv->s390_subchannels, g_free); - g_ptr_array_free (priv->s390_subchannels, TRUE); - } - priv->s390_subchannels = g_value_dup_boxed (value); - break; - case PROP_S390_NETTYPE: - g_free (priv->s390_nettype); - priv->s390_nettype = g_value_dup_string (value); - break; - case PROP_S390_OPTIONS: - /* Must make a deep copy of the hash table here... */ - g_hash_table_remove_all (priv->s390_options); - new_hash = g_value_get_boxed (value); - if (new_hash) - g_hash_table_foreach (new_hash, copy_hash, priv->s390_options); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSettingWired *setting = NM_SETTING_WIRED (object); - NMSettingWiredPrivate *priv = NM_SETTING_WIRED_GET_PRIVATE (setting); - - switch (prop_id) { - case PROP_PORT: - g_value_set_string (value, nm_setting_wired_get_port (setting)); - break; - case PROP_SPEED: - g_value_set_uint (value, nm_setting_wired_get_speed (setting)); - break; - case PROP_DUPLEX: - g_value_set_string (value, nm_setting_wired_get_duplex (setting)); - break; - case PROP_AUTO_NEGOTIATE: - g_value_set_boolean (value, nm_setting_wired_get_auto_negotiate (setting)); - break; - case PROP_MAC_ADDRESS: - g_value_set_boxed (value, nm_setting_wired_get_mac_address (setting)); - break; - case PROP_CLONED_MAC_ADDRESS: - g_value_set_boxed (value, nm_setting_wired_get_cloned_mac_address (setting)); - break; - case PROP_MAC_ADDRESS_BLACKLIST: - g_value_set_boxed (value, nm_setting_wired_get_mac_address_blacklist (setting)); - break; - case PROP_MTU: - g_value_set_uint (value, nm_setting_wired_get_mtu (setting)); - break; - case PROP_S390_SUBCHANNELS: - g_value_set_boxed (value, nm_setting_wired_get_s390_subchannels (setting)); - break; - case PROP_S390_NETTYPE: - g_value_set_string (value, nm_setting_wired_get_s390_nettype (setting)); - break; - case PROP_S390_OPTIONS: - g_value_set_boxed (value, priv->s390_options); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_setting_wired_class_init (NMSettingWiredClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingWiredPrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->finalize = finalize; - parent_class->verify = verify; - - /* Properties */ - /** - * NMSettingWired:port: - * - * Specific port type to use if the device supports multiple - * attachment methods. One of "tp" (Twisted Pair), "aui" (Attachment Unit - * Interface), "bnc" (Thin Ethernet) or "mii" (Media Independent Interface). - * If the device supports only one port type, this setting is ignored. - **/ - g_object_class_install_property - (object_class, PROP_PORT, - g_param_spec_string (NM_SETTING_WIRED_PORT, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWired:speed: - * - * If non-zero, request that the device use only the specified speed. In - * Mbit/s, ie 100 == 100Mbit/s. - **/ - g_object_class_install_property - (object_class, PROP_SPEED, - g_param_spec_uint (NM_SETTING_WIRED_SPEED, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWired:duplex: - * - * If specified, request that the device only use the specified duplex mode. - * Either "half" or "full". - **/ - g_object_class_install_property - (object_class, PROP_DUPLEX, - g_param_spec_string (NM_SETTING_WIRED_DUPLEX, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWired:auto-negotiate: - * - * If %TRUE, allow auto-negotiation of port speed and duplex mode. If - * %FALSE, do not allow auto-negotiation, in which case the "speed" and - * "duplex" properties should be set. - **/ - g_object_class_install_property - (object_class, PROP_AUTO_NEGOTIATE, - g_param_spec_boolean (NM_SETTING_WIRED_AUTO_NEGOTIATE, "", "", - TRUE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWired:mac-address: - * - * If specified, this connection will only apply to the Ethernet device - * whose permanent MAC address matches. This property does not change the - * MAC address of the device (i.e. MAC spoofing). - **/ - g_object_class_install_property - (object_class, PROP_MAC_ADDRESS, - _nm_param_spec_specialized (NM_SETTING_WIRED_MAC_ADDRESS, "", "", - DBUS_TYPE_G_UCHAR_ARRAY, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWired:cloned-mac-address: - * - * If specified, request that the device use this MAC address instead of its - * permanent MAC address. This is known as MAC cloning or spoofing. - **/ - g_object_class_install_property - (object_class, PROP_CLONED_MAC_ADDRESS, - _nm_param_spec_specialized (NM_SETTING_WIRED_CLONED_MAC_ADDRESS, "", "", - DBUS_TYPE_G_UCHAR_ARRAY, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWired:mac-address-blacklist: - * - * If specified, this connection will never apply to the Ethernet device - * whose permanent MAC address matches an address in the list. Each MAC - * address is in the standard hex-digits-and-colons notation - * (00:11:22:33:44:55). - **/ - g_object_class_install_property - (object_class, PROP_MAC_ADDRESS_BLACKLIST, - _nm_param_spec_specialized (NM_SETTING_WIRED_MAC_ADDRESS_BLACKLIST, "", "", - DBUS_TYPE_G_LIST_OF_STRING, - G_PARAM_READWRITE | - NM_SETTING_PARAM_FUZZY_IGNORE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWired:mtu: - * - * If non-zero, only transmit packets of the specified size or smaller, - * breaking larger packets up into multiple Ethernet frames. - **/ - g_object_class_install_property - (object_class, PROP_MTU, - g_param_spec_uint (NM_SETTING_WIRED_MTU, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_FUZZY_IGNORE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWired:s390-subchannels: - * - * Identifies specific subchannels that this network device uses for - * communication with z/VM or s390 host. Like the - * #NMSettingWired:mac-address property for non-z/VM devices, this property - * can be used to ensure this connection only applies to the network device - * that uses these subchannels. The list should contain exactly 3 strings, - * and each string may only be composed of hexadecimal characters and the - * period (.) character. - **/ - g_object_class_install_property - (object_class, PROP_S390_SUBCHANNELS, - _nm_param_spec_specialized (NM_SETTING_WIRED_S390_SUBCHANNELS, "", "", - DBUS_TYPE_G_ARRAY_OF_STRING, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWired:s390-nettype: - * - * s390 network device type; one of "qeth", "lcs", or "ctc", representing - * the different types of virtual network devices available on s390 systems. - **/ - g_object_class_install_property - (object_class, PROP_S390_NETTYPE, - g_param_spec_string (NM_SETTING_WIRED_S390_NETTYPE, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWired:s390-options: - * - * Dictionary of key/value pairs of s390-specific device options. Both keys - * and values must be strings. Allowed keys include "portno", "layer2", - * "portname", "protocol", among others. Key names must contain only - * alphanumeric characters (ie, [a-zA-Z0-9]). - **/ - g_object_class_install_property - (object_class, PROP_S390_OPTIONS, - _nm_param_spec_specialized (NM_SETTING_WIRED_S390_OPTIONS, "", "", - DBUS_TYPE_G_MAP_OF_STRING, - G_PARAM_READWRITE | - NM_SETTING_PARAM_INFERRABLE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-util/nm-setting-wired.h b/libnm-util/nm-setting-wired.h deleted file mode 100644 index 08a39153af..0000000000 --- a/libnm-util/nm-setting-wired.h +++ /dev/null @@ -1,131 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2014 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#ifndef NM_SETTING_WIRED_H -#define NM_SETTING_WIRED_H - -#include "nm-setting.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SETTING_WIRED (nm_setting_wired_get_type ()) -#define NM_SETTING_WIRED(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_WIRED, NMSettingWired)) -#define NM_SETTING_WIRED_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_WIRED, NMSettingWiredClass)) -#define NM_IS_SETTING_WIRED(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_WIRED)) -#define NM_IS_SETTING_WIRED_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_WIRED)) -#define NM_SETTING_WIRED_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_WIRED, NMSettingWiredClass)) - -#define NM_SETTING_WIRED_SETTING_NAME "802-3-ethernet" - -/** - * NMSettingWiredError: - * @NM_SETTING_WIRED_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_WIRED_ERROR_INVALID_PROPERTY: the property was invalid - * @NM_SETTING_WIRED_ERROR_MISSING_PROPERTY: the property was missing and is - * required - */ -typedef enum { - NM_SETTING_WIRED_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_SETTING_WIRED_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/ - NM_SETTING_WIRED_ERROR_MISSING_PROPERTY /*< nick=MissingProperty >*/ -} NMSettingWiredError; - -#define NM_SETTING_WIRED_ERROR nm_setting_wired_error_quark () -GQuark nm_setting_wired_error_quark (void); - -#define NM_SETTING_WIRED_PORT "port" -#define NM_SETTING_WIRED_SPEED "speed" -#define NM_SETTING_WIRED_DUPLEX "duplex" -#define NM_SETTING_WIRED_AUTO_NEGOTIATE "auto-negotiate" -#define NM_SETTING_WIRED_MAC_ADDRESS "mac-address" -#define NM_SETTING_WIRED_CLONED_MAC_ADDRESS "cloned-mac-address" -#define NM_SETTING_WIRED_MAC_ADDRESS_BLACKLIST "mac-address-blacklist" -#define NM_SETTING_WIRED_MTU "mtu" -#define NM_SETTING_WIRED_S390_SUBCHANNELS "s390-subchannels" -#define NM_SETTING_WIRED_S390_NETTYPE "s390-nettype" -#define NM_SETTING_WIRED_S390_OPTIONS "s390-options" - -typedef struct { - NMSetting parent; -} NMSettingWired; - -typedef struct { - NMSettingClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); -} NMSettingWiredClass; - -GType nm_setting_wired_get_type (void); - -NMSetting * nm_setting_wired_new (void); -const char * nm_setting_wired_get_port (NMSettingWired *setting); -guint32 nm_setting_wired_get_speed (NMSettingWired *setting); -const char * nm_setting_wired_get_duplex (NMSettingWired *setting); -gboolean nm_setting_wired_get_auto_negotiate (NMSettingWired *setting); -const GByteArray *nm_setting_wired_get_mac_address (NMSettingWired *setting); -const GByteArray *nm_setting_wired_get_cloned_mac_address (NMSettingWired *setting); - -const GSList *nm_setting_wired_get_mac_address_blacklist (NMSettingWired *setting); -NM_AVAILABLE_IN_0_9_10 -guint32 nm_setting_wired_get_num_mac_blacklist_items (NMSettingWired *setting); -NM_AVAILABLE_IN_0_9_10 -const char * nm_setting_wired_get_mac_blacklist_item (NMSettingWired *setting, - guint32 idx); -NM_AVAILABLE_IN_0_9_10 -gboolean nm_setting_wired_add_mac_blacklist_item (NMSettingWired *setting, - const char *mac); -NM_AVAILABLE_IN_0_9_10 -void nm_setting_wired_remove_mac_blacklist_item (NMSettingWired *setting, - guint32 idx); -NM_AVAILABLE_IN_0_9_10 -gboolean nm_setting_wired_remove_mac_blacklist_item_by_value (NMSettingWired *setting, - const char *mac); -NM_AVAILABLE_IN_0_9_10 -void nm_setting_wired_clear_mac_blacklist_items (NMSettingWired *setting); - -guint32 nm_setting_wired_get_mtu (NMSettingWired *setting); - -const GPtrArray * nm_setting_wired_get_s390_subchannels (NMSettingWired *setting); -const char * nm_setting_wired_get_s390_nettype (NMSettingWired *setting); - -guint32 nm_setting_wired_get_num_s390_options (NMSettingWired *setting); -gboolean nm_setting_wired_get_s390_option (NMSettingWired *setting, - guint32 idx, - const char **out_key, - const char **out_value); -const char * nm_setting_wired_get_s390_option_by_key (NMSettingWired *setting, - const char *key); -gboolean nm_setting_wired_add_s390_option (NMSettingWired *setting, - const char *key, - const char *value); -gboolean nm_setting_wired_remove_s390_option (NMSettingWired *setting, - const char *key); -NM_AVAILABLE_IN_0_9_10 -const char ** nm_setting_wired_get_valid_s390_options (NMSettingWired *setting); - -G_END_DECLS - -#endif /* NM_SETTING_WIRED_H */ diff --git a/libnm-util/nm-setting-wireless-security.c b/libnm-util/nm-setting-wireless-security.c deleted file mode 100644 index 33598dfec0..0000000000 --- a/libnm-util/nm-setting-wireless-security.c +++ /dev/null @@ -1,1552 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2014 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <dbus/dbus-glib.h> - -#include "nm-setting-wireless-security.h" -#include "nm-setting-8021x.h" -#include "nm-param-spec-specialized.h" -#include "nm-utils.h" -#include "nm-dbus-glib-types.h" -#include "nm-utils-private.h" -#include "nm-setting-private.h" - -/** - * SECTION:nm-setting-wireless-security - * @short_description: Describes connection properties for Wi-Fi networks that - * use WEP, LEAP, WPA or WPA2/RSN security - * @include: nm-setting-wireless-security.h - * - * The #NMSettingWirelessSecurity object is a #NMSetting subclass that describes - * properties necessary for connection to encrypted Wi-Fi networks. - * - * It's a good idea to read up on wpa_supplicant configuration before using this - * setting extensively, since most of the options here correspond closely with - * the relevant wpa_supplicant configuration options. To get a better overview - * of how Wi-Fi security works, you may want to get copies of the following books. - * - * 802.11 Wireless Networks: The Definitive Guide, Second Edition - * Author: Matthew Gast - * ISBN: 978-0596100520 - * - * Cisco Wireless LAN Security - * Authors: Krishna Sankar, Sri Sundaralingam, Darrin Miller, and Andrew Balinsky - * ISBN: 978-1587051548 - **/ - -/** - * nm_setting_wireless_security_error_quark: - * - * Registers an error quark for #NMSettingWired if necessary. - * - * Returns: the error quark used for #NMSettingWired errors. - **/ -GQuark -nm_setting_wireless_security_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-wireless-security-error-quark"); - return quark; -} - -G_DEFINE_TYPE_WITH_CODE (NMSettingWirelessSecurity, nm_setting_wireless_security, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, - g_define_type_id, - 2, - NM_SETTING_WIRELESS_SECURITY_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_WIRELESS_SECURITY) - -#define NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_WIRELESS_SECURITY, NMSettingWirelessSecurityPrivate)) - -typedef struct { - char *key_mgmt; - char *auth_alg; - GSList *proto; /* GSList of strings */ - GSList *pairwise; /* GSList of strings */ - GSList *group; /* GSList of strings */ - - /* LEAP */ - char *leap_username; - char *leap_password; - NMSettingSecretFlags leap_password_flags; - - /* WEP */ - char *wep_key0; - char *wep_key1; - char *wep_key2; - char *wep_key3; - NMSettingSecretFlags wep_key_flags; - NMWepKeyType wep_key_type; - guint32 wep_tx_keyidx; - - /* WPA-PSK */ - char *psk; - NMSettingSecretFlags psk_flags; -} NMSettingWirelessSecurityPrivate; - -enum { - PROP_0, - PROP_KEY_MGMT, - PROP_WEP_TX_KEYIDX, - PROP_AUTH_ALG, - PROP_PROTO, - PROP_PAIRWISE, - PROP_GROUP, - PROP_LEAP_USERNAME, - PROP_WEP_KEY0, - PROP_WEP_KEY1, - PROP_WEP_KEY2, - PROP_WEP_KEY3, - PROP_WEP_KEY_FLAGS, - PROP_WEP_KEY_TYPE, - PROP_PSK, - PROP_PSK_FLAGS, - PROP_LEAP_PASSWORD, - PROP_LEAP_PASSWORD_FLAGS, - - LAST_PROP -}; - -/** - * nm_setting_wireless_security_new: - * - * Creates a new #NMSettingWirelessSecurity object with default values. - * - * Returns: (transfer full): the new empty #NMSettingWirelessSecurity object - **/ -NMSetting * -nm_setting_wireless_security_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_WIRELESS_SECURITY, NULL); -} - -/** - * nm_setting_wireless_security_get_key_mgmt: - * @setting: the #NMSettingWirelessSecurity - * - * Returns: the #NMSettingWirelessSecurity:key-mgmt property of the setting - **/ -const char * -nm_setting_wireless_security_get_key_mgmt (NMSettingWirelessSecurity *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting), NULL); - - return NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting)->key_mgmt; -} - -/** - * nm_setting_wireless_security_get_num_protos: - * @setting: the #NMSettingWirelessSecurity - * - * Returns: the number of security protocols this connection allows when - * connecting to secure Wi-Fi networks - **/ -guint32 -nm_setting_wireless_security_get_num_protos (NMSettingWirelessSecurity *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting), 0); - - return g_slist_length (NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting)->proto); -} - -/** - * nm_setting_wireless_security_get_proto: - * @setting: the #NMSettingWirelessSecurity - * @i: an index into the protocol list - * - * Returns: the protocol at index @i - **/ -const char * -nm_setting_wireless_security_get_proto (NMSettingWirelessSecurity *setting, guint32 i) -{ - NMSettingWirelessSecurityPrivate *priv; - - g_return_val_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting), NULL); - - priv = NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting); - g_return_val_if_fail (i <= g_slist_length (priv->proto), NULL); - - return (const char *) g_slist_nth_data (priv->proto, i); -} - -/** - * nm_setting_wireless_security_add_proto: - * @setting: the #NMSettingWirelessSecurity - * @proto: the protocol to add, one of "wpa" or "rsn" - * - * Adds a Wi-Fi security protocol (one of "wpa" or "rsn") to the allowed list; - * only protocols in this list will be used when finding and connecting to - * the Wi-Fi network specified by this connection. For example, if the - * protocol list contains only "wpa" but the access point for the SSID specified - * by this connection only supports WPA2/RSN, the connection cannot be used - * with the access point. - * - * Returns: %TRUE if the protocol was new and was added to the allowed - * protocol list, or %FALSE if it was already in the list - **/ -gboolean -nm_setting_wireless_security_add_proto (NMSettingWirelessSecurity *setting, const char *proto) -{ - NMSettingWirelessSecurityPrivate *priv; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting), FALSE); - g_return_val_if_fail (proto != NULL, FALSE); - - priv = NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting); - for (iter = priv->proto; iter; iter = g_slist_next (iter)) { - if (strcasecmp (proto, (char *) iter->data) == 0) - return FALSE; - } - - priv->proto = g_slist_append (priv->proto, g_ascii_strdown (proto, -1)); - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRELESS_SECURITY_PROTO); - return TRUE; -} - -/** - * nm_setting_wireless_security_remove_proto: - * @setting: the #NMSettingWirelessSecurity - * @i: index of the protocol to remove - * - * Removes a protocol from the allowed protocol list. - **/ -void -nm_setting_wireless_security_remove_proto (NMSettingWirelessSecurity *setting, guint32 i) -{ - NMSettingWirelessSecurityPrivate *priv; - GSList *elt; - - g_return_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting)); - - priv = NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting); - elt = g_slist_nth (priv->proto, i); - g_return_if_fail (elt != NULL); - - g_free (elt->data); - priv->proto = g_slist_delete_link (priv->proto, elt); - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRELESS_SECURITY_PROTO); -} - -/** - * nm_setting_wireless_security_remove_proto_by_value: - * @setting: the #NMSettingWirelessSecurity - * @proto: the protocol to remove, one of "wpa" or "rsn" - * - * Removes a protocol from the allowed protocol list. - * - * Returns: %TRUE if the protocol was found and removed; %FALSE if it was not. - * - * Since: 0.9.10 - **/ -gboolean -nm_setting_wireless_security_remove_proto_by_value (NMSettingWirelessSecurity *setting, - const char *proto) -{ - NMSettingWirelessSecurityPrivate *priv; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting), FALSE); - g_return_val_if_fail (proto != NULL, FALSE); - - priv = NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting); - for (iter = priv->proto; iter; iter = g_slist_next (iter)) { - if (strcasecmp (proto, (char *) iter->data) == 0) { - priv->proto = g_slist_delete_link (priv->proto, iter); - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRELESS_SECURITY_PROTO); - return TRUE; - } - } - return FALSE; -} - -/** - * nm_setting_wireless_security_clear_protos: - * @setting: the #NMSettingWirelessSecurity - * - * Removes all protocols from the allowed list. If there are no protocols - * specified then all protocols are allowed. - **/ -void -nm_setting_wireless_security_clear_protos (NMSettingWirelessSecurity *setting) -{ - NMSettingWirelessSecurityPrivate *priv; - - g_return_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting)); - - priv = NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting); - g_slist_free_full (priv->proto, g_free); - priv->proto = NULL; - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRELESS_SECURITY_PROTO); -} - -/** - * nm_setting_wireless_security_get_num_pairwise: - * @setting: the #NMSettingWirelessSecurity - * - * Returns: the number of pairwise encryption algorithms in the allowed list - **/ -guint32 -nm_setting_wireless_security_get_num_pairwise (NMSettingWirelessSecurity *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting), 0); - - return g_slist_length (NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting)->pairwise); -} - -/** - * nm_setting_wireless_security_get_pairwise: - * @setting: the #NMSettingWirelessSecurity - * @i: index of an item in the allowed pairwise encryption algorithm list - * - * Returns the allowed pairwise encryption algorithm from allowed algorithm - * list. - * - * Returns: the pairwise encryption algorithm at index @i - **/ -const char * -nm_setting_wireless_security_get_pairwise (NMSettingWirelessSecurity *setting, guint32 i) -{ - NMSettingWirelessSecurityPrivate *priv; - - g_return_val_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting), NULL); - - priv = NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting); - g_return_val_if_fail (i <= g_slist_length (priv->pairwise), NULL); - - return (const char *) g_slist_nth_data (priv->pairwise, i); -} - -/** - * nm_setting_wireless_security_add_pairwise: - * @setting: the #NMSettingWirelessSecurity - * @pairwise: the encryption algorithm to add, one of "tkip" or "ccmp" - * - * Adds an encryption algorithm to the list of allowed pairwise encryption - * algorithms. If the list is not empty, then only access points that support - * one or more of the encryption algorithms in the list will be considered - * compatible with this connection. - * - * Returns: %TRUE if the algorithm was added to the list, %FALSE if it was - * already in the list - **/ -gboolean -nm_setting_wireless_security_add_pairwise (NMSettingWirelessSecurity *setting, const char *pairwise) -{ - NMSettingWirelessSecurityPrivate *priv; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting), FALSE); - g_return_val_if_fail (pairwise != NULL, FALSE); - - priv = NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting); - for (iter = priv->pairwise; iter; iter = g_slist_next (iter)) { - if (strcasecmp (pairwise, (char *) iter->data) == 0) - return FALSE; - } - - priv->pairwise = g_slist_append (priv->pairwise, g_ascii_strdown (pairwise, -1)); - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRELESS_SECURITY_PAIRWISE); - return TRUE; -} - -/** - * nm_setting_wireless_security_remove_pairwise: - * @setting: the #NMSettingWirelessSecurity - * @i: the index of an item in the allowed pairwise encryption algorithm list - * - * Removes an encryption algorithm from the allowed pairwise encryption - * algorithm list. - **/ -void -nm_setting_wireless_security_remove_pairwise (NMSettingWirelessSecurity *setting, guint32 i) -{ - NMSettingWirelessSecurityPrivate *priv; - GSList *elt; - - g_return_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting)); - - priv = NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting); - elt = g_slist_nth (priv->pairwise, i); - g_return_if_fail (elt != NULL); - - g_free (elt->data); - priv->pairwise = g_slist_delete_link (priv->pairwise, elt); - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRELESS_SECURITY_PAIRWISE); -} - -/** - * nm_setting_wireless_security_remove_pairwise_by_value: - * @setting: the #NMSettingWirelessSecurity - * @pairwise: the encryption algorithm to remove, one of "tkip" or "ccmp" - * - * Removes an encryption algorithm from the allowed pairwise encryption - * algorithm list. - * - * Returns: %TRUE if the encryption algorithm was found and removed; %FALSE if it was not. - * - * Since: 0.9.10 - **/ -gboolean -nm_setting_wireless_security_remove_pairwise_by_value (NMSettingWirelessSecurity *setting, - const char *pairwise) -{ - NMSettingWirelessSecurityPrivate *priv; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting), FALSE); - g_return_val_if_fail (pairwise != NULL, FALSE); - - priv = NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting); - for (iter = priv->pairwise; iter; iter = g_slist_next (iter)) { - if (strcasecmp (pairwise, (char *) iter->data) == 0) { - priv->pairwise = g_slist_delete_link (priv->pairwise, iter); - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRELESS_SECURITY_PAIRWISE); - return TRUE; - } - } - return FALSE; -} - -/** - * nm_setting_wireless_security_clear_pairwise: - * @setting: the #NMSettingWirelessSecurity - * - * Removes all algorithms from the allowed list. If there are no algorithms - * specified then all pairwise encryption algorithms are allowed. - **/ -void -nm_setting_wireless_security_clear_pairwise (NMSettingWirelessSecurity *setting) -{ - NMSettingWirelessSecurityPrivate *priv; - - g_return_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting)); - - priv = NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting); - g_slist_free_full (priv->pairwise, g_free); - priv->pairwise = NULL; - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRELESS_SECURITY_PAIRWISE); -} - -/** - * nm_setting_wireless_security_get_num_groups: - * @setting: the #NMSettingWirelessSecurity - * - * Returns: the number of groupwise encryption algorithms in the allowed list - **/ -guint32 -nm_setting_wireless_security_get_num_groups (NMSettingWirelessSecurity *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting), 0); - - return g_slist_length (NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting)->group); -} - -/** - * nm_setting_wireless_security_get_group: - * @setting: the #NMSettingWirelessSecurity - * @i: index of an item in the allowed groupwise encryption algorithm list - * - * Returns the allowed groupwise encryption algorithm from allowed algorithm - * list. - * - * Returns: the groupwise encryption algorithm at index @i - **/ -const char * -nm_setting_wireless_security_get_group (NMSettingWirelessSecurity *setting, guint32 i) -{ - NMSettingWirelessSecurityPrivate *priv; - - g_return_val_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting), NULL); - - priv = NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting); - g_return_val_if_fail (i <= g_slist_length (priv->group), NULL); - - return (const char *) g_slist_nth_data (priv->group, i); -} - -/** - * nm_setting_wireless_security_add_group: - * @setting: the #NMSettingWirelessSecurity - * @group: the encryption algorithm to add, one of "wep40", "wep104", - * "tkip", or "ccmp" - * - * Adds an encryption algorithm to the list of allowed groupwise encryption - * algorithms. If the list is not empty, then only access points that support - * one or more of the encryption algorithms in the list will be considered - * compatible with this connection. - * - * Returns: %TRUE if the algorithm was added to the list, %FALSE if it was - * already in the list - **/ -gboolean -nm_setting_wireless_security_add_group (NMSettingWirelessSecurity *setting, const char *group) -{ - NMSettingWirelessSecurityPrivate *priv; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting), FALSE); - g_return_val_if_fail (group != NULL, FALSE); - - priv = NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting); - for (iter = priv->group; iter; iter = g_slist_next (iter)) { - if (strcasecmp (group, (char *) iter->data) == 0) - return FALSE; - } - - priv->group = g_slist_append (priv->group, g_ascii_strdown (group, -1)); - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRELESS_SECURITY_GROUP); - return TRUE; -} - -/** - * nm_setting_wireless_security_remove_group: - * @setting: the #NMSettingWirelessSecurity - * @i: the index of an item in the allowed groupwise encryption algorithm list - * - * Removes an encryption algorithm from the allowed groupwise encryption - * algorithm list. - **/ -void -nm_setting_wireless_security_remove_group (NMSettingWirelessSecurity *setting, guint32 i) -{ - NMSettingWirelessSecurityPrivate *priv; - GSList *elt; - - g_return_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting)); - - priv = NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting); - elt = g_slist_nth (priv->group, i); - g_return_if_fail (elt != NULL); - - g_free (elt->data); - priv->group = g_slist_delete_link (priv->group, elt); - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRELESS_SECURITY_GROUP); -} - -/** - * nm_setting_wireless_security_remove_group_by_value: - * @setting: the #NMSettingWirelessSecurity - * @group: the encryption algorithm to remove, one of "wep40", "wep104", - * "tkip", or "ccmp" - * - * Removes an encryption algorithm from the allowed groupwise encryption - * algorithm list. - * - * Returns: %TRUE if the algorithm was found and removed; %FALSE if it was not. - * - * Since: 0.9.10 - **/ -gboolean -nm_setting_wireless_security_remove_group_by_value (NMSettingWirelessSecurity *setting, - const char *group) -{ - NMSettingWirelessSecurityPrivate *priv; - GSList *iter; - - g_return_val_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting), FALSE); - g_return_val_if_fail (group != NULL, FALSE); - - priv = NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting); - for (iter = priv->group; iter; iter = g_slist_next (iter)) { - if (strcasecmp (group, (char *) iter->data) == 0) { - priv->group = g_slist_delete_link (priv->group, iter); - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRELESS_SECURITY_GROUP); - return TRUE; - } - } - return FALSE; -} - -/** - * nm_setting_wireless_security_clear_groups: - * @setting: the #NMSettingWirelessSecurity - * - * Removes all algorithms from the allowed list. If there are no algorithms - * specified then all groupwise encryption algorithms are allowed. - **/ -void -nm_setting_wireless_security_clear_groups (NMSettingWirelessSecurity *setting) -{ - NMSettingWirelessSecurityPrivate *priv; - - g_return_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting)); - - priv = NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting); - g_slist_free_full (priv->group, g_free); - priv->group = NULL; - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRELESS_SECURITY_GROUP); -} - -/** - * nm_setting_wireless_security_get_psk: - * @setting: the #NMSettingWirelessSecurity - * - * Returns: the #NMSettingWirelessSecurity:psk property of the setting - **/ -const char * -nm_setting_wireless_security_get_psk (NMSettingWirelessSecurity *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting), NULL); - - return NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting)->psk; -} - -/** - * nm_setting_wireless_security_get_psk_flags: - * @setting: the #NMSettingWirelessSecurity - * - * Returns: the #NMSettingSecretFlags pertaining to the - * #NMSettingWirelessSecurity:psk - **/ -NMSettingSecretFlags -nm_setting_wireless_security_get_psk_flags (NMSettingWirelessSecurity *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting), NM_SETTING_SECRET_FLAG_NONE); - - return NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting)->psk_flags; -} - -/** - * nm_setting_wireless_security_get_leap_username: - * @setting: the #NMSettingWirelessSecurity - * - * Returns: the #NMSettingWirelessSecurity:leap-username property of the setting - **/ -const char * -nm_setting_wireless_security_get_leap_username (NMSettingWirelessSecurity *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting), NULL); - - return NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting)->leap_username; -} - -/** - * nm_setting_wireless_security_get_leap_password: - * @setting: the #NMSettingWirelessSecurity - * - * Returns: the #NMSettingWirelessSecurity:leap-password property of the setting - **/ -const char * -nm_setting_wireless_security_get_leap_password (NMSettingWirelessSecurity *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting), NULL); - - return NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting)->leap_password; -} - -/** - * nm_setting_wireless_security_get_leap_password_flags: - * @setting: the #NMSettingWirelessSecurity - * - * Returns: the #NMSettingSecretFlags pertaining to the - * #NMSettingWirelessSecurity:leap-password - **/ -NMSettingSecretFlags -nm_setting_wireless_security_get_leap_password_flags (NMSettingWirelessSecurity *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting), NM_SETTING_SECRET_FLAG_NONE); - - return NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting)->leap_password_flags; -} - -/** - * nm_setting_wireless_security_get_wep_key: - * @setting: the #NMSettingWirelessSecurity - * @idx: the WEP key index (0..3 inclusive) - * - * Returns: the WEP key at the given index - **/ -const char * -nm_setting_wireless_security_get_wep_key (NMSettingWirelessSecurity *setting, guint32 idx) -{ - NMSettingWirelessSecurityPrivate *priv; - - g_return_val_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting), NULL); - g_return_val_if_fail (idx < 4, NULL); - - priv = NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting); - if (idx == 0) - return priv->wep_key0; - else if (idx == 1) - return priv->wep_key1; - else if (idx == 2) - return priv->wep_key2; - else if (idx == 3) - return priv->wep_key3; - - g_assert_not_reached (); - return NULL; -} - -/** - * nm_setting_wireless_security_set_wep_key: - * @setting: the #NMSettingWirelessSecurity - * @idx: the index of the key (0..3 inclusive) - * @key: the WEP key as a string, in either hexadecimal, ASCII, or passphrase - * form as determiend by the value of the #NMSettingWirelessSecurity:wep-key-type - * property. - * - * Sets a WEP key in the given index. - **/ -void -nm_setting_wireless_security_set_wep_key (NMSettingWirelessSecurity *setting, guint32 idx, const char *key) -{ - NMSettingWirelessSecurityPrivate *priv; - - g_return_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting)); - g_return_if_fail (idx < 4); - - priv = NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting); - switch (idx) { - case 0: - g_free (priv->wep_key0); - priv->wep_key0 = g_strdup (key); - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRELESS_SECURITY_WEP_KEY0); - break; - case 1: - g_free (priv->wep_key1); - priv->wep_key1 = g_strdup (key); - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRELESS_SECURITY_WEP_KEY1); - break; - case 2: - g_free (priv->wep_key2); - priv->wep_key2 = g_strdup (key); - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRELESS_SECURITY_WEP_KEY2); - break; - case 3: - g_free (priv->wep_key3); - priv->wep_key3 = g_strdup (key); - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRELESS_SECURITY_WEP_KEY3); - break; - default: - g_assert_not_reached (); - } -} - -/** - * nm_setting_wireless_security_get_wep_tx_keyidx: - * @setting: the #NMSettingWirelessSecurity - * - * Returns: the #NMSettingWirelessSecurity:wep-tx-keyidx property of the setting - **/ -guint32 -nm_setting_wireless_security_get_wep_tx_keyidx (NMSettingWirelessSecurity *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting), 0); - - return NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting)->wep_tx_keyidx; -} - -/** - * nm_setting_wireless_security_get_auth_alg: - * @setting: the #NMSettingWirelessSecurity - * - * Returns: the #NMSettingWirelessSecurity:auth-alg property of the setting - **/ -const char * -nm_setting_wireless_security_get_auth_alg (NMSettingWirelessSecurity *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting), NULL); - - return NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting)->auth_alg; -} - -/** - * nm_setting_wireless_security_get_wep_key_flags: - * @setting: the #NMSettingWirelessSecurity - * - * Returns: the #NMSettingSecretFlags pertaining to the all WEP keys - **/ -NMSettingSecretFlags -nm_setting_wireless_security_get_wep_key_flags (NMSettingWirelessSecurity *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting), NM_SETTING_SECRET_FLAG_NONE); - - return NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting)->wep_key_flags; -} - -/** - * nm_setting_wireless_security_get_wep_key_type: - * @setting: the #NMSettingWirelessSecurity - * - * Returns: the #NMSettingWirelessSecurity:wep-key-type property of the setting - **/ -NMWepKeyType -nm_setting_wireless_security_get_wep_key_type (NMSettingWirelessSecurity *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting), 0); - - return NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting)->wep_key_type; -} - -static GPtrArray * -need_secrets (NMSetting *setting) -{ - NMSettingWirelessSecurity *self = NM_SETTING_WIRELESS_SECURITY (setting); - NMSettingWirelessSecurityPrivate *priv = NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (self); - GPtrArray *secrets; - - secrets = g_ptr_array_sized_new (4); - - g_assert (priv->key_mgmt); - - /* Static WEP */ - if (strcmp (priv->key_mgmt, "none") == 0) { - if ((priv->wep_tx_keyidx == 0) && !nm_utils_wep_key_valid (priv->wep_key0, priv->wep_key_type)) { - g_ptr_array_add (secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY0); - return secrets; - } - if ((priv->wep_tx_keyidx == 1) && !nm_utils_wep_key_valid (priv->wep_key1, priv->wep_key_type)) { - g_ptr_array_add (secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY1); - return secrets; - } - if ((priv->wep_tx_keyidx == 2) && !nm_utils_wep_key_valid (priv->wep_key2, priv->wep_key_type)) { - g_ptr_array_add (secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY2); - return secrets; - } - if ((priv->wep_tx_keyidx == 3) && !nm_utils_wep_key_valid (priv->wep_key3, priv->wep_key_type)) { - g_ptr_array_add (secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY3); - return secrets; - } - goto no_secrets; - } - - /* WPA-PSK infrastructure and adhoc */ - if ( (strcmp (priv->key_mgmt, "wpa-none") == 0) - || (strcmp (priv->key_mgmt, "wpa-psk") == 0)) { - if (!nm_utils_wpa_psk_valid (priv->psk)) { - g_ptr_array_add (secrets, NM_SETTING_WIRELESS_SECURITY_PSK); - return secrets; - } - goto no_secrets; - } - - /* LEAP */ - if ( priv->auth_alg - && !strcmp (priv->auth_alg, "leap") - && !strcmp (priv->key_mgmt, "ieee8021x")) { - if (!priv->leap_password || !*priv->leap_password) { - g_ptr_array_add (secrets, NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD); - return secrets; - } - goto no_secrets; - } - - if ( (strcmp (priv->key_mgmt, "ieee8021x") == 0) - || (strcmp (priv->key_mgmt, "wpa-eap") == 0)) { - /* Let caller check the 802.1x setting for secrets */ - goto no_secrets; - } - - g_assert_not_reached (); - return secrets; - -no_secrets: - if (secrets) - g_ptr_array_free (secrets, TRUE); - return NULL; -} - -static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - NMSettingWirelessSecurity *self = NM_SETTING_WIRELESS_SECURITY (setting); - NMSettingWirelessSecurityPrivate *priv = NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (self); - const char *valid_key_mgmt[] = { "none", "ieee8021x", "wpa-none", "wpa-psk", "wpa-eap", NULL }; - const char *valid_auth_algs[] = { "open", "shared", "leap", NULL }; - const char *valid_protos[] = { "wpa", "rsn", NULL }; - const char *valid_pairwise[] = { "tkip", "ccmp", NULL }; - const char *valid_groups[] = { "wep40", "wep104", "tkip", "ccmp", NULL }; - - if (!priv->key_mgmt) { - g_set_error_literal (error, - NM_SETTING_WIRELESS_SECURITY_ERROR, - NM_SETTING_WIRELESS_SECURITY_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, NM_SETTING_WIRELESS_SECURITY_KEY_MGMT); - return FALSE; - } - - if (!g_strv_contains (valid_key_mgmt, priv->key_mgmt)) { - g_set_error (error, - NM_SETTING_WIRELESS_SECURITY_ERROR, - NM_SETTING_WIRELESS_SECURITY_ERROR_INVALID_PROPERTY, - _("'%s' is not a valid value for the property"), - priv->key_mgmt); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, NM_SETTING_WIRELESS_SECURITY_KEY_MGMT); - return FALSE; - } - - if (priv->auth_alg && !strcmp (priv->auth_alg, "leap")) { - /* LEAP must use ieee8021x key management */ - if (strcmp (priv->key_mgmt, "ieee8021x")) { - g_set_error (error, - NM_SETTING_WIRELESS_SECURITY_ERROR, - NM_SETTING_WIRELESS_SECURITY_ERROR_LEAP_REQUIRES_802_1X, - _("'%s' security requires '%s=%s'"), - "leap", NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, "ieee8021x"); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, NM_SETTING_WIRELESS_SECURITY_AUTH_ALG); - return FALSE; - } - if (!priv->leap_username) { - g_set_error_literal (error, - NM_SETTING_WIRELESS_SECURITY_ERROR, - NM_SETTING_WIRELESS_SECURITY_ERROR_LEAP_REQUIRES_USERNAME, - _("property is empty")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME); - return FALSE; - } - } else { - if ( (strcmp (priv->key_mgmt, "ieee8021x") == 0) - || (strcmp (priv->key_mgmt, "wpa-eap") == 0)) { - /* Need an 802.1x setting too */ - if (!nm_setting_find_in_list (all_settings, NM_SETTING_802_1X_SETTING_NAME)) { - g_set_error (error, - NM_SETTING_WIRELESS_SECURITY_ERROR, - NM_SETTING_WIRELESS_SECURITY_ERROR_MISSING_802_1X_SETTING, - _("'%s' security requires '%s' setting presence"), - priv->key_mgmt, NM_SETTING_802_1X_SETTING_NAME); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, NM_SETTING_WIRELESS_SECURITY_KEY_MGMT); - return FALSE; - } - } - } - - if (priv->leap_username && !strlen (priv->leap_username)) { - g_set_error_literal (error, - NM_SETTING_WIRELESS_SECURITY_ERROR, - NM_SETTING_WIRELESS_SECURITY_ERROR_INVALID_PROPERTY, - _("property is empty")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME); - return FALSE; - } - - if (priv->wep_tx_keyidx > 3) { - g_set_error (error, - NM_SETTING_WIRELESS_SECURITY_ERROR, - NM_SETTING_WIRELESS_SECURITY_ERROR_INVALID_PROPERTY, - _("'%d' value is out of range <0-3>"), - priv->wep_tx_keyidx); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, NM_SETTING_WIRELESS_SECURITY_WEP_TX_KEYIDX); - return FALSE; - } - - if (priv->wep_key_type > NM_WEP_KEY_TYPE_LAST) { - g_set_error_literal (error, - NM_SETTING_WIRELESS_SECURITY_ERROR, - NM_SETTING_WIRELESS_SECURITY_ERROR_INVALID_PROPERTY, - _("property is invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, NM_SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE); - return FALSE; - } - - if (priv->auth_alg && !g_strv_contains (valid_auth_algs, priv->auth_alg)) { - g_set_error_literal (error, - NM_SETTING_WIRELESS_SECURITY_ERROR, - NM_SETTING_WIRELESS_SECURITY_ERROR_INVALID_PROPERTY, - _("property is invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, NM_SETTING_WIRELESS_SECURITY_AUTH_ALG); - return FALSE; - } - - if (priv->proto && !_nm_utils_string_slist_validate (priv->proto, valid_protos)) { - g_set_error_literal (error, - NM_SETTING_WIRELESS_SECURITY_ERROR, - NM_SETTING_WIRELESS_SECURITY_ERROR_INVALID_PROPERTY, - _("property is invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, NM_SETTING_WIRELESS_SECURITY_PROTO); - return FALSE; - } - - if (priv->pairwise) { - const char *wpa_none[] = { "wpa-none", NULL }; - - /* For ad-hoc connections, pairwise must be "none" */ - if (g_strv_contains (wpa_none, priv->key_mgmt)) { - GSList *iter; - gboolean found = FALSE; - - for (iter = priv->pairwise; iter; iter = g_slist_next (iter)) { - if (!strcmp ((char *) iter->data, "none")) { - found = TRUE; - break; - } - } - - /* pairwise cipher list didn't contain "none", which is invalid - * for WPA adhoc connections. - */ - if (!found) { - g_set_error (error, - NM_SETTING_WIRELESS_SECURITY_ERROR, - NM_SETTING_WIRELESS_SECURITY_ERROR_INVALID_PROPERTY, - _("'%s' connections require '%s' in this property"), - NM_SETTING_WIRELESS_MODE_ADHOC, "none"); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, NM_SETTING_WIRELESS_SECURITY_PAIRWISE); - return FALSE; - } - } else if (!_nm_utils_string_slist_validate (priv->pairwise, valid_pairwise)) { - g_set_error_literal (error, - NM_SETTING_WIRELESS_SECURITY_ERROR, - NM_SETTING_WIRELESS_SECURITY_ERROR_INVALID_PROPERTY, - _("property is invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, NM_SETTING_WIRELESS_SECURITY_PAIRWISE); - return FALSE; - } - } - - if (priv->group && !_nm_utils_string_slist_validate (priv->group, valid_groups)) { - g_set_error_literal (error, - NM_SETTING_WIRELESS_SECURITY_ERROR, - NM_SETTING_WIRELESS_SECURITY_ERROR_INVALID_PROPERTY, - _("property is invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, NM_SETTING_WIRELESS_SECURITY_GROUP); - return FALSE; - } - - /* Shared Key auth can only be used with WEP */ - if (priv->auth_alg && !strcmp (priv->auth_alg, "shared")) { - if (priv->key_mgmt && strcmp (priv->key_mgmt, "none")) { - g_set_error (error, - NM_SETTING_WIRELESS_SECURITY_ERROR, - NM_SETTING_WIRELESS_SECURITY_ERROR_SHARED_KEY_REQUIRES_WEP, - _("'%s' can only be used with '%s=%s' (WEP)"), - "shared", NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, "none"); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, NM_SETTING_WIRELESS_SECURITY_AUTH_ALG); - return FALSE; - } - } - - return TRUE; -} - -static gboolean -get_secret_flags (NMSetting *setting, - const char *secret_name, - gboolean verify_secret, - NMSettingSecretFlags *out_flags, - GError **error) -{ - NMSettingClass *setting_class; - gboolean verify_override = verify_secret; - - /* There's only one 'flags' property for WEP keys, so alias all the WEP key - * property names to that flags property. - */ - if ( !g_strcmp0 (secret_name, NM_SETTING_WIRELESS_SECURITY_WEP_KEY0) - || !g_strcmp0 (secret_name, NM_SETTING_WIRELESS_SECURITY_WEP_KEY1) - || !g_strcmp0 (secret_name, NM_SETTING_WIRELESS_SECURITY_WEP_KEY2) - || !g_strcmp0 (secret_name, NM_SETTING_WIRELESS_SECURITY_WEP_KEY3)) { - secret_name = "wep-key"; - verify_override = FALSE; /* Already know it's a secret */ - } - - /* Chain up to superclass with modified key name */ - setting_class = NM_SETTING_CLASS (nm_setting_wireless_security_parent_class); - return setting_class->get_secret_flags (setting, secret_name, verify_override, out_flags, error); -} - -static gboolean -set_secret_flags (NMSetting *setting, - const char *secret_name, - gboolean verify_secret, - NMSettingSecretFlags flags, - GError **error) -{ - NMSettingClass *setting_class; - gboolean verify_override = verify_secret; - - /* There's only one 'flags' property for WEP keys, so alias all the WEP key - * property names to that flags property. - */ - if ( !g_strcmp0 (secret_name, NM_SETTING_WIRELESS_SECURITY_WEP_KEY0) - || !g_strcmp0 (secret_name, NM_SETTING_WIRELESS_SECURITY_WEP_KEY1) - || !g_strcmp0 (secret_name, NM_SETTING_WIRELESS_SECURITY_WEP_KEY2) - || !g_strcmp0 (secret_name, NM_SETTING_WIRELESS_SECURITY_WEP_KEY3)) { - secret_name = "wep-key"; - verify_override = FALSE; /* Already know it's a secret */ - } - - /* Chain up to superclass with modified key name */ - setting_class = NM_SETTING_CLASS (nm_setting_wireless_security_parent_class); - return setting_class->set_secret_flags (setting, secret_name, verify_override, flags, error); -} - -static void -nm_setting_wireless_security_init (NMSettingWirelessSecurity *setting) -{ -} - -static void -finalize (GObject *object) -{ - NMSettingWirelessSecurity *self = NM_SETTING_WIRELESS_SECURITY (object); - NMSettingWirelessSecurityPrivate *priv = NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (self); - - /* Strings first. g_free() already checks for NULLs so we don't have to */ - - g_free (priv->key_mgmt); - g_free (priv->auth_alg); - g_free (priv->leap_username); - g_free (priv->wep_key0); - g_free (priv->wep_key1); - g_free (priv->wep_key2); - g_free (priv->wep_key3); - g_free (priv->psk); - g_free (priv->leap_password); - - g_slist_free_full (priv->proto, g_free); - g_slist_free_full (priv->pairwise, g_free); - g_slist_free_full (priv->group, g_free); - - G_OBJECT_CLASS (nm_setting_wireless_security_parent_class)->finalize (object); -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSettingWirelessSecurity *setting = NM_SETTING_WIRELESS_SECURITY (object); - NMSettingWirelessSecurityPrivate *priv = NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting); - const char *str; - - switch (prop_id) { - case PROP_KEY_MGMT: - g_free (priv->key_mgmt); - str = g_value_get_string (value); - priv->key_mgmt = str ? g_ascii_strdown (str, -1) : NULL; - break; - case PROP_WEP_TX_KEYIDX: - priv->wep_tx_keyidx = g_value_get_uint (value); - break; - case PROP_AUTH_ALG: - g_free (priv->auth_alg); - str = g_value_get_string (value); - priv->auth_alg = str ? g_ascii_strdown (str, -1) : NULL; - break; - case PROP_PROTO: - g_slist_free_full (priv->proto, g_free); - priv->proto = g_value_dup_boxed (value); - break; - case PROP_PAIRWISE: - g_slist_free_full (priv->pairwise, g_free); - priv->pairwise = g_value_dup_boxed (value); - break; - case PROP_GROUP: - g_slist_free_full (priv->group, g_free); - priv->group = g_value_dup_boxed (value); - break; - case PROP_LEAP_USERNAME: - g_free (priv->leap_username); - priv->leap_username = g_value_dup_string (value); - break; - case PROP_WEP_KEY0: - g_free (priv->wep_key0); - priv->wep_key0 = g_value_dup_string (value); - break; - case PROP_WEP_KEY1: - g_free (priv->wep_key1); - priv->wep_key1 = g_value_dup_string (value); - break; - case PROP_WEP_KEY2: - g_free (priv->wep_key2); - priv->wep_key2 = g_value_dup_string (value); - break; - case PROP_WEP_KEY3: - g_free (priv->wep_key3); - priv->wep_key3 = g_value_dup_string (value); - break; - case PROP_WEP_KEY_FLAGS: - priv->wep_key_flags = g_value_get_uint (value); - break; - case PROP_PSK: - g_free (priv->psk); - priv->psk = g_value_dup_string (value); - break; - case PROP_PSK_FLAGS: - priv->psk_flags = g_value_get_uint (value); - break; - case PROP_LEAP_PASSWORD: - g_free (priv->leap_password); - priv->leap_password = g_value_dup_string (value); - break; - case PROP_LEAP_PASSWORD_FLAGS: - priv->leap_password_flags = g_value_get_uint (value); - break; - case PROP_WEP_KEY_TYPE: - priv->wep_key_type = g_value_get_uint (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSettingWirelessSecurity *setting = NM_SETTING_WIRELESS_SECURITY (object); - NMSettingWirelessSecurityPrivate *priv = NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (setting); - - switch (prop_id) { - case PROP_KEY_MGMT: - g_value_set_string (value, priv->key_mgmt); - break; - case PROP_WEP_TX_KEYIDX: - g_value_set_uint (value, priv->wep_tx_keyidx); - break; - case PROP_AUTH_ALG: - g_value_set_string (value, priv->auth_alg); - break; - case PROP_PROTO: - g_value_set_boxed (value, priv->proto); - break; - case PROP_PAIRWISE: - g_value_set_boxed (value, priv->pairwise); - break; - case PROP_GROUP: - g_value_set_boxed (value, priv->group); - break; - case PROP_LEAP_USERNAME: - g_value_set_string (value, priv->leap_username); - break; - case PROP_WEP_KEY0: - g_value_set_string (value, priv->wep_key0); - break; - case PROP_WEP_KEY1: - g_value_set_string (value, priv->wep_key1); - break; - case PROP_WEP_KEY2: - g_value_set_string (value, priv->wep_key2); - break; - case PROP_WEP_KEY3: - g_value_set_string (value, priv->wep_key3); - break; - case PROP_WEP_KEY_FLAGS: - g_value_set_uint (value, priv->wep_key_flags); - break; - case PROP_PSK: - g_value_set_string (value, priv->psk); - break; - case PROP_PSK_FLAGS: - g_value_set_uint (value, priv->psk_flags); - break; - case PROP_LEAP_PASSWORD: - g_value_set_string (value, priv->leap_password); - break; - case PROP_LEAP_PASSWORD_FLAGS: - g_value_set_uint (value, priv->leap_password_flags); - break; - case PROP_WEP_KEY_TYPE: - g_value_set_uint (value, priv->wep_key_type); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_setting_wireless_security_class_init (NMSettingWirelessSecurityClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingWirelessSecurityPrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->finalize = finalize; - - parent_class->verify = verify; - parent_class->need_secrets = need_secrets; - parent_class->get_secret_flags = get_secret_flags; - parent_class->set_secret_flags = set_secret_flags; - - /* Properties */ - /** - * NMSettingWirelessSecurity:key-mgmt: - * - * Key management used for the connection. One of "none" (WEP), "ieee8021x" - * (Dynamic WEP), "wpa-none" (Ad-Hoc WPA-PSK), "wpa-psk" (infrastructure - * WPA-PSK), or "wpa-eap" (WPA-Enterprise). This property must be set for - * any Wi-Fi connection that uses security. - **/ - g_object_class_install_property - (object_class, PROP_KEY_MGMT, - g_param_spec_string (NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_REQUIRED | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWirelessSecurity:wep-tx-keyidx: - * - * When static WEP is used (ie, key-mgmt = "none") and a non-default WEP key - * index is used by the AP, put that WEP key index here. Valid values are 0 - * (default key) through 3. Note that some consumer access points (like the - * Linksys WRT54G) number the keys 1 - 4. - **/ - g_object_class_install_property - (object_class, PROP_WEP_TX_KEYIDX, - g_param_spec_uint (NM_SETTING_WIRELESS_SECURITY_WEP_TX_KEYIDX, "", "", - 0, 3, 0, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWirelessSecurity:auth-alg: - * - * When WEP is used (ie, key-mgmt = "none" or "ieee8021x") indicate the - * 802.11 authentication algorithm required by the AP here. One of "open" - * for Open System, "shared" for Shared Key, or "leap" for Cisco LEAP. When - * using Cisco LEAP (ie, key-mgmt = "ieee8021x" and auth-alg = "leap") the - * "leap-username" and "leap-password" properties must be specified. - **/ - g_object_class_install_property - (object_class, PROP_AUTH_ALG, - g_param_spec_string (NM_SETTING_WIRELESS_SECURITY_AUTH_ALG, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWirelessSecurity:proto: - * - * List of strings specifying the allowed WPA protocol versions to use. - * Each element may be one "wpa" (allow WPA) or "rsn" (allow WPA2/RSN). If - * not specified, both WPA and RSN connections are allowed. - **/ - g_object_class_install_property - (object_class, PROP_PROTO, - _nm_param_spec_specialized (NM_SETTING_WIRELESS_SECURITY_PROTO, "", "", - DBUS_TYPE_G_LIST_OF_STRING, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWirelessSecurity:pairwise: - * - * A list of pairwise encryption algorithms which prevents connections to - * Wi-Fi networks that do not utilize one of the algorithms in the list. - * For maximum compatibility leave this property empty. Each list element - * may be one of "tkip" or "ccmp". - **/ - g_object_class_install_property - (object_class, PROP_PAIRWISE, - _nm_param_spec_specialized (NM_SETTING_WIRELESS_SECURITY_PAIRWISE, "", "", - DBUS_TYPE_G_LIST_OF_STRING, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWirelessSecurity:group: - * - * A list of group/broadcast encryption algorithms which prevents - * connections to Wi-Fi networks that do not utilize one of the algorithms - * in the list. For maximum compatibility leave this property empty. Each - * list element may be one of "wep40", "wep104", "tkip", or "ccmp". - **/ - g_object_class_install_property - (object_class, PROP_GROUP, - _nm_param_spec_specialized (NM_SETTING_WIRELESS_SECURITY_GROUP, "", "", - DBUS_TYPE_G_LIST_OF_STRING, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWirelessSecurity:leap-username: - * - * The login username for legacy LEAP connections (ie, key-mgmt = - * "ieee8021x" and auth-alg = "leap"). - **/ - g_object_class_install_property - (object_class, PROP_LEAP_USERNAME, - g_param_spec_string (NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWirelessSecurity:wep-key0: - * - * Index 0 WEP key. This is the WEP key used in most networks. See the - * "wep-key-type" property for a description of how this key is interpreted. - **/ - g_object_class_install_property - (object_class, PROP_WEP_KEY0, - g_param_spec_string (NM_SETTING_WIRELESS_SECURITY_WEP_KEY0, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_SECRET | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWirelessSecurity:wep-key1: - * - * Index 1 WEP key. This WEP index is not used by most networks. See the - * "wep-key-type" property for a description of how this key is interpreted. - **/ - g_object_class_install_property - (object_class, PROP_WEP_KEY1, - g_param_spec_string (NM_SETTING_WIRELESS_SECURITY_WEP_KEY1, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_SECRET | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWirelessSecurity:wep-key2: - * - * Index 2 WEP key. This WEP index is not used by most networks. See the - * "wep-key-type" property for a description of how this key is interpreted. - **/ - g_object_class_install_property - (object_class, PROP_WEP_KEY2, - g_param_spec_string (NM_SETTING_WIRELESS_SECURITY_WEP_KEY2, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_SECRET | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWirelessSecurity:wep-key3: - * - * Index 3 WEP key. This WEP index is not used by most networks. See the - * "wep-key-type" property for a description of how this key is interpreted. - **/ - g_object_class_install_property - (object_class, PROP_WEP_KEY3, - g_param_spec_string (NM_SETTING_WIRELESS_SECURITY_WEP_KEY3, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_SECRET | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWirelessSecurity:wep-key-flags: - * - * Flags indicating how to handle the #NMSettingWirelessSecurity:wep-key0, - * #NMSettingWirelessSecurity:wep-key1, #NMSettingWirelessSecurity:wep-key2, - * and #NMSettingWirelessSecurity:wep-key3 properties. - **/ - g_object_class_install_property - (object_class, PROP_WEP_KEY_FLAGS, - g_param_spec_uint (NM_SETTING_WIRELESS_SECURITY_WEP_KEY_FLAGS, "", "", - NM_SETTING_SECRET_FLAG_NONE, - NM_SETTING_SECRET_FLAGS_ALL, - NM_SETTING_SECRET_FLAG_NONE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWirelessSecurity:psk: - * - * Pre-Shared-Key for WPA networks. If the key is 64-characters long, it - * must contain only hexadecimal characters and is interpreted as a - * hexadecimal WPA key. Otherwise, the key must be between 8 and 63 ASCII - * characters (as specified in the 802.11i standard) and is interpreted as a - * WPA passphrase, and is hashed to derive the actual WPA-PSK used when - * connecting to the Wi-Fi network. - **/ - g_object_class_install_property - (object_class, PROP_PSK, - g_param_spec_string (NM_SETTING_WIRELESS_SECURITY_PSK, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_SECRET | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWirelessSecurity:psk-flags: - * - * Flags indicating how to handle the #NMSettingWirelessSecurity:psk - * property. - **/ - g_object_class_install_property - (object_class, PROP_PSK_FLAGS, - g_param_spec_uint (NM_SETTING_WIRELESS_SECURITY_PSK_FLAGS, "", "", - NM_SETTING_SECRET_FLAG_NONE, - NM_SETTING_SECRET_FLAGS_ALL, - NM_SETTING_SECRET_FLAG_NONE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWirelessSecurity:leap-password: - * - * The login password for legacy LEAP connections (ie, key-mgmt = - * "ieee8021x" and auth-alg = "leap"). - **/ - g_object_class_install_property - (object_class, PROP_LEAP_PASSWORD, - g_param_spec_string (NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD, "", "", - NULL, - G_PARAM_READWRITE | - NM_SETTING_PARAM_SECRET | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWirelessSecurity:leap-password-flags: - * - * Flags indicating how to handle the - * #NMSettingWirelessSecurity:leap-password property. - **/ - g_object_class_install_property - (object_class, PROP_LEAP_PASSWORD_FLAGS, - g_param_spec_uint (NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD_FLAGS, "", "", - NM_SETTING_SECRET_FLAG_NONE, - NM_SETTING_SECRET_FLAGS_ALL, - NM_SETTING_SECRET_FLAG_NONE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWirelessSecurity:wep-key-type: - * - * Controls the interpretation of WEP keys. Allowed values are - * %NM_WEP_KEY_TYPE_KEY, in which case the key is either a 10- or - * 26-character hexadecimal string, or a 5- or 13-character ASCII password; - * or %NM_WEP_KEY_TYPE_PASSPHRASE, in which case the passphrase is provided - * as a string and will be hashed using the de-facto MD5 method to derive - * the actual WEP key. - **/ - g_object_class_install_property - (object_class, PROP_WEP_KEY_TYPE, - g_param_spec_uint (NM_SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE, "", "", - NM_WEP_KEY_TYPE_UNKNOWN, - NM_WEP_KEY_TYPE_LAST, - NM_WEP_KEY_TYPE_UNKNOWN, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-util/nm-setting-wireless-security.h b/libnm-util/nm-setting-wireless-security.h deleted file mode 100644 index cbeeb9bfaf..0000000000 --- a/libnm-util/nm-setting-wireless-security.h +++ /dev/null @@ -1,178 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2014 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#ifndef NM_SETTING_WIRELESS_SECURITY_H -#define NM_SETTING_WIRELESS_SECURITY_H - -#include "nm-setting.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SETTING_WIRELESS_SECURITY (nm_setting_wireless_security_get_type ()) -#define NM_SETTING_WIRELESS_SECURITY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_WIRELESS_SECURITY, NMSettingWirelessSecurity)) -#define NM_SETTING_WIRELESS_SECURITY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_WIRELESS_SECURITY, NMSettingWirelessSecurityClass)) -#define NM_IS_SETTING_WIRELESS_SECURITY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_WIRELESS_SECURITY)) -#define NM_IS_SETTING_WIRELESS_SECURITY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_WIRELESS_SECURITY)) -#define NM_SETTING_WIRELESS_SECURITY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_WIRELESS_SECURITY, NMSettingWirelessSecurityClass)) - -#define NM_SETTING_WIRELESS_SECURITY_SETTING_NAME "802-11-wireless-security" - -/** - * NMSettingWirelessSecurityError: - * @NM_SETTING_WIRELESS_SECURITY_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_WIRELESS_SECURITY_ERROR_INVALID_PROPERTY: the property was invalid - * @NM_SETTING_WIRELESS_SECURITY_ERROR_MISSING_PROPERTY: the property was - * missing and is required - * @NM_SETTING_WIRELESS_SECURITY_ERROR_MISSING_802_1X_SETTING: a property contained - * a value that requires the connection to contain a #NMSetting8021x setting - * @NM_SETTING_WIRELESS_SECURITY_ERROR_LEAP_REQUIRES_802_1X: LEAP authentication - * was specified but key management was not set to "8021x" - * @NM_SETTING_WIRELESS_SECURITY_ERROR_LEAP_REQUIRES_USERNAME: LEAP authentication - * was specified but no LEAP username was given - * @NM_SETTING_WIRELESS_SECURITY_ERROR_SHARED_KEY_REQUIRES_WEP: Shared Key - * authentication was specified but the setting did not specify WEP as the - * encryption protocol - */ -typedef enum { - NM_SETTING_WIRELESS_SECURITY_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_SETTING_WIRELESS_SECURITY_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/ - NM_SETTING_WIRELESS_SECURITY_ERROR_MISSING_PROPERTY, /*< nick=MissingProperty >*/ - NM_SETTING_WIRELESS_SECURITY_ERROR_MISSING_802_1X_SETTING, /*< nick=Missing8021xSetting >*/ - NM_SETTING_WIRELESS_SECURITY_ERROR_LEAP_REQUIRES_802_1X, /*< nick=LEAPRequires8021x >*/ - NM_SETTING_WIRELESS_SECURITY_ERROR_LEAP_REQUIRES_USERNAME, /*< nick=LEAPRequiresUsername >*/ - NM_SETTING_WIRELESS_SECURITY_ERROR_SHARED_KEY_REQUIRES_WEP /*< nick=SharedKeyRequiresWEP >*/ -} NMSettingWirelessSecurityError; - -#define NM_SETTING_WIRELESS_SECURITY_ERROR nm_setting_wireless_security_error_quark () -GQuark nm_setting_wireless_security_error_quark (void); - -/** - * NMWepKeyType: - * @NM_WEP_KEY_TYPE_UNKNOWN: unknown WEP key type - * @NM_WEP_KEY_TYPE_KEY: indicates a hexadecimal or ASCII formatted WEP key. - * Hex keys are either 10 or 26 hexadecimal characters (ie "5f782f2f5f" or - * "732f2d712e4a394a375d366931"), while ASCII keys are either 5 or 13 ASCII - * characters (ie "abcde" or "blahblah99$*1"). - * @NM_WEP_KEY_TYPE_PASSPHRASE: indicates a WEP passphrase (ex "I bought a duck - * on my way back from the market 235Q&^%^*%") instead of a hexadecimal or ASCII - * key. Passphrases are between 8 and 64 characters inclusive and are hashed - * the actual WEP key using the MD5 hash algorithm. - * @NM_WEP_KEY_TYPE_LAST: placeholder value for bounds-checking - * - * The #NMWepKeyType values specify how any WEP keys present in the setting - * are interpreted. There are no standards governing how to hash the various WEP - * key/passphrase formats into the actual WEP key. Unfortunately some WEP keys - * can be interpreted in multiple ways, requiring the setting to specify how to - * interpret the any WEP keys. For example, the key "732f2d712e4a394a375d366931" - * is both a valid Hexadecimal WEP key and a WEP passphrase. Further, many - * ASCII keys are also valid WEP passphrases, but since passphrases and ASCII - * keys are hashed differently to determine the actual WEP key the type must be - * specified. - */ -typedef enum { - NM_WEP_KEY_TYPE_UNKNOWN = 0, - NM_WEP_KEY_TYPE_KEY = 1, /* Hex or ASCII */ - NM_WEP_KEY_TYPE_PASSPHRASE = 2, /* 104/128-bit Passphrase */ - - NM_WEP_KEY_TYPE_LAST = NM_WEP_KEY_TYPE_PASSPHRASE -} NMWepKeyType; - -#define NM_SETTING_WIRELESS_SECURITY_KEY_MGMT "key-mgmt" -#define NM_SETTING_WIRELESS_SECURITY_WEP_TX_KEYIDX "wep-tx-keyidx" -#define NM_SETTING_WIRELESS_SECURITY_AUTH_ALG "auth-alg" -#define NM_SETTING_WIRELESS_SECURITY_PROTO "proto" -#define NM_SETTING_WIRELESS_SECURITY_PAIRWISE "pairwise" -#define NM_SETTING_WIRELESS_SECURITY_GROUP "group" -#define NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME "leap-username" -#define NM_SETTING_WIRELESS_SECURITY_WEP_KEY0 "wep-key0" -#define NM_SETTING_WIRELESS_SECURITY_WEP_KEY1 "wep-key1" -#define NM_SETTING_WIRELESS_SECURITY_WEP_KEY2 "wep-key2" -#define NM_SETTING_WIRELESS_SECURITY_WEP_KEY3 "wep-key3" -#define NM_SETTING_WIRELESS_SECURITY_WEP_KEY_FLAGS "wep-key-flags" -#define NM_SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE "wep-key-type" -#define NM_SETTING_WIRELESS_SECURITY_PSK "psk" -#define NM_SETTING_WIRELESS_SECURITY_PSK_FLAGS "psk-flags" -#define NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD "leap-password" -#define NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD_FLAGS "leap-password-flags" - -typedef struct { - NMSetting parent; -} NMSettingWirelessSecurity; - -typedef struct { - NMSettingClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); -} NMSettingWirelessSecurityClass; - -GType nm_setting_wireless_security_get_type (void); - -NMSetting * nm_setting_wireless_security_new (void); - -const char *nm_setting_wireless_security_get_key_mgmt (NMSettingWirelessSecurity *setting); - -guint32 nm_setting_wireless_security_get_num_protos (NMSettingWirelessSecurity *setting); -const char *nm_setting_wireless_security_get_proto (NMSettingWirelessSecurity *setting, guint32 i); -gboolean nm_setting_wireless_security_add_proto (NMSettingWirelessSecurity *setting, const char *proto); -void nm_setting_wireless_security_remove_proto (NMSettingWirelessSecurity *setting, guint32 i); -NM_AVAILABLE_IN_0_9_10 -gboolean nm_setting_wireless_security_remove_proto_by_value (NMSettingWirelessSecurity *setting, const char *proto); -void nm_setting_wireless_security_clear_protos (NMSettingWirelessSecurity *setting); - -guint32 nm_setting_wireless_security_get_num_pairwise (NMSettingWirelessSecurity *setting); -const char *nm_setting_wireless_security_get_pairwise (NMSettingWirelessSecurity *setting, guint32 i); -gboolean nm_setting_wireless_security_add_pairwise (NMSettingWirelessSecurity *setting, const char *pairwise); -void nm_setting_wireless_security_remove_pairwise (NMSettingWirelessSecurity *setting, guint32 i); -NM_AVAILABLE_IN_0_9_10 -gboolean nm_setting_wireless_security_remove_pairwise_by_value (NMSettingWirelessSecurity *setting, const char *pairwise); -void nm_setting_wireless_security_clear_pairwise (NMSettingWirelessSecurity *setting); - -guint32 nm_setting_wireless_security_get_num_groups (NMSettingWirelessSecurity *setting); -const char *nm_setting_wireless_security_get_group (NMSettingWirelessSecurity *setting, guint32 i); -gboolean nm_setting_wireless_security_add_group (NMSettingWirelessSecurity *setting, const char *group); -void nm_setting_wireless_security_remove_group (NMSettingWirelessSecurity *setting, guint32 i); -NM_AVAILABLE_IN_0_9_10 -gboolean nm_setting_wireless_security_remove_group_by_value (NMSettingWirelessSecurity *setting, const char *group); -void nm_setting_wireless_security_clear_groups (NMSettingWirelessSecurity *setting); - -const char *nm_setting_wireless_security_get_psk (NMSettingWirelessSecurity *setting); -NMSettingSecretFlags nm_setting_wireless_security_get_psk_flags (NMSettingWirelessSecurity *setting); - -const char *nm_setting_wireless_security_get_leap_username (NMSettingWirelessSecurity *setting); -const char *nm_setting_wireless_security_get_leap_password (NMSettingWirelessSecurity *setting); -NMSettingSecretFlags nm_setting_wireless_security_get_leap_password_flags (NMSettingWirelessSecurity *setting); - -const char *nm_setting_wireless_security_get_wep_key (NMSettingWirelessSecurity *setting, guint32 idx); -void nm_setting_wireless_security_set_wep_key (NMSettingWirelessSecurity *setting, guint32 idx, const char *key); -guint32 nm_setting_wireless_security_get_wep_tx_keyidx (NMSettingWirelessSecurity *setting); -const char *nm_setting_wireless_security_get_auth_alg (NMSettingWirelessSecurity *setting); - -NMSettingSecretFlags nm_setting_wireless_security_get_wep_key_flags (NMSettingWirelessSecurity *setting); -NMWepKeyType nm_setting_wireless_security_get_wep_key_type (NMSettingWirelessSecurity *setting); - -G_END_DECLS - -#endif /* NM_SETTING_WIRELESS_SECURITY_H */ diff --git a/libnm-util/nm-setting-wireless.c b/libnm-util/nm-setting-wireless.c deleted file mode 100644 index d3040811c8..0000000000 --- a/libnm-util/nm-setting-wireless.c +++ /dev/null @@ -1,1286 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2014 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <net/ethernet.h> -#include <netinet/ether.h> -#include <dbus/dbus-glib.h> - -#include "NetworkManager.h" -#include "nm-setting-wireless.h" -#include "nm-param-spec-specialized.h" -#include "nm-utils.h" -#include "nm-dbus-glib-types.h" -#include "nm-utils-private.h" -#include "nm-setting-private.h" - -/** - * SECTION:nm-setting-wireless - * @short_description: Describes connection properties for 802.11 Wi-Fi networks - * @include: nm-setting-wireless.h - * - * The #NMSettingWireless object is a #NMSetting subclass that describes properties - * necessary for connection to 802.11 Wi-Fi networks. - **/ - -/** - * nm_setting_wireless_error_quark: - * - * Registers an error quark for #NMSettingWireless if necessary. - * - * Returns: the error quark used for #NMSettingWireless errors. - **/ -GQuark -nm_setting_wireless_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-wireless-error-quark"); - return quark; -} - -G_DEFINE_TYPE_WITH_CODE (NMSettingWireless, nm_setting_wireless, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_WIRELESS_SETTING_NAME, - g_define_type_id, - 1, - NM_SETTING_WIRELESS_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_WIRELESS) - -#define NM_SETTING_WIRELESS_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_WIRELESS, NMSettingWirelessPrivate)) - -typedef struct { - GByteArray *ssid; - char *mode; - char *band; - guint32 channel; - GByteArray *bssid; - guint32 rate; - guint32 tx_power; - GByteArray *device_mac_address; - GByteArray *cloned_mac_address; - GSList *mac_address_blacklist; - guint32 mtu; - GSList *seen_bssids; - char *security; - gboolean hidden; - guint32 powersave; -} NMSettingWirelessPrivate; - -enum { - PROP_0, - PROP_SSID, - PROP_MODE, - PROP_BAND, - PROP_CHANNEL, - PROP_BSSID, - PROP_RATE, - PROP_TX_POWER, - PROP_MAC_ADDRESS, - PROP_CLONED_MAC_ADDRESS, - PROP_MAC_ADDRESS_BLACKLIST, - PROP_MTU, - PROP_SEEN_BSSIDS, - PROP_SEC, - PROP_HIDDEN, - PROP_POWERSAVE, - - LAST_PROP -}; - -static gboolean -match_cipher (const char *cipher, - const char *expected, - guint32 wpa_flags, - guint32 rsn_flags, - guint32 flag) -{ - if (strcmp (cipher, expected) != 0) - return FALSE; - - if (!(wpa_flags & flag) && !(rsn_flags & flag)) - return FALSE; - - return TRUE; -} - -/** - * nm_setting_wireless_ap_security_compatible: - * @s_wireless: a #NMSettingWireless - * @s_wireless_sec: a #NMSettingWirelessSecurity or %NULL - * @ap_flags: the %NM80211ApFlags of the given access point - * @ap_wpa: the %NM80211ApSecurityFlags of the given access point's WPA - * capabilities - * @ap_rsn: the %NM80211ApSecurityFlags of the given access point's WPA2/RSN - * capabilities - * @ap_mode: the 802.11 mode of the AP, either Ad-Hoc or Infrastructure - * - * Given a #NMSettingWireless and an optional #NMSettingWirelessSecurity, - * determine if the configuration given by the settings is compatible with - * the security of an access point using that access point's capability flags - * and mode. Useful for clients that wish to filter a set of connections - * against a set of access points and determine which connections are - * compatible with which access points. - * - * Returns: %TRUE if the given settings are compatible with the access point's - * security flags and mode, %FALSE if they are not. - */ -gboolean -nm_setting_wireless_ap_security_compatible (NMSettingWireless *s_wireless, - NMSettingWirelessSecurity *s_wireless_sec, - NM80211ApFlags ap_flags, - NM80211ApSecurityFlags ap_wpa, - NM80211ApSecurityFlags ap_rsn, - NM80211Mode ap_mode) -{ - const char *key_mgmt = NULL, *cipher; - guint32 num, i; - gboolean found = FALSE; - - g_return_val_if_fail (NM_IS_SETTING_WIRELESS (s_wireless), FALSE); - - if (!s_wireless_sec) { - if ( (ap_flags & NM_802_11_AP_FLAGS_PRIVACY) - || (ap_wpa != NM_802_11_AP_SEC_NONE) - || (ap_rsn != NM_802_11_AP_SEC_NONE)) - return FALSE; - return TRUE; - } - - key_mgmt = nm_setting_wireless_security_get_key_mgmt (s_wireless_sec); - if (!key_mgmt) - return FALSE; - - /* Static WEP */ - if (!strcmp (key_mgmt, "none")) { - if ( !(ap_flags & NM_802_11_AP_FLAGS_PRIVACY) - || (ap_wpa != NM_802_11_AP_SEC_NONE) - || (ap_rsn != NM_802_11_AP_SEC_NONE)) - return FALSE; - return TRUE; - } - - /* Adhoc WPA */ - if (!strcmp (key_mgmt, "wpa-none")) { - if (ap_mode != NM_802_11_MODE_ADHOC) - return FALSE; - /* FIXME: validate ciphers if they're in the beacon */ - return TRUE; - } - - /* Adhoc WPA2 (ie, RSN IBSS) */ - if (ap_mode == NM_802_11_MODE_ADHOC) { - if (strcmp (key_mgmt, "wpa-psk")) - return FALSE; - - /* Ensure the AP has RSN PSK capability */ - if (!(ap_rsn & NM_802_11_AP_SEC_KEY_MGMT_PSK)) - return FALSE; - - /* Fall through and check ciphers in generic WPA-PSK code */ - } - - /* Dynamic WEP or LEAP */ - if (!strcmp (key_mgmt, "ieee8021x")) { - if (!(ap_flags & NM_802_11_AP_FLAGS_PRIVACY)) - return FALSE; - - /* If the AP is advertising a WPA IE, make sure it supports WEP ciphers */ - if (ap_wpa != NM_802_11_AP_SEC_NONE) { - if (!(ap_wpa & NM_802_11_AP_SEC_KEY_MGMT_802_1X)) - return FALSE; - - /* quick check; can't use AP if it doesn't support at least one - * WEP cipher in both pairwise and group suites. - */ - if ( !(ap_wpa & (NM_802_11_AP_SEC_PAIR_WEP40 | NM_802_11_AP_SEC_PAIR_WEP104)) - || !(ap_wpa & (NM_802_11_AP_SEC_GROUP_WEP40 | NM_802_11_AP_SEC_GROUP_WEP104))) - return FALSE; - - /* Match at least one pairwise cipher with AP's capability if the - * wireless-security setting explicitly lists pairwise ciphers - */ - num = nm_setting_wireless_security_get_num_pairwise (s_wireless_sec); - for (i = 0, found = FALSE; i < num; i++) { - cipher = nm_setting_wireless_security_get_pairwise (s_wireless_sec, i); - if ((found = match_cipher (cipher, "wep40", ap_wpa, ap_wpa, NM_802_11_AP_SEC_PAIR_WEP40))) - break; - if ((found = match_cipher (cipher, "wep104", ap_wpa, ap_wpa, NM_802_11_AP_SEC_PAIR_WEP104))) - break; - } - if (!found && num) - return FALSE; - - /* Match at least one group cipher with AP's capability if the - * wireless-security setting explicitly lists group ciphers - */ - num = nm_setting_wireless_security_get_num_groups (s_wireless_sec); - for (i = 0, found = FALSE; i < num; i++) { - cipher = nm_setting_wireless_security_get_group (s_wireless_sec, i); - if ((found = match_cipher (cipher, "wep40", ap_wpa, ap_wpa, NM_802_11_AP_SEC_GROUP_WEP40))) - break; - if ((found = match_cipher (cipher, "wep104", ap_wpa, ap_wpa, NM_802_11_AP_SEC_GROUP_WEP104))) - break; - } - if (!found && num) - return FALSE; - } - return TRUE; - } - - /* WPA[2]-PSK and WPA[2] Enterprise */ - if ( !strcmp (key_mgmt, "wpa-psk") - || !strcmp (key_mgmt, "wpa-eap")) { - - if (!strcmp (key_mgmt, "wpa-psk")) { - if ( !(ap_wpa & NM_802_11_AP_SEC_KEY_MGMT_PSK) - && !(ap_rsn & NM_802_11_AP_SEC_KEY_MGMT_PSK)) - return FALSE; - } else if (!strcmp (key_mgmt, "wpa-eap")) { - if ( !(ap_wpa & NM_802_11_AP_SEC_KEY_MGMT_802_1X) - && !(ap_rsn & NM_802_11_AP_SEC_KEY_MGMT_802_1X)) - return FALSE; - } - - // FIXME: should handle WPA and RSN separately here to ensure that - // if the Connection only uses WPA we don't match a cipher against - // the AP's RSN IE instead - - /* Match at least one pairwise cipher with AP's capability if the - * wireless-security setting explicitly lists pairwise ciphers - */ - num = nm_setting_wireless_security_get_num_pairwise (s_wireless_sec); - for (i = 0, found = FALSE; i < num; i++) { - cipher = nm_setting_wireless_security_get_pairwise (s_wireless_sec, i); - if ((found = match_cipher (cipher, "tkip", ap_wpa, ap_rsn, NM_802_11_AP_SEC_PAIR_TKIP))) - break; - if ((found = match_cipher (cipher, "ccmp", ap_wpa, ap_rsn, NM_802_11_AP_SEC_PAIR_CCMP))) - break; - } - if (!found && num) - return FALSE; - - /* Match at least one group cipher with AP's capability if the - * wireless-security setting explicitly lists group ciphers - */ - num = nm_setting_wireless_security_get_num_groups (s_wireless_sec); - for (i = 0, found = FALSE; i < num; i++) { - cipher = nm_setting_wireless_security_get_group (s_wireless_sec, i); - - if ((found = match_cipher (cipher, "wep40", ap_wpa, ap_rsn, NM_802_11_AP_SEC_GROUP_WEP40))) - break; - if ((found = match_cipher (cipher, "wep104", ap_wpa, ap_rsn, NM_802_11_AP_SEC_GROUP_WEP104))) - break; - if ((found = match_cipher (cipher, "tkip", ap_wpa, ap_rsn, NM_802_11_AP_SEC_GROUP_TKIP))) - break; - if ((found = match_cipher (cipher, "ccmp", ap_wpa, ap_rsn, NM_802_11_AP_SEC_GROUP_CCMP))) - break; - } - if (!found && num) - return FALSE; - - return TRUE; - } - - return FALSE; -} - -/** - * nm_setting_wireless_new: - * - * Creates a new #NMSettingWireless object with default values. - * - * Returns: (transfer full): the new empty #NMSettingWireless object - **/ -NMSetting * -nm_setting_wireless_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_WIRELESS, NULL); -} - -/** - * nm_setting_wireless_get_ssid: - * @setting: the #NMSettingWireless - * - * Returns: the #NMSettingWireless:ssid property of the setting - **/ -const GByteArray * -nm_setting_wireless_get_ssid (NMSettingWireless *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), NULL); - - return NM_SETTING_WIRELESS_GET_PRIVATE (setting)->ssid; -} - -/** - * nm_setting_wireless_get_mode: - * @setting: the #NMSettingWireless - * - * Returns: the #NMSettingWireless:mode property of the setting - **/ -const char * -nm_setting_wireless_get_mode (NMSettingWireless *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), NULL); - - return NM_SETTING_WIRELESS_GET_PRIVATE (setting)->mode; -} - -/** - * nm_setting_wireless_get_band: - * @setting: the #NMSettingWireless - * - * Returns: the #NMSettingWireless:band property of the setting - **/ -const char * -nm_setting_wireless_get_band (NMSettingWireless *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), NULL); - - return NM_SETTING_WIRELESS_GET_PRIVATE (setting)->band; -} - -/** - * nm_setting_wireless_get_channel: - * @setting: the #NMSettingWireless - * - * Returns: the #NMSettingWireless:channel property of the setting - **/ -guint32 -nm_setting_wireless_get_channel (NMSettingWireless *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), 0); - - return NM_SETTING_WIRELESS_GET_PRIVATE (setting)->channel; -} - -/** - * nm_setting_wireless_get_bssid: - * @setting: the #NMSettingWireless - * - * Returns: the #NMSettingWireless:bssid property of the setting - **/ -const GByteArray * -nm_setting_wireless_get_bssid (NMSettingWireless *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), NULL); - - return NM_SETTING_WIRELESS_GET_PRIVATE (setting)->bssid; -} - -/** - * nm_setting_wireless_get_rate: - * @setting: the #NMSettingWireless - * - * Returns: the #NMSettingWireless:rate property of the setting - **/ -guint32 -nm_setting_wireless_get_rate (NMSettingWireless *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), 0); - - return NM_SETTING_WIRELESS_GET_PRIVATE (setting)->rate; -} - -/** - * nm_setting_wireless_get_tx_power: - * @setting: the #NMSettingWireless - * - * Returns: the #NMSettingWireless:tx-power property of the setting - **/ -guint32 -nm_setting_wireless_get_tx_power (NMSettingWireless *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), 0); - - return NM_SETTING_WIRELESS_GET_PRIVATE (setting)->tx_power; -} - -/** - * nm_setting_wireless_get_mac_address: - * @setting: the #NMSettingWireless - * - * Returns: the #NMSettingWireless:mac-address property of the setting - **/ -const GByteArray * -nm_setting_wireless_get_mac_address (NMSettingWireless *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), NULL); - - return NM_SETTING_WIRELESS_GET_PRIVATE (setting)->device_mac_address; -} - -/** - * nm_setting_wireless_get_cloned_mac_address: - * @setting: the #NMSettingWireless - * - * Returns: the #NMSettingWireless:cloned-mac-address property of the setting - **/ -const GByteArray * -nm_setting_wireless_get_cloned_mac_address (NMSettingWireless *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), NULL); - - return NM_SETTING_WIRELESS_GET_PRIVATE (setting)->cloned_mac_address; -} - -/** - * nm_setting_wireless_get_mac_address_blacklist: - * @setting: the #NMSettingWireless - * - * Returns: (element-type GLib.ByteArray): the - * #NMSettingWireless:mac-address-blacklist property of the setting - **/ -const GSList * -nm_setting_wireless_get_mac_address_blacklist (NMSettingWireless *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), NULL); - - return NM_SETTING_WIRELESS_GET_PRIVATE (setting)->mac_address_blacklist; -} - -/** - * nm_setting_wireless_get_num_mac_blacklist_items: - * @setting: the #NMSettingWireless - * - * Returns: the number of blacklisted MAC addresses - * - * Since: 0.9.10 - **/ -guint32 -nm_setting_wireless_get_num_mac_blacklist_items (NMSettingWireless *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), 0); - - return g_slist_length (NM_SETTING_WIRELESS_GET_PRIVATE (setting)->mac_address_blacklist); -} - -/** - * nm_setting_wireless_get_mac_blacklist_item: - * @setting: the #NMSettingWireless - * @idx: the zero-based index of the MAC address entry - * - * Returns: the blacklisted MAC address string (hex-digits-and-colons notation) - * at index @idx - * - * Since: 0.9.10 - **/ -const char * -nm_setting_wireless_get_mac_blacklist_item (NMSettingWireless *setting, guint32 idx) -{ - NMSettingWirelessPrivate *priv; - - g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), NULL); - - priv = NM_SETTING_WIRELESS_GET_PRIVATE (setting); - g_return_val_if_fail (idx <= g_slist_length (priv->mac_address_blacklist), NULL); - - return (const char *) g_slist_nth_data (priv->mac_address_blacklist, idx); -} - -/** - * nm_setting_wireless_add_mac_blacklist_item: - * @setting: the #NMSettingWireless - * @mac: the MAC address string (hex-digits-and-colons notation) to blacklist - * - * Adds a new MAC address to the #NMSettingWireless:mac-address-blacklist property. - * - * Returns: %TRUE if the MAC address was added; %FALSE if the MAC address - * is invalid or was already present - * - * Since: 0.9.10 - **/ -gboolean -nm_setting_wireless_add_mac_blacklist_item (NMSettingWireless *setting, const char *mac) -{ - NMSettingWirelessPrivate *priv; - GSList *iter; - guint8 buf[32]; - - g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), FALSE); - g_return_val_if_fail (mac != NULL, FALSE); - - if (!nm_utils_hwaddr_aton (mac, ARPHRD_ETHER, buf)) - return FALSE; - - priv = NM_SETTING_WIRELESS_GET_PRIVATE (setting); - for (iter = priv->mac_address_blacklist; iter; iter = g_slist_next (iter)) { - if (!strcasecmp (mac, (char *) iter->data)) - return FALSE; - } - - priv->mac_address_blacklist = g_slist_append (priv->mac_address_blacklist, - g_ascii_strup (mac, -1)); - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRELESS_MAC_ADDRESS_BLACKLIST); - return TRUE; -} - -/** - * nm_setting_wireless_remove_mac_blacklist_item: - * @setting: the #NMSettingWireless - * @idx: index number of the MAC address - * - * Removes the MAC address at index @idx from the blacklist. - * - * Since: 0.9.10 - **/ -void -nm_setting_wireless_remove_mac_blacklist_item (NMSettingWireless *setting, guint32 idx) -{ - NMSettingWirelessPrivate *priv; - GSList *elt; - - g_return_if_fail (NM_IS_SETTING_WIRELESS (setting)); - - priv = NM_SETTING_WIRELESS_GET_PRIVATE (setting); - elt = g_slist_nth (priv->mac_address_blacklist, idx); - g_return_if_fail (elt != NULL); - - g_free (elt->data); - priv->mac_address_blacklist = g_slist_delete_link (priv->mac_address_blacklist, elt); - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRELESS_MAC_ADDRESS_BLACKLIST); -} - -/** - * nm_setting_wireless_remove_mac_blacklist_item_by_value: - * @setting: the #NMSettingWireless - * @mac: the MAC address string (hex-digits-and-colons notation) to remove from - * the blacklist - * - * Removes the MAC address @mac from the blacklist. - * - * Returns: %TRUE if the MAC address was found and removed; %FALSE if it was not. - * - * Since: 0.9.10 - **/ -gboolean -nm_setting_wireless_remove_mac_blacklist_item_by_value (NMSettingWireless *setting, const char *mac) -{ - NMSettingWirelessPrivate *priv; - GSList *iter; - guint8 buf[32]; - - g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), FALSE); - g_return_val_if_fail (mac != NULL, FALSE); - - if (!nm_utils_hwaddr_aton (mac, ARPHRD_ETHER, buf)) - return FALSE; - - priv = NM_SETTING_WIRELESS_GET_PRIVATE (setting); - for (iter = priv->mac_address_blacklist; iter; iter = g_slist_next (iter)) { - if (!strcasecmp (mac, (char *) iter->data)) { - priv->mac_address_blacklist = g_slist_delete_link (priv->mac_address_blacklist, iter); - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRELESS_MAC_ADDRESS_BLACKLIST); - return TRUE; - } - } - return FALSE; -} - -/** - * nm_setting_wireless_clear_mac_blacklist_items: - * @setting: the #NMSettingWireless - * - * Removes all blacklisted MAC addresses. - * - * Since: 0.9.10 - **/ -void -nm_setting_wireless_clear_mac_blacklist_items (NMSettingWireless *setting) -{ - g_return_if_fail (NM_IS_SETTING_WIRELESS (setting)); - - g_slist_free_full (NM_SETTING_WIRELESS_GET_PRIVATE (setting)->mac_address_blacklist, g_free); - NM_SETTING_WIRELESS_GET_PRIVATE (setting)->mac_address_blacklist = NULL; - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRELESS_MAC_ADDRESS_BLACKLIST); -} - -/** - * nm_setting_wireless_get_mtu: - * @setting: the #NMSettingWireless - * - * Returns: the #NMSettingWireless:mtu property of the setting - **/ -guint32 -nm_setting_wireless_get_mtu (NMSettingWireless *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), 0); - - return NM_SETTING_WIRELESS_GET_PRIVATE (setting)->mtu; -} - -/** - * nm_setting_wireless_get_security: - * @setting: the #NMSettingWireless - * - * Returns: the #NMSettingWireless:security property of the setting - * - * Deprecated: 0.9.10: No longer used. Security rescrictions are recognized by - * the presence of NM_SETTING_WIRELESS_SECURITY_SETTING_NAME in the connection. - **/ -const char * -nm_setting_wireless_get_security (NMSettingWireless *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), NULL); - - return NM_SETTING_WIRELESS_GET_PRIVATE (setting)->security; -} - -/** - * nm_setting_wireless_get_hidden: - * @setting: the #NMSettingWireless - * - * Returns: the #NMSettingWireless:hidden property of the setting - **/ -gboolean -nm_setting_wireless_get_hidden (NMSettingWireless *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), FALSE); - - return NM_SETTING_WIRELESS_GET_PRIVATE (setting)->hidden; -} - -/** - * nm_setting_wireless_get_powersave: - * @setting: the #NMSettingWireless - * - * Returns: the #NMSettingWireless:powersave property of the setting - * - * Since: 1.2 - **/ -guint32 -nm_setting_wireless_get_powersave (NMSettingWireless *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), 0); - - return NM_SETTING_WIRELESS_GET_PRIVATE (setting)->powersave; -} - -/** - * nm_setting_wireless_add_seen_bssid: - * @setting: the #NMSettingWireless - * @bssid: the new BSSID to add to the list - * - * Adds a new Wi-Fi AP's BSSID to the previously seen BSSID list of the setting. - * NetworkManager now tracks previously seen BSSIDs internally so this function - * no longer has much use. Actually, changes you make using this function will - * not be preserved. - * - * Returns: %TRUE if @bssid was already known, %FALSE if not - **/ -gboolean -nm_setting_wireless_add_seen_bssid (NMSettingWireless *setting, - const char *bssid) -{ - NMSettingWirelessPrivate *priv; - char *lower_bssid; - GSList *iter; - gboolean found = FALSE; - - g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), FALSE); - g_return_val_if_fail (bssid != NULL, FALSE); - - lower_bssid = g_ascii_strdown (bssid, -1); - if (!lower_bssid) - return FALSE; - - priv = NM_SETTING_WIRELESS_GET_PRIVATE (setting); - - for (iter = priv->seen_bssids; iter; iter = iter->next) { - if (!strcmp ((char *) iter->data, lower_bssid)) { - found = TRUE; - break; - } - } - - if (!found) { - priv->seen_bssids = g_slist_prepend (priv->seen_bssids, lower_bssid); - g_object_notify (G_OBJECT (setting), NM_SETTING_WIRELESS_SEEN_BSSIDS); - } else - g_free (lower_bssid); - - return !found; -} - -/** - * nm_setting_wireless_get_num_seen_bssids: - * @setting: the #NMSettingWireless - * - * Returns: the number of BSSIDs in the previously seen BSSID list - **/ -guint32 -nm_setting_wireless_get_num_seen_bssids (NMSettingWireless *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), 0); - - return g_slist_length (NM_SETTING_WIRELESS_GET_PRIVATE (setting)->seen_bssids); -} - -/** - * nm_setting_wireless_get_seen_bssid: - * @setting: the #NMSettingWireless - * @i: index of a BSSID in the previously seen BSSID list - * - * Returns: the BSSID at index @i - **/ -const char * -nm_setting_wireless_get_seen_bssid (NMSettingWireless *setting, - guint32 i) -{ - g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), NULL); - - return (const char *) g_slist_nth_data (NM_SETTING_WIRELESS_GET_PRIVATE (setting)->seen_bssids, i); -} - -static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - NMSettingWirelessPrivate *priv = NM_SETTING_WIRELESS_GET_PRIVATE (setting); - const char *valid_modes[] = { NM_SETTING_WIRELESS_MODE_INFRA, NM_SETTING_WIRELESS_MODE_ADHOC, NM_SETTING_WIRELESS_MODE_AP, NULL }; - const char *valid_bands[] = { "a", "bg", NULL }; - GSList *iter; - - if (!priv->ssid) { - g_set_error_literal (error, - NM_SETTING_WIRELESS_ERROR, - NM_SETTING_WIRELESS_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SETTING_NAME, NM_SETTING_WIRELESS_SSID); - return FALSE; - } - - if (!priv->ssid->len || priv->ssid->len > 32) { - g_set_error_literal (error, - NM_SETTING_WIRELESS_ERROR, - NM_SETTING_WIRELESS_ERROR_INVALID_PROPERTY, - _("SSID length is out of range <1-32> bytes")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SETTING_NAME, NM_SETTING_WIRELESS_SSID); - return FALSE; - } - - if (priv->mode && !g_strv_contains (valid_modes, priv->mode)) { - g_set_error (error, - NM_SETTING_WIRELESS_ERROR, - NM_SETTING_WIRELESS_ERROR_INVALID_PROPERTY, - _("'%s' is not a valid Wi-Fi mode"), - priv->mode); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SETTING_NAME, NM_SETTING_WIRELESS_MODE); - return FALSE; - } - - if (priv->band && !g_strv_contains (valid_bands, priv->band)) { - g_set_error (error, - NM_SETTING_WIRELESS_ERROR, - NM_SETTING_WIRELESS_ERROR_INVALID_PROPERTY, - _("'%s' is not a valid band"), - priv->band); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SETTING_NAME, NM_SETTING_WIRELESS_BAND); - return FALSE; - } - - if (priv->channel && !priv->band) { - g_set_error (error, - NM_SETTING_WIRELESS_ERROR, - NM_SETTING_WIRELESS_ERROR_CHANNEL_REQUIRES_BAND, - _("requires setting '%s' property"), - NM_SETTING_WIRELESS_BAND); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SETTING_NAME, NM_SETTING_WIRELESS_CHANNEL); - return FALSE; - } - - if (priv->channel) { - if (!nm_utils_wifi_is_channel_valid (priv->channel, priv->band)) { - g_set_error (error, - NM_SETTING_WIRELESS_ERROR, - NM_SETTING_WIRELESS_ERROR_INVALID_PROPERTY, - _("'%d' is not a valid channel"), - priv->channel); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SETTING_NAME, NM_SETTING_WIRELESS_CHANNEL); - return FALSE; - } - } - - if (priv->bssid && priv->bssid->len != ETH_ALEN) { - g_set_error_literal (error, - NM_SETTING_WIRELESS_ERROR, - NM_SETTING_WIRELESS_ERROR_INVALID_PROPERTY, - _("property is invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SETTING_NAME, NM_SETTING_WIRELESS_BSSID); - return FALSE; - } - - if (priv->device_mac_address && priv->device_mac_address->len != ETH_ALEN) { - g_set_error_literal (error, - NM_SETTING_WIRELESS_ERROR, - NM_SETTING_WIRELESS_ERROR_INVALID_PROPERTY, - _("property is invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SETTING_NAME, NM_SETTING_WIRELESS_MAC_ADDRESS); - return FALSE; - } - - if (priv->cloned_mac_address && priv->cloned_mac_address->len != ETH_ALEN) { - g_set_error_literal (error, - NM_SETTING_WIRELESS_ERROR, - NM_SETTING_WIRELESS_ERROR_INVALID_PROPERTY, - _("property is invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SETTING_NAME, NM_SETTING_WIRELESS_CLONED_MAC_ADDRESS); - return FALSE; - } - - for (iter = priv->mac_address_blacklist; iter; iter = iter->next) { - struct ether_addr addr; - - if (!ether_aton_r (iter->data, &addr)) { - g_set_error (error, - NM_SETTING_WIRELESS_ERROR, - NM_SETTING_WIRELESS_ERROR_INVALID_PROPERTY, - _("'%s' is not a valid MAC address"), - (const char *) iter->data); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SETTING_NAME, NM_SETTING_WIRELESS_MAC_ADDRESS_BLACKLIST); - return FALSE; - } - } - - for (iter = priv->seen_bssids; iter; iter = iter->next) { - struct ether_addr addr; - - if (!ether_aton_r (iter->data, &addr)) { - g_set_error (error, - NM_SETTING_WIRELESS_ERROR, - NM_SETTING_WIRELESS_ERROR_INVALID_PROPERTY, - _("'%s' is not a valid MAC address"), - (const char *) iter->data); - g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SETTING_NAME, NM_SETTING_WIRELESS_SEEN_BSSIDS); - return FALSE; - } - } - - return TRUE; -} - -static void -nm_setting_wireless_init (NMSettingWireless *setting) -{ -} - -static void -finalize (GObject *object) -{ - NMSettingWirelessPrivate *priv = NM_SETTING_WIRELESS_GET_PRIVATE (object); - - g_free (priv->mode); - g_free (priv->band); - g_free (priv->security); - - if (priv->ssid) - g_byte_array_free (priv->ssid, TRUE); - if (priv->bssid) - g_byte_array_free (priv->bssid, TRUE); - if (priv->device_mac_address) - g_byte_array_free (priv->device_mac_address, TRUE); - if (priv->cloned_mac_address) - g_byte_array_free (priv->cloned_mac_address, TRUE); - g_slist_free_full (priv->mac_address_blacklist, g_free); - g_slist_free_full (priv->seen_bssids, g_free); - - G_OBJECT_CLASS (nm_setting_wireless_parent_class)->finalize (object); -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSettingWirelessPrivate *priv = NM_SETTING_WIRELESS_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_SSID: - if (priv->ssid) - g_byte_array_free (priv->ssid, TRUE); - priv->ssid = g_value_dup_boxed (value); - break; - case PROP_MODE: - g_free (priv->mode); - priv->mode = g_value_dup_string (value); - break; - case PROP_BAND: - g_free (priv->band); - priv->band = g_value_dup_string (value); - break; - case PROP_CHANNEL: - priv->channel = g_value_get_uint (value); - break; - case PROP_BSSID: - if (priv->bssid) - g_byte_array_free (priv->bssid, TRUE); - priv->bssid = g_value_dup_boxed (value); - break; - case PROP_RATE: - priv->rate = g_value_get_uint (value); - break; - case PROP_TX_POWER: - priv->tx_power = g_value_get_uint (value); - break; - case PROP_MAC_ADDRESS: - if (priv->device_mac_address) - g_byte_array_free (priv->device_mac_address, TRUE); - priv->device_mac_address = g_value_dup_boxed (value); - break; - case PROP_CLONED_MAC_ADDRESS: - if (priv->cloned_mac_address) - g_byte_array_free (priv->cloned_mac_address, TRUE); - priv->cloned_mac_address = g_value_dup_boxed (value); - break; - case PROP_MAC_ADDRESS_BLACKLIST: - g_slist_free_full (priv->mac_address_blacklist, g_free); - priv->mac_address_blacklist = g_value_dup_boxed (value); - break; - case PROP_MTU: - priv->mtu = g_value_get_uint (value); - break; - case PROP_SEEN_BSSIDS: - g_slist_free_full (priv->seen_bssids, g_free); - priv->seen_bssids = g_value_dup_boxed (value); - break; - case PROP_SEC: - g_free (priv->security); - priv->security = g_value_dup_string (value); - break; - case PROP_HIDDEN: - priv->hidden = g_value_get_boolean (value); - break; - case PROP_POWERSAVE: - priv->powersave = g_value_get_uint (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSettingWireless *setting = NM_SETTING_WIRELESS (object); - - switch (prop_id) { - case PROP_SSID: - g_value_set_boxed (value, nm_setting_wireless_get_ssid (setting)); - break; - case PROP_MODE: - g_value_set_string (value, nm_setting_wireless_get_mode (setting)); - break; - case PROP_BAND: - g_value_set_string (value, nm_setting_wireless_get_band (setting)); - break; - case PROP_CHANNEL: - g_value_set_uint (value, nm_setting_wireless_get_channel (setting)); - break; - case PROP_BSSID: - g_value_set_boxed (value, nm_setting_wireless_get_bssid (setting)); - break; - case PROP_RATE: - g_value_set_uint (value, nm_setting_wireless_get_rate (setting)); - break; - case PROP_TX_POWER: - g_value_set_uint (value, nm_setting_wireless_get_tx_power (setting)); - break; - case PROP_MAC_ADDRESS: - g_value_set_boxed (value, nm_setting_wireless_get_mac_address (setting)); - break; - case PROP_CLONED_MAC_ADDRESS: - g_value_set_boxed (value, nm_setting_wireless_get_cloned_mac_address (setting)); - break; - case PROP_MAC_ADDRESS_BLACKLIST: - g_value_set_boxed (value, nm_setting_wireless_get_mac_address_blacklist (setting)); - break; - case PROP_MTU: - g_value_set_uint (value, nm_setting_wireless_get_mtu (setting)); - break; - case PROP_SEEN_BSSIDS: - g_value_set_boxed (value, NM_SETTING_WIRELESS_GET_PRIVATE (setting)->seen_bssids); - break; - case PROP_SEC: - g_value_set_string (value, NM_SETTING_WIRELESS_GET_PRIVATE (setting)->security); - break; - case PROP_HIDDEN: - g_value_set_boolean (value, nm_setting_wireless_get_hidden (setting)); - break; - case PROP_POWERSAVE: - g_value_set_uint (value, nm_setting_wireless_get_powersave (setting)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_setting_wireless_class_init (NMSettingWirelessClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingWirelessPrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->finalize = finalize; - parent_class->verify = verify; - - /* Properties */ - /** - * NMSettingWireless:ssid: - * - * SSID of the Wi-Fi network. Must be specified. - **/ - g_object_class_install_property - (object_class, PROP_SSID, - _nm_param_spec_specialized (NM_SETTING_WIRELESS_SSID, "", "", - DBUS_TYPE_G_UCHAR_ARRAY, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWireless:mode: - * - * Wi-Fi network mode; one of "infrastructure", "adhoc" or "ap". If blank, - * infrastructure is assumed. - **/ - g_object_class_install_property - (object_class, PROP_MODE, - g_param_spec_string (NM_SETTING_WIRELESS_MODE, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWireless:band: - * - * 802.11 frequency band of the network. One of "a" for 5GHz 802.11a or - * "bg" for 2.4GHz 802.11. This will lock associations to the Wi-Fi network - * to the specific band, i.e. if "a" is specified, the device will not - * associate with the same network in the 2.4GHz band even if the network's - * settings are compatible. This setting depends on specific driver - * capability and may not work with all drivers. - **/ - g_object_class_install_property - (object_class, PROP_BAND, - g_param_spec_string (NM_SETTING_WIRELESS_BAND, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWireless:channel: - * - * Wireless channel to use for the Wi-Fi connection. The device will only - * join (or create for Ad-Hoc networks) a Wi-Fi network on the specified - * channel. Because channel numbers overlap between bands, this property - * also requires the "band" property to be set. - **/ - g_object_class_install_property - (object_class, PROP_CHANNEL, - g_param_spec_uint (NM_SETTING_WIRELESS_CHANNEL, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWireless:bssid: - * - * If specified, directs the device to only associate with the given access - * point. This capability is highly driver dependent and not supported by - * all devices. Note: this property does not control the BSSID used when - * creating an Ad-Hoc network and is unlikely to in the future. - **/ - g_object_class_install_property - (object_class, PROP_BSSID, - _nm_param_spec_specialized (NM_SETTING_WIRELESS_BSSID, "", "", - DBUS_TYPE_G_UCHAR_ARRAY, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWireless:rate: - * - * If non-zero, directs the device to only use the specified bitrate for - * communication with the access point. Units are in Kb/s, ie 5500 = 5.5 - * Mbit/s. This property is highly driver dependent and not all devices - * support setting a static bitrate. - **/ - g_object_class_install_property - (object_class, PROP_RATE, - g_param_spec_uint (NM_SETTING_WIRELESS_RATE, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_FUZZY_IGNORE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWireless:tx-power: - * - * If non-zero, directs the device to use the specified transmit power. - * Units are dBm. This property is highly driver dependent and not all - * devices support setting a static transmit power. - **/ - g_object_class_install_property - (object_class, PROP_TX_POWER, - g_param_spec_uint (NM_SETTING_WIRELESS_TX_POWER, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_FUZZY_IGNORE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWireless:mac-address: - * - * If specified, this connection will only apply to the Wi-Fi device whose - * permanent MAC address matches. This property does not change the MAC - * address of the device (i.e. MAC spoofing). - **/ - g_object_class_install_property - (object_class, PROP_MAC_ADDRESS, - _nm_param_spec_specialized (NM_SETTING_WIRELESS_MAC_ADDRESS, "", "", - DBUS_TYPE_G_UCHAR_ARRAY, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWireless:cloned-mac-address: - * - * If specified, request that the Wi-Fi device use this MAC address instead - * of its permanent MAC address. This is known as MAC cloning or spoofing. - **/ - g_object_class_install_property - (object_class, PROP_CLONED_MAC_ADDRESS, - _nm_param_spec_specialized (NM_SETTING_WIRELESS_CLONED_MAC_ADDRESS, "", "", - DBUS_TYPE_G_UCHAR_ARRAY, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWireless:mac-address-blacklist: - * - * A list of permanent MAC addresses of Wi-Fi devices to which this - * connection should never apply. Each MAC address should be given in the - * standard hex-digits-and-colons notation (eg "00:11:22:33:44:55"). - **/ - g_object_class_install_property - (object_class, PROP_MAC_ADDRESS_BLACKLIST, - _nm_param_spec_specialized (NM_SETTING_WIRELESS_MAC_ADDRESS_BLACKLIST, "", "", - DBUS_TYPE_G_LIST_OF_STRING, - G_PARAM_READWRITE | - NM_SETTING_PARAM_FUZZY_IGNORE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWireless:seen-bssids: - * - * A list of BSSIDs (each BSSID formatted as a MAC address like - * "00:11:22:33:44:55") that have been detected as part of the Wi-Fi - * network. NetworkManager internally tracks previously seen BSSIDs. The - * property is only meant for reading and reflects the BSSID list of - * NetworkManager. The changes you make to this property will not be - * preserved. - **/ - g_object_class_install_property - (object_class, PROP_SEEN_BSSIDS, - _nm_param_spec_specialized (NM_SETTING_WIRELESS_SEEN_BSSIDS, "", "", - DBUS_TYPE_G_LIST_OF_STRING, - G_PARAM_READWRITE | - NM_SETTING_PARAM_FUZZY_IGNORE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWireless:mtu: - * - * If non-zero, only transmit packets of the specified size or smaller, - * breaking larger packets up into multiple Ethernet frames. - **/ - g_object_class_install_property - (object_class, PROP_MTU, - g_param_spec_uint (NM_SETTING_WIRELESS_MTU, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - NM_SETTING_PARAM_FUZZY_IGNORE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWireless:security: - * - * If the wireless connection has any security restrictions, like 802.1x, - * WEP, or WPA, set this property to - * %NM_SETTING_WIRELESS_SECURITY_SETTING_NAME and ensure the connection - * contains a valid #NMSettingWirelessSecurity setting. - * - * Deprecated: 0.9.10: No longer used. Security restrictions are recognized - * by the presence of a #NMSettingWirelessSecurity setting in the - * connection. - **/ - g_object_class_install_property - (object_class, PROP_SEC, - g_param_spec_string (NM_SETTING_WIRELESS_SEC, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWireless:hidden: - * - * If %TRUE, indicates this network is a non-broadcasting network that hides - * its SSID. In this case various workarounds may take place, such as - * probe-scanning the SSID for more reliable network discovery. However, - * these workarounds expose inherent insecurities with hidden SSID networks, - * and thus hidden SSID networks should be used with caution. - **/ - g_object_class_install_property - (object_class, PROP_HIDDEN, - g_param_spec_boolean (NM_SETTING_WIRELESS_HIDDEN, "", "", - FALSE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingWireless:powersave: - * - * If set to %FALSE, Wi-Fi power saving behavior is disabled. If set to - * %TRUE, Wi-Fi power saving behavior is enabled. All other values are - * reserved. Note that even though only boolean values are allowed, the - * property type is an unsigned integer to allow for future expansion. - * - * Since: 1.2 - **/ - g_object_class_install_property - (object_class, PROP_POWERSAVE, - g_param_spec_uint (NM_SETTING_WIRELESS_POWERSAVE, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-util/nm-setting-wireless.h b/libnm-util/nm-setting-wireless.h deleted file mode 100644 index 5a64f0a0f1..0000000000 --- a/libnm-util/nm-setting-wireless.h +++ /dev/null @@ -1,177 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2014 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#ifndef NM_SETTING_WIRELESS_H -#define NM_SETTING_WIRELESS_H - -#include "NetworkManager.h" -#include "nm-setting.h" -#include "nm-setting-wireless-security.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SETTING_WIRELESS (nm_setting_wireless_get_type ()) -#define NM_SETTING_WIRELESS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_WIRELESS, NMSettingWireless)) -#define NM_SETTING_WIRELESS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_WIRELESS, NMSettingWirelessClass)) -#define NM_IS_SETTING_WIRELESS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_WIRELESS)) -#define NM_IS_SETTING_WIRELESS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_WIRELESS)) -#define NM_SETTING_WIRELESS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_WIRELESS, NMSettingWirelessClass)) - -#define NM_SETTING_WIRELESS_SETTING_NAME "802-11-wireless" - -/** - * NMSettingWirelessError: - * @NM_SETTING_WIRELESS_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_WIRELESS_ERROR_INVALID_PROPERTY: the property was invalid - * @NM_SETTING_WIRELESS_ERROR_MISSING_PROPERTY: the property was missing and is - * required - * @NM_SETTING_WIRELESS_ERROR_MISSING_SECURITY_SETTING: property values require - * the presence of an #NMSettingWirelessSecurity object in the connection - * @NM_SETTING_WIRELESS_ERROR_CHANNEL_REQUIRES_BAND: the property channel was - * set to a value that requires the #NMSettingWireless:band property to be set - */ -typedef enum { - NM_SETTING_WIRELESS_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_SETTING_WIRELESS_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/ - NM_SETTING_WIRELESS_ERROR_MISSING_PROPERTY, /*< nick=MissingProperty >*/ - NM_SETTING_WIRELESS_ERROR_MISSING_SECURITY_SETTING, /*< nick=MissingSecuritySetting >*/ - NM_SETTING_WIRELESS_ERROR_CHANNEL_REQUIRES_BAND /*< nick=ChannelRequiresBand >*/ -} NMSettingWirelessError; - -#define NM_SETTING_WIRELESS_ERROR nm_setting_wireless_error_quark () -GQuark nm_setting_wireless_error_quark (void); - -#define NM_SETTING_WIRELESS_SSID "ssid" -#define NM_SETTING_WIRELESS_MODE "mode" -#define NM_SETTING_WIRELESS_BAND "band" -#define NM_SETTING_WIRELESS_CHANNEL "channel" -#define NM_SETTING_WIRELESS_BSSID "bssid" -#define NM_SETTING_WIRELESS_RATE "rate" -#define NM_SETTING_WIRELESS_TX_POWER "tx-power" -#define NM_SETTING_WIRELESS_MAC_ADDRESS "mac-address" -#define NM_SETTING_WIRELESS_CLONED_MAC_ADDRESS "cloned-mac-address" -#define NM_SETTING_WIRELESS_MAC_ADDRESS_BLACKLIST "mac-address-blacklist" -#define NM_SETTING_WIRELESS_MTU "mtu" -#define NM_SETTING_WIRELESS_SEEN_BSSIDS "seen-bssids" -#define NM_SETTING_WIRELESS_HIDDEN "hidden" -#define NM_SETTING_WIRELESS_POWERSAVE "powersave" - -/* Deprecated */ -#define NM_SETTING_WIRELESS_SEC "security" - -/** - * NM_SETTING_WIRELESS_MODE_ADHOC: - * - * Indicates Ad-Hoc mode where no access point is expected to be present. - */ -#define NM_SETTING_WIRELESS_MODE_ADHOC "adhoc" - -/** - * NM_SETTING_WIRELESS_MODE_AP: - * - * Indicates AP/master mode where the wireless device is started as an access - * point/hotspot. - * - * Since: 0.9.8 - */ -#define NM_SETTING_WIRELESS_MODE_AP "ap" - -/** - * NM_SETTING_WIRELESS_MODE_INFRA: - * - * Indicates infrastructure mode where an access point is expected to be present - * for this connection. - */ -#define NM_SETTING_WIRELESS_MODE_INFRA "infrastructure" - -typedef struct { - NMSetting parent; -} NMSettingWireless; - -typedef struct { - NMSettingClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); -} NMSettingWirelessClass; - -GType nm_setting_wireless_get_type (void); - -NMSetting *nm_setting_wireless_new (void); - -const GByteArray *nm_setting_wireless_get_ssid (NMSettingWireless *setting); -const char *nm_setting_wireless_get_mode (NMSettingWireless *setting); -const char *nm_setting_wireless_get_band (NMSettingWireless *setting); -guint32 nm_setting_wireless_get_channel (NMSettingWireless *setting); -const GByteArray *nm_setting_wireless_get_bssid (NMSettingWireless *setting); -guint32 nm_setting_wireless_get_rate (NMSettingWireless *setting); -guint32 nm_setting_wireless_get_tx_power (NMSettingWireless *setting); -const GByteArray *nm_setting_wireless_get_mac_address (NMSettingWireless *setting); -const GByteArray *nm_setting_wireless_get_cloned_mac_address (NMSettingWireless *setting); - -const GSList *nm_setting_wireless_get_mac_address_blacklist (NMSettingWireless *setting); -NM_AVAILABLE_IN_0_9_10 -guint32 nm_setting_wireless_get_num_mac_blacklist_items (NMSettingWireless *setting); -NM_AVAILABLE_IN_0_9_10 -const char * nm_setting_wireless_get_mac_blacklist_item (NMSettingWireless *setting, - guint32 idx); -NM_AVAILABLE_IN_0_9_10 -gboolean nm_setting_wireless_add_mac_blacklist_item (NMSettingWireless *setting, - const char *mac); -NM_AVAILABLE_IN_0_9_10 -void nm_setting_wireless_remove_mac_blacklist_item (NMSettingWireless *setting, - guint32 idx); -NM_AVAILABLE_IN_0_9_10 -gboolean nm_setting_wireless_remove_mac_blacklist_item_by_value (NMSettingWireless *setting, - const char *mac); -NM_AVAILABLE_IN_0_9_10 -void nm_setting_wireless_clear_mac_blacklist_items (NMSettingWireless *setting); - -guint32 nm_setting_wireless_get_mtu (NMSettingWireless *setting); -gboolean nm_setting_wireless_get_hidden (NMSettingWireless *setting); -NM_AVAILABLE_IN_1_2 -guint32 nm_setting_wireless_get_powersave (NMSettingWireless *setting); - -gboolean nm_setting_wireless_add_seen_bssid (NMSettingWireless *setting, - const char *bssid); - -guint32 nm_setting_wireless_get_num_seen_bssids (NMSettingWireless *setting); -const char *nm_setting_wireless_get_seen_bssid (NMSettingWireless *setting, - guint32 i); - -gboolean nm_setting_wireless_ap_security_compatible (NMSettingWireless *s_wireless, - NMSettingWirelessSecurity *s_wireless_sec, - NM80211ApFlags ap_flags, - NM80211ApSecurityFlags ap_wpa, - NM80211ApSecurityFlags ap_rsn, - NM80211Mode ap_mode); - -/* Deprecated */ -NM_DEPRECATED_IN_0_9_10 -const char *nm_setting_wireless_get_security (NMSettingWireless *setting); - -G_END_DECLS - -#endif /* NM_SETTING_WIRELESS_H */ diff --git a/libnm-util/nm-setting.c b/libnm-util/nm-setting.c deleted file mode 100644 index 3edf4005f4..0000000000 --- a/libnm-util/nm-setting.c +++ /dev/null @@ -1,1505 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2011 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#include "nm-default.h" - -#include <string.h> - -#include "nm-setting.h" -#include "nm-setting-private.h" -#include "nm-setting-connection.h" -#include "nm-utils.h" -#include "nm-utils-private.h" - -/** - * SECTION:nm-setting - * @short_description: Describes related configuration information - * @include: nm-setting.h - * - * Each #NMSetting contains properties that describe configuration that applies - * to a specific network layer (like IPv4 or IPv6 configuration) or device type - * (like Ethernet, or Wi-Fi). A collection of individual settings together - * make up an #NMConnection. Each property is strongly typed and usually has - * a number of allowed values. See each #NMSetting subclass for a description - * of properties and allowed values. - */ - -/** - * nm_setting_error_quark: - * - * Registers an error quark for #NMSetting if necessary. - * - * Returns: the error quark used for NMSetting errors. - **/ -GQuark -nm_setting_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-error-quark"); - return quark; -} - -G_DEFINE_ABSTRACT_TYPE (NMSetting, nm_setting, G_TYPE_OBJECT) - -#define NM_SETTING_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING, NMSettingPrivate)) - -typedef struct { - const char *name; - GType type; - guint32 priority; - GQuark error_quark; -} SettingInfo; - -typedef struct { - const SettingInfo *info; -} NMSettingPrivate; - -enum { - PROP_0, - PROP_NAME, - - PROP_LAST -}; - -/*****************************************************************************/ - -static GHashTable *registered_settings = NULL; -static GHashTable *registered_settings_by_type = NULL; - -static gboolean -_nm_gtype_equal (gconstpointer v1, gconstpointer v2) -{ - return *((const GType *) v1) == *((const GType *) v2); -} -static guint -_nm_gtype_hash (gconstpointer v) -{ - return *((const GType *) v); -} - -static void -_ensure_registered (void) -{ - if (G_UNLIKELY (registered_settings == NULL)) { - _nm_value_transforms_register (); - registered_settings = g_hash_table_new (g_str_hash, g_str_equal); - registered_settings_by_type = g_hash_table_new (_nm_gtype_hash, _nm_gtype_equal); - } -} - -static void __attribute__((constructor)) -_ensure_registered_constructor (void) -{ - _ensure_registered (); -} - -#define _ensure_setting_info(self, priv) \ - G_STMT_START { \ - NMSettingPrivate *_priv_esi = (priv); \ - if (G_UNLIKELY (!_priv_esi->info)) { \ - _priv_esi->info = _nm_setting_lookup_setting_by_type (G_OBJECT_TYPE (self)); \ - g_assert (_priv_esi->info); \ - } \ - } G_STMT_END - -/*****************************************************************************/ - -/* - * _nm_register_setting: - * @name: the name of the #NMSetting object to register - * @type: the #GType of the #NMSetting - * @priority: the sort priority of the setting, see below - * @error_quark: the setting's error quark - * - * INTERNAL ONLY: registers a setting's internal properties, like its priority - * and its error quark type, with libnm-util. - * - * A setting's priority should roughly follow the OSI layer model, but it also - * controls which settings get asked for secrets first. Thus settings which - * relate to things that must be working first, like hardware, should get a - * higher priority than things which layer on top of the hardware. For example, - * the GSM/CDMA settings should provide secrets before the PPP setting does, - * because a PIN is required to unlock the device before PPP can even start. - * Even settings without secrets should be assigned the right priority. - * - * 0: reserved for the Connection setting - * - * 1: hardware-related settings like Ethernet, Wi-Fi, InfiniBand, Bridge, etc. - * These priority 1 settings are also "base types", which means that at least - * one of them is required for the connection to be valid, and their name is - * valid in the 'type' property of the Connection setting. - * - * 2: hardware-related auxiliary settings that require a base setting to be - * successful first, like Wi-Fi security, 802.1x, etc. - * - * 3: hardware-independent settings that are required before IP connectivity - * can be established, like PPP, PPPoE, etc. - * - * 4: IP-level stuff - */ -void -(_nm_register_setting) (const char *name, - const GType type, - const guint32 priority, - const GQuark error_quark) -{ - SettingInfo *info; - - g_return_if_fail (name != NULL && *name); - g_return_if_fail (type != G_TYPE_INVALID); - g_return_if_fail (type != G_TYPE_NONE); - g_return_if_fail (error_quark != 0); - g_return_if_fail (priority <= 4); - - _ensure_registered (); - - if (G_LIKELY ((info = g_hash_table_lookup (registered_settings, name)))) { - g_return_if_fail (info->type == type); - g_return_if_fail (info->error_quark == error_quark); - g_return_if_fail (info->priority == priority); - g_return_if_fail (g_strcmp0 (info->name, name) == 0); - return; - } - g_return_if_fail (g_hash_table_lookup (registered_settings_by_type, &type) == NULL); - - if (priority == 0) - g_assert_cmpstr (name, ==, NM_SETTING_CONNECTION_SETTING_NAME); - - info = g_slice_new0 (SettingInfo); - info->type = type; - info->priority = priority; - info->error_quark = error_quark; - info->name = name; - g_hash_table_insert (registered_settings, (void *) info->name, info); - g_hash_table_insert (registered_settings_by_type, &info->type, info); -} - -static const SettingInfo * -_nm_setting_lookup_setting_by_type (GType type) -{ - _ensure_registered (); - return g_hash_table_lookup (registered_settings_by_type, &type); -} - -static guint32 -_get_setting_type_priority (GType type) -{ - const SettingInfo *info; - - g_return_val_if_fail (g_type_is_a (type, NM_TYPE_SETTING), G_MAXUINT32); - - info = _nm_setting_lookup_setting_by_type (type); - return info->priority; -} - -guint32 -_nm_setting_get_setting_priority (NMSetting *setting) -{ - NMSettingPrivate *priv; - - g_return_val_if_fail (NM_IS_SETTING (setting), G_MAXUINT32); - priv = NM_SETTING_GET_PRIVATE (setting); - _ensure_setting_info (setting, priv); - return priv->info->priority; -} - -gboolean -_nm_setting_type_is_base_type (GType type) -{ - /* Historical oddity: PPPoE is a base-type even though it's not - * priority 1. It needs to be sorted *after* lower-level stuff like - * Wi-Fi security or 802.1x for secrets, but it's still allowed as a - * base type. - */ - return _get_setting_type_priority (type) == 1 || (type == NM_TYPE_SETTING_PPPOE); -} - -gboolean -_nm_setting_is_base_type (NMSetting *setting) -{ - return _nm_setting_type_is_base_type (G_OBJECT_TYPE (setting)); -} - -GType -_nm_setting_lookup_setting_type (const char *name) -{ - SettingInfo *info; - - g_return_val_if_fail (name != NULL, G_TYPE_NONE); - - _ensure_registered (); - - info = g_hash_table_lookup (registered_settings, name); - return info ? info->type : G_TYPE_INVALID; -} - -GType -_nm_setting_lookup_setting_type_by_quark (GQuark error_quark) -{ - SettingInfo *info; - GHashTableIter iter; - - _ensure_registered (); - - g_hash_table_iter_init (&iter, registered_settings); - while (g_hash_table_iter_next (&iter, NULL, (gpointer) &info)) { - if (info->error_quark == error_quark) - return info->type; - } - return G_TYPE_INVALID; -} - -int -_nm_setting_compare_priority (gconstpointer a, gconstpointer b) -{ - guint32 prio_a, prio_b; - - prio_a = _nm_setting_get_setting_priority ((NMSetting *) a); - prio_b = _nm_setting_get_setting_priority ((NMSetting *) b); - - if (prio_a < prio_b) - return -1; - else if (prio_a == prio_b) - return 0; - return 1; -} - -/*****************************************************************************/ - -static void -destroy_gvalue (gpointer data) -{ - GValue *value = (GValue *) data; - - g_value_unset (value); - g_slice_free (GValue, value); -} - -/** - * nm_setting_to_hash: - * @setting: the #NMSetting - * @flags: hash flags, e.g. %NM_SETTING_HASH_FLAG_ALL - * - * Converts the #NMSetting into a #GHashTable mapping each setting property - * name to a GValue describing that property, suitable for marshalling over - * D-Bus or serializing. The mapping is string to GValue. - * - * Returns: (transfer full) (element-type utf8 GObject.Value): a new #GHashTable - * describing the setting's properties - **/ -GHashTable * -nm_setting_to_hash (NMSetting *setting, NMSettingHashFlags flags) -{ - GHashTable *hash; - GParamSpec **property_specs; - guint n_property_specs; - guint i; - - g_return_val_if_fail (NM_IS_SETTING (setting), NULL); - - property_specs = g_object_class_list_properties (G_OBJECT_GET_CLASS (setting), &n_property_specs); - - hash = g_hash_table_new_full (g_str_hash, g_str_equal, - g_free, destroy_gvalue); - - for (i = 0; i < n_property_specs; i++) { - GParamSpec *prop_spec = property_specs[i]; - GValue *value; - - /* 'name' doesn't get serialized */ - if (strcmp (g_param_spec_get_name (prop_spec), NM_SETTING_NAME) == 0) - continue; - - if ( (flags & NM_SETTING_HASH_FLAG_NO_SECRETS) - && (prop_spec->flags & NM_SETTING_PARAM_SECRET)) - continue; - - if ( (flags & NM_SETTING_HASH_FLAG_ONLY_SECRETS) - && !(prop_spec->flags & NM_SETTING_PARAM_SECRET)) - continue; - - value = g_slice_new0 (GValue); - g_value_init (value, prop_spec->value_type); - g_object_get_property (G_OBJECT (setting), prop_spec->name, value); - - /* Don't serialize values with default values */ - if (!g_param_value_defaults (prop_spec, value)) - g_hash_table_insert (hash, g_strdup (prop_spec->name), value); - else - destroy_gvalue (value); - } - g_free (property_specs); - - return hash; -} - -/** - * nm_setting_new_from_hash: - * @setting_type: the #NMSetting type which the hash contains properties for - * @hash: (element-type utf8 GObject.Value): the #GHashTable containing a - * string to GValue mapping of properties that apply to the setting - * - * Creates a new #NMSetting object and populates that object with the properties - * contained in the hash table, using each hash key as the property to set, - * and each hash value as the value to set that property to. Setting properties - * are strongly typed, thus the GValue type of the hash value must be correct. - * See the documentation on each #NMSetting object subclass for the correct - * property names and value types. - * - * Returns: a new #NMSetting object populated with the properties from the - * hash table, or %NULL on failure - **/ -NMSetting * -nm_setting_new_from_hash (GType setting_type, GHashTable *hash) -{ - GHashTableIter iter; - NMSetting *setting; - const char *prop_name; - GValue *src_value; - GObjectClass *class; - - g_return_val_if_fail (G_TYPE_IS_INSTANTIATABLE (setting_type), NULL); - g_return_val_if_fail (hash != NULL, NULL); - - /* g_type_class_ref() ensures the setting class is created if it hasn't - * already been used. - */ - class = g_type_class_ref (setting_type); - - setting = (NMSetting *) g_object_new (setting_type, NULL); - - g_hash_table_iter_init (&iter, hash); - while (g_hash_table_iter_next (&iter, (gpointer) &prop_name, (gpointer) &src_value)) { - GParamSpec *param_spec; - - param_spec = g_object_class_find_property (class, prop_name); - if (!param_spec) { - /* Assume that any unrecognized property either can be ignored, or - * else has a backward-compatibility equivalent. - */ - continue; - } - - (void) nm_g_object_set_property ((GObject *) setting, prop_name, src_value, NULL); - } - - g_type_class_unref (class); - - return setting; -} - -gboolean -_nm_setting_get_property (NMSetting *setting, const char *property_name, GValue *value) -{ - GParamSpec *prop_spec; - - g_return_val_if_fail (NM_IS_SETTING (setting), FALSE); - g_return_val_if_fail (property_name, FALSE); - g_return_val_if_fail (value, FALSE); - - prop_spec = g_object_class_find_property (G_OBJECT_GET_CLASS (setting), property_name); - - if (!prop_spec) { - g_value_unset (value); - return FALSE; - } - - g_value_init (value, prop_spec->value_type); - g_object_get_property (G_OBJECT (setting), property_name, value); - return TRUE; -} - -static void -duplicate_setting (NMSetting *setting, - const char *name, - const GValue *value, - GParamFlags flags, - gpointer user_data) -{ - if ((flags & (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)) == G_PARAM_WRITABLE) - g_object_set_property (G_OBJECT (user_data), name, value); -} - -/** - * nm_setting_duplicate: - * @setting: the #NMSetting to duplicate - * - * Duplicates a #NMSetting. - * - * Returns: (transfer full): a new #NMSetting containing the same properties and values as the - * source #NMSetting - **/ -NMSetting * -nm_setting_duplicate (NMSetting *setting) -{ - GObject *dup; - - g_return_val_if_fail (NM_IS_SETTING (setting), NULL); - - dup = g_object_new (G_OBJECT_TYPE (setting), NULL); - - g_object_freeze_notify (dup); - nm_setting_enumerate_values (setting, duplicate_setting, dup); - g_object_thaw_notify (dup); - - return NM_SETTING (dup); -} - -static int -find_setting_by_name (gconstpointer a, gconstpointer b) -{ - NMSetting *setting = NM_SETTING (a); - const char *str = (const char *) b; - - return strcmp (nm_setting_get_name (setting), str); -} - -NMSetting * -nm_setting_find_in_list (GSList *settings_list, - const char *setting_name) -{ - GSList *found; - - found = g_slist_find_custom (settings_list, setting_name, find_setting_by_name); - if (found) - return found->data; - else - return NULL; -} - -/** - * nm_setting_get_name: - * @setting: the #NMSetting - * - * Returns the type name of the #NMSetting object - * - * Returns: a string containing the type name of the #NMSetting object, - * like 'ppp' or 'wireless' or 'wired'. - **/ -const char * -nm_setting_get_name (NMSetting *setting) -{ - NMSettingPrivate *priv; - - g_return_val_if_fail (NM_IS_SETTING (setting), NULL); - priv = NM_SETTING_GET_PRIVATE (setting); - _ensure_setting_info (setting, priv); - return priv->info->name; -} - -/** - * nm_setting_verify: - * @setting: the #NMSetting to verify - * @all_settings: (element-type NMSetting): a #GSList of all settings - * in the connection from which @setting came - * @error: location to store error, or %NULL - * - * Validates the setting. Each setting's properties have allowed values, and - * some are dependent on other values (hence the need for @all_settings). The - * returned #GError contains information about which property of the setting - * failed validation, and in what way that property failed validation. - * - * Returns: %TRUE if the setting is valid, %FALSE if it is not - **/ -gboolean -nm_setting_verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - NMSettingVerifyResult result = _nm_setting_verify (setting, all_settings, error); - - if (result == NM_SETTING_VERIFY_NORMALIZABLE) - g_clear_error (error); - - return result == NM_SETTING_VERIFY_SUCCESS || result == NM_SETTING_VERIFY_NORMALIZABLE; -} - -NMSettingVerifyResult -_nm_setting_verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - g_return_val_if_fail (NM_IS_SETTING (setting), NM_SETTING_VERIFY_ERROR); - g_return_val_if_fail (!error || *error == NULL, NM_SETTING_VERIFY_ERROR); - - if (NM_SETTING_GET_CLASS (setting)->verify) - return NM_SETTING_GET_CLASS (setting)->verify (setting, all_settings, error); - - return NM_SETTING_VERIFY_SUCCESS; -} - -static gboolean -compare_property (NMSetting *setting, - NMSetting *other, - const GParamSpec *prop_spec, - NMSettingCompareFlags flags) -{ - GValue value1 = G_VALUE_INIT; - GValue value2 = G_VALUE_INIT; - gboolean different; - - /* Handle compare flags */ - if (prop_spec->flags & NM_SETTING_PARAM_SECRET) { - NMSettingSecretFlags a_secret_flags = NM_SETTING_SECRET_FLAG_NONE; - NMSettingSecretFlags b_secret_flags = NM_SETTING_SECRET_FLAG_NONE; - - g_return_val_if_fail (!NM_IS_SETTING_VPN (setting), FALSE); - - if (!nm_setting_get_secret_flags (setting, prop_spec->name, &a_secret_flags, NULL)) - g_return_val_if_reached (FALSE); - if (!nm_setting_get_secret_flags (other, prop_spec->name, &b_secret_flags, NULL)) - g_return_val_if_reached (FALSE); - - /* If the secret flags aren't the same the settings aren't the same */ - if (a_secret_flags != b_secret_flags) - return FALSE; - - /* Check for various secret flags that might cause us to ignore comparing - * this property. - */ - if ( (flags & NM_SETTING_COMPARE_FLAG_IGNORE_AGENT_OWNED_SECRETS) - && (a_secret_flags & NM_SETTING_SECRET_FLAG_AGENT_OWNED)) - return TRUE; - - if ( (flags & NM_SETTING_COMPARE_FLAG_IGNORE_NOT_SAVED_SECRETS) - && (a_secret_flags & NM_SETTING_SECRET_FLAG_NOT_SAVED)) - return TRUE; - } - - g_value_init (&value1, prop_spec->value_type); - g_object_get_property (G_OBJECT (setting), prop_spec->name, &value1); - - g_value_init (&value2, prop_spec->value_type); - g_object_get_property (G_OBJECT (other), prop_spec->name, &value2); - - different = g_param_values_cmp ((GParamSpec *) prop_spec, &value1, &value2); - - g_value_unset (&value1); - g_value_unset (&value2); - - return different == 0 ? TRUE : FALSE; -} - -/** - * nm_setting_compare: - * @a: a #NMSetting - * @b: a second #NMSetting to compare with the first - * @flags: compare flags, e.g. %NM_SETTING_COMPARE_FLAG_EXACT - * - * Compares two #NMSetting objects for similarity, with comparison behavior - * modified by a set of flags. See the documentation for #NMSettingCompareFlags - * for a description of each flag's behavior. - * - * Returns: %TRUE if the comparison succeeds, %FALSE if it does not - **/ -gboolean -nm_setting_compare (NMSetting *a, - NMSetting *b, - NMSettingCompareFlags flags) -{ - GParamSpec **property_specs; - guint n_property_specs; - int same = TRUE; - guint i; - - g_return_val_if_fail (NM_IS_SETTING (a), FALSE); - g_return_val_if_fail (NM_IS_SETTING (b), FALSE); - - /* First check that both have the same type */ - if (G_OBJECT_TYPE (a) != G_OBJECT_TYPE (b)) - return FALSE; - - /* And now all properties */ - property_specs = g_object_class_list_properties (G_OBJECT_GET_CLASS (a), &n_property_specs); - for (i = 0; i < n_property_specs && same; i++) { - GParamSpec *prop_spec = property_specs[i]; - - /* Fuzzy compare ignores secrets and properties defined with the FUZZY_IGNORE flag */ - if ( (flags & NM_SETTING_COMPARE_FLAG_FUZZY) - && (prop_spec->flags & (NM_SETTING_PARAM_FUZZY_IGNORE | NM_SETTING_PARAM_SECRET))) - continue; - - if ((flags & NM_SETTING_COMPARE_FLAG_INFERRABLE) && !(prop_spec->flags & NM_SETTING_PARAM_INFERRABLE)) - continue; - - if ( (flags & NM_SETTING_COMPARE_FLAG_IGNORE_SECRETS) - && (prop_spec->flags & NM_SETTING_PARAM_SECRET)) - continue; - - same = NM_SETTING_GET_CLASS (a)->compare_property (a, b, prop_spec, flags); - } - g_free (property_specs); - - return same; -} - -static gboolean -should_compare_prop (NMSetting *setting, - const char *prop_name, - NMSettingCompareFlags comp_flags, - GParamFlags prop_flags) -{ - /* Fuzzy compare ignores secrets and properties defined with the FUZZY_IGNORE flag */ - if ( (comp_flags & NM_SETTING_COMPARE_FLAG_FUZZY) - && (prop_flags & (NM_SETTING_PARAM_FUZZY_IGNORE | NM_SETTING_PARAM_SECRET))) - return FALSE; - - if ((comp_flags & NM_SETTING_COMPARE_FLAG_INFERRABLE) && !(prop_flags & NM_SETTING_PARAM_INFERRABLE)) - return FALSE; - - if (prop_flags & NM_SETTING_PARAM_SECRET) { - NMSettingSecretFlags secret_flags = NM_SETTING_SECRET_FLAG_NONE; - - if (comp_flags & NM_SETTING_COMPARE_FLAG_IGNORE_SECRETS) - return FALSE; - - if ( NM_IS_SETTING_VPN (setting) - && g_strcmp0 (prop_name, NM_SETTING_VPN_SECRETS) == 0) { - /* FIXME: NMSettingVPN:NM_SETTING_VPN_SECRETS has NM_SETTING_PARAM_SECRET. - * nm_setting_get_secret_flags() quite possibly fails, but it might succeed if the - * setting accidentally uses a key "secrets". */ - return FALSE; - } - - if (!nm_setting_get_secret_flags (setting, prop_name, &secret_flags, NULL)) - g_return_val_if_reached (FALSE); - - if ( (comp_flags & NM_SETTING_COMPARE_FLAG_IGNORE_AGENT_OWNED_SECRETS) - && (secret_flags & NM_SETTING_SECRET_FLAG_AGENT_OWNED)) - return FALSE; - - if ( (comp_flags & NM_SETTING_COMPARE_FLAG_IGNORE_NOT_SAVED_SECRETS) - && (secret_flags & NM_SETTING_SECRET_FLAG_NOT_SAVED)) - return FALSE; - } - - if ( (comp_flags & NM_SETTING_COMPARE_FLAG_IGNORE_ID) - && NM_IS_SETTING_CONNECTION (setting) - && !strcmp (prop_name, NM_SETTING_CONNECTION_ID)) - return FALSE; - - return TRUE; -} - -/** - * nm_setting_diff: - * @a: a #NMSetting - * @b: a second #NMSetting to compare with the first - * @flags: compare flags, e.g. %NM_SETTING_COMPARE_FLAG_EXACT - * @invert_results: this parameter is used internally by libnm-util and should - * be set to %FALSE. If %TRUE inverts the meaning of the #NMSettingDiffResult. - * @results: (inout) (transfer full) (element-type utf8 guint32): if the - * settings differ, on return a hash table mapping the differing keys to one or - * more %NMSettingDiffResult values OR-ed together. If the settings do not - * differ, any hash table passed in is unmodified. If no hash table is passed - * in and the settings differ, a new one is created and returned. - * - * Compares two #NMSetting objects for similarity, with comparison behavior - * modified by a set of flags. See the documentation for #NMSettingCompareFlags - * for a description of each flag's behavior. If the settings differ, the keys - * of each setting that differ from the other are added to @results, mapped to - * one or more #NMSettingDiffResult values. - * - * Returns: %TRUE if the settings contain the same values, %FALSE if they do not - **/ -gboolean -nm_setting_diff (NMSetting *a, - NMSetting *b, - NMSettingCompareFlags flags, - gboolean invert_results, - GHashTable **results) -{ - GParamSpec **property_specs; - guint n_property_specs; - guint i; - NMSettingDiffResult a_result = NM_SETTING_DIFF_RESULT_IN_A; - NMSettingDiffResult b_result = NM_SETTING_DIFF_RESULT_IN_B; - NMSettingDiffResult a_result_default = NM_SETTING_DIFF_RESULT_IN_A_DEFAULT; - NMSettingDiffResult b_result_default = NM_SETTING_DIFF_RESULT_IN_B_DEFAULT; - gboolean results_created = FALSE; - - g_return_val_if_fail (results != NULL, FALSE); - g_return_val_if_fail (NM_IS_SETTING (a), FALSE); - if (b) { - g_return_val_if_fail (NM_IS_SETTING (b), FALSE); - g_return_val_if_fail (G_OBJECT_TYPE (a) == G_OBJECT_TYPE (b), FALSE); - } - - if ((flags & (NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT | NM_SETTING_COMPARE_FLAG_DIFF_RESULT_NO_DEFAULT)) == - (NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT | NM_SETTING_COMPARE_FLAG_DIFF_RESULT_NO_DEFAULT)) { - /* conflicting flags: default to WITH_DEFAULT (clearing NO_DEFAULT). */ - flags &= ~NM_SETTING_COMPARE_FLAG_DIFF_RESULT_NO_DEFAULT; - } - - /* If the caller is calling this function in a pattern like this to get - * complete diffs: - * - * nm_setting_diff (A, B, FALSE, &results); - * nm_setting_diff (B, A, TRUE, &results); - * - * and wants us to invert the results so that the second invocation comes - * out correctly, do that here. - */ - if (invert_results) { - a_result = NM_SETTING_DIFF_RESULT_IN_B; - b_result = NM_SETTING_DIFF_RESULT_IN_A; - a_result_default = NM_SETTING_DIFF_RESULT_IN_B_DEFAULT; - b_result_default = NM_SETTING_DIFF_RESULT_IN_A_DEFAULT; - } - - if (*results == NULL) { - *results = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); - results_created = TRUE; - } - - /* And now all properties */ - property_specs = g_object_class_list_properties (G_OBJECT_GET_CLASS (a), &n_property_specs); - - for (i = 0; i < n_property_specs; i++) { - GParamSpec *prop_spec = property_specs[i]; - NMSettingDiffResult r = NM_SETTING_DIFF_RESULT_UNKNOWN; - - /* Handle compare flags */ - if (!should_compare_prop (a, prop_spec->name, flags, prop_spec->flags)) - continue; - if (strcmp (prop_spec->name, NM_SETTING_NAME) == 0) - continue; - - if (b) { - gboolean different; - - different = !NM_SETTING_GET_CLASS (a)->compare_property (a, b, prop_spec, flags); - if (different) { - gboolean a_is_default, b_is_default; - GValue value = G_VALUE_INIT; - - g_value_init (&value, prop_spec->value_type); - g_object_get_property (G_OBJECT (a), prop_spec->name, &value); - a_is_default = g_param_value_defaults (prop_spec, &value); - - g_value_reset (&value); - g_object_get_property (G_OBJECT (b), prop_spec->name, &value); - b_is_default = g_param_value_defaults (prop_spec, &value); - - g_value_unset (&value); - if ((flags & NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT) == 0) { - if (!a_is_default) - r |= a_result; - if (!b_is_default) - r |= b_result; - } else { - r |= a_result | b_result; - if (a_is_default) - r |= a_result_default; - if (b_is_default) - r |= b_result_default; - } - } - } else if ((flags & (NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT | NM_SETTING_COMPARE_FLAG_DIFF_RESULT_NO_DEFAULT)) == 0) - r = a_result; /* only in A */ - else { - GValue value = G_VALUE_INIT; - - g_value_init (&value, prop_spec->value_type); - g_object_get_property (G_OBJECT (a), prop_spec->name, &value); - if (!g_param_value_defaults (prop_spec, &value)) - r |= a_result; - else if (flags & NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT) - r |= a_result | a_result_default; - - g_value_unset (&value); - } - - if (r != NM_SETTING_DIFF_RESULT_UNKNOWN) { - void *p; - - if (g_hash_table_lookup_extended (*results, prop_spec->name, NULL, &p)) { - if ((r & GPOINTER_TO_UINT (p)) != r) - g_hash_table_insert (*results, g_strdup (prop_spec->name), GUINT_TO_POINTER (r | GPOINTER_TO_UINT (p))); - } else - g_hash_table_insert (*results, g_strdup (prop_spec->name), GUINT_TO_POINTER (r)); - } - } - g_free (property_specs); - - /* Don't return an empty hash table */ - if (results_created && !g_hash_table_size (*results)) { - g_hash_table_destroy (*results); - *results = NULL; - } - - return !(*results); -} - -/** - * nm_setting_enumerate_values: - * @setting: the #NMSetting - * @func: (scope call): user-supplied function called for each property of the setting - * @user_data: user data passed to @func at each invocation - * - * Iterates over each property of the #NMSetting object, calling the supplied - * user function for each property. - **/ -void -nm_setting_enumerate_values (NMSetting *setting, - NMSettingValueIterFn func, - gpointer user_data) -{ - GParamSpec **property_specs; - guint n_property_specs; - int i; - - g_return_if_fail (NM_IS_SETTING (setting)); - g_return_if_fail (func != NULL); - - property_specs = g_object_class_list_properties (G_OBJECT_GET_CLASS (setting), &n_property_specs); - for (i = 0; i < n_property_specs; i++) { - GParamSpec *prop_spec = property_specs[i]; - GValue value = G_VALUE_INIT; - - g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (prop_spec)); - g_object_get_property (G_OBJECT (setting), prop_spec->name, &value); - func (setting, prop_spec->name, &value, prop_spec->flags, user_data); - g_value_unset (&value); - } - - g_free (property_specs); -} - -/** - * nm_setting_clear_secrets: - * @setting: the #NMSetting - * - * Resets and clears any secrets in the setting. Secrets should be added to the - * setting only when needed, and cleared immediately after use to prevent - * leakage of information. - **/ -void -nm_setting_clear_secrets (NMSetting *setting) -{ - _nm_setting_clear_secrets (setting); -} - -gboolean -_nm_setting_clear_secrets (NMSetting *setting) -{ - GParamSpec **property_specs; - guint n_property_specs; - guint i; - gboolean changed = FALSE; - - g_return_val_if_fail (NM_IS_SETTING (setting), FALSE); - - property_specs = g_object_class_list_properties (G_OBJECT_GET_CLASS (setting), &n_property_specs); - - for (i = 0; i < n_property_specs; i++) { - GParamSpec *prop_spec = property_specs[i]; - - if (prop_spec->flags & NM_SETTING_PARAM_SECRET) { - GValue value = G_VALUE_INIT; - - g_value_init (&value, prop_spec->value_type); - g_object_get_property (G_OBJECT (setting), prop_spec->name, &value); - if (!g_param_value_defaults (prop_spec, &value)) { - g_param_value_set_default (prop_spec, &value); - g_object_set_property (G_OBJECT (setting), prop_spec->name, &value); - changed = TRUE; - } - g_value_unset (&value); - } - } - - g_free (property_specs); - - return changed; -} - -static gboolean -clear_secrets_with_flags (NMSetting *setting, - GParamSpec *pspec, - NMSettingClearSecretsWithFlagsFn func, - gpointer user_data) -{ - NMSettingSecretFlags flags = NM_SETTING_SECRET_FLAG_NONE; - gboolean changed = FALSE; - - g_return_val_if_fail (!NM_IS_SETTING_VPN (setting), FALSE); - - /* Clear the secret if the user function says to do so */ - if (!nm_setting_get_secret_flags (setting, pspec->name, &flags, NULL)) - g_return_val_if_reached (FALSE); - - if (func (setting, pspec->name, flags, user_data) == TRUE) { - GValue value = G_VALUE_INIT; - - g_value_init (&value, pspec->value_type); - g_object_get_property (G_OBJECT (setting), pspec->name, &value); - if (!g_param_value_defaults (pspec, &value)) { - g_param_value_set_default (pspec, &value); - g_object_set_property (G_OBJECT (setting), pspec->name, &value); - changed = TRUE; - } - g_value_unset (&value); - } - - return changed; -} - -/** - * nm_setting_clear_secrets_with_flags: - * @setting: the #NMSetting - * @func: (scope call): function to be called to determine whether a - * specific secret should be cleared or not - * @user_data: caller-supplied data passed to @func - * - * Clears and frees secrets determined by @func. - **/ -void -nm_setting_clear_secrets_with_flags (NMSetting *setting, - NMSettingClearSecretsWithFlagsFn func, - gpointer user_data) -{ - _nm_setting_clear_secrets_with_flags (setting, func, user_data); -} - -gboolean -_nm_setting_clear_secrets_with_flags (NMSetting *setting, - NMSettingClearSecretsWithFlagsFn func, - gpointer user_data) -{ - GParamSpec **property_specs; - guint n_property_specs; - guint i; - gboolean changed = FALSE; - - g_return_val_if_fail (setting, FALSE); - g_return_val_if_fail (NM_IS_SETTING (setting), FALSE); - g_return_val_if_fail (func != NULL, FALSE); - - property_specs = g_object_class_list_properties (G_OBJECT_GET_CLASS (setting), &n_property_specs); - for (i = 0; i < n_property_specs; i++) { - if (property_specs[i]->flags & NM_SETTING_PARAM_SECRET) { - changed |= NM_SETTING_GET_CLASS (setting)->clear_secrets_with_flags (setting, - property_specs[i], - func, - user_data); - } - } - - g_free (property_specs); - return changed; -} - -/** - * nm_setting_need_secrets: - * @setting: the #NMSetting - * - * Returns an array of property names for each secret which may be required - * to make a successful connection. The returned hints are only intended as a - * guide to what secrets may be required, because in some circumstances, there - * is no way to conclusively determine exactly which secrets are needed. - * - * Returns: (transfer container) (element-type utf8): a #GPtrArray containing - * the property names of secrets of the #NMSetting which may be required; the - * caller owns the array and must free it with g_ptr_array_free(), but must not - * free the elements. - **/ -GPtrArray * -nm_setting_need_secrets (NMSetting *setting) -{ - GPtrArray *secrets = NULL; - - g_return_val_if_fail (NM_IS_SETTING (setting), NULL); - - if (NM_SETTING_GET_CLASS (setting)->need_secrets) - secrets = NM_SETTING_GET_CLASS (setting)->need_secrets (setting); - - return secrets; -} - -static int -update_one_secret (NMSetting *setting, const char *key, GValue *value, GError **error) -{ - GParamSpec *prop_spec; - - prop_spec = g_object_class_find_property (G_OBJECT_GET_CLASS (setting), key); - if (!prop_spec) { - g_set_error (error, - NM_SETTING_ERROR, - NM_SETTING_ERROR_PROPERTY_NOT_FOUND, - "%s", key); - return NM_SETTING_UPDATE_SECRET_ERROR; - } - - /* Silently ignore non-secrets */ - if (!(prop_spec->flags & NM_SETTING_PARAM_SECRET)) - return NM_SETTING_UPDATE_SECRET_SUCCESS_UNCHANGED; - - if (g_value_type_compatible (G_VALUE_TYPE (value), G_PARAM_SPEC_VALUE_TYPE (prop_spec))) { - if (G_VALUE_HOLDS_STRING (value) && G_IS_PARAM_SPEC_STRING (prop_spec)) { - /* String is expected to be a common case. Handle it specially and check whether - * the value is already set. Otherwise, we just reset the property and - * assume the value got modified. */ - char *v; - - g_object_get (G_OBJECT (setting), prop_spec->name, &v, NULL); - if (g_strcmp0 (v, g_value_get_string (value)) == 0) { - g_free (v); - return NM_SETTING_UPDATE_SECRET_SUCCESS_UNCHANGED; - } - g_free (v); - } - g_object_set_property (G_OBJECT (setting), prop_spec->name, value); - return NM_SETTING_UPDATE_SECRET_SUCCESS_MODIFIED; - } - g_set_error (error, - NM_SETTING_ERROR, - NM_SETTING_ERROR_PROPERTY_TYPE_MISMATCH, - "%s", key); - return NM_SETTING_UPDATE_SECRET_ERROR; -} - -/** - * nm_setting_update_secrets: - * @setting: the #NMSetting - * @secrets: (element-type utf8 GObject.Value): a #GHashTable mapping - * string to #GValue of setting property names and secrets - * @error: location to store error, or %NULL - * - * Update the setting's secrets, given a hash table of secrets intended for that - * setting (deserialized from D-Bus for example). - * - * Returns: %TRUE if the secrets were successfully updated, %FALSE on failure to - * update one or more of the secrets. - **/ -gboolean -nm_setting_update_secrets (NMSetting *setting, GHashTable *secrets, GError **error) -{ - return _nm_setting_update_secrets (setting, secrets, error) != NM_SETTING_UPDATE_SECRET_ERROR; -} - -NMSettingUpdateSecretResult -_nm_setting_update_secrets (NMSetting *setting, GHashTable *secrets, GError **error) -{ - GHashTableIter iter; - gpointer key, data; - GError *tmp_error = NULL; - NMSettingUpdateSecretResult result = NM_SETTING_UPDATE_SECRET_SUCCESS_UNCHANGED; - - g_return_val_if_fail (NM_IS_SETTING (setting), NM_SETTING_UPDATE_SECRET_ERROR); - g_return_val_if_fail (secrets != NULL, NM_SETTING_UPDATE_SECRET_ERROR); - if (error) - g_return_val_if_fail (*error == NULL, NM_SETTING_UPDATE_SECRET_ERROR); - - g_hash_table_iter_init (&iter, secrets); - while (g_hash_table_iter_next (&iter, &key, &data)) { - int success; - const char *secret_key = (const char *) key; - GValue *secret_value = (GValue *) data; - - success = NM_SETTING_GET_CLASS (setting)->update_one_secret (setting, secret_key, secret_value, &tmp_error); - g_assert (!((success == NM_SETTING_UPDATE_SECRET_ERROR) ^ (!!tmp_error))); - - if (success == NM_SETTING_UPDATE_SECRET_ERROR) { - g_propagate_error (error, tmp_error); - return NM_SETTING_UPDATE_SECRET_ERROR; - } - - if (success == NM_SETTING_UPDATE_SECRET_SUCCESS_MODIFIED) - result = NM_SETTING_UPDATE_SECRET_SUCCESS_MODIFIED; - } - - return result; -} - -static gboolean -is_secret_prop (NMSetting *setting, const char *secret_name, GError **error) -{ - GParamSpec *pspec; - - pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (setting), secret_name); - if (!pspec) { - g_set_error (error, - NM_SETTING_ERROR, - NM_SETTING_ERROR_PROPERTY_NOT_FOUND, - "Secret %s not provided by this setting", secret_name); - return FALSE; - } - - if (!(pspec->flags & NM_SETTING_PARAM_SECRET)) { - g_set_error (error, - NM_SETTING_ERROR, - NM_SETTING_ERROR_PROPERTY_NOT_SECRET, - "Property %s is not a secret", secret_name); - return FALSE; - } - - return TRUE; -} - -static gboolean -get_secret_flags (NMSetting *setting, - const char *secret_name, - gboolean verify_secret, - NMSettingSecretFlags *out_flags, - GError **error) -{ - char *flags_prop; - NMSettingSecretFlags flags = NM_SETTING_SECRET_FLAG_NONE; - - if (verify_secret && !is_secret_prop (setting, secret_name, error)) { - if (out_flags) - *out_flags = NM_SETTING_SECRET_FLAG_NONE; - return FALSE; - } - - flags_prop = g_strdup_printf ("%s-flags", secret_name); - g_object_get (G_OBJECT (setting), flags_prop, &flags, NULL); - g_free (flags_prop); - - if (out_flags) - *out_flags = flags; - return TRUE; -} - -/** - * nm_setting_get_secret_flags: - * @setting: the #NMSetting - * @secret_name: the secret key name to get flags for - * @out_flags: on success, the #NMSettingSecretFlags for the secret - * @error: location to store error, or %NULL - * - * For a given secret, retrieves the #NMSettingSecretFlags describing how to - * handle that secret. - * - * Returns: %TRUE on success (if the given secret name was a valid property of - * this setting, and if that property is secret), %FALSE if not - **/ -gboolean -nm_setting_get_secret_flags (NMSetting *setting, - const char *secret_name, - NMSettingSecretFlags *out_flags, - GError **error) -{ - g_return_val_if_fail (NM_IS_SETTING (setting), FALSE); - g_return_val_if_fail (secret_name != NULL, FALSE); - - return NM_SETTING_GET_CLASS (setting)->get_secret_flags (setting, secret_name, TRUE, out_flags, error); -} - -static gboolean -set_secret_flags (NMSetting *setting, - const char *secret_name, - gboolean verify_secret, - NMSettingSecretFlags flags, - GError **error) -{ - char *flags_prop; - - if (verify_secret) - g_return_val_if_fail (is_secret_prop (setting, secret_name, error), FALSE); - - flags_prop = g_strdup_printf ("%s-flags", secret_name); - g_object_set (G_OBJECT (setting), flags_prop, flags, NULL); - g_free (flags_prop); - return TRUE; -} - -/** - * nm_setting_set_secret_flags: - * @setting: the #NMSetting - * @secret_name: the secret key name to set flags for - * @flags: the #NMSettingSecretFlags for the secret - * @error: location to store error, or %NULL - * - * For a given secret, stores the #NMSettingSecretFlags describing how to - * handle that secret. - * - * Returns: %TRUE on success (if the given secret name was a valid property of - * this setting, and if that property is secret), %FALSE if not - **/ -gboolean -nm_setting_set_secret_flags (NMSetting *setting, - const char *secret_name, - NMSettingSecretFlags flags, - GError **error) -{ - g_return_val_if_fail (NM_IS_SETTING (setting), FALSE); - g_return_val_if_fail (secret_name != NULL, FALSE); - g_return_val_if_fail (flags <= NM_SETTING_SECRET_FLAGS_ALL, FALSE); - - return NM_SETTING_GET_CLASS (setting)->set_secret_flags (setting, secret_name, TRUE, flags, error); -} - -/** - * nm_setting_to_string: - * @setting: the #NMSetting - * - * Convert the setting into a string. For debugging purposes ONLY, should NOT - * be used for serialization of the setting, or machine-parsed in any way. The - * output format is not guaranteed to be stable and may change at any time. - * - * Returns: an allocated string containing a textual representation of the - * setting's properties and values (including secrets!), which the caller should - * free with g_free() - **/ -char * -nm_setting_to_string (NMSetting *setting) -{ - GString *string; - GParamSpec **property_specs; - guint n_property_specs; - guint i; - - g_return_val_if_fail (NM_IS_SETTING (setting), NULL); - - property_specs = g_object_class_list_properties (G_OBJECT_GET_CLASS (setting), &n_property_specs); - - string = g_string_new (nm_setting_get_name (setting)); - g_string_append_c (string, '\n'); - - for (i = 0; i < n_property_specs; i++) { - GParamSpec *prop_spec = property_specs[i]; - GValue value = G_VALUE_INIT; - char *value_str; - gboolean is_default; - - if (strcmp (prop_spec->name, NM_SETTING_NAME) == 0) - continue; - - g_value_init (&value, prop_spec->value_type); - g_object_get_property (G_OBJECT (setting), prop_spec->name, &value); - - value_str = g_strdup_value_contents (&value); - g_string_append_printf (string, "\t%s : %s", prop_spec->name, value_str); - g_free (value_str); - - is_default = g_param_value_defaults (prop_spec, &value); - g_value_unset (&value); - - g_string_append (string, " ("); - g_string_append_c (string, 's'); - if (is_default) - g_string_append_c (string, 'd'); - g_string_append_c (string, ')'); - g_string_append_c (string, '\n'); - } - - g_free (property_specs); - g_string_append_c (string, '\n'); - - return g_string_free (string, FALSE); -} - -/** - * nm_setting_get_virtual_iface_name: - * @setting: the #NMSetting - * - * Returns the name of the virtual kernel interface which the connection - * needs to use if specified in the settings. - * - * Returns: Name of the virtual interface or %NULL if the setting does not - * support this feature - **/ -const char * -nm_setting_get_virtual_iface_name (NMSetting *setting) -{ - g_return_val_if_fail (NM_IS_SETTING (setting), NULL); - - if (NM_SETTING_GET_CLASS (setting)->get_virtual_iface_name) - return NM_SETTING_GET_CLASS (setting)->get_virtual_iface_name (setting); - - return NULL; -} - -NMSettingVerifyResult -_nm_setting_verify_deprecated_virtual_iface_name (const char *interface_name, - gboolean allow_missing, - const char *setting_name, - const char *setting_property, - GQuark error_quark, - int e_invalid_property, - int e_missing_property, - GSList *all_settings, - GError **error) -{ - NMSettingConnection *s_con; - const char *con_name; - - s_con = NM_SETTING_CONNECTION (nm_setting_find_in_list (all_settings, NM_SETTING_CONNECTION_SETTING_NAME)); - con_name = s_con ? nm_setting_connection_get_interface_name (s_con) : NULL; - if (!interface_name && !con_name) { - if (allow_missing) - return NM_SETTING_VERIFY_SUCCESS; - - g_set_error_literal (error, - NM_SETTING_CONNECTION_ERROR, - NM_SETTING_CONNECTION_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_CONNECTION_SETTING_NAME, NM_SETTING_CONNECTION_INTERFACE_NAME); - return NM_SETTING_VERIFY_ERROR; - } - if (!con_name && !nm_utils_iface_valid_name (interface_name)) { - /* the interface_name is invalid, we cannot normalize it. Only do this if !con_name, - * because if con_name is set, it can overwrite interface_name. */ - g_set_error_literal (error, - error_quark, - e_invalid_property, - _("property is invalid")); - g_prefix_error (error, "%s.%s: ", setting_name, setting_property); - return NM_SETTING_VERIFY_ERROR; - } - if (!con_name) { - /* NMSettingConnection has interface not set, it should be normalized to interface_name */ - g_set_error_literal (error, - NM_SETTING_CONNECTION_ERROR, - NM_SETTING_CONNECTION_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_CONNECTION_SETTING_NAME, NM_SETTING_CONNECTION_INTERFACE_NAME); - return NM_SETTING_VERIFY_NORMALIZABLE; - } - if (!nm_utils_iface_valid_name (con_name)) { - /* NMSettingConnection:interface_name is invalid, we cannot normalize it. */ - g_set_error_literal (error, - NM_SETTING_CONNECTION_ERROR, - NM_SETTING_CONNECTION_ERROR_INVALID_PROPERTY, - _("property is invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_CONNECTION_SETTING_NAME, NM_SETTING_CONNECTION_INTERFACE_NAME); - return NM_SETTING_VERIFY_ERROR; - } - if (!interface_name) { - /* Normalize by setting NMSettingConnection:interface_name. */ - g_set_error_literal (error, - error_quark, - e_missing_property, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", setting_name, setting_property); - return NM_SETTING_VERIFY_NORMALIZABLE; - } - if (strcmp (con_name, interface_name) != 0) { - /* con_name and interface_name are different. It can be normalized by setting interface_name - * to con_name. */ - g_set_error_literal (error, - error_quark, - e_invalid_property, - _("property is invalid")); - g_prefix_error (error, "%s.%s: ", setting_name, setting_property); - /* we would like to make this a NORMALIZABLE_ERROR, but that might - * break older connections. */ - return NM_SETTING_VERIFY_NORMALIZABLE; - } - - return NM_SETTING_VERIFY_SUCCESS; -} - -/*****************************************************************************/ - -static void -nm_setting_init (NMSetting *setting) -{ -} - -static GObject* -constructor (GType type, - guint n_construct_params, - GObjectConstructParam *construct_params) -{ - GObject *object; - - object = G_OBJECT_CLASS (nm_setting_parent_class)->constructor (type, - n_construct_params, - construct_params); - - _ensure_setting_info (object, NM_SETTING_GET_PRIVATE (object)); - return object; -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSettingPrivate *priv = NM_SETTING_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_NAME: - /* The setter for NAME is deprecated and should not be used anymore. - * Keep the setter for NAME to remain backward compatible. - * Only assert that the caller does not try to set the name to a different value - * then the registered name, which would be extra wrong. - **/ - _ensure_setting_info (object, priv); - g_return_if_fail (!g_strcmp0 (priv->info->name, g_value_get_string (value))); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSetting *setting = NM_SETTING (object); - - switch (prop_id) { - case PROP_NAME: - g_value_set_string (value, nm_setting_get_name (setting)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_setting_class_init (NMSettingClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingPrivate)); - - /* virtual methods */ - object_class->constructor = constructor; - object_class->set_property = set_property; - object_class->get_property = get_property; - - setting_class->update_one_secret = update_one_secret; - setting_class->get_secret_flags = get_secret_flags; - setting_class->set_secret_flags = set_secret_flags; - setting_class->compare_property = compare_property; - setting_class->clear_secrets_with_flags = clear_secrets_with_flags; - - /* Properties */ - - /** - * NMSetting:name: - * - * The setting's name, which uniquely identifies the setting within the - * connection. Each setting type has a name unique to that type, for - * example "ppp" or "wireless" or "wired". - **/ - g_object_class_install_property - (object_class, PROP_NAME, - g_param_spec_string (NM_SETTING_NAME, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-util/nm-setting.h b/libnm-util/nm-setting.h deleted file mode 100644 index d70445a2e7..0000000000 --- a/libnm-util/nm-setting.h +++ /dev/null @@ -1,334 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2011 Red Hat, Inc. - * Copyright 2007 - 2008 Novell, Inc. - */ - -#ifndef NM_SETTING_H -#define NM_SETTING_H - -#include <glib.h> -#include <glib-object.h> - -#include "nm-version.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SETTING (nm_setting_get_type ()) -#define NM_SETTING(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING, NMSetting)) -#define NM_SETTING_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING, NMSettingClass)) -#define NM_IS_SETTING(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING)) -#define NM_IS_SETTING_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING)) -#define NM_SETTING_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING, NMSettingClass)) - -/** - * NMSettingError: - * @NM_SETTING_ERROR_UNKNOWN: unknown or unclassified error - * @NM_SETTING_ERROR_PROPERTY_NOT_FOUND: a property required by the operation - * was not found; for example, an attempt to update an invalid secret - * @NM_SETTING_ERROR_PROPERTY_NOT_SECRET: an operation which requires a secret - * was attempted on a non-secret property - * @NM_SETTING_ERROR_PROPERTY_TYPE_MISMATCH: the operation requires a property - * of a specific type, or the value couldn't be transformed to the same type - * as the property being acted upon - * - * Describes errors that may result from operations involving a #NMSetting. - * - **/ -typedef enum -{ - NM_SETTING_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_SETTING_ERROR_PROPERTY_NOT_FOUND, /*< nick=PropertyNotFound >*/ - NM_SETTING_ERROR_PROPERTY_NOT_SECRET, /*< nick=PropertyNotSecret >*/ - NM_SETTING_ERROR_PROPERTY_TYPE_MISMATCH /*< nick=PropertyTypeMismatch >*/ -} NMSettingError; - -#define NM_SETTING_ERROR nm_setting_error_quark () -GQuark nm_setting_error_quark (void); - -/* DEPRECATED AND UNUSED */ -#define NM_SETTING_PARAM_SERIALIZE (1 << (0 + G_PARAM_USER_SHIFT)) - -/* The property of the #NMSetting is required for the setting to be valid */ -#define NM_SETTING_PARAM_REQUIRED (1 << (1 + G_PARAM_USER_SHIFT)) - -/* The property of the #NMSetting is a secret */ -#define NM_SETTING_PARAM_SECRET (1 << (2 + G_PARAM_USER_SHIFT)) - -/* The property of the #NMSetting should be ignored during comparisons that - * use the %NM_SETTING_COMPARE_FLAG_FUZZY flag. - */ -#define NM_SETTING_PARAM_FUZZY_IGNORE (1 << (3 + G_PARAM_USER_SHIFT)) - -/* Note: all non-glib GParamFlags bits are reserved by NetworkManager */ - -#define NM_SETTING_NAME "name" - -/** - * NMSettingSecretFlags: - * @NM_SETTING_SECRET_FLAG_NONE: the system is responsible for providing and - * storing this secret (default) - * @NM_SETTING_SECRET_FLAG_AGENT_OWNED: a user secret agent is responsible - * for providing and storing this secret; when it is required agents will be - * asked to retrieve it - * @NM_SETTING_SECRET_FLAG_NOT_SAVED: this secret should not be saved, but - * should be requested from the user each time it is needed - * @NM_SETTING_SECRET_FLAG_NOT_REQUIRED: in situations where it cannot be - * automatically determined that the secret is required (some VPNs and PPP - * providers don't require all secrets) this flag indicates that the specific - * secret is not required - * - * These flags indicate specific behavior related to handling of a secret. Each - * secret has a corresponding set of these flags which indicate how the secret - * is to be stored and/or requested when it is needed. - * - **/ -typedef enum { - NM_SETTING_SECRET_FLAG_NONE = 0x00000000, - NM_SETTING_SECRET_FLAG_AGENT_OWNED = 0x00000001, - NM_SETTING_SECRET_FLAG_NOT_SAVED = 0x00000002, - NM_SETTING_SECRET_FLAG_NOT_REQUIRED = 0x00000004 - - /* NOTE: if adding flags, update nm-setting-private.h as well */ -} NMSettingSecretFlags; - -/** - * NMSettingCompareFlags: - * @NM_SETTING_COMPARE_FLAG_EXACT: match all properties exactly - * @NM_SETTING_COMPARE_FLAG_FUZZY: match only important attributes, like SSID, - * type, security settings, etc. Does not match, for example, connection ID - * or UUID. - * @NM_SETTING_COMPARE_FLAG_IGNORE_ID: ignore the connection's ID - * @NM_SETTING_COMPARE_FLAG_IGNORE_SECRETS: ignore all secrets - * @NM_SETTING_COMPARE_FLAG_IGNORE_AGENT_OWNED_SECRETS: ignore secrets for which - * the secret's flags indicate the secret is owned by a user secret agent - * (ie, the secret's flag includes @NM_SETTING_SECRET_FLAG_AGENT_OWNED) - * @NM_SETTING_COMPARE_FLAG_IGNORE_NOT_SAVED_SECRETS: ignore secrets for which - * the secret's flags indicate the secret should not be saved to persistent - * storage (ie, the secret's flag includes @NM_SETTING_SECRET_FLAG_NOT_SAVED) - * @NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT: if this flag is set, - * nm_setting_diff() and nm_connection_diff() will also include properties that - * are set to their default value. See also @NM_SETTING_COMPARE_FLAG_DIFF_RESULT_NO_DEFAULT. - * @NM_SETTING_COMPARE_FLAG_DIFF_RESULT_NO_DEFAULT: if this flag is set, - * nm_setting_diff() and nm_connection_diff() will not include properties that - * are set to their default value. This is the opposite of - * @NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT. If both flags are set together, - * @NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT wins. If both flags are unset, - * this means to exclude default properties if there is a setting to compare, - * but include all properties, if the setting 'b' is missing. This is the legacy - * behaviour of libnm-util, where nm_setting_diff() behaved differently depending - * on whether the setting 'b' was available. If @NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT - * is set, nm_setting_diff() will also set the flags @NM_SETTING_DIFF_RESULT_IN_A_DEFAULT - * and @NM_SETTING_DIFF_RESULT_IN_B_DEFAULT, if the values are default values. - * - * These flags modify the comparison behavior when comparing two settings or - * two connections. - * - **/ -typedef enum { - NM_SETTING_COMPARE_FLAG_EXACT = 0x00000000, - NM_SETTING_COMPARE_FLAG_FUZZY = 0x00000001, - NM_SETTING_COMPARE_FLAG_IGNORE_ID = 0x00000002, - NM_SETTING_COMPARE_FLAG_IGNORE_SECRETS = 0x00000004, - NM_SETTING_COMPARE_FLAG_IGNORE_AGENT_OWNED_SECRETS = 0x00000008, - NM_SETTING_COMPARE_FLAG_IGNORE_NOT_SAVED_SECRETS = 0x00000010, - NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT = 0x00000020, - NM_SETTING_COMPARE_FLAG_DIFF_RESULT_NO_DEFAULT = 0x00000040, - - /* 0x80000000 is used for a private flag */ -} NMSettingCompareFlags; - -/** - * NMSetting: - * - * The NMSetting struct contains only private data. - * It should only be accessed through the functions described below. - */ -typedef struct { - GObject parent; -} NMSetting; - -/** - * NMSettingClearSecretsWithFlagsFn: - * @setting: The setting for which secrets are being iterated - * @secret: The secret's name - * @flags: The secret's flags, eg %NM_SETTING_SECRET_FLAG_AGENT_OWNED - * @user_data: User data passed to nm_connection_clear_secrets_with_flags() - * - * Returns: %TRUE to clear the secret, %FALSE to not clear the secret - */ -typedef gboolean (*NMSettingClearSecretsWithFlagsFn) (NMSetting *setting, - const char *secret, - NMSettingSecretFlags flags, - gpointer user_data); - -typedef struct { - GObjectClass parent; - - /* Virtual functions */ - int (*verify) (NMSetting *setting, - GSList *all_settings, - GError **error); - - GPtrArray *(*need_secrets) (NMSetting *setting); - - int (*update_one_secret) (NMSetting *setting, - const char *key, - GValue *value, - GError **error); - - gboolean (*get_secret_flags) (NMSetting *setting, - const char *secret_name, - gboolean verify_secret, - NMSettingSecretFlags *out_flags, - GError **error); - - gboolean (*set_secret_flags) (NMSetting *setting, - const char *secret_name, - gboolean verify_secret, - NMSettingSecretFlags flags, - GError **error); - - /* Returns TRUE if the given property contains the same value in both settings */ - gboolean (*compare_property) (NMSetting *setting, - NMSetting *other, - const GParamSpec *prop_spec, - NMSettingCompareFlags flags); - - gboolean (*clear_secrets_with_flags) (NMSetting *setting, - GParamSpec *pspec, - NMSettingClearSecretsWithFlagsFn func, - gpointer user_data); - - const char *(*get_virtual_iface_name) (NMSetting *setting); - - /* Padding for future expansion */ - void (*_reserved1) (void); -} NMSettingClass; - -/** - * NMSettingValueIterFn: - * @setting: The setting for which properties are being iterated, given to - * nm_setting_enumerate_values() - * @key: The value/property name - * @value: The property's value - * @flags: The property's flags, like %NM_SETTING_PARAM_SECRET - * @user_data: User data passed to nm_setting_enumerate_values() - */ -typedef void (*NMSettingValueIterFn) (NMSetting *setting, - const char *key, - const GValue *value, - GParamFlags flags, - gpointer user_data); - -GType nm_setting_get_type (void); - -/** - * NMSettingHashFlags: - * @NM_SETTING_HASH_FLAG_ALL: hash all properties (including secrets) - * @NM_SETTING_HASH_FLAG_NO_SECRETS: do not include secrets - * @NM_SETTING_HASH_FLAG_ONLY_SECRETS: only hash secrets - * - * These flags determine which properties are added to the resulting hash - * when calling nm_setting_to_hash(). - * - **/ -typedef enum { - NM_SETTING_HASH_FLAG_ALL = 0x00000000, - NM_SETTING_HASH_FLAG_NO_SECRETS = 0x00000001, - NM_SETTING_HASH_FLAG_ONLY_SECRETS = 0x00000002, -} NMSettingHashFlags; - -GHashTable *nm_setting_to_hash (NMSetting *setting, - NMSettingHashFlags flags); - -NMSetting *nm_setting_new_from_hash (GType setting_type, - GHashTable *hash); - -NMSetting *nm_setting_duplicate (NMSetting *setting); - -const char *nm_setting_get_name (NMSetting *setting); - -gboolean nm_setting_verify (NMSetting *setting, - GSList *all_settings, - GError **error); - -gboolean nm_setting_compare (NMSetting *a, - NMSetting *b, - NMSettingCompareFlags flags); - -/** - * NMSettingDiffResult: - * @NM_SETTING_DIFF_RESULT_UNKNOWN: unknown result - * @NM_SETTING_DIFF_RESULT_IN_A: the property is present in setting A - * @NM_SETTING_DIFF_RESULT_IN_B: the property is present in setting B - * @NM_SETTING_DIFF_RESULT_IN_A_DEFAULT: the property is present in - * setting A but is set to the default value. This flag is only set, - * if you specify @NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT. - * @NM_SETTING_DIFF_RESULT_IN_B_DEFAULT: analog to @NM_SETTING_DIFF_RESULT_IN_A_DEFAULT. - * - * These values indicate the result of a setting difference operation. - **/ -typedef enum { - NM_SETTING_DIFF_RESULT_UNKNOWN = 0x00000000, - NM_SETTING_DIFF_RESULT_IN_A = 0x00000001, - NM_SETTING_DIFF_RESULT_IN_B = 0x00000002, - NM_SETTING_DIFF_RESULT_IN_A_DEFAULT = 0x00000004, - NM_SETTING_DIFF_RESULT_IN_B_DEFAULT = 0x00000004, -} NMSettingDiffResult; - -gboolean nm_setting_diff (NMSetting *a, - NMSetting *b, - NMSettingCompareFlags flags, - gboolean invert_results, - GHashTable **results); - -void nm_setting_enumerate_values (NMSetting *setting, - NMSettingValueIterFn func, - gpointer user_data); - -char *nm_setting_to_string (NMSetting *setting); - -/* Secrets */ -void nm_setting_clear_secrets (NMSetting *setting); - -void nm_setting_clear_secrets_with_flags (NMSetting *setting, - NMSettingClearSecretsWithFlagsFn func, - gpointer user_data); - -GPtrArray *nm_setting_need_secrets (NMSetting *setting); -gboolean nm_setting_update_secrets (NMSetting *setting, - GHashTable *secrets, - GError **error); - -gboolean nm_setting_get_secret_flags (NMSetting *setting, - const char *secret_name, - NMSettingSecretFlags *out_flags, - GError **error); - -gboolean nm_setting_set_secret_flags (NMSetting *setting, - const char *secret_name, - NMSettingSecretFlags flags, - GError **error); - -const char *nm_setting_get_virtual_iface_name (NMSetting *setting); - -G_END_DECLS - -#endif /* NM_SETTING_H */ diff --git a/libnm-util/nm-utils-enum-types.c.template b/libnm-util/nm-utils-enum-types.c.template deleted file mode 100644 index e6505d343f..0000000000 --- a/libnm-util/nm-utils-enum-types.c.template +++ /dev/null @@ -1,65 +0,0 @@ -/*** BEGIN file-header ***/ -#include "config.h" - -#include "nm-utils-enum-types.h" - -#include "nm-version-macros.h" -#include "nm-connection.h" -#include "nm-setting.h" -#include "nm-setting-8021x.h" -#include "nm-setting-adsl.h" -#include "nm-setting-bluetooth.h" -#include "nm-setting-bond.h" -#include "nm-setting-team.h" -#include "nm-setting-team-port.h" -#include "nm-setting-bridge.h" -#include "nm-setting-bridge-port.h" -#include "nm-setting-connection.h" -#include "nm-setting-dcb.h" -#include "nm-setting-infiniband.h" -#include "nm-setting-ip4-config.h" -#include "nm-setting-vlan.h" -#include "nm-setting-ip6-config.h" -#include "nm-setting-ppp.h" -#include "nm-setting-pppoe.h" -#include "nm-setting-serial.h" -#include "nm-setting-generic.h" -#include "nm-setting-gsm.h" -#include "nm-setting-cdma.h" -#include "nm-setting-olpc-mesh.h" -#include "nm-setting-wimax.h" -#include "nm-setting-wired.h" -#include "nm-setting-wireless.h" -#include "nm-setting-wireless-security.h" -#include "nm-setting-vpn.h" -#include "nm-utils.h" -#include "nm-version.h" -/*** END file-header ***/ - -/*** BEGIN value-header ***/ -GType -@enum_name@_get_type (void) -{ - static volatile gsize g_define_type_id__volatile = 0; - - if (g_once_init_enter (&g_define_type_id__volatile)) - { - static const G@Type@Value values[] = { -/*** END value-header ***/ - -/*** BEGIN value-production ***/ - { @VALUENAME@, "@VALUENAME@", "@valuenick@" }, -/*** END value-production ***/ - -/*** BEGIN value-tail ***/ - { 0, NULL, NULL } - }; - GType g_define_type_id = - g_@type@_register_static (g_intern_static_string ("@EnumName@"), values); - g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); - } - - return g_define_type_id__volatile; -} - -/*** END value-tail ***/ diff --git a/libnm-util/nm-utils-enum-types.h.template b/libnm-util/nm-utils-enum-types.h.template deleted file mode 100644 index ac0cc3c848..0000000000 --- a/libnm-util/nm-utils-enum-types.h.template +++ /dev/null @@ -1,21 +0,0 @@ -/*** BEGIN file-header ***/ -#ifndef __NM_UTILS_ENUM_TYPES_H__ -#define __NM_UTILS_ENUM_TYPES_H__ - -#include <glib-object.h> - -G_BEGIN_DECLS - -/*** END file-header ***/ - -/*** BEGIN enumeration-production ***/ -GType @enum_name@_get_type (void) G_GNUC_CONST; -#define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type ()) - -/*** END enumeration-production ***/ - -/*** BEGIN file-tail ***/ -G_END_DECLS - -#endif /* __NM_UTILS_ENUM_TYPES_H__ */ -/*** END file-tail ***/ diff --git a/libnm-util/nm-utils-private.h b/libnm-util/nm-utils-private.h deleted file mode 100644 index 2436332a97..0000000000 --- a/libnm-util/nm-utils-private.h +++ /dev/null @@ -1,34 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2005 - 2008 Red Hat, Inc. - */ - -#ifndef __NM_UTILS_PRIVATE_H__ -#define __NM_UTILS_PRIVATE_H__ - -#include "nm-setting-private.h" - -gboolean _nm_utils_string_slist_validate (GSList *list, - const char **valid_values); - -gboolean _nm_utils_gvalue_array_validate (GValueArray *elements, - guint n_expected, ...); - -void _nm_value_transforms_register (void); - -#endif diff --git a/libnm-util/nm-utils.c b/libnm-util/nm-utils.c deleted file mode 100644 index eae80a04ca..0000000000 --- a/libnm-util/nm-utils.c +++ /dev/null @@ -1,2608 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2005 - 2013 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include "nm-utils.h" - -#include <string.h> -#include <stdlib.h> -#include <netinet/ether.h> -#include <linux/if_infiniband.h> -#include <uuid/uuid.h> -#include <libintl.h> -#include <gmodule.h> - -#include "nm-gvaluearray-compat.h" -#include "nm-utils-private.h" -#include "nm-dbus-glib-types.h" -#include "nm-setting-private.h" -#include "crypto.h" - -/** - * SECTION:nm-utils - * @short_description: Utility functions - * @include: nm-utils.h - * - * A collection of utility functions for working with SSIDs, IP addresses, Wi-Fi - * access points and devices, among other things. - */ - -struct EncodingTriplet -{ - const char *encoding1; - const char *encoding2; - const char *encoding3; -}; - -struct IsoLangToEncodings -{ - const char *lang; - struct EncodingTriplet encodings; -}; - -/* 5-letter language codes */ -static const struct IsoLangToEncodings isoLangEntries5[] = -{ - /* Simplified Chinese */ - { "zh_cn", {"euc-cn", "gb2312", "gb18030"} }, /* PRC */ - { "zh_sg", {"euc-cn", "gb2312", "gb18030"} }, /* Singapore */ - - /* Traditional Chinese */ - { "zh_tw", {"big5", "euc-tw", NULL} }, /* Taiwan */ - { "zh_hk", {"big5", "euc-tw", "big5-hkcs"} },/* Hong Kong */ - { "zh_mo", {"big5", "euc-tw", NULL} }, /* Macau */ - - /* Table end */ - { NULL, {NULL, NULL, NULL} } -}; - -/* 2-letter language codes; we don't care about the other 3 in this table */ -static const struct IsoLangToEncodings isoLangEntries2[] = -{ - /* Japanese */ - { "ja", {"euc-jp", "shift_jis", "iso-2022-jp"} }, - - /* Korean */ - { "ko", {"euc-kr", "iso-2022-kr", "johab"} }, - - /* Thai */ - { "th", {"iso-8859-11","windows-874", NULL} }, - - /* Central European */ - { "hu", {"iso-8859-2", "windows-1250", NULL} }, /* Hungarian */ - { "cs", {"iso-8859-2", "windows-1250", NULL} }, /* Czech */ - { "hr", {"iso-8859-2", "windows-1250", NULL} }, /* Croatian */ - { "pl", {"iso-8859-2", "windows-1250", NULL} }, /* Polish */ - { "ro", {"iso-8859-2", "windows-1250", NULL} }, /* Romanian */ - { "sk", {"iso-8859-2", "windows-1250", NULL} }, /* Slovakian */ - { "sl", {"iso-8859-2", "windows-1250", NULL} }, /* Slovenian */ - { "sh", {"iso-8859-2", "windows-1250", NULL} }, /* Serbo-Croatian */ - - /* Cyrillic */ - { "ru", {"koi8-r", "windows-1251", "iso-8859-5"} }, /* Russian */ - { "be", {"koi8-r", "windows-1251", "iso-8859-5"} }, /* Belorussian */ - { "bg", {"windows-1251","koi8-r", "iso-8859-5"} }, /* Bulgarian */ - { "mk", {"koi8-r", "windows-1251", "iso-8859-5"} }, /* Macedonian */ - { "sr", {"koi8-r", "windows-1251", "iso-8859-5"} }, /* Serbian */ - { "uk", {"koi8-u", "koi8-r", "windows-1251"} }, /* Ukrainian */ - - /* Arabic */ - { "ar", {"iso-8859-6", "windows-1256", NULL} }, - - /* Baltic */ - { "et", {"iso-8859-4", "windows-1257", NULL} }, /* Estonian */ - { "lt", {"iso-8859-4", "windows-1257", NULL} }, /* Lithuanian */ - { "lv", {"iso-8859-4", "windows-1257", NULL} }, /* Latvian */ - - /* Greek */ - { "el", {"iso-8859-7", "windows-1253", NULL} }, - - /* Hebrew */ - { "he", {"iso-8859-8", "windows-1255", NULL} }, - { "iw", {"iso-8859-8", "windows-1255", NULL} }, - - /* Turkish */ - { "tr", {"iso-8859-9", "windows-1254", NULL} }, - - /* Table end */ - { NULL, {NULL, NULL, NULL} } -}; - -static GHashTable * langToEncodings5 = NULL; -static GHashTable * langToEncodings2 = NULL; - -static void -init_lang_to_encodings_hash (void) -{ - struct IsoLangToEncodings *enc; - - if (G_UNLIKELY (langToEncodings5 == NULL)) { - /* Five-letter codes */ - enc = (struct IsoLangToEncodings *) &isoLangEntries5[0]; - langToEncodings5 = g_hash_table_new (g_str_hash, g_str_equal); - while (enc->lang) { - g_hash_table_insert (langToEncodings5, (gpointer) enc->lang, - (gpointer) &enc->encodings); - enc++; - } - } - - if (G_UNLIKELY (langToEncodings2 == NULL)) { - /* Two-letter codes */ - enc = (struct IsoLangToEncodings *) &isoLangEntries2[0]; - langToEncodings2 = g_hash_table_new (g_str_hash, g_str_equal); - while (enc->lang) { - g_hash_table_insert (langToEncodings2, (gpointer) enc->lang, - (gpointer) &enc->encodings); - enc++; - } - } -} - -static gboolean -get_encodings_for_lang (const char *lang, - char **encoding1, - char **encoding2, - char **encoding3) -{ - struct EncodingTriplet *encodings; - gboolean success = FALSE; - char *tmp_lang; - - g_return_val_if_fail (lang != NULL, FALSE); - g_return_val_if_fail (encoding1 != NULL, FALSE); - g_return_val_if_fail (encoding2 != NULL, FALSE); - g_return_val_if_fail (encoding3 != NULL, FALSE); - - *encoding1 = "iso-8859-1"; - *encoding2 = "windows-1251"; - *encoding3 = NULL; - - init_lang_to_encodings_hash (); - - tmp_lang = g_strdup (lang); - if ((encodings = g_hash_table_lookup (langToEncodings5, tmp_lang))) { - *encoding1 = (char *) encodings->encoding1; - *encoding2 = (char *) encodings->encoding2; - *encoding3 = (char *) encodings->encoding3; - success = TRUE; - } - - /* Truncate tmp_lang to length of 2 */ - if (strlen (tmp_lang) > 2) - tmp_lang[2] = '\0'; - if (!success && (encodings = g_hash_table_lookup (langToEncodings2, tmp_lang))) { - *encoding1 = (char *) encodings->encoding1; - *encoding2 = (char *) encodings->encoding2; - *encoding3 = (char *) encodings->encoding3; - success = TRUE; - } - - g_free (tmp_lang); - return success; -} - -/* init, deinit for libnm_util */ - -static void __attribute__((constructor)) -_check_symbols (void) -{ - GModule *self; - gpointer func; - - self = g_module_open (NULL, 0); - if (g_module_symbol (self, "nm_device_state_get_type", &func)) - g_error ("libnm symbols detected; Mixing libnm with libnm-util/libnm-glib is not supported"); - g_module_close (self); -} - -static gboolean initialized = FALSE; - -/** - * nm_utils_init: - * @error: location to store error, or %NULL - * - * Initializes libnm-util; should be called when starting any program that - * uses libnm-util. This function can be called more than once. - * - * Returns: %TRUE if the initialization was successful, %FALSE on failure. - **/ -gboolean -nm_utils_init (GError **error) -{ - if (!initialized) { - initialized = TRUE; - - bindtextdomain (GETTEXT_PACKAGE, NMLOCALEDIR); - bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); - - if (!crypto_init (error)) - return FALSE; - - _nm_value_transforms_register (); - } - return TRUE; -} - -/** - * nm_utils_deinit: - * - * No-op. Although this function still exists for ABI compatibility reasons, it - * does not have any effect, and does not ever need to be called. - **/ -void -nm_utils_deinit (void) -{ -} - -/* ssid helpers */ - -/** - * nm_utils_ssid_to_utf8: - * @ssid: a byte array containing the SSID data - * - * Wi-Fi SSIDs are byte arrays, they are _not_ strings. Thus, an SSID may - * contain embedded NULLs and other unprintable characters. Often it is - * useful to print the SSID out for debugging purposes, but that should be the - * _only_ use of this function. Do not use this function for any persistent - * storage of the SSID, since the printable SSID returned from this function - * cannot be converted back into the real SSID of the access point. - * - * This function does almost everything humanly possible to convert the input - * into a printable UTF-8 string, using roughly the following procedure: - * - * 1) if the input data is already UTF-8 safe, no conversion is performed - * 2) attempts to get the current system language from the LANG environment - * variable, and depending on the language, uses a table of alternative - * encodings to try. For example, if LANG=hu_HU, the table may first try - * the ISO-8859-2 encoding, and if that fails, try the Windows-1250 encoding. - * If all fallback encodings fail, replaces non-UTF-8 characters with '?'. - * 3) If the system language was unable to be determined, falls back to the - * ISO-8859-1 encoding, then to the Windows-1251 encoding. - * 4) If step 3 fails, replaces non-UTF-8 characters with '?'. - * - * Again, this function should be used for debugging and display purposes - * _only_. - * - * Returns: (transfer full): an allocated string containing a UTF-8 - * representation of the SSID, which must be freed by the caller using g_free(). - * Returns %NULL on errors. - **/ -char * -nm_utils_ssid_to_utf8 (const GByteArray *ssid) -{ - char *converted = NULL; - char *lang, *e1 = NULL, *e2 = NULL, *e3 = NULL; - - g_return_val_if_fail (ssid != NULL, NULL); - - if (g_utf8_validate ((const char *) ssid->data, ssid->len, NULL)) - return g_strndup ((const char *) ssid->data, ssid->len); - - /* LANG may be a good encoding hint */ - g_get_charset ((const char **)(&e1)); - if ((lang = getenv ("LANG"))) { - char * dot; - - lang = g_ascii_strdown (lang, -1); - if ((dot = strchr (lang, '.'))) - *dot = '\0'; - - get_encodings_for_lang (lang, &e1, &e2, &e3); - g_free (lang); - } - - converted = g_convert ((const char *) ssid->data, ssid->len, "UTF-8", e1, NULL, NULL, NULL); - if (!converted && e2) - converted = g_convert ((const char *) ssid->data, ssid->len, "UTF-8", e2, NULL, NULL, NULL); - - if (!converted && e3) - converted = g_convert ((const char *) ssid->data, ssid->len, "UTF-8", e3, NULL, NULL, NULL); - - if (!converted) { - converted = g_convert_with_fallback ((const char *) ssid->data, ssid->len, - "UTF-8", e1, "?", NULL, NULL, NULL); - } - - if (!converted) { - /* If there is still no converted string, the SSID probably - * contains characters not valid in the current locale. Convert - * the string to ASCII instead. - */ - - /* Use the printable range of 0x20-0x7E */ - char *valid_chars = " !\"#$%&'()*+,-./0123456789:;<=>?@" - "ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`" - "abcdefghijklmnopqrstuvwxyz{|}~"; - - converted = g_strndup ((const char *)ssid->data, ssid->len); - g_strcanon (converted, valid_chars, '?'); - } - - return converted; -} - -/* Shamelessly ripped from the Linux kernel ieee80211 stack */ -/** - * nm_utils_is_empty_ssid: - * @ssid: pointer to a buffer containing the SSID data - * @len: length of the SSID data in @ssid - * - * Different manufacturers use different mechanisms for not broadcasting the - * AP's SSID. This function attempts to detect blank/empty SSIDs using a - * number of known SSID-cloaking methods. - * - * Returns: %TRUE if the SSID is "empty", %FALSE if it is not - **/ -gboolean -nm_utils_is_empty_ssid (const guint8 * ssid, int len) -{ - /* Single white space is for Linksys APs */ - if (len == 1 && ssid[0] == ' ') - return TRUE; - - /* Otherwise, if the entire ssid is 0, we assume it is hidden */ - while (len--) { - if (ssid[len] != '\0') - return FALSE; - } - return TRUE; -} - -#define ESSID_MAX_SIZE 32 - -/** - * nm_utils_escape_ssid: - * @ssid: pointer to a buffer containing the SSID data - * @len: length of the SSID data in @ssid - * - * This function does a quick printable character conversion of the SSID, simply - * replacing embedded NULLs and non-printable characters with the hexadecimal - * representation of that character. Intended for debugging only, should not - * be used for display of SSIDs. - * - * Returns: pointer to the escaped SSID, which uses an internal static buffer - * and will be overwritten by subsequent calls to this function - **/ -const char * -nm_utils_escape_ssid (const guint8 * ssid, guint32 len) -{ - static char escaped[ESSID_MAX_SIZE * 2 + 1]; - const guint8 *s = ssid; - char *d = escaped; - - if (nm_utils_is_empty_ssid (ssid, len)) { - memcpy (escaped, "<hidden>", sizeof ("<hidden>")); - return escaped; - } - - len = MIN (len, (guint32) ESSID_MAX_SIZE); - while (len--) { - if (*s == '\0') { - *d++ = '\\'; - *d++ = '0'; - s++; - } else { - *d++ = *s++; - } - } - *d = '\0'; - return escaped; -} - -/** - * nm_utils_same_ssid: - * @ssid1: first SSID data to compare - * @ssid2: second SSID data to compare - * @ignore_trailing_null: %TRUE to ignore one trailing NULL byte - * - * Earlier versions of the Linux kernel added a NULL byte to the end of the - * SSID to enable easy printing of the SSID on the console or in a terminal, - * but this behavior was problematic (SSIDs are simply byte arrays, not strings) - * and thus was changed. This function compensates for that behavior at the - * cost of some compatibility with odd SSIDs that may legitimately have trailing - * NULLs, even though that is functionally pointless. - * - * Returns: %TRUE if the SSIDs are the same, %FALSE if they are not - **/ -gboolean -nm_utils_same_ssid (const GByteArray * ssid1, - const GByteArray * ssid2, - gboolean ignore_trailing_null) -{ - guint32 ssid1_len, ssid2_len; - - if (ssid1 == ssid2) - return TRUE; - if (!ssid1 || !ssid2) - return FALSE; - - ssid1_len = ssid1->len; - ssid2_len = ssid2->len; - if (ssid1_len && ssid2_len && ignore_trailing_null) { - if (ssid1->data[ssid1_len - 1] == '\0') - ssid1_len--; - if (ssid2->data[ssid2_len - 1] == '\0') - ssid2_len--; - } - - if (ssid1_len != ssid2_len) - return FALSE; - - return memcmp (ssid1->data, ssid2->data, ssid1_len) == 0 ? TRUE : FALSE; -} - -static void -value_destroy (gpointer data) -{ - GValue *value = (GValue *) data; - - g_value_unset (value); - g_slice_free (GValue, value); -} - -static void -value_dup (gpointer key, gpointer val, gpointer user_data) -{ - GHashTable *table = (GHashTable *) user_data; - GValue *value = (GValue *) val; - GValue *dup_value; - - dup_value = g_slice_new0 (GValue); - g_value_init (dup_value, G_VALUE_TYPE (value)); - g_value_copy (value, dup_value); - - g_hash_table_insert (table, g_strdup ((char *) key), dup_value); -} - -/** - * nm_utils_gvalue_hash_dup: - * @hash: a #GHashTable mapping string:GValue - * - * Utility function to duplicate a hash table of #GValues. - * - * Returns: (transfer container) (element-type utf8 GObject.Value): a newly allocated duplicated #GHashTable, caller must free the - * returned hash with g_hash_table_unref() or g_hash_table_destroy() - **/ -GHashTable * -nm_utils_gvalue_hash_dup (GHashTable *hash) -{ - GHashTable *table; - - g_return_val_if_fail (hash != NULL, NULL); - - table = g_hash_table_new_full (g_str_hash, g_str_equal, - g_free, - value_destroy); - - g_hash_table_foreach (hash, value_dup, table); - - return table; -} - -/** - * nm_utils_slist_free: (skip) - * @list: a #GSList - * @elem_destroy_fn: user function called for each element in @list - * - * Utility function to free a #GSList. - * - * Deprecated: use g_slist_free_full(). - **/ -void -nm_utils_slist_free (GSList *list, GDestroyNotify elem_destroy_fn) -{ - g_slist_free_full (list, elem_destroy_fn); -} - -gboolean -_nm_utils_string_slist_validate (GSList *list, const char **valid_values) -{ - GSList *iter; - - for (iter = list; iter; iter = iter->next) { - if (!g_strv_contains (valid_values, (char *) iter->data)) - return FALSE; - } - - return TRUE; -} - -gboolean -_nm_utils_gvalue_array_validate (GValueArray *elements, guint n_expected, ...) -{ - va_list args; - GValue *tmp; - int i; - gboolean valid = FALSE; - - if (n_expected != elements->n_values) - return FALSE; - - va_start (args, n_expected); - for (i = 0; i < n_expected; i++) { - tmp = g_value_array_get_nth (elements, i); - if (G_VALUE_TYPE (tmp) != va_arg (args, GType)) - goto done; - } - valid = TRUE; - -done: - va_end (args); - return valid; -} - -static gboolean -device_supports_ap_ciphers (guint32 dev_caps, - guint32 ap_flags, - gboolean static_wep) -{ - gboolean have_pair = FALSE; - gboolean have_group = FALSE; - /* Device needs to support at least one pairwise and one group cipher */ - - /* Pairwise */ - if (static_wep) { - /* Static WEP only uses group ciphers */ - have_pair = TRUE; - } else { - if (dev_caps & NM_WIFI_DEVICE_CAP_CIPHER_WEP40) - if (ap_flags & NM_802_11_AP_SEC_PAIR_WEP40) - have_pair = TRUE; - if (dev_caps & NM_WIFI_DEVICE_CAP_CIPHER_WEP104) - if (ap_flags & NM_802_11_AP_SEC_PAIR_WEP104) - have_pair = TRUE; - if (dev_caps & NM_WIFI_DEVICE_CAP_CIPHER_TKIP) - if (ap_flags & NM_802_11_AP_SEC_PAIR_TKIP) - have_pair = TRUE; - if (dev_caps & NM_WIFI_DEVICE_CAP_CIPHER_CCMP) - if (ap_flags & NM_802_11_AP_SEC_PAIR_CCMP) - have_pair = TRUE; - } - - /* Group */ - if (dev_caps & NM_WIFI_DEVICE_CAP_CIPHER_WEP40) - if (ap_flags & NM_802_11_AP_SEC_GROUP_WEP40) - have_group = TRUE; - if (dev_caps & NM_WIFI_DEVICE_CAP_CIPHER_WEP104) - if (ap_flags & NM_802_11_AP_SEC_GROUP_WEP104) - have_group = TRUE; - if (!static_wep) { - if (dev_caps & NM_WIFI_DEVICE_CAP_CIPHER_TKIP) - if (ap_flags & NM_802_11_AP_SEC_GROUP_TKIP) - have_group = TRUE; - if (dev_caps & NM_WIFI_DEVICE_CAP_CIPHER_CCMP) - if (ap_flags & NM_802_11_AP_SEC_GROUP_CCMP) - have_group = TRUE; - } - - return (have_pair && have_group); -} - -/** - * nm_utils_ap_mode_security_valid: - * @type: the security type to check device capabilities against, - * e.g. #NMU_SEC_STATIC_WEP - * @wifi_caps: bitfield of the capabilities of the specific Wi-Fi device, e.g. - * #NM_WIFI_DEVICE_CAP_CIPHER_WEP40 - * - * Given a set of device capabilities, and a desired security type to check - * against, determines whether the combination of device capabilities and - * desired security type are valid for AP/Hotspot connections. - * - * Returns: %TRUE if the device capabilities are compatible with the desired - * @type, %FALSE if they are not. - * - * Since: 0.9.8 - **/ -gboolean -nm_utils_ap_mode_security_valid (NMUtilsSecurityType type, - NMDeviceWifiCapabilities wifi_caps) -{ - if (!(wifi_caps & NM_WIFI_DEVICE_CAP_AP)) - return FALSE; - - /* Return TRUE for any security that wpa_supplicant's lightweight AP - * mode can handle: which is open, WEP, and WPA/WPA2 PSK. - */ - switch (type) { - case NMU_SEC_NONE: - case NMU_SEC_STATIC_WEP: - case NMU_SEC_WPA_PSK: - case NMU_SEC_WPA2_PSK: - return TRUE; - default: - break; - } - return FALSE; -} - -/** - * nm_utils_security_valid: - * @type: the security type to check AP flags and device capabilities against, - * e.g. #NMU_SEC_STATIC_WEP - * @wifi_caps: bitfield of the capabilities of the specific Wi-Fi device, e.g. - * #NM_WIFI_DEVICE_CAP_CIPHER_WEP40 - * @have_ap: whether the @ap_flags, @ap_wpa, and @ap_rsn arguments are valid - * @adhoc: whether the capabilities being tested are from an Ad-Hoc AP (IBSS) - * @ap_flags: bitfield of AP capabilities, e.g. #NM_802_11_AP_FLAGS_PRIVACY - * @ap_wpa: bitfield of AP capabilities derived from the AP's WPA beacon, - * e.g. (#NM_802_11_AP_SEC_PAIR_TKIP | #NM_802_11_AP_SEC_KEY_MGMT_PSK) - * @ap_rsn: bitfield of AP capabilities derived from the AP's RSN/WPA2 beacon, - * e.g. (#NM_802_11_AP_SEC_PAIR_CCMP | #NM_802_11_AP_SEC_PAIR_TKIP) - * - * Given a set of device capabilities, and a desired security type to check - * against, determines whether the combination of device, desired security - * type, and AP capabilities intersect. - * - * NOTE: this function cannot handle checking security for AP/Hotspot mode; - * use nm_utils_ap_mode_security_valid() instead. - * - * Returns: %TRUE if the device capabilities and AP capabilities intersect and are - * compatible with the desired @type, %FALSE if they are not - **/ -gboolean -nm_utils_security_valid (NMUtilsSecurityType type, - NMDeviceWifiCapabilities wifi_caps, - gboolean have_ap, - gboolean adhoc, - NM80211ApFlags ap_flags, - NM80211ApSecurityFlags ap_wpa, - NM80211ApSecurityFlags ap_rsn) -{ - gboolean good = TRUE; - - if (!have_ap) { - if (type == NMU_SEC_NONE) - return TRUE; - if ( (type == NMU_SEC_STATIC_WEP) - || ((type == NMU_SEC_DYNAMIC_WEP) && !adhoc) - || ((type == NMU_SEC_LEAP) && !adhoc)) { - if (wifi_caps & (NM_WIFI_DEVICE_CAP_CIPHER_WEP40 | NM_WIFI_DEVICE_CAP_CIPHER_WEP104)) - return TRUE; - else - return FALSE; - } - } - - switch (type) { - case NMU_SEC_NONE: - g_assert (have_ap); - if (ap_flags & NM_802_11_AP_FLAGS_PRIVACY) - return FALSE; - if (ap_wpa || ap_rsn) - return FALSE; - break; - case NMU_SEC_LEAP: /* require PRIVACY bit for LEAP? */ - if (adhoc) - return FALSE; - /* fall through */ - case NMU_SEC_STATIC_WEP: - g_assert (have_ap); - if (!(ap_flags & NM_802_11_AP_FLAGS_PRIVACY)) - return FALSE; - if (ap_wpa || ap_rsn) { - if (!device_supports_ap_ciphers (wifi_caps, ap_wpa, TRUE)) - if (!device_supports_ap_ciphers (wifi_caps, ap_rsn, TRUE)) - return FALSE; - } - break; - case NMU_SEC_DYNAMIC_WEP: - if (adhoc) - return FALSE; - g_assert (have_ap); - if (ap_rsn || !(ap_flags & NM_802_11_AP_FLAGS_PRIVACY)) - return FALSE; - /* Some APs broadcast minimal WPA-enabled beacons that must be handled */ - if (ap_wpa) { - if (!(ap_wpa & NM_802_11_AP_SEC_KEY_MGMT_802_1X)) - return FALSE; - if (!device_supports_ap_ciphers (wifi_caps, ap_wpa, FALSE)) - return FALSE; - } - break; - case NMU_SEC_WPA_PSK: - if (adhoc) - return FALSE; /* FIXME: Kernel WPA Ad-Hoc support is buggy */ - if (!(wifi_caps & NM_WIFI_DEVICE_CAP_WPA)) - return FALSE; - if (have_ap) { - /* Ad-Hoc WPA APs won't necessarily have the PSK flag set, and - * they don't have any pairwise ciphers. */ - if (adhoc) { - /* coverity[dead_error_line] */ - if ( (ap_wpa & NM_802_11_AP_SEC_GROUP_TKIP) - && (wifi_caps & NM_WIFI_DEVICE_CAP_CIPHER_TKIP)) - return TRUE; - if ( (ap_wpa & NM_802_11_AP_SEC_GROUP_CCMP) - && (wifi_caps & NM_WIFI_DEVICE_CAP_CIPHER_CCMP)) - return TRUE; - } else { - if (ap_wpa & NM_802_11_AP_SEC_KEY_MGMT_PSK) { - if ( (ap_wpa & NM_802_11_AP_SEC_PAIR_TKIP) - && (wifi_caps & NM_WIFI_DEVICE_CAP_CIPHER_TKIP)) - return TRUE; - if ( (ap_wpa & NM_802_11_AP_SEC_PAIR_CCMP) - && (wifi_caps & NM_WIFI_DEVICE_CAP_CIPHER_CCMP)) - return TRUE; - } - } - return FALSE; - } - break; - case NMU_SEC_WPA2_PSK: - if (adhoc) - return FALSE; /* FIXME: Kernel WPA Ad-Hoc support is buggy */ - if (!(wifi_caps & NM_WIFI_DEVICE_CAP_RSN)) - return FALSE; - if (have_ap) { - /* Ad-Hoc WPA APs won't necessarily have the PSK flag set, and - * they don't have any pairwise ciphers, nor any RSA flags yet. */ - if (adhoc) { - /* coverity[dead_error_line] */ - if (wifi_caps & NM_WIFI_DEVICE_CAP_CIPHER_TKIP) - return TRUE; - if (wifi_caps & NM_WIFI_DEVICE_CAP_CIPHER_CCMP) - return TRUE; - } else { - if (ap_rsn & NM_802_11_AP_SEC_KEY_MGMT_PSK) { - if ( (ap_rsn & NM_802_11_AP_SEC_PAIR_TKIP) - && (wifi_caps & NM_WIFI_DEVICE_CAP_CIPHER_TKIP)) - return TRUE; - if ( (ap_rsn & NM_802_11_AP_SEC_PAIR_CCMP) - && (wifi_caps & NM_WIFI_DEVICE_CAP_CIPHER_CCMP)) - return TRUE; - } - } - return FALSE; - } - break; - case NMU_SEC_WPA_ENTERPRISE: - if (adhoc) - return FALSE; - if (!(wifi_caps & NM_WIFI_DEVICE_CAP_WPA)) - return FALSE; - if (have_ap) { - if (!(ap_wpa & NM_802_11_AP_SEC_KEY_MGMT_802_1X)) - return FALSE; - /* Ensure at least one WPA cipher is supported */ - if (!device_supports_ap_ciphers (wifi_caps, ap_wpa, FALSE)) - return FALSE; - } - break; - case NMU_SEC_WPA2_ENTERPRISE: - if (adhoc) - return FALSE; - if (!(wifi_caps & NM_WIFI_DEVICE_CAP_RSN)) - return FALSE; - if (have_ap) { - if (!(ap_rsn & NM_802_11_AP_SEC_KEY_MGMT_802_1X)) - return FALSE; - /* Ensure at least one WPA cipher is supported */ - if (!device_supports_ap_ciphers (wifi_caps, ap_rsn, FALSE)) - return FALSE; - } - break; - default: - good = FALSE; - break; - } - - return good; -} - -/** - * nm_utils_wep_key_valid: - * @key: a string that might be a WEP key - * @wep_type: the #NMWepKeyType type of the WEP key - * - * Checks if @key is a valid WEP key - * - * Returns: %TRUE if @key is a WEP key, %FALSE if not - * - * Since: 0.9.8 - */ -gboolean -nm_utils_wep_key_valid (const char *key, NMWepKeyType wep_type) -{ - int keylen, i; - - if (!key) - return FALSE; - - keylen = strlen (key); - if ( wep_type == NM_WEP_KEY_TYPE_KEY - || wep_type == NM_WEP_KEY_TYPE_UNKNOWN) { - if (keylen == 10 || keylen == 26) { - /* Hex key */ - for (i = 0; i < keylen; i++) { - if (!g_ascii_isxdigit (key[i])) - return FALSE; - } - } else if (keylen == 5 || keylen == 13) { - /* ASCII key */ - for (i = 0; i < keylen; i++) { - if (!g_ascii_isprint (key[i])) - return FALSE; - } - } else - return FALSE; - - } else if (wep_type == NM_WEP_KEY_TYPE_PASSPHRASE) { - if (!keylen || keylen > 64) - return FALSE; - } - - return TRUE; -} - -/** - * nm_utils_wpa_psk_valid: - * @psk: a string that might be a WPA PSK - * - * Checks if @psk is a valid WPA PSK - * - * Returns: %TRUE if @psk is a WPA PSK, %FALSE if not - * - * Since: 0.9.8 - */ -gboolean -nm_utils_wpa_psk_valid (const char *psk) -{ - int psklen, i; - - if (!psk) - return FALSE; - - psklen = strlen (psk); - if (psklen < 8 || psklen > 64) - return FALSE; - - if (psklen == 64) { - /* Hex PSK */ - for (i = 0; i < psklen; i++) { - if (!g_ascii_isxdigit (psk[i])) - return FALSE; - } - } - - return TRUE; -} - -/** - * nm_utils_ip4_addresses_from_gvalue: - * @value: #GValue containing a #GPtrArray of #GArrays of #guint32s - * - * Utility function to convert a #GPtrArray of #GArrays of #guint32s representing - * a list of NetworkManager IPv4 addresses (which is a tuple of address, gateway, - * and prefix) into a #GSList of #NMIP4Address objects. The specific format of - * this serialization is not guaranteed to be stable and the #GArray may be - * extended in the future. - * - * Returns: (transfer full) (element-type NMIP4Address): a newly allocated #GSList of #NMIP4Address objects - **/ -GSList * -nm_utils_ip4_addresses_from_gvalue (const GValue *value) -{ - GPtrArray *addresses; - int i; - GSList *list = NULL; - - addresses = (GPtrArray *) g_value_get_boxed (value); - for (i = 0; addresses && (i < addresses->len); i++) { - GArray *array = (GArray *) g_ptr_array_index (addresses, i); - NMIP4Address *addr; - - if (array->len < 3) { - g_warning ("Ignoring invalid IP4 address"); - continue; - } - - addr = nm_ip4_address_new (); - nm_ip4_address_set_address (addr, g_array_index (array, guint32, 0)); - nm_ip4_address_set_prefix (addr, g_array_index (array, guint32, 1)); - nm_ip4_address_set_gateway (addr, g_array_index (array, guint32, 2)); - list = g_slist_prepend (list, addr); - } - - return g_slist_reverse (list); -} - -/** - * nm_utils_ip4_addresses_to_gvalue: - * @list: (element-type NMIP4Address): a list of #NMIP4Address objects - * @value: a pointer to a #GValue into which to place the converted addresses, - * which should be unset by the caller (when no longer needed) with - * g_value_unset(). - * - * Utility function to convert a #GSList of #NMIP4Address objects into a - * #GPtrArray of #GArrays of #guint32s representing a list of NetworkManager IPv4 - * addresses (which is a tuple of address, gateway, and prefix). The specific - * format of this serialization is not guaranteed to be stable and may be - * extended in the future. - **/ -void -nm_utils_ip4_addresses_to_gvalue (GSList *list, GValue *value) -{ - GPtrArray *addresses; - GSList *iter; - - addresses = g_ptr_array_new (); - - for (iter = list; iter; iter = iter->next) { - NMIP4Address *addr = (NMIP4Address *) iter->data; - GArray *array; - guint32 tmp; - - array = g_array_sized_new (FALSE, TRUE, sizeof (guint32), 3); - - tmp = nm_ip4_address_get_address (addr); - g_array_append_val (array, tmp); - - tmp = nm_ip4_address_get_prefix (addr); - g_array_append_val (array, tmp); - - tmp = nm_ip4_address_get_gateway (addr); - g_array_append_val (array, tmp); - - g_ptr_array_add (addresses, array); - } - - g_value_take_boxed (value, addresses); -} - -/** - * nm_utils_ip4_routes_from_gvalue: - * @value: #GValue containing a #GPtrArray of #GArrays of #guint32s - * - * Utility function to convert a #GPtrArray of #GArrays of #guint32s representing - * a list of NetworkManager IPv4 routes (which is a tuple of route, next hop, - * prefix, and metric) into a #GSList of #NMIP4Route objects. The specific - * format of this serialization is not guaranteed to be stable and may be - * extended in the future. - * - * Returns: (transfer full) (element-type NMIP4Route): a newly allocated #GSList of #NMIP4Route objects - **/ -GSList * -nm_utils_ip4_routes_from_gvalue (const GValue *value) -{ - GPtrArray *routes; - int i; - GSList *list = NULL; - - routes = (GPtrArray *) g_value_get_boxed (value); - for (i = 0; routes && (i < routes->len); i++) { - GArray *array = (GArray *) g_ptr_array_index (routes, i); - NMIP4Route *route; - - if (array->len < 4) { - g_warning ("Ignoring invalid IP4 route"); - continue; - } - - route = nm_ip4_route_new (); - nm_ip4_route_set_dest (route, g_array_index (array, guint32, 0)); - nm_ip4_route_set_prefix (route, g_array_index (array, guint32, 1)); - nm_ip4_route_set_next_hop (route, g_array_index (array, guint32, 2)); - nm_ip4_route_set_metric (route, g_array_index (array, guint32, 3)); - list = g_slist_prepend (list, route); - } - - return g_slist_reverse (list); -} - -/** - * nm_utils_ip4_routes_to_gvalue: - * @list: (element-type NMIP4Route): a list of #NMIP4Route objects - * @value: a pointer to a #GValue into which to place the converted routes, - * which should be unset by the caller (when no longer needed) with - * g_value_unset(). - * - * Utility function to convert a #GSList of #NMIP4Route objects into a - * #GPtrArray of #GArrays of #guint32s representing a list of NetworkManager IPv4 - * routes (which is a tuple of route, next hop, prefix, and metric). The - * specific format of this serialization is not guaranteed to be stable and may - * be extended in the future. - **/ -void -nm_utils_ip4_routes_to_gvalue (GSList *list, GValue *value) -{ - GPtrArray *routes; - GSList *iter; - - routes = g_ptr_array_new (); - - for (iter = list; iter; iter = iter->next) { - NMIP4Route *route = (NMIP4Route *) iter->data; - GArray *array; - guint32 tmp; - - array = g_array_sized_new (FALSE, TRUE, sizeof (guint32), 3); - - tmp = nm_ip4_route_get_dest (route); - g_array_append_val (array, tmp); - - tmp = nm_ip4_route_get_prefix (route); - g_array_append_val (array, tmp); - - tmp = nm_ip4_route_get_next_hop (route); - g_array_append_val (array, tmp); - - tmp = nm_ip4_route_get_metric (route); - g_array_append_val (array, tmp); - - g_ptr_array_add (routes, array); - } - - g_value_take_boxed (value, routes); -} - -/** - * nm_utils_ip4_netmask_to_prefix: - * @netmask: an IPv4 netmask in network byte order - * - * Returns: the CIDR prefix represented by the netmask - **/ -guint32 -nm_utils_ip4_netmask_to_prefix (guint32 netmask) -{ - guint32 prefix; - guint8 v; - const guint8 *p = (guint8 *) &netmask; - - if (p[3]) { - prefix = 24; - v = p[3]; - } else if (p[2]) { - prefix = 16; - v = p[2]; - } else if (p[1]) { - prefix = 8; - v = p[1]; - } else { - prefix = 0; - v = p[0]; - } - - while (v) { - prefix++; - v <<= 1; - } - - return prefix; -} - -/** - * nm_utils_ip4_prefix_to_netmask: - * @prefix: a CIDR prefix - * - * Returns: the netmask represented by the prefix, in network byte order - **/ -guint32 -nm_utils_ip4_prefix_to_netmask (guint32 prefix) -{ - return _nm_utils_ip4_prefix_to_netmask (prefix); -} - -/** - * nm_utils_ip4_get_default_prefix: - * @ip: an IPv4 address (in network byte order) - * - * When the Internet was originally set up, various ranges of IP addresses were - * segmented into three network classes: A, B, and C. This function will return - * a prefix that is associated with the IP address specified defining where it - * falls in the predefined classes. - * - * Returns: the default class prefix for the given IP - **/ -/* The function is originally from ipcalc.c of Red Hat's initscripts. */ -guint32 -nm_utils_ip4_get_default_prefix (guint32 ip) -{ - return _nm_utils_ip4_get_default_prefix (ip); -} - -/** - * nm_utils_ip6_addresses_from_gvalue: - * @value: gvalue containing a GPtrArray of GValueArrays of (GArray of guchars) and #guint32 - * - * Utility function to convert a #GPtrArray of #GValueArrays of (#GArray of guchars) and #guint32 - * representing a list of NetworkManager IPv6 addresses (which is a tuple of address, - * prefix, and gateway), into a #GSList of #NMIP6Address objects. The specific format of - * this serialization is not guaranteed to be stable and the #GValueArray may be - * extended in the future. - * - * Returns: (transfer full) (element-type NMIP6Address): a newly allocated #GSList of #NMIP6Address objects - **/ -GSList * -nm_utils_ip6_addresses_from_gvalue (const GValue *value) -{ - GPtrArray *addresses; - int i; - GSList *list = NULL; - - addresses = (GPtrArray *) g_value_get_boxed (value); - - for (i = 0; addresses && (i < addresses->len); i++) { - GValueArray *elements = (GValueArray *) g_ptr_array_index (addresses, i); - GValue *tmp; - GByteArray *ba_addr; - GByteArray *ba_gw = NULL; - NMIP6Address *addr; - guint32 prefix; - - if (elements->n_values < 2 || elements->n_values > 3) { - g_warning ("%s: ignoring invalid IP6 address structure", __func__); - continue; - } - - /* Third element (gateway) is optional */ - if ( !_nm_utils_gvalue_array_validate (elements, 2, DBUS_TYPE_G_UCHAR_ARRAY, G_TYPE_UINT) - && !_nm_utils_gvalue_array_validate (elements, 3, DBUS_TYPE_G_UCHAR_ARRAY, G_TYPE_UINT, DBUS_TYPE_G_UCHAR_ARRAY)) { - g_warning ("%s: ignoring invalid IP6 address structure", __func__); - continue; - } - - tmp = g_value_array_get_nth (elements, 0); - ba_addr = g_value_get_boxed (tmp); - if (ba_addr->len != 16) { - g_warning ("%s: ignoring invalid IP6 address of length %d", - __func__, ba_addr->len); - continue; - } - - tmp = g_value_array_get_nth (elements, 1); - prefix = g_value_get_uint (tmp); - if (prefix > 128) { - g_warning ("%s: ignoring invalid IP6 prefix %d", - __func__, prefix); - continue; - } - - if (elements->n_values == 3) { - tmp = g_value_array_get_nth (elements, 2); - ba_gw = g_value_get_boxed (tmp); - if (ba_gw->len != 16) { - g_warning ("%s: ignoring invalid IP6 gateway address of length %d", - __func__, ba_gw->len); - continue; - } - } - - addr = nm_ip6_address_new (); - nm_ip6_address_set_prefix (addr, prefix); - nm_ip6_address_set_address (addr, (const struct in6_addr *) ba_addr->data); - if (ba_gw) - nm_ip6_address_set_gateway (addr, (const struct in6_addr *) ba_gw->data); - - list = g_slist_prepend (list, addr); - } - - return g_slist_reverse (list); -} - -/** - * nm_utils_ip6_addresses_to_gvalue: - * @list: (element-type NMIP6Address): a list of #NMIP6Address objects - * @value: a pointer to a #GValue into which to place the converted addresses, - * which should be unset by the caller (when no longer needed) with - * g_value_unset(). - * - * Utility function to convert a #GSList of #NMIP6Address objects into a - * #GPtrArray of #GValueArrays representing a list of NetworkManager IPv6 addresses - * (which is a tuple of address, prefix, and gateway). The specific format of - * this serialization is not guaranteed to be stable and may be extended in the - * future. - **/ -void -nm_utils_ip6_addresses_to_gvalue (GSList *list, GValue *value) -{ - GPtrArray *addresses; - GSList *iter; - - addresses = g_ptr_array_new (); - - for (iter = list; iter; iter = iter->next) { - NMIP6Address *addr = (NMIP6Address *) iter->data; - GValueArray *array; - GValue element = G_VALUE_INIT; - GByteArray *ba; - - array = g_value_array_new (3); - - /* IP address */ - g_value_init (&element, DBUS_TYPE_G_UCHAR_ARRAY); - ba = g_byte_array_new (); - g_byte_array_append (ba, (guint8 *) nm_ip6_address_get_address (addr), 16); - g_value_take_boxed (&element, ba); - g_value_array_append (array, &element); - g_value_unset (&element); - - /* Prefix */ - g_value_init (&element, G_TYPE_UINT); - g_value_set_uint (&element, nm_ip6_address_get_prefix (addr)); - g_value_array_append (array, &element); - g_value_unset (&element); - - /* Gateway */ - g_value_init (&element, DBUS_TYPE_G_UCHAR_ARRAY); - ba = g_byte_array_new (); - g_byte_array_append (ba, (guint8 *) nm_ip6_address_get_gateway (addr), 16); - g_value_take_boxed (&element, ba); - g_value_array_append (array, &element); - g_value_unset (&element); - - g_ptr_array_add (addresses, array); - } - - g_value_take_boxed (value, addresses); -} - -/** - * nm_utils_ip6_routes_from_gvalue: - * @value: #GValue containing a #GPtrArray of #GValueArrays of (#GArray of #guchars), #guint32, - * (#GArray of #guchars), and #guint32 - * - * Utility function #GPtrArray of #GValueArrays of (#GArray of #guchars), #guint32, - * (#GArray of #guchars), and #guint32 representing a list of NetworkManager IPv6 - * routes (which is a tuple of destination, prefix, next hop, and metric) - * into a #GSList of #NMIP6Route objects. The specific format of this serialization - * is not guaranteed to be stable and may be extended in the future. - * - * Returns: (transfer full) (element-type NMIP6Route): a newly allocated #GSList of #NMIP6Route objects - **/ -GSList * -nm_utils_ip6_routes_from_gvalue (const GValue *value) -{ - GPtrArray *routes; - int i; - GSList *list = NULL; - - routes = (GPtrArray *) g_value_get_boxed (value); - for (i = 0; routes && (i < routes->len); i++) { - GValueArray *route_values = (GValueArray *) g_ptr_array_index (routes, i); - GByteArray *dest, *next_hop; - guint prefix, metric; - NMIP6Route *route; - - if (!_nm_utils_gvalue_array_validate (route_values, 4, - DBUS_TYPE_G_UCHAR_ARRAY, - G_TYPE_UINT, - DBUS_TYPE_G_UCHAR_ARRAY, - G_TYPE_UINT)) { - g_warning ("Ignoring invalid IP6 route"); - continue; - } - - dest = g_value_get_boxed (g_value_array_get_nth (route_values, 0)); - if (dest->len != 16) { - g_warning ("%s: ignoring invalid IP6 dest address of length %d", - __func__, dest->len); - continue; - } - - prefix = g_value_get_uint (g_value_array_get_nth (route_values, 1)); - - next_hop = g_value_get_boxed (g_value_array_get_nth (route_values, 2)); - if (next_hop->len != 16) { - g_warning ("%s: ignoring invalid IP6 next_hop address of length %d", - __func__, next_hop->len); - continue; - } - - metric = g_value_get_uint (g_value_array_get_nth (route_values, 3)); - - route = nm_ip6_route_new (); - nm_ip6_route_set_dest (route, (struct in6_addr *)dest->data); - nm_ip6_route_set_prefix (route, prefix); - nm_ip6_route_set_next_hop (route, (struct in6_addr *)next_hop->data); - nm_ip6_route_set_metric (route, metric); - list = g_slist_prepend (list, route); - } - - return g_slist_reverse (list); -} - -/** - * nm_utils_ip6_routes_to_gvalue: - * @list: (element-type NMIP6Route): a list of #NMIP6Route objects - * @value: a pointer to a #GValue into which to place the converted routes, - * which should be unset by the caller (when no longer needed) with - * g_value_unset(). - * - * Utility function to convert a #GSList of #NMIP6Route objects into a #GPtrArray of - * #GValueArrays of (#GArray of #guchars), #guint32, (#GArray of #guchars), and #guint32 - * representing a list of NetworkManager IPv6 routes (which is a tuple of destination, - * prefix, next hop, and metric). The specific format of this serialization is not - * guaranteed to be stable and may be extended in the future. - **/ -void -nm_utils_ip6_routes_to_gvalue (GSList *list, GValue *value) -{ - GPtrArray *routes; - GSList *iter; - - routes = g_ptr_array_new (); - - for (iter = list; iter; iter = iter->next) { - NMIP6Route *route = (NMIP6Route *) iter->data; - GValueArray *array; - const struct in6_addr *addr; - GByteArray *ba; - GValue element = G_VALUE_INIT; - - array = g_value_array_new (4); - - g_value_init (&element, DBUS_TYPE_G_UCHAR_ARRAY); - addr = nm_ip6_route_get_dest (route); - ba = g_byte_array_new (); - g_byte_array_append (ba, (guchar *)addr, sizeof (*addr)); - g_value_take_boxed (&element, ba); - g_value_array_append (array, &element); - g_value_unset (&element); - - g_value_init (&element, G_TYPE_UINT); - g_value_set_uint (&element, nm_ip6_route_get_prefix (route)); - g_value_array_append (array, &element); - g_value_unset (&element); - - g_value_init (&element, DBUS_TYPE_G_UCHAR_ARRAY); - addr = nm_ip6_route_get_next_hop (route); - ba = g_byte_array_new (); - g_byte_array_append (ba, (guchar *)addr, sizeof (*addr)); - g_value_take_boxed (&element, ba); - g_value_array_append (array, &element); - g_value_unset (&element); - - g_value_init (&element, G_TYPE_UINT); - g_value_set_uint (&element, nm_ip6_route_get_metric (route)); - g_value_array_append (array, &element); - g_value_unset (&element); - - g_ptr_array_add (routes, array); - } - - g_value_take_boxed (value, routes); -} - -/** - * nm_utils_ip6_dns_from_gvalue: (skip) - * @value: a #GValue - * - * Converts a #GValue containing a #GPtrArray of IP6 DNS, represented as - * #GByteArrays into a #GSList of <literal><type>struct in6_addr</type></literal>s. - * - * Returns: a #GSList of IP6 addresses. - */ -GSList * -nm_utils_ip6_dns_from_gvalue (const GValue *value) -{ - GPtrArray *dns; - int i; - GSList *list = NULL; - - dns = (GPtrArray *) g_value_get_boxed (value); - for (i = 0; dns && (i < dns->len); i++) { - GByteArray *bytearray = (GByteArray *) g_ptr_array_index (dns, i); - struct in6_addr *addr; - - if (bytearray->len != 16) { - g_warning ("%s: ignoring invalid IP6 address of length %d", - __func__, bytearray->len); - continue; - } - - addr = g_malloc0 (sizeof (struct in6_addr)); - memcpy (addr->s6_addr, bytearray->data, bytearray->len); - list = g_slist_prepend (list, addr); - } - - return g_slist_reverse (list); -} - -/** - * nm_utils_ip6_dns_to_gvalue: (skip) - * @list: a list of #NMIP6Route objects - * @value: a pointer to a #GValue into which to place the converted DNS server - * addresses, which should be unset by the caller (when no longer needed) with - * g_value_unset(). - * - * Utility function to convert a #GSList of <literal><type>struct - * in6_addr</type></literal> structs into a #GPtrArray of #GByteArrays - * representing each server's IPv6 addresses in network byte order. - * The specific format of this serialization is not guaranteed to be - * stable and may be extended in the future. - */ -void -nm_utils_ip6_dns_to_gvalue (GSList *list, GValue *value) -{ - GPtrArray *dns; - GSList *iter; - - dns = g_ptr_array_new (); - - for (iter = list; iter; iter = iter->next) { - struct in6_addr *addr = (struct in6_addr *) iter->data; - GByteArray *bytearray; - - bytearray = g_byte_array_sized_new (16); - g_byte_array_append (bytearray, (guint8 *) addr->s6_addr, 16); - g_ptr_array_add (dns, bytearray); - } - - g_value_take_boxed (value, dns); -} - -/** - * nm_utils_uuid_generate: - * - * Returns: a newly allocated UUID suitable for use as the #NMSettingConnection - * object's #NMSettingConnection:id: property. Should be freed with g_free() - **/ -char * -nm_utils_uuid_generate (void) -{ - uuid_t uuid; - char *buf; - - buf = g_malloc0 (37); - uuid_generate_random (uuid); - uuid_unparse_lower (uuid, &buf[0]); - return buf; -} - -/** - * nm_utils_uuid_generate_from_string: - * @s: a string to use as the seed for the UUID - * - * For a given @s, this function will always return the same UUID. - * - * Returns: a newly allocated UUID suitable for use as the #NMSettingConnection - * object's #NMSettingConnection:id: property - **/ -char * -nm_utils_uuid_generate_from_string (const char *s) -{ - GError *error = NULL; - uuid_t uuid; - char *buf = NULL; - - g_return_val_if_fail (s && *s, NULL); - - if (!nm_utils_init (&error)) { - g_warning ("error initializing crypto: %s", error->message); - g_error_free (error); - return NULL; - } - - if (!crypto_md5_hash (NULL, 0, s, strlen (s), (char *) uuid, sizeof (uuid), &error)) { - g_warning ("error generating UUID: %s", error->message); - g_error_free (error); - return NULL; - } - - buf = g_malloc0 (37); - uuid_unparse_lower (uuid, &buf[0]); - - return buf; -} - -static char * -make_key (const char *cipher, - const char *salt, - const gsize salt_len, - const char *password, - gsize *out_len, - GError **error) -{ - char *key; - guint32 digest_len = 24; /* DES-EDE3-CBC */ - - g_return_val_if_fail (salt != NULL, NULL); - g_return_val_if_fail (salt_len >= 8, NULL); - g_return_val_if_fail (password != NULL, NULL); - g_return_val_if_fail (out_len != NULL, NULL); - - if (!strcmp (cipher, "DES-EDE3-CBC")) - digest_len = 24; - else if (!strcmp (cipher, "AES-128-CBC")) - digest_len = 16; - - key = g_malloc0 (digest_len + 1); - - if (!crypto_md5_hash (salt, salt_len, password, strlen (password), key, digest_len, error)) { - *out_len = 0; - memset (key, 0, digest_len); - g_free (key); - key = NULL; - } else - *out_len = digest_len; - - return key; -} - -/** - * nm_utils_rsa_key_encrypt_helper: - * @cipher: cipher to use for encryption ("DES-EDE3-CBC" or "AES-128-CBC") - * @data: RSA private key data to be encrypted - * @in_password: (allow-none): existing password to use, if any - * @out_password: (out) (allow-none): if @in_password was %NULL, a random password will be generated - * and returned in this argument - * @error: detailed error information on return, if an error occurred - * - * Encrypts the given RSA private key data with the given password (or generates - * a password if no password was given) and converts the data to PEM format - * suitable for writing to a file. - * - * Returns: (transfer full): on success, PEM-formatted data suitable for writing to a PEM-formatted - * certificate/private key file. - **/ -static GByteArray * -nm_utils_rsa_key_encrypt_helper (const char *cipher, - const GByteArray *data, - const char *in_password, - char **out_password, - GError **error) -{ - char salt[16]; - int salt_len; - char *key = NULL, *enc = NULL, *pw_buf[32]; - gsize key_len = 0, enc_len = 0; - GString *pem = NULL; - char *tmp, *tmp_password = NULL; - int left; - const char *p; - GByteArray *ret = NULL; - - g_return_val_if_fail (!g_strcmp0 (cipher, CIPHER_DES_EDE3_CBC) || !g_strcmp0 (cipher, CIPHER_AES_CBC), NULL); - g_return_val_if_fail (data != NULL, NULL); - g_return_val_if_fail (data->len > 0, NULL); - if (out_password) - g_return_val_if_fail (*out_password == NULL, NULL); - - /* Make the password if needed */ - if (!in_password) { - if (!crypto_randomize (pw_buf, sizeof (pw_buf), error)) - return NULL; - in_password = tmp_password = nm_utils_bin2hexstr ((const char *) pw_buf, sizeof (pw_buf), -1); - } - - if (g_strcmp0 (cipher, CIPHER_AES_CBC) == 0) - salt_len = 16; - else - salt_len = 8; - - if (!crypto_randomize (salt, salt_len, error)) - goto out; - - key = make_key (cipher, &salt[0], salt_len, in_password, &key_len, error); - if (!key) - goto out; - - enc = crypto_encrypt (cipher, data, salt, salt_len, key, key_len, &enc_len, error); - if (!enc) - goto out; - - pem = g_string_sized_new (enc_len * 2 + 100); - g_string_append (pem, "-----BEGIN RSA PRIVATE KEY-----\n"); - g_string_append (pem, "Proc-Type: 4,ENCRYPTED\n"); - - /* Convert the salt to a hex string */ - tmp = nm_utils_bin2hexstr ((const char *) salt, salt_len, salt_len * 2); - g_string_append_printf (pem, "DEK-Info: %s,%s\n\n", cipher, tmp); - g_free (tmp); - - /* Convert the encrypted key to a base64 string */ - p = tmp = g_base64_encode ((const guchar *) enc, enc_len); - left = strlen (tmp); - while (left > 0) { - g_string_append_len (pem, p, (left < 64) ? left : 64); - g_string_append_c (pem, '\n'); - left -= 64; - p += 64; - } - g_free (tmp); - - g_string_append (pem, "-----END RSA PRIVATE KEY-----\n"); - - ret = g_byte_array_sized_new (pem->len); - g_byte_array_append (ret, (const unsigned char *) pem->str, pem->len); - if (tmp_password && out_password) - *out_password = g_strdup (tmp_password); - -out: - if (key) { - memset (key, 0, key_len); - g_free (key); - } - if (enc) { - memset (enc, 0, enc_len); - g_free (enc); - } - if (pem) - g_string_free (pem, TRUE); - - if (tmp_password) { - memset (tmp_password, 0, strlen (tmp_password)); - g_free (tmp_password); - } - - return ret; -} - -/** - * nm_utils_rsa_key_encrypt: - * @data: RSA private key data to be encrypted - * @in_password: (allow-none): existing password to use, if any - * @out_password: (out) (allow-none): if @in_password was %NULL, a random password will be generated - * and returned in this argument - * @error: detailed error information on return, if an error occurred - * - * Encrypts the given RSA private key data with the given password (or generates - * a password if no password was given) and converts the data to PEM format - * suitable for writing to a file. It uses Triple DES cipher for the encryption. - * - * Returns: (transfer full): on success, PEM-formatted data suitable for writing to a PEM-formatted - * certificate/private key file. - **/ -GByteArray * -nm_utils_rsa_key_encrypt (const GByteArray *data, - const char *in_password, - char **out_password, - GError **error) -{ - - return nm_utils_rsa_key_encrypt_helper (CIPHER_DES_EDE3_CBC, - data, - in_password, - out_password, - error); -} - -/** - * nm_utils_rsa_key_encrypt_aes: - * @data: RSA private key data to be encrypted - * @in_password: (allow-none): existing password to use, if any - * @out_password: (out) (allow-none): if @in_password was %NULL, a random password will be generated - * and returned in this argument - * @error: detailed error information on return, if an error occurred - * - * Encrypts the given RSA private key data with the given password (or generates - * a password if no password was given) and converts the data to PEM format - * suitable for writing to a file. It uses AES cipher for the encryption. - * - * Returns: (transfer full): on success, PEM-formatted data suitable for writing to a PEM-formatted - * certificate/private key file. - **/ -GByteArray * -nm_utils_rsa_key_encrypt_aes (const GByteArray *data, - const char *in_password, - char **out_password, - GError **error) -{ - - return nm_utils_rsa_key_encrypt_helper (CIPHER_AES_CBC, - data, - in_password, - out_password, - error); -} - -/** - * nm_utils_file_is_pkcs12: - * @filename: name of the file to test - * - * Utility function to find out if the @filename is in PKCS#<!-- -->12 format. - * - * Returns: %TRUE if the file is PKCS#<!-- -->12, %FALSE if it is not - **/ -gboolean -nm_utils_file_is_pkcs12 (const char *filename) -{ - return crypto_is_pkcs12_file (filename, NULL); -} - -/*****************************************************************************/ - -/** - * nm_utils_file_search_in_paths: - * @progname: the helper program name, like "iptables" - * Must be a non-empty string, without path separator (/). - * @try_first: (allow-none): a custom path to try first before searching. - * It is silently ignored if it is empty or not an absolute path. - * @paths: (allow-none): a %NULL terminated list of search paths. - * Can be empty or %NULL, in which case only @try_first is checked. - * @file_test_flags: the flags passed to g_file_test() when searching - * for @progname. Set it to 0 to skip the g_file_test(). - * @predicate: (scope call): if given, pass the file name to this function - * for additional checks. This check is performed after the check for - * @file_test_flags. You cannot omit both @file_test_flags and @predicate. - * @user_data: (closure) (allow-none): user data for @predicate function. - * @error: (allow-none): on failure, set a "not found" error %G_IO_ERROR %G_IO_ERROR_NOT_FOUND. - * - * Searches for a @progname file in a list of search @paths. - * - * Returns: (transfer none): the full path to the helper, if found, or %NULL if not found. - * The returned string is not owned by the caller, but later - * invocations of the function might overwrite it. - */ -const char * -nm_utils_file_search_in_paths (const char *progname, - const char *try_first, - const char *const *paths, - GFileTest file_test_flags, - NMUtilsFileSearchInPathsPredicate predicate, - gpointer user_data, - GError **error) -{ - GString *tmp; - const char *ret; - - g_return_val_if_fail (!error || !*error, NULL); - g_return_val_if_fail (progname && progname[0] && !strchr (progname, '/'), NULL); - g_return_val_if_fail (file_test_flags || predicate, NULL); - - /* Only consider @try_first if it is a valid, absolute path. This makes - * it simpler to pass in a path from configure checks. */ - if ( try_first - && try_first[0] == '/' - && (file_test_flags == 0 || g_file_test (try_first, file_test_flags)) - && (!predicate || predicate (try_first, user_data))) - return g_intern_string (try_first); - - if (!paths || !*paths) - goto NOT_FOUND; - - tmp = g_string_sized_new (50); - for (; *paths; paths++) { - if (!*paths) - continue; - g_string_append (tmp, *paths); - if (tmp->str[tmp->len - 1] != '/') - g_string_append_c (tmp, '/'); - g_string_append (tmp, progname); - if ( (file_test_flags == 0 || g_file_test (tmp->str, file_test_flags)) - && (!predicate || predicate (tmp->str, user_data))) { - ret = g_intern_string (tmp->str); - g_string_free (tmp, TRUE); - return ret; - } - g_string_set_size (tmp, 0); - } - g_string_free (tmp, TRUE); - -NOT_FOUND: - g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, _("Could not find \"%s\" binary"), progname); - return NULL; -} - -/*****************************************************************************/ - -/* Band, channel/frequency stuff for wireless */ -struct cf_pair { - guint32 chan; - guint32 freq; -}; - -static struct cf_pair a_table[] = { - /* A band */ - { 7, 5035 }, - { 8, 5040 }, - { 9, 5045 }, - { 11, 5055 }, - { 12, 5060 }, - { 16, 5080 }, - { 34, 5170 }, - { 36, 5180 }, - { 38, 5190 }, - { 40, 5200 }, - { 42, 5210 }, - { 44, 5220 }, - { 46, 5230 }, - { 48, 5240 }, - { 50, 5250 }, - { 52, 5260 }, - { 56, 5280 }, - { 58, 5290 }, - { 60, 5300 }, - { 64, 5320 }, - { 100, 5500 }, - { 104, 5520 }, - { 108, 5540 }, - { 112, 5560 }, - { 116, 5580 }, - { 120, 5600 }, - { 124, 5620 }, - { 128, 5640 }, - { 132, 5660 }, - { 136, 5680 }, - { 140, 5700 }, - { 149, 5745 }, - { 152, 5760 }, - { 153, 5765 }, - { 157, 5785 }, - { 160, 5800 }, - { 161, 5805 }, - { 165, 5825 }, - { 183, 4915 }, - { 184, 4920 }, - { 185, 4925 }, - { 187, 4935 }, - { 188, 4945 }, - { 192, 4960 }, - { 196, 4980 }, - { 0, -1 } -}; - -static struct cf_pair bg_table[] = { - /* B/G band */ - { 1, 2412 }, - { 2, 2417 }, - { 3, 2422 }, - { 4, 2427 }, - { 5, 2432 }, - { 6, 2437 }, - { 7, 2442 }, - { 8, 2447 }, - { 9, 2452 }, - { 10, 2457 }, - { 11, 2462 }, - { 12, 2467 }, - { 13, 2472 }, - { 14, 2484 }, - { 0, -1 } -}; - -/** - * nm_utils_wifi_freq_to_channel: - * @freq: frequency - * - * Utility function to translate a Wi-Fi frequency to its corresponding channel. - * - * Returns: the channel represented by the frequency or 0 - **/ -guint32 -nm_utils_wifi_freq_to_channel (guint32 freq) -{ - int i = 0; - - if (freq > 4900) { - while (a_table[i].chan && (a_table[i].freq != freq)) - i++; - return a_table[i].chan; - } else { - while (bg_table[i].chan && (bg_table[i].freq != freq)) - i++; - return bg_table[i].chan; - } - - return 0; -} - -/** - * nm_utils_wifi_channel_to_freq: - * @channel: channel - * @band: frequency band for wireless ("a" or "bg") - * - * Utility function to translate a Wi-Fi channel to its corresponding frequency. - * - * Returns: the frequency represented by the channel of the band, - * or -1 when the freq is invalid, or 0 when the band - * is invalid - **/ -guint32 -nm_utils_wifi_channel_to_freq (guint32 channel, const char *band) -{ - int i = 0; - - if (!strcmp (band, "a")) { - while (a_table[i].chan && (a_table[i].chan != channel)) - i++; - return a_table[i].freq; - } else if (!strcmp (band, "bg")) { - while (bg_table[i].chan && (bg_table[i].chan != channel)) - i++; - return bg_table[i].freq; - } - - return 0; -} - -/** - * nm_utils_wifi_find_next_channel: - * @channel: current channel - * @direction: whether going downward (0 or less) or upward (1 or more) - * @band: frequency band for wireless ("a" or "bg") - * - * Utility function to find out next/previous Wi-Fi channel for a channel. - * - * Returns: the next channel in the specified direction or 0 - **/ -guint32 -nm_utils_wifi_find_next_channel (guint32 channel, int direction, char *band) -{ - size_t a_size = sizeof (a_table) / sizeof (struct cf_pair); - size_t bg_size = sizeof (bg_table) / sizeof (struct cf_pair); - struct cf_pair *pair = NULL; - - if (!strcmp (band, "a")) { - if (channel < a_table[0].chan) - return a_table[0].chan; - if (channel > a_table[a_size - 2].chan) - return a_table[a_size - 2].chan; - pair = &a_table[0]; - } else if (!strcmp (band, "bg")) { - if (channel < bg_table[0].chan) - return bg_table[0].chan; - if (channel > bg_table[bg_size - 2].chan) - return bg_table[bg_size - 2].chan; - pair = &bg_table[0]; - } else { - g_assert_not_reached (); - return 0; - } - - while (pair->chan) { - if (channel == pair->chan) - return channel; - if ((channel < (pair+1)->chan) && (channel > pair->chan)) { - if (direction > 0) - return (pair+1)->chan; - else - return pair->chan; - } - pair++; - } - return 0; -} - -/** - * nm_utils_wifi_is_channel_valid: - * @channel: channel - * @band: frequency band for wireless ("a" or "bg") - * - * Utility function to verify Wi-Fi channel validity. - * - * Returns: %TRUE or %FALSE - **/ -gboolean -nm_utils_wifi_is_channel_valid (guint32 channel, const char *band) -{ - struct cf_pair *table = NULL; - int i = 0; - - if (!strcmp (band, "a")) - table = a_table; - else if (!strcmp (band, "bg")) - table = bg_table; - else - return FALSE; - - while (table[i].chan && (table[i].chan != channel)) - i++; - - if (table[i].chan != 0) - return TRUE; - else - return FALSE; -} - -/** - * nm_utils_hwaddr_len: - * @type: the type of address; either <literal>ARPHRD_ETHER</literal> or - * <literal>ARPHRD_INFINIBAND</literal> - * - * Returns the length in octets of a hardware address of type @type. - * - * Return value: the positive length, or -1 if the type is unknown/unsupported. - */ -int -nm_utils_hwaddr_len (int type) -{ - if (type == ARPHRD_ETHER) - return ETH_ALEN; - else if (type == ARPHRD_INFINIBAND) - return INFINIBAND_ALEN; - else - return -1; -} - -/** - * nm_utils_hwaddr_type: - * @len: the length of hardware address in bytes - * - * Returns the type (either <literal>ARPHRD_ETHER</literal> or - * <literal>ARPHRD_INFINIBAND</literal>) of the raw address given its length. - * - * Return value: the type, either <literal>ARPHRD_ETHER</literal> or - * <literal>ARPHRD_INFINIBAND</literal>. If the length is unexpected, return -1 - * (unsupported type/length). - * - * Deprecated: This could not be extended to cover other types, since - * there is not a one-to-one mapping between types and lengths. This - * was mostly only used to get a type to pass to - * nm_utils_hwaddr_ntoa() or nm_utils_hwaddr_aton() when you only had - * a length; but you can just use nm_utils_hwaddr_ntoa_len() or - * nm_utils_hwaddr_aton_len() now instead. - */ -int -nm_utils_hwaddr_type (int len) -{ - if (len == ETH_ALEN) - return ARPHRD_ETHER; - else if (len == INFINIBAND_ALEN) - return ARPHRD_INFINIBAND; - else - return -1; -} - -#define HEXVAL(c) ((c) <= '9' ? (c) - '0' : ((c) & 0x4F) - 'A' + 10) - -/** - * nm_utils_hwaddr_aton: - * @asc: the ASCII representation of a hardware address - * @type: the type of address; either <literal>ARPHRD_ETHER</literal> or - * <literal>ARPHRD_INFINIBAND</literal> - * @buffer: buffer to store the result into - * - * Parses @asc and converts it to binary form in @buffer. See - * nm_utils_hwaddr_atoba() if you'd rather have the result in a - * #GByteArray. - * - * See also nm_utils_hwaddr_aton_len(), which takes an output length - * instead of a type. - * - * Return value: @buffer, or %NULL if @asc couldn't be parsed - */ -guint8 * -nm_utils_hwaddr_aton (const char *asc, int type, gpointer buffer) -{ - int len = nm_utils_hwaddr_len (type); - - if (len <= 0) { - g_return_val_if_reached (NULL); - return NULL; - } - return nm_utils_hwaddr_aton_len (asc, buffer, len); -} - -/** - * nm_utils_hwaddr_atoba: - * @asc: the ASCII representation of a hardware address - * @type: the type of address; either <literal>ARPHRD_ETHER</literal> or - * <literal>ARPHRD_INFINIBAND</literal> - * - * Parses @asc and converts it to binary form in a #GByteArray. See - * nm_utils_hwaddr_aton() if you don't want a #GByteArray. - * - * Return value: (transfer full): a new #GByteArray, or %NULL if @asc couldn't - * be parsed - */ -GByteArray * -nm_utils_hwaddr_atoba (const char *asc, int type) -{ - GByteArray *ba; - int len = nm_utils_hwaddr_len (type); - - if (len <= 0) { - g_return_val_if_reached (NULL); - return NULL; - } - - ba = g_byte_array_sized_new (len); - g_byte_array_set_size (ba, len); - if (!nm_utils_hwaddr_aton_len (asc, ba->data, len)) { - g_byte_array_unref (ba); - return NULL; - } - - return ba; -} - -/** - * nm_utils_hwaddr_ntoa: - * @addr: a binary hardware address - * @type: the type of address; either <literal>ARPHRD_ETHER</literal> or - * <literal>ARPHRD_INFINIBAND</literal> - * - * Converts @addr to textual form. - * - * See also nm_utils_hwaddr_ntoa_len(), which takes a length instead of - * a type. - * - * Return value: (transfer full): the textual form of @addr - */ -char * -nm_utils_hwaddr_ntoa (gconstpointer addr, int type) -{ - int len = nm_utils_hwaddr_len (type); - - if (len <= 0) { - g_return_val_if_reached (NULL); - return NULL; - } - - return nm_utils_hwaddr_ntoa_len (addr, len); -} - -/** - * nm_utils_hwaddr_aton_len: - * @asc: the ASCII representation of a hardware address - * @buffer: buffer to store the result into - * @length: the expected length in bytes of the result and - * the size of the buffer in bytes. - * - * Parses @asc and converts it to binary form in @buffer. - * Bytes in @asc can be sepatared by colons (:), or hyphens (-), but not mixed. - * - * Return value: @buffer, or %NULL if @asc couldn't be parsed - * or would be shorter or longer than @length. - * - * Since: 0.9.10 - */ -guint8 * -nm_utils_hwaddr_aton_len (const char *asc, gpointer buffer, gsize length) -{ - const char *in = asc; - guint8 *out = (guint8 *)buffer; - char delimiter = '\0'; - - if (!asc) { - g_return_val_if_reached (NULL); - return NULL; - } - g_return_val_if_fail (buffer, NULL); - g_return_val_if_fail (length, NULL); - - while (length && *in) { - guint8 d1 = in[0], d2 = in[1]; - - if (!g_ascii_isxdigit (d1)) - return NULL; - - /* If there's no leading zero (ie "aa:b:cc") then fake it */ - if (d2 && g_ascii_isxdigit (d2)) { - *out++ = (HEXVAL (d1) << 4) + HEXVAL (d2); - in += 2; - } else { - /* Fake leading zero */ - *out++ = (HEXVAL ('0') << 4) + HEXVAL (d1); - in += 1; - } - - length--; - if (*in) { - if (delimiter == '\0') { - if (*in == ':' || *in == '-') - delimiter = *in; - else - return NULL; - } else { - if (*in != delimiter) - return NULL; - } - in++; - } - } - - if (length == 0 && !*in) - return buffer; - else - return NULL; -} - -/** - * nm_utils_hwaddr_ntoa_len: - * @addr: a binary hardware address - * @length: the length of @addr - * - * Converts @addr to textual form. - * - * Return value: (transfer full): the textual form of @addr - * - * Since: 0.9.10 - */ -char * -nm_utils_hwaddr_ntoa_len (gconstpointer addr, gsize length) -{ - const guint8 *in = addr; - char *out, *result; - const char *LOOKUP = "0123456789ABCDEF"; - - g_return_val_if_fail (addr != NULL, g_strdup ("")); - g_return_val_if_fail (length != 0, g_strdup ("")); - - result = out = g_malloc (length * 3); - for (;;) { - guint8 v = *in++; - - *out++ = LOOKUP[v >> 4]; - *out++ = LOOKUP[v & 0x0F]; - if (--length == 0) { - *out = 0; - return result; - } - *out++ = ':'; - } -} - -/** - * nm_utils_hwaddr_valid: - * @asc: the ASCII representation of a hardware address - * - * Parses @asc to see if it is a valid hardware address of some type. - * - * Return value: %TRUE if @asc appears to be a valid hardware address - * of some type, %FALSE if not. - * - * Since: 0.9.10 - */ -gboolean -nm_utils_hwaddr_valid (const char *asc) -{ - guint8 buf[NM_UTILS_HWADDR_LEN_MAX]; - gsize in_len, out_len; - - if (!asc || !*asc) - return FALSE; - in_len = strlen (asc); - if ((in_len + 1) % 3 != 0) - return FALSE; - out_len = (in_len + 1) / 3; - if (out_len > NM_UTILS_HWADDR_LEN_MAX) - return FALSE; - return nm_utils_hwaddr_aton_len (asc, buf, out_len) != NULL; -} - -/** - * nm_utils_bin2hexstr: - * @bytes: an array of bytes - * @len: the length of the @bytes array - * @final_len: an index where to cut off the returned string, or -1 - * - * Converts a byte-array @bytes into a hexadecimal string. - * If @final_len is greater than -1, the returned string is terminated at - * that index (returned_string[final_len] == '\0'), - * - * Return value: (transfer full): the textual form of @bytes - * - * Since: 0.9.10 - */ -/* - * Code originally by Alex Larsson <alexl@redhat.com> and - * copyright Red Hat, Inc. under terms of the LGPL. - */ -char * -nm_utils_bin2hexstr (const char *bytes, int len, int final_len) -{ - static char hex_digits[] = "0123456789abcdef"; - char *result; - int i; - gsize buflen = (len * 2) + 1; - - g_return_val_if_fail (bytes != NULL, NULL); - g_return_val_if_fail (len > 0, NULL); - g_return_val_if_fail (len < 4096, NULL); /* Arbitrary limit */ - if (final_len > -1) - g_return_val_if_fail (final_len < buflen, NULL); - - result = g_malloc0 (buflen); - for (i = 0; i < len; i++) { - result[2*i] = hex_digits[(bytes[i] >> 4) & 0xf]; - result[2*i+1] = hex_digits[bytes[i] & 0xf]; - } - /* Cut converted key off at the correct length for this cipher type */ - if (final_len > -1) - result[final_len] = '\0'; - else - result[buflen - 1] = '\0'; - - return result; -} - -/* From hostap, Copyright (c) 2002-2005, Jouni Malinen <jkmaline@cc.hut.fi> */ -/** - * nm_utils_hex2byte: - * @hex: a string representing a hex byte - * - * Converts a hex string (2 characters) into its byte representation. - * - * Return value: a byte, or -1 if @hex doesn't represent a hex byte - * - * Since: 0.9.10 - */ -int -nm_utils_hex2byte (const char *hex) -{ - int a, b; - a = g_ascii_xdigit_value (*hex++); - if (a < 0) - return -1; - b = g_ascii_xdigit_value (*hex++); - if (b < 0) - return -1; - return (a << 4) | b; -} - -/** - * nm_utils_hexstr2bin: - * @hex: an hex string - * @len: the length of the @hex string (it has to be even) - * - * Converts a hexadecimal string @hex into a byte-array. The returned array - * length is @len/2. - * - * Return value: (transfer full): a array of bytes, or %NULL on error - * - * Since: 0.9.10 - */ -char * -nm_utils_hexstr2bin (const char *hex, size_t len) -{ - size_t i; - int a; - const char * ipos = hex; - char * buf = NULL; - char * opos; - - /* Length must be a multiple of 2 */ - if ((len % 2) != 0) - return NULL; - - opos = buf = g_malloc0 ((len / 2) + 1); - for (i = 0; i < len; i += 2) { - a = nm_utils_hex2byte (ipos); - if (a < 0) { - g_free (buf); - return NULL; - } - *opos++ = a; - ipos += 2; - } - return buf; -} -/* End from hostap */ - -/** - * nm_utils_iface_valid_name: - * @name: Name of interface - * - * This function is a 1:1 copy of the kernel's interface validation - * function in net/core/dev.c. - * - * Returns: %TRUE if interface name is valid, otherwise %FALSE is returned. - * - * Since: 0.9.8 - */ -gboolean -nm_utils_iface_valid_name (const char *name) -{ - g_return_val_if_fail (name != NULL, FALSE); - - if (*name == '\0') - return FALSE; - - if (strlen (name) >= 16) - return FALSE; - - if (!strcmp (name, ".") || !strcmp (name, "..")) - return FALSE; - - while (*name) { - if (*name == '/' || g_ascii_isspace (*name)) - return FALSE; - name++; - } - - return TRUE; -} - -/** - * nm_utils_is_uuid: - * @str: a string that might be a UUID - * - * Checks if @str is a UUID - * - * Returns: %TRUE if @str is a UUID, %FALSE if not - * - * Since: 0.9.8 - */ -gboolean -nm_utils_is_uuid (const char *str) -{ - const char *p = str; - int num_dashes = 0; - - while (*p) { - if (*p == '-') - num_dashes++; - else if (!g_ascii_isxdigit (*p)) - return FALSE; - p++; - } - - if ((num_dashes == 4) && (p - str == 36)) - return TRUE; - - /* Backwards compat for older configurations */ - if ((num_dashes == 0) && (p - str == 40)) - return TRUE; - - return FALSE; -} - -static char _nm_utils_inet_ntop_buffer[NM_UTILS_INET_ADDRSTRLEN]; - -/** - * nm_utils_inet4_ntop: (skip) - * @inaddr: the address that should be converted to string. - * @dst: the destination buffer, it must contain at least - * <literal>INET_ADDRSTRLEN</literal> or %NM_UTILS_INET_ADDRSTRLEN - * characters. If set to %NULL, it will return a pointer to an internal, static - * buffer (shared with nm_utils_inet6_ntop()). Beware, that the internal - * buffer will be overwritten with ever new call of nm_utils_inet4_ntop() or - * nm_utils_inet6_ntop() that does not provied it's own @dst buffer. Also, - * using the internal buffer is not thread safe. When in doubt, pass your own - * @dst buffer to avoid these issues. - * - * Wrapper for inet_ntop. - * - * Returns: the input buffer @dst, or a pointer to an - * internal, static buffer. This function cannot fail. - * - * Since: 0.9.10 - **/ -const char * -nm_utils_inet4_ntop (in_addr_t inaddr, char *dst) -{ - return inet_ntop (AF_INET, &inaddr, dst ?: _nm_utils_inet_ntop_buffer, - INET_ADDRSTRLEN); -} - -/** - * nm_utils_inet6_ntop: (skip) - * @in6addr: the address that should be converted to string. - * @dst: the destination buffer, it must contain at least - * <literal>INET6_ADDRSTRLEN</literal> or %NM_UTILS_INET_ADDRSTRLEN - * characters. If set to %NULL, it will return a pointer to an internal, static - * buffer (shared with nm_utils_inet4_ntop()). Beware, that the internal - * buffer will be overwritten with ever new call of nm_utils_inet4_ntop() or - * nm_utils_inet6_ntop() that does not provied it's own @dst buffer. Also, - * using the internal buffer is not thread safe. When in doubt, pass your own - * @dst buffer to avoid these issues. - * - * Wrapper for inet_ntop. - * - * Returns: the input buffer @dst, or a pointer to an - * internal, static buffer. %NULL is not allowed as @in6addr, - * otherwise, this function cannot fail. - * - * Since: 0.9.10 - **/ -const char * -nm_utils_inet6_ntop (const struct in6_addr *in6addr, char *dst) -{ - g_return_val_if_fail (in6addr, NULL); - return inet_ntop (AF_INET6, in6addr, dst ?: _nm_utils_inet_ntop_buffer, - INET6_ADDRSTRLEN); -} - -/** - * nm_utils_check_virtual_device_compatibility: - * @virtual_type: a virtual connection type - * @other_type: a connection type to test against @virtual_type - * - * Determines if a connection of type @virtual_type can (in the - * general case) work with connections of type @other_type. - * - * If @virtual_type is %NM_TYPE_SETTING_VLAN, then this checks if - * @other_type is a valid type for the parent of a VLAN. - * - * If @virtual_type is a "master" type (eg, %NM_TYPE_SETTING_BRIDGE), - * then this checks if @other_type is a valid type for a slave of that - * master. - * - * Note that even if this returns %TRUE it is not guaranteed that - * <emphasis>every</emphasis> connection of type @other_type is - * compatible with @virtual_type; it may depend on the exact - * configuration of the two connections, or on the capabilities of an - * underlying device driver. - * - * Returns: %TRUE or %FALSE - * - * Since: 0.9.10 - */ -gboolean -nm_utils_check_virtual_device_compatibility (GType virtual_type, GType other_type) -{ - g_return_val_if_fail (_nm_setting_type_is_base_type (virtual_type), FALSE); - g_return_val_if_fail (_nm_setting_type_is_base_type (other_type), FALSE); - - if (virtual_type == NM_TYPE_SETTING_BOND) { - return ( other_type == NM_TYPE_SETTING_INFINIBAND - || other_type == NM_TYPE_SETTING_WIRED - || other_type == NM_TYPE_SETTING_BRIDGE - || other_type == NM_TYPE_SETTING_BOND - || other_type == NM_TYPE_SETTING_TEAM - || other_type == NM_TYPE_SETTING_VLAN); - } else if (virtual_type == NM_TYPE_SETTING_BRIDGE) { - return ( other_type == NM_TYPE_SETTING_WIRED - || other_type == NM_TYPE_SETTING_BOND - || other_type == NM_TYPE_SETTING_TEAM - || other_type == NM_TYPE_SETTING_VLAN); - } else if (virtual_type == NM_TYPE_SETTING_TEAM) { - return ( other_type == NM_TYPE_SETTING_WIRED - || other_type == NM_TYPE_SETTING_BRIDGE - || other_type == NM_TYPE_SETTING_BOND - || other_type == NM_TYPE_SETTING_TEAM - || other_type == NM_TYPE_SETTING_VLAN); - } else if (virtual_type == NM_TYPE_SETTING_VLAN) { - return ( other_type == NM_TYPE_SETTING_WIRED - || other_type == NM_TYPE_SETTING_WIRELESS - || other_type == NM_TYPE_SETTING_BRIDGE - || other_type == NM_TYPE_SETTING_BOND - || other_type == NM_TYPE_SETTING_TEAM - || other_type == NM_TYPE_SETTING_VLAN); - } else { - g_warn_if_reached (); - return FALSE; - } -} - -/*****************************************************************************/ - -/* Unused prototypes to make the compiler happy */ -gconstpointer nm_utils_get_private (void); -gconstpointer nm_util_get_private (void); - -/** - * nm_utils_get_private: - * - * Entry point for NetworkManager-internal API. You should not use this - * function for any reason. - * - * Returns: Who knows? It's a mystery. - * - * Since: 0.9.10 - */ -gconstpointer -nm_utils_get_private (void) -{ - /* We told you not to use it! */ - g_assert_not_reached (); -} - -/** - * nm_util_get_private: - * - * You should not use this function for any reason. - * - * Returns: Who knows? It's a mystery. - * - * Since: 0.9.10 - */ -gconstpointer -nm_util_get_private (void) -{ - /* We told you not to use it! */ - g_assert_not_reached (); -} diff --git a/libnm-util/nm-utils.h b/libnm-util/nm-utils.h deleted file mode 100644 index 530fe8332f..0000000000 --- a/libnm-util/nm-utils.h +++ /dev/null @@ -1,190 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2005 - 2013 Red Hat, Inc. - */ - -#ifndef NM_UTILS_H -#define NM_UTILS_H - -#include <glib.h> - -#include "nm-connection.h" -#include "nm-utils-enum-types.h" - -G_BEGIN_DECLS - -/* init, deinit nm_utils */ -gboolean nm_utils_init (GError **error); -void nm_utils_deinit (void); - -/* SSID helpers */ -gboolean nm_utils_is_empty_ssid (const guint8 *ssid, int len); -const char *nm_utils_escape_ssid (const guint8 *ssid, guint32 len); -gboolean nm_utils_same_ssid (const GByteArray *ssid1, - const GByteArray *ssid2, - gboolean ignore_trailing_null); -char * nm_utils_ssid_to_utf8 (const GByteArray *ssid); - -GHashTable *nm_utils_gvalue_hash_dup (GHashTable *hash); - -NM_DEPRECATED_IN_0_9_10 -void nm_utils_slist_free (GSList *list, GDestroyNotify elem_destroy_fn); - -/** - * NMUtilsSecurityType: - * @NMU_SEC_INVALID: unknown or invalid security, placeholder and not used - * @NMU_SEC_NONE: unencrypted and open - * @NMU_SEC_STATIC_WEP: static WEP keys are used for encryption - * @NMU_SEC_LEAP: Cisco LEAP is used for authentication and for generating the - * dynamic WEP keys automatically - * @NMU_SEC_DYNAMIC_WEP: standard 802.1x is used for authentication and - * generating the dynamic WEP keys automatically - * @NMU_SEC_WPA_PSK: WPA1 is used with Pre-Shared Keys (PSK) - * @NMU_SEC_WPA_ENTERPRISE: WPA1 is used with 802.1x authentication - * @NMU_SEC_WPA2_PSK: WPA2/RSN is used with Pre-Shared Keys (PSK) - * @NMU_SEC_WPA2_ENTERPRISE: WPA2 is used with 802.1x authentication - * - * Describes generic security mechanisms that 802.11 access points may offer. - * Used with nm_utils_security_valid() for checking whether a given access - * point is compatible with a network device. - **/ -typedef enum { - NMU_SEC_INVALID = 0, - NMU_SEC_NONE, - NMU_SEC_STATIC_WEP, - NMU_SEC_LEAP, - NMU_SEC_DYNAMIC_WEP, - NMU_SEC_WPA_PSK, - NMU_SEC_WPA_ENTERPRISE, - NMU_SEC_WPA2_PSK, - NMU_SEC_WPA2_ENTERPRISE -} NMUtilsSecurityType; - -gboolean nm_utils_security_valid (NMUtilsSecurityType type, - NMDeviceWifiCapabilities wifi_caps, - gboolean have_ap, - gboolean adhoc, - NM80211ApFlags ap_flags, - NM80211ApSecurityFlags ap_wpa, - NM80211ApSecurityFlags ap_rsn); - -gboolean nm_utils_ap_mode_security_valid (NMUtilsSecurityType type, - NMDeviceWifiCapabilities wifi_caps); - -gboolean nm_utils_wep_key_valid (const char *key, NMWepKeyType wep_type); -gboolean nm_utils_wpa_psk_valid (const char *psk); - -GSList *nm_utils_ip4_addresses_from_gvalue (const GValue *value); -void nm_utils_ip4_addresses_to_gvalue (GSList *list, GValue *value); - -GSList *nm_utils_ip4_routes_from_gvalue (const GValue *value); -void nm_utils_ip4_routes_to_gvalue (GSList *list, GValue *value); - -guint32 nm_utils_ip4_netmask_to_prefix (guint32 netmask); -guint32 nm_utils_ip4_prefix_to_netmask (guint32 prefix); -guint32 nm_utils_ip4_get_default_prefix (guint32 ip); - -GSList *nm_utils_ip6_addresses_from_gvalue (const GValue *value); -void nm_utils_ip6_addresses_to_gvalue (GSList *list, GValue *value); - -GSList *nm_utils_ip6_routes_from_gvalue (const GValue *value); -void nm_utils_ip6_routes_to_gvalue (GSList *list, GValue *value); - -GSList *nm_utils_ip6_dns_from_gvalue (const GValue *value); -void nm_utils_ip6_dns_to_gvalue (GSList *list, GValue *value); - -char *nm_utils_uuid_generate (void); -char *nm_utils_uuid_generate_from_string (const char *s); - -GByteArray *nm_utils_rsa_key_encrypt (const GByteArray *data, - const char *in_password, - char **out_password, - GError **error); -GByteArray *nm_utils_rsa_key_encrypt_aes (const GByteArray *data, - const char *in_password, - char **out_password, - GError **error); -gboolean nm_utils_file_is_pkcs12 (const char *filename); - -typedef gboolean (*NMUtilsFileSearchInPathsPredicate) (const char *filename, gpointer user_data); - -const char *nm_utils_file_search_in_paths (const char *progname, - const char *try_first, - const char *const *paths, - GFileTest file_test_flags, - NMUtilsFileSearchInPathsPredicate predicate, - gpointer user_data, - GError **error); - -guint32 nm_utils_wifi_freq_to_channel (guint32 freq); -guint32 nm_utils_wifi_channel_to_freq (guint32 channel, const char *band); -guint32 nm_utils_wifi_find_next_channel (guint32 channel, int direction, char *band); -gboolean nm_utils_wifi_is_channel_valid (guint32 channel, const char *band); - -/** - * NM_UTILS_HWADDR_LEN_MAX: - * - * The maximum length of hardware addresses handled by NetworkManager itself, - * nm_utils_hwaddr_len(), and nm_utils_hwaddr_aton(). - */ -#define NM_UTILS_HWADDR_LEN_MAX 20 /* INFINIBAND_ALEN */ - -int nm_utils_hwaddr_len (int type) G_GNUC_PURE; -NM_DEPRECATED_IN_0_9_10 -int nm_utils_hwaddr_type (int len) G_GNUC_PURE; -char *nm_utils_hwaddr_ntoa (gconstpointer addr, int type); -GByteArray *nm_utils_hwaddr_atoba (const char *asc, int type); -guint8 *nm_utils_hwaddr_aton (const char *asc, int type, gpointer buffer); - -NM_AVAILABLE_IN_0_9_10 -char *nm_utils_hwaddr_ntoa_len (gconstpointer addr, gsize length); -NM_AVAILABLE_IN_0_9_10 -guint8 *nm_utils_hwaddr_aton_len (const char *asc, gpointer buffer, gsize length); - -NM_AVAILABLE_IN_0_9_10 -gboolean nm_utils_hwaddr_valid (const char *asc); - -NM_AVAILABLE_IN_0_9_10 -char *nm_utils_bin2hexstr (const char *bytes, int len, int final_len); -NM_AVAILABLE_IN_0_9_10 -int nm_utils_hex2byte (const char *hex); -NM_AVAILABLE_IN_0_9_10 -char *nm_utils_hexstr2bin (const char *hex, size_t len); - -gboolean nm_utils_iface_valid_name(const char *name); - -gboolean nm_utils_is_uuid (const char *str); - -/** - * NM_UTILS_INET_ADDRSTRLEN: - * - * Defines the minimal length for a char buffer that is suitable as @dst argument - * for both nm_utils_inet4_ntop() and nm_utils_inet6_ntop(). - **/ -#define NM_UTILS_INET_ADDRSTRLEN INET6_ADDRSTRLEN -NM_AVAILABLE_IN_0_9_10 -const char *nm_utils_inet4_ntop (in_addr_t inaddr, char *dst); -NM_AVAILABLE_IN_0_9_10 -const char *nm_utils_inet6_ntop (const struct in6_addr *in6addr, char *dst); - -NM_AVAILABLE_IN_0_9_10 -gboolean nm_utils_check_virtual_device_compatibility (GType virtual_type, GType other_type); - -G_END_DECLS - -#endif /* NM_UTILS_H */ diff --git a/libnm-util/nm-value-transforms.c b/libnm-util/nm-value-transforms.c deleted file mode 100644 index 13f9eb43bc..0000000000 --- a/libnm-util/nm-value-transforms.c +++ /dev/null @@ -1,593 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2005 - 2014 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> - -#include "nm-gvaluearray-compat.h" -#include "nm-utils.h" -#include "nm-utils-private.h" -#include "nm-dbus-glib-types.h" - -static void -_nm_utils_convert_op_to_string (const GValue *src_value, GValue *dest_value) -{ - g_return_if_fail (g_type_is_a (G_VALUE_TYPE (src_value), DBUS_TYPE_G_OBJECT_PATH)); - - g_value_set_string (dest_value, (const char *) g_value_get_boxed (src_value)); -} - -static void -_nm_utils_convert_strv_to_slist (const GValue *src_value, GValue *dest_value) -{ - char **str; - GSList *list = NULL; - guint i = 0; - - g_return_if_fail (g_type_is_a (G_VALUE_TYPE (src_value), G_TYPE_STRV)); - - str = (char **) g_value_get_boxed (src_value); - - while (str && str[i]) - list = g_slist_prepend (list, g_strdup (str[i++])); - - g_value_take_boxed (dest_value, g_slist_reverse (list)); -} - -static void -_nm_utils_convert_slist_to_strv (const GValue *src_value, GValue *dest_value) -{ - GSList *slist; - char **strv; - int len, i = 0; - - slist = g_value_get_boxed (src_value); - len = g_slist_length (slist); - - strv = g_new (char *, len + 1); - for (i = 0; slist; slist = slist->next, i++) - strv[i] = g_strdup (slist->data); - strv[i] = NULL; - - g_value_take_boxed (dest_value, strv); -} - -static void -_nm_utils_convert_strv_to_ptrarray (const GValue *src_value, GValue *dest_value) -{ - char **str; - GPtrArray *array = NULL; - guint i = 0; - - g_return_if_fail (g_type_is_a (G_VALUE_TYPE (src_value), G_TYPE_STRV)); - - str = (char **) g_value_get_boxed (src_value); - - array = g_ptr_array_sized_new (3); - while (str && str[i]) - g_ptr_array_add (array, g_strdup (str[i++])); - - g_value_take_boxed (dest_value, array); -} - -static void -_nm_utils_convert_string_list_to_string (const GValue *src_value, GValue *dest_value) -{ - GSList *strings; - GString *printable; - GSList *iter; - - g_return_if_fail (g_type_is_a (G_VALUE_TYPE (src_value), DBUS_TYPE_G_LIST_OF_STRING)); - - strings = (GSList *) g_value_get_boxed (src_value); - - printable = g_string_new (NULL); - for (iter = strings; iter; iter = iter->next) { - if (iter != strings) - g_string_append_c (printable, ','); - g_string_append (printable, iter->data ?: "(null)"); - } - - g_value_take_string (dest_value, g_string_free (printable, FALSE)); -} - -static void -_string_array_to_string (const GPtrArray *strings, GValue *dest_value) -{ - GString *printable; - guint i; - - printable = g_string_new (NULL); - for (i = 0; strings && i < strings->len; i++) { - if (i > 0) - g_string_append_c (printable, ','); - g_string_append (printable, strings->pdata[i]); - } - - g_value_take_string (dest_value, g_string_free (printable, FALSE)); -} - -static void -_nm_utils_convert_string_array_to_string (const GValue *src_value, GValue *dest_value) -{ - const GPtrArray *strings; - - g_return_if_fail (g_type_is_a (G_VALUE_TYPE (src_value), DBUS_TYPE_G_ARRAY_OF_STRING)); - - strings = (const GPtrArray *) g_value_get_boxed (src_value); - _string_array_to_string (strings, dest_value); -} - -static void -_nm_utils_convert_op_array_to_string (const GValue *src_value, GValue *dest_value) -{ - const GPtrArray *strings; - - g_return_if_fail (g_type_is_a (G_VALUE_TYPE (src_value), DBUS_TYPE_G_ARRAY_OF_OBJECT_PATH)); - - strings = (const GPtrArray *) g_value_get_boxed (src_value); - _string_array_to_string (strings, dest_value); -} - -static void -_nm_utils_convert_uint_array_to_string (const GValue *src_value, GValue *dest_value) -{ - GArray *array; - GString *printable; - guint i = 0; - - g_return_if_fail (g_type_is_a (G_VALUE_TYPE (src_value), DBUS_TYPE_G_UINT_ARRAY)); - - array = (GArray *) g_value_get_boxed (src_value); - - printable = g_string_new (NULL); - while (array && (i < array->len)) { - guint32 addr; - - if (i > 0) - g_string_append (printable, ", "); - - addr = g_array_index (array, guint32, i++); - g_string_append (printable, nm_utils_inet4_ntop (addr, NULL)); - } - - g_value_take_string (dest_value, g_string_free (printable, FALSE)); -} - -static void -_nm_utils_convert_ip4_addr_route_struct_array_to_string (const GValue *src_value, GValue *dest_value) -{ - GPtrArray *ptr_array; - GString *printable; - guint i = 0; - char buf[INET_ADDRSTRLEN]; - - g_return_if_fail (g_type_is_a (G_VALUE_TYPE (src_value), DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UINT)); - - ptr_array = (GPtrArray *) g_value_get_boxed (src_value); - - printable = g_string_new (NULL); - while (ptr_array && (i < ptr_array->len)) { - GArray *array; - gboolean is_addr; /* array contains address x route */ - - if (i > 0) - g_string_append (printable, "; "); - - g_string_append (printable, "{ "); - array = (GArray *) g_ptr_array_index (ptr_array, i++); - if (array->len < 2) { - g_string_append (printable, "invalid"); - continue; - } - is_addr = (array->len < 4); - - nm_utils_inet4_ntop (g_array_index (array, guint32, 0), buf); - if (is_addr) - g_string_append_printf (printable, "ip = %s", buf); - else - g_string_append_printf (printable, "dst = %s", buf); - - g_string_append_printf (printable, "/%u", - g_array_index (array, guint32, 1)); - - if (array->len > 2) { - nm_utils_inet4_ntop (g_array_index (array, guint32, 2), buf); - if (is_addr) - g_string_append_printf (printable, ", gw = %s", buf); - else - g_string_append_printf (printable, ", nh = %s", buf); - } - - if (array->len > 3) { - g_string_append_printf (printable, ", mt = %u", - g_array_index (array, guint32, 3)); - } - - g_string_append (printable, " }"); - } - - g_value_take_string (dest_value, g_string_free (printable, FALSE)); -} - -static void -convert_one_gvalue_hash_entry (gpointer key, gpointer value, gpointer user_data) -{ - GString *printable = (GString *) user_data; - char *value_as_string; - - value_as_string = g_strdup_value_contents ((GValue *) value); - g_string_append_printf (printable, " { '%s': %s },", (const char *) key, value_as_string); - g_free (value_as_string); -} - -static void -_nm_utils_convert_gvalue_hash_to_string (const GValue *src_value, GValue *dest_value) -{ - GHashTable *hash; - GString *printable; - - g_return_if_fail (g_type_is_a (G_VALUE_TYPE (src_value), DBUS_TYPE_G_MAP_OF_VARIANT)); - - hash = (GHashTable *) g_value_get_boxed (src_value); - - printable = g_string_new ("["); - g_hash_table_foreach (hash, convert_one_gvalue_hash_entry, printable); - g_string_append (printable, " ]"); - - g_value_take_string (dest_value, printable->str); - g_string_free (printable, FALSE); -} - -static void -convert_one_string_hash_entry (gpointer key, gpointer value, gpointer user_data) -{ - GString *printable = (GString *) user_data; - - if (printable->len) - g_string_append_c (printable, ','); - g_string_append_printf (printable, "%s=%s", (const char *) key, (const char *) value); -} - -static void -_nm_utils_convert_string_hash_to_string (const GValue *src_value, GValue *dest_value) -{ - GHashTable *hash; - GString *printable; - - g_return_if_fail (g_type_is_a (G_VALUE_TYPE (src_value), DBUS_TYPE_G_MAP_OF_STRING)); - - hash = (GHashTable *) g_value_get_boxed (src_value); - - printable = g_string_new (NULL); - if (hash) - g_hash_table_foreach (hash, convert_one_string_hash_entry, printable); - - g_value_take_string (dest_value, g_string_free (printable, FALSE)); -} - -static void -_nm_utils_convert_byte_array_to_string (const GValue *src_value, GValue *dest_value) -{ - GArray *array; - GString *printable; - guint i = 0; - - g_return_if_fail (g_type_is_a (G_VALUE_TYPE (src_value), DBUS_TYPE_G_UCHAR_ARRAY)); - - array = (GArray *) g_value_get_boxed (src_value); - - printable = g_string_new ("["); - if (array) { - while (i < MIN (array->len, 35)) { - if (i > 0) - g_string_append_c (printable, ' '); - g_string_append_printf (printable, "0x%02X", - g_array_index (array, unsigned char, i++)); - } - if (i < array->len) - g_string_append (printable, " ... "); - } - g_string_append_c (printable, ']'); - - g_value_take_string (dest_value, g_string_free (printable, FALSE)); -} - -static void -_nm_utils_convert_ip6_dns_array_to_string (const GValue *src_value, GValue *dest_value) -{ - GPtrArray *ptr_array; - GString *printable; - guint i = 0; - - g_return_if_fail (g_type_is_a (G_VALUE_TYPE (src_value), DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UCHAR)); - - ptr_array = (GPtrArray *) g_value_get_boxed (src_value); - - printable = g_string_new (NULL); - while (ptr_array && (i < ptr_array->len)) { - GByteArray *bytearray; - struct in6_addr *addr; - - if (i > 0) - g_string_append (printable, ", "); - - bytearray = (GByteArray *) g_ptr_array_index (ptr_array, i++); - if (bytearray->len != 16) { - g_string_append (printable, "invalid"); - continue; - } - addr = (struct in6_addr *) bytearray->data; - g_string_append (printable, nm_utils_inet6_ntop (addr, NULL)); - } - - g_value_take_string (dest_value, g_string_free (printable, FALSE)); -} - -static void -_nm_utils_convert_ip6_addr_struct_array_to_string (const GValue *src_value, GValue *dest_value) -{ - GPtrArray *ptr_array; - GString *printable; - guint i = 0; - - g_return_if_fail (g_type_is_a (G_VALUE_TYPE (src_value), DBUS_TYPE_G_ARRAY_OF_IP6_ADDRESS)); - - ptr_array = (GPtrArray *) g_value_get_boxed (src_value); - - printable = g_string_new (NULL); - while (ptr_array && (i < ptr_array->len)) { - GValueArray *elements; - GValue *tmp; - GByteArray *ba_addr; - struct in6_addr *addr; - guint32 prefix; - - if (i > 0) - g_string_append (printable, "; "); - - g_string_append (printable, "{ "); - elements = (GValueArray *) g_ptr_array_index (ptr_array, i++); - if (!_nm_utils_gvalue_array_validate (elements, 3, - DBUS_TYPE_G_UCHAR_ARRAY, - G_TYPE_UINT, - DBUS_TYPE_G_UCHAR_ARRAY)) { - g_string_append (printable, "invalid }"); - continue; - } - - /* IPv6 address */ - tmp = g_value_array_get_nth (elements, 0); - ba_addr = g_value_get_boxed (tmp); - if (ba_addr->len != 16) { - g_string_append (printable, "invalid }"); - continue; - } - addr = (struct in6_addr *) ba_addr->data; - g_string_append_printf (printable, "ip = %s", nm_utils_inet6_ntop (addr, NULL)); - - /* Prefix */ - tmp = g_value_array_get_nth (elements, 1); - prefix = g_value_get_uint (tmp); - if (prefix > 128) { - g_string_append (printable, "/invalid }"); - continue; - } - g_string_append_printf (printable, "/%u", prefix); - g_string_append (printable, ", "); - - /* IPv6 Gateway */ - tmp = g_value_array_get_nth (elements, 2); - ba_addr = g_value_get_boxed (tmp); - if (ba_addr->len != 16) { - g_string_append (printable, "invalid }"); - continue; - } - addr = (struct in6_addr *) ba_addr->data; - g_string_append_printf (printable, "gw = %s", nm_utils_inet6_ntop (addr, NULL)); - g_string_append (printable, " }"); - } - - g_value_take_string (dest_value, g_string_free (printable, FALSE)); -} - -static void -_nm_utils_convert_ip6_route_struct_array_to_string (const GValue *src_value, GValue *dest_value) -{ - GPtrArray *ptr_array; - GString *printable; - guint i = 0; - - g_return_if_fail (g_type_is_a (G_VALUE_TYPE (src_value), DBUS_TYPE_G_ARRAY_OF_IP6_ROUTE)); - - ptr_array = (GPtrArray *) g_value_get_boxed (src_value); - - printable = g_string_new (NULL); - while (ptr_array && (i < ptr_array->len)) { - GValueArray *elements; - GValue *tmp; - GByteArray *ba_addr; - struct in6_addr *addr; - guint32 prefix, metric; - - if (i > 0) - g_string_append (printable, "; "); - - g_string_append (printable, "{ "); - elements = (GValueArray *) g_ptr_array_index (ptr_array, i++); - if (!_nm_utils_gvalue_array_validate (elements, 4, - DBUS_TYPE_G_UCHAR_ARRAY, - G_TYPE_UINT, - DBUS_TYPE_G_UCHAR_ARRAY, - G_TYPE_UINT)) { - g_string_append (printable, "invalid"); - continue; - } - - /* Destination address */ - tmp = g_value_array_get_nth (elements, 0); - ba_addr = g_value_get_boxed (tmp); - if (ba_addr->len != 16) { - g_string_append (printable, "invalid"); - continue; - } - addr = (struct in6_addr *) ba_addr->data; - g_string_append_printf (printable, "dst = %s", nm_utils_inet6_ntop (addr, NULL)); - - /* Prefix */ - tmp = g_value_array_get_nth (elements, 1); - prefix = g_value_get_uint (tmp); - if (prefix > 128) { - g_string_append (printable, "/invalid"); - continue; - } - g_string_append_printf (printable, "/%u", prefix); - g_string_append (printable, ", "); - - /* Next hop addresses */ - tmp = g_value_array_get_nth (elements, 2); - ba_addr = g_value_get_boxed (tmp); - if (ba_addr->len != 16) { - g_string_append (printable, "invalid"); - continue; - } - addr = (struct in6_addr *) ba_addr->data; - g_string_append_printf (printable, "nh = %s", nm_utils_inet6_ntop (addr, NULL)); - g_string_append (printable, ", "); - - /* Metric */ - tmp = g_value_array_get_nth (elements, 3); - metric = g_value_get_uint (tmp); - g_string_append_printf (printable, "mt = %u", metric); - - g_string_append (printable, " }"); - } - - g_value_take_string (dest_value, g_string_free (printable, FALSE)); -} - -#define OLD_DBUS_TYPE_G_IP6_ADDRESS (dbus_g_type_get_struct ("GValueArray", DBUS_TYPE_G_UCHAR_ARRAY, G_TYPE_UINT, G_TYPE_INVALID)) -#define OLD_DBUS_TYPE_G_ARRAY_OF_IP6_ADDRESS (dbus_g_type_get_collection ("GPtrArray", OLD_DBUS_TYPE_G_IP6_ADDRESS)) - -static void -_nm_utils_convert_old_ip6_addr_array (const GValue *src_value, GValue *dst_value) -{ - GPtrArray *src_outer_array; - GPtrArray *dst_outer_array; - guint i; - - g_return_if_fail (g_type_is_a (G_VALUE_TYPE (src_value), OLD_DBUS_TYPE_G_ARRAY_OF_IP6_ADDRESS)); - - src_outer_array = (GPtrArray *) g_value_get_boxed (src_value); - dst_outer_array = g_ptr_array_new (); - - for (i = 0; src_outer_array && (i < src_outer_array->len); i++) { - GValueArray *src_addr_array; - GValueArray *dst_addr_array; - GValue element = G_VALUE_INIT; - GValue *src_addr, *src_prefix; - GByteArray *ba; - - src_addr_array = (GValueArray *) g_ptr_array_index (src_outer_array, i); - if (!_nm_utils_gvalue_array_validate (src_addr_array, 2, DBUS_TYPE_G_UCHAR_ARRAY, G_TYPE_UINT)) { - g_warning ("%s: invalid old IPv6 address type", __func__); - return; - } - - dst_addr_array = g_value_array_new (3); - - src_addr = g_value_array_get_nth (src_addr_array, 0); - g_value_array_append (dst_addr_array, src_addr); - src_prefix = g_value_array_get_nth (src_addr_array, 1); - g_value_array_append (dst_addr_array, src_prefix); - - /* Blank Gateway */ - g_value_init (&element, DBUS_TYPE_G_UCHAR_ARRAY); - ba = g_byte_array_new (); - g_byte_array_append (ba, (guint8 *) "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16); - g_value_take_boxed (&element, ba); - g_value_array_append (dst_addr_array, &element); - g_value_unset (&element); - - g_ptr_array_add (dst_outer_array, dst_addr_array); - } - - g_value_take_boxed (dst_value, dst_outer_array); -} - -void -_nm_value_transforms_register (void) -{ - static gboolean registered = FALSE; - - if (G_UNLIKELY (!registered)) { - g_value_register_transform_func (DBUS_TYPE_G_OBJECT_PATH, - G_TYPE_STRING, - _nm_utils_convert_op_to_string); - g_value_register_transform_func (G_TYPE_STRV, - DBUS_TYPE_G_LIST_OF_STRING, - _nm_utils_convert_strv_to_slist); - g_value_register_transform_func (DBUS_TYPE_G_LIST_OF_STRING, - G_TYPE_STRV, - _nm_utils_convert_slist_to_strv); - g_value_register_transform_func (G_TYPE_STRV, - DBUS_TYPE_G_ARRAY_OF_STRING, - _nm_utils_convert_strv_to_ptrarray); - g_value_register_transform_func (DBUS_TYPE_G_LIST_OF_STRING, - G_TYPE_STRING, - _nm_utils_convert_string_list_to_string); - g_value_register_transform_func (DBUS_TYPE_G_ARRAY_OF_STRING, - G_TYPE_STRING, - _nm_utils_convert_string_array_to_string); - g_value_register_transform_func (DBUS_TYPE_G_ARRAY_OF_OBJECT_PATH, - G_TYPE_STRING, - _nm_utils_convert_op_array_to_string); - g_value_register_transform_func (DBUS_TYPE_G_UINT_ARRAY, - G_TYPE_STRING, - _nm_utils_convert_uint_array_to_string); - g_value_register_transform_func (DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UINT, - G_TYPE_STRING, - _nm_utils_convert_ip4_addr_route_struct_array_to_string); - g_value_register_transform_func (DBUS_TYPE_G_MAP_OF_VARIANT, - G_TYPE_STRING, - _nm_utils_convert_gvalue_hash_to_string); - g_value_register_transform_func (DBUS_TYPE_G_MAP_OF_STRING, - G_TYPE_STRING, - _nm_utils_convert_string_hash_to_string); - g_value_register_transform_func (DBUS_TYPE_G_UCHAR_ARRAY, - G_TYPE_STRING, - _nm_utils_convert_byte_array_to_string); - g_value_register_transform_func (DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UCHAR, - G_TYPE_STRING, - _nm_utils_convert_ip6_dns_array_to_string); - g_value_register_transform_func (DBUS_TYPE_G_ARRAY_OF_IP6_ADDRESS, - G_TYPE_STRING, - _nm_utils_convert_ip6_addr_struct_array_to_string); - g_value_register_transform_func (DBUS_TYPE_G_ARRAY_OF_IP6_ROUTE, - G_TYPE_STRING, - _nm_utils_convert_ip6_route_struct_array_to_string); - g_value_register_transform_func (OLD_DBUS_TYPE_G_ARRAY_OF_IP6_ADDRESS, - DBUS_TYPE_G_ARRAY_OF_IP6_ADDRESS, - _nm_utils_convert_old_ip6_addr_array); - registered = TRUE; - } -} diff --git a/libnm-util/nm-version.h b/libnm-util/nm-version.h deleted file mode 100644 index f56c3944dd..0000000000 --- a/libnm-util/nm-version.h +++ /dev/null @@ -1,149 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2011 Red Hat, Inc. - */ - -#ifndef NM_VERSION_H -#define NM_VERSION_H - -#include <glib.h> - -#include "nm-version-macros.h" - -/* Deprecation / Availability macros */ - -#if !defined (NM_VERSION_MIN_REQUIRED) || (NM_VERSION_MIN_REQUIRED == 0) -# undef NM_VERSION_MIN_REQUIRED -# define NM_VERSION_MIN_REQUIRED (NM_API_VERSION) -#endif - -#if !defined (NM_VERSION_MAX_ALLOWED) || (NM_VERSION_MAX_ALLOWED == 0) -# undef NM_VERSION_MAX_ALLOWED -# define NM_VERSION_MAX_ALLOWED (NM_API_VERSION) -#endif - -/* sanity checks */ -#if NM_VERSION_MIN_REQUIRED > NM_API_VERSION -#error "NM_VERSION_MIN_REQUIRED must be <= NM_API_VERSION" -#endif -#if NM_VERSION_MAX_ALLOWED < NM_VERSION_MIN_REQUIRED -#error "NM_VERSION_MAX_ALLOWED must be >= NM_VERSION_MIN_REQUIRED" -#endif -#if NM_VERSION_MIN_REQUIRED < NM_VERSION_0_9_8 -#error "NM_VERSION_MIN_REQUIRED must be >= NM_VERSION_0_9_8" -#endif - -#if NM_VERSION_MIN_REQUIRED >= NM_VERSION_0_9_10 -# define NM_DEPRECATED_IN_0_9_10 G_DEPRECATED -# define NM_DEPRECATED_IN_0_9_10_FOR(f) G_DEPRECATED_FOR(f) -#else -# define NM_DEPRECATED_IN_0_9_10 -# define NM_DEPRECATED_IN_0_9_10_FOR(f) -#endif - -#if NM_VERSION_MAX_ALLOWED < NM_VERSION_0_9_10 -# define NM_AVAILABLE_IN_0_9_10 G_UNAVAILABLE(0.9,10) -#else -# define NM_AVAILABLE_IN_0_9_10 -#endif - -#if NM_VERSION_MIN_REQUIRED >= NM_VERSION_1_0 -# define NM_DEPRECATED_IN_1_0 G_DEPRECATED -# define NM_DEPRECATED_IN_1_0_FOR(f) G_DEPRECATED_FOR(f) -#else -# define NM_DEPRECATED_IN_1_0 -# define NM_DEPRECATED_IN_1_0_FOR(f) -#endif - -#if NM_VERSION_MAX_ALLOWED < NM_VERSION_1_0 -# define NM_AVAILABLE_IN_1_0 G_UNAVAILABLE(1,0) -#else -# define NM_AVAILABLE_IN_1_0 -#endif - -#if NM_VERSION_MIN_REQUIRED >= NM_VERSION_1_2 -# define NM_DEPRECATED_IN_1_2 G_DEPRECATED -# define NM_DEPRECATED_IN_1_2_FOR(f) G_DEPRECATED_FOR(f) -#else -# define NM_DEPRECATED_IN_1_2 -# define NM_DEPRECATED_IN_1_2_FOR(f) -#endif - -#if NM_VERSION_MAX_ALLOWED < NM_VERSION_1_2 -# define NM_AVAILABLE_IN_1_2 G_UNAVAILABLE(1,2) -#else -# define NM_AVAILABLE_IN_1_2 -#endif - -#if NM_VERSION_MIN_REQUIRED >= NM_VERSION_1_4 -# define NM_DEPRECATED_IN_1_4 G_DEPRECATED -# define NM_DEPRECATED_IN_1_4_FOR(f) G_DEPRECATED_FOR(f) -#else -# define NM_DEPRECATED_IN_1_4 -# define NM_DEPRECATED_IN_1_4_FOR(f) -#endif - -#if NM_VERSION_MAX_ALLOWED < NM_VERSION_1_4 -# define NM_AVAILABLE_IN_1_4 G_UNAVAILABLE(1,4) -#else -# define NM_AVAILABLE_IN_1_4 -#endif - -#if NM_VERSION_MIN_REQUIRED >= NM_VERSION_1_6 -# define NM_DEPRECATED_IN_1_6 G_DEPRECATED -# define NM_DEPRECATED_IN_1_6_FOR(f) G_DEPRECATED_FOR(f) -#else -# define NM_DEPRECATED_IN_1_6 -# define NM_DEPRECATED_IN_1_6_FOR(f) -#endif - -#if NM_VERSION_MAX_ALLOWED < NM_VERSION_1_6 -# define NM_AVAILABLE_IN_1_6 G_UNAVAILABLE(1,6) -#else -# define NM_AVAILABLE_IN_1_6 -#endif - -#if NM_VERSION_MIN_REQUIRED >= NM_VERSION_1_8 -# define NM_DEPRECATED_IN_1_8 G_DEPRECATED -# define NM_DEPRECATED_IN_1_8_FOR(f) G_DEPRECATED_FOR(f) -#else -# define NM_DEPRECATED_IN_1_8 -# define NM_DEPRECATED_IN_1_8_FOR(f) -#endif - -#if NM_VERSION_MAX_ALLOWED < NM_VERSION_1_8 -# define NM_AVAILABLE_IN_1_8 G_UNAVAILABLE(1,8) -#else -# define NM_AVAILABLE_IN_1_8 -#endif - -#if NM_VERSION_MIN_REQUIRED >= NM_VERSION_1_10 -# define NM_DEPRECATED_IN_1_10 G_DEPRECATED -# define NM_DEPRECATED_IN_1_10_FOR(f) G_DEPRECATED_FOR(f) -#else -# define NM_DEPRECATED_IN_1_10 -# define NM_DEPRECATED_IN_1_10_FOR(f) -#endif - -#if NM_VERSION_MAX_ALLOWED < NM_VERSION_1_10 -# define NM_AVAILABLE_IN_1_10 G_UNAVAILABLE(1,10) -#else -# define NM_AVAILABLE_IN_1_10 -#endif - -#endif /* NM_VERSION_H */ diff --git a/libnm-util/tests/meson.build b/libnm-util/tests/meson.build deleted file mode 100644 index 09642f319f..0000000000 --- a/libnm-util/tests/meson.build +++ /dev/null @@ -1,45 +0,0 @@ -deps = [ - dbus_dep, - dbus_glib_dep, - libnm_util_dep, - shared_nm_glib_aux_dep, -] - -cflags = common_cflags + [ - '-DNETWORKMANAGER_COMPILATION_TEST', -] - -test = 'test-libnm-linking' - -test_libnm_linking = executable( - test, - test + '.c', - dependencies: deps + [libnm_dep], - c_args: cflags, -) - -test_units = [ - ['test-crypto', [libtest_crypto], []], - ['test-general', [], [test_libnm_linking]], - ['test-secrets', [], []], - ['test-setting-8021x', [], []], - ['test-setting-dcb', [], []], - ['test-settings-defaults', [], []], -] - -foreach test_unit: test_units - exe = executable( - 'libnm-util-' + test_unit[0], - test_unit[0] + '.c', - dependencies: deps, - c_args: cflags, - link_with: test_unit[1], - link_depends: test_unit[2], - ) - - test( - 'libnm-util/' + test_unit[0], - test_script, - args: test_args + [exe.full_path()], - ) -endforeach diff --git a/libnm-util/tests/test-crypto.c b/libnm-util/tests/test-crypto.c deleted file mode 100644 index af6028a52e..0000000000 --- a/libnm-util/tests/test-crypto.c +++ /dev/null @@ -1,403 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * Dan Williams <dcbw@redhat.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2011 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <unistd.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> - -#include "crypto.h" -#include "nm-utils.h" - -#include "nm-utils/nm-test-utils.h" - -#define TEST_CERT_DIR NM_BUILD_SRCDIR"/libnm-core/tests/certs" - -#if 0 -static const char *pem_rsa_key_begin = "-----BEGIN RSA PRIVATE KEY-----"; -static const char *pem_rsa_key_end = "-----END RSA PRIVATE KEY-----"; - -static const char *pem_dsa_key_begin = "-----BEGIN DSA PRIVATE KEY-----"; -static const char *pem_dsa_key_end = "-----END DSA PRIVATE KEY-----"; - -static void -dump_key_to_pem (const char *key, gsize key_len, int key_type) -{ - char *b64 = NULL; - GString *str = NULL; - const char *start_tag; - const char *end_tag; - char *p; - - switch (key_type) { - case NM_CRYPTO_KEY_TYPE_RSA: - start_tag = pem_rsa_key_begin; - end_tag = pem_rsa_key_end; - break; - case NM_CRYPTO_KEY_TYPE_DSA: - start_tag = pem_dsa_key_begin; - end_tag = pem_dsa_key_end; - break; - default: - g_warning ("Unknown key type %d", key_type); - return; - } - - b64 = g_base64_encode ((const unsigned char *) key, key_len); - if (!b64) { - g_warning ("Couldn't base64 encode the key."); - goto out; - } - - str = g_string_new (NULL); - - g_string_append (str, start_tag); - g_string_append_c (str, '\n'); - - for (p = b64; p < (b64 + strlen (b64)); p += 64) { - g_string_append_len (str, p, strnlen (p, 64)); - g_string_append_c (str, '\n'); - } - - g_string_append (str, end_tag); - g_string_append_c (str, '\n'); - - g_message ("Decrypted private key:\n\n%s", str->str); - -out: - g_free (b64); - if (str) - g_string_free (str, TRUE); -} -#endif - -static void -test_cert (gconstpointer test_data) -{ - gs_free char *path = NULL; - GByteArray *array; - NMCryptoFileFormat format = NM_CRYPTO_FILE_FORMAT_UNKNOWN; - GError *error = NULL; - - path = g_build_filename (TEST_CERT_DIR, (const char *) test_data, NULL); - - array = crypto_load_and_verify_certificate (path, &format, &error); - nmtst_assert_success (array != NULL, error); - g_assert (format == NM_CRYPTO_FILE_FORMAT_X509); - - g_byte_array_free (array, TRUE); -} - -static GByteArray * -file_to_byte_array (const char *filename) -{ - char *contents; - GByteArray *array = NULL; - gsize length = 0; - - if (g_file_get_contents (filename, &contents, &length, NULL)) { - array = g_byte_array_sized_new (length); - g_byte_array_append (array, (guint8 *) contents, length); - g_assert (array->len == length); - g_free (contents); - } - return array; -} - -static void -test_load_private_key (const char *path, - const char *password, - const char *decrypted_path, - gboolean expect_fail, - const char *desc) -{ - NMCryptoKeyType key_type = NM_CRYPTO_KEY_TYPE_UNKNOWN; - GByteArray *array, *decrypted; - GError *error = NULL; - - array = crypto_decrypt_private_key (path, password, &key_type, &error); - if (expect_fail) { - g_assert (!array); - g_assert ((password && error) || (!password && !error)); - g_assert (key_type != NM_CRYPTO_KEY_TYPE_UNKNOWN); - g_clear_error (&error); - return; - } - - g_assert (array); - g_assert (key_type == NM_CRYPTO_KEY_TYPE_RSA); - - if (decrypted_path) { - /* Compare the crypto decrypted key against a known-good decryption */ - decrypted = file_to_byte_array (decrypted_path); - g_assert (decrypted); - g_assert_cmpint (decrypted->len, >, 0); - g_assert_cmpmem (decrypted->data, decrypted->len, array->data, array->len); - - g_byte_array_free (decrypted, TRUE); - } - - g_clear_error (&error); - g_byte_array_free (array, TRUE); -} - -static void -test_load_pkcs12 (const char *path, - const char *password, - gboolean expect_fail, - const char *desc) -{ - NMCryptoFileFormat format = NM_CRYPTO_FILE_FORMAT_UNKNOWN; - GError *error = NULL; - - format = crypto_verify_private_key (path, password, &error); - if (expect_fail) - g_assert (format == NM_CRYPTO_FILE_FORMAT_UNKNOWN); - else - g_assert (format == NM_CRYPTO_FILE_FORMAT_PKCS12); - g_clear_error (&error); -} - -static void -test_load_pkcs12_no_password (const char *path, const char *desc) -{ - NMCryptoFileFormat format = NM_CRYPTO_FILE_FORMAT_UNKNOWN; - GError *error = NULL; - - /* We should still get a valid returned crypto file format */ - format = crypto_verify_private_key (path, NULL, &error); - g_assert (format == NM_CRYPTO_FILE_FORMAT_PKCS12); -} - -static void -test_is_pkcs12 (const char *path, gboolean expect_fail, const char *desc) -{ - gboolean is_pkcs12; - - is_pkcs12 = crypto_is_pkcs12_file (path, NULL); - if (expect_fail) - g_assert (!is_pkcs12); - else - g_assert (is_pkcs12); -} - -static void -test_load_pkcs8 (const char *path, - const char *password, - gboolean expect_fail, - const char *desc) -{ - NMCryptoFileFormat format = NM_CRYPTO_FILE_FORMAT_UNKNOWN; - GError *error = NULL; - - format = crypto_verify_private_key (path, password, &error); - if (expect_fail) - g_assert (format == NM_CRYPTO_FILE_FORMAT_UNKNOWN); - else - g_assert (format == NM_CRYPTO_FILE_FORMAT_RAW_KEY); -} - -static gboolean -is_cipher_aes (const char *path) -{ - char *contents; - gsize length = 0; - const char *cipher; - gboolean is_aes = FALSE; - - if (!g_file_get_contents (path, &contents, &length, NULL)) - return FALSE; - - cipher = strstr (contents, "DEK-Info: "); - if (cipher) { - cipher += strlen ("DEK-Info: "); - if (g_str_has_prefix (cipher, "AES-128-CBC")) - is_aes = TRUE; - } - - g_free (contents); - return is_aes; -} - -static void -test_encrypt_private_key (const char *path, - const char *password, - const char *desc) -{ - NMCryptoKeyType key_type = NM_CRYPTO_KEY_TYPE_UNKNOWN; - GByteArray *array, *encrypted, *re_decrypted; - GError *error = NULL; - - array = crypto_decrypt_private_key (path, password, &key_type, &error); - g_assert (array); - g_assert_no_error (error); - g_assert (key_type == NM_CRYPTO_KEY_TYPE_RSA); - - /* Now re-encrypt the private key */ - if (is_cipher_aes (path)) - encrypted = nm_utils_rsa_key_encrypt_aes (array, password, NULL, &error); - else - encrypted = nm_utils_rsa_key_encrypt (array, password, NULL, &error); - g_assert (encrypted); - g_assert_no_error (error); - - /* Then re-decrypt the private key */ - key_type = NM_CRYPTO_KEY_TYPE_UNKNOWN; - re_decrypted = crypto_decrypt_private_key_data (encrypted, password, &key_type, &error); - g_assert (re_decrypted); - g_assert_no_error (error); - g_assert (key_type == NM_CRYPTO_KEY_TYPE_RSA); - - /* Compare the original decrypted key with the re-decrypted key */ - g_assert_cmpmem (array->data, array->len, re_decrypted->data, re_decrypted->len); - - g_byte_array_free (re_decrypted, TRUE); - g_byte_array_free (encrypted, TRUE); - g_byte_array_free (array, TRUE); -} - -static void -test_key (gconstpointer test_data) -{ - char **parts, *path, *password, *decrypted_path; - int len; - - parts = g_strsplit ((const char *) test_data, ", ", -1); - len = g_strv_length (parts); - g_assert (len == 2 || len == 3); - - path = g_build_filename (TEST_CERT_DIR, parts[0], NULL); - password = parts[1]; - decrypted_path = parts[2] ? g_build_filename (TEST_CERT_DIR, parts[2], NULL) : NULL; - - test_is_pkcs12 (path, TRUE, "not-pkcs12"); - test_load_private_key (path, password, decrypted_path, FALSE, "private-key"); - test_load_private_key (path, "blahblahblah", NULL, TRUE, "private-key-bad-password"); - test_load_private_key (path, NULL, NULL, TRUE, "private-key-no-password"); - test_encrypt_private_key (path, password, "private-key-rencrypt"); - - g_free (path); - g_free (decrypted_path); - g_strfreev (parts); -} - -static void -test_pkcs12 (gconstpointer test_data) -{ - char **parts, *path, *password; - - parts = g_strsplit ((const char *) test_data, ", ", -1); - g_assert_cmpint (g_strv_length (parts), ==, 2); - - path = g_build_filename (TEST_CERT_DIR, parts[0], NULL); - password = parts[1]; - - test_is_pkcs12 (path, FALSE, "is-pkcs12"); - test_load_pkcs12 (path, password, FALSE, "pkcs12-private-key"); - test_load_pkcs12 (path, "blahblahblah", TRUE, "pkcs12-private-key-bad-password"); - test_load_pkcs12_no_password (path, "pkcs12-private-key-no-password"); - - g_free (path); - g_strfreev (parts); -} - -static void -test_pkcs8 (gconstpointer test_data) -{ - char **parts, *path, *password; - - parts = g_strsplit ((const char *) test_data, ", ", -1); - g_assert_cmpint (g_strv_length (parts), ==, 2); - - path = g_build_filename (TEST_CERT_DIR, parts[0], NULL); - password = parts[1]; - - test_is_pkcs12 (path, TRUE, "not-pkcs12"); - test_load_pkcs8 (path, password, FALSE, "pkcs8-private-key"); - - g_free (path); - g_strfreev (parts); -} - -NMTST_DEFINE (); - -int -main (int argc, char **argv) -{ - GError *error = NULL; - gboolean success; - - nmtst_init (&argc, &argv, TRUE); - - success = crypto_init (&error); - g_assert_no_error (error); - g_assert (success); - - g_test_add_data_func ("/libnm/crypto/cert/pem", - "test_ca_cert.pem", - test_cert); - g_test_add_data_func ("/libnm/crypto/cert/pem-2", - "test2_ca_cert.pem", - test_cert); - g_test_add_data_func ("/libnm/crypto/cert/der", - "test_ca_cert.der", - test_cert); - g_test_add_data_func ("/libnm/crypto/cert/pem-no-ending-newline", - "ca-no-ending-newline.pem", - test_cert); - g_test_add_data_func ("/libnm/crypto/cert/pem-combined", - "test_key_and_cert.pem", - test_cert); - g_test_add_data_func ("/libnm/crypto/cert/pem-combined-2", - "test2_key_and_cert.pem", - test_cert); - - g_test_add_data_func ("/libnm/crypto/key/padding-6", - "test_key_and_cert.pem, test, test-key-only-decrypted.der", - test_key); - g_test_add_data_func ("/libnm/crypto/key/key-only", - "test-key-only.pem, test, test-key-only-decrypted.der", - test_key); - g_test_add_data_func ("/libnm/crypto/key/padding-8", - "test2_key_and_cert.pem, 12345testing", - test_key); - g_test_add_data_func ("/libnm/crypto/key/aes-128", - "test-aes-128-key.pem, test-aes-password", - test_key); - - g_test_add_data_func ("/libnm/crypto/PKCS#12/1", - "test-cert.p12, test", - test_pkcs12); - g_test_add_data_func ("/libnm/crypto/PKCS#12/2", - "test2-cert.p12, 12345testing", - test_pkcs12); - - g_test_add_data_func ("/libnm/crypto/PKCS#8", - "pkcs8-enc-key.pem, 1234567890", - test_pkcs8); - - return g_test_run (); -} - diff --git a/libnm-util/tests/test-general.c b/libnm-util/tests/test-general.c deleted file mode 100644 index 9e097f19aa..0000000000 --- a/libnm-util/tests/test-general.c +++ /dev/null @@ -1,2560 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Copyright 2008 - 2011 Red Hat, Inc. - * - */ - -#include "nm-default.h" - -#include <dbus/dbus-glib.h> -#include <string.h> -#include <netinet/ether.h> -#include <linux/if_infiniband.h> -#include <sys/wait.h> -#include <sys/resource.h> - -#include "nm-utils.h" -#include "nm-gvaluearray-compat.h" - -#include "nm-setting-private.h" -#include "nm-setting-connection.h" -#include "nm-setting-vpn.h" -#include "nm-setting-gsm.h" -#include "nm-setting-cdma.h" -#include "nm-setting-wired.h" -#include "nm-setting-wireless-security.h" -#include "nm-setting-ip6-config.h" -#include "nm-setting-ip4-config.h" -#include "nm-setting-pppoe.h" -#include "nm-setting-serial.h" -#include "nm-setting-vlan.h" -#include "nm-setting-bond.h" -#include "nm-utils.h" -#include "nm-dbus-glib-types.h" - -#include "nm-utils/nm-test-utils.h" - -static void -vpn_check_func (const char *key, const char *value, gpointer user_data) -{ - if (!strcmp (key, "foobar1")) { - g_assert_cmpstr (value, ==, "blahblah1"); - return; - } - - if (!strcmp (key, "foobar2")) { - g_assert_cmpstr (value, ==, "blahblah2"); - return; - } - - if (!strcmp (key, "foobar3")) { - g_assert_cmpstr (value, ==, "blahblah3"); - return; - } - - if (!strcmp (key, "foobar4")) { - g_assert_cmpstr (value, ==, "blahblah4"); - return; - } - - g_assert_not_reached (); -} - -static void -vpn_check_empty_func (const char *key, const char *value, gpointer user_data) -{ - g_assert_not_reached (); -} - -static void -test_setting_vpn_items (void) -{ - NMSettingVPN *s_vpn; - - s_vpn = (NMSettingVPN *) nm_setting_vpn_new (); - g_assert (s_vpn); - - nm_setting_vpn_add_data_item (s_vpn, "foobar1", "blahblah1"); - nm_setting_vpn_add_data_item (s_vpn, "foobar2", "blahblah2"); - nm_setting_vpn_add_data_item (s_vpn, "foobar3", "blahblah3"); - nm_setting_vpn_add_data_item (s_vpn, "foobar4", "blahblah4"); - - /* Ensure that added values are all present */ - nm_setting_vpn_foreach_data_item (s_vpn, vpn_check_func, NULL); - nm_setting_vpn_remove_data_item (s_vpn, "foobar1"); - nm_setting_vpn_remove_data_item (s_vpn, "foobar2"); - nm_setting_vpn_remove_data_item (s_vpn, "foobar3"); - nm_setting_vpn_remove_data_item (s_vpn, "foobar4"); - - nm_setting_vpn_add_secret (s_vpn, "foobar1", "blahblah1"); - nm_setting_vpn_add_secret (s_vpn, "foobar2", "blahblah2"); - nm_setting_vpn_add_secret (s_vpn, "foobar3", "blahblah3"); - nm_setting_vpn_add_secret (s_vpn, "foobar4", "blahblah4"); - - /* Ensure that added values are all present */ - nm_setting_vpn_foreach_secret (s_vpn, vpn_check_func, NULL); - nm_setting_vpn_remove_secret (s_vpn, "foobar1"); - nm_setting_vpn_remove_secret (s_vpn, "foobar2"); - nm_setting_vpn_remove_secret (s_vpn, "foobar3"); - nm_setting_vpn_remove_secret (s_vpn, "foobar4"); - - /* Try to add some blank values and make sure they are rejected */ - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (key != NULL)); - nm_setting_vpn_add_data_item (s_vpn, NULL, NULL); - g_test_assert_expected_messages (); - - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (strlen (key) > 0)); - nm_setting_vpn_add_data_item (s_vpn, "", ""); - g_test_assert_expected_messages (); - - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (item != NULL)); - nm_setting_vpn_add_data_item (s_vpn, "foobar1", NULL); - g_test_assert_expected_messages (); - - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (strlen (item) > 0)); - nm_setting_vpn_add_data_item (s_vpn, "foobar1", ""); - g_test_assert_expected_messages (); - - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (key != NULL)); - nm_setting_vpn_add_data_item (s_vpn, NULL, "blahblah1"); - g_test_assert_expected_messages (); - - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (strlen (key) > 0)); - nm_setting_vpn_add_data_item (s_vpn, "", "blahblah1"); - g_test_assert_expected_messages (); - - nm_setting_vpn_foreach_data_item (s_vpn, vpn_check_empty_func, NULL); - - /* Try to add some blank secrets and make sure they are rejected */ - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (key != NULL)); - nm_setting_vpn_add_secret (s_vpn, NULL, NULL); - g_test_assert_expected_messages (); - - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (strlen (key) > 0)); - nm_setting_vpn_add_secret (s_vpn, "", ""); - g_test_assert_expected_messages (); - - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (secret != NULL)); - nm_setting_vpn_add_secret (s_vpn, "foobar1", NULL); - g_test_assert_expected_messages (); - - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (strlen (secret) > 0)); - nm_setting_vpn_add_secret (s_vpn, "foobar1", ""); - g_test_assert_expected_messages (); - - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (key != NULL)); - nm_setting_vpn_add_secret (s_vpn, NULL, "blahblah1"); - g_test_assert_expected_messages (); - - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (strlen (key) > 0)); - nm_setting_vpn_add_secret (s_vpn, "", "blahblah1"); - g_test_assert_expected_messages (); - - nm_setting_vpn_foreach_secret (s_vpn, vpn_check_empty_func, NULL); - - g_object_unref (s_vpn); -} - -static void -test_setting_vpn_update_secrets (void) -{ - NMConnection *connection; - NMSettingVPN *s_vpn; - GHashTable *settings, *vpn, *secrets; - GValue val = G_VALUE_INIT; - gboolean success; - GError *error = NULL; - const char *tmp; - const char *key1 = "foobar"; - const char *key2 = "blahblah"; - const char *val1 = "value1"; - const char *val2 = "value2"; - - connection = nm_connection_new (); - g_assert (connection); - - s_vpn = (NMSettingVPN *) nm_setting_vpn_new (); - g_assert (s_vpn); - nm_connection_add_setting (connection, NM_SETTING (s_vpn)); - - settings = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify) g_hash_table_destroy); - vpn = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify) g_value_unset); - g_hash_table_insert (settings, NM_SETTING_VPN_SETTING_NAME, vpn); - - secrets = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL); - g_value_init (&val, DBUS_TYPE_G_MAP_OF_STRING); - g_value_take_boxed (&val, secrets); - g_hash_table_insert (vpn, NM_SETTING_VPN_SECRETS, &val); - - /* Add some secrets */ - g_hash_table_insert (secrets, (char *) key1, (char *) val1); - g_hash_table_insert (secrets, (char *) key2, (char *) val2); - - success = nm_connection_update_secrets (connection, NM_SETTING_VPN_SETTING_NAME, settings, &error); - g_assert_no_error (error); - g_assert (success); - - /* Read the secrets back out */ - tmp = nm_setting_vpn_get_secret (s_vpn, key1); - g_assert (tmp); - g_assert_cmpstr (tmp, ==, val1); - - tmp = nm_setting_vpn_get_secret (s_vpn, key2); - g_assert (tmp); - g_assert_cmpstr (tmp, ==, val2); - - g_hash_table_destroy (settings); - g_object_unref (connection); -} - -#define TO_DEL_NUM 50 -typedef struct { - NMSettingVPN *s_vpn; - char *to_del[TO_DEL_NUM]; - guint called; -} IterInfo; - -static void -del_iter_func (const char *key, const char *value, gpointer user_data) -{ - IterInfo *info = user_data; - int i; - - /* Record how many times this function gets called; it should get called - * exactly as many times as there are keys in the hash table, regardless - * of what keys we delete from the table. - */ - info->called++; - - /* During the iteration, remove a bunch of stuff from the table */ - if (info->called == 1) { - for (i = 0; i < TO_DEL_NUM; i++) - nm_setting_vpn_remove_data_item (info->s_vpn, info->to_del[i]); - } -} - -static void -test_setting_vpn_modify_during_foreach (void) -{ - NMSettingVPN *s_vpn; - IterInfo info; - char *key, *val; - int i, u = 0; - - s_vpn = (NMSettingVPN *) nm_setting_vpn_new (); - g_assert (s_vpn); - - for (i = 0; i < TO_DEL_NUM * 2; i++) { - key = g_strdup_printf ("adsfasdfadf%d", i); - val = g_strdup_printf ("42263236236awt%d", i); - nm_setting_vpn_add_data_item (s_vpn, key, val); - - /* Cache some keys to delete */ - if (i % 2) - info.to_del[u++] = g_strdup (key); - - g_free (key); - g_free (val); - } - - /* Iterate over current table keys */ - info.s_vpn = s_vpn; - info.called = 0; - nm_setting_vpn_foreach_data_item (s_vpn, del_iter_func, &info); - - /* Make sure all the things we removed during iteration are really gone */ - for (i = 0; i < TO_DEL_NUM; i++) { - g_assert_cmpstr (nm_setting_vpn_get_data_item (s_vpn, info.to_del[i]), ==, NULL); - g_free (info.to_del[i]); - } - - /* And make sure the foreach callback was called the same number of times - * as there were keys in the table at the beginning of the foreach. - */ - g_assert_cmpint (info.called, ==, TO_DEL_NUM * 2); - - g_object_unref (s_vpn); -} - -static void -_g_value_array_free (void *ptr) -{ - if (ptr) - g_value_array_free ((GValueArray *) ptr); -} - -#define OLD_DBUS_TYPE_G_IP6_ADDRESS (dbus_g_type_get_struct ("GValueArray", DBUS_TYPE_G_UCHAR_ARRAY, G_TYPE_UINT, G_TYPE_INVALID)) -#define OLD_DBUS_TYPE_G_ARRAY_OF_IP6_ADDRESS (dbus_g_type_get_collection ("GPtrArray", OLD_DBUS_TYPE_G_IP6_ADDRESS)) - -/* Test that setting the IPv6 setting's 'addresses' property using the old - * IPv6 address format still works, i.e. that the GValue transformation function - * from old->new is working correctly. - */ -static void -test_setting_ip6_config_old_address_array (void) -{ - NMSettingIP6Config *s_ip6; - GPtrArray *addresses, *read_addresses; - GValueArray *array, *read_array; - GValue element = G_VALUE_INIT, written_value = G_VALUE_INIT, read_value = G_VALUE_INIT; - GByteArray *ba; - const guint8 addr[16] = { 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, - 0x11, 0x22, 0x33, 0x44, 0x66, 0x77, 0x88, 0x99 }; - const guint8 gw[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - guint32 prefix = 56; - GValue *read_addr, *read_prefix, *read_gw; - - s_ip6 = (NMSettingIP6Config *) nm_setting_ip6_config_new (); - g_assert (s_ip6); - - g_value_init (&written_value, OLD_DBUS_TYPE_G_ARRAY_OF_IP6_ADDRESS); - - addresses = g_ptr_array_new_full (0, _g_value_array_free); - array = g_value_array_new (3); - - /* IP address */ - g_value_init (&element, DBUS_TYPE_G_UCHAR_ARRAY); - ba = g_byte_array_new (); - g_byte_array_append (ba, &addr[0], sizeof (addr)); - g_value_take_boxed (&element, ba); - g_value_array_append (array, &element); - g_value_unset (&element); - - /* Prefix */ - g_value_init (&element, G_TYPE_UINT); - g_value_set_uint (&element, prefix); - g_value_array_append (array, &element); - g_value_unset (&element); - - g_ptr_array_add (addresses, array); - g_value_set_boxed (&written_value, addresses); - - /* Set the address array on the object */ - g_object_set_property (G_OBJECT (s_ip6), NM_SETTING_IP6_CONFIG_ADDRESSES, &written_value); - - /* Get it back so we can compare it */ - g_value_init (&read_value, DBUS_TYPE_G_ARRAY_OF_IP6_ADDRESS); - g_object_get_property (G_OBJECT (s_ip6), NM_SETTING_IP6_CONFIG_ADDRESSES, &read_value); - - g_assert (G_VALUE_HOLDS (&read_value, DBUS_TYPE_G_ARRAY_OF_IP6_ADDRESS)); - - read_addresses = (GPtrArray *) g_value_get_boxed (&read_value); - g_assert (read_addresses); - g_assert_cmpint (read_addresses->len, ==, 1); - - read_array = (GValueArray *) g_ptr_array_index (read_addresses, 0); - - read_addr = g_value_array_get_nth (read_array, 0); - ba = g_value_get_boxed (read_addr); - g_assert_cmpint (ba->len, ==, sizeof (addr)); - g_assert_cmpmem (ba->data, ba->len, &addr[0], sizeof (addr)); - - read_prefix = g_value_array_get_nth (read_array, 1); - g_assert_cmpint (g_value_get_uint (read_prefix), ==, prefix); - - /* Ensure the gateway is all zeros, which is how the 2-item to 3-item - * conversion happens. - */ - read_gw = g_value_array_get_nth (read_array, 2); - ba = g_value_get_boxed (read_gw); - g_assert_cmpint (ba->len, ==, sizeof (gw)); - g_assert_cmpmem (ba->data, ba->len, &gw[0], sizeof (gw)); - - g_ptr_array_unref (addresses); - g_value_unset (&written_value); - g_value_unset (&read_value); - g_object_unref (s_ip6); -} - -static void -test_setting_gsm_apn_spaces (void) -{ - gs_unref_object NMSettingGsm *s_gsm = NULL; - const char *tmp; - - s_gsm = (NMSettingGsm *) nm_setting_gsm_new (); - g_assert (s_gsm); - - /* Trailing space */ - g_object_set (s_gsm, NM_SETTING_GSM_APN, "foobar ", NULL); - tmp = nm_setting_gsm_get_apn (s_gsm); - g_assert_cmpstr (tmp, ==, "foobar"); - - /* Leading space */ - g_object_set (s_gsm, NM_SETTING_GSM_APN, " foobar", NULL); - tmp = nm_setting_gsm_get_apn (s_gsm); - g_assert_cmpstr (tmp, ==, "foobar"); -} - -static void -test_setting_gsm_apn_bad_chars (void) -{ - gs_unref_object NMSettingGsm *s_gsm = NULL; - - s_gsm = (NMSettingGsm *) nm_setting_gsm_new (); - g_assert (s_gsm); - - g_object_set (s_gsm, NM_SETTING_GSM_NUMBER, "*99#", NULL); - - /* Make sure a valid APN works */ - g_object_set (s_gsm, NM_SETTING_GSM_APN, "foobar123.-baz", NULL); - g_assert (nm_setting_verify (NM_SETTING (s_gsm), NULL, NULL)); - - /* Random invalid chars */ - g_object_set (s_gsm, NM_SETTING_GSM_APN, "@#%$@#%@#%", NULL); - g_assert (!nm_setting_verify (NM_SETTING (s_gsm), NULL, NULL)); - - /* Spaces */ - g_object_set (s_gsm, NM_SETTING_GSM_APN, "foobar baz", NULL); - g_assert (!nm_setting_verify (NM_SETTING (s_gsm), NULL, NULL)); - - /* 0 characters long */ - g_object_set (s_gsm, NM_SETTING_GSM_APN, "", NULL); - g_assert (!nm_setting_verify (NM_SETTING (s_gsm), NULL, NULL)); - - /* 65-character long */ - g_object_set (s_gsm, NM_SETTING_GSM_APN, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl1", NULL); - g_assert (!nm_setting_verify (NM_SETTING (s_gsm), NULL, NULL)); -} - -static void -test_setting_gsm_apn_underscore (void) -{ - gs_unref_object NMSettingGsm *s_gsm = NULL; - GError *error = NULL; - gboolean success; - - s_gsm = (NMSettingGsm *) nm_setting_gsm_new (); - g_assert (s_gsm); - - g_object_set (s_gsm, NM_SETTING_GSM_NUMBER, "*99#", NULL); - - /* 65-character long */ - g_object_set (s_gsm, NM_SETTING_GSM_APN, "foobar_baz", NULL); - success = nm_setting_verify (NM_SETTING (s_gsm), NULL, &error); - g_assert_no_error (error); - g_assert (success == TRUE); -} - -static void -test_setting_gsm_without_number (void) -{ - gs_unref_object NMSettingGsm *s_gsm = NULL; - GError *error = NULL; - gboolean success; - - s_gsm = (NMSettingGsm *) nm_setting_gsm_new (); - g_assert (s_gsm); - - g_object_set (s_gsm, NM_SETTING_GSM_NUMBER, NULL, NULL); - success = nm_setting_verify (NM_SETTING (s_gsm), NULL, &error); - g_assert_no_error (error); - g_assert (success == TRUE); - - g_object_set (s_gsm, NM_SETTING_GSM_NUMBER, "", NULL); - success = nm_setting_verify (NM_SETTING (s_gsm), NULL, &error); - g_assert_error (error, NM_SETTING_GSM_ERROR, NM_SETTING_GSM_ERROR_INVALID_PROPERTY); - g_error_free (error); -} - -static NMSettingWirelessSecurity * -make_test_wsec_setting (const char *detail) -{ - NMSettingWirelessSecurity *s_wsec; - - s_wsec = (NMSettingWirelessSecurity *) nm_setting_wireless_security_new (); - g_assert (s_wsec); - g_object_set (s_wsec, - NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, "wpa-psk", - NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME, "foobarbaz", - NM_SETTING_WIRELESS_SECURITY_PSK, "random psk", - NM_SETTING_WIRELESS_SECURITY_WEP_KEY0, "aaaaaaaaaa", - NULL); - return s_wsec; -} - -static void -test_setting_to_hash_all (void) -{ - NMSettingWirelessSecurity *s_wsec; - GHashTable *hash; - - s_wsec = make_test_wsec_setting ("setting-to-hash-all"); - - hash = nm_setting_to_hash (NM_SETTING (s_wsec), NM_SETTING_HASH_FLAG_ALL); - - /* Make sure all keys are there */ - g_assert (g_hash_table_lookup (hash, NM_SETTING_WIRELESS_SECURITY_KEY_MGMT)); - g_assert (g_hash_table_lookup (hash, NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME)); - g_assert (g_hash_table_lookup (hash, NM_SETTING_WIRELESS_SECURITY_PSK)); - g_assert (g_hash_table_lookup (hash, NM_SETTING_WIRELESS_SECURITY_WEP_KEY0)); - - g_hash_table_destroy (hash); - g_object_unref (s_wsec); -} - -static void -test_setting_to_hash_no_secrets (void) -{ - NMSettingWirelessSecurity *s_wsec; - GHashTable *hash; - - s_wsec = make_test_wsec_setting ("setting-to-hash-no-secrets"); - - hash = nm_setting_to_hash (NM_SETTING (s_wsec), NM_SETTING_HASH_FLAG_NO_SECRETS); - - /* Make sure non-secret keys are there */ - g_assert (g_hash_table_lookup (hash, NM_SETTING_WIRELESS_SECURITY_KEY_MGMT)); - g_assert (g_hash_table_lookup (hash, NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME)); - - /* Make sure secrets are not there */ - g_assert (!g_hash_table_lookup (hash, NM_SETTING_WIRELESS_SECURITY_PSK)); - g_assert (!g_hash_table_lookup (hash, NM_SETTING_WIRELESS_SECURITY_WEP_KEY0)); - - g_hash_table_destroy (hash); - g_object_unref (s_wsec); -} - -static void -test_setting_to_hash_only_secrets (void) -{ - NMSettingWirelessSecurity *s_wsec; - GHashTable *hash; - - s_wsec = make_test_wsec_setting ("setting-to-hash-only-secrets"); - - hash = nm_setting_to_hash (NM_SETTING (s_wsec), NM_SETTING_HASH_FLAG_ONLY_SECRETS); - - /* Make sure non-secret keys are there */ - g_assert (!g_hash_table_lookup (hash, NM_SETTING_WIRELESS_SECURITY_KEY_MGMT)); - g_assert (!g_hash_table_lookup (hash, NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME)); - - /* Make sure secrets are not there */ - g_assert (g_hash_table_lookup (hash, NM_SETTING_WIRELESS_SECURITY_PSK)); - g_assert (g_hash_table_lookup (hash, NM_SETTING_WIRELESS_SECURITY_WEP_KEY0)); - - g_hash_table_destroy (hash); - g_object_unref (s_wsec); -} - -static void -test_connection_to_hash_setting_name (void) -{ - NMConnection *connection; - NMSettingWirelessSecurity *s_wsec; - GHashTable *hash; - - connection = nm_connection_new (); - s_wsec = make_test_wsec_setting ("connection-to-hash-setting-name"); - nm_connection_add_setting (connection, NM_SETTING (s_wsec)); - - hash = nm_connection_to_hash (connection, NM_SETTING_HASH_FLAG_ALL); - - /* Make sure the keys of the first level hash are setting names, not - * the GType name of the setting objects. - */ - g_assert (g_hash_table_lookup (hash, NM_SETTING_WIRELESS_SECURITY_SETTING_NAME)); - - g_hash_table_destroy (hash); - g_object_unref (connection); -} - -static void -test_setting_new_from_hash (void) -{ - NMSettingWirelessSecurity *s_wsec; - GHashTable *hash; - - s_wsec = make_test_wsec_setting ("setting-to-hash-all"); - hash = nm_setting_to_hash (NM_SETTING (s_wsec), NM_SETTING_HASH_FLAG_ALL); - g_object_unref (s_wsec); - - s_wsec = (NMSettingWirelessSecurity *) nm_setting_new_from_hash (NM_TYPE_SETTING_WIRELESS_SECURITY, hash); - g_hash_table_destroy (hash); - - g_assert (s_wsec); - g_assert_cmpstr (nm_setting_wireless_security_get_key_mgmt (s_wsec), ==, "wpa-psk"); - g_assert_cmpstr (nm_setting_wireless_security_get_leap_username (s_wsec), ==, "foobarbaz"); - g_assert_cmpstr (nm_setting_wireless_security_get_psk (s_wsec), ==, "random psk"); - g_object_unref (s_wsec); -} - -static NMConnection * -new_test_connection (void) -{ - NMConnection *connection; - NMSetting *setting; - char *uuid; - guint64 timestamp = time (NULL); - - connection = nm_connection_new (); - - setting = nm_setting_connection_new (); - uuid = nm_utils_uuid_generate (); - g_object_set (G_OBJECT (setting), - NM_SETTING_CONNECTION_ID, "foobar", - NM_SETTING_CONNECTION_UUID, uuid, - NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME, - NM_SETTING_CONNECTION_TIMESTAMP, timestamp, - NULL); - g_free (uuid); - nm_connection_add_setting (connection, setting); - - setting = nm_setting_wired_new (); - g_object_set (G_OBJECT (setting), - NM_SETTING_WIRED_MTU, 1592, - NULL); - nm_connection_add_setting (connection, setting); - - setting = nm_setting_ip4_config_new (); - g_object_set (G_OBJECT (setting), - NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO, - NM_SETTING_IP4_CONFIG_DHCP_HOSTNAME, "eyeofthetiger", - NULL); - nm_connection_add_setting (connection, setting); - - return connection; -} - -static GValue * -string_to_gvalue (const char *str) -{ - GValue *val; - - val = g_slice_new0 (GValue); - g_value_init (val, G_TYPE_STRING); - g_value_set_string (val, str); - return val; -} - -static void -destroy_gvalue (gpointer data) -{ - g_value_unset ((GValue *) data); - g_slice_free (GValue, data); -} - -static GHashTable * -new_connection_hash (char **out_uuid, - const char **out_expected_id, - const char **out_expected_ip6_method) -{ - GHashTable *hash; - GHashTable *setting; - - hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_hash_table_destroy); - - *out_uuid = nm_utils_uuid_generate (); - *out_expected_id = "My happy connection"; - *out_expected_ip6_method = NM_SETTING_IP6_CONFIG_METHOD_LINK_LOCAL; - - /* Connection setting */ - setting = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, destroy_gvalue); - g_hash_table_insert (setting, - g_strdup (NM_SETTING_NAME), - string_to_gvalue (NM_SETTING_CONNECTION_SETTING_NAME)); - g_hash_table_insert (setting, - g_strdup (NM_SETTING_CONNECTION_ID), - string_to_gvalue (*out_expected_id)); - g_hash_table_insert (setting, - g_strdup (NM_SETTING_CONNECTION_UUID), - string_to_gvalue (*out_uuid)); - g_hash_table_insert (setting, - g_strdup (NM_SETTING_CONNECTION_TYPE), - string_to_gvalue (NM_SETTING_WIRED_SETTING_NAME)); - g_hash_table_insert (hash, g_strdup (NM_SETTING_CONNECTION_SETTING_NAME), setting); - - /* Wired setting */ - setting = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, destroy_gvalue); - g_hash_table_insert (hash, g_strdup (NM_SETTING_WIRED_SETTING_NAME), setting); - - /* IP6 */ - setting = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, destroy_gvalue); - g_hash_table_insert (setting, - g_strdup (NM_SETTING_IP6_CONFIG_METHOD), - string_to_gvalue (*out_expected_ip6_method)); - g_hash_table_insert (hash, g_strdup (NM_SETTING_IP6_CONFIG_SETTING_NAME), setting); - - return hash; -} - -static void -test_connection_replace_settings (void) -{ - NMConnection *connection; - GHashTable *new_settings; - GError *error = NULL; - gboolean success; - NMSettingConnection *s_con; - NMSettingIP6Config *s_ip6; - char *uuid = NULL; - const char *expected_id = NULL, *expected_method = NULL; - - connection = new_test_connection (); - - new_settings = new_connection_hash (&uuid, &expected_id, &expected_method); - g_assert (new_settings); - - /* Replace settings and test */ - success = nm_connection_replace_settings (connection, new_settings, &error); - g_assert_no_error (error); - g_assert (success); - - s_con = nm_connection_get_setting_connection (connection); - g_assert (s_con); - g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, expected_id); - g_assert_cmpstr (nm_setting_connection_get_uuid (s_con), ==, uuid); - - g_assert (nm_connection_get_setting_wired (connection)); - g_assert (!nm_connection_get_setting_ip4_config (connection)); - - s_ip6 = nm_connection_get_setting_ip6_config (connection); - g_assert (s_ip6); - g_assert_cmpstr (nm_setting_ip6_config_get_method (s_ip6), ==, expected_method); - - g_free (uuid); - g_hash_table_destroy (new_settings); - g_object_unref (connection); -} - -static void -test_connection_replace_settings_from_connection (void) -{ - NMConnection *connection, *replacement; - GError *error = NULL; - gboolean success; - NMSettingConnection *s_con; - NMSetting *setting; - GByteArray *ssid; - char *uuid = NULL; - const char *expected_id = "Awesome connection"; - - connection = new_test_connection (); - g_assert (connection); - - replacement = nm_connection_new (); - g_assert (replacement); - - /* New connection setting */ - setting = nm_setting_connection_new (); - g_assert (setting); - - uuid = nm_utils_uuid_generate (); - g_object_set (setting, - NM_SETTING_CONNECTION_ID, expected_id, - NM_SETTING_CONNECTION_UUID, uuid, - NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRELESS_SETTING_NAME, - NULL); - nm_connection_add_setting (replacement, setting); - - /* New wifi setting */ - setting = nm_setting_wireless_new (); - g_assert (setting); - - ssid = g_byte_array_new (); - g_byte_array_append (ssid, (const guint8 *) "1234567", 7); - g_object_set (setting, - NM_SETTING_WIRELESS_SSID, ssid, - NM_SETTING_WIRELESS_MODE, "infrastructure", - NULL); - g_byte_array_free (ssid, TRUE); - nm_connection_add_setting (replacement, setting); - - /* Replace settings and test */ - success = nm_connection_replace_settings_from_connection (connection, replacement, &error); - g_assert_no_error (error); - g_assert (success); - - s_con = nm_connection_get_setting_connection (connection); - g_assert (s_con); - g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, expected_id); - g_assert_cmpstr (nm_setting_connection_get_uuid (s_con), ==, uuid); - - g_assert (!nm_connection_get_setting_wired (connection)); - g_assert (!nm_connection_get_setting_ip6_config (connection)); - g_assert (nm_connection_get_setting_wireless (connection)); - - g_free (uuid); - g_object_unref (replacement); - g_object_unref (connection); -} - -static void -test_connection_new_from_hash (void) -{ - NMConnection *connection; - GHashTable *new_settings; - GError *error = NULL; - NMSettingConnection *s_con; - NMSettingIP6Config *s_ip6; - char *uuid = NULL; - const char *expected_id = NULL, *expected_method = NULL; - - new_settings = new_connection_hash (&uuid, &expected_id, &expected_method); - g_assert (new_settings); - - /* Replace settings and test */ - connection = nm_connection_new_from_hash (new_settings, &error); - g_assert_no_error (error); - g_assert (connection); - - s_con = nm_connection_get_setting_connection (connection); - g_assert (s_con); - g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, expected_id); - g_assert_cmpstr (nm_setting_connection_get_uuid (s_con), ==, uuid); - - g_assert (nm_connection_get_setting_wired (connection)); - g_assert (!nm_connection_get_setting_ip4_config (connection)); - - s_ip6 = nm_connection_get_setting_ip6_config (connection); - g_assert (s_ip6); - g_assert_cmpstr (nm_setting_ip6_config_get_method (s_ip6), ==, expected_method); - - g_free (uuid); - g_hash_table_destroy (new_settings); - g_object_unref (connection); -} - -static void -check_permission (NMSettingConnection *s_con, - guint32 idx, - const char *expected_uname) -{ - gboolean success; - const char *ptype = NULL, *pitem = NULL, *detail = NULL; - - success = nm_setting_connection_get_permission (s_con, 0, &ptype, &pitem, &detail); - g_assert (success); - - g_assert_cmpstr (ptype, ==, "user"); - - g_assert (pitem); - g_assert_cmpstr (pitem, ==, expected_uname); - - g_assert (!detail); -} - -#define TEST_UNAME "asdfasfasdf" - -static void -test_setting_connection_permissions_helpers (void) -{ - NMSettingConnection *s_con; - gboolean success; - char buf[9] = { 0x61, 0x62, 0x63, 0xff, 0xfe, 0xfd, 0x23, 0x01, 0x00 }; - GSList *list = NULL; - const char *expected_perm = "user:" TEST_UNAME ":"; - - s_con = NM_SETTING_CONNECTION (nm_setting_connection_new ()); - - /* Ensure a bad [type] is rejected */ - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (strcmp (ptype, "user") == 0)); - success = nm_setting_connection_add_permission (s_con, "foobar", "blah", NULL); - g_test_assert_expected_messages (); - g_assert (!success); - - /* Ensure a bad [type] is rejected */ - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (ptype)); - success = nm_setting_connection_add_permission (s_con, NULL, "blah", NULL); - g_test_assert_expected_messages (); - g_assert (!success); - - /* Ensure a bad [item] is rejected */ - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (uname)); - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (p != NULL)); - success = nm_setting_connection_add_permission (s_con, "user", NULL, NULL); - g_test_assert_expected_messages (); - g_assert (!success); - - /* Ensure a bad [item] is rejected */ - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (uname[0] != '\0')); - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (p != NULL)); - success = nm_setting_connection_add_permission (s_con, "user", "", NULL); - g_test_assert_expected_messages (); - g_assert (!success); - - /* Ensure an [item] with ':' is rejected */ - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (strchr (uname, ':') == NULL)); - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (p != NULL)); - success = nm_setting_connection_add_permission (s_con, "user", "ad:asdf", NULL); - g_test_assert_expected_messages (); - g_assert (!success); - - /* Ensure a non-UTF-8 [item] is rejected */ - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (g_utf8_validate (uname, -1, NULL) == TRUE)); - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (p != NULL)); - success = nm_setting_connection_add_permission (s_con, "user", buf, NULL); - g_test_assert_expected_messages (); - g_assert (!success); - - /* Ensure a non-NULL [detail] is rejected */ - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (detail == NULL)); - success = nm_setting_connection_add_permission (s_con, "user", "dafasdf", "asdf"); - g_test_assert_expected_messages (); - g_assert (!success); - - /* Ensure a valid call results in success */ - success = nm_setting_connection_add_permission (s_con, "user", TEST_UNAME, NULL); - g_assert (success); - - g_assert_cmpint (nm_setting_connection_get_num_permissions (s_con), ==, 1); - - check_permission (s_con, 0, TEST_UNAME); - - /* Check the actual GObject property just to be paranoid */ - g_object_get (G_OBJECT (s_con), NM_SETTING_CONNECTION_PERMISSIONS, &list, NULL); - g_assert (list); - g_assert_cmpint (g_slist_length (list), ==, 1); - g_assert_cmpstr (list->data, ==, expected_perm); - g_slist_free_full (list, g_free); - - /* Now remove that permission and ensure we have 0 permissions */ - nm_setting_connection_remove_permission (s_con, 0); - g_assert_cmpint (nm_setting_connection_get_num_permissions (s_con), ==, 0); - - g_object_unref (s_con); -} - -static void -add_permission_property (NMSettingConnection *s_con, - const char *ptype, - const char *pitem, - int pitem_len, - const char *detail) -{ - GString *str; - GSList *list = NULL; - - str = g_string_sized_new (50); - if (ptype) - g_string_append (str, ptype); - g_string_append_c (str, ':'); - - if (pitem) { - if (pitem_len >= 0) - g_string_append_len (str, pitem, pitem_len); - else - g_string_append (str, pitem); - } - - g_string_append_c (str, ':'); - - if (detail) - g_string_append (str, detail); - - list = g_slist_append (list, str->str); - g_object_set (G_OBJECT (s_con), NM_SETTING_CONNECTION_PERMISSIONS, list, NULL); - - g_string_free (str, TRUE); - g_slist_free (list); -} - -static void -test_setting_connection_permissions_property (void) -{ - NMSettingConnection *s_con; - gboolean success; - char buf[9] = { 0x61, 0x62, 0x63, 0xff, 0xfe, 0xfd, 0x23, 0x01, 0x00 }; - - s_con = NM_SETTING_CONNECTION (nm_setting_connection_new ()); - - /* Ensure a bad [type] is rejected */ - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (strncmp (str, PERM_USER_PREFIX, strlen (PERM_USER_PREFIX)) == 0)); - add_permission_property (s_con, "foobar", "blah", -1, NULL); - g_test_assert_expected_messages (); - g_assert_cmpint (nm_setting_connection_get_num_permissions (s_con), ==, 0); - - /* Ensure a bad [type] is rejected */ - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (strncmp (str, PERM_USER_PREFIX, strlen (PERM_USER_PREFIX)) == 0)); - add_permission_property (s_con, NULL, "blah", -1, NULL); - g_test_assert_expected_messages (); - g_assert_cmpint (nm_setting_connection_get_num_permissions (s_con), ==, 0); - - /* Ensure a bad [item] is rejected */ - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (last_colon > str)); - add_permission_property (s_con, "user", NULL, -1, NULL); - g_test_assert_expected_messages (); - g_assert_cmpint (nm_setting_connection_get_num_permissions (s_con), ==, 0); - - /* Ensure a bad [item] is rejected */ - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (last_colon > str)); - add_permission_property (s_con, "user", "", -1, NULL); - g_test_assert_expected_messages (); - g_assert_cmpint (nm_setting_connection_get_num_permissions (s_con), ==, 0); - - /* Ensure an [item] with ':' in the middle is rejected */ - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (str[i] != ':')); - add_permission_property (s_con, "user", "ad:asdf", -1, NULL); - g_test_assert_expected_messages (); - g_assert_cmpint (nm_setting_connection_get_num_permissions (s_con), ==, 0); - - /* Ensure an [item] with ':' at the end is rejected */ - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (str[i] != ':')); - add_permission_property (s_con, "user", "adasdfaf:", -1, NULL); - g_test_assert_expected_messages (); - g_assert_cmpint (nm_setting_connection_get_num_permissions (s_con), ==, 0); - - /* Ensure a non-UTF-8 [item] is rejected */ - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (g_utf8_validate (str, -1, NULL) == TRUE)); - add_permission_property (s_con, "user", buf, (int) sizeof (buf), NULL); - g_test_assert_expected_messages (); - g_assert_cmpint (nm_setting_connection_get_num_permissions (s_con), ==, 0); - - /* Ensure a non-NULL [detail] is rejected */ - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (*(last_colon + 1) == '\0')); - add_permission_property (s_con, "user", "dafasdf", -1, "asdf"); - g_test_assert_expected_messages (); - g_assert_cmpint (nm_setting_connection_get_num_permissions (s_con), ==, 0); - - /* Ensure a valid call results in success */ - success = nm_setting_connection_add_permission (s_con, "user", TEST_UNAME, NULL); - g_assert (success); - g_assert_cmpint (nm_setting_connection_get_num_permissions (s_con), ==, 1); - - check_permission (s_con, 0, TEST_UNAME); - - /* Now remove that permission and ensure we have 0 permissions */ - nm_setting_connection_remove_permission (s_con, 0); - g_assert_cmpint (nm_setting_connection_get_num_permissions (s_con), ==, 0); - - g_object_unref (s_con); -} - -static void -test_connection_compare_same (void) -{ - NMConnection *a, *b; - - a = new_test_connection (); - b = nm_connection_duplicate (a); - g_assert (nm_connection_compare (a, b, NM_SETTING_COMPARE_FLAG_EXACT)); - g_object_unref (a); - g_object_unref (b); -} - -static void -test_connection_compare_key_only_in_a (void) -{ - NMConnection *a, *b; - NMSettingConnection *s_con; - - a = new_test_connection (); - b = nm_connection_duplicate (a); - s_con = (NMSettingConnection *) nm_connection_get_setting (b, NM_TYPE_SETTING_CONNECTION); - g_assert (s_con); - g_object_set (s_con, NM_SETTING_CONNECTION_TIMESTAMP, (guint64) 0, NULL); - - g_assert (!nm_connection_compare (a, b, NM_SETTING_COMPARE_FLAG_EXACT)); - g_object_unref (a); - g_object_unref (b); -} - -static void -test_connection_compare_setting_only_in_a (void) -{ - NMConnection *a, *b; - - a = new_test_connection (); - b = nm_connection_duplicate (a); - nm_connection_remove_setting (b, NM_TYPE_SETTING_IP4_CONFIG); - g_assert (!nm_connection_compare (a, b, NM_SETTING_COMPARE_FLAG_EXACT)); - g_object_unref (a); - g_object_unref (b); -} - -static void -test_connection_compare_key_only_in_b (void) -{ - NMConnection *a, *b; - NMSettingConnection *s_con; - - a = new_test_connection (); - b = nm_connection_duplicate (a); - s_con = (NMSettingConnection *) nm_connection_get_setting (b, NM_TYPE_SETTING_CONNECTION); - g_assert (s_con); - g_object_set (s_con, NM_SETTING_CONNECTION_TIMESTAMP, (guint64) 0, NULL); - - g_assert (!nm_connection_compare (a, b, NM_SETTING_COMPARE_FLAG_EXACT)); - g_object_unref (a); - g_object_unref (b); -} - -static void -test_connection_compare_setting_only_in_b (void) -{ - NMConnection *a, *b; - - a = new_test_connection (); - b = nm_connection_duplicate (a); - nm_connection_remove_setting (a, NM_TYPE_SETTING_IP4_CONFIG); - g_assert (!nm_connection_compare (a, b, NM_SETTING_COMPARE_FLAG_EXACT)); - g_object_unref (a); - g_object_unref (b); -} - -typedef struct { - const char *key_name; - guint32 result; -} DiffKey; - -typedef struct { - const char *name; - DiffKey keys[30]; -} DiffSetting; - -#define ARRAY_LEN(a) (sizeof (a) / sizeof (a[0])) - -static void -ensure_diffs (GHashTable *diffs, const DiffSetting *check, gsize n_check) -{ - guint i; - - g_assert (g_hash_table_size (diffs) == n_check); - - /* Loop through the settings */ - for (i = 0; i < n_check; i++) { - GHashTable *setting_hash; - guint z = 0; - - setting_hash = g_hash_table_lookup (diffs, check[i].name); - g_assert (setting_hash); - - /* Get the number of keys to check */ - while (check[i].keys[z].key_name) - z++; - g_assert (g_hash_table_size (setting_hash) == z); - - /* Now compare the actual keys */ - for (z = 0; check[i].keys[z].key_name; z++) { - NMSettingDiffResult result; - - result = GPOINTER_TO_UINT (g_hash_table_lookup (setting_hash, check[i].keys[z].key_name)); - g_assert (result == check[i].keys[z].result); - } - } -} - -static void -test_connection_diff_a_only (void) -{ - NMConnection *connection; - GHashTable *out_diffs = NULL; - gboolean same; - const DiffSetting settings[] = { - { NM_SETTING_CONNECTION_SETTING_NAME, { - { NM_SETTING_CONNECTION_ID, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_CONNECTION_UUID, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_CONNECTION_INTERFACE_NAME, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_CONNECTION_TYPE, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_CONNECTION_TIMESTAMP, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_CONNECTION_AUTOCONNECT, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_CONNECTION_READ_ONLY, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_CONNECTION_PERMISSIONS, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_CONNECTION_ZONE, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_CONNECTION_MASTER, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_CONNECTION_SLAVE_TYPE, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_CONNECTION_SECONDARIES, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT, NM_SETTING_DIFF_RESULT_IN_A }, - { NULL, NM_SETTING_DIFF_RESULT_UNKNOWN } - } }, - { NM_SETTING_WIRED_SETTING_NAME, { - { NM_SETTING_WIRED_PORT, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_WIRED_SPEED, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_WIRED_DUPLEX, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_WIRED_AUTO_NEGOTIATE, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_WIRED_MAC_ADDRESS, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_WIRED_CLONED_MAC_ADDRESS, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_WIRED_MAC_ADDRESS_BLACKLIST, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_WIRED_MTU, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_WIRED_S390_SUBCHANNELS, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_WIRED_S390_NETTYPE, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_WIRED_S390_OPTIONS, NM_SETTING_DIFF_RESULT_IN_A }, - { NULL, NM_SETTING_DIFF_RESULT_UNKNOWN }, - } }, - { NM_SETTING_IP4_CONFIG_SETTING_NAME, { - { NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_IP4_CONFIG_DNS, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_IP4_CONFIG_DNS_SEARCH, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_IP4_CONFIG_ADDRESSES, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_IP4_CONFIG_ROUTES, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_IP4_CONFIG_ROUTE_METRIC, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_IP4_CONFIG_IGNORE_AUTO_ROUTES, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_IP4_CONFIG_IGNORE_AUTO_DNS, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_IP4_CONFIG_DHCP_TIMEOUT, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_IP4_CONFIG_DHCP_SEND_HOSTNAME, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_IP4_CONFIG_DHCP_HOSTNAME, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_IP4_CONFIG_NEVER_DEFAULT, NM_SETTING_DIFF_RESULT_IN_A }, - { NM_SETTING_IP4_CONFIG_MAY_FAIL, NM_SETTING_DIFF_RESULT_IN_A }, - { NULL, NM_SETTING_DIFF_RESULT_UNKNOWN }, - } }, - }; - - connection = new_test_connection (); - - same = nm_connection_diff (connection, NULL, NM_SETTING_COMPARE_FLAG_EXACT, &out_diffs); - g_assert (same == FALSE); - g_assert (out_diffs != NULL); - g_assert (g_hash_table_size (out_diffs) > 0); - - ensure_diffs (out_diffs, settings, ARRAY_LEN (settings)); - - g_hash_table_destroy (out_diffs); - g_object_unref (connection); -} - -static void -test_connection_diff_same (void) -{ - NMConnection *a, *b; - GHashTable *out_diffs = NULL; - gboolean same; - - a = new_test_connection (); - b = nm_connection_duplicate (a); - - same = nm_connection_diff (a, b, NM_SETTING_COMPARE_FLAG_EXACT, &out_diffs); - g_assert (same == TRUE); - g_assert (out_diffs == NULL); - g_object_unref (a); - g_object_unref (b); -} - -static void -test_connection_diff_different (void) -{ - NMConnection *a, *b; - GHashTable *out_diffs = NULL; - NMSettingIP4Config *s_ip4; - gboolean same; - const DiffSetting settings[] = { - { NM_SETTING_IP4_CONFIG_SETTING_NAME, { - { NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_DIFF_RESULT_IN_A | NM_SETTING_DIFF_RESULT_IN_B }, - { NULL, NM_SETTING_DIFF_RESULT_UNKNOWN }, - } }, - }; - - a = new_test_connection (); - b = nm_connection_duplicate (a); - s_ip4 = nm_connection_get_setting_ip4_config (a); - g_assert (s_ip4); - g_object_set (G_OBJECT (s_ip4), - NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_MANUAL, - NULL); - - same = nm_connection_diff (a, b, NM_SETTING_COMPARE_FLAG_EXACT, &out_diffs); - g_assert (same == FALSE); - g_assert (out_diffs != NULL); - g_assert (g_hash_table_size (out_diffs) > 0); - - ensure_diffs (out_diffs, settings, ARRAY_LEN (settings)); - - g_hash_table_destroy (out_diffs); - g_object_unref (a); - g_object_unref (b); -} - -static void -test_connection_diff_no_secrets (void) -{ - NMConnection *a, *b; - GHashTable *out_diffs = NULL; - NMSetting *s_pppoe; - gboolean same; - const DiffSetting settings[] = { - { NM_SETTING_PPPOE_SETTING_NAME, { - { NM_SETTING_PPPOE_PASSWORD, NM_SETTING_DIFF_RESULT_IN_B }, - { NULL, NM_SETTING_DIFF_RESULT_UNKNOWN }, - } }, - }; - - a = new_test_connection (); - s_pppoe = nm_setting_pppoe_new (); - g_object_set (G_OBJECT (s_pppoe), - NM_SETTING_PPPOE_USERNAME, "thomas", - NULL); - nm_connection_add_setting (a, s_pppoe); - - b = nm_connection_duplicate (a); - - /* Add a secret to B */ - s_pppoe = NM_SETTING (nm_connection_get_setting_pppoe (b)); - g_assert (s_pppoe); - g_object_set (G_OBJECT (s_pppoe), - NM_SETTING_PPPOE_PASSWORD, "secretpassword", - NULL); - - /* Make sure the diff returns no results as secrets are ignored */ - same = nm_connection_diff (a, b, NM_SETTING_COMPARE_FLAG_IGNORE_SECRETS, &out_diffs); - g_assert (same == TRUE); - g_assert (out_diffs == NULL); - - /* Now make sure the diff returns results if secrets are not ignored */ - same = nm_connection_diff (a, b, NM_SETTING_COMPARE_FLAG_EXACT, &out_diffs); - g_assert (same == FALSE); - g_assert (out_diffs != NULL); - g_assert (g_hash_table_size (out_diffs) > 0); - - ensure_diffs (out_diffs, settings, ARRAY_LEN (settings)); - - g_hash_table_destroy (out_diffs); - g_object_unref (a); - g_object_unref (b); -} - -static void -test_connection_diff_inferrable (void) -{ - NMConnection *a, *b; - GHashTable *out_diffs = NULL; - gboolean same; - NMSettingConnection *s_con; - NMSettingWired *s_wired; - NMSettingIP4Config *s_ip4; - char *uuid; - const DiffSetting settings[] = { - { NM_SETTING_CONNECTION_SETTING_NAME, { - { NM_SETTING_CONNECTION_INTERFACE_NAME, NM_SETTING_DIFF_RESULT_IN_A }, - { NULL, NM_SETTING_DIFF_RESULT_UNKNOWN }, - } }, - }; - - a = new_test_connection (); - b = nm_connection_duplicate (a); - - /* Change the UUID, wired MTU, and set ignore-auto-dns */ - s_con = nm_connection_get_setting_connection (a); - g_assert (s_con); - uuid = nm_utils_uuid_generate (); - g_object_set (G_OBJECT (s_con), - NM_SETTING_CONNECTION_UUID, uuid, - NM_SETTING_CONNECTION_ID, "really neat connection", - NULL); - g_free (uuid); - - s_wired = nm_connection_get_setting_wired (a); - g_assert (s_wired); - g_object_set (G_OBJECT (s_wired), NM_SETTING_WIRED_MTU, 300, NULL); - - s_ip4 = nm_connection_get_setting_ip4_config (a); - g_assert (s_ip4); - g_object_set (G_OBJECT (s_ip4), NM_SETTING_IP4_CONFIG_IGNORE_AUTO_DNS, TRUE, NULL); - - /* Make sure the diff returns no results as secrets are ignored */ - same = nm_connection_diff (a, b, NM_SETTING_COMPARE_FLAG_INFERRABLE, &out_diffs); - g_assert (same == TRUE); - g_assert (out_diffs == NULL); - - /* And change a INFERRABLE property to ensure that it shows up in the diff results */ - g_object_set (G_OBJECT (s_con), NM_SETTING_CONNECTION_INTERFACE_NAME, "usb0", NULL); - - /* Make sure the diff returns no results as secrets are ignored */ - same = nm_connection_diff (a, b, NM_SETTING_COMPARE_FLAG_INFERRABLE, &out_diffs); - g_assert (same == FALSE); - g_assert (out_diffs != NULL); - g_assert (g_hash_table_size (out_diffs) > 0); - - ensure_diffs (out_diffs, settings, ARRAY_LEN (settings)); - - g_hash_table_destroy (out_diffs); - g_object_unref (a); - g_object_unref (b); -} - -static void -add_generic_settings (NMConnection *connection, const char *ctype) -{ - NMSetting *setting; - char *uuid; - - uuid = nm_utils_uuid_generate (); - - setting = nm_setting_connection_new (); - g_object_set (setting, - NM_SETTING_CONNECTION_ID, "asdfasdfadf", - NM_SETTING_CONNECTION_TYPE, ctype, - NM_SETTING_CONNECTION_UUID, uuid, - NULL); - nm_connection_add_setting (connection, setting); - - g_free (uuid); - - setting = nm_setting_ip4_config_new (); - g_object_set (setting, NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO, NULL); - nm_connection_add_setting (connection, setting); - - setting = nm_setting_ip6_config_new (); - g_object_set (setting, NM_SETTING_IP6_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_AUTO, NULL); - nm_connection_add_setting (connection, setting); -} - -static void -test_connection_good_base_types (void) -{ - NMConnection *connection; - NMSetting *setting; - gboolean success; - GError *error = NULL; - GByteArray *array; - const guint8 bdaddr[] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 }; - - /* Try a basic wired connection */ - connection = nm_connection_new (); - add_generic_settings (connection, NM_SETTING_WIRED_SETTING_NAME); - setting = nm_setting_wired_new (); - nm_connection_add_setting (connection, setting); - - success = nm_connection_verify (connection, &error); - g_assert_no_error (error); - g_assert (success); - g_object_unref (connection); - - /* Try a wired PPPoE connection */ - connection = nm_connection_new (); - add_generic_settings (connection, NM_SETTING_PPPOE_SETTING_NAME); - setting = nm_setting_pppoe_new (); - g_object_set (setting, NM_SETTING_PPPOE_USERNAME, "bob smith", NULL); - nm_connection_add_setting (connection, setting); - - success = nm_connection_verify (connection, &error); - g_assert_no_error (error); - g_assert (success); - g_object_unref (connection); - - /* Wifi connection */ - connection = nm_connection_new (); - add_generic_settings (connection, NM_SETTING_WIRELESS_SETTING_NAME); - - setting = nm_setting_wireless_new (); - array = g_byte_array_new (); - g_byte_array_append (array, (const guint8 *) "1234567", 7); - g_object_set (setting, - NM_SETTING_WIRELESS_SSID, array, - NM_SETTING_WIRELESS_MODE, "infrastructure", - NULL); - g_byte_array_free (array, TRUE); - nm_connection_add_setting (connection, setting); - - success = nm_connection_verify (connection, &error); - g_assert_no_error (error); - g_assert (success); - g_object_unref (connection); - - /* Bluetooth connection */ - connection = nm_connection_new (); - add_generic_settings (connection, NM_SETTING_BLUETOOTH_SETTING_NAME); - - setting = nm_setting_bluetooth_new (); - array = g_byte_array_new (); - g_byte_array_append (array, bdaddr, sizeof (bdaddr)); - g_object_set (setting, - NM_SETTING_BLUETOOTH_BDADDR, array, - NM_SETTING_CONNECTION_TYPE, NM_SETTING_BLUETOOTH_TYPE_PANU, - NULL); - g_byte_array_free (array, TRUE); - nm_connection_add_setting (connection, setting); - - success = nm_connection_verify (connection, &error); - g_assert_no_error (error); - g_assert (success); - g_object_unref (connection); - - /* WiMAX connection */ - connection = nm_connection_new (); - add_generic_settings (connection, NM_SETTING_WIMAX_SETTING_NAME); - setting = nm_setting_wimax_new (); - g_object_set (setting, NM_SETTING_WIMAX_NETWORK_NAME, "CLEAR", NULL); - nm_connection_add_setting (connection, setting); - - success = nm_connection_verify (connection, &error); - g_assert_no_error (error); - g_assert (success); - g_object_unref (connection); - - /* GSM connection */ - connection = nm_connection_new (); - add_generic_settings (connection, NM_SETTING_GSM_SETTING_NAME); - - setting = nm_setting_gsm_new (); - g_object_set (setting, - NM_SETTING_GSM_NUMBER, "*99#", - NM_SETTING_GSM_APN, "metered.billing.sucks", - NULL); - nm_connection_add_setting (connection, setting); - g_clear_object (&connection); - - /* CDMA connection */ - connection = nm_connection_new (); - add_generic_settings (connection, NM_SETTING_CDMA_SETTING_NAME); - - setting = nm_setting_cdma_new (); - g_object_set (setting, - NM_SETTING_CDMA_NUMBER, "#777", - NM_SETTING_CDMA_USERNAME, "foobar@vzw.com", - NULL); - nm_connection_add_setting (connection, setting); - - success = nm_connection_verify (connection, &error); - g_assert_no_error (error); - g_assert (success); - g_object_unref (connection); -} - -static void -test_connection_bad_base_types (void) -{ - NMConnection *connection; - NMSetting *setting; - gboolean success; - GError *error = NULL; - - /* Test various non-base connection types to make sure they are rejected; - * using a fake 'wired' connection so the rest of it verifies - */ - - /* Connection setting */ - connection = nm_connection_new (); - add_generic_settings (connection, NM_SETTING_CONNECTION_SETTING_NAME); - setting = nm_setting_wired_new (); - nm_connection_add_setting (connection, setting); - - success = nm_connection_verify (connection, &error); - g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_CONNECTION_TYPE_INVALID); - g_assert (success == FALSE); - g_object_unref (connection); - g_clear_error (&error); - - /* PPP setting */ - connection = nm_connection_new (); - add_generic_settings (connection, NM_SETTING_PPP_SETTING_NAME); - setting = nm_setting_wired_new (); - nm_connection_add_setting (connection, setting); - setting = nm_setting_ppp_new (); - nm_connection_add_setting (connection, setting); - - success = nm_connection_verify (connection, &error); - g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_CONNECTION_TYPE_INVALID); - g_assert (success == FALSE); - g_object_unref (connection); - g_clear_error (&error); - - /* Serial setting */ - connection = nm_connection_new (); - add_generic_settings (connection, NM_SETTING_SERIAL_SETTING_NAME); - setting = nm_setting_wired_new (); - nm_connection_add_setting (connection, setting); - setting = nm_setting_serial_new (); - nm_connection_add_setting (connection, setting); - - success = nm_connection_verify (connection, &error); - g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_CONNECTION_TYPE_INVALID); - g_assert (success == FALSE); - g_object_unref (connection); - g_clear_error (&error); - - /* IP4 setting */ - connection = nm_connection_new (); - add_generic_settings (connection, NM_SETTING_IP4_CONFIG_SETTING_NAME); - setting = nm_setting_wired_new (); - nm_connection_add_setting (connection, setting); - - success = nm_connection_verify (connection, &error); - g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_CONNECTION_TYPE_INVALID); - g_assert (success == FALSE); - g_object_unref (connection); - g_clear_error (&error); - - /* IP6 setting */ - connection = nm_connection_new (); - add_generic_settings (connection, NM_SETTING_IP6_CONFIG_SETTING_NAME); - setting = nm_setting_wired_new (); - nm_connection_add_setting (connection, setting); - - success = nm_connection_verify (connection, &error); - g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_CONNECTION_TYPE_INVALID); - g_assert (success == FALSE); - g_object_unref (connection); - g_clear_error (&error); -} - -static void -test_setting_compare_id (void) -{ - gs_unref_object NMSetting *old = NULL, *new = NULL; - gboolean success; - - old = nm_setting_connection_new (); - g_object_set (old, - NM_SETTING_CONNECTION_ID, "really awesome cool connection", - NM_SETTING_CONNECTION_UUID, "fbbd59d5-acab-4e30-8f86-258d272617e7", - NM_SETTING_CONNECTION_AUTOCONNECT, FALSE, - NULL); - - new = nm_setting_duplicate (old); - g_object_set (new, NM_SETTING_CONNECTION_ID, "some different connection id", NULL); - - /* First make sure they are different */ - success = nm_setting_compare (old, new, NM_SETTING_COMPARE_FLAG_EXACT); - g_assert (success == FALSE); - - success = nm_setting_compare (old, new, NM_SETTING_COMPARE_FLAG_IGNORE_ID); - g_assert (success); -} - -static void -_compare_secrets (NMSettingSecretFlags secret_flags, - NMSettingCompareFlags comp_flags, - gboolean remove_secret) -{ - gs_unref_object NMSetting *old = NULL, *new = NULL; - gboolean success; - - /* Make sure that a connection with transient/unsaved secrets compares - * successfully to the same connection without those secrets. - */ - - old = nm_setting_wireless_security_new (); - g_object_set (old, - NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, "wpa-psk", - NM_SETTING_WIRELESS_SECURITY_PSK, "really cool psk", - NULL); - nm_setting_set_secret_flags (old, NM_SETTING_WIRELESS_SECURITY_PSK, secret_flags, NULL); - - /* Clear the PSK from the duplicated setting */ - new = nm_setting_duplicate (old); - if (remove_secret) { - g_object_set (new, NM_SETTING_WIRELESS_SECURITY_PSK, NULL, NULL); - - success = nm_setting_compare (old, new, NM_SETTING_COMPARE_FLAG_EXACT); - g_assert (success == FALSE); - } - - success = nm_setting_compare (old, new, comp_flags); - g_assert (success); -} - -static void -test_setting_compare_secrets (void) -{ - _compare_secrets (NM_SETTING_SECRET_FLAG_AGENT_OWNED, NM_SETTING_COMPARE_FLAG_IGNORE_AGENT_OWNED_SECRETS, TRUE); - _compare_secrets (NM_SETTING_SECRET_FLAG_NOT_SAVED, NM_SETTING_COMPARE_FLAG_IGNORE_NOT_SAVED_SECRETS, TRUE); - _compare_secrets (NM_SETTING_SECRET_FLAG_NONE, NM_SETTING_COMPARE_FLAG_IGNORE_SECRETS, TRUE); - _compare_secrets (NM_SETTING_SECRET_FLAG_NONE, NM_SETTING_COMPARE_FLAG_EXACT, FALSE); -} - -static void -_compare_vpn_secrets (NMSettingSecretFlags secret_flags, - NMSettingCompareFlags comp_flags, - gboolean remove_secret) -{ - gs_unref_object NMSetting *old = NULL, *new = NULL; - gboolean success; - - /* Make sure that a connection with transient/unsaved secrets compares - * successfully to the same connection without those secrets. - */ - - old = nm_setting_vpn_new (); - nm_setting_vpn_add_secret (NM_SETTING_VPN (old), "foobarbaz", "really secret password"); - nm_setting_vpn_add_secret (NM_SETTING_VPN (old), "asdfasdfasdf", "really adfasdfasdfasdf"); - nm_setting_vpn_add_secret (NM_SETTING_VPN (old), "0123456778", "abcdefghijklmnpqrstuvqxyz"); - nm_setting_vpn_add_secret (NM_SETTING_VPN (old), "borkbork", "yet another really secret password"); - nm_setting_set_secret_flags (old, "borkbork", secret_flags, NULL); - - /* Clear "borkbork" from the duplicated setting */ - new = nm_setting_duplicate (old); - if (remove_secret) { - nm_setting_vpn_remove_secret (NM_SETTING_VPN (new), "borkbork"); - - /* First make sure they are different */ - success = nm_setting_compare (old, new, NM_SETTING_COMPARE_FLAG_EXACT); - g_assert (success == FALSE); - } - - success = nm_setting_compare (old, new, comp_flags); - g_assert (success); -} - -static void -test_setting_compare_vpn_secrets (void) -{ - _compare_vpn_secrets (NM_SETTING_SECRET_FLAG_AGENT_OWNED, NM_SETTING_COMPARE_FLAG_IGNORE_AGENT_OWNED_SECRETS, TRUE); - _compare_vpn_secrets (NM_SETTING_SECRET_FLAG_NOT_SAVED, NM_SETTING_COMPARE_FLAG_IGNORE_NOT_SAVED_SECRETS, TRUE); - _compare_vpn_secrets (NM_SETTING_SECRET_FLAG_NONE, NM_SETTING_COMPARE_FLAG_IGNORE_SECRETS, TRUE); - _compare_vpn_secrets (NM_SETTING_SECRET_FLAG_NONE, NM_SETTING_COMPARE_FLAG_EXACT, FALSE); -} - -static void -test_hwaddr_aton_ether_normal (void) -{ - guint8 buf[100]; - guint8 expected[ETH_ALEN] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 }; - - g_assert (nm_utils_hwaddr_aton ("00:11:22:33:44:55", ARPHRD_ETHER, buf) != NULL); - g_assert (memcmp (buf, expected, sizeof (expected)) == 0); -} - -static void -test_hwaddr_aton_ib_normal (void) -{ - guint8 buf[100]; - const char *source = "00:11:22:33:44:55:66:77:88:99:01:12:23:34:45:56:67:78:89:90"; - guint8 expected[INFINIBAND_ALEN] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, - 0x77, 0x88, 0x99, 0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78, 0x89, - 0x90 }; - - g_assert (nm_utils_hwaddr_aton (source, ARPHRD_INFINIBAND, buf) != NULL); - g_assert (memcmp (buf, expected, sizeof (expected)) == 0); -} - -static void -test_hwaddr_aton_no_leading_zeros (void) -{ - guint8 buf[100]; - guint8 expected[ETH_ALEN] = { 0x00, 0x1A, 0x2B, 0x03, 0x44, 0x05 }; - - g_assert (nm_utils_hwaddr_aton ("0:1a:2B:3:44:5", ARPHRD_ETHER, buf) != NULL); - g_assert (memcmp (buf, expected, sizeof (expected)) == 0); -} - -static void -test_hwaddr_aton_malformed (void) -{ - guint8 buf[100]; - - g_assert (nm_utils_hwaddr_aton ("0:1a:2B:3:a@%%", ARPHRD_ETHER, buf) == NULL); -} - -static void -test_connection_changed_cb (NMConnection *connection, gboolean *data) -{ - *data = TRUE; -} - -static void -test_ip4_prefix_to_netmask (void) -{ - int i; - - for (i = 0; i<=32; i++) { - guint32 netmask = nm_utils_ip4_prefix_to_netmask (i); - int plen = nm_utils_ip4_netmask_to_prefix (netmask); - - g_assert_cmpint (i, ==, plen); - { - guint32 msk = 0x80000000; - guint32 netmask2 = 0; - guint32 prefix = i; - while (prefix > 0) { - netmask2 |= msk; - msk >>= 1; - prefix--; - } - g_assert_cmpint (netmask, ==, (guint32) htonl (netmask2)); - } - } -} - -static void -test_ip4_netmask_to_prefix (void) -{ - int i, j; - - GRand *r = g_rand_new (); - - g_rand_set_seed (r, 1); - - for (i = 2; i<=32; i++) { - guint32 netmask = nm_utils_ip4_prefix_to_netmask (i); - guint32 netmask_lowest_bit = netmask & ~nm_utils_ip4_prefix_to_netmask (i-1); - - g_assert_cmpint (i, ==, nm_utils_ip4_netmask_to_prefix (netmask)); - - for (j = 0; j < 2*i; j++) { - guint32 n = g_rand_int (r); - guint32 netmask_holey; - guint32 prefix_holey; - - netmask_holey = (netmask & n) | netmask_lowest_bit; - - if (netmask_holey == netmask) - continue; - - /* create an invalid netmask with holes and check that the function - * returns the longest prefix. */ - prefix_holey = nm_utils_ip4_netmask_to_prefix (netmask_holey); - - g_assert_cmpint (i, ==, prefix_holey); - } - } - - g_rand_free (r); -} - -#define ASSERT_CHANGED(statement) \ -{ \ - changed = FALSE; \ - statement; \ - g_assert (changed); \ -} - -#define ASSERT_UNCHANGED(statement) \ -{ \ - changed = FALSE; \ - statement; \ - g_assert (!changed); \ -} - -static void -test_connection_changed_signal (void) -{ - NMConnection *connection; - gboolean changed = FALSE; - - connection = new_test_connection (); - g_signal_connect (connection, - NM_CONNECTION_CHANGED, - (GCallback) test_connection_changed_cb, - &changed); - - /* Add new setting */ - ASSERT_CHANGED (nm_connection_add_setting (connection, nm_setting_vlan_new ())); - - /* Remove existing setting */ - ASSERT_CHANGED (nm_connection_remove_setting (connection, NM_TYPE_SETTING_VLAN)); - - /* Remove non-existing setting */ - ASSERT_UNCHANGED (nm_connection_remove_setting (connection, NM_TYPE_SETTING_VLAN)); - - g_object_unref (connection); -} - -static void -test_setting_connection_changed_signal (void) -{ - NMConnection *connection; - gboolean changed = FALSE; - NMSettingConnection *s_con; - gs_free char *uuid = NULL; - - connection = nm_connection_new (); - g_signal_connect (connection, - NM_CONNECTION_CHANGED, - (GCallback) test_connection_changed_cb, - &changed); - - s_con = (NMSettingConnection *) nm_setting_connection_new (); - nm_connection_add_setting (connection, NM_SETTING (s_con)); - - ASSERT_CHANGED (g_object_set (s_con, NM_SETTING_CONNECTION_ID, "adfadfasdfaf", NULL)); - - ASSERT_CHANGED (nm_setting_connection_add_permission (s_con, "user", "billsmith", NULL)); - ASSERT_CHANGED (nm_setting_connection_remove_permission (s_con, 0)); - - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (iter != NULL)); - ASSERT_UNCHANGED (nm_setting_connection_remove_permission (s_con, 1)); - g_test_assert_expected_messages (); - - uuid = nm_utils_uuid_generate (); - ASSERT_CHANGED (nm_setting_connection_add_secondary (s_con, uuid)); - ASSERT_CHANGED (nm_setting_connection_remove_secondary (s_con, 0)); - - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (elt != NULL)); - ASSERT_UNCHANGED (nm_setting_connection_remove_secondary (s_con, 1)); - g_test_assert_expected_messages (); - - g_object_unref (connection); -} - -static void -test_setting_bond_changed_signal (void) -{ - NMConnection *connection; - gboolean changed = FALSE; - NMSettingBond *s_bond; - - connection = nm_connection_new (); - g_signal_connect (connection, - NM_CONNECTION_CHANGED, - (GCallback) test_connection_changed_cb, - &changed); - - s_bond = (NMSettingBond *) nm_setting_bond_new (); - nm_connection_add_setting (connection, NM_SETTING (s_bond)); - - ASSERT_CHANGED (nm_setting_bond_add_option (s_bond, NM_SETTING_BOND_OPTION_DOWNDELAY, "10")); - ASSERT_CHANGED (nm_setting_bond_remove_option (s_bond, NM_SETTING_BOND_OPTION_DOWNDELAY)); - ASSERT_UNCHANGED (nm_setting_bond_remove_option (s_bond, NM_SETTING_BOND_OPTION_UPDELAY)); - - g_object_unref (connection); -} - -static void -test_setting_ip4_changed_signal (void) -{ - NMConnection *connection; - gboolean changed = FALSE; - NMSettingIP4Config *s_ip4; - NMIP4Address *addr; - NMIP4Route *route; - - connection = nm_connection_new (); - g_signal_connect (connection, - NM_CONNECTION_CHANGED, - (GCallback) test_connection_changed_cb, - &changed); - - s_ip4 = (NMSettingIP4Config *) nm_setting_ip4_config_new (); - nm_connection_add_setting (connection, NM_SETTING (s_ip4)); - - ASSERT_CHANGED (nm_setting_ip4_config_add_dns (s_ip4, 0x1122)); - ASSERT_CHANGED (nm_setting_ip4_config_remove_dns (s_ip4, 0)); - - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (i <= priv->dns->len)); - ASSERT_UNCHANGED (nm_setting_ip4_config_remove_dns (s_ip4, 1)); - g_test_assert_expected_messages (); - - nm_setting_ip4_config_add_dns (s_ip4, 0x3344); - ASSERT_CHANGED (nm_setting_ip4_config_clear_dns (s_ip4)); - - ASSERT_CHANGED (nm_setting_ip4_config_add_dns_search (s_ip4, "foobar.com")); - ASSERT_CHANGED (nm_setting_ip4_config_remove_dns_search (s_ip4, 0)); - - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (elt != NULL)); - ASSERT_UNCHANGED (nm_setting_ip4_config_remove_dns_search (s_ip4, 1)); - g_test_assert_expected_messages (); - - ASSERT_CHANGED (nm_setting_ip4_config_add_dns_search (s_ip4, "foobar.com")); - ASSERT_CHANGED (nm_setting_ip4_config_clear_dns_searches (s_ip4)); - - addr = nm_ip4_address_new (); - nm_ip4_address_set_address (addr, 0x2233); - nm_ip4_address_set_prefix (addr, 24); - ASSERT_CHANGED (nm_setting_ip4_config_add_address (s_ip4, addr)); - ASSERT_CHANGED (nm_setting_ip4_config_remove_address (s_ip4, 0)); - - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (elt != NULL)); - ASSERT_UNCHANGED (nm_setting_ip4_config_remove_address (s_ip4, 1)); - g_test_assert_expected_messages (); - - nm_setting_ip4_config_add_address (s_ip4, addr); - ASSERT_CHANGED (nm_setting_ip4_config_clear_addresses (s_ip4)); - - route = nm_ip4_route_new (); - nm_ip4_route_set_dest (route, 0x2233); - nm_ip4_route_set_prefix (route, 24); - - ASSERT_CHANGED (nm_setting_ip4_config_add_route (s_ip4, route)); - ASSERT_CHANGED (nm_setting_ip4_config_remove_route (s_ip4, 0)); - - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (elt != NULL)); - ASSERT_UNCHANGED (nm_setting_ip4_config_remove_route (s_ip4, 1)); - g_test_assert_expected_messages (); - - nm_setting_ip4_config_add_route (s_ip4, route); - ASSERT_CHANGED (nm_setting_ip4_config_clear_routes (s_ip4)); - - nm_ip4_address_unref (addr); - nm_ip4_route_unref (route); - g_object_unref (connection); -} - -static void -test_setting_ip6_changed_signal (void) -{ - NMConnection *connection; - gboolean changed = FALSE; - NMSettingIP6Config *s_ip6; - NMIP6Address *addr; - NMIP6Route *route; - const struct in6_addr t = { { { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 } } }; - - connection = nm_connection_new (); - g_signal_connect (connection, - NM_CONNECTION_CHANGED, - (GCallback) test_connection_changed_cb, - &changed); - - s_ip6 = (NMSettingIP6Config *) nm_setting_ip6_config_new (); - nm_connection_add_setting (connection, NM_SETTING (s_ip6)); - - ASSERT_CHANGED (nm_setting_ip6_config_add_dns (s_ip6, &t)); - ASSERT_CHANGED (nm_setting_ip6_config_remove_dns (s_ip6, 0)); - - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (elt != NULL)); - ASSERT_UNCHANGED (nm_setting_ip6_config_remove_dns (s_ip6, 1)); - g_test_assert_expected_messages (); - - nm_setting_ip6_config_add_dns (s_ip6, &t); - ASSERT_CHANGED (nm_setting_ip6_config_clear_dns (s_ip6)); - - ASSERT_CHANGED (nm_setting_ip6_config_add_dns_search (s_ip6, "foobar.com")); - ASSERT_CHANGED (nm_setting_ip6_config_remove_dns_search (s_ip6, 0)); - - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (elt != NULL)); - ASSERT_UNCHANGED (nm_setting_ip6_config_remove_dns_search (s_ip6, 1)); - g_test_assert_expected_messages (); - - nm_setting_ip6_config_add_dns_search (s_ip6, "foobar.com"); - ASSERT_CHANGED (nm_setting_ip6_config_clear_dns_searches (s_ip6)); - - addr = nm_ip6_address_new (); - nm_ip6_address_set_address (addr, &t); - nm_ip6_address_set_prefix (addr, 64); - - ASSERT_CHANGED (nm_setting_ip6_config_add_address (s_ip6, addr)); - ASSERT_CHANGED (nm_setting_ip6_config_remove_address (s_ip6, 0)); - - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (elt != NULL)); - ASSERT_UNCHANGED (nm_setting_ip6_config_remove_address (s_ip6, 1)); - g_test_assert_expected_messages (); - - nm_setting_ip6_config_add_address (s_ip6, addr); - ASSERT_CHANGED (nm_setting_ip6_config_clear_addresses (s_ip6)); - - route = nm_ip6_route_new (); - nm_ip6_route_set_dest (route, &t); - nm_ip6_route_set_prefix (route, 128); - - ASSERT_CHANGED (nm_setting_ip6_config_add_route (s_ip6, route)); - ASSERT_CHANGED (nm_setting_ip6_config_remove_route (s_ip6, 0)); - - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (elt != NULL)); - ASSERT_UNCHANGED (nm_setting_ip6_config_remove_route (s_ip6, 1)); - g_test_assert_expected_messages (); - - nm_setting_ip6_config_add_route (s_ip6, route); - ASSERT_CHANGED (nm_setting_ip6_config_clear_routes (s_ip6)); - - nm_ip6_address_unref (addr); - nm_ip6_route_unref (route); - g_object_unref (connection); -} - -static void -test_setting_vlan_changed_signal (void) -{ - NMConnection *connection; - gboolean changed = FALSE; - NMSettingVlan *s_vlan; - - connection = nm_connection_new (); - g_signal_connect (connection, - NM_CONNECTION_CHANGED, - (GCallback) test_connection_changed_cb, - &changed); - - s_vlan = (NMSettingVlan *) nm_setting_vlan_new (); - nm_connection_add_setting (connection, NM_SETTING (s_vlan)); - - ASSERT_CHANGED (nm_setting_vlan_add_priority (s_vlan, NM_VLAN_INGRESS_MAP, 1, 3)); - ASSERT_CHANGED (nm_setting_vlan_remove_priority (s_vlan, NM_VLAN_INGRESS_MAP, 0)); - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (idx < g_slist_length (list))); - ASSERT_UNCHANGED (nm_setting_vlan_remove_priority (s_vlan, NM_VLAN_INGRESS_MAP, 1)); - g_test_assert_expected_messages (); - ASSERT_CHANGED (nm_setting_vlan_add_priority_str (s_vlan, NM_VLAN_INGRESS_MAP, "1:3")); - ASSERT_CHANGED (nm_setting_vlan_clear_priorities (s_vlan, NM_VLAN_INGRESS_MAP)); - - ASSERT_CHANGED (nm_setting_vlan_add_priority (s_vlan, NM_VLAN_EGRESS_MAP, 1, 3)); - ASSERT_CHANGED (nm_setting_vlan_remove_priority (s_vlan, NM_VLAN_EGRESS_MAP, 0)); - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (idx < g_slist_length (list))); - ASSERT_UNCHANGED (nm_setting_vlan_remove_priority (s_vlan, NM_VLAN_EGRESS_MAP, 1)); - g_test_assert_expected_messages (); - ASSERT_CHANGED (nm_setting_vlan_add_priority_str (s_vlan, NM_VLAN_EGRESS_MAP, "1:3")); - ASSERT_CHANGED (nm_setting_vlan_clear_priorities (s_vlan, NM_VLAN_EGRESS_MAP)); - - g_object_unref (connection); -} - -static void -test_setting_vpn_changed_signal (void) -{ - NMConnection *connection; - gboolean changed = FALSE; - NMSettingVPN *s_vpn; - - connection = nm_connection_new (); - g_signal_connect (connection, - NM_CONNECTION_CHANGED, - (GCallback) test_connection_changed_cb, - &changed); - - s_vpn = (NMSettingVPN *) nm_setting_vpn_new (); - nm_connection_add_setting (connection, NM_SETTING (s_vpn)); - - ASSERT_CHANGED (nm_setting_vpn_add_data_item (s_vpn, "foobar", "baz")); - ASSERT_CHANGED (nm_setting_vpn_remove_data_item (s_vpn, "foobar")); - ASSERT_UNCHANGED (nm_setting_vpn_remove_data_item (s_vpn, "not added")); - - ASSERT_CHANGED (nm_setting_vpn_add_secret (s_vpn, "foobar", "baz")); - ASSERT_CHANGED (nm_setting_vpn_remove_secret (s_vpn, "foobar")); - ASSERT_UNCHANGED (nm_setting_vpn_remove_secret (s_vpn, "not added")); - - g_object_unref (connection); -} - -static void -test_setting_wired_changed_signal (void) -{ - NMConnection *connection; - gboolean changed = FALSE; - NMSettingWired *s_wired; - - connection = nm_connection_new (); - g_signal_connect (connection, - NM_CONNECTION_CHANGED, - (GCallback) test_connection_changed_cb, - &changed); - - s_wired = (NMSettingWired *) nm_setting_wired_new (); - nm_connection_add_setting (connection, NM_SETTING (s_wired)); - - ASSERT_CHANGED (nm_setting_wired_add_s390_option (s_wired, "portno", "1")); - ASSERT_CHANGED (nm_setting_wired_remove_s390_option (s_wired, "portno")); - ASSERT_UNCHANGED (nm_setting_wired_remove_s390_option (s_wired, "layer2")); - - g_object_unref (connection); -} - -static void -test_setting_wireless_changed_signal (void) -{ - NMConnection *connection; - gboolean changed = FALSE; - NMSettingWireless *s_wifi; - - connection = nm_connection_new (); - g_signal_connect (connection, - NM_CONNECTION_CHANGED, - (GCallback) test_connection_changed_cb, - &changed); - - s_wifi = (NMSettingWireless *) nm_setting_wireless_new (); - nm_connection_add_setting (connection, NM_SETTING (s_wifi)); - - ASSERT_CHANGED (nm_setting_wireless_add_seen_bssid (s_wifi, "00:11:22:33:44:55")); - - g_object_unref (connection); -} - -static void -test_setting_wireless_security_changed_signal (void) -{ - NMConnection *connection; - gboolean changed = FALSE; - NMSettingWirelessSecurity *s_wsec; - - connection = nm_connection_new (); - g_signal_connect (connection, - NM_CONNECTION_CHANGED, - (GCallback) test_connection_changed_cb, - &changed); - - s_wsec = (NMSettingWirelessSecurity *) nm_setting_wireless_security_new (); - nm_connection_add_setting (connection, NM_SETTING (s_wsec)); - - /* Protos */ - ASSERT_CHANGED (nm_setting_wireless_security_add_proto (s_wsec, "wpa")); - ASSERT_CHANGED (nm_setting_wireless_security_remove_proto (s_wsec, 0)); - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (elt != NULL)); - ASSERT_UNCHANGED (nm_setting_wireless_security_remove_proto (s_wsec, 1)); - g_test_assert_expected_messages (); - - nm_setting_wireless_security_add_proto (s_wsec, "wep"); - ASSERT_CHANGED (nm_setting_wireless_security_clear_protos (s_wsec)); - - /* Pairwise ciphers */ - ASSERT_CHANGED (nm_setting_wireless_security_add_pairwise (s_wsec, "tkip")); - ASSERT_CHANGED (nm_setting_wireless_security_remove_pairwise (s_wsec, 0)); - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (elt != NULL)); - ASSERT_UNCHANGED (nm_setting_wireless_security_remove_pairwise (s_wsec, 1)); - g_test_assert_expected_messages (); - - nm_setting_wireless_security_add_pairwise (s_wsec, "tkip"); - ASSERT_CHANGED (nm_setting_wireless_security_clear_pairwise (s_wsec)); - - /* Group ciphers */ - ASSERT_CHANGED (nm_setting_wireless_security_add_group (s_wsec, "ccmp")); - ASSERT_CHANGED (nm_setting_wireless_security_remove_group (s_wsec, 0)); - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (elt != NULL)); - ASSERT_UNCHANGED (nm_setting_wireless_security_remove_group (s_wsec, 1)); - g_test_assert_expected_messages (); - - nm_setting_wireless_security_add_group (s_wsec, "tkip"); - ASSERT_CHANGED (nm_setting_wireless_security_clear_groups (s_wsec)); - - /* WEP key secret flags */ - ASSERT_CHANGED (g_assert (nm_setting_set_secret_flags (NM_SETTING (s_wsec), "wep-key0", NM_SETTING_SECRET_FLAG_AGENT_OWNED, NULL))); - ASSERT_CHANGED (g_assert (nm_setting_set_secret_flags (NM_SETTING (s_wsec), "wep-key1", NM_SETTING_SECRET_FLAG_AGENT_OWNED, NULL))); - ASSERT_CHANGED (g_assert (nm_setting_set_secret_flags (NM_SETTING (s_wsec), "wep-key2", NM_SETTING_SECRET_FLAG_AGENT_OWNED, NULL))); - ASSERT_CHANGED (g_assert (nm_setting_set_secret_flags (NM_SETTING (s_wsec), "wep-key3", NM_SETTING_SECRET_FLAG_AGENT_OWNED, NULL))); - - g_object_unref (connection); -} - -static void -test_setting_802_1x_changed_signal (void) -{ - NMConnection *connection; - gboolean changed = FALSE; - NMSetting8021x *s_8021x; - - connection = nm_connection_new (); - g_signal_connect (connection, - NM_CONNECTION_CHANGED, - (GCallback) test_connection_changed_cb, - &changed); - - s_8021x = (NMSetting8021x *) nm_setting_802_1x_new (); - nm_connection_add_setting (connection, NM_SETTING (s_8021x)); - - /* EAP methods */ - ASSERT_CHANGED (nm_setting_802_1x_add_eap_method (s_8021x, "tls")); - ASSERT_CHANGED (nm_setting_802_1x_remove_eap_method (s_8021x, 0)); - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (elt != NULL)); - ASSERT_UNCHANGED (nm_setting_802_1x_remove_eap_method (s_8021x, 1)); - g_test_assert_expected_messages (); - - nm_setting_802_1x_add_eap_method (s_8021x, "ttls"); - ASSERT_CHANGED (nm_setting_802_1x_clear_eap_methods (s_8021x)); - - /* alternate subject matches */ - ASSERT_CHANGED (nm_setting_802_1x_add_altsubject_match (s_8021x, "EMAIL:server@example.com")); - ASSERT_CHANGED (nm_setting_802_1x_remove_altsubject_match (s_8021x, 0)); - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (elt != NULL)); - ASSERT_UNCHANGED (nm_setting_802_1x_remove_altsubject_match (s_8021x, 1)); - g_test_assert_expected_messages (); - - nm_setting_802_1x_add_altsubject_match (s_8021x, "EMAIL:server@example.com"); - ASSERT_CHANGED (nm_setting_802_1x_clear_altsubject_matches (s_8021x)); - - /* phase2 alternate subject matches */ - ASSERT_CHANGED (nm_setting_802_1x_add_phase2_altsubject_match (s_8021x, "EMAIL:server@example.com")); - ASSERT_CHANGED (nm_setting_802_1x_remove_phase2_altsubject_match (s_8021x, 0)); - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (elt != NULL)); - ASSERT_UNCHANGED (nm_setting_802_1x_remove_phase2_altsubject_match (s_8021x, 1)); - g_test_assert_expected_messages (); - - nm_setting_802_1x_add_phase2_altsubject_match (s_8021x, "EMAIL:server@example.com"); - ASSERT_CHANGED (nm_setting_802_1x_clear_phase2_altsubject_matches (s_8021x)); - - g_object_unref (connection); -} - -static void -test_setting_old_uuid (void) -{ - GError *error = NULL; - gs_unref_object NMSetting *setting = NULL; - gboolean success; - - /* NetworkManager-0.9.4.0 generated 40-character UUIDs with no dashes, - * like this one. Test that we maintain compatibility. */ - const char *uuid = "f43bec2cdd60e5da381ebb1eb1fa39f3cc52660c"; - - setting = nm_setting_connection_new (); - g_object_set (G_OBJECT (setting), - NM_SETTING_CONNECTION_ID, "uuidtest", - NM_SETTING_CONNECTION_UUID, uuid, - NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME, - NULL); - - success = nm_setting_verify (NM_SETTING (setting), NULL, &error); - g_assert_no_error (error); - g_assert (success == TRUE); -} - -/* - * nm_connection_verify() modifies the connection by setting - * the interface-name property to the virtual_iface_name of - * the type specific settings. - * - * It would be preferable of verify() not to touch the connection, - * but as it is now, stick with it and test it. - **/ -static void -test_connection_verify_sets_interface_name (void) -{ - NMConnection *con; - NMSettingConnection *s_con; - NMSettingBond *s_bond; - GError *error = NULL; - gboolean success; - - s_con = (NMSettingConnection *) nm_setting_connection_new (); - g_object_set (G_OBJECT (s_con), - NM_SETTING_CONNECTION_ID, "test1", - NM_SETTING_CONNECTION_UUID, "22001632-bbb4-4616-b277-363dce3dfb5b", - NM_SETTING_CONNECTION_TYPE, NM_SETTING_BOND_SETTING_NAME, - NULL); - s_bond = (NMSettingBond *) nm_setting_bond_new (); - g_object_set (G_OBJECT (s_bond), - NM_SETTING_BOND_INTERFACE_NAME, "bond-x", - NULL); - - con = nm_connection_new (); - nm_connection_add_setting (con, NM_SETTING (s_con)); - nm_connection_add_setting (con, NM_SETTING (s_bond)); - - g_assert_cmpstr (nm_connection_get_interface_name (con), ==, NULL); - - /* for backward compatibility, normalizes the interface name */ - success = nm_connection_verify (con, &error); - g_assert (success && !error); - - g_assert_cmpstr (nm_connection_get_interface_name (con), ==, "bond-x"); - - g_object_unref (con); -} - -/* - * Test normalization of interface-name - **/ -static void -test_connection_normalize_virtual_iface_name (void) -{ - NMConnection *con; - NMSettingConnection *s_con; - NMSettingVlan *s_vlan; - NMSetting *setting; - GError *error = NULL; - gboolean success; - const char *IFACE_NAME = "iface"; - const char *IFACE_VIRT = "iface-X"; - gboolean modified = FALSE; - - con = nm_connection_new (); - - setting = nm_setting_ip4_config_new (); - g_object_set (setting, - NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO, - NULL); - nm_connection_add_setting (con, setting); - - setting = nm_setting_ip6_config_new (); - g_object_set (setting, - NM_SETTING_IP6_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_AUTO, - NM_SETTING_IP6_CONFIG_MAY_FAIL, TRUE, - NULL); - nm_connection_add_setting (con, setting); - - s_con = (NMSettingConnection *) nm_setting_connection_new (); - g_object_set (G_OBJECT (s_con), - NM_SETTING_CONNECTION_ID, "test1", - NM_SETTING_CONNECTION_UUID, "22001632-bbb4-4616-b277-363dce3dfb5b", - NM_SETTING_CONNECTION_TYPE, NM_SETTING_VLAN_SETTING_NAME, - NM_SETTING_CONNECTION_INTERFACE_NAME, IFACE_NAME, - NULL); - s_vlan = (NMSettingVlan *) nm_setting_vlan_new (); - g_object_set (G_OBJECT (s_vlan), - NM_SETTING_VLAN_INTERFACE_NAME, IFACE_VIRT, - NM_SETTING_VLAN_PARENT, "eth0", - NULL); - - nm_connection_add_setting (con, NM_SETTING (s_con)); - nm_connection_add_setting (con, NM_SETTING (s_vlan)); - - g_assert_cmpstr (nm_connection_get_interface_name (con), ==, IFACE_NAME); - g_assert_cmpstr (nm_setting_vlan_get_interface_name (s_vlan), ==, IFACE_VIRT); - - /* for backward compatibility, normalizes the interface name */ - success = nm_connection_verify (con, &error); - g_assert (success && !error); - - g_assert_cmpstr (nm_connection_get_interface_name (con), ==, IFACE_NAME); - g_assert_cmpstr (nm_setting_vlan_get_interface_name (s_vlan), ==, IFACE_VIRT); - - success = nm_connection_normalize (con, NULL, &modified, &error); - g_assert (success && !error); - g_assert (modified); - - g_assert_cmpstr (nm_connection_get_interface_name (con), ==, IFACE_NAME); - g_assert_cmpstr (nm_setting_vlan_get_interface_name (s_vlan), ==, IFACE_NAME); - - success = nm_connection_verify (con, &error); - g_assert (success && !error); - - g_object_unref (con); -} - -#if defined (__SANITIZE_ADDRESS__) -static void -test_libnm_linking (void) -{ - g_test_skip ("Skipping test since address sanitizer is enabled"); -} -#else /* __SANITIZE_ADDRESS__ */ -static void -_test_libnm_linking_setup_child_process (gpointer user_data) -{ - int val; - struct rlimit limit; - - /* the child process is supposed to crash. We don't want it - * to write a core dump. */ - - val = getrlimit (RLIMIT_CORE, &limit); - if (val == 0) { - limit.rlim_cur = 0; - val = setrlimit (RLIMIT_CORE, &limit); - if (val == 0) - return; - } - /* on error, do not crash or fail assertion. Instead just exit */ - exit (1); -} - -static void -test_libnm_linking (void) -{ - char *argv[] = { "./test-libnm-linking", NULL }; - char *out, *err; - int status; - GError *error = NULL; - - g_spawn_sync (NM_BUILD_BUILDDIR"/libnm-util/tests", - argv, NULL, 0 /*G_SPAWN_DEFAULT*/, - _test_libnm_linking_setup_child_process, NULL, - &out, &err, &status, &error); - g_assert_no_error (error); - - g_assert (WIFSIGNALED (status)); - - g_assert (strstr (err, "Mixing libnm") != NULL); - g_free (out); - g_free (err); -} -#endif /* __SANITIZE_ADDRESS__ */ - -/*****************************************************************************/ - -static void -_test_uuid (const char *expected_uuid, const char *str) -{ - gs_free char *uuid_test = NULL; - - g_assert (str); - - uuid_test = nm_utils_uuid_generate_from_string (str); - - g_assert (uuid_test); - g_assert (nm_utils_is_uuid (uuid_test)); - - if (strcmp (uuid_test, expected_uuid)) { - g_error ("UUID test failed: text=%s, uuid=%s, expected=%s", - str, uuid_test, expected_uuid); - } -} - -static void -test_nm_utils_uuid_generate_from_string (void) -{ - gs_free char *uuid_test = NULL; - - _test_uuid ("0cc175b9-c0f1-b6a8-31c3-99e269772661", "a"); - _test_uuid ("098f6bcd-4621-d373-cade-4e832627b4f6", "test"); - _test_uuid ("59c0547b-7fe2-1c15-2cce-e328e8bf6742", "/etc/NetworkManager/system-connections/em1"); - - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (s && *s)); - uuid_test = nm_utils_uuid_generate_from_string (""); - g_assert (uuid_test == NULL); - g_test_assert_expected_messages (); - - NMTST_EXPECT_LIBNM_U_CRITICAL (NMTST_G_RETURN_MSG (s && *s)); - uuid_test = nm_utils_uuid_generate_from_string (NULL); - g_assert (uuid_test == NULL); - g_test_assert_expected_messages (); -} - -/*****************************************************************************/ - -NMTST_DEFINE (); - -int main (int argc, char **argv) -{ - nmtst_init (&argc, &argv, TRUE); - - /* The tests */ - g_test_add_func ("/libnm/setting_vpn_items", test_setting_vpn_items); - g_test_add_func ("/libnm/setting_vpn_update_secrets", test_setting_vpn_update_secrets); - g_test_add_func ("/libnm/setting_vpn_modify_during_foreach", test_setting_vpn_modify_during_foreach); - g_test_add_func ("/libnm/setting_ip6_config_old_address_array", test_setting_ip6_config_old_address_array); - g_test_add_func ("/libnm/setting_gsm_apn_spaces", test_setting_gsm_apn_spaces); - g_test_add_func ("/libnm/setting_gsm_apn_bad_chars", test_setting_gsm_apn_bad_chars); - g_test_add_func ("/libnm/setting_gsm_apn_underscore", test_setting_gsm_apn_underscore); - g_test_add_func ("/libnm/setting_gsm_without_number", test_setting_gsm_without_number); - g_test_add_func ("/libnm/setting_to_hash_all", test_setting_to_hash_all); - g_test_add_func ("/libnm/setting_to_hash_no_secrets", test_setting_to_hash_no_secrets); - g_test_add_func ("/libnm/setting_to_hash_only_secrets", test_setting_to_hash_only_secrets); - g_test_add_func ("/libnm/setting_compare_id", test_setting_compare_id); - g_test_add_func ("/libnm/setting_compare_secrets", test_setting_compare_secrets); - g_test_add_func ("/libnm/setting_compare_vpn_secrets", test_setting_compare_vpn_secrets); - g_test_add_func ("/libnm/setting_old_uuid", test_setting_old_uuid); - - g_test_add_func ("/libnm/connection_to_hash_setting_name", test_connection_to_hash_setting_name); - g_test_add_func ("/libnm/setting_new_from_hash", test_setting_new_from_hash); - g_test_add_func ("/libnm/connection_replace_settings", test_connection_replace_settings); - g_test_add_func ("/libnm/connection_replace_settings_from_connection", test_connection_replace_settings_from_connection); - g_test_add_func ("/libnm/connection_new_from_hash", test_connection_new_from_hash); - g_test_add_func ("/libnm/connection_verify_sets_interface_name", test_connection_verify_sets_interface_name); - g_test_add_func ("/libnm/connection_normalize_virtual_iface_name", test_connection_normalize_virtual_iface_name); - - g_test_add_func ("/libnm/setting_connection_permissions_helpers", test_setting_connection_permissions_helpers); - g_test_add_func ("/libnm/setting_connection_permissions_property", test_setting_connection_permissions_property); - - g_test_add_func ("/libnm/connection_compare_same", test_connection_compare_same); - g_test_add_func ("/libnm/connection_compare_key_only_in_a", test_connection_compare_key_only_in_a); - g_test_add_func ("/libnm/connection_compare_setting_only_in_a", test_connection_compare_setting_only_in_a); - g_test_add_func ("/libnm/connection_compare_key_only_in_b", test_connection_compare_key_only_in_b); - g_test_add_func ("/libnm/connection_compare_setting_only_in_b", test_connection_compare_setting_only_in_b); - - g_test_add_func ("/libnm/connection_diff_a_only", test_connection_diff_a_only); - g_test_add_func ("/libnm/connection_diff_same", test_connection_diff_same); - g_test_add_func ("/libnm/connection_diff_different", test_connection_diff_different); - g_test_add_func ("/libnm/connection_diff_no_secrets", test_connection_diff_no_secrets); - g_test_add_func ("/libnm/connection_diff_inferrable", test_connection_diff_inferrable); - g_test_add_func ("/libnm/connection_good_base_types", test_connection_good_base_types); - g_test_add_func ("/libnm/connection_bad_base_types", test_connection_bad_base_types); - - g_test_add_func ("/libnm/hwaddr_aton_ether_normal", test_hwaddr_aton_ether_normal); - g_test_add_func ("/libnm/hwaddr_aton_ib_normal", test_hwaddr_aton_ib_normal); - g_test_add_func ("/libnm/hwaddr_aton_no_leading_zeros", test_hwaddr_aton_no_leading_zeros); - g_test_add_func ("/libnm/hwaddr_aton_malformed", test_hwaddr_aton_malformed); - g_test_add_func ("/libnm/ip4_prefix_to_netmask", test_ip4_prefix_to_netmask); - g_test_add_func ("/libnm/ip4_netmask_to_prefix", test_ip4_netmask_to_prefix); - - g_test_add_func ("/libnm/connection_changed_signal", test_connection_changed_signal); - g_test_add_func ("/libnm/setting_connection_changed_signal", test_setting_connection_changed_signal); - g_test_add_func ("/libnm/setting_bond_changed_signal", test_setting_bond_changed_signal); - g_test_add_func ("/libnm/setting_ip4_changed_signal", test_setting_ip4_changed_signal); - g_test_add_func ("/libnm/setting_ip6_changed_signal", test_setting_ip6_changed_signal); - g_test_add_func ("/libnm/setting_vlan_changed_signal", test_setting_vlan_changed_signal); - g_test_add_func ("/libnm/setting_vpn_changed_signal", test_setting_vpn_changed_signal); - g_test_add_func ("/libnm/setting_wired_changed_signal", test_setting_wired_changed_signal); - g_test_add_func ("/libnm/setting_wireless_changed_signal", test_setting_wireless_changed_signal); - g_test_add_func ("/libnm/setting_wireless_security_changed_signal", test_setting_wireless_security_changed_signal); - g_test_add_func ("/libnm/setting_802_1x_changed_signal", test_setting_802_1x_changed_signal); - - g_test_add_func ("/libnm/libnm_linking", test_libnm_linking); - - g_test_add_func ("/libnm/nm_utils_uuid_generate_from_string", test_nm_utils_uuid_generate_from_string); - - return g_test_run (); -} - diff --git a/libnm-util/tests/test-libnm-linking.c b/libnm-util/tests/test-libnm-linking.c deleted file mode 100644 index 0e143e739d..0000000000 --- a/libnm-util/tests/test-libnm-linking.c +++ /dev/null @@ -1,45 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Copyright 2014 Red Hat, Inc. - * - */ - -#include "nm-default.h" - -#include "nm-utils.h" - -extern GType nm_state_get_type (void); - -int -main (int argc, char **argv) -{ - /* If we reach main(), then the test has failed. */ - g_printerr ("libnm/libnm-util constructor failed to detect symbol mixing\n"); - - /* This is just to ensure that both libnm.so and libnm-util.so get pulled - * in; libnm-util doesn't have "nm_state_get_type" and libnm doesn't have - * "nm_utils_slist_free". (We intentionally choose different symbols than the - * ones that the libraries check for.) - */ - nm_state_get_type (); - G_GNUC_BEGIN_IGNORE_DEPRECATIONS; - nm_utils_slist_free (NULL, g_free); - G_GNUC_END_IGNORE_DEPRECATIONS; - - g_assert_not_reached (); -} diff --git a/libnm-util/tests/test-secrets.c b/libnm-util/tests/test-secrets.c deleted file mode 100644 index 43c206ff76..0000000000 --- a/libnm-util/tests/test-secrets.c +++ /dev/null @@ -1,684 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Copyright 2008 - 2011 Red Hat, Inc. - * - */ - -#include "nm-default.h" - -#include <string.h> - -#include "nm-utils.h" - -#include "nm-setting-connection.h" -#include "nm-setting-wired.h" -#include "nm-setting-8021x.h" -#include "nm-setting-ip4-config.h" -#include "nm-setting-wireless.h" -#include "nm-setting-wireless-security.h" -#include "nm-setting-cdma.h" -#include "nm-setting-gsm.h" -#include "nm-setting-ppp.h" -#include "nm-setting-pppoe.h" -#include "nm-setting-vpn.h" - -#include "nm-utils/nm-test-utils.h" - -#define TEST_CERT_DIR NM_BUILD_SRCDIR"/libnm-core/tests/certs" -#define TEST_NEED_SECRETS_EAP_TLS_CA_CERT TEST_CERT_DIR "/test_ca_cert.pem" -#define TEST_NEED_SECRETS_EAP_TLS_CLIENT_CERT TEST_CERT_DIR "/test_key_and_cert.pem" -#define TEST_NEED_SECRETS_EAP_TLS_PRIVATE_KEY TEST_CERT_DIR "/test_key_and_cert.pem" - -static void -_assert_hints_has (GPtrArray *hints, const char *item) -{ - guint i; - guint found = 0; - - g_assert (hints); - g_assert (item); - for (i = 0; i < hints->len; i++) { - g_assert (hints->pdata[i]); - if (!strcmp (item, hints->pdata[i])) - found++; - } - g_assert_cmpint (found, ==, 1); -} - -static NMConnection * -make_tls_connection (const char *detail, NMSetting8021xCKScheme scheme) -{ - NMConnection *connection; - NMSettingConnection *s_con; - NMSetting8021x *s_8021x; - NMSettingWired *s_wired; - NMSettingIP4Config *s_ip4; - char *uuid; - gboolean success; - GError *error = NULL; - - connection = nm_connection_new (); - - /* Connection setting */ - s_con = (NMSettingConnection *) nm_setting_connection_new (); - nm_connection_add_setting (connection, NM_SETTING (s_con)); - - uuid = nm_utils_uuid_generate (); - g_object_set (s_con, - NM_SETTING_CONNECTION_ID, "Test Need TLS Secrets", - NM_SETTING_CONNECTION_UUID, uuid, - NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, - NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME, - NULL); - g_free (uuid); - - /* Wired setting */ - s_wired = (NMSettingWired *) nm_setting_wired_new (); - nm_connection_add_setting (connection, NM_SETTING (s_wired)); - - /* Wireless security setting */ - s_8021x = (NMSetting8021x *) nm_setting_802_1x_new (); - nm_connection_add_setting (connection, NM_SETTING (s_8021x)); - - g_object_set (s_8021x, NM_SETTING_802_1X_IDENTITY, "Bill Smith", NULL); - - nm_setting_802_1x_add_eap_method (s_8021x, "tls"); - - success = nm_setting_802_1x_set_ca_cert (s_8021x, - TEST_NEED_SECRETS_EAP_TLS_CA_CERT, - scheme, - NULL, - &error); - nmtst_assert_success (success, error); - - success = nm_setting_802_1x_set_client_cert (s_8021x, - TEST_NEED_SECRETS_EAP_TLS_CLIENT_CERT, - scheme, - NULL, - &error); - nmtst_assert_success (success, error); - - success = nm_setting_802_1x_set_private_key (s_8021x, - TEST_NEED_SECRETS_EAP_TLS_PRIVATE_KEY, - "test", - scheme, - NULL, - &error); - nmtst_assert_success (success, error); - - /* IP4 setting */ - s_ip4 = (NMSettingIP4Config *) nm_setting_ip4_config_new (); - nm_connection_add_setting (connection, NM_SETTING (s_ip4)); - - g_object_set (s_ip4, NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO, NULL); - - nmtst_assert_connection_verifies_and_normalizable (connection); - - return connection; -} - -static void -test_need_tls_secrets_path (void) -{ - NMConnection *connection; - const char *setting_name; - GPtrArray *hints = NULL; - - connection = make_tls_connection ("need-tls-secrets-path-key", NM_SETTING_802_1X_CK_SCHEME_PATH); - - /* Ensure we don't need any secrets since we just set up the connection */ - setting_name = nm_connection_need_secrets (connection, &hints); - g_assert (!setting_name); - g_assert (!hints); - - /* Connection is good; clear secrets and ensure private key password is then required */ - nm_connection_clear_secrets (connection); - - hints = NULL; - setting_name = nm_connection_need_secrets (connection, &hints); - g_assert_cmpstr (setting_name, ==, NM_SETTING_802_1X_SETTING_NAME); - _assert_hints_has (hints, NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD); - - g_ptr_array_free (hints, TRUE); - g_object_unref (connection); -} - -static void -test_need_tls_secrets_blob (void) -{ - NMConnection *connection; - const char *setting_name; - GPtrArray *hints = NULL; - - connection = make_tls_connection ("need-tls-secrets-blob-key", NM_SETTING_802_1X_CK_SCHEME_BLOB); - - /* Ensure we don't need any secrets since we just set up the connection */ - setting_name = nm_connection_need_secrets (connection, &hints); - g_assert (!setting_name); - g_assert (!hints); - - /* Clear secrets and ensure password is again required */ - nm_connection_clear_secrets (connection); - - hints = NULL; - setting_name = nm_connection_need_secrets (connection, &hints); - g_assert_cmpstr (setting_name, ==, NM_SETTING_802_1X_SETTING_NAME); - _assert_hints_has (hints, NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD); - - g_ptr_array_free (hints, TRUE); - g_object_unref (connection); -} - -static NMConnection * -make_tls_phase2_connection (const char *detail, NMSetting8021xCKScheme scheme) -{ - NMConnection *connection; - NMSettingConnection *s_con; - NMSetting8021x *s_8021x; - NMSettingWired *s_wired; - NMSettingIP4Config *s_ip4; - char *uuid; - gboolean success; - GError *error = NULL; - - connection = nm_connection_new (); - - /* Connection setting */ - s_con = (NMSettingConnection *) nm_setting_connection_new (); - nm_connection_add_setting (connection, NM_SETTING (s_con)); - - uuid = nm_utils_uuid_generate (); - g_object_set (s_con, - NM_SETTING_CONNECTION_ID, "Test Need TLS Secrets", - NM_SETTING_CONNECTION_UUID, uuid, - NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, - NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME, - NULL); - g_free (uuid); - - /* Wired setting */ - s_wired = (NMSettingWired *) nm_setting_wired_new (); - nm_connection_add_setting (connection, NM_SETTING (s_wired)); - - /* Wireless security setting */ - s_8021x = (NMSetting8021x *) nm_setting_802_1x_new (); - nm_connection_add_setting (connection, NM_SETTING (s_8021x)); - - g_object_set (s_8021x, NM_SETTING_802_1X_ANONYMOUS_IDENTITY, "blahblah", NULL); - g_object_set (s_8021x, NM_SETTING_802_1X_IDENTITY, "Bill Smith", NULL); - - nm_setting_802_1x_add_eap_method (s_8021x, "ttls"); - g_object_set (s_8021x, NM_SETTING_802_1X_PHASE2_AUTH, "tls", NULL); - - success = nm_setting_802_1x_set_phase2_ca_cert (s_8021x, - TEST_NEED_SECRETS_EAP_TLS_CA_CERT, - scheme, - NULL, - &error); - nmtst_assert_success (success, error); - - success = nm_setting_802_1x_set_phase2_client_cert (s_8021x, - TEST_NEED_SECRETS_EAP_TLS_CLIENT_CERT, - scheme, - NULL, - &error); - nmtst_assert_success (success, error); - - success = nm_setting_802_1x_set_phase2_private_key (s_8021x, - TEST_NEED_SECRETS_EAP_TLS_PRIVATE_KEY, - "test", - scheme, - NULL, - &error); - nmtst_assert_success (success, error); - - /* IP4 setting */ - s_ip4 = (NMSettingIP4Config *) nm_setting_ip4_config_new (); - nm_connection_add_setting (connection, NM_SETTING (s_ip4)); - - g_object_set (s_ip4, NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO, NULL); - - nmtst_assert_connection_verifies_and_normalizable (connection); - - return connection; -} - -static void -test_need_tls_phase2_secrets_path (void) -{ - NMConnection *connection; - const char *setting_name; - GPtrArray *hints = NULL; - - connection = make_tls_phase2_connection ("need-tls-phase2-secrets-path-key", - NM_SETTING_802_1X_CK_SCHEME_PATH); - - /* Ensure we don't need any secrets since we just set up the connection */ - setting_name = nm_connection_need_secrets (connection, &hints); - g_assert (!setting_name); - g_assert (!hints); - - /* Connection is good; clear secrets and ensure private key password is then required */ - nm_connection_clear_secrets (connection); - - hints = NULL; - setting_name = nm_connection_need_secrets (connection, &hints); - g_assert_cmpstr (setting_name, ==, NM_SETTING_802_1X_SETTING_NAME); - _assert_hints_has (hints, NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD); - - g_ptr_array_free (hints, TRUE); - g_object_unref (connection); -} - -static void -test_need_tls_phase2_secrets_blob (void) -{ - NMConnection *connection; - const char *setting_name; - GPtrArray *hints = NULL; - - connection = make_tls_phase2_connection ("need-tls-phase2-secrets-blob-key", - NM_SETTING_802_1X_CK_SCHEME_BLOB); - - /* Ensure we don't need any secrets since we just set up the connection */ - setting_name = nm_connection_need_secrets (connection, &hints); - g_assert (!setting_name); - g_assert (!hints); - - /* Connection is good; clear secrets and ensure private key password is then required */ - nm_connection_clear_secrets (connection); - - hints = NULL; - setting_name = nm_connection_need_secrets (connection, &hints); - g_assert_cmpstr (setting_name, ==, NM_SETTING_802_1X_SETTING_NAME); - _assert_hints_has (hints, NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD); - - g_ptr_array_free (hints, TRUE); - g_object_unref (connection); -} - -static NMConnection * -wifi_connection_new (void) -{ - NMConnection *connection; - NMSettingConnection *s_con; - NMSettingWireless *s_wifi; - NMSettingWirelessSecurity *s_wsec; - unsigned char tmpssid[] = { 0x31, 0x33, 0x33, 0x37 }; - char *uuid; - GByteArray *ssid; - - connection = nm_connection_new (); - g_assert (connection); - - /* Connection setting */ - s_con = (NMSettingConnection *) nm_setting_connection_new (); - g_assert (s_con); - - uuid = nm_utils_uuid_generate (); - g_object_set (s_con, - NM_SETTING_CONNECTION_ID, "Test Wireless", - NM_SETTING_CONNECTION_UUID, uuid, - NM_SETTING_CONNECTION_AUTOCONNECT, FALSE, - NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRELESS_SETTING_NAME, - NULL); - g_free (uuid); - nm_connection_add_setting (connection, NM_SETTING (s_con)); - - /* Wireless setting */ - s_wifi = (NMSettingWireless *) nm_setting_wireless_new (); - g_assert (s_wifi); - - ssid = g_byte_array_sized_new (sizeof (tmpssid)); - g_byte_array_append (ssid, &tmpssid[0], sizeof (tmpssid)); - g_object_set (s_wifi, - NM_SETTING_WIRELESS_SSID, ssid, - NULL); - g_byte_array_free (ssid, TRUE); - nm_connection_add_setting (connection, NM_SETTING (s_wifi)); - - /* Wifi security */ - s_wsec = (NMSettingWirelessSecurity *) nm_setting_wireless_security_new (); - g_assert (s_wsec); - - g_object_set (G_OBJECT (s_wsec), - NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, "none", - NULL); - nm_connection_add_setting (connection, NM_SETTING (s_wsec)); - - return connection; -} - -static void -value_destroy (gpointer data) -{ - GValue *value = (GValue *) data; - - g_value_unset (value); - g_slice_free (GValue, value); -} - -static GValue * -string_to_gvalue (const char *str) -{ - GValue *val = g_slice_new0 (GValue); - - g_value_init (val, G_TYPE_STRING); - g_value_set_string (val, str); - return val; -} - -static GValue * -uint_to_gvalue (guint32 i) -{ - GValue *val; - - val = g_slice_new0 (GValue); - g_value_init (val, G_TYPE_UINT); - g_value_set_uint (val, i); - return val; -} - -static void -test_update_secrets_wifi_single_setting (void) -{ - NMConnection *connection; - NMSettingWirelessSecurity *s_wsec; - GHashTable *secrets; - GError *error = NULL; - gboolean success; - const char *wepkey = "11111111111111111111111111"; - const char *tmp; - - /* Test update with a hashed setting of 802-11-wireless secrets */ - - connection = wifi_connection_new (); - - /* Build up the secrets hash */ - secrets = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, value_destroy); - g_hash_table_insert (secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY0, string_to_gvalue (wepkey)); - g_hash_table_insert (secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE, uint_to_gvalue (NM_WEP_KEY_TYPE_KEY)); - - success = nm_connection_update_secrets (connection, - NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, - secrets, - &error); - g_assert_no_error (error); - g_assert (success); - - /* Make sure the secret is now in the connection */ - s_wsec = nm_connection_get_setting_wireless_security (connection); - g_assert (s_wsec); - tmp = nm_setting_wireless_security_get_wep_key (s_wsec, 0); - g_assert_cmpstr (tmp, ==, wepkey); - - g_hash_table_unref (secrets); - g_object_unref (connection); -} - -static void -test_update_secrets_wifi_full_hash (void) -{ - NMConnection *connection; - NMSettingWirelessSecurity *s_wsec; - GHashTable *secrets, *all; - GError *error = NULL; - gboolean success; - const char *wepkey = "11111111111111111111111111"; - const char *tmp; - - /* Test update with a hashed connection containing only 802-11-wireless - * setting and secrets. - */ - - connection = wifi_connection_new (); - - /* Build up the secrets hash */ - all = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify) g_hash_table_destroy); - secrets = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, value_destroy); - g_hash_table_insert (secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY0, string_to_gvalue (wepkey)); - g_hash_table_insert (secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE, uint_to_gvalue (NM_WEP_KEY_TYPE_KEY)); - g_hash_table_insert (all, NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, secrets); - - success = nm_connection_update_secrets (connection, - NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, - all, - &error); - g_assert_no_error (error); - g_assert (success); - - /* Make sure the secret is now in the connection */ - s_wsec = nm_connection_get_setting_wireless_security (connection); - g_assert (s_wsec); - tmp = nm_setting_wireless_security_get_wep_key (s_wsec, 0); - g_assert_cmpstr (tmp, ==, wepkey); - - g_hash_table_unref (all); - g_object_unref (connection); -} - -static void -test_update_secrets_wifi_bad_setting_name (void) -{ - NMConnection *connection; - GHashTable *secrets; - GError *error = NULL; - gboolean success; - const char *wepkey = "11111111111111111111111111"; - - /* Test that passing an invalid setting name to - * nm_connection_update_secrets() fails with the correct error. - */ - - connection = wifi_connection_new (); - - /* Build up the secrets hash */ - secrets = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, value_destroy); - g_hash_table_insert (secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY0, string_to_gvalue (wepkey)); - g_hash_table_insert (secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE, uint_to_gvalue (NM_WEP_KEY_TYPE_KEY)); - - success = nm_connection_update_secrets (connection, - "asdfasdfasdfasf", - secrets, - &error); - g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_SETTING_NOT_FOUND); - g_assert (success == FALSE); - - g_clear_error (&error); - g_hash_table_unref (secrets); - g_object_unref (connection); -} - -static void -test_update_secrets_whole_connection (void) -{ - NMConnection *connection; - NMSettingWirelessSecurity *s_wsec; - GHashTable *secrets, *wsec_hash; - GError *error = NULL; - gboolean success; - const char *wepkey = "11111111111111111111111111"; - - /* Test calling nm_connection_update_secrets() with an entire hashed - * connection including non-secrets. - */ - - connection = wifi_connection_new (); - - /* Build up the secrets hash */ - secrets = nm_connection_to_hash (connection, NM_SETTING_HASH_FLAG_ALL); - wsec_hash = g_hash_table_lookup (secrets, NM_SETTING_WIRELESS_SECURITY_SETTING_NAME); - g_assert (wsec_hash); - g_hash_table_insert (wsec_hash, g_strdup (NM_SETTING_WIRELESS_SECURITY_WEP_KEY0), string_to_gvalue (wepkey)); - - success = nm_connection_update_secrets (connection, NULL, secrets, &error); - g_assert_no_error (error); - g_assert (success == TRUE); - - s_wsec = nm_connection_get_setting_wireless_security (connection); - g_assert (s_wsec); - g_assert_cmpstr (nm_setting_wireless_security_get_wep_key (s_wsec, 0), ==, wepkey); - - g_hash_table_unref (secrets); - g_object_unref (connection); -} - -static void -test_update_secrets_whole_connection_empty_hash (void) -{ - NMConnection *connection; - GHashTable *secrets; - GError *error = NULL; - gboolean success; - - /* Test that updating secrets with an empty hash returns success */ - - connection = wifi_connection_new (); - secrets = g_hash_table_new (g_str_hash, g_str_equal); - success = nm_connection_update_secrets (connection, NULL, secrets, &error); - g_assert_no_error (error); - g_assert (success == TRUE); - g_object_unref (connection); - g_hash_table_unref (secrets); -} - -static void -test_update_secrets_whole_connection_bad_setting (void) -{ - NMConnection *connection; - GHashTable *secrets, *wsec_hash; - GError *error = NULL; - gboolean success; - const char *wepkey = "11111111111111111111111111"; - - /* Test that sending a hashed connection containing an invalid setting - * name fails with the right error. - */ - - connection = wifi_connection_new (); - - /* Build up the secrets hash */ - secrets = nm_connection_to_hash (connection, NM_SETTING_HASH_FLAG_ALL); - wsec_hash = g_hash_table_lookup (secrets, NM_SETTING_WIRELESS_SECURITY_SETTING_NAME); - g_assert (wsec_hash); - g_hash_table_insert (wsec_hash, g_strdup (NM_SETTING_WIRELESS_SECURITY_WEP_KEY0), string_to_gvalue (wepkey)); - - /* Steal the wsec setting hash so it's not deallocated, and stuff it back - * in with a different name so we ensure libnm-util is returning the right - * error when it finds an entry in the connection hash that doesn't match - * any setting in the connection. - */ - g_hash_table_ref (wsec_hash); - g_hash_table_remove (secrets, NM_SETTING_WIRELESS_SECURITY_SETTING_NAME); - g_hash_table_insert (secrets, g_strdup ("asdfasdfasdfasdf"), wsec_hash); - - success = nm_connection_update_secrets (connection, NULL, secrets, &error); - g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_SETTING_NOT_FOUND); - g_assert (success == FALSE); - - g_clear_error (&error); - g_hash_table_destroy (secrets); - g_object_unref (connection); -} - -static void -test_update_secrets_whole_connection_empty_base_setting (void) -{ - NMConnection *connection; - GHashTable *secrets; - GError *error = NULL; - gboolean success; - - /* Test that a hashed connection which does not have any hashed secrets - * for the requested setting returns success. - */ - - connection = wifi_connection_new (); - secrets = nm_connection_to_hash (connection, NM_SETTING_HASH_FLAG_ONLY_SECRETS); - g_assert_cmpint (g_hash_table_size (secrets), ==, 3); - g_assert (g_hash_table_lookup (secrets, NM_SETTING_WIRELESS_SETTING_NAME)); - - success = nm_connection_update_secrets (connection, - NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, - secrets, - &error); - g_assert_no_error (error); - g_assert (success); - - g_hash_table_destroy (secrets); - g_object_unref (connection); -} - -static void -test_update_secrets_null_setting_name_with_setting_hash (void) -{ - NMConnection *connection; - GHashTable *secrets; - GError *error = NULL; - gboolean success; - const char *wepkey = "11111111111111111111111111"; - - /* Ensure that a NULL setting name and only a hashed setting fails */ - - connection = wifi_connection_new (); - - secrets = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, value_destroy); - g_hash_table_insert (secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY0, string_to_gvalue (wepkey)); - g_hash_table_insert (secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE, uint_to_gvalue (NM_WEP_KEY_TYPE_KEY)); - - success = nm_connection_update_secrets (connection, NULL, secrets, &error); - g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_SETTING_NOT_FOUND); - g_assert (!success); - - g_clear_error (&error); - g_hash_table_destroy (secrets); - g_object_unref (connection); -} - -NMTST_DEFINE (); - -int main (int argc, char **argv) -{ - GError *error = NULL; - gboolean success; - - nmtst_init (&argc, &argv, TRUE); - - success = nm_utils_init (&error); - g_assert_no_error (error); - g_assert (success); - - /* The tests */ - g_test_add_func ("/libnm/need_tls_secrets_path", test_need_tls_secrets_path); - g_test_add_func ("/libnm/need_tls_secrets_blob", test_need_tls_secrets_blob); - g_test_add_func ("/libnm/need_tls_phase2_secrets_path", test_need_tls_phase2_secrets_path); - g_test_add_func ("/libnm/need_tls_phase2_secrets_blob", test_need_tls_phase2_secrets_blob); - - g_test_add_func ("/libnm/update_secrets_wifi_single_setting", test_update_secrets_wifi_single_setting); - g_test_add_func ("/libnm/update_secrets_wifi_full_hash", test_update_secrets_wifi_full_hash); - g_test_add_func ("/libnm/update_secrets_wifi_bad_setting_name", test_update_secrets_wifi_bad_setting_name); - - g_test_add_func ("/libnm/update_secrets_whole_connection", test_update_secrets_whole_connection); - g_test_add_func ("/libnm/update_secrets_whole_connection_empty_hash", test_update_secrets_whole_connection_empty_hash); - g_test_add_func ("/libnm/update_secrets_whole_connection_bad_setting", test_update_secrets_whole_connection_bad_setting); - g_test_add_func ("/libnm/update_secrets_whole_connection_empty_base_setting", test_update_secrets_whole_connection_empty_base_setting); - g_test_add_func ("/libnm/update_secrets_null_setting_name_with_setting_hash", test_update_secrets_null_setting_name_with_setting_hash); - - return g_test_run (); -} - diff --git a/libnm-util/tests/test-setting-8021x.c b/libnm-util/tests/test-setting-8021x.c deleted file mode 100644 index 373b2a757d..0000000000 --- a/libnm-util/tests/test-setting-8021x.c +++ /dev/null @@ -1,407 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Copyright 2008 - 2011 Red Hat, Inc. - * - */ - -#include "nm-default.h" - -#include <string.h> - -#include "nm-utils.h" -#include "nm-setting-connection.h" -#include "nm-setting-8021x.h" - -#include "nm-utils/nm-test-utils.h" - -#define TEST_CERT_DIR NM_BUILD_SRCDIR"/libnm-core/tests/certs" - -static void -compare_blob_data (const char *test, - const char *key_path, - const GByteArray *key) -{ - char *contents = NULL; - gsize len = 0; - GError *error = NULL; - gboolean success; - - g_assert (key && key->len > 0); - - success = g_file_get_contents (key_path, &contents, &len, &error); - nmtst_assert_success (success, error); - - g_assert_cmpmem (contents, len, key->data, key->len); - g_free (contents); -} - -#define SCHEME_PATH "file://" - -static void -check_scheme_path (GByteArray *value, const char *path) -{ - guint8 *p; - - g_assert (value); - - p = value->data; - g_assert (memcmp (p, SCHEME_PATH, strlen (SCHEME_PATH)) == 0); - p += strlen (SCHEME_PATH); - g_assert (memcmp (p, path, strlen (path)) == 0); - p += strlen (path); - g_assert (*p == '\0'); -} - -static void -test_private_key_import (const char *path, - const char *password, - NMSetting8021xCKScheme scheme) -{ - NMSetting8021x *s_8021x; - gboolean success; - NMSetting8021xCKFormat format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN; - NMSetting8021xCKFormat tmp_fmt; - GError *error = NULL; - GByteArray *tmp_key = NULL, *client_cert = NULL; - const char *pw; - - s_8021x = (NMSetting8021x *) nm_setting_802_1x_new (); - g_assert (s_8021x); - - success = nm_setting_802_1x_set_private_key (s_8021x, - path, - password, - scheme, - &format, - &error); - nmtst_assert_success (success, error); - g_assert (format != NM_SETTING_802_1X_CK_FORMAT_UNKNOWN); - tmp_fmt = nm_setting_802_1x_get_private_key_format (s_8021x); - g_assert (tmp_fmt == format); - - /* Make sure the password is what we expect */ - pw = nm_setting_802_1x_get_private_key_password (s_8021x); - g_assert (pw); - g_assert_cmpstr (pw, ==, password); - - if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) { - tmp_key = (GByteArray *) nm_setting_802_1x_get_private_key_blob (s_8021x); - compare_blob_data ("private-key-import", path, tmp_key); - } else if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH) { - g_object_get (s_8021x, NM_SETTING_802_1X_PRIVATE_KEY, &tmp_key, NULL); - check_scheme_path (tmp_key, path); - g_byte_array_free (tmp_key, TRUE); - } else - g_assert_not_reached (); - - /* If it's PKCS#12 ensure the client cert is the same value */ - if (format == NM_SETTING_802_1X_CK_FORMAT_PKCS12) { - g_object_get (s_8021x, NM_SETTING_802_1X_PRIVATE_KEY, &tmp_key, NULL); - g_assert (tmp_key); - - g_object_get (s_8021x, NM_SETTING_802_1X_CLIENT_CERT, &client_cert, NULL); - g_assert (client_cert); - - /* make sure they are the same */ - g_assert_cmpmem (tmp_key->data, tmp_key->len, client_cert->data, client_cert->len); - - g_byte_array_free (tmp_key, TRUE); - g_byte_array_free (client_cert, TRUE); - } - - g_object_unref (s_8021x); -} - -static void -test_phase2_private_key_import (const char *path, - const char *password, - NMSetting8021xCKScheme scheme) -{ - NMSetting8021x *s_8021x; - gboolean success; - NMSetting8021xCKFormat format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN; - NMSetting8021xCKFormat tmp_fmt; - GError *error = NULL; - GByteArray *tmp_key = NULL, *client_cert = NULL; - const char *pw; - - s_8021x = (NMSetting8021x *) nm_setting_802_1x_new (); - g_assert (s_8021x); - - success = nm_setting_802_1x_set_phase2_private_key (s_8021x, - path, - password, - scheme, - &format, - &error); - nmtst_assert_success (success, error); - g_assert (format != NM_SETTING_802_1X_CK_FORMAT_UNKNOWN); - tmp_fmt = nm_setting_802_1x_get_phase2_private_key_format (s_8021x); - g_assert (tmp_fmt == format); - - /* Make sure the password is what we expect */ - pw = nm_setting_802_1x_get_phase2_private_key_password (s_8021x); - g_assert (pw); - g_assert_cmpstr (pw, ==, password); - - if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) { - tmp_key = (GByteArray *) nm_setting_802_1x_get_phase2_private_key_blob (s_8021x); - compare_blob_data ("phase2-private-key-import", path, tmp_key); - } else if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH) { - g_object_get (s_8021x, NM_SETTING_802_1X_PHASE2_PRIVATE_KEY, &tmp_key, NULL); - check_scheme_path (tmp_key, path); - g_byte_array_free (tmp_key, TRUE); - } else - g_assert_not_reached (); - - /* If it's PKCS#12 ensure the client cert is the same value */ - if (format == NM_SETTING_802_1X_CK_FORMAT_PKCS12) { - g_object_get (s_8021x, NM_SETTING_802_1X_PHASE2_PRIVATE_KEY, &tmp_key, NULL); - g_assert (tmp_key); - - g_object_get (s_8021x, NM_SETTING_802_1X_PHASE2_CLIENT_CERT, &client_cert, NULL); - g_assert (client_cert); - - /* make sure they are the same */ - g_assert_cmpmem (tmp_key->data, tmp_key->len, client_cert->data, client_cert->len); - - g_byte_array_free (tmp_key, TRUE); - g_byte_array_free (client_cert, TRUE); - } - - g_object_unref (s_8021x); -} - -static void -test_wrong_password_keeps_data (const char *path, const char *password) -{ - NMSetting8021x *s_8021x; - gboolean success; - NMSetting8021xCKFormat format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN; - GError *error = NULL; - const char *pw; - - s_8021x = (NMSetting8021x *) nm_setting_802_1x_new (); - g_assert (s_8021x); - - success = nm_setting_802_1x_set_private_key (s_8021x, - path, - password, - NM_SETTING_802_1X_CK_SCHEME_BLOB, - &format, - &error); - nmtst_assert_success (success, error); - g_assert (format != NM_SETTING_802_1X_CK_FORMAT_UNKNOWN); - - /* Now try to set it to something that's not a certificate */ - format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN; - success = nm_setting_802_1x_set_private_key (s_8021x, - "Makefile.am", - password, - NM_SETTING_802_1X_CK_SCHEME_BLOB, - &format, - &error); - nmtst_assert_no_success (success, error); - g_assert (format == NM_SETTING_802_1X_CK_FORMAT_UNKNOWN); - g_clear_error (&error); - - /* Make sure the password hasn't changed */ - pw = nm_setting_802_1x_get_private_key_password (s_8021x); - g_assert (pw); - g_assert_cmpstr (pw, ==, password); - - g_object_unref (s_8021x); -} - -static void -test_clear_private_key (const char *path, const char *password) -{ - NMSetting8021x *s_8021x; - gboolean success; - NMSetting8021xCKFormat format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN; - GError *error = NULL; - const char *pw; - - s_8021x = (NMSetting8021x *) nm_setting_802_1x_new (); - g_assert (s_8021x); - - success = nm_setting_802_1x_set_private_key (s_8021x, - path, - password, - NM_SETTING_802_1X_CK_SCHEME_BLOB, - &format, - &error); - nmtst_assert_success (success, error); - g_assert (format != NM_SETTING_802_1X_CK_FORMAT_UNKNOWN); - - /* Make sure the password is what we expect */ - pw = nm_setting_802_1x_get_private_key_password (s_8021x); - g_assert (pw); - g_assert_cmpstr (pw, ==, password); - - /* Now clear it */ - success = nm_setting_802_1x_set_private_key (s_8021x, - NULL, - NULL, - NM_SETTING_802_1X_CK_SCHEME_BLOB, - NULL, - &error); - nmtst_assert_success (success, error); - - /* Ensure the password is also now clear */ - g_assert (!nm_setting_802_1x_get_private_key_password (s_8021x)); - - g_object_unref (s_8021x); -} - -static void -test_wrong_phase2_password_keeps_data (const char *path, const char *password) -{ - NMSetting8021x *s_8021x; - gboolean success; - NMSetting8021xCKFormat format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN; - GError *error = NULL; - const char *pw; - - s_8021x = (NMSetting8021x *) nm_setting_802_1x_new (); - g_assert (s_8021x); - - success = nm_setting_802_1x_set_phase2_private_key (s_8021x, - path, - password, - NM_SETTING_802_1X_CK_SCHEME_BLOB, - &format, - &error); - nmtst_assert_success (success, error); - g_assert (format != NM_SETTING_802_1X_CK_FORMAT_UNKNOWN); - - /* Now try to set it to something that's not a certificate */ - format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN; - success = nm_setting_802_1x_set_phase2_private_key (s_8021x, - "Makefile.am", - password, - NM_SETTING_802_1X_CK_SCHEME_BLOB, - &format, - &error); - nmtst_assert_no_success (success, error); - g_assert (format == NM_SETTING_802_1X_CK_FORMAT_UNKNOWN); - g_clear_error (&error); - - /* Make sure the password hasn't changed */ - pw = nm_setting_802_1x_get_phase2_private_key_password (s_8021x); - g_assert (pw); - g_assert_cmpstr (pw, ==, password); - - g_object_unref (s_8021x); -} - -static void -test_clear_phase2_private_key (const char *path, const char *password) -{ - NMSetting8021x *s_8021x; - gboolean success; - NMSetting8021xCKFormat format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN; - GError *error = NULL; - const char *pw; - - s_8021x = (NMSetting8021x *) nm_setting_802_1x_new (); - g_assert (s_8021x); - - success = nm_setting_802_1x_set_phase2_private_key (s_8021x, - path, - password, - NM_SETTING_802_1X_CK_SCHEME_BLOB, - &format, - &error); - nmtst_assert_success (success, error); - g_assert (format != NM_SETTING_802_1X_CK_FORMAT_UNKNOWN); - - /* Make sure the password is what we expect */ - pw = nm_setting_802_1x_get_phase2_private_key_password (s_8021x); - g_assert (pw); - g_assert_cmpstr (pw, ==, password); - - /* Now clear it */ - success = nm_setting_802_1x_set_phase2_private_key (s_8021x, - NULL, - NULL, - NM_SETTING_802_1X_CK_SCHEME_BLOB, - NULL, - &error); - nmtst_assert_success (success, error); - - /* Ensure the password is also now clear */ - g_assert (!nm_setting_802_1x_get_phase2_private_key_password (s_8021x)); - - g_object_unref (s_8021x); -} - -static void -do_8021x_test (gconstpointer test_data) -{ - char **parts, *path, *password; - - parts = g_strsplit ((const char *) test_data, ", ", -1); - g_assert_cmpint (g_strv_length (parts), ==, 2); - - path = g_build_filename (TEST_CERT_DIR, parts[0], NULL); - password = parts[1]; - - /* Test phase1 and phase2 path scheme */ - test_private_key_import (path, password, NM_SETTING_802_1X_CK_SCHEME_PATH); - test_phase2_private_key_import (path, password, NM_SETTING_802_1X_CK_SCHEME_PATH); - - /* Test phase1 and phase2 blob scheme */ - test_private_key_import (path, password, NM_SETTING_802_1X_CK_SCHEME_BLOB); - test_phase2_private_key_import (path, password, NM_SETTING_802_1X_CK_SCHEME_BLOB); - - /* Test that using a wrong password does not change existing data */ - test_wrong_password_keeps_data (path, password); - test_wrong_phase2_password_keeps_data (path, password); - - /* Test clearing the private key */ - test_clear_private_key (path, password); - test_clear_phase2_private_key (path, password); - - g_free (path); - g_strfreev (parts); -} - -NMTST_DEFINE (); - -int -main (int argc, char **argv) -{ - nmtst_init (&argc, &argv, TRUE); - - g_test_add_data_func ("/libnm-utils/setting-8021x/key-and-cert", - "test_key_and_cert.pem, test", - do_8021x_test); - g_test_add_data_func ("/libnm-utils/setting-8021x/key-only", - "test-key-only.pem, test", - do_8021x_test); - g_test_add_data_func ("/libnm-utils/setting-8021x/pkcs8-enc-key", - "pkcs8-enc-key.pem, 1234567890", - do_8021x_test); - g_test_add_data_func ("/libnm-utils/setting-8021x/pkcs12", - "test-cert.p12, test", - do_8021x_test); - - return g_test_run (); -} - diff --git a/libnm-util/tests/test-setting-dcb.c b/libnm-util/tests/test-setting-dcb.c deleted file mode 100644 index eb7113c32e..0000000000 --- a/libnm-util/tests/test-setting-dcb.c +++ /dev/null @@ -1,319 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Copyright 2013 Red Hat, Inc. - * - */ - -#include "nm-default.h" - -#include <string.h> - -#include "nm-utils.h" -#include "nm-default.h" -#include "nm-setting-dcb.h" - -#include "nm-utils/nm-test-utils.h" - -#define DCB_FLAGS_ALL (NM_SETTING_DCB_FLAG_ENABLE | \ - NM_SETTING_DCB_FLAG_ADVERTISE | \ - NM_SETTING_DCB_FLAG_WILLING) - -static void -test_dcb_flags_valid (void) -{ - gs_unref_object NMSettingDcb *s_dcb = NULL; - GError *error = NULL; - gboolean success; - guint i; - - s_dcb = (NMSettingDcb *) nm_setting_dcb_new (); - g_assert (s_dcb); - - g_assert_cmpint (nm_setting_dcb_get_app_fcoe_flags (s_dcb), ==, 0); - g_assert_cmpint (nm_setting_dcb_get_app_iscsi_flags (s_dcb), ==, 0); - g_assert_cmpint (nm_setting_dcb_get_app_fip_flags (s_dcb), ==, 0); - g_assert_cmpint (nm_setting_dcb_get_priority_flow_control_flags (s_dcb), ==, 0); - g_assert_cmpint (nm_setting_dcb_get_priority_group_flags (s_dcb), ==, 0); - - g_object_set (G_OBJECT (s_dcb), - NM_SETTING_DCB_APP_FCOE_FLAGS, DCB_FLAGS_ALL, - NM_SETTING_DCB_APP_ISCSI_FLAGS, DCB_FLAGS_ALL, - NM_SETTING_DCB_APP_FIP_FLAGS, DCB_FLAGS_ALL, - NM_SETTING_DCB_PRIORITY_FLOW_CONTROL_FLAGS, DCB_FLAGS_ALL, - NM_SETTING_DCB_PRIORITY_GROUP_FLAGS, DCB_FLAGS_ALL, - NULL); - /* Priority Group Bandwidth must total 100% */ - for (i = 0; i < 7; i++) - nm_setting_dcb_set_priority_group_bandwidth (s_dcb, i, 12); - nm_setting_dcb_set_priority_group_bandwidth (s_dcb, 7, 16); - - success = nm_setting_verify (NM_SETTING (s_dcb), NULL, &error); - g_assert_no_error (error); - g_assert (success); - - g_assert_cmpint (nm_setting_dcb_get_app_fcoe_flags (s_dcb), ==, DCB_FLAGS_ALL); - g_assert_cmpint (nm_setting_dcb_get_app_iscsi_flags (s_dcb), ==, DCB_FLAGS_ALL); - g_assert_cmpint (nm_setting_dcb_get_app_fip_flags (s_dcb), ==, DCB_FLAGS_ALL); - g_assert_cmpint (nm_setting_dcb_get_priority_flow_control_flags (s_dcb), ==, DCB_FLAGS_ALL); - g_assert_cmpint (nm_setting_dcb_get_priority_group_flags (s_dcb), ==, DCB_FLAGS_ALL); -} - -#define TEST_FLAG(p, f, v) \ -{ \ - /* GObject property min/max should ensure the property does not get set to \ - * the invalid value, so we ensure the value we just tried to set is 0 and \ - * that verify is successful since the property never got set. \ - */ \ - g_object_set (G_OBJECT (s_dcb), p, v, NULL); \ - g_assert_cmpint (f (s_dcb), ==, 0); \ - success = nm_setting_verify (NM_SETTING (s_dcb), NULL, &error); \ - g_assert_no_error (error); \ - g_assert (success); \ -} - -static void -test_dcb_flags_invalid (void) -{ - gs_unref_object NMSettingDcb *s_dcb = NULL; - GError *error = NULL; - gboolean success; - - s_dcb = (NMSettingDcb *) nm_setting_dcb_new (); - g_assert (s_dcb); - - NMTST_EXPECT ("GLib-GObject", G_LOG_LEVEL_WARNING, "*invalid or out of range*"); - TEST_FLAG (NM_SETTING_DCB_APP_FCOE_FLAGS, nm_setting_dcb_get_app_fcoe_flags, 0x332523); - g_test_assert_expected_messages (); - - NMTST_EXPECT ("GLib-GObject", G_LOG_LEVEL_WARNING, "*invalid or out of range*"); - TEST_FLAG (NM_SETTING_DCB_APP_ISCSI_FLAGS, nm_setting_dcb_get_app_iscsi_flags, 0xFF); - g_test_assert_expected_messages (); - - NMTST_EXPECT ("GLib-GObject", G_LOG_LEVEL_WARNING, "*invalid or out of range*"); - TEST_FLAG (NM_SETTING_DCB_APP_FIP_FLAGS, nm_setting_dcb_get_app_fip_flags, 0x1111); - g_test_assert_expected_messages (); - - NMTST_EXPECT ("GLib-GObject", G_LOG_LEVEL_WARNING, "*invalid or out of range*"); - TEST_FLAG (NM_SETTING_DCB_PRIORITY_FLOW_CONTROL_FLAGS, nm_setting_dcb_get_priority_flow_control_flags, G_MAXUINT32); - g_test_assert_expected_messages (); - - NMTST_EXPECT ("GLib-GObject", G_LOG_LEVEL_WARNING, "*invalid or out of range*"); - TEST_FLAG (NM_SETTING_DCB_PRIORITY_GROUP_FLAGS, nm_setting_dcb_get_priority_group_flags, - (NM_SETTING_DCB_FLAG_ENABLE | NM_SETTING_DCB_FLAG_ADVERTISE | NM_SETTING_DCB_FLAG_WILLING) + 1); - g_test_assert_expected_messages (); -} - -#define TEST_APP_PRIORITY(lcprop, ucprop, v) \ -{ \ - g_object_set (G_OBJECT (s_dcb), NM_SETTING_DCB_APP_##ucprop##_FLAGS, NM_SETTING_DCB_FLAG_NONE, NULL); \ - \ - g_object_set (G_OBJECT (s_dcb), NM_SETTING_DCB_APP_##ucprop##_PRIORITY, v, NULL); \ - g_assert_cmpint (nm_setting_dcb_get_app_##lcprop##_priority (s_dcb), ==, v); \ - \ - /* Assert that the setting is invalid while the app is disabled unless v is default */ \ - success = nm_setting_verify (NM_SETTING (s_dcb), NULL, &error); \ - if (v >= 0) { \ - g_assert_error (error, NM_SETTING_DCB_ERROR, NM_SETTING_DCB_ERROR_INVALID_PROPERTY); \ - g_assert (success == FALSE); \ - } else { \ - g_assert_no_error (error); \ - g_assert (success); \ - } \ - g_clear_error (&error); \ - \ - /* Set the enable flag and re-verify, this time it should be valid */ \ - g_object_set (G_OBJECT (s_dcb), NM_SETTING_DCB_APP_##ucprop##_FLAGS, NM_SETTING_DCB_FLAG_ENABLE, NULL); \ - success = nm_setting_verify (NM_SETTING (s_dcb), NULL, &error); \ - g_assert_no_error (error); \ - g_assert (success); \ - \ - g_object_set (G_OBJECT (s_dcb), NM_SETTING_DCB_APP_##ucprop##_PRIORITY, 0, NULL); \ -} - -static void -test_dcb_app_priorities (void) -{ - gs_unref_object NMSettingDcb *s_dcb = NULL; - GError *error = NULL; - gboolean success; - - s_dcb = (NMSettingDcb *) nm_setting_dcb_new (); - g_assert (s_dcb); - - /* Defaults */ - g_assert_cmpint (nm_setting_dcb_get_app_fcoe_priority (s_dcb), ==, -1); - g_assert_cmpint (nm_setting_dcb_get_app_iscsi_priority (s_dcb), ==, -1); - g_assert_cmpint (nm_setting_dcb_get_app_fip_priority (s_dcb), ==, -1); - - TEST_APP_PRIORITY (fcoe, FCOE, 6); - TEST_APP_PRIORITY (iscsi, ISCSI, 5); - TEST_APP_PRIORITY (fip, FIP, 4); - - TEST_APP_PRIORITY (fcoe, FCOE, -1); - TEST_APP_PRIORITY (iscsi, ISCSI, -1); - TEST_APP_PRIORITY (fip, FIP, -1); -} - -#define TEST_PRIORITY_VALID(fn, id, val, flagsprop, verify) \ -{ \ - /* Assert that setting the value gets the same value back out */ \ - nm_setting_dcb_set_priority_##fn (s_dcb, id, val); \ - g_assert_cmpint (nm_setting_dcb_get_priority_##fn (s_dcb, id), ==, val); \ - \ - if (verify) { \ - if (val != 0) { \ - /* Assert that verify fails because the flags do not include 'enabled' \ - * and a value has been set. \ - */ \ - success = nm_setting_verify (NM_SETTING (s_dcb), NULL, &error); \ - g_assert_error (error, NM_SETTING_DCB_ERROR, NM_SETTING_DCB_ERROR_INVALID_PROPERTY); \ - g_assert (success == FALSE); \ - g_clear_error (&error); \ - } \ - \ - /* Assert that adding the 'enabled' flag verifies the setting */ \ - g_object_set (G_OBJECT (s_dcb), NM_SETTING_DCB_PRIORITY_##flagsprop##_FLAGS, NM_SETTING_DCB_FLAG_ENABLE, NULL); \ - success = nm_setting_verify (NM_SETTING (s_dcb), NULL, &error); \ - g_assert_no_error (error); \ - g_assert (success); \ - } \ - \ - /* Reset everything */ \ - g_object_set (G_OBJECT (s_dcb), NM_SETTING_DCB_PRIORITY_##flagsprop##_FLAGS, NM_SETTING_DCB_FLAG_NONE, NULL); \ - nm_setting_dcb_set_priority_##fn (s_dcb, id, 0); \ -} - -/* If Priority Groups are enabled, PG bandwidth must equal 100% */ -#define SET_VALID_PRIORITY_GROUP_BANDWIDTH \ -{ \ - guint x; \ - for (x = 0; x < 7; x++) \ - nm_setting_dcb_set_priority_group_bandwidth (s_dcb, x, 12); \ - nm_setting_dcb_set_priority_group_bandwidth (s_dcb, 7, 16); \ -} - -static void -test_dcb_priorities_valid (void) -{ - gs_unref_object NMSettingDcb *s_dcb = NULL; - GError *error = NULL; - gboolean success; - guint i; - - s_dcb = (NMSettingDcb *) nm_setting_dcb_new (); - g_assert (s_dcb); - - for (i = 0; i < 8; i++) - TEST_PRIORITY_VALID (flow_control, i, TRUE, FLOW_CONTROL, TRUE); - - SET_VALID_PRIORITY_GROUP_BANDWIDTH - for (i = 0; i < 8; i++) { - TEST_PRIORITY_VALID (group_id, i, i, GROUP, TRUE); - TEST_PRIORITY_VALID (group_id, i, 7 - i, GROUP, TRUE); - } - - /* Clear PG bandwidth from earlier tests */ - for (i = 0; i < 8; i++) - nm_setting_dcb_set_priority_group_bandwidth (s_dcb, i, 0); - - /* Priority Group Bandwidth must add up to 100% if enabled, which requires - * some dancing for verifying individual values here. - */ - for (i = 0; i < 8; i++) { - guint other = 7 - (i % 8); - - /* Set another priority group to the remaining bandwidth */ - nm_setting_dcb_set_priority_group_bandwidth (s_dcb, other, 100 - i); - TEST_PRIORITY_VALID (group_bandwidth, i, i, GROUP, TRUE); - - /* Set another priority group to the remaining bandwidth */ - nm_setting_dcb_set_priority_group_bandwidth (s_dcb, other, 100 - (7 - i)); - TEST_PRIORITY_VALID (group_bandwidth, i, 7 - i, GROUP, TRUE); - - /* Clear remaining bandwidth */ - nm_setting_dcb_set_priority_group_bandwidth (s_dcb, other, 0); - } - - SET_VALID_PRIORITY_GROUP_BANDWIDTH - for (i = 0; i < 8; i++) { - TEST_PRIORITY_VALID (bandwidth, i, i, GROUP, TRUE); - TEST_PRIORITY_VALID (bandwidth, i, 7 - i, GROUP, TRUE); - } - - SET_VALID_PRIORITY_GROUP_BANDWIDTH - for (i = 0; i < 8; i++) - TEST_PRIORITY_VALID (strict_bandwidth, i, TRUE, GROUP, TRUE); - - SET_VALID_PRIORITY_GROUP_BANDWIDTH - for (i = 0; i < 8; i++) { - TEST_PRIORITY_VALID (traffic_class, i, i, GROUP, TRUE); - TEST_PRIORITY_VALID (traffic_class, i, 7 - i, GROUP, TRUE); - } -} - -static void -test_dcb_bandwidth_sums (void) -{ - gs_unref_object NMSettingDcb *s_dcb = NULL; - GError *error = NULL; - gboolean success; - - s_dcb = (NMSettingDcb *) nm_setting_dcb_new (); - g_assert (s_dcb); - - /* Assert that setting the value gets the same value back out */ - nm_setting_dcb_set_priority_group_bandwidth (s_dcb, 0, 9); - nm_setting_dcb_set_priority_group_bandwidth (s_dcb, 1, 10); - nm_setting_dcb_set_priority_group_bandwidth (s_dcb, 2, 11); - nm_setting_dcb_set_priority_group_bandwidth (s_dcb, 3, 12); - nm_setting_dcb_set_priority_group_bandwidth (s_dcb, 4, 13); - nm_setting_dcb_set_priority_group_bandwidth (s_dcb, 5, 14); - nm_setting_dcb_set_priority_group_bandwidth (s_dcb, 6, 15); - nm_setting_dcb_set_priority_group_bandwidth (s_dcb, 7, 16); - - /* Assert verify success when sums total 100% */ - g_object_set (G_OBJECT (s_dcb), NM_SETTING_DCB_PRIORITY_GROUP_FLAGS, NM_SETTING_DCB_FLAG_ENABLE, NULL); - success = nm_setting_verify (NM_SETTING (s_dcb), NULL, &error); - g_assert_no_error (error); - g_assert (success); - - /* Assert verify fails when sums do not total 100% */ - nm_setting_dcb_set_priority_group_bandwidth (s_dcb, 4, 20); - success = nm_setting_verify (NM_SETTING (s_dcb), NULL, &error); - g_assert_error (error, NM_SETTING_DCB_ERROR, NM_SETTING_DCB_ERROR_INVALID_PROPERTY); - g_assert (success == FALSE); - g_clear_error (&error); -} - -#define TPATH "/libnm-util/settings/dcb/" - -NMTST_DEFINE (); - -int main (int argc, char **argv) -{ - nmtst_init (&argc, &argv, TRUE); - - g_test_add_func (TPATH "flags-valid", test_dcb_flags_valid); - g_test_add_func (TPATH "flags-invalid", test_dcb_flags_invalid); - g_test_add_func (TPATH "app-priorities", test_dcb_app_priorities); - g_test_add_func (TPATH "priorities", test_dcb_priorities_valid); - g_test_add_func (TPATH "bandwidth-sums", test_dcb_bandwidth_sums); - - return g_test_run (); -} - diff --git a/libnm-util/tests/test-settings-defaults.c b/libnm-util/tests/test-settings-defaults.c deleted file mode 100644 index 0bd4feee58..0000000000 --- a/libnm-util/tests/test-settings-defaults.c +++ /dev/null @@ -1,127 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Copyright 2008 - 2011 Red Hat, Inc. - * - */ - -#include "nm-default.h" - -#include <string.h> - -#include "nm-utils.h" -#include "nm-setting-8021x.h" -#include "nm-setting-cdma.h" -#include "nm-setting-connection.h" -#include "nm-setting-gsm.h" -#include "nm-setting-ip4-config.h" -#include "nm-setting-ip6-config.h" -#include "nm-setting-ppp.h" -#include "nm-setting-pppoe.h" -#include "nm-setting-serial.h" -#include "nm-setting-vpn.h" -#include "nm-setting-wired.h" -#include "nm-setting-wireless.h" -#include "nm-setting-wireless-security.h" - -#include "nm-utils/nm-test-utils.h" - -static void -test_defaults (GType type, const char *name) -{ - GParamSpec **property_specs; - guint n_property_specs; - GObject *setting; - int i; - - setting = g_object_new (type, NULL); - - property_specs = g_object_class_list_properties (G_OBJECT_GET_CLASS (setting), &n_property_specs); - g_assert (property_specs); - - for (i = 0; i < n_property_specs; i++) { - GParamSpec *prop_spec = property_specs[i]; - GValue value = G_VALUE_INIT; - GValue defvalue = G_VALUE_INIT; - char *actual, *expected; - gboolean ok = FALSE; - - /* Ignore non-fundamental types since they won't really have - * defaults. - */ - if (!G_TYPE_IS_FUNDAMENTAL (prop_spec->value_type)) - continue; - - g_value_init (&value, prop_spec->value_type); - g_object_get_property (G_OBJECT (setting), prop_spec->name, &value); - - g_value_init (&defvalue, prop_spec->value_type); - g_param_value_set_default (prop_spec, &defvalue); - - actual = g_strdup_value_contents (&value); - expected = g_strdup_value_contents (&defvalue); - - if (!strcmp (prop_spec->name, NM_SETTING_NAME)) { - /* 'name' is always the setting name, not the default value */ - ok = !strcmp (nm_setting_get_name (NM_SETTING (setting)), name); - g_free (expected); - expected = g_strdup (name); - } else - ok = g_param_value_defaults (prop_spec, &value); - - g_assert (ok); - - g_free (actual); - g_free (expected); - g_value_unset (&value); - g_value_unset (&defvalue); - } - - g_free (property_specs); - g_object_unref (setting); -} - -static void -defaults (void) -{ - /* The tests */ - test_defaults (NM_TYPE_SETTING_CONNECTION, NM_SETTING_CONNECTION_SETTING_NAME); - test_defaults (NM_TYPE_SETTING_802_1X, NM_SETTING_802_1X_SETTING_NAME); - test_defaults (NM_TYPE_SETTING_CDMA, NM_SETTING_CDMA_SETTING_NAME); - test_defaults (NM_TYPE_SETTING_GSM, NM_SETTING_GSM_SETTING_NAME); - test_defaults (NM_TYPE_SETTING_IP4_CONFIG, NM_SETTING_IP4_CONFIG_SETTING_NAME); - test_defaults (NM_TYPE_SETTING_IP6_CONFIG, NM_SETTING_IP6_CONFIG_SETTING_NAME); - test_defaults (NM_TYPE_SETTING_PPP, NM_SETTING_PPP_SETTING_NAME); - test_defaults (NM_TYPE_SETTING_PPPOE, NM_SETTING_PPPOE_SETTING_NAME); - test_defaults (NM_TYPE_SETTING_SERIAL, NM_SETTING_SERIAL_SETTING_NAME); - test_defaults (NM_TYPE_SETTING_VPN, NM_SETTING_VPN_SETTING_NAME); - test_defaults (NM_TYPE_SETTING_WIRED, NM_SETTING_WIRED_SETTING_NAME); - test_defaults (NM_TYPE_SETTING_WIRELESS, NM_SETTING_WIRELESS_SETTING_NAME); - test_defaults (NM_TYPE_SETTING_WIRELESS_SECURITY, NM_SETTING_WIRELESS_SECURITY_SETTING_NAME); -} - -NMTST_DEFINE (); - -int -main (int argc, char **argv) -{ - nmtst_init (&argc, &argv, TRUE); - - g_test_add_func ("/libnm/defaults", defaults); - - return g_test_run (); -} |