[X2Go-Commits] [remote-login-service-x2go] 01/01: Code project moved permanently into Arctica Project's realm.
git-admin at x2go.org
git-admin at x2go.org
Wed Nov 11 16:23:43 CET 2015
This is an automated email from the git hooks/post-receive script.
x2go pushed a commit to branch master
in repository remote-login-service-x2go.
commit 2b9dfd6071e9c9ce69f91cae7e5bcff8d0936839
Author: Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
Date: Wed Nov 11 16:23:13 2015 +0100
Code project moved permanently into Arctica Project's realm.
---
AUTHORS | 7 -
AUTHORS.Canonical | 5 -
COPYING | 674 --------------
ChangeLog.until-1.0.0 | 1122 ------------------------
Makefile.am | 36 -
Makefile.am.coverage | 48 -
NEWS | 1 -
README | 7 -
README.discontinued | 5 +
configure.ac | 105 ---
data/Makefile.am | 21 -
data/org.ArcticaProject.RemoteLogon.service.in | 3 -
data/remote-logon-service.conf.in | 6 -
debian/changelog | 152 ----
debian/compat | 1 -
debian/control | 35 -
debian/copyright | 31 -
debian/rules | 12 -
debian/source/format | 1 -
m4/gcov.m4 | 86 --
po/Makefile.in.in | 222 -----
po/POTFILES.in | 8 -
src/Makefile.am | 69 --
src/citrix-server.c | 227 -----
src/citrix-server.h | 59 --
src/crypt.c | 154 ----
src/crypt.h | 25 -
src/defines.h | 52 --
src/main.c | 458 ----------
src/org.ArcticaProject.RemoteLogon.xml | 83 --
src/rdp-server.c | 227 -----
src/rdp-server.h | 59 --
src/server.c | 300 -------
src/server.h | 79 --
src/uccs-server.c | 958 --------------------
src/uccs-server.h | 82 --
src/x2go-server.c | 228 -----
src/x2go-server.h | 60 --
tests/Makefile.am | 73 --
tests/dbus-interface.c | 583 ------------
tests/null-config.conf | 2 -
tests/server-test.c | 282 ------
tests/slmock | 252 ------
tests/slmock-config.conf.in | 9 -
tests/uccs-config.conf | 9 -
45 files changed, 5 insertions(+), 6913 deletions(-)
diff --git a/AUTHORS b/AUTHORS
deleted file mode 100644
index 0eda140..0000000
--- a/AUTHORS
+++ /dev/null
@@ -1,7 +0,0 @@
-# Generated by Makefile. Do not edit.
-
- Albert Astals
- Albert Astals Cid
- Michael Terry
- Tarmac
- Ted Gould
diff --git a/AUTHORS.Canonical b/AUTHORS.Canonical
deleted file mode 100644
index 6163413..0000000
--- a/AUTHORS.Canonical
+++ /dev/null
@@ -1,5 +0,0 @@
- Albert Astals
- Albert Astals Cid
- Michael Terry
- Tarmac
- Ted Gould
diff --git a/COPYING b/COPYING
deleted file mode 100644
index 94a9ed0..0000000
--- a/COPYING
+++ /dev/null
@@ -1,674 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users. We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors. You can apply it to
-your programs, 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
-them 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 prevent others from denying you
-these rights or asking you to surrender the rights. Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received. You must make sure that they, too, receive
-or can get the source code. And you must show them these terms so they
-know their rights.
-
- Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
- For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software. For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
- Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so. This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software. The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable. Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products. If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
- Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary. To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS
-
- 0. Definitions.
-
- "This License" refers to version 3 of the GNU General Public License.
-
- "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
-"recipients" may be individuals or organizations.
-
- To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
- A "covered work" means either the unmodified Program or a work based
-on the Program.
-
- To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
- An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
- 1. Source Code.
-
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
-form of a work.
-
- A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
- The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
- The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
- The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
- The Corresponding Source for a work in source code form is that
-same work.
-
- 2. Basic Permissions.
-
- All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
- You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
-makes it unnecessary.
-
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
- No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
- When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
- 4. Conveying Verbatim Copies.
-
- You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
- You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
- 5. Conveying Modified Source Versions.
-
- You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified
- it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is
- released under this License and any conditions added under section
- 7. This requirement modifies the requirement in section 4 to
- "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this
- License to anyone who comes into possession of a copy. This
- License will therefore apply, along with any applicable section 7
- additional terms, to the whole of the work, and all its parts,
- regardless of how they are packaged. This License gives no
- permission to license the work in any other way, but it does not
- invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display
- Appropriate Legal Notices; however, if the Program has interactive
- interfaces that do not display Appropriate Legal Notices, your
- work need not make them do so.
-
- A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
- 6. Conveying Non-Source Forms.
-
- You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by the
- Corresponding Source fixed on a durable physical medium
- customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by a
- written offer, valid for at least three years and valid for as
- long as you offer spare parts or customer support for that product
- model, to give anyone who possesses the object code either (1) a
- copy of the Corresponding Source for all the software in the
- product that is covered by this License, on a durable physical
- medium customarily used for software interchange, for a price no
- more than your reasonable cost of physically performing this
- conveying of source, or (2) access to copy the
- Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the
- written offer to provide the Corresponding Source. This
- alternative is allowed only occasionally and noncommercially, and
- only if you received the object code with such an offer, in accord
- with subsection 6b.
-
- d) Convey the object code by offering access from a designated
- place (gratis or for a charge), and offer equivalent access to the
- Corresponding Source in the same way through the same place at no
- further charge. You need not require recipients to copy the
- Corresponding Source along with the object code. If the place to
- copy the object code is a network server, the Corresponding Source
- may be on a different server (operated by you or a third party)
- that supports equivalent copying facilities, provided you maintain
- clear directions next to the object code saying where to find the
- Corresponding Source. Regardless of what server hosts the
- Corresponding Source, you remain obligated to ensure that it is
- available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided
- you inform other peers where the object code and Corresponding
- Source of the work are being offered to the general public at no
- charge under subsection 6d.
-
- A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
- A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
- "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
- If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
- The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
- Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
- 7. Additional Terms.
-
- "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
- When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
- Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the
- terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or
- author attributions in that material or in the Appropriate Legal
- Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or
- requiring that modified versions of such material be marked in
- reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or
- authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some
- trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that
- material by anyone who conveys the material (or modified versions of
- it) with contractual assumptions of liability to the recipient, for
- any liability that these contractual assumptions directly impose on
- those licensors and authors.
-
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
- If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
- Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
- 8. Termination.
-
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
- However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
- Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
- 9. Acceptance Not Required for Having Copies.
-
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
-nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
- 10. Automatic Licensing of Downstream Recipients.
-
- Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
-for enforcing compliance by third parties with this License.
-
- An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
- 11. Patents.
-
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
-work thus licensed is called the contributor's "contributor version".
-
- A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
- Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
- In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
- If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
- If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
- A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
- Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
- 12. No Surrender of Others' Freedom.
-
- If 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 convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
- 13. Use with the GNU Affero General Public License.
-
- Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work. The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
- 14. Revised Versions of this License.
-
- The Free Software Foundation may publish revised and/or new versions of
-the GNU 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
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
- If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
- 15. Disclaimer of Warranty.
-
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "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 PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. Limitation of Liability.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
- 17. Interpretation of Sections 15 and 16.
-
- If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state 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 program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- 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 3 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, see <http://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
- If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
- <program> Copyright (C) <year> <name of author>
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-<http://www.gnu.org/licenses/>.
-
- The GNU General Public License does not permit incorporating your program
-into proprietary programs. If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License. But first, please read
-<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/ChangeLog b/ChangeLog
deleted file mode 100644
index e69de29..0000000
diff --git a/ChangeLog.until-1.0.0 b/ChangeLog.until-1.0.0
deleted file mode 100644
index b79e9b1..0000000
--- a/ChangeLog.until-1.0.0
+++ /dev/null
@@ -1,1122 +0,0 @@
-# Generated by Makefile. Do not edit.
-
-2012-09-20 Ted Gould <ted at gould.cx>
-
- 1.0.0
-
-2012-09-20 Albert Astals Cid <albert.astals at canonical.com>
-
- Handle the SetLastUsedServer calls
-
- The data is saved in a file that is encrypted with the password and whose name is the hash of the username to provide as much privacy/security possible
-
-2012-09-20 Albert Astals <albert.astals at canonical.com>
-
- Use the correct function pointer check
-
-2012-09-17 Albert Astals <albert.astals at canonical.com>
-
- Merge lp:remote-login-service
-
-2012-09-14 Albert Astals <albert.astals at canonical.com>
-
- Merge lp:remote-login-service
-
-2012-09-14 Albert Astals <albert.astals at canonical.com>
-
- Do not assume AES data won't have 0 and we can use strlen, etc on it
-
-2012-09-14 Albert Astals <albert.astals at canonical.com>
-
- Merge lp:remote-login-service
-
-2012-09-14 Albert Astals <albert.astals at canonical.com>
-
- Remove printf
-
-2012-09-13 Albert Astals <albert.astals at canonical.com>
-
- Keep the last server_used around
-
-2012-09-14 Ted Gould <ted at gould.cx>
-
- 0.7.0
-
-2012-09-14 Ted Gould <ted at gould.cx>
-
- Enable the allow cache variable
-
-2012-09-14 Ted Gould <ted at gould.cx>
-
- Handle caching and multiple logins much better.. Approved by Albert Astals Cid.
-
-2012-09-14 Ted Gould <ted at gould.cx>
-
- Clear the cache if we don't want to use it.
-
-2012-09-14 Ted Gould <ted at gould.cx>
-
- Merge in the allow cache branch
-
-2012-09-14 Albert Astals <albert.astals at canonical.com>
-
- Merge lp:remote-login-service
-
-2012-09-14 Albert Astals <albert.astals at canonical.com>
-
- Move the if up
-
-2012-09-14 Albert Astals <albert.astals at canonical.com>
-
- Do not use the cache if we are told not to use it
-
-2012-09-14 Ted Gould <ted at gould.cx>
-
- Make sure that if we're changing the username and password we unblock any queued lookup
-
-2012-09-14 Ted Gould <ted at gould.cx>
-
- Pulling the clear JSON task stuff into its own function
-
-2012-09-14 Ted Gould <ted at gould.cx>
-
- Only reset the user name and password if they've changed
-
-2012-09-14 Ted Gould <ted at gould.cx>
-
- Remove the confusing 'if' statement and clear the username/pass
-
-2012-09-14 Albert Astals <albert.astals at canonical.com>
-
- Merge lp:remote-login-service
-
-2012-09-14 Albert Astals <albert.astals at canonical.com>
-
- Match proper signature
-
-2012-09-14 Albert Astals <albert.astals at canonical.com>
-
- Change the if line so the previously added test passes
-
- Not sure i fully understand what this line is trying to do
-
-2012-09-14 Albert Astals <albert.astals at canonical.com>
-
- Add test that proves that if you try to login twice, the second one is failed
-
-2012-09-14 Albert Astals <albert.astals at canonical.com>
-
- Actually use -Wall -Werror when compiling. Approved by Ted Gould.
-
-2012-09-14 Albert Astals <albert.astals at canonical.com>
-
- Merge lp:remote-login-service
-
-2012-09-14 Albert Astals <albert.astals at canonical.com>
-
- Also make the checks compile
-
-2012-09-14 Albert Astals <albert.astals at canonical.com>
-
- Compile with -Wall -Werror
-
-2012-09-14 Albert Astals <albert.astals at canonical.com>
-
- Set AM_CPPFLAGS to be AM_CFLAGS too
-
- Since it seems we are compiling in CPP mode
-
-2012-09-14 Ted Gould <ted at gould.cx>
-
- Protect NM code from systems without NM running. Approved by Albert Astals Cid.
-
-2012-09-14 Ted Gould <ted at gould.cx>
-
- Get teh locale.h change
-
-2012-09-13 Ted Gould <ted at gould.cx>
-
- Don't let warnings kill object creation either
-
-2012-09-13 Ted Gould <ted at gould.cx>
-
- Make sure that warnings are not fatal
-
-2012-09-13 Ted Gould <ted at gould.cx>
-
- Protect against NM Client being NULL and also check to see if it's connected
-
-2012-09-14 Ted Gould <ted at gould.cx>
-
- Add locale.h for unoptimized builds. Approved by Albert Astals Cid, jenkins.
-
-2012-09-14 Ted Gould <ted at gould.cx>
-
- Add locale.h
-
-2012-09-13 Ted Gould <ted at gould.cx>
-
- 0.6.0
-
-2012-09-13 Ted Gould <ted at gould.cx>
-
- Add translatable strings
-
-2012-09-13 Ted Gould <ted at gould.cx>
-
- Hard code the help message because gettext doesn't like the string concat and fixing it is too difficult for too little gain
-
-2012-09-12 Ted Gould <ted at gould.cx>
-
- Initialize Libtool
-
-2012-09-12 Ted Gould <ted at gould.cx>
-
- Move the internationalization stuff so that it gets the define path stuff
-
-2012-09-12 Ted Gould <ted at gould.cx>
-
- Setting up locale stuff
-
-2012-09-12 Ted Gould <ted at gould.cx>
-
- Looking up the names in the translation database
-
-2012-09-12 Ted Gould <ted at gould.cx>
-
- Switching over the conf file over to being translated
-
-2012-09-12 Ted Gould <ted at gould.cx>
-
- Adding source files to POTFILES.in
-
-2012-09-12 Ted Gould <ted at gould.cx>
-
- Making user visible strings translatable
-
-2012-09-13 Albert Astals <albert.astals at canonical.com>
-
- Parse the default server property of the json and map it to the last_used server property. Fixes: https://bugs.launchpad.net/bugs/1045838. Approved by Ted Gould, jenkins.
-
-2012-09-13 Albert Astals <albert.astals at canonical.com>
-
- Parse the DefaultServer property
-
-2012-09-13 Albert Astals <albert.astals at canonical.com>
-
- Add a test that fails regarding default/last_used server
-
- Make the default property of the servers map to the last_used on in rls speak
-
-2012-09-12 Ted Gould <ted at gould.cx>
-
- Verify the server is available before displaying
-
-2012-09-11 Ted Gould <ted at gould.cx>
-
- Attaching the bug
-
-2012-09-11 Ted Gould <ted at gould.cx>
-
- Make sure after verifying we revaluate the state
-
-2012-09-11 Ted Gould <ted at gould.cx>
-
- Don't start a message if we don't have a URL
-
-2012-09-11 Ted Gould <ted at gould.cx>
-
- Checking the return code and verifying the server based on it
-
-2012-09-11 Ted Gould <ted at gould.cx>
-
- Queuing up a message to get the HEADer using soup
-
-2012-09-11 Ted Gould <ted at gould.cx>
-
- Setting us up to verify the server's existance
-
-2012-09-11 Ted Gould <ted at gould.cx>
-
- Have a variable to track whether we've verified the server
-
-2012-09-11 Ted Gould <ted at gould.cx>
-
- Property to verify the server's existance or not
-
-2012-09-11 Ted Gould <ted at gould.cx>
-
- Gettin' some soup!
-
-2012-09-11 Ted Gould <ted at gould.cx>
-
- Make sure we have networking first
-
-2012-09-12 Ted Gould <ted at gould.cx>
-
- Check to ensure the network is available
-
-2012-09-12 Ted Gould <ted at gould.cx>
-
- Forgot an 'else'
-
-2012-09-12 Ted Gould <ted at gould.cx>
-
- Make sure there is only one nm-client allocated for all the UCCS servers
-
-2012-09-11 Ted Gould <ted at gould.cx>
-
- Getting fix for network builders
-
-2012-09-11 Ted Gould <ted at gould.cx>
-
- When the state changes update our cache and re-evaluate our status
-
-2012-09-11 Ted Gould <ted at gould.cx>
-
- Start providing the mechanism to track NM state
-
-2012-09-11 Ted Gould <ted at gould.cx>
-
- Making sure to evaluate state at the end as well
-
-2012-09-11 Ted Gould <ted at gould.cx>
-
- Disabling the network check on these
-
-2012-09-11 Ted Gould <ted at gould.cx>
-
- Making sure to disable the network checks
-
-2012-09-11 Ted Gould <ted at gould.cx>
-
- Wrong key to use
-
-2012-09-11 Ted Gould <ted at gould.cx>
-
- Adding a parameter to the keyfile to remove network checking
-
-2012-09-11 Ted Gould <ted at gould.cx>
-
- Splitting out the state evaluation into a helper function
-
-2012-09-11 Ted Gould <ted at gould.cx>
-
- Setting up variables to track networking and to see where we are
-
-2012-09-10 Ted Gould <ted at gould.cx>
-
- Grabbing libnm-glib
-
-2012-09-10 Ted Gould <ted at gould.cx>
-
- Grab some signalling
-
-2012-09-12 Ted Gould <ted at gould.cx>
-
- Add a state to the servers to know if they're configured. Fixes: https://bugs.launchpad.net/bugs/1047939. Approved by Albert Astals Cid, jenkins.
-
-2012-09-11 Ted Gould <ted at gould.cx>
-
- Attaching bug
-
-2012-09-11 Ted Gould <ted at gould.cx>
-
- Add an executable for the build system that don't have thin-client-config-agent
-
-2012-09-10 Ted Gould <ted at gould.cx>
-
- Don't need a tuple there apparently
-
-2012-09-10 Ted Gould <ted at gould.cx>
-
- Add a test to ensure we signaled updates
-
-2012-09-10 Ted Gould <ted at gould.cx>
-
- Pulling out the set_exec code so that we can test the signal stuff
-
-2012-09-10 Ted Gould <ted at gould.cx>
-
- When the server list changes emit the dbus signal
-
-2012-09-10 Ted Gould <ted at gould.cx>
-
- Handle a race with an extra DBus message
-
-2012-09-10 Ted Gould <ted at gould.cx>
-
- Moving where the config file is parsed to the servers aren't created until we've connected to DBus
-
-2012-09-10 Ted Gould <ted at gould.cx>
-
- Watching for servers updating themselves
-
-2012-09-10 Ted Gould <ted at gould.cx>
-
- Better handle the case of zero all good servers
-
-2012-09-10 Ted Gould <ted at gould.cx>
-
- Updating to trunk
-
-2012-09-10 Ted Gould <ted at gould.cx>
-
- Make sure to clear the builder if we don't use it
-
-2012-09-10 Ted Gould <ted at gould.cx>
-
- Make the signal get emitted when we change the state
-
-2012-08-29 Ted Gould <ted at gould.cx>
-
- Adding a state changed signal
-
-2012-08-29 Ted Gould <ted at gould.cx>
-
- Make it so that we can be ready or not based on whether the exec is found
-
-2012-08-29 Ted Gould <ted at gould.cx>
-
- Only UCCS servers that are all good as well
-
-2012-08-29 Ted Gould <ted at gould.cx>
-
- Making sure we only return all good servers
-
-2012-08-29 Ted Gould <ted at gould.cx>
-
- Adding a server state variable
-
-2012-09-10 Ted Gould <ted at gould.cx>
-
- Parse username and password info from JSON info. Fixes: https://bugs.launchpad.net/bugs/1045836. Approved by Albert Astals Cid, jenkins.
-
-2012-09-08 Ted Gould <ted at gould.cx>
-
- Attach bug number
-
-2012-09-07 Ted Gould <ted at gould.cx>
-
- Check for usernames, passwords and domains
-
-2012-09-07 Ted Gould <ted at gould.cx>
-
- Oops, wrong builder
-
-2012-09-07 Ted Gould <ted at gould.cx>
-
- Doing the same thing on the citrix side of the house
-
-2012-09-07 Ted Gould <ted at gould.cx>
-
- Parse additional values from the JSON for the RDP server
-
-2012-09-07 Ted Gould <ted at gould.cx>
-
- Use the username/password/domain values in the DBus response
-
-2012-09-07 Ted Gould <ted at gould.cx>
-
- Adding some variables to the server
-
-2012-09-07 Ted Gould <ted at gould.cx>
-
- Adding more JSON defines
-
-2012-09-10 Ted Gould <ted at gould.cx>
-
- Exit gracefully on name lost. Fixes: https://bugs.launchpad.net/bugs/1041338. Approved by Albert Astals Cid, jenkins.
-
-2012-09-08 Ted Gould <ted at gould.cx>
-
- Exit gracefully on name lost
-
-2012-08-30 Ted Gould <ted at gould.cx>
-
- Cleanup keyfile/json object stuff. Approved by Albert Astals Cid, jenkins.
-
-2012-08-29 Ted Gould <ted at gould.cx>
-
- Switching the tests over to using the new config file format
-
-2012-08-29 Ted Gould <ted at gould.cx>
-
- Fixing up the config file to match the changes
-
-2012-08-29 Ted Gould <ted at gould.cx>
-
- Dropping the per-server type defines
-
-2012-08-29 Ted Gould <ted at gould.cx>
-
- Switching to having a single list of servers
-
-2012-08-29 Ted Gould <ted at gould.cx>
-
- Use the new function in the server object
-
-2012-08-29 Ted Gould <ted at gould.cx>
-
- Fleshing out new from json
-
-2012-08-29 Ted Gould <ted at gould.cx>
-
- Fleshing out the new from keyfile function
-
-2012-08-29 Ted Gould <ted at gould.cx>
-
- Adding two new new functions
-
-2012-08-29 Ted Gould <ted at gould.cx>
-
- 0.5.0
-
-2012-08-29 Ted Gould <ted at gould.cx>
-
- Recurse through domain cache checks
-
-2012-08-27 Ted Gould <ted at gould.cx>
-
- Have UCCS servers look at their subservers for servers as well
-
-2012-08-27 Ted Gould <ted at gould.cx>
-
- Look through all the lists
-
-2012-08-27 Ted Gould <ted at gould.cx>
-
- Oops
-
-2012-08-27 Ted Gould <ted at gould.cx>
-
- Switch to using the find_uri function in the server
-
-2012-08-27 Ted Gould <ted at gould.cx>
-
- Adding a function to match a URI that is subclassable
-
-2012-08-27 Ted Gould <ted at gould.cx>
-
- Pushing up to Server instead of UCCS
-
-2012-08-27 Ted Gould <ted at gould.cx>
-
- Moving the cached domains function up into the server object
-
-2012-08-27 Ted Gould <ted at gould.cx>
-
- Pulling the list handling out into a helper function
-
-2012-08-27 Ted Gould <ted at gould.cx>
-
- Looking in path for execs and being more tollerant of protocol names. Approved by jenkins, Albert Astals Cid.
-
-2012-08-24 Ted Gould <ted at gould.cx>
-
- Changing to be proper 'ls' path
-
-2012-08-24 Ted Gould <ted at gould.cx>
-
- Look in the paths for the executables
-
-2012-08-24 Ted Gould <ted at gould.cx>
-
- Being more tollerant of protocol names
-
-2012-08-27 Ted Gould <ted at gould.cx>
-
- Making sure the string is the same one LightDM uses. Approved by Albert Astals Cid.
-
-2012-08-27 Ted Gould <ted at gould.cx>
-
- Fixing tests to new string
-
-2012-08-27 Ted Gould <ted at gould.cx>
-
- Making sure the string is the same one LightDM uses
-
-2012-08-27 Ted Gould <ted at gould.cx>
-
- If we can't find the server just return a NULL list for now. Approved by Albert Astals Cid.
-
-2012-08-24 Ted Gould <ted at gould.cx>
-
- Returning a NULL list of domains
-
-2012-08-21 Ted Gould <ted at gould.cx>
-
- 0.4.0
-
-2012-08-21 Ted Gould <ted at gould.cx>
-
- Changing the bin name of the TCCA to be correct. Approved by Ted Gould.
-
-2012-08-21 Ted Gould <ted at gould.cx>
-
- Fixing the name of the tcca
-
-2012-08-21 Ted Gould <ted at gould.cx>
-
- Making login error a boolean on the return. Approved by jenkins, Albert Astals Cid.
-
-2012-08-21 Ted Gould <ted at gould.cx>
-
- Making slmock return error on error
-
-2012-08-21 Ted Gould <ted at gould.cx>
-
- Adding a test for the login failure case
-
-2012-08-21 Ted Gould <ted at gould.cx>
-
- Changing the test to the new prototype
-
-2012-08-21 Ted Gould <ted at gould.cx>
-
- Return the boolean to say whether we got logged in
-
-2012-08-21 Ted Gould <ted at gould.cx>
-
- Adding a boolean to say where it is successful
-
-2012-08-21 Ted Gould <ted at gould.cx>
-
- Implementation of getting cached domains.. Approved by Albert Astals Cid, jenkins.
-
-2012-08-20 Ted Gould <ted at gould.cx>
-
- Add a test for CachedDomains interface
-
-2012-08-20 Ted Gould <ted at gould.cx>
-
- Add a test to make sure the proper structure comes back
-
-2012-08-20 Ted Gould <ted at gould.cx>
-
- Return the value of the function
-
-2012-08-20 Ted Gould <ted at gould.cx>
-
- Adding a function in UCCS to get the cached domains
-
-2012-08-20 Ted Gould <ted at gould.cx>
-
- Add a handler for getting the cached domains
-
-2012-08-21 Ted Gould <ted at gould.cx>
-
- Fix strlen warning. Approved by Albert Astals Cid, jenkins.
-
-2012-08-20 Ted Gould <ted at gould.cx>
-
- Include header for strlen
-
-2012-08-20 Michael Terry <michael.terry at canonical.com>
-
- Convert slmock to Python 3. Approved by Ted Gould.
-
-2012-08-20 Michael Terry <michael.terry at canonical.com>
-
- convert slmock to python3
-
-2012-08-20 Ted Gould <ted at gould.cx>
-
- 0.3.0
-
-2012-08-20 Ted Gould <ted at gould.cx>
-
- Small fixes left over from async-command-line branch landing.. Approved by Ted Gould.
-
-2012-08-20 Ted Gould <ted at gould.cx>
-
- Explicitly setting the inital value for the streams
-
-2012-08-20 Ted Gould <ted at gould.cx>
-
- make json_waiters_notify static
-
-2012-08-20 Ted Gould <ted at gould.cx>
-
- Changing the command line calls to be async. Approved by Antti Kaijanmäki, jenkins.
-
-2012-08-17 Ted Gould <ted at gould.cx>
-
- Make sure to clear up the spawned PID if we destroy before it completes
-
-2012-08-17 Ted Gould <ted at gould.cx>
-
- Make sure to respond to all the DBus messages if the object is destroyed
-
-2012-08-17 Ted Gould <ted at gould.cx>
-
- Only use strdup for the password
-
-2012-08-16 Ted Gould <ted at gould.cx>
-
- Merging trunk to resolve conflicts
-
-2012-08-16 Ted Gould <ted at gould.cx>
-
- Dropping the unused get_json function
-
-2012-08-16 Ted Gould <ted at gould.cx>
-
- Dropping the helper-script
-
-2012-08-16 Ted Gould <ted at gould.cx>
-
- Switching to Async I/O for the call to the external process
-
-2012-08-16 Ted Gould <ted at gould.cx>
-
- Restructuring the code so that we're kinda queuing things
-
-2012-08-16 Ted Gould <ted at gould.cx>
-
- Switch around 'unlock' so that it has a callback
-
-2012-08-17 Ted Gould <ted at gould.cx>
-
- Handle the case of no servers available with the correct variant type. Also add a test for it.. Approved by Albert Astals Cid, jenkins.
-
-2012-08-16 Ted Gould <ted at gould.cx>
-
- Add a test to make sure lack of servers doesn't kill us
-
-2012-08-16 Ted Gould <ted at gould.cx>
-
- Fix the return in the no servers case
-
-2012-08-17 Ted Gould <ted at gould.cx>
-
- Create dictionaries with _parse instead of with _new to avoid vararg errors. Approved by Albert Astals Cid, jenkins.
-
-2012-08-16 Ted Gould <ted at gould.cx>
-
- Switching to using parse so we don't have to create a bunch of false objects
-
-2012-08-17 Ted Gould <ted at gould.cx>
-
- Add copyright headers to source files. Approved by Albert Astals Cid, jenkins.
-
-2012-08-16 Ted Gould <ted at gould.cx>
-
- Adding copyright headers on the top of the source files
-
-2012-08-16 Michael Terry <michael.terry at canonical.com>
-
- Switch from libexecdir to pkglibexecdir. Approved by Ted Gould, jenkins.
-
-2012-08-15 Michael Terry <michael.terry at canonical.com>
-
- install into pkglibexecdir not libexecdir
-
-2012-08-15 Ted Gould <ted at gould.cx>
-
- 0.2.0
-
-2012-08-14 Ted Gould <ted at gould.cx>
-
- Adds SLMock tests to the test suite
-
-2012-08-14 Ted Gould <ted at gould.cx>
-
- Adding more servers for tests
-
-2012-08-14 Ted Gould <ted at gould.cx>
-
- Adding the other Citrix servers
-
-2012-08-14 Ted Gould <ted at gould.cx>
-
- Copy, paste, and adjust. The last step is super important.
-
-2012-08-14 Ted Gould <ted at gould.cx>
-
- Adding to lovers
-
-2012-08-14 Ted Gould <ted at gould.cx>
-
- Passing the right username/password to slmock
-
-2012-08-14 Ted Gould <ted at gould.cx>
-
- Passing the username/password to the object
-
-2012-08-14 Ted Gould <ted at gould.cx>
-
- Adding in code to do the JSON parsing, let's see if it can pass our test
-
-2012-08-10 Ted Gould <ted at gould.cx>
-
- Check for the server in the list
-
-2012-08-10 Ted Gould <ted at gould.cx>
-
- Adding a login test
-
-2012-08-10 Ted Gould <ted at gould.cx>
-
- Dbus test fixes
-
-2012-08-10 Ted Gould <ted at gould.cx>
-
- Adding the basic wrapper for all the slmock tests
-
-2012-08-10 Ted Gould <ted at gould.cx>
-
- Making slmock executable
-
-2012-08-10 Ted Gould <ted at gould.cx>
-
- Adding a configuration file for slmock
-
-2012-08-10 Ted Gould <ted at gould.cx>
-
- Grabbing slmock from the Maza team
-
-2012-08-14 Ted Gould <ted at gould.cx>
-
- First pass at JSON parsing and exec. Uses a helper script, and needs async. But works.
-
-2012-08-14 Ted Gould <ted at gould.cx>
-
- Signalling when we loose connections or are being destroyed
-
-2012-08-14 Ted Gould <ted at gould.cx>
-
- Making sure to mark the address as authorized if it is
-
-2012-08-14 Ted Gould <ted at gould.cx>
-
- Setting the username and password in the object
-
-2012-08-14 Ted Gould <ted at gould.cx>
-
- Distribute the script
-
-2012-08-14 Ted Gould <ted at gould.cx>
-
- Adding in the helper
-
-2012-08-14 Ted Gould <ted at gould.cx>
-
- Using a helper script just for now
-
-2012-08-13 Ted Gould <ted at gould.cx>
-
- Building the variant objects from the GList of servers
-
-2012-08-13 Ted Gould <ted at gould.cx>
-
- Keep an array of all the sub servers we have
-
-2012-08-13 Ted Gould <ted at gould.cx>
-
- Fleshing out some object JSON stuff
-
-2012-08-13 Ted Gould <ted at gould.cx>
-
- Calling into the objects so they can build themselves
-
-2012-08-13 Ted Gould <ted at gould.cx>
-
- Parsing the array entries and starting to build the server objects.
-
-2012-08-13 Ted Gould <ted at gould.cx>
-
- Handling the top level of the JSON file and getting out the array of servers.
-
-2012-08-13 Ted Gould <ted at gould.cx>
-
- Adding some JSON lovin'
-
-2012-08-13 Ted Gould <ted at gould.cx>
-
- Flesh out the flow that is needed for the unlocking of the UCCS server
-
-2012-08-10 Ted Gould <ted at gould.cx>
-
- Adding the new member variables
-
-2012-08-10 Ted Gould <ted at gould.cx>
-
- Handle the cases brought out by GetServersFromLogin
-
-2012-08-10 Ted Gould <ted at gould.cx>
-
- Adding a couple fun little calls to get this party started!
-
-2012-08-10 Ted Gould <ted at gould.cx>
-
- Fixing exec parsing
-
-2012-08-10 Ted Gould <ted at gould.cx>
-
- Adding a test for exec
-
-2012-08-10 Ted Gould <ted at gould.cx>
-
- Adding an 'Exec' to the config file
-
-2012-08-10 Ted Gould <ted at gould.cx>
-
- Adding an exec property
-
-2012-08-10 Ted Gould <ted at gould.cx>
-
- Fixes to have multiple connections
-
-2012-08-10 Ted Gould <ted at gould.cx>
-
- Making sure to close the session
-
-2012-08-10 Ted Gould <ted at gould.cx>
-
- White space
-
-2012-08-10 Ted Gould <ted at gould.cx>
-
- Adding a test for the dbus interface
-
-2012-08-10 Ted Gould <ted at gould.cx>
-
- Cleaning up the Make file to ensure we don't check coverage of the generated files
-
-2012-08-10 Ted Gould <ted at gould.cx>
-
- Fixing coverage linking so it happens in the lib
-
-2012-08-10 Ted Gould <ted at gould.cx>
-
- Adding a real test to look at the dbus interface
-
-2012-08-10 Ted Gould <ted at gould.cx>
-
- Adding in a dummy test
-
-2012-08-10 Ted Gould <ted at gould.cx>
-
- Grab ourselves some dbus test libs
-
-2012-08-10 Ted Gould <ted at gould.cx>
-
- Cut and paste error
-
-2012-08-10 Ted Gould <ted at gould.cx>
-
- Add a property for read only domains.
-
-2012-08-09 Ted Gould <ted at gould.cx>
-
- Abstracting out server objects
-
-2012-08-09 Ted Gould <ted at gould.cx>
-
- Adding a variant test
-
-2012-08-09 Ted Gould <ted at gould.cx>
-
- Adding a test for keyfile handling
-
-2012-08-08 Ted Gould <ted at gould.cx>
-
- Cleaning these up to make these functions work a bit easier.
-
-2012-08-08 Ted Gould <ted at gould.cx>
-
- Making the test more real and actually checking something
-
-2012-08-08 Ted Gould <ted at gould.cx>
-
- Adding a first test with all of the fun that brings
-
-2012-08-08 Ted Gould <ted at gould.cx>
-
- Adding in a tests directory
-
-2012-08-08 Ted Gould <ted at gould.cx>
-
- Moving all the new server code into it's own library so that we can test it easier.
-
-2012-08-08 Ted Gould <ted at gould.cx>
-
- Create the objects from the config file and use them to build the variants
-
-2012-08-08 Ted Gould <ted at gould.cx>
-
- Put in a function to build each of the servers from a Keyfile
-
-2012-08-08 Ted Gould <ted at gould.cx>
-
- Adding some properties for that UCCS server
-
-2012-08-08 Ted Gould <ted at gould.cx>
-
- We need a UCCS server type as well
-
-2012-08-08 Ted Gould <ted at gould.cx>
-
- Hmm, put those in quite the wrong place
-
-2012-08-08 Ted Gould <ted at gould.cx>
-
- Adding some generic get_properties functions
-
-2012-08-08 Ted Gould <ted at gould.cx>
-
- Clean up the strings
-
-2012-08-08 Ted Gould <ted at gould.cx>
-
- Restructuring things slightly so that the object type determines the type and the server class takes care of the base tuple building
-
-2012-08-08 Ted Gould <ted at gould.cx>
-
- Adding some generic properties to the super class
-
-2012-08-08 Ted Gould <ted at gould.cx>
-
- Adding an RDP server class
-
-2012-08-08 Ted Gould <ted at gould.cx>
-
- Adding a Citrix subclass
-
-2012-08-08 Ted Gould <ted at gould.cx>
-
- Adding a server base class
-
-2012-08-09 Ted Gould <ted at gould.cx>
-
- Noting that there may be some optional fields
-
-2012-08-09 Ted Gould <ted at gould.cx>
-
- Adding in a usage overview diagram
-
-2012-08-08 Ted Gould <ted at gould.cx>
-
- Adding the application list, even if blank today
-
-2012-08-08 Ted Gould <ted at gould.cx>
-
- Adding a function to set the last used server
-
-2012-08-08 Ted Gould <ted at gould.cx>
-
- Adding an application list to the server information and a function to set it
-
-2012-08-08 Ted Gould <ted at gould.cx>
-
- Adding a function for a cached domain
-
-2012-08-08 Ted Gould <ted at gould.cx>
-
- Adding a boolean to know which server was last
-
-2012-08-08 Ted Gould <ted at gould.cx>
-
- Adding the URI to the server login API
-
-2012-07-30 Ted Gould <ted at gould.cx>
-
- Remove the network UCCS server
-
-2012-07-30 Ted Gould <ted at gould.cx>
-
- 0.0.1
-
-2012-07-30 Ted Gould <ted at gould.cx>
-
- Adding in the service file
-
-2012-07-30 Ted Gould <ted at gould.cx>
-
- Adding in a config file
-
-2012-07-30 Ted Gould <ted at gould.cx>
-
- Adding in a data directory
-
-2012-07-30 Ted Gould <ted at gould.cx>
-
- Adding e-mail to UCCS and removing domain
-
-2012-07-30 Ted Gould <ted at gould.cx>
-
- Adding support for UCCS servers
-
-2012-07-30 Ted Gould <ted at gould.cx>
-
- Add the 'uccs' server type
-
-2012-07-30 Ted Gould <ted at gould.cx>
-
- Handling the get servers request so that we can dump dem servers
-
-2012-07-30 Ted Gould <ted at gould.cx>
-
- Parsing the config file to get a list of servers
-
-2012-07-29 Ted Gould <ted at gould.cx>
-
- Checking and bringing up config file
-
-2012-07-29 Ted Gould <ted at gould.cx>
-
- Make sure that we get into our function
-
-2012-07-29 Ted Gould <ted at gould.cx>
-
- Build up some command line parsing
-
-2012-07-29 Ted Gould <ted at gould.cx>
-
- Grabbing a default configuration file from the automake dirs
-
-2012-07-29 Ted Gould <ted at gould.cx>
-
- Going in, getting the name, and handling the errors
-
-2012-07-27 Ted Gould <ted at gould.cx>
-
- Putting the object on the bus
-
-2012-07-27 Ted Gould <ted at gould.cx>
-
- Now we can effectively wait forever
-
-2012-07-27 Ted Gould <ted at gould.cx>
-
- Ignoring the tarball
-
-2012-07-27 Ted Gould <ted at gould.cx>
-
- Now with a binary
-
-2012-07-27 Ted Gould <ted at gould.cx>
-
- Fleshing out the Makefiles
-
-2012-07-27 Ted Gould <ted at gould.cx>
-
- Basic build system
-
-2012-07-27 Ted Gould <ted at gould.cx>
-
- Server URL added
-
-2012-07-27 Ted Gould <ted at gould.cx>
-
- First pass at a DBus interface
-
-2012-07-23 Ted Gould <ted at gould.cx>
-
- A small diagram describing our place in the world
-
-2012-07-23 Ted Gould <ted at gould.cx>
-
- What are we trying to do?
-
diff --git a/Makefile.am b/Makefile.am
deleted file mode 100644
index e3edc22..0000000
--- a/Makefile.am
+++ /dev/null
@@ -1,36 +0,0 @@
-
-SUBDIRS = \
- src \
- data \
- po \
- tests
-
-DISTCHECK_CONFIGURE_FLAGS = --enable-localinstall
-
-dist-hook:
- @if test -d "$(top_srcdir)/.git"; \
- then \
- echo Creating ChangeLog && \
- ( cd "$(top_srcdir)" && \
- echo '# Generated by Makefile. Do not edit.'; echo; \
- $(top_srcdir)/missing --run git --no-pager log --since "1970" --format="%ai %aN (%h) %n%n%x09*%w(68,0,10) %s%d%n") > ChangeLog.tmp \
- && mv -f ChangeLog.tmp $(top_distdir)/ChangeLog \
- || (rm -f ChangeLog.tmp; \
- echo Failed to generate ChangeLog >&2 ); \
- else \
- echo Failed to generate ChangeLog: not a branch >&2; \
- fi
- @if test -d "$(top_srcdir)/.git"; \
- then \
- echo Creating AUTHORS && \
- ( cd "$(top_srcdir)" && \
- echo '# Generated by Makefile. Do not edit.'; echo; \
- $(top_srcdir)/missing --run git log | grep -e "^Author:" -e "Committer:" | cut -d ":" -f 2 | cut -d "<" -f 1 | sort -u) > AUTHORS.tmp \
- && mv -f AUTHORS.tmp $(top_distdir)/AUTHORS \
- || (rm -f AUTHORS.tmp; \
- echo Failed to generate AUTHORS >&2 ); \
- else \
- echo Failed to generate AUTHORS: not a branch >&2; \
- fi
-
-include $(top_srcdir)/Makefile.am.coverage
diff --git a/Makefile.am.coverage b/Makefile.am.coverage
deleted file mode 100644
index fb97747..0000000
--- a/Makefile.am.coverage
+++ /dev/null
@@ -1,48 +0,0 @@
-
-# Coverage targets
-
-.PHONY: clean-gcno clean-gcda \
- coverage-html generate-coverage-html clean-coverage-html \
- coverage-gcovr generate-coverage-gcovr clean-coverage-gcovr
-
-clean-local: clean-gcno clean-coverage-html clean-coverage-gcovr
-
-if HAVE_GCOV
-
-clean-gcno:
- @echo Removing old coverage instrumentation
- -find -name '*.gcno' -print | xargs -r rm
-
-clean-gcda:
- @echo Removing old coverage results
- -find -name '*.gcda' -print | xargs -r rm
-
-coverage-html: clean-gcda
- -$(MAKE) $(AM_MAKEFLAGS) -k check
- $(MAKE) $(AM_MAKEFLAGS) generate-coverage-html
-
-generate-coverage-html:
- @echo Collecting coverage data
- $(LCOV) --directory $(top_builddir) --capture --output-file coverage.info --no-checksum --compat-libtool
- LANG=C $(GENHTML) --prefix $(top_builddir) --output-directory coveragereport --title "Code Coverage" --legend --show-details coverage.info
-
-clean-coverage-html: clean-gcda
- -$(LCOV) --directory $(top_builddir) -z
- -rm -rf coverage.info coveragereport
-
-if HAVE_GCOVR
-
-coverage-gcovr: clean-gcda
- -$(MAKE) $(AM_MAKEFLAGS) -k check
- $(MAKE) $(AM_MAKEFLAGS) generate-coverage-gcovr
-
-generate-coverage-gcovr:
- @echo Generating coverage GCOVR report
- $(GCOVR) -x -r $(top_builddir) -o $(top_builddir)/coverage.xml
-
-clean-coverage-gcovr: clean-gcda
- -rm -rf $(top_builddir)/coverage.xml
-
-endif # HAVE_GCOVR
-
-endif # HAVE_GCOV
diff --git a/NEWS b/NEWS
deleted file mode 100644
index 25f1cf7..0000000
--- a/NEWS
+++ /dev/null
@@ -1 +0,0 @@
-All the news that's fit to print.
diff --git a/README b/README
deleted file mode 100644
index 3519c77..0000000
--- a/README
+++ /dev/null
@@ -1,7 +0,0 @@
-A small service to grab various remote login possibilities from the local
-network configuration, network servers
-that provide them, and present them to the user to log into for both
-applications and full desktop posibilities.
-
-This project has been forked by the X2Go/Arctica Project
-to support Remote Login against Linux machines via X2Go.
diff --git a/README.discontinued b/README.discontinued
new file mode 100644
index 0000000..2bc84a8
--- /dev/null
+++ b/README.discontinued
@@ -0,0 +1,5 @@
+This project has been moved to the Arctica Project's Git repository:
+
+https://github.com/ArcticaProject/lightdm-remote-session-x2go
+
+20151111, Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
diff --git a/configure.ac b/configure.ac
deleted file mode 100644
index decd462..0000000
--- a/configure.ac
+++ /dev/null
@@ -1,105 +0,0 @@
-AC_INIT(remote-logon-service, 1.0.0.1)
-
-AC_PREREQ(2.53)
-AM_INIT_AUTOMAKE([])
-
-AC_PROG_CC
-AC_PROG_INSTALL
-AC_PROG_LIBTOOL
-AM_PROG_CC_C_O
-AM_SILENT_RULES([yes])
-AC_CONFIG_MACRO_DIR([m4])
-
-# Initialize libtool
-LT_PREREQ([2.2])
-LT_INIT([disable-static])
-
-AC_CONFIG_HEADER(config.h)
-AC_CONFIG_FILES([
- Makefile
- src/Makefile
- data/Makefile
- po/Makefile.in
- tests/Makefile
-])
-
-PKG_CHECK_MODULES(SERVICE, glib-2.0 gio-2.0 gio-unix-2.0 json-glib-1.0 libnm-glib libsoup-2.4)
-PKG_CHECK_MODULES(TEST, dbustest-1)
-
-AC_CHECK_LIB(gcrypt, gcry_cipher_get_algo_keylen, GCRYPT_LIBS="-lgcrypt")
-
-if test x"$GCRYPT_LIBS" = x ; then
- echo "You need libgcrypt to compile remote-logon-service";
- exit
-fi
-
-###########################
-# Local Install
-###########################
-
-with_localinstall="no"
-AC_ARG_ENABLE(localinstall, AS_HELP_STRING([--enable-localinstall],
- [install all files locally (for distcheck)]),
- with_localinstall=$enableval,
- with_localinstall=no)
-
-##############################
-# Custom Junk
-##############################
-
-AC_DEFUN([AC_DEFINE_PATH], [
- test "x$prefix" = xNONE && prefix="$ac_default_prefix"
- test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
- ac_define_path=`eval echo [$]$2`
- ac_define_path=`eval echo [$]ac_define_path`
- $1="$ac_define_path"
- AC_SUBST($1)
- ifelse($3, ,
- AC_DEFINE_UNQUOTED($1, "$ac_define_path"),
- AC_DEFINE_UNQUOTED($1, "$ac_define_path", $3))
-])
-
-###########################
-# DBus Service Info
-###########################
-
-if test "x$with_localinstall" = "xyes"; then
- DBUSSERVICEDIR="${datadir}/dbus-1/services/"
-else
- DBUSSERVICEDIR=`$PKG_CONFIG --variable=session_bus_services_dir dbus-1`
-fi
-AC_SUBST(DBUSSERVICEDIR)
-
-###########################
-# gcov coverage reporting
-###########################
-
-m4_include([m4/gcov.m4])
-AC_TDD_GCOV
-AM_CONDITIONAL([HAVE_GCOV], [test "x$ac_cv_check_gcov" = xyes])
-AM_CONDITIONAL([HAVE_LCOV], [test "x$ac_cv_check_lcov" = xyes])
-AM_CONDITIONAL([HAVE_GCOVR], [test "x$ac_cv_check_gcovr" = xyes])
-AC_SUBST(COVERAGE_CFLAGS)
-AC_SUBST(COVERAGE_LDFLAGS)
-AC_SUBST(GCRYPT_LIBS)
-
-###########################
-# Internationalization
-###########################
-
-IT_PROG_INTLTOOL([0.35.0])
-GETTEXT_PACKAGE=remote-logon-service
-AC_SUBST(GETTEXT_PACKAGE)
-AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [gettext package])
-AC_DEFINE_PATH(LOCALEDIR, "${datadir}/locale", [locale directory])
-AM_GLIB_GNU_GETTEXT
-
-###########################
-# Flags
-###########################
-
-AC_SUBST(AM_CFLAGS, "-Wall -Werror")
-AC_SUBST(AM_CPPFLAGS, $AM_CFLAGS)
-
-AC_OUTPUT
-
diff --git a/data/Makefile.am b/data/Makefile.am
deleted file mode 100644
index 3ba4d21..0000000
--- a/data/Makefile.am
+++ /dev/null
@@ -1,21 +0,0 @@
-config_file_DATA = \
- remote-logon-service.conf
-config_filedir = $(sysconfdir)
-
-dbus_servicesdir = $(DBUSSERVICEDIR)
-dbus_services_DATA = org.ArcticaProject.RemoteLogon.service
-
-%.service: %.service.in
- sed -e "s|\@pkglibexecdir\@|$(pkglibexecdir)|" $< > $@
-
-%.conf: %.conf.in
- $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
-
-EXTRA_DIST = \
- org.ArcticaProject.RemoteLogon.service.in \
- remote-logon-service.conf.in
-
-CLEANFILES = \
- org.ArcticaProject.RemoteLogon.service \
- remote-logon-service.conf
-
diff --git a/data/org.ArcticaProject.RemoteLogon.service.in b/data/org.ArcticaProject.RemoteLogon.service.in
deleted file mode 100644
index 0961dbb..0000000
--- a/data/org.ArcticaProject.RemoteLogon.service.in
+++ /dev/null
@@ -1,3 +0,0 @@
-[D-BUS Service]
-Name=org.ArcticaProject.RemoteLogon
-Exec=@pkglibexecdir@/remote-logon-service
diff --git a/data/remote-logon-service.conf.in b/data/remote-logon-service.conf.in
deleted file mode 100644
index 5cadcc9..0000000
--- a/data/remote-logon-service.conf.in
+++ /dev/null
@@ -1,6 +0,0 @@
-[Remote Logon Service]
-Servers=Session Broker
-
-[Server Session Broker]
-_Name=Remote Logon
-URI=http://localhost:8080/uccs/inifile/
diff --git a/debian/changelog b/debian/changelog
deleted file mode 100644
index f032652..0000000
--- a/debian/changelog
+++ /dev/null
@@ -1,152 +0,0 @@
-remote-logon-service (1.0.0.1-0) UNRELEASED; urgency=medium
-
- * Rename src:package and bin:package: -> remote-logon-service.
-
- * First forked/upstream release (1.0.0.1):
- - Apply patch 01_clear_servers.patch.
- - Apply patch glib-deprecated.diff. Provide support for old
- GLib versions.
- - Apply 02_server-name.patch. Provide support for non-Canonical
- UCCS servers.
- - Apply 03_x2go+rls.patch. Provide support for X2Go remote logins.
- - Extend README file, inform about the RLS fork by X2Go.
- - remote-login-service.conf.in: Add URLs for default X2Go Session Broker
- installation.
- - remote-login-service.conf.in: No https for localhost connections.
- * debian/rules:
- + Build using dh_autoreconf.
- + Make sure we have an empty upstream ChangeLog file when building from Git.
- + Remove dummy ChangeLog file after build if empty.
- + Fix missing call of dh_auto_clean in override_dh_auto_clean.
- * debian/copyright:
- + Add Upstream-Contract: field. Add myself as copyright holder.
- + Fix upstream source URL.
- + Update copyright holders and years.
- * debian/control:
- + Add B-Ds: dh-autoreconf, libgtest-dev, python. Enable the testsuite at
- build time.
- + Bump Standards: to 3.9.6. No changes needed.
- * debian/source/format:
- + Switch back to source format 1.0.
-
- -- Mike Gabriel <mike.gabriel at das-netzwerkteam.de> Sun, 02 Nov 2014 21:36:41 +0100
-
-remote-login-service (1.0.0-0ubuntu3) raring; urgency=low
-
- * Don't use deprecated g_type_init() with recent glib2.0.
-
- -- Matthias Klose <doko at ubuntu.com> Tue, 26 Feb 2013 10:40:57 +0100
-
-remote-login-service (1.0.0-0ubuntu2) raring; urgency=low
-
- * SECURITY UPDATE: credentials disclosure via second login (LP: #1070896)
- - debian/patches/01_clear_servers.patch: Clear servers on second login
- in src/uccs-server.c, add test to tests/dbus-interface.c.
- - CVE-2012-0959
-
- -- Marc Deslauriers <marc.deslauriers at ubuntu.com> Mon, 05 Nov 2012 14:05:14 -0500
-
-remote-login-service (1.0.0-0ubuntu1) quantal; urgency=low
-
- * New upstream release.
- * Support caching the recently used server
- * debian/control: Add build dep on libgcrypt11-dev
-
- -- Ted Gould <ted at ubuntu.com> Thu, 20 Sep 2012 23:55:05 -0500
-
-remote-login-service (0.7.0-0ubuntu1) quantal; urgency=low
-
- * New upstream release.
- - Fix NM service detection and fallback
- - Fix build on unoptimized build servers
- - Fix issues with multiple logins (LP: #1050810)
- - Support stored data in UCCS (LP: #1045836)
- - Check to insure TCCA is installed before using (LP: #1047939)
- - Ensure that the server is available before showing (LP: #1047940)
- - Make the UCCS server names translatable (LP: #1049694)
- - Fix error message that wasn't that bad (LP: #1041338)
- - Place the server marked as default first (LP: #1045838)
- * debian/control:
- - Adding a build dep on libnm-glib
- - Adding a build dep on libsoup2.4-dev
- * Dropping debian/patches as all upstream
-
- -- Ted Gould <ted at ubuntu.com> Thu, 13 Sep 2012 11:16:17 -0500
-
-remote-login-service (0.5.0-0ubuntu2) quantal; urgency=low
-
- * debian/patches/exit-gracefully-on-name-lost.patch:
- - Fix possible crash on exit. Patch from trunk. LP: #1041338
-
- -- Michael Terry <mterry at ubuntu.com> Tue, 11 Sep 2012 14:03:07 -0400
-
-remote-login-service (0.5.0-0ubuntu1) quantal; urgency=low
-
- * New upstream release.
- * Fix protocol names
- * Align naming with LightDM services
- * Handle recursive searches for domain name caches
-
- -- Ted Gould <ted at ubuntu.com> Wed, 29 Aug 2012 11:38:02 -0500
-
-remote-login-service (0.4.0-0ubuntu1) quantal; urgency=low
-
- * New upstream release.
- * slmock to Python3
- * Return a boolean from GetServersForLogin
- * Fix thin-client-config-agent path
- * debian/control:
- - Build-Dep on python3, not python
- - Recommend thin-client-config-agent
-
- -- Michael Terry <mterry at ubuntu.com> Tue, 21 Aug 2012 17:43:12 -0400
-
-remote-login-service (0.3.0-0ubuntu1) quantal; urgency=low
-
- [ Ted Gould ]
- * New upstream release.
- * Async command line calling
- * Test suite fix
- * Remove security issues with helper-script (dropped)
- * Crash fix (LP: #1037832)
- * debian/rules: Remove block on tests
-
- [ Michael Terry ]
- * debian/control:
- - Add Vcs-Bzr link
- - Add some new build dependencies for tests (dbus-test-runner, python)
- * Drop patch for pkglibexecdir, not needed anymore
- * Drop dh-autoreconf, since we don't patch autotools files now
-
- -- Michael Terry <mterry at ubuntu.com> Mon, 20 Aug 2012 12:42:09 -0400
-
-remote-login-service (0.2.0-0ubuntu1) quantal; urgency=low
-
- * Package for Ubuntu (LP: #1037231)
- * Switch to dh9 and drop cdbs
- * Add watch file
- * Cleanup control and copyright files
- * Add patch to use pkglibexecdir instead of libexecdir
-
- -- Michael Terry <mterry at ubuntu.com> Wed, 15 Aug 2012 15:00:35 -0400
-
-remote-login-service (0.2.0-0ubuntu1~ppa2) quantal; urgency=low
-
- * debian/control: Adding dh-autoreconf as a build depend
-
- -- Ted Gould <ted at ubuntu.com> Wed, 15 Aug 2012 13:06:38 -0500
-
-remote-login-service (0.2.0-0ubuntu1~ppa1) quantal; urgency=low
-
- * New upstream release.
- * Support calling the UCCS service tool
- * Tests to deal with JSON output
- * debian/control: Adding build dependencies on dbustest and json-glib
-
- -- Ted Gould <ted at ubuntu.com> Wed, 15 Aug 2012 11:38:31 -0500
-
-remote-login-service (0.0.1-0ubuntu1~ppa1) quantal; urgency=low
-
- * New upstream release.
-
- -- Ted Gould <ted at ubuntu.com> Mon, 30 Jul 2012 16:57:37 +0100
diff --git a/debian/compat b/debian/compat
deleted file mode 100644
index ec63514..0000000
--- a/debian/compat
+++ /dev/null
@@ -1 +0,0 @@
-9
diff --git a/debian/control b/debian/control
deleted file mode 100644
index 8c06e8b..0000000
--- a/debian/control
+++ /dev/null
@@ -1,35 +0,0 @@
-Source: remote-logon-service
-Section: misc
-Priority: extra
-Maintainer: Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
-Build-Depends: dbus-test-runner,
- debhelper (>= 9),
- intltool (>= 0.35.0),
- libdbus-1-dev,
- libdbustest1-dev,
- libgcrypt11-dev,
- libglib2.0-dev (>= 2.29.19),
- libjson-glib-dev,
- libnm-glib-dev,
- libsoup2.4-dev,
- dh-autoreconf,
- libgtest-dev,
- python,
- python3,
-Standards-Version: 3.9.6
-Homepage: http://www.x2go.org
-Vcs-Git: git://code.x2go.org/remote-logon-service.git
-Vcs-Browser: http://code.x2go.org/gitweb?p=remote-logon-service.git;a=summary
-
-Package: remote-logon-service
-Architecture: any
-Depends: ${shlibs:Depends},
- ${misc:Depends},
-#Breaks: remote-login-service,
-# remote-logon-services-x2go (<< 1.0.0.2),
-#Replaces: remote-login-service,
-# remote-login-services-x2go (<< 1.0.0.2),
-Recommends: thin-client-config-agent
-Description: Service to track the remote servers to use
- A small service to take the various sources for the remote
- services and bring them into a simple DBus list.
diff --git a/debian/copyright b/debian/copyright
deleted file mode 100644
index 297f79a..0000000
--- a/debian/copyright
+++ /dev/null
@@ -1,31 +0,0 @@
-Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
-Upstream-Name: remote-logon-service
-Upstream-Contact: Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
-Source: http://code.x2go.org/gitweb?p=remote-logon-service-x2go.git;a=summary
-
-Files: *
-Copyright: 2012, Canonical Ltd.
- 2013, Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
- 2015, The Arctica Project
-License: GPL-3
-
-Files: debian/*
-Copyright: 2012, Canonical Ltd.
- 2012-2015, Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
-License: GPL-3
-
-License: GPL-3
- This package 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; version 3 of the License.
- .
- This package 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, see <http://www.gnu.org/licenses/>
- .
- On Debian systems, the complete text of the GNU General
- Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".
diff --git a/debian/rules b/debian/rules
deleted file mode 100755
index afcf78b..0000000
--- a/debian/rules
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/usr/bin/make -f
-
-%:
- dh $@ --with autoreconf
-
-override_dh_autoreconf:
- touch ChangeLog
- dh_autoreconf
-
-override_dh_auto_clean:
- if [ -s ChangeLog ]; then rm -f ChangeLog; fi
- dh_auto_clean
diff --git a/debian/source/format b/debian/source/format
deleted file mode 100644
index d3827e7..0000000
--- a/debian/source/format
+++ /dev/null
@@ -1 +0,0 @@
-1.0
diff --git a/m4/gcov.m4 b/m4/gcov.m4
deleted file mode 100644
index 3163584..0000000
--- a/m4/gcov.m4
+++ /dev/null
@@ -1,86 +0,0 @@
-# Checks for existence of coverage tools:
-# * gcov
-# * lcov
-# * genhtml
-# * gcovr
-#
-# Sets ac_cv_check_gcov to yes if tooling is present
-# and reports the executables to the variables LCOV, GCOVR and GENHTML.
-AC_DEFUN([AC_TDD_GCOV],
-[
- AC_ARG_ENABLE(gcov,
- AS_HELP_STRING([--enable-gcov],
- [enable coverage testing with gcov]),
- [use_gcov=$enableval], [use_gcov=no])
-
- if test "x$use_gcov" = "xyes"; then
- # we need gcc:
- if test "$GCC" != "yes"; then
- AC_MSG_ERROR([GCC is required for --enable-gcov])
- fi
-
- # Check if ccache is being used
- AC_CHECK_PROG(SHTOOL, shtool, shtool)
- case `$SHTOOL path $CC` in
- *ccache*[)] gcc_ccache=yes;;
- *[)] gcc_ccache=no;;
- esac
-
- if test "$gcc_ccache" = "yes" && (test -z "$CCACHE_DISABLE" || test "$CCACHE_DISABLE" != "1"); then
- AC_MSG_ERROR([ccache must be disabled when --enable-gcov option is used. You can disable ccache by setting environment variable CCACHE_DISABLE=1.])
- fi
-
- lcov_version_list="1.6 1.7 1.8 1.9"
- AC_CHECK_PROG(LCOV, lcov, lcov)
- AC_CHECK_PROG(GENHTML, genhtml, genhtml)
-
- if test "$LCOV"; then
- AC_CACHE_CHECK([for lcov version], glib_cv_lcov_version, [
- glib_cv_lcov_version=invalid
- lcov_version=`$LCOV -v 2>/dev/null | $SED -e 's/^.* //'`
- for lcov_check_version in $lcov_version_list; do
- if test "$lcov_version" = "$lcov_check_version"; then
- glib_cv_lcov_version="$lcov_check_version (ok)"
- fi
- done
- ])
- else
- lcov_msg="To enable code coverage reporting you must have one of the following lcov versions installed: $lcov_version_list"
- AC_MSG_ERROR([$lcov_msg])
- fi
-
- case $glib_cv_lcov_version in
- ""|invalid[)]
- lcov_msg="You must have one of the following versions of lcov: $lcov_version_list (found: $lcov_version)."
- AC_MSG_ERROR([$lcov_msg])
- LCOV="exit 0;"
- ;;
- esac
-
- if test -z "$GENHTML"; then
- AC_MSG_ERROR([Could not find genhtml from the lcov package])
- fi
-
- ac_cv_check_gcov=yes
- ac_cv_check_lcov=yes
-
- # Remove all optimization flags from CFLAGS
- changequote({,})
- CFLAGS=`echo "$CFLAGS" | $SED -e 's/-O[0-9]*//g'`
- changequote([,])
-
- # Add the special gcc flags
- COVERAGE_CFLAGS="-O0 -fprofile-arcs -ftest-coverage"
- COVERAGE_CXXFLAGS="-O0 -fprofile-arcs -ftest-coverage"
- COVERAGE_LDFLAGS="-lgcov"
-
- # Check availability of gcovr
- AC_CHECK_PROG(GCOVR, gcovr, gcovr)
- if test -z "$GCOVR"; then
- ac_cv_check_gcovr=no
- else
- ac_cv_check_gcovr=yes
- fi
-
-fi
-]) # AC_TDD_GCOV
diff --git a/po/Makefile.in.in b/po/Makefile.in.in
deleted file mode 100644
index 06a8cfe..0000000
--- a/po/Makefile.in.in
+++ /dev/null
@@ -1,222 +0,0 @@
-# Makefile for program source directory in GNU NLS utilities package.
-# Copyright (C) 1995, 1996, 1997 by Ulrich Drepper <drepper at gnu.ai.mit.edu>
-# Copyright (C) 2004-2008 Rodney Dawes <dobey.pwns at gmail.com>
-#
-# This file may be copied and used freely without restrictions. It may
-# be used in projects which are not available under a GNU Public License,
-# but which still want to provide support for the GNU gettext functionality.
-#
-# - Modified by Owen Taylor <otaylor at redhat.com> to use GETTEXT_PACKAGE
-# instead of PACKAGE and to look for po2tbl in ./ not in intl/
-#
-# - Modified by jacob berkman <jacob at ximian.com> to install
-# Makefile.in.in and po2tbl.sed.in for use with glib-gettextize
-#
-# - Modified by Rodney Dawes <dobey.pwns at gmail.com> for use with intltool
-#
-# We have the following line for use by intltoolize:
-# INTLTOOL_MAKEFILE
-
-GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
-PACKAGE = @PACKAGE@
-VERSION = @VERSION@
-
-SHELL = @SHELL@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-top_builddir = @top_builddir@
-VPATH = @srcdir@
-
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-datadir = @datadir@
-datarootdir = @datarootdir@
-libdir = @libdir@
-DATADIRNAME = @DATADIRNAME@
-itlocaledir = $(prefix)/$(DATADIRNAME)/locale
-subdir = po
-install_sh = @install_sh@
-# Automake >= 1.8 provides @mkdir_p at .
-# Until it can be supposed, use the safe fallback:
-mkdir_p = $(install_sh) -d
-
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-
-GMSGFMT = @GMSGFMT@
-MSGFMT = @MSGFMT@
-XGETTEXT = @XGETTEXT@
-INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-MSGMERGE = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist
-GENPOT = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot
-
-ALL_LINGUAS = @ALL_LINGUAS@
-
-PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi)
-
-USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi)
-
-USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done)
-
-POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done)
-
-DISTFILES = Makefile.in.in POTFILES.in $(POFILES)
-EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS
-
-POTFILES = \
-# This comment gets stripped out
-
-CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done)
-
-.SUFFIXES:
-.SUFFIXES: .po .pox .gmo .mo .msg .cat
-
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-INTLTOOL_V_MSGFMT = $(INTLTOOL__v_MSGFMT_$(V))
-INTLTOOL__v_MSGFMT_= $(INTLTOOL__v_MSGFMT_$(AM_DEFAULT_VERBOSITY))
-INTLTOOL__v_MSGFMT_0 = @echo " MSGFMT" $@;
-
-.po.pox:
- $(MAKE) $(GETTEXT_PACKAGE).pot
- $(MSGMERGE) $< $(GETTEXT_PACKAGE).pot -o $*.pox
-
-.po.mo:
- $(INTLTOOL_V_MSGFMT)$(MSGFMT) -o $@ $<
-
-.po.gmo:
- $(INTLTOOL_V_MSGFMT)file=`echo $* | sed 's,.*/,,'`.gmo \
- && rm -f $$file && $(GMSGFMT) -o $$file $<
-
-.po.cat:
- sed -f ../intl/po2msg.sed < $< > $*.msg \
- && rm -f $@ && gencat $@ $*.msg
-
-
-all: all- at USE_NLS@
-
-all-yes: $(CATALOGS)
-all-no:
-
-$(GETTEXT_PACKAGE).pot: $(POTFILES)
- $(GENPOT)
-
-install: install-data
-install-data: install-data- at USE_NLS@
-install-data-no: all
-install-data-yes: all
- linguas="$(USE_LINGUAS)"; \
- for lang in $$linguas; do \
- dir=$(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES; \
- $(mkdir_p) $$dir; \
- if test -r $$lang.gmo; then \
- $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \
- echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \
- else \
- $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \
- echo "installing $(srcdir)/$$lang.gmo as" \
- "$$dir/$(GETTEXT_PACKAGE).mo"; \
- fi; \
- if test -r $$lang.gmo.m; then \
- $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \
- echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \
- else \
- if test -r $(srcdir)/$$lang.gmo.m ; then \
- $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \
- $$dir/$(GETTEXT_PACKAGE).mo.m; \
- echo "installing $(srcdir)/$$lang.gmo.m as" \
- "$$dir/$(GETTEXT_PACKAGE).mo.m"; \
- else \
- true; \
- fi; \
- fi; \
- done
-
-# Empty stubs to satisfy archaic automake needs
-dvi info ctags tags CTAGS TAGS ID:
-
-# Define this as empty until I found a useful application.
-install-exec installcheck:
-
-uninstall:
- linguas="$(USE_LINGUAS)"; \
- for lang in $$linguas; do \
- rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \
- rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \
- done
-
-check: all $(GETTEXT_PACKAGE).pot
- rm -f missing notexist
- srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m
- if [ -r missing -o -r notexist ]; then \
- exit 1; \
- fi
-
-mostlyclean:
- rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp
- rm -f .intltool-merge-cache
-
-clean: mostlyclean
-
-distclean: clean
- rm -f Makefile Makefile.in POTFILES stamp-it
- rm -f *.mo *.msg *.cat *.cat.m *.gmo
-
-maintainer-clean: distclean
- @echo "This command is intended for maintainers to use;"
- @echo "it deletes files that may require special tools to rebuild."
- rm -f Makefile.in.in
-
-distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
-dist distdir: $(DISTFILES)
- dists="$(DISTFILES)"; \
- extra_dists="$(EXTRA_DISTFILES)"; \
- for file in $$extra_dists; do \
- test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \
- done; \
- for file in $$dists; do \
- test -f $$file || file="$(srcdir)/$$file"; \
- ln $$file $(distdir) 2> /dev/null \
- || cp -p $$file $(distdir); \
- done
-
-update-po: Makefile
- $(MAKE) $(GETTEXT_PACKAGE).pot
- tmpdir=`pwd`; \
- linguas="$(USE_LINGUAS)"; \
- for lang in $$linguas; do \
- echo "$$lang:"; \
- result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \
- if $$result; then \
- if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
- rm -f $$tmpdir/$$lang.new.po; \
- else \
- if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
- :; \
- else \
- echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
- rm -f $$tmpdir/$$lang.new.po; \
- exit 1; \
- fi; \
- fi; \
- else \
- echo "msgmerge for $$lang.gmo failed!"; \
- rm -f $$tmpdir/$$lang.new.po; \
- fi; \
- done
-
-Makefile POTFILES: stamp-it
- @if test ! -f $@; then \
- rm -f stamp-it; \
- $(MAKE) stamp-it; \
- fi
-
-stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in
- cd $(top_builddir) \
- && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \
- $(SHELL) ./config.status
-
-# Tell versions [3.59,3.63) of GNU make not to export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/po/POTFILES.in b/po/POTFILES.in
deleted file mode 100644
index d886310..0000000
--- a/po/POTFILES.in
+++ /dev/null
@@ -1,8 +0,0 @@
-[type: gettext/ini] data/remote-logon-service.conf.in
-src/server.c
-src/remote-logon.c
-src/rdp-server.c
-src/citrix-server.c
-src/x2go-server.c
-src/main.c
-src/uccs-server.c
diff --git a/src/Makefile.am b/src/Makefile.am
deleted file mode 100644
index fa9b8c7..0000000
--- a/src/Makefile.am
+++ /dev/null
@@ -1,69 +0,0 @@
-pkglibexec_PROGRAMS = \
- remote-logon-service
-
-EXTRA_DIST = \
- org.ArcticaProject.RemoteLogon.xml
-
-noinst_LTLIBRARIES = \
- libservers.la \
- libgenerated.la
-
-################################
-# libgenerated
-################################
-
-libgenerated_la_SOURCES = \
- remote-logon.c \
- remote-logon.h
-libgenerated_la_CFLAGS = \
- $(SERVICE_CFLAGS)
-$(libgenerated_la_SOURCES): org.ArcticaProject.RemoteLogon.xml
- gdbus-codegen \
- --interface-prefix org.ArcticaProject \
- --generate-c remote-logon \
- $^
-
-BUILT_SOURCES = $(libgenerated_la_SOURCES)
-CLEANFILES = $(BUILT_SOURCES)
-
-################################
-# libservers
-################################
-
-libservers_la_SOURCES = \
- citrix-server.c \
- citrix-server.h \
- rdp-server.c \
- rdp-server.h \
- x2go-server.c \
- x2go-server.h \
- uccs-server.c \
- uccs-server.h \
- defines.h \
- server.c \
- server.h \
- crypt.c \
- crypt.h
-libservers_la_CFLAGS = \
- -DUCCS_QUERY_TOOL="\"thin-client-config-agent\"" \
- $(SERVICE_CFLAGS) \
- $(COVERAGE_CFLAGS)
-libservers_la_LDFLAGS = \
- $(COVERAGE_LDFLAGS) $(GCRYPT_LIBS) -lm
-
-################################
-# remote-logon-service
-################################
-
-remote_logon_service_CFLAGS = \
- -DDEFAULT_CONFIG_FILE="\"$(sysconfdir)/remote-logon-service.conf\"" \
- $(SERVICE_CFLAGS) \
- $(COVERAGE_CFLAGS)
-remote_logon_service_LDADD = \
- $(builddir)/libservers.la \
- $(builddir)/libgenerated.la \
- $(SERVICE_LIBS)
-remote_logon_service_LDFLAGS = \
- $(COVERAGE_LDFLAGS)
-remote_logon_service_SOURCES = \
- main.c
diff --git a/src/citrix-server.c b/src/citrix-server.c
deleted file mode 100644
index e7d4e1d..0000000
--- a/src/citrix-server.c
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Copyright © 2012 Canonical Ltd.
- * Copyright © 2015 The Arctica Project
- *
- * This program is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 3, as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranties of
- * MERCHANTABILITY, SATISFACTORY QUALITY, 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, see <http://www.gnu.org/licenses/>.
- *
- * Authors: Ted Gould <ted at canonical.com>
- * Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <sys/mman.h>
-
-#include <glib/gi18n.h>
-
-#include <string.h>
-
-#include "citrix-server.h"
-#include "defines.h"
-
-static void citrix_server_class_init (CitrixServerClass *klass);
-static void citrix_server_init (CitrixServer *self);
-static void citrix_server_dispose (GObject *object);
-static void citrix_server_finalize (GObject *object);
-static GVariant * get_properties (Server * server);
-
-G_DEFINE_TYPE (CitrixServer, citrix_server, SERVER_TYPE);
-
-static void
-citrix_server_class_init (CitrixServerClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- object_class->dispose = citrix_server_dispose;
- object_class->finalize = citrix_server_finalize;
-
- ServerClass * server_class = SERVER_CLASS(klass);
-
- server_class->get_properties = get_properties;
-
- return;
-}
-
-static void
-citrix_server_init (CitrixServer *self)
-{
- self->username = NULL;
- self->password = NULL;
- self->domain = NULL;
- self->domain_required = FALSE;
-
- return;
-}
-
-static void
-citrix_server_dispose (GObject *object)
-{
-
- G_OBJECT_CLASS (citrix_server_parent_class)->dispose (object);
- return;
-}
-
-/* Unlocks the memory before freeing */
-static void
-password_clear (gpointer data)
-{
- char * pass = (char *)data;
- munlock(pass, strlen(pass));
- g_free(pass);
- return;
-}
-
-static void
-citrix_server_finalize (GObject *object)
-{
- CitrixServer * server = CITRIX_SERVER(object);
-
- g_clear_pointer(&server->username, g_free);
- g_clear_pointer(&server->password, password_clear);
- g_clear_pointer(&server->domain, g_free);
-
- G_OBJECT_CLASS (citrix_server_parent_class)->finalize (object);
- return;
-}
-
-static GVariant *
-get_properties (Server * server)
-{
- CitrixServer * cserver = CITRIX_SERVER(server);
-
- GVariantBuilder propbuilder;
- g_variant_builder_init(&propbuilder, G_VARIANT_TYPE_ARRAY);
-
- GVariantBuilder namebuilder;
- g_variant_builder_init(&namebuilder, G_VARIANT_TYPE_TUPLE);
- g_variant_builder_add_value(&namebuilder, g_variant_new_string("username"));
- g_variant_builder_add_value(&namebuilder, g_variant_new_boolean(TRUE));
- if (cserver->username == NULL) {
- g_variant_builder_add_value(&namebuilder, g_variant_new_variant(g_variant_new_string("")));
- } else {
- g_variant_builder_add_value(&namebuilder, g_variant_new_variant(g_variant_new_string(cserver->username)));
- }
- g_variant_builder_add_value(&namebuilder, g_variant_parse(G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL));
- g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&namebuilder));
-
- GVariantBuilder passbuilder;
- g_variant_builder_init(&passbuilder, G_VARIANT_TYPE_TUPLE);
- g_variant_builder_add_value(&passbuilder, g_variant_new_string("password"));
- g_variant_builder_add_value(&passbuilder, g_variant_new_boolean(TRUE));
- if (cserver->password == NULL) {
- g_variant_builder_add_value(&passbuilder, g_variant_new_variant(g_variant_new_string("")));
- } else {
- g_variant_builder_add_value(&passbuilder, g_variant_new_variant(g_variant_new_string(cserver->password)));
- }
- g_variant_builder_add_value(&passbuilder, g_variant_parse(G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL));
- g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&passbuilder));
-
- GVariantBuilder domainbuilder;
- g_variant_builder_init(&domainbuilder, G_VARIANT_TYPE_TUPLE);
- g_variant_builder_add_value(&domainbuilder, g_variant_new_string("domain"));
- g_variant_builder_add_value(&domainbuilder, g_variant_new_boolean(cserver->domain_required));
- if (cserver->domain == NULL) {
- g_variant_builder_add_value(&domainbuilder, g_variant_new_variant(g_variant_new_string("")));
- } else {
- g_variant_builder_add_value(&domainbuilder, g_variant_new_variant(g_variant_new_string(cserver->domain)));
- }
- g_variant_builder_add_value(&domainbuilder, g_variant_parse(G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL));
- g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&domainbuilder));
-
- return g_variant_builder_end(&propbuilder);
-}
-
-Server *
-citrix_server_new_from_keyfile (GKeyFile * keyfile, const gchar * groupname)
-{
- g_return_val_if_fail(keyfile != NULL, NULL); /* NOTE: No way to check if that's really a keyfile :-( */
- g_return_val_if_fail(groupname != NULL, NULL);
-
- if (!g_key_file_has_group(keyfile, groupname)) {
- g_warning("Server specified but group '%s' was not found", groupname);
- return NULL;
- }
-
- CitrixServer * server = g_object_new(CITRIX_SERVER_TYPE, NULL);
-
- if (g_key_file_has_key(keyfile, groupname, CONFIG_SERVER_NAME, NULL)) {
- gchar * keyname = g_key_file_get_string(keyfile, groupname, CONFIG_SERVER_NAME, NULL);
- server->parent.name = g_strdup(_(keyname));
- g_free(keyname);
- }
-
- if (g_key_file_has_key(keyfile, groupname, CONFIG_SERVER_URI, NULL)) {
- server->parent.uri = g_key_file_get_string(keyfile, groupname, CONFIG_SERVER_URI, NULL);
- }
-
- return SERVER(server);
-}
-
-/* Build the Citrix server from information in the JSON object */
-Server *
-citrix_server_new_from_json (JsonObject * object)
-{
- CitrixServer * server = g_object_new(CITRIX_SERVER_TYPE, NULL);
-
- if (json_object_has_member(object, JSON_SERVER_NAME)) {
- JsonNode * node = json_object_get_member(object, JSON_SERVER_NAME);
- if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) {
- const gchar * name = json_node_get_string(node);
- server->parent.name = g_strdup(name);
- }
- }
-
- if (json_object_has_member(object, JSON_URI)) {
- JsonNode * node = json_object_get_member(object, JSON_URI);
- if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) {
- const gchar * uri = json_node_get_string(node);
- server->parent.uri = g_strdup(uri);
- }
- }
-
- if (json_object_has_member(object, JSON_USERNAME)) {
- JsonNode * node = json_object_get_member(object, JSON_USERNAME);
- if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) {
- const gchar * username = json_node_get_string(node);
- server->username = g_strdup(username);
- }
- }
-
- if (json_object_has_member(object, JSON_PASSWORD)) {
- JsonNode * node = json_object_get_member(object, JSON_PASSWORD);
- if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) {
- const gchar * password = json_node_get_string(node);
- server->password = g_strdup(password);
- mlock(server->password, strlen(server->password));
- }
- }
-
- if (json_object_has_member(object, JSON_DOMAIN)) {
- JsonNode * node = json_object_get_member(object, JSON_DOMAIN);
- if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) {
- const gchar * domain = json_node_get_string(node);
- server->domain = g_strdup(domain);
- }
- }
-
- if (json_object_has_member(object, JSON_DOMAIN_REQ)) {
- JsonNode * node = json_object_get_member(object, JSON_DOMAIN_REQ);
- if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_BOOLEAN) {
- server->domain_required = json_node_get_boolean(node);
- }
- }
-
- return SERVER(server);
-}
diff --git a/src/citrix-server.h b/src/citrix-server.h
deleted file mode 100644
index 376fbd6..0000000
--- a/src/citrix-server.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright © 2012 Canonical Ltd.
- * Copyright © 2015 The Arctica Project
- *
- * This program is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 3, as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranties of
- * MERCHANTABILITY, SATISFACTORY QUALITY, 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, see <http://www.gnu.org/licenses/>.
- *
- * Authors: Ted Gould <ted at canonical.com>
- * Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
- */
-
-#ifndef __CITRIX_SERVER_H__
-#define __CITRIX_SERVER_H__
-
-#include <glib-object.h>
-#include <json-glib/json-glib.h>
-#include "server.h"
-
-G_BEGIN_DECLS
-
-#define CITRIX_SERVER_TYPE (citrix_server_get_type ())
-#define CITRIX_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CITRIX_SERVER_TYPE, CitrixServer))
-#define CITRIX_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CITRIX_SERVER_TYPE, CitrixServerClass))
-#define IS_CITRIX_SERVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CITRIX_SERVER_TYPE))
-#define IS_CITRIX_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CITRIX_SERVER_TYPE))
-#define CITRIX_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CITRIX_SERVER_TYPE, CitrixServerClass))
-
-typedef struct _CitrixServer CitrixServer;
-typedef struct _CitrixServerClass CitrixServerClass;
-
-struct _CitrixServerClass {
- ServerClass parent_class;
-};
-
-struct _CitrixServer {
- Server parent;
-
- gchar * username;
- gchar * password;
- gchar * domain;
- gboolean domain_required;
-};
-
-GType citrix_server_get_type (void);
-Server * citrix_server_new_from_keyfile (GKeyFile * keyfile, const gchar * name);
-Server * citrix_server_new_from_json (JsonObject * object);
-
-G_END_DECLS
-
-#endif
diff --git a/src/crypt.c b/src/crypt.c
deleted file mode 100644
index 4e8775f..0000000
--- a/src/crypt.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright © 2012 Canonical Ltd.
- * Copyright © 2015 The Arctica Project
- *
- * This program is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 3, as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranties of
- * MERCHANTABILITY, SATISFACTORY QUALITY, 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include <glib.h>
-
-#include <gcrypt.h>
-#include <math.h>
-
-#include "crypt.h"
-
-static gcry_cipher_hd_t
-setup_cipher (const gchar * password)
-{
- gcry_error_t gcryError;
- gcry_cipher_hd_t gcryHandle;
-
- const size_t keyLength = gcry_cipher_get_algo_keylen(GCRY_CIPHER_AES);
- const size_t blkLength = gcry_cipher_get_algo_blklen(GCRY_CIPHER_AES);
-
- // We are assuming keyLength and blkLength are the same, check it
- if (keyLength != blkLength)
- return NULL;
-
- char * aesSymKey = malloc(blkLength);
- const size_t passwordLength = strlen(password);
- strncpy(aesSymKey, password, blkLength);
- size_t i;
- for (i = passwordLength; i < blkLength; ++i)
- aesSymKey[i] = 0;
-
- gcryError = gcry_cipher_open(&gcryHandle, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_CBC, 0);
- if (gcryError) {
- g_warning("gcry_cipher_open failed: %s/%s\n", gcry_strsource(gcryError), gcry_strerror(gcryError));
- return NULL;
- }
-
- gcryError = gcry_cipher_setkey(gcryHandle, aesSymKey, keyLength);
- if (gcryError) {
- g_warning("gcry_cipher_setkey failed: %s/%s\n", gcry_strsource(gcryError), gcry_strerror(gcryError));
- gcry_cipher_close(gcryHandle);
- return NULL;
- }
-
- // Use the key as IV too
- gcryError = gcry_cipher_setiv(gcryHandle, aesSymKey, blkLength);
- if (gcryError) {
- g_warning("gcry_cipher_setiv failed: %s/%s\n", gcry_strsource(gcryError), gcry_strerror(gcryError));
- gcry_cipher_close(gcryHandle);
- return NULL;
- }
-
- return gcryHandle;
-}
-
-/**
- * do_aes_encrypt:
- * @origBuffer: text to encrypt. Needs to be null terminated
- * @password: password to use. Will be cut/padded with 0 if it exceeds/does not reach the needed length
- * @outBufferLength: (out) On success contains the length of the returned buffer
- *
- * Returns the AES encrypted version of the text. It is responsability of the caller to free it
- */
-gchar *
-do_aes_encrypt(const gchar *origBuffer, const gchar * password, size_t *outBufferLength)
-{
- gcry_error_t gcryError;
- gcry_cipher_hd_t gcryHandle;
-
- gcryHandle = setup_cipher (password);
- if (gcryHandle == NULL) {
- return NULL;
- }
-
- const size_t blkLength = gcry_cipher_get_algo_blklen(GCRY_CIPHER_AES);
- const size_t origBufferLength = strlen(origBuffer);
- const size_t bufferLength = ceil((double)origBufferLength / blkLength) * blkLength;
- gchar *buffer = malloc(bufferLength);
- memcpy(buffer, origBuffer, origBufferLength);
- int i;
- for (i = origBufferLength; i < bufferLength; ++i)
- buffer[i] = 0;
-
- char * encBuffer = malloc(bufferLength);
- size_t lengthDone = 0;
- while (lengthDone < bufferLength) {
- gcryError = gcry_cipher_encrypt(gcryHandle, &encBuffer[lengthDone], blkLength, &buffer[lengthDone], blkLength);
- if (gcryError) {
- g_warning("gcry_cipher_encrypt failed: %s/%s\n", gcry_strsource(gcryError), gcry_strerror(gcryError));
- gcry_cipher_close(gcryHandle);
- free(encBuffer);
- return NULL;
- }
- lengthDone += blkLength;
- }
-
- gcry_cipher_close(gcryHandle);
-
- *outBufferLength = bufferLength;
- return encBuffer;
-}
-
-/**
- * do_aes_encrypt:
- * @encBuffer: encrypted data
- * @password: password to use. Will be cut/padded with 0 if it exceeds/does not reach the needed length
- * @encBufferLength: Length of encBuffer
- *
- * Returns the AES decrypted version of the data. It is null terminated. It is responsability of the caller to free it
- */
-gchar *
-do_aes_decrypt(const gchar *encBuffer, const gchar * password, const size_t encBufferLength)
-{
- gcry_error_t gcryError;
- gcry_cipher_hd_t gcryHandle;
-
- gcryHandle = setup_cipher (password);
- if (gcryHandle == NULL) {
- return NULL;
- }
-
- const size_t blkLength = gcry_cipher_get_algo_blklen(GCRY_CIPHER_AES128);
- const size_t bufferLength = encBufferLength;
- char * outBuffer = malloc(bufferLength);
- size_t lengthDone = 0;
- while (lengthDone < bufferLength) {
- gcryError = gcry_cipher_decrypt(gcryHandle, &outBuffer[lengthDone], 16, &encBuffer[lengthDone], 16);
- if (gcryError)
- {
- g_warning("gcry_cipher_decrypt failed: %s/%s\n", gcry_strsource(gcryError), gcry_strerror(gcryError));
- return NULL;
- }
- lengthDone += blkLength;
- }
-
- gcry_cipher_close(gcryHandle);
- char *result = g_strndup(outBuffer, bufferLength);
- free(outBuffer);
- return result;
-}
diff --git a/src/crypt.h b/src/crypt.h
deleted file mode 100644
index 89fd780..0000000
--- a/src/crypt.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright © 2012 Canonical Ltd.
- * Copyright © 2015 The Arctica Project
- *
- * This program is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 3, as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranties of
- * MERCHANTABILITY, SATISFACTORY QUALITY, 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef __CRYPT_H__
-#define __CRYPT_H__
-
-gchar * do_aes_encrypt(const gchar * buffer, const gchar * password, size_t *outBufferLength);
-gchar * do_aes_decrypt(const gchar * encBuffer, const gchar * password, const size_t encBufferLength);
-
-#endif
diff --git a/src/defines.h b/src/defines.h
deleted file mode 100644
index a29d90f..0000000
--- a/src/defines.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright © 2012 Canonical Ltd.
- * Copyright © 2015 The Arctica Project
- *
- * This program is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 3, as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranties of
- * MERCHANTABILITY, SATISFACTORY QUALITY, 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, see <http://www.gnu.org/licenses/>.
- *
- * Authors: Ted Gould <ted at canonical.com>
- * Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
- */
-
-#ifndef __DEFINES_H__
-#define __DEFINES_H__
-
-#define CONFIG_MAIN_GROUP "Remote Logon Service"
-#define CONFIG_MAIN_SERVERS "Servers"
-#define CONFIG_SERVER_PREFIX "Server"
-#define CONFIG_SERVER_NAME "Name"
-#define CONFIG_SERVER_URI "URI"
-
-#define CONFIG_UCCS_EXEC "Exec"
-#define CONFIG_UCCS_NETWORK "NetworkRequired"
-#define CONFIG_UCCS_NETWORK_NONE "None"
-#define CONFIG_UCCS_NETWORK_GLOBAL "Global"
-#define CONFIG_UCCS_VERIFY "VerifyServer"
-
-#define CONFIG_SERVER_TYPE "Type"
-#define CONFIG_SERVER_TYPE_RDP "RDP"
-#define CONFIG_SERVER_TYPE_ICA "ICA"
-#define CONFIG_SERVER_TYPE_X2GO "X2GO"
-#define CONFIG_SERVER_TYPE_UCCS "UCCS"
-
-#define JSON_PROTOCOL "Protocol"
-#define JSON_SERVER_NAME "Name"
-#define JSON_URI "URL"
-#define JSON_USERNAME "Username"
-#define JSON_PASSWORD "Password"
-#define JSON_DOMAIN_REQ "DomainRequired"
-#define JSON_DOMAIN "WindowsDomain"
-#define JSON_SESSIONTYPE "SessionType"
-#define JSON_SESSIONTYPE_REQ "SessionTypeRequired"
-
-#endif /* __DEFINES_H__ */
diff --git a/src/main.c b/src/main.c
deleted file mode 100644
index 7c0a806..0000000
--- a/src/main.c
+++ /dev/null
@@ -1,458 +0,0 @@
-/*
- * Copyright © 2012 Canonical Ltd.
- * Copyright © 2015 The Arctica Project
- *
- * This program is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 3, as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranties of
- * MERCHANTABILITY, SATISFACTORY QUALITY, 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, see <http://www.gnu.org/licenses/>.
- *
- * Authors: Ted Gould <ted at canonical.com>
- * Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <glib.h>
-#include <glib/gi18n.h>
-
-/* NOTE: Required to build without optimizations */
-#include <locale.h>
-
-#include "remote-logon.h"
-#include "defines.h"
-
-#include "server.h"
-#include "rdp-server.h"
-#include "citrix-server.h"
-#include "uccs-server.h"
-#include "x2go-server.h"
-#include "crypt.h"
-
-gint server_list_to_array (GVariantBuilder * builder, GList * items);
-
-enum {
- ERROR_SERVER_URI,
- ERROR_LOGIN
-};
-
-GList * config_file_servers = NULL;
-
-/* Get the error domain for this module */
-static GQuark
-error_domain (void)
-{
- static GQuark value = 0;
- if (value == 0) {
- value = g_quark_from_static_string("remote-logon-service");
- }
- return value;
-}
-
-/* When one of the state changes on the server emit that so that everone knows there
- might be a new server available. */
-static void
-server_status_updated (Server * server, ServerState newstate, RemoteLogon * rl)
-{
- GVariant * array = NULL;
-
- GVariantBuilder builder;
- g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);
-
- if (server_list_to_array(&builder, config_file_servers) > 0) {
- array = g_variant_builder_end(&builder);
- } else {
- g_variant_builder_clear(&builder);
- array = g_variant_new_array(G_VARIANT_TYPE("(sssba(sbva{sv})a(si))"), NULL, 0);
- }
-
- remote_logon_emit_servers_updated(rl, array);
- return;
-}
-
-/* Looks for the config file and does some basic parsing to pull out the UCCS servers
- that are configured in it */
-static void
-find_config_file (GKeyFile * parsed, const gchar * cmnd_line, RemoteLogon * rl)
-{
- GError * error = NULL;
- const gchar * file = DEFAULT_CONFIG_FILE;
-
- if (cmnd_line != NULL) {
- file = cmnd_line;
- }
-
- if (!g_key_file_load_from_file(parsed, file, G_KEY_FILE_NONE, &error)) {
- g_warning("Unable to parse config file '%s': %s", file, error->message);
- g_error_free(error);
- return;
- }
-
- if (!g_key_file_has_group(parsed, CONFIG_MAIN_GROUP)) {
- g_warning("Config file '%s' doesn't have group '" CONFIG_MAIN_GROUP "'", file);
- /* Probably should clear the keyfile, but there doesn't seem to be a way to do that */
- return;
- }
-
- if (g_key_file_has_key(parsed, CONFIG_MAIN_GROUP, CONFIG_MAIN_SERVERS, NULL)) {
- gchar ** grouplist = g_key_file_get_string_list(parsed, CONFIG_MAIN_GROUP, CONFIG_MAIN_SERVERS, NULL, NULL);
- int i = 0;
- gchar * groupsuffix;
-
- for (groupsuffix = grouplist[0], i = 0; groupsuffix != NULL; groupsuffix = grouplist[++i]) {
- gchar * groupname = g_strdup_printf("%s %s", CONFIG_SERVER_PREFIX, groupsuffix);
- Server * server = server_new_from_keyfile(parsed, groupname);
- g_free(groupname);
-
- if (server == NULL) {
- /* Assume a relevant error is printed above */
- continue;
- }
-
- config_file_servers = g_list_append(config_file_servers, server);
- g_signal_connect(server, SERVER_SIGNAL_STATE_CHANGED, G_CALLBACK(server_status_updated), rl);
- }
-
- g_strfreev(grouplist);
- }
-
- /* Signal the list of servers so that we're sure everyone's got them. This is to
- solve a possible race where someone could ask while we're configuring these. */
- server_status_updated(NULL, SERVER_STATE_ALLGOOD, rl);
- return;
-}
-
-gint
-server_list_to_array (GVariantBuilder * builder, GList * items)
-{
- gint servercnt = 0;
- GList * head = NULL;
- for (head = items; head != NULL; head = g_list_next(head)) {
- Server * server = SERVER(head->data);
-
- /* We only want servers that are all good */
- if (server->state != SERVER_STATE_ALLGOOD) {
- continue;
- }
-
- servercnt++;
- GVariant * variant = server_get_variant(server);
- g_variant_builder_add_value(builder, variant);
- }
-
- return servercnt;
-}
-
-static gboolean
-handle_get_servers (RemoteLogon * rl, GDBusMethodInvocation * invocation, gpointer user_data)
-{
- GVariant * array = NULL;
-
- GVariantBuilder builder;
- g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);
-
- if (server_list_to_array(&builder, config_file_servers) > 0) {
- array = g_variant_builder_end(&builder);
- } else {
- g_variant_builder_clear(&builder);
- array = g_variant_new_array(G_VARIANT_TYPE("(sssba(sbva{sv})a(si))"), NULL, 0);
- }
-
- g_dbus_method_invocation_return_value(invocation, g_variant_new_tuple(&array, 1));
-
- return TRUE;
-}
-
-/* Handle the situation of whether we unlock or not and respond over
- DBus with either an error or the list of servers. */
-static void
-handle_get_servers_login_cb (UccsServer * server, gboolean unlocked, gpointer user_data)
-{
- GDBusMethodInvocation * invocation = (GDBusMethodInvocation *)user_data;
- const gchar * sender = g_dbus_method_invocation_get_sender(invocation);
-
- GVariantBuilder builder;
- g_variant_builder_init(&builder, G_VARIANT_TYPE_TUPLE);
-
- /* Signal whether we're unlocked */
- g_variant_builder_add_value(&builder, g_variant_new_boolean(unlocked));
-
- /* Only network, no caching yet */
- g_variant_builder_add_value(&builder, g_variant_new_string("network"));
-
- /* Get the array of servers */
- GVariant * array = uccs_server_get_servers(server, sender);
- g_variant_builder_add_value(&builder, array);
-
- g_dbus_method_invocation_return_value(invocation, g_variant_builder_end(&builder));
- return;
-}
-
-/* Handle the GetServerForLogin DBus call */
-static gboolean
-handle_get_servers_login (RemoteLogon * rl, GDBusMethodInvocation * invocation, gpointer user_data)
-{
- GVariant * params = g_dbus_method_invocation_get_parameters(invocation);
- const gchar * sender = g_dbus_method_invocation_get_sender(invocation);
-
- GVariant * child = NULL;
- const gchar * uri = NULL;
-
- child = g_variant_get_child_value(params, 0);
- uri = g_variant_get_string(child, NULL);
- g_variant_unref(child); /* fine as we know params is still ref'd */
-
- GList * lserver = NULL;
- Server * server = NULL;
- for (lserver = config_file_servers; lserver != NULL; lserver = g_list_next(lserver)) {
- server = SERVER(lserver->data);
-
- if (server == NULL) {
- continue;
- }
-
- if (!IS_UCCS_SERVER(server)) {
- continue;
- }
-
- if (g_strcmp0(server->uri, uri) == 0) {
- break;
- }
- }
-
- if (lserver == NULL) {
- /* Couldn't find something with that URI, we're done, thanks. */
- g_dbus_method_invocation_return_error(invocation,
- error_domain(),
- ERROR_SERVER_URI,
- "Unable to find a server with the URI: '%s'",
- uri);
-
- return TRUE;
- }
-
- /* Unlock the Server */
- const gchar * username = NULL;
- const gchar * password = NULL;
- gboolean allowcache = FALSE;
-
- child = g_variant_get_child_value(params, 1);
- username = g_variant_get_string(child, NULL);
- g_variant_unref(child); /* fine as we know params is still ref'd */
-
- child = g_variant_get_child_value(params, 2);
- password = g_variant_get_string(child, NULL);
- g_variant_unref(child); /* fine as we know params is still ref'd */
-
- child = g_variant_get_child_value(params, 3);
- allowcache = g_variant_get_boolean(child);
- g_variant_unref(child);
-
- /* Try to login and mark us as servicing the message */
- uccs_server_unlock(UCCS_SERVER(server), sender, username, password, allowcache, handle_get_servers_login_cb, invocation);
- return TRUE;
-}
-
-/* Look through a list of servers to see if one matches a URL */
-static Server *
-handle_get_domains_list_helper (GList * list, const gchar * uri)
-{
- if (list == NULL) return NULL;
-
- Server * inserver = SERVER(list->data);
-
- if (inserver == NULL) {
- return handle_get_domains_list_helper(g_list_next(list), uri);
- }
-
- Server * outserver = server_find_uri(inserver, uri);
-
- if (outserver != NULL) {
- return outserver;
- }
-
- return handle_get_domains_list_helper(g_list_next(list), uri);
-}
-
-/* Get the cached domains for a server */
-static gboolean
-handle_get_domains (RemoteLogon * rl, GDBusMethodInvocation * invocation, gpointer user_data)
-{
- GVariant * params = g_dbus_method_invocation_get_parameters(invocation);
-
- GVariant * child = NULL;
- const gchar * uri = NULL;
-
- child = g_variant_get_child_value(params, 0);
- uri = g_variant_get_string(child, NULL);
- g_variant_unref(child); /* fine as we know params is still ref'd */
-
- Server * server = handle_get_domains_list_helper(config_file_servers, uri);
-
- GVariant * domains = NULL;
- if (server != NULL) {
- domains = server_cached_domains(server);
- } else {
- domains = g_variant_new_array(G_VARIANT_TYPE_STRING, NULL, 0);
- }
-
- if (domains == NULL) {
- /* Couldn't find something with that URI, we're done, thanks. */
- g_dbus_method_invocation_return_error(invocation,
- error_domain(),
- ERROR_SERVER_URI,
- "Unable to find a server with the URI: '%s'",
- uri);
-
- return TRUE;
- }
-
- g_dbus_method_invocation_return_value(invocation, g_variant_new_tuple(&domains, 1));
-
- return TRUE;
-}
-
-/* Set a given server as last used */
-static gboolean
-handle_set_last_used_server (RemoteLogon * rl, GDBusMethodInvocation * invocation, gpointer user_data)
-{
- GVariant * params = g_dbus_method_invocation_get_parameters(invocation);
-
- GVariant * child = NULL;
- const gchar * uccsUri = NULL;
- const gchar * serverUri = NULL;
-
- child = g_variant_get_child_value(params, 0);
- uccsUri = g_variant_get_string(child, NULL);
- g_variant_unref(child); /* fine as we know params is still ref'd */
-
- child = g_variant_get_child_value(params, 1);
- serverUri = g_variant_get_string(child, NULL);
- g_variant_unref(child); /* fine as we know params is still ref'd */
-
- GList * lserver = NULL;
- Server * server = NULL;
- for (lserver = config_file_servers; lserver != NULL; lserver = g_list_next(lserver)) {
- server = SERVER(lserver->data);
-
- if (server == NULL) {
- continue;
- }
-
- if (!IS_UCCS_SERVER(server)) {
- continue;
- }
-
- if (g_strcmp0(server->uri, uccsUri) == 0) {
- break;
- }
- }
-
- if (server != NULL) {
- server_set_last_used_server (server, serverUri);
- }
-
- g_dbus_method_invocation_return_value(invocation, NULL);
-
- return TRUE;
-}
-
-/* If we loose the name, tell the world and there's not much we can do */
-static void
-name_lost (GDBusConnection * connection, const gchar * name, gpointer user_data)
-{
- GMainLoop * mainloop = (GMainLoop *)user_data;
-
- g_warning("Unable to get name '%s'. Exiting.", name);
- g_main_loop_quit(mainloop);
-
- return;
-}
-
-static gchar * cmnd_line_config = NULL;
-
-static GOptionEntry general_options[] = {
- {"config-file", 'c', 0, G_OPTION_ARG_FILENAME, &cmnd_line_config, N_("Configuration file for the remote logon service. Defaults to '/etc/remote-logon-service.conf'."), N_("key_file")},
- {NULL}
-};
-
-int
-main (int argc, char * argv[])
-{
- GError * error = NULL;
-
-#if !GLIB_CHECK_VERSION (2, 35, 1)
- /* Init the GTypes */
- g_type_init();
-#endif
-
- /* Setup i18n */
- setlocale (LC_ALL, "");
- bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
- textdomain (GETTEXT_PACKAGE);
-
- /* Create our global variables */
- GKeyFile * config = g_key_file_new();
- GMainLoop * mainloop = g_main_loop_new(NULL, FALSE);
-
- /* Handle command line parameters */
- GOptionContext * context;
- context = g_option_context_new(_("- Determine the remote servers that can be logged into"));
- g_option_context_add_main_entries(context, general_options, "remote-logon-service");
-
- if (!g_option_context_parse(context, &argc, &argv, &error)) {
- g_print("option parsing failed: %s\n", error->message);
- g_error_free(error);
- return 1;
- }
-
- /* Start up D' Bus */
- GDBusConnection * session_bus = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL /* cancel */, &error);
- if (error != NULL) {
- g_error("Unable to get session bus: %s", error->message);
- g_error_free(error);
- return -1;
- }
-
- /* Build Dbus Interface */
- RemoteLogon * skel = remote_logon_skeleton_new();
- /* Export it */
- g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(skel),
- session_bus,
- "/org/ArcticaProject/RemoteLogon",
- NULL);
- g_signal_connect(skel, "handle-get-servers", G_CALLBACK(handle_get_servers), NULL);
- g_signal_connect(skel, "handle-get-servers-for-login", G_CALLBACK(handle_get_servers_login), NULL);
- g_signal_connect(skel, "handle-get-cached-domains-for-server", G_CALLBACK(handle_get_domains), NULL);
- g_signal_connect(skel, "handle-set-last-used-server", G_CALLBACK(handle_set_last_used_server), NULL);
-
- g_bus_own_name_on_connection(session_bus,
- "org.ArcticaProject.RemoteLogon",
- G_BUS_NAME_OWNER_FLAGS_NONE,
- NULL, /* aquired handler */
- name_lost,
- mainloop,
- NULL); /* mainloop free */
-
- /* Parse config file */
- find_config_file(config, cmnd_line_config, skel);
-
- /* Loop forever */
- g_main_loop_run(mainloop);
-
- g_main_loop_unref(mainloop);
- g_object_unref(config);
-
- g_free(cmnd_line_config);
-
- return 0;
-}
diff --git a/src/org.ArcticaProject.RemoteLogon.xml b/src/org.ArcticaProject.RemoteLogon.xml
deleted file mode 100644
index 9e1bd26..0000000
--- a/src/org.ArcticaProject.RemoteLogon.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-<?xml version="1.0"?>
-<node name="/">
- <interface name="org.ArcticaProject.RemoteLogon">
- <!-- SERVER LIST DOCS - it's in a few places :-)
- s: server type: "ica", "freerdp", "x2go", "uccs"
- s: server name
- s: server uri
- b: last used server
- a(sbva{sv}): properties for the server
- s: type: "username", "password", "domain", "email", "sessiontype"
- b: required
- v: default value
- a{sv}: properties for the value
- for value 'domain': a list of possible domains (ica, freerdp)
- "domains": a(s)
- for value 'domain': a list of domains that are read only
- "read-only": b
- for value 'sessiontype': TODO -> a subset of session profile parameters...
- "nothing-yet": s
- a(si): applications pinned for the server
- s: ID of the application (desktop file)
- i: position the application is pinned in
- -->
-
-<!-- Methods -->
- <method name="GetServers">
- <!-- Get the servers that are available on the local network
- that don't need a login to get -->
- <arg type="a(sssba(sbva{sv})a(si))" name="serverList" direction="out" />
- </method>
- <method name="GetServersForLogin">
- <arg type="s" name="uri" direction="in" />
- <arg type="s" name="emailAddress" direction="in" />
- <arg type="s" name="password" direction="in" />
- <arg type="b" name="allowCache" direction="in" />
-
- <arg type="b" name="loginSuccess" direction="out" />
- <arg type="s" name="dataType" direction="out">
- <!-- Should be either "cached" or "network" depending on where the data
- was gotten from -->
- </arg>
- <arg type="a(sssba(sbva{sv})a(si))" name="serverList" direction="out" />
- </method>
- <method name="GetCachedDomainsForServer">
- <arg type="s" name="uri" direction="in" />
- <arg type="as" name="domains" direction="out" />
- </method>
- <method name="SetApplicationsForServer">
- <arg type="s" name="uccsUri" direction="in" />
- <!-- UCCS URI is optional and only needed for servers that
- are under a UCCS account. NULL string if not used. -->
- <arg type="s" name="serverUri" direction="in" />
- <arg type="a(si)" name="applications" direction="in" />
- </method>
- <method name="SetLastUsedServer">
- <arg type="s" name="uccsUri" direction="in" />
- <arg type="s" name="serverUri" direction="in" />
- </method>
-
-<!-- Signals -->
- <signal name="ServersUpdated">
- <arg type="a(sssba(sbva{sv})a(si))" name="serverList" direction="out" />
- </signal>
- <signal name="LoginServersUpdated">
- <!-- Note: This IS NOT a broadcast signal, it will only be
- signaled to folks who have previously called 'GetServersForLogin'
- with a valid password -->
- <arg type="s" name="uri" direction="out" />
- <arg type="s" name="emailAddress" direction="out" />
- <arg type="s" name="dataType" direction="out" />
-
- <arg type="a(sssba(sbva{sv})a(si))" name="serverList" direction="out" />
- </signal>
- <signal name="LoginChanged">
- <!-- This is sent if, for some reason, we think that the folks who
- had previously called GetServersForLogin need to recall it. Those
- who do not will not be sent 'LoginServersUpdated' signals. -->
- <arg type="s" name="uri" direction="out" />
- <arg type="s" name="emailAddress" direction="out" />
- </signal>
-
- </interface>
-</node>
diff --git a/src/rdp-server.c b/src/rdp-server.c
deleted file mode 100644
index d489314..0000000
--- a/src/rdp-server.c
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Copyright © 2012 Canonical Ltd.
- * Copyright © 2015 The Arctica Project
- *
- * This program is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 3, as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranties of
- * MERCHANTABILITY, SATISFACTORY QUALITY, 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, see <http://www.gnu.org/licenses/>.
- *
- * Authors: Ted Gould <ted at canonical.com>
- * Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <sys/mman.h>
-
-#include <glib/gi18n.h>
-
-#include <string.h>
-
-#include "rdp-server.h"
-#include "defines.h"
-
-static void rdp_server_class_init (RdpServerClass *klass);
-static void rdp_server_init (RdpServer *self);
-static void rdp_server_dispose (GObject *object);
-static void rdp_server_finalize (GObject *object);
-static GVariant * get_properties (Server * server);
-
-G_DEFINE_TYPE (RdpServer, rdp_server, SERVER_TYPE);
-
-static void
-rdp_server_class_init (RdpServerClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- object_class->dispose = rdp_server_dispose;
- object_class->finalize = rdp_server_finalize;
-
- ServerClass * server_class = SERVER_CLASS(klass);
-
- server_class->get_properties = get_properties;
-
- return;
-}
-
-static void
-rdp_server_init (RdpServer *self)
-{
- self->username = NULL;
- self->password = NULL;
- self->domain = NULL;
- self->domain_required = FALSE;
-
- return;
-}
-
-static void
-rdp_server_dispose (GObject *object)
-{
-
- G_OBJECT_CLASS (rdp_server_parent_class)->dispose (object);
- return;
-}
-
-/* Unlocks the memory before freeing */
-static void
-password_clear (gpointer data)
-{
- char * pass = (char *)data;
- munlock(pass, strlen(pass));
- g_free(pass);
- return;
-}
-
-static void
-rdp_server_finalize (GObject *object)
-{
- RdpServer * server = RDP_SERVER(object);
-
- g_clear_pointer(&server->username, g_free);
- g_clear_pointer(&server->password, password_clear);
- g_clear_pointer(&server->domain, g_free);
-
- G_OBJECT_CLASS (rdp_server_parent_class)->finalize (object);
- return;
-}
-
-static GVariant *
-get_properties (Server * server)
-{
- RdpServer * rserver = RDP_SERVER(server);
-
- GVariantBuilder propbuilder;
- g_variant_builder_init(&propbuilder, G_VARIANT_TYPE_ARRAY);
-
- GVariantBuilder namebuilder;
- g_variant_builder_init(&namebuilder, G_VARIANT_TYPE_TUPLE);
- g_variant_builder_add_value(&namebuilder, g_variant_new_string("username"));
- g_variant_builder_add_value(&namebuilder, g_variant_new_boolean(TRUE));
- if (rserver->username == NULL) {
- g_variant_builder_add_value(&namebuilder, g_variant_new_variant(g_variant_new_string("")));
- } else {
- g_variant_builder_add_value(&namebuilder, g_variant_new_variant(g_variant_new_string(rserver->username)));
- }
- g_variant_builder_add_value(&namebuilder, g_variant_parse(G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL));
- g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&namebuilder));
-
- GVariantBuilder passbuilder;
- g_variant_builder_init(&passbuilder, G_VARIANT_TYPE_TUPLE);
- g_variant_builder_add_value(&passbuilder, g_variant_new_string("password"));
- g_variant_builder_add_value(&passbuilder, g_variant_new_boolean(TRUE));
- if (rserver->password == NULL) {
- g_variant_builder_add_value(&passbuilder, g_variant_new_variant(g_variant_new_string("")));
- } else {
- g_variant_builder_add_value(&passbuilder, g_variant_new_variant(g_variant_new_string(rserver->password)));
- }
- g_variant_builder_add_value(&passbuilder, g_variant_parse(G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL));
- g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&passbuilder));
-
- GVariantBuilder domainbuilder;
- g_variant_builder_init(&domainbuilder, G_VARIANT_TYPE_TUPLE);
- g_variant_builder_add_value(&domainbuilder, g_variant_new_string("domain"));
- g_variant_builder_add_value(&domainbuilder, g_variant_new_boolean(rserver->domain_required));
- if (rserver->domain == NULL) {
- g_variant_builder_add_value(&domainbuilder, g_variant_new_variant(g_variant_new_string("")));
- } else {
- g_variant_builder_add_value(&domainbuilder, g_variant_new_variant(g_variant_new_string(rserver->domain)));
- }
- g_variant_builder_add_value(&domainbuilder, g_variant_parse(G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL));
- g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&domainbuilder));
-
- return g_variant_builder_end(&propbuilder);
-}
-
-Server *
-rdp_server_new_from_keyfile (GKeyFile * keyfile, const gchar * groupname)
-{
- g_return_val_if_fail(keyfile != NULL, NULL); /* NOTE: No way to check if that's really a keyfile :-( */
- g_return_val_if_fail(groupname != NULL, NULL);
-
- if (!g_key_file_has_group(keyfile, groupname)) {
- g_warning("Server specified but group '%s' was not found", groupname);
- return NULL;
- }
-
- RdpServer * server = g_object_new(RDP_SERVER_TYPE, NULL);
-
- if (g_key_file_has_key(keyfile, groupname, CONFIG_SERVER_NAME, NULL)) {
- gchar * keyname = g_key_file_get_string(keyfile, groupname, CONFIG_SERVER_NAME, NULL);
- server->parent.name = g_strdup(_(keyname));
- g_free(keyname);
- }
-
- if (g_key_file_has_key(keyfile, groupname, CONFIG_SERVER_URI, NULL)) {
- server->parent.uri = g_key_file_get_string(keyfile, groupname, CONFIG_SERVER_URI, NULL);
- }
-
- return SERVER(server);
-}
-
-/* Build the RDP server from information in the JSON object */
-Server *
-rdp_server_new_from_json (JsonObject * object)
-{
- RdpServer * server = g_object_new(RDP_SERVER_TYPE, NULL);
-
- if (json_object_has_member(object, JSON_SERVER_NAME)) {
- JsonNode * node = json_object_get_member(object, JSON_SERVER_NAME);
- if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) {
- const gchar * name = json_node_get_string(node);
- server->parent.name = g_strdup(name);
- }
- }
-
- if (json_object_has_member(object, JSON_URI)) {
- JsonNode * node = json_object_get_member(object, JSON_URI);
- if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) {
- const gchar * uri = json_node_get_string(node);
- server->parent.uri = g_strdup(uri);
- }
- }
-
- if (json_object_has_member(object, JSON_USERNAME)) {
- JsonNode * node = json_object_get_member(object, JSON_USERNAME);
- if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) {
- const gchar * username = json_node_get_string(node);
- server->username = g_strdup(username);
- }
- }
-
- if (json_object_has_member(object, JSON_PASSWORD)) {
- JsonNode * node = json_object_get_member(object, JSON_PASSWORD);
- if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) {
- const gchar * password = json_node_get_string(node);
- server->password = g_strdup(password);
- mlock(server->password, strlen(server->password));
- }
- }
-
- if (json_object_has_member(object, JSON_DOMAIN)) {
- JsonNode * node = json_object_get_member(object, JSON_DOMAIN);
- if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) {
- const gchar * domain = json_node_get_string(node);
- server->domain = g_strdup(domain);
- }
- }
-
- if (json_object_has_member(object, JSON_DOMAIN_REQ)) {
- JsonNode * node = json_object_get_member(object, JSON_DOMAIN_REQ);
- if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_BOOLEAN) {
- server->domain_required = json_node_get_boolean(node);
- }
- }
-
- return SERVER(server);
-}
diff --git a/src/rdp-server.h b/src/rdp-server.h
deleted file mode 100644
index 1339d86..0000000
--- a/src/rdp-server.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright © 2012 Canonical Ltd.
- * Copyright © 2015 The Arctica Project
- *
- * This program is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 3, as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranties of
- * MERCHANTABILITY, SATISFACTORY QUALITY, 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, see <http://www.gnu.org/licenses/>.
- *
- * Authors: Ted Gould <ted at canonical.com>
- * Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
- */
-
-#ifndef __RDP_SERVER_H__
-#define __RDP_SERVER_H__
-
-#include <glib-object.h>
-#include <json-glib/json-glib.h>
-#include "server.h"
-
-G_BEGIN_DECLS
-
-#define RDP_SERVER_TYPE (rdp_server_get_type ())
-#define RDP_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RDP_SERVER_TYPE, RdpServer))
-#define RDP_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RDP_SERVER_TYPE, RdpServerClass))
-#define IS_RDP_SERVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RDP_SERVER_TYPE))
-#define IS_RDP_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RDP_SERVER_TYPE))
-#define RDP_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RDP_SERVER_TYPE, RdpServerClass))
-
-typedef struct _RdpServer RdpServer;
-typedef struct _RdpServerClass RdpServerClass;
-
-struct _RdpServerClass {
- ServerClass parent_class;
-};
-
-struct _RdpServer {
- Server parent;
-
- gchar * username;
- gchar * password;
- gchar * domain;
- gboolean domain_required;
-};
-
-GType rdp_server_get_type (void);
-Server * rdp_server_new_from_keyfile (GKeyFile * keyfile, const gchar * name);
-Server * rdp_server_new_from_json (JsonObject * object);
-
-G_END_DECLS
-
-#endif
diff --git a/src/server.c b/src/server.c
deleted file mode 100644
index 3272b76..0000000
--- a/src/server.c
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * Copyright © 2012 Canonical Ltd.
- * Copyright © 2015 The Arctica Project
- *
- * This program is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 3, as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranties of
- * MERCHANTABILITY, SATISFACTORY QUALITY, 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, see <http://www.gnu.org/licenses/>.
- *
- * Authors: Ted Gould <ted at canonical.com>
- * Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "server.h"
-#include "defines.h"
-#include "citrix-server.h"
-#include "rdp-server.h"
-#include "uccs-server.h"
-#include "x2go-server.h"
-
-static void server_class_init (ServerClass *klass);
-static void server_init (Server *self);
-static void server_dispose (GObject *object);
-static void server_finalize (GObject *object);
-
-/* Signals */
-enum {
- STATE_CHANGED,
- LAST_SIGNAL
-};
-
-G_DEFINE_TYPE (Server, server, G_TYPE_OBJECT);
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-static void
-server_class_init (ServerClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- object_class->dispose = server_dispose;
- object_class->finalize = server_finalize;
-
- signals[STATE_CHANGED] = g_signal_new(SERVER_SIGNAL_STATE_CHANGED,
- G_TYPE_FROM_CLASS(klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET(ServerClass, state_changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__INT,
- G_TYPE_NONE, 1, G_TYPE_INT, G_TYPE_NONE);
-
- return;
-}
-
-static void
-server_init (Server *self)
-{
- self->name = NULL;
- self->uri = NULL;
- self->last_used = FALSE;
- self->state = SERVER_STATE_ALLGOOD;
-
- return;
-}
-
-static void
-server_dispose (GObject *object)
-{
-
- G_OBJECT_CLASS (server_parent_class)->dispose (object);
- return;
-}
-
-static void
-server_finalize (GObject *object)
-{
- Server * server = SERVER(object);
-
- g_free(server->name);
- g_free(server->uri);
-
- G_OBJECT_CLASS (server_parent_class)->finalize (object);
- return;
-}
-
-/**
- * server_new_from_keyfile:
- * @keyfile: The keyfile with the @group in it to define the server
- * @group: Group name for this server
- *
- * Looks at a group within the keyfile and builds a server based on
- * it's type. Mostly works with a subclass based on the type.
- *
- * Return value: A new Server object or NULL if error
- */
-Server *
-server_new_from_keyfile (GKeyFile * keyfile, const gchar * group)
-{
- g_return_val_if_fail(keyfile != NULL, NULL);
- g_return_val_if_fail(group != NULL, NULL);
-
- if (!g_key_file_has_group(keyfile, group)) {
- return NULL;
- }
-
- gchar * type = NULL;
- if (g_key_file_has_key(keyfile, group, CONFIG_SERVER_TYPE, NULL)) {
- type = g_key_file_get_string(keyfile, group, CONFIG_SERVER_TYPE, NULL);
- }
-
- if (g_strcmp0(type, CONFIG_SERVER_TYPE_RDP) == 0) {
- return SERVER(rdp_server_new_from_keyfile(keyfile, group));
- } else if (g_strcmp0(type, CONFIG_SERVER_TYPE_ICA) == 0) {
- return SERVER(citrix_server_new_from_keyfile(keyfile, group));
- } else {
- return SERVER(uccs_server_new_from_keyfile(keyfile, group));
- }
-
- return NULL;
-}
-
-/**
- * server_new_from_json:
- * @object: JSON object with server definition
- *
- * Looks at the type and then uses a subclassed function to build the
- * server.
- *
- * Return value: A new Server object or NULL if error
- */
-Server *
-server_new_from_json (JsonObject * object)
-{
- g_return_val_if_fail(object != NULL, NULL);
-
- if (!json_object_has_member(object, "Protocol")) {
- return NULL;
- }
-
- JsonNode * proto_node = json_object_get_member(object, "Protocol");
- if (JSON_NODE_TYPE(proto_node) != JSON_NODE_VALUE) {
- return NULL;
- }
- if (json_node_get_value_type(proto_node) != G_TYPE_STRING) {
- return NULL;
- }
-
- const gchar * proto = json_node_get_string(proto_node);
- Server * newserver = NULL;
-
- if (g_strcmp0(proto, "ICA") == 0 || g_strcmp0(proto, "ica") == 0) {
- newserver = citrix_server_new_from_json(object);
- }
- else if (g_strcmp0(proto, "freerdp") == 0 || g_strcmp0(proto, "rdp") == 0 || g_strcmp0(proto, "RDP") == 0 || g_strcmp0(proto, "FreeRDP") == 0) {
- newserver = rdp_server_new_from_json(object);
- }
- else if (g_strcmp0(proto, "x2go") == 0 || g_strcmp0(proto, "X2go") == 0 || g_strcmp0(proto, "X2Go") == 0 || g_strcmp0(proto, "X2GO") == 0 || g_strcmp0(proto, "x2GO") == 0 || g_strcmp0(proto, "x2gO") == 0) {
- newserver = x2go_server_new_from_json(object);
- }
-
- return newserver;
-}
-
-GVariant *
-server_get_variant (Server * server)
-{
- /* Okay, this doesn't do anything useful, but it will generate an error
- which could be a good thing */
- g_return_val_if_fail(IS_SERVER(server), NULL);
-
- ServerClass * klass = SERVER_GET_CLASS(server);
- if (klass->get_properties != NULL) {
- GVariantBuilder tuple;
- g_variant_builder_init(&tuple, G_VARIANT_TYPE_TUPLE);
-
- if (IS_CITRIX_SERVER(server)) {
- g_variant_builder_add_value(&tuple, g_variant_new_string("ica"));
- } else if (IS_RDP_SERVER(server)) {
- g_variant_builder_add_value(&tuple, g_variant_new_string("freerdp"));
- } else if (IS_UCCS_SERVER(server)) {
- g_variant_builder_add_value(&tuple, g_variant_new_string("uccs"));
- } else if (IS_X2GO_SERVER(server)) {
- g_variant_builder_add_value(&tuple, g_variant_new_string("x2go"));
- } else {
- g_assert_not_reached();
- }
-
- if (server->name != NULL) {
- g_variant_builder_add_value(&tuple, g_variant_new_string(server->name));
- } else {
- g_warning("Server has no name");
- g_variant_builder_add_value(&tuple, g_variant_new_string(""));
- }
-
- if (server->uri != NULL) {
- g_variant_builder_add_value(&tuple, g_variant_new_string(server->uri));
- } else {
- g_warning("Server has no URI");
- g_variant_builder_add_value(&tuple, g_variant_new_string(""));
- }
-
- g_variant_builder_add_value(&tuple, g_variant_new_boolean(server->last_used));
-
- GVariant * props = klass->get_properties(server);
- g_variant_builder_add_value(&tuple, props);
-
- if (klass->get_applications != NULL) {
- GVariant * array = klass->get_applications(server);
- g_variant_builder_add_value(&tuple, array);
- } else {
- /* NULL array of applications */
- g_variant_builder_add_value(&tuple, g_variant_new_array(G_VARIANT_TYPE("(si)"), NULL, 0));
- }
-
- return g_variant_builder_end(&tuple);
- }
-
- return NULL;
-}
-
-/**
- * server_cached_domains:
- * @server: Where should we find those domains?
- *
- * Gets a list of cached domains for a particular server, if this function
- * isn't overriden, then a null array is returned.
- */
-GVariant *
-server_cached_domains (Server * server)
-{
- g_return_val_if_fail(IS_SERVER(server), NULL);
-
- ServerClass * klass = SERVER_GET_CLASS(server);
- if (klass->get_domains != NULL) {
- return klass->get_domains(server);
- }
-
- return g_variant_new_array(G_VARIANT_TYPE_STRING, NULL, 0);
-}
-
-/**
- * server_find_uri:
- * @server: Server to look in
- * @uri: URI to search for
- *
- * Checks the URI of this server to see if it matches, and then look
- * to see if subclasses have a way to match it another way.
- */
-Server *
-server_find_uri (Server * server, const gchar * uri)
-{
- g_return_val_if_fail(IS_SERVER(server), NULL);
-
- if (g_strcmp0(server->uri, uri) == 0) {
- return server;
- }
-
- ServerClass * klass = SERVER_GET_CLASS(server);
-
- if (klass->find_uri != NULL) {
- return klass->find_uri(server, uri);
- }
-
- return NULL;
-}
-
-/**
- * server_set_last_used:
- * @server: Server to look in
- * @uri: URI to set as last used
- *
- * Checks the URI of this server to see if it matches, and then look
- * to see if subclasses have a way to match it another way.
- */
-void
-server_set_last_used_server (Server * server, const gchar * uri)
-{
- g_return_if_fail(IS_SERVER(server));
-
- if (g_strcmp0(server->uri, uri) == 0) {
- server->last_used = TRUE;
- } else {
- ServerClass * klass = SERVER_GET_CLASS(server);
-
- if (klass->set_last_used_server != NULL) {
- klass->set_last_used_server(server, uri);
- }
- }
-}
diff --git a/src/server.h b/src/server.h
deleted file mode 100644
index b3fe77b..0000000
--- a/src/server.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright © 2012 Canonical Ltd.
- * Copyright © 2015 The Arctica Project
- *
- * This program is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 3, as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranties of
- * MERCHANTABILITY, SATISFACTORY QUALITY, 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, see <http://www.gnu.org/licenses/>.
- *
- * Authors: Ted Gould <ted at canonical.com>
- * Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
- */
-
-#ifndef __SERVER_H__
-#define __SERVER_H__
-
-#include <glib-object.h>
-#include <json-glib/json-glib.h>
-
-G_BEGIN_DECLS
-
-#define SERVER_TYPE (server_get_type ())
-#define SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SERVER_TYPE, Server))
-#define SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SERVER_TYPE, ServerClass))
-#define IS_SERVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SERVER_TYPE))
-#define IS_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SERVER_TYPE))
-#define SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SERVER_TYPE, ServerClass))
-
-#define SERVER_SIGNAL_STATE_CHANGED "state-changed"
-
-typedef struct _Server Server;
-typedef struct _ServerClass ServerClass;
-typedef enum _ServerState ServerState;
-
-enum _ServerState {
- SERVER_STATE_ALLGOOD,
- SERVER_STATE_UNAVAILABLE
-};
-
-struct _ServerClass {
- GObjectClass parent_class;
- GVariant * (*get_properties) (Server * server);
- GVariant * (*get_applications) (Server * server);
- GVariant * (*get_domains) (Server * server);
- Server * (*find_uri) (Server * server, const gchar * uri);
- void (*set_last_used_server) (Server * server, const gchar * uri);
-
- /* signals */
- void (*state_changed) (Server * server, ServerState newstate, gpointer user_data);
-};
-
-struct _Server {
- GObject parent;
-
- gchar * name;
- gchar * uri;
- gboolean last_used;
-
- ServerState state;
-};
-
-GType server_get_type (void);
-Server * server_new_from_keyfile (GKeyFile * keyfile, const gchar * group);
-Server * server_new_from_json (JsonObject * object);
-GVariant * server_get_variant (Server * server);
-GVariant * server_cached_domains (Server * server);
-Server * server_find_uri (Server * server, const gchar * uri);
-void server_set_last_used_server (Server * server, const gchar * uri);
-
-G_END_DECLS
-
-#endif
diff --git a/src/uccs-server.c b/src/uccs-server.c
deleted file mode 100644
index a87e4d1..0000000
--- a/src/uccs-server.c
+++ /dev/null
@@ -1,958 +0,0 @@
-/*
- * Copyright © 2012 Canonical Ltd.
- * Copyright © 2015 The Arctica Project
- *
- * This program is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 3, as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranties of
- * MERCHANTABILITY, SATISFACTORY QUALITY, 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, see <http://www.gnu.org/licenses/>.
- *
- * Authors: Ted Gould <ted at canonical.com>
- * Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <glib.h>
-#include <glib/gi18n.h>
-
-#include <json-glib/json-glib.h>
-
-#include <gio/gunixinputstream.h>
-#include <gio/gunixoutputstream.h>
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "uccs-server.h"
-#include "defines.h"
-
-#include "rdp-server.h"
-#include "citrix-server.h"
-
-#include "crypt.h"
-
-static void uccs_server_class_init (UccsServerClass *klass);
-static void uccs_server_init (UccsServer *self);
-static void uccs_server_dispose (GObject *object);
-static void uccs_server_finalize (GObject *object);
-static GVariant * get_properties (Server * server);
-static void json_waiters_notify (UccsServer * server, gboolean unlocked);
-static GVariant * get_cached_domains (Server * server);
-static Server * find_uri (Server * server, const gchar * uri);
-static void set_last_used_server (Server * server, const gchar * uri);
-static void evaluate_state (UccsServer * server);
-static void nm_state_changed (NMClient *client, const GParamSpec *pspec, gpointer user_data);
-
-typedef struct _json_callback_t json_callback_t;
-struct _json_callback_t {
- gchar * sender;
- void (*callback) (UccsServer * server, gboolean unlocked, gpointer user_data);
- gpointer userdata;
-};
-
-G_DEFINE_TYPE (UccsServer, uccs_server, SERVER_TYPE);
-
-/* Static global client so we don't keep reallocating them. We only need
- one really */
-static NMClient * global_client = NULL;
-
-static void
-uccs_server_class_init (UccsServerClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- object_class->dispose = uccs_server_dispose;
- object_class->finalize = uccs_server_finalize;
-
- ServerClass * server_class = SERVER_CLASS(klass);
-
- server_class->get_properties = get_properties;
- /* UCCS can't have applications */
- server_class->get_applications = NULL;
- server_class->get_domains = get_cached_domains;
- server_class->find_uri = find_uri;
- server_class->set_last_used_server = set_last_used_server;
-
- return;
-}
-
-static void
-uccs_server_init (UccsServer *self)
-{
- self->exec = g_find_program_in_path(UCCS_QUERY_TOOL);
-
- self->username = NULL;
- self->password = NULL;
-
- self->lovers = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
-
- self->subservers = NULL;
-
- self->json_waiters = NULL;
- self->json_watch = 0;
- self->json_pid = 0;
-
- self->json_stream = NULL;
- self->pass_stream = NULL;
-
- self->min_network = NM_STATE_CONNECTED_GLOBAL;
- self->last_network = NM_STATE_DISCONNECTED;
- self->nm_client = NULL;
- self->nm_signal = 0;
-
- /* Start as unavailable */
- self->parent.state = SERVER_STATE_UNAVAILABLE;
-
- if (global_client == NULL) {
- global_client = nm_client_new();
-
- if (global_client != NULL) {
- g_object_add_weak_pointer(G_OBJECT(global_client), (gpointer *)&global_client);
- self->nm_client = global_client;
- }
- } else {
- self->nm_client = g_object_ref(global_client);
- }
-
- if (self->nm_client != NULL) {
- self->nm_signal = g_signal_connect(self->nm_client, "notify::" NM_CLIENT_STATE, G_CALLBACK(nm_state_changed), self);
- }
-
- self->verify_server = TRUE;
- self->verified_server = FALSE;
- self->session = NULL;
-
- /* Need the soup session before the state changed */
- self->session = soup_session_sync_new();
-
- nm_state_changed(self->nm_client, NULL, self);
- evaluate_state(self);
-
- return;
-}
-
-/* Small function to try and figure out the state of the server and set the
- status appropriately */
-static void
-evaluate_state (UccsServer * server)
-{
- ServerState tempstate = SERVER_STATE_ALLGOOD;
-
- if (server->exec == NULL) {
- tempstate = SERVER_STATE_UNAVAILABLE;
- }
-
- if (server->last_network < server->min_network) {
- tempstate = SERVER_STATE_UNAVAILABLE;
- }
-
- if (server->verify_server && !server->verified_server && server->min_network > NM_STATE_DISCONNECTED) {
- tempstate = SERVER_STATE_UNAVAILABLE;
- }
-
- if (tempstate != server->parent.state) {
- server->parent.state = tempstate;
- g_signal_emit_by_name(server, SERVER_SIGNAL_STATE_CHANGED, server->parent.state);
- }
-
- return;
-}
-
-struct _hash_helper {
- GVariant * params;
- GDBusConnection * session;
-};
-
-/* GHashTable foreach item */
-static gboolean
-clear_hash_helper (gpointer key, gpointer value, gpointer user_data)
-{
- struct _hash_helper * helper = (struct _hash_helper *)user_data;
- GError * error = NULL;
-
- g_dbus_connection_emit_signal(helper->session,
- (const gchar *)key, /* dest */
- "/org/ArcticaProject/RemoteLogon", /* object path */
- "org.ArcticaProject.RemoteLogon", /* interface name */
- "org.ArcticaProject.RemoteLogon.LoginChanged", /* signal name */
- helper->params, /* params */
- &error);
-
- if (error != NULL) {
- g_warning("Unable to signal UCCS server shutdown: %s", error->message);
- g_error_free(error);
- }
-
- return TRUE;
-}
-
-/* Clear the hash table by going through it and signaling */
-static void
-clear_hash (UccsServer * server)
-{
- if (g_hash_table_size(server->lovers) == 0) {
- return;
- }
-
- g_return_if_fail(server->parent.uri != NULL);
- g_return_if_fail(server->username != NULL);
-
- GDBusConnection * session = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, NULL); /* Shouldn't block, we should have it */
- GVariant * param = g_variant_new("(ss)", server->parent.uri, server->username); /* params */
- g_variant_ref_sink(param);
-
- struct _hash_helper helper;
- helper.params = param;
- helper.session = session;
-
- g_hash_table_foreach_remove(server->lovers, clear_hash_helper, &helper);
-
- g_object_unref(session);
- g_variant_unref(param);
-
- return;
-}
-
-/* Clear the JSON task and waiters */
-static void
-clear_json (UccsServer * self)
-{
- if (self->json_watch != 0) {
- g_source_remove(self->json_watch);
- self->json_watch = 0;
- }
-
- if (self->json_pid != 0) {
- g_spawn_close_pid(self->json_pid);
- self->json_pid = 0;
- }
-
- if (self->json_stream != NULL) {
- g_input_stream_close(self->json_stream, NULL, NULL);
- g_object_unref(self->json_stream);
- self->json_stream = NULL;
- }
-
- if (self->pass_stream != NULL) {
- g_output_stream_close(self->pass_stream, NULL, NULL);
- g_object_unref(self->pass_stream);
- self->pass_stream = NULL;
- }
-
- json_waiters_notify(self, FALSE);
-
- return;
-}
-
-/* Clean up references */
-static void
-uccs_server_dispose (GObject *object)
-{
- UccsServer * self = UCCS_SERVER(object);
-
- g_clear_object(&self->session);
-
- if (self->nm_signal != 0) {
- g_signal_handler_disconnect(self->nm_client, self->nm_signal);
- self->nm_signal = 0;
- }
-
- g_clear_object(&self->nm_client);
-
- clear_json(self);
-
- if (self->lovers != NULL) {
- clear_hash(self);
- }
-
- g_list_free_full(self->subservers, g_object_unref);
- self->subservers = NULL; /* Ironically the free function is the only GList
- function that doesn't return a new pointer by itself */
-
- G_OBJECT_CLASS (uccs_server_parent_class)->dispose (object);
- return;
-}
-
-/* Clean up memory */
-static void
-uccs_server_finalize (GObject *object)
-{
- UccsServer * self = UCCS_SERVER(object);
-
- g_free(self->exec); self->exec = NULL;
- g_free(self->username); self->username = NULL;
- g_free(self->password); self->password = NULL;
-
- if (self->lovers != NULL) {
- g_hash_table_unref(self->lovers);
- self->lovers = NULL;
- }
-
- G_OBJECT_CLASS (uccs_server_parent_class)->finalize (object);
- return;
-}
-
-/* Callback from the message getting complete */
-static void
-verify_server_cb (SoupSession * session, SoupMessage * message, gpointer user_data)
-{
- UccsServer * server = UCCS_SERVER(user_data);
- guint statuscode = 404;
-
- g_object_get(G_OBJECT(message), SOUP_MESSAGE_STATUS_CODE, &statuscode, NULL);
- g_debug("Verification came back with status: %d", statuscode);
-
- if (statuscode == 200) {
- server->verified_server = TRUE;
- } else {
- server->verified_server = FALSE;
- }
-
- evaluate_state(server);
-
- return;
-}
-
-/* Set up the process to verify the server */
-static void
-verify_server (UccsServer * server)
-{
- g_return_if_fail(server->session != NULL);
-
- if (server->parent.uri == NULL) {
- return;
- }
-
- SoupMessage * message = soup_message_new("HEAD", server->parent.uri);
- soup_session_queue_message(server->session, message, verify_server_cb, server);
- g_debug("Getting HEAD from: %s", server->parent.uri);
-
- return;
-}
-
-/* Callback for when the Network Manger state changes */
-static void
-nm_state_changed (NMClient *client, const GParamSpec *pspec, gpointer user_data)
-{
- g_return_if_fail(IS_UCCS_SERVER(user_data));
- UccsServer * server = UCCS_SERVER(user_data);
-
- if (server->nm_client == NULL || !nm_client_get_manager_running(server->nm_client)) {
- server->last_network = NM_STATE_DISCONNECTED;
- } else {
- server->last_network = nm_client_get_state(server->nm_client);
- }
-
- if (server->last_network == NM_STATE_DISCONNECTED) {
- server->verified_server = FALSE;
- soup_session_abort(server->session);
- }
-
- if (server->last_network == NM_STATE_CONNECTED_GLOBAL && server->verify_server && !server->verified_server) {
- verify_server(server);
- }
-
- evaluate_state(server);
-
- return;
-}
-
-/* Get the properties that can be sent by the greeter for this server */
-static GVariant *
-get_properties (Server * server)
-{
- GVariantBuilder propbuilder;
- g_variant_builder_init(&propbuilder, G_VARIANT_TYPE_ARRAY);
-
- GVariantBuilder namebuilder;
- g_variant_builder_init(&namebuilder, G_VARIANT_TYPE_TUPLE);
- g_variant_builder_add_value(&namebuilder, g_variant_new_string("email"));
- g_variant_builder_add_value(&namebuilder, g_variant_new_boolean(TRUE));
- g_variant_builder_add_value(&namebuilder, g_variant_new_variant(g_variant_new_string("")));
- g_variant_builder_add_value(&namebuilder, g_variant_parse(G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL));
- g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&namebuilder));
-
- GVariantBuilder passbuilder;
- g_variant_builder_init(&passbuilder, G_VARIANT_TYPE_TUPLE);
- g_variant_builder_add_value(&passbuilder, g_variant_new_string("password"));
- g_variant_builder_add_value(&passbuilder, g_variant_new_boolean(TRUE));
- g_variant_builder_add_value(&passbuilder, g_variant_new_variant(g_variant_new_string("")));
- g_variant_builder_add_value(&passbuilder, g_variant_parse(G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL));
- g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&passbuilder));
-
- return g_variant_builder_end(&propbuilder);
-}
-
-/* Set the exec value for the server */
-const gchar *
-uccs_server_set_exec (UccsServer * server, const gchar * exec)
-{
- g_return_val_if_fail(IS_UCCS_SERVER(server), NULL);
-
- g_clear_pointer(&server->exec, g_free);
-
- if (exec != NULL) {
- server->exec = g_find_program_in_path(exec);
- }
-
- evaluate_state(server);
-
- return server->exec;
-}
-
-/* Build a new uccs server from a keyfile and a group in it */
-Server *
-uccs_server_new_from_keyfile (GKeyFile * keyfile, const gchar * groupname)
-{
- g_return_val_if_fail(keyfile != NULL, NULL); /* NOTE: No way to check if that's really a keyfile :-( */
- g_return_val_if_fail(groupname != NULL, NULL);
-
- if (!g_key_file_has_group(keyfile, groupname)) {
- g_warning("Server specified but group '%s' was not found", groupname);
- return NULL;
- }
-
- UccsServer * server = g_object_new(UCCS_SERVER_TYPE, NULL);
-
- if (g_key_file_has_key(keyfile, groupname, CONFIG_SERVER_NAME, NULL)) {
- gchar * keyname = g_key_file_get_string(keyfile, groupname, CONFIG_SERVER_NAME, NULL);
- server->parent.name = g_strdup(_(keyname));
- g_free(keyname);
- }
-
- if (g_key_file_has_key(keyfile, groupname, CONFIG_SERVER_URI, NULL)) {
- server->parent.uri = g_key_file_get_string(keyfile, groupname, CONFIG_SERVER_URI, NULL);
- }
-
- if (g_key_file_has_key(keyfile, groupname, CONFIG_UCCS_EXEC, NULL)) {
- gchar * key = g_key_file_get_string(keyfile, groupname, CONFIG_UCCS_EXEC, NULL);
- uccs_server_set_exec(server, key);
- g_free(key);
- }
-
- if (g_key_file_has_key(keyfile, groupname, CONFIG_UCCS_NETWORK, NULL)) {
- gchar * key = g_key_file_get_string(keyfile, groupname, CONFIG_UCCS_NETWORK, NULL);
-
- if (g_strcmp0(key, CONFIG_UCCS_NETWORK_NONE) == 0) {
- server->min_network = NM_STATE_DISCONNECTED;
- } else if (g_strcmp0(key, CONFIG_UCCS_NETWORK_GLOBAL) == 0) {
- server->min_network = NM_STATE_CONNECTED_GLOBAL;
- }
- /* NOTE: There is a possibility for other network types to be added here,
- but they can be tricky to test. Feel free to patch it, but please include
- those tests :-) */
-
- g_free(key);
- }
-
- if (g_key_file_has_key(keyfile, groupname, CONFIG_UCCS_VERIFY, NULL)) {
- server->verify_server = g_key_file_get_boolean(keyfile, groupname, CONFIG_UCCS_VERIFY, NULL);
- }
-
- evaluate_state(server);
-
- return SERVER(server);
-}
-
-/* Look at the array of RLS data and build a server for each entry
- in the array */
-static gboolean
-parse_rds_array (UccsServer * server, JsonArray * array)
-{
- // Got a new set of servers, delete the old one
- g_list_free_full(server->subservers, g_object_unref);
- server->subservers = NULL;
-
- int i;
- for (i = 0; i < json_array_get_length(array); i++) {
- JsonNode * node = json_array_get_element(array, i);
-
- if (JSON_NODE_TYPE(node) != JSON_NODE_OBJECT) {
- continue;
- }
-
- JsonObject * object = json_node_get_object(node);
- Server * newserver = server_new_from_json(object);
- if (newserver != NULL) {
- server->subservers = g_list_append(server->subservers, newserver);
- }
- }
-
- return TRUE;
-}
-
-/* Parse the JSON content and allocate servers based on that */
-static gboolean
-parse_json (UccsServer * server, GInputStream * json)
-{
- if (json == NULL) return FALSE; /* Shouldn't happen, but let's just handle it */
-
- gboolean passed = TRUE;
- JsonParser * parser = json_parser_new();
- GError * error = NULL;
-
- if (!json_parser_load_from_stream(parser, json, NULL, &error)) {
- g_warning("Unable to parse JSON data: %s", error->message);
- g_error_free(error);
- error = NULL;
- passed = FALSE;
- }
-
- /* Make sure we have a sane root node */
- JsonNode * root_node = NULL;
- if (passed) {
- root_node = json_parser_get_root(parser);
-
-#if 0
- JsonGenerator * gen = json_generator_new();
- json_generator_set_root(gen, root_node);
- gchar * data = json_generator_to_data(gen, NULL);
- g_debug("%s", data);
- g_free(data);
- g_object_unref(G_OBJECT(gen));
-#endif
- }
- if (root_node != NULL && JSON_NODE_TYPE(root_node) != JSON_NODE_OBJECT) {
- g_warning("Root node of JSON data is not an object. It is: %s", json_node_type_name(root_node));
- passed = FALSE;
- }
-
- /* Take our object and see if it has the property that we need */
- JsonObject * root_object = NULL;
- if (passed) {
- root_object = json_node_get_object(root_node);
- }
- if (root_object != NULL && json_object_has_member(root_object, "RemoteDesktopServers")) {
- /* This shows that we have some. It's okay if there aren't any. Seems
- a bit silly, but we're not bitching too much. */
- JsonNode * rds_node = json_object_get_member(root_object, "RemoteDesktopServers");
- if (JSON_NODE_TYPE(rds_node) == JSON_NODE_ARRAY) {
- JsonArray * rds_array = json_node_get_array(rds_node);
- passed = parse_rds_array(server, rds_array);
- } else {
- /* Okay we're a little bit angrier about this one */
- g_warning("Malformed 'RemoteDesktopServer' entry. Not an array but a: %s", json_node_type_name(rds_node));
- passed = FALSE;
- }
-
- if (json_object_has_member(root_object, "DefaultServer")) {
- JsonNode * ds_node = json_object_get_member(root_object, "DefaultServer");
- if (JSON_NODE_TYPE(ds_node) == JSON_NODE_VALUE && json_node_get_value_type(ds_node) == G_TYPE_STRING) {
- const gchar * default_server_name = json_node_get_string(ds_node);
- if (default_server_name != NULL) {
- GList * lserver;
- for (lserver = server->subservers; lserver != NULL; lserver = g_list_next(lserver)) {
- Server * serv = SERVER(lserver->data);
-
- if (g_strcmp0(serv->name, default_server_name) == 0) {
- serv->last_used = TRUE;
- break;
- }
- }
- if (lserver == NULL && strlen(default_server_name) > 0) {
- g_warning("Could not find the 'DefaultServer' server.");
- passed = FALSE;
- }
- }
- } else {
- g_warning("Malformed 'DefaultServer' entry. Not a string value");
- passed = FALSE;
- }
- }
- } else {
- g_debug("No 'RemoteDesktopServers' found");
- }
-
- g_object_unref(parser);
- return passed;
-}
-
-/* Go through the waiters and notify them of the status */
-static void
-json_waiters_notify (UccsServer * server, gboolean unlocked)
-{
- /* NOTE: Taking the list as the call back might add themselves to
- the list so we don't want to have it corrupted in the middle of
- the execution of this function */
- GList * waiters = server->json_waiters;
- server->json_waiters = NULL;
-
- while (waiters != NULL) {
- json_callback_t * json_callback = (json_callback_t *)waiters->data;
-
- if (unlocked) {
- g_hash_table_insert(server->lovers, g_strdup(json_callback->sender), GINT_TO_POINTER(TRUE));
- }
-
- if (json_callback->callback != NULL) {
- json_callback->callback(server, unlocked, json_callback->userdata);
- }
-
- g_free(json_callback->sender);
- g_free(json_callback);
- waiters = g_list_delete_link(waiters, waiters);
- }
-
- return;
-}
-
-/* Callback from when we know that we've got all the JSON we're
- gonna get */
-static void
-json_grab_cb (GPid pid, gint status, gpointer user_data)
-{
- UccsServer * server = UCCS_SERVER(user_data);
-
- server->json_pid = 0;
- server->json_watch = 0;
-
- if (status == 0) {
- gboolean parser = parse_json(server, server->json_stream);
-
- json_waiters_notify(server, parser);
- } else {
- g_free(server->username);
- server->username = NULL;
- g_free(server->password);
- server->password = NULL;
-
- json_waiters_notify(server, FALSE);
- }
-
- /* Drop the Streams -- NOTE: DO NOT CROSS THE STREAMS */
- g_output_stream_close(server->pass_stream, NULL, NULL);
- g_object_unref(server->pass_stream);
- server->pass_stream = NULL;
-
- g_input_stream_close(server->json_stream, NULL, NULL);
- g_object_unref(server->json_stream);
- server->json_stream = NULL;
-
- g_spawn_close_pid(pid);
-
- return;
-}
-
-/* This is the callback for writing the password, it mostly exists
- to free the buffer, but we'll print some info as well just because
- we can */
-static void
-password_write_cb (GObject * src_obj, GAsyncResult * res, gpointer user_data)
-{
- /* Kill the buffer */
- g_free(user_data);
-
- GError * error = NULL;
- g_output_stream_write_finish(G_OUTPUT_STREAM(src_obj), res, &error);
-
- if (error != NULL) {
- g_warning("Unable to write password to UCCS process: %s", error->message);
- g_error_free(error);
- } else {
- g_debug("Wrote password to UCCS process");
- g_output_stream_close(G_OUTPUT_STREAM(src_obj), NULL, NULL);
- }
-
- return;
-}
-
-/**
- * uccs_server_unlock:
- * @server: The server to unlock
- * @address: DBus address of the person unlocking us
- * @username: Username for the UCCS
- * @password: (allow-none) Password to use
- * @allowcache: If using cache is allowed
- * @callback: Function to call when we have an answer
- * @user_data: Data for the callback
- *
- * Unlocks the UCCS server making servers available either from the
- * cache or from the network.
- */
-void
-uccs_server_unlock (UccsServer * server, const gchar * address, const gchar * username, const gchar * password, gboolean allowcache, void (*callback) (UccsServer * server, gboolean unlocked, gpointer user_data), gpointer user_data)
-{
- g_return_if_fail(IS_UCCS_SERVER(server));
- g_return_if_fail(username != NULL);
- g_return_if_fail(address != NULL);
-
- /* Check the current values we have, they might be NULL, which in
- that case they won't match */
- if (allowcache && g_strcmp0(username, server->username) == 0 &&
- g_strcmp0(password, server->password) == 0) {
- g_hash_table_insert(server->lovers, g_strdup(address), GINT_TO_POINTER(TRUE));
-
- if (callback != NULL) {
- callback(server, TRUE, user_data);
- }
-
- return;
- }
-
- g_return_if_fail(server->exec != NULL); /* Shouldn't happen, but I'd feel safer if we checked */
-
- /* If we're not going to allow the cache, just clear it right away */
- if (!allowcache) {
- clear_hash(server);
- }
-
- /* We're changing the username and password, if there were other
- people who had it, they need to know we're different now */
- if (g_strcmp0(username, server->username) != 0 ||
- g_strcmp0(password, server->password) != 0) {
- clear_hash(server);
- clear_json(server);
-
- g_clear_pointer(&server->username, g_free);
- g_clear_pointer(&server->password, g_free);
-
- server->username = g_strdup(username);
- server->password = g_strdup(password);
- }
-
- /* Add ourselves to the queue */
- json_callback_t * json_callback = g_new0(json_callback_t, 1);
- json_callback->sender = g_strdup(address);
- json_callback->callback = callback;
- json_callback->userdata = user_data;
-
- server->json_waiters = g_list_append(server->json_waiters, json_callback);
-
- if (server->json_pid == 0) {
- gint std_in, std_out;
- GError * error = NULL;
-
- const gchar * argv[3];
- argv[0] = server->exec;
- argv[1] = server->username;
- argv[2] = NULL;
-
- g_setenv("SERVER_ROOT", server->parent.uri, TRUE);
-
- g_spawn_async_with_pipes(NULL, /* pwd */
- (gchar **)argv,
- NULL, /* env */
- G_SPAWN_DO_NOT_REAP_CHILD,
- NULL, NULL, /* child setup */
- &server->json_pid,
- &std_in,
- &std_out,
- NULL, /* stderr */
- &error); /* error */
-
- if (error != NULL) {
- g_warning("Unable to start UCCS process: %s", error->message);
- g_error_free(error);
- server->json_pid = 0; /* really shouldn't get changed, but since we're using it to detect if it's running, let's double check, eh? */
- json_waiters_notify(server, FALSE);
- } else {
- /* Watch for when it's done */
- server->json_watch = g_child_watch_add(server->json_pid, json_grab_cb, server);
-
- /* Set up I/O streams */
- server->json_stream = g_unix_input_stream_new(std_out, TRUE);
- server->pass_stream = g_unix_output_stream_new(std_in, TRUE);
-
- gchar * pass = g_strdup(server->password);
- g_output_stream_write_async(server->pass_stream,
- pass,
- strlen(pass), /* number of bytes */
- G_PRIORITY_DEFAULT, /* priority */
- NULL, /* cancellable */
- password_write_cb,
- pass);
- }
- }
-
- return;
-}
-
-/* A little quickie function to handle the null server array */
-inline static GVariant *
-null_server_array (void)
-{
- return g_variant_new_array(G_VARIANT_TYPE("(sssba(sbva{sv})a(si))"),
- NULL, 0);
-}
-
-/**
- * uccs_server_get_servers:
- * @server: Server to get our list from
- * @address: Who's asking
- *
- * Will get a valid variant with servers. If the asker hasn't unlocked us
- * then the list will always be empty.
- *
- * Return value: A variant array
- */
-GVariant *
-uccs_server_get_servers (UccsServer * server, const gchar * address)
-{
- g_return_val_if_fail(IS_UCCS_SERVER(server), null_server_array());
- g_return_val_if_fail(address != NULL, null_server_array());
-
- if (!GPOINTER_TO_INT(g_hash_table_lookup(server->lovers, address))) {
- g_warning("Address '%s' is not authorized", address);
- return null_server_array();
- }
-
- gchar *last_used_server_name = NULL;
- if (server->username != NULL && server->password != NULL) {
- gchar *username_sha = g_compute_checksum_for_string (G_CHECKSUM_SHA256, server->username, -1);
- gchar *file_path = g_build_path ("/", g_get_user_cache_dir(), "remote-logon-service", "cache", username_sha, NULL);
- gchar *encryptedContents;
- gsize encryptedContentsLength;
- if (g_file_get_contents (file_path, &encryptedContents, &encryptedContentsLength, NULL)) {
- gchar *file_contents = do_aes_decrypt(encryptedContents, server->password, encryptedContentsLength);
- g_free (encryptedContents);
- if (file_contents != NULL) {
- GKeyFile * key_file = g_key_file_new();
- if (g_key_file_load_from_data (key_file, file_contents, strlen (file_contents), G_KEY_FILE_NONE, NULL)) {
- last_used_server_name = g_key_file_get_string (key_file, server->parent.name, "last_used", NULL);
- }
- g_key_file_free (key_file);
- g_free (file_contents);
- }
- }
- g_free (username_sha);
- g_free (file_path);
- }
-
- GVariantBuilder array;
- g_variant_builder_init(&array, G_VARIANT_TYPE_ARRAY);
- GList * lserver;
- gint servercnt = 0;
-
- Server * last_used_server = NULL;
- if (last_used_server_name != NULL) {
- for (lserver = server->subservers; last_used_server == NULL && lserver != NULL; lserver = g_list_next(lserver)) {
- Server * serv = SERVER(lserver->data);
-
- /* We only want servers that are all good */
- if (serv->state != SERVER_STATE_ALLGOOD) {
- continue;
- }
- if (g_strcmp0(serv->name, last_used_server_name) == 0)
- last_used_server = serv;
- }
- }
- g_free (last_used_server_name);
-
- for (lserver = server->subservers; lserver != NULL; lserver = g_list_next(lserver)) {
- Server * serv = SERVER(lserver->data);
-
- /* We only want servers that are all good */
- if (serv->state != SERVER_STATE_ALLGOOD) {
- continue;
- }
-
- if (last_used_server != NULL)
- serv->last_used = last_used_server == serv;
-
- servercnt++;
- g_variant_builder_add_value(&array, server_get_variant(serv));
- }
-
- if (servercnt == 0) {
- g_variant_builder_clear(&array);
- return null_server_array();
- }
-
- return g_variant_builder_end(&array);
-}
-
-/* Returns the cached domains as an array. Not currently with any of
- this cached currently, so it's a NULL array. */
-static GVariant *
-get_cached_domains (Server * server)
-{
- g_return_val_if_fail(IS_UCCS_SERVER(server), NULL);
- return g_variant_new_array(G_VARIANT_TYPE_STRING, NULL, 0);
-}
-
-/* Tail recursive function to look at a list entry and see
- if that server matches a URI, or go down the list */
-static Server *
-find_uri_helper (GList * list, const gchar * uri)
-{
- if (list == NULL) return NULL;
-
- Server * inserver = SERVER(list->data);
-
- if (inserver == NULL) {
- return find_uri_helper(g_list_next(list), uri);
- }
-
- Server * outserver = server_find_uri(inserver, uri);
-
- if (outserver != NULL) {
- return outserver;
- }
-
- return find_uri_helper(g_list_next(list), uri);
-}
-
-/* Look through our subservers to see if any of them match this
- URI either */
-static Server *
-find_uri (Server * server, const gchar * uri)
-{
- g_return_val_if_fail(IS_UCCS_SERVER(server), NULL);
- /* If it is this server that's handled by the super class */
- return find_uri_helper(UCCS_SERVER(server)->subservers, uri);
-}
-
-/* Look through our subservers to see if any of them match this
- URI and set as used */
-static void
-set_last_used_server (Server * server, const gchar * uri)
-{
- Server * subserver = server_find_uri(server, uri);
-
- if (subserver != NULL) {
- subserver->last_used = TRUE;
-
- /* Write to disk */
- if (UCCS_SERVER(server)->username != NULL && UCCS_SERVER(server)->password) {
- GKeyFile * key_file = g_key_file_new();
- g_key_file_set_string (key_file, server->name, "last_used", subserver->name);
- gsize data_length;
- gchar *data = g_key_file_to_data (key_file, &data_length, NULL);
- g_key_file_free (key_file);
-
- size_t enc_data_length;
- gchar *enc_data = do_aes_encrypt(data, UCCS_SERVER(server)->password, &enc_data_length);
- g_free (data);
-
- gchar *dir_path = g_build_path ("/", g_get_user_cache_dir(), "remote-logon-service", "cache", NULL);
- gint status = g_mkdir_with_parents (dir_path, 0700);
- if (status == 0)
- {
- gchar *username_sha = g_compute_checksum_for_string (G_CHECKSUM_SHA256, UCCS_SERVER(server)->username, -1);
- gchar *path = g_build_path ("/", dir_path, username_sha, NULL);
- gboolean success = g_file_set_contents (path, enc_data, enc_data_length, NULL);
- if (!success) {
- g_warning("Failing writting cache data to '%s'.", path);
- }
- g_free (username_sha);
- g_free (path);
- }
- else
- {
- g_warning("Failed to create '%s'.", dir_path);
- }
- g_free (enc_data);
- g_free (dir_path);
- }
- }
-}
diff --git a/src/uccs-server.h b/src/uccs-server.h
deleted file mode 100644
index 4603a6c..0000000
--- a/src/uccs-server.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright © 2012 Canonical Ltd.
- * Copyright © 2015 The Arctica Project
- *
- * This program is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 3, as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranties of
- * MERCHANTABILITY, SATISFACTORY QUALITY, 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, see <http://www.gnu.org/licenses/>.
- *
- * Authors: Ted Gould <ted at canonical.com>
- * Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
- */
-
-#ifndef __UCCS_SERVER_H__
-#define __UCCS_SERVER_H__
-
-#include <glib-object.h>
-#include <libnm-glib/nm-client.h>
-#include <libsoup/soup.h>
-#include "server.h"
-
-G_BEGIN_DECLS
-
-#define UCCS_SERVER_TYPE (uccs_server_get_type ())
-#define UCCS_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), UCCS_SERVER_TYPE, UccsServer))
-#define UCCS_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), UCCS_SERVER_TYPE, UccsServerClass))
-#define IS_UCCS_SERVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), UCCS_SERVER_TYPE))
-#define IS_UCCS_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), UCCS_SERVER_TYPE))
-#define UCCS_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), UCCS_SERVER_TYPE, UccsServerClass))
-
-typedef struct _UccsServer UccsServer;
-typedef struct _UccsServerClass UccsServerClass;
-
-struct _UccsServerClass {
- ServerClass parent_class;
-};
-
-struct _UccsServer {
- Server parent;
-
- gchar * exec;
-
- gchar * username;
- gchar * password;
-
- GHashTable * lovers;
-
- GList * subservers;
-
- GList * json_waiters;
- guint json_watch;
- GPid json_pid;
-
- GInputStream * json_stream;
- GOutputStream * pass_stream;
-
- NMState min_network;
- NMState last_network;
- NMClient * nm_client;
- gulong nm_signal;
-
- gboolean verify_server;
- gboolean verified_server;
- SoupSession * session;
-};
-
-GType uccs_server_get_type (void);
-Server * uccs_server_new_from_keyfile (GKeyFile * keyfile, const gchar * name);
-void uccs_server_unlock (UccsServer * server, const gchar * address, const gchar * username, const gchar * password, gboolean allowcache, void (*callback) (UccsServer * server, gboolean unlocked, gpointer user_data), gpointer user_data);
-GVariant * uccs_server_get_servers (UccsServer * server, const gchar * address);
-const gchar *uccs_server_set_exec (UccsServer * server, const gchar * exec);
-
-G_END_DECLS
-
-#endif
diff --git a/src/x2go-server.c b/src/x2go-server.c
deleted file mode 100644
index 3b740de..0000000
--- a/src/x2go-server.c
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Copyright © 2012 Canonical Ltd.
- * Copyright © 2013 Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
- * Copyright © 2015 The Arctica Project
- *
- * This program is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 3, as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranties of
- * MERCHANTABILITY, SATISFACTORY QUALITY, 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, see <http://www.gnu.org/licenses/>.
- *
- * Authors: Ted Gould <ted at canonical.com>
- * Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <sys/mman.h>
-
-#include <glib/gi18n.h>
-
-#include <string.h>
-
-#include "x2go-server.h"
-#include "defines.h"
-
-static void x2go_server_class_init (X2GoServerClass *klass);
-static void x2go_server_init (X2GoServer *self);
-static void x2go_server_dispose (GObject *object);
-static void x2go_server_finalize (GObject *object);
-static GVariant * get_properties (Server * server);
-
-G_DEFINE_TYPE (X2GoServer, x2go_server, SERVER_TYPE);
-
-static void
-x2go_server_class_init (X2GoServerClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- object_class->dispose = x2go_server_dispose;
- object_class->finalize = x2go_server_finalize;
-
- ServerClass * server_class = SERVER_CLASS(klass);
-
- server_class->get_properties = get_properties;
-
- return;
-}
-
-static void
-x2go_server_init (X2GoServer *self)
-{
- self->username = NULL;
- self->password = NULL;
- self->sessiontype = NULL;
- self->sessiontype_required = FALSE;
-
- return;
-}
-
-static void
-x2go_server_dispose (GObject *object)
-{
-
- G_OBJECT_CLASS (x2go_server_parent_class)->dispose (object);
- return;
-}
-
-/* Unlocks the memory before freeing */
-static void
-password_clear (gpointer data)
-{
- char * pass = (char *)data;
- munlock(pass, strlen(pass));
- g_free(pass);
- return;
-}
-
-static void
-x2go_server_finalize (GObject *object)
-{
- X2GoServer * server = X2GO_SERVER(object);
-
- g_clear_pointer(&server->username, g_free);
- g_clear_pointer(&server->password, password_clear);
- g_clear_pointer(&server->sessiontype, g_free);
-
- G_OBJECT_CLASS (x2go_server_parent_class)->finalize (object);
- return;
-}
-
-static GVariant *
-get_properties (Server * server)
-{
- X2GoServer * rserver = X2GO_SERVER(server);
-
- GVariantBuilder propbuilder;
- g_variant_builder_init(&propbuilder, G_VARIANT_TYPE_ARRAY);
-
- GVariantBuilder namebuilder;
- g_variant_builder_init(&namebuilder, G_VARIANT_TYPE_TUPLE);
- g_variant_builder_add_value(&namebuilder, g_variant_new_string("username"));
- g_variant_builder_add_value(&namebuilder, g_variant_new_boolean(TRUE));
- if (rserver->username == NULL) {
- g_variant_builder_add_value(&namebuilder, g_variant_new_variant(g_variant_new_string("")));
- } else {
- g_variant_builder_add_value(&namebuilder, g_variant_new_variant(g_variant_new_string(rserver->username)));
- }
- g_variant_builder_add_value(&namebuilder, g_variant_parse(G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL));
- g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&namebuilder));
-
- GVariantBuilder passbuilder;
- g_variant_builder_init(&passbuilder, G_VARIANT_TYPE_TUPLE);
- g_variant_builder_add_value(&passbuilder, g_variant_new_string("password"));
- g_variant_builder_add_value(&passbuilder, g_variant_new_boolean(TRUE));
- if (rserver->password == NULL) {
- g_variant_builder_add_value(&passbuilder, g_variant_new_variant(g_variant_new_string("")));
- } else {
- g_variant_builder_add_value(&passbuilder, g_variant_new_variant(g_variant_new_string(rserver->password)));
- }
- g_variant_builder_add_value(&passbuilder, g_variant_parse(G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL));
- g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&passbuilder));
-
- GVariantBuilder sessiontypebuilder;
- g_variant_builder_init(&sessiontypebuilder, G_VARIANT_TYPE_TUPLE);
- g_variant_builder_add_value(&sessiontypebuilder, g_variant_new_string("x2gosession"));
- g_variant_builder_add_value(&sessiontypebuilder, g_variant_new_boolean(rserver->sessiontype_required));
- if (rserver->sessiontype == NULL) {
- g_variant_builder_add_value(&sessiontypebuilder, g_variant_new_variant(g_variant_new_string("")));
- } else {
- g_variant_builder_add_value(&sessiontypebuilder, g_variant_new_variant(g_variant_new_string(rserver->sessiontype)));
- }
- g_variant_builder_add_value(&sessiontypebuilder, g_variant_parse(G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL));
- g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&sessiontypebuilder));
-
- return g_variant_builder_end(&propbuilder);
-}
-
-Server *
-x2go_server_new_from_keyfile (GKeyFile * keyfile, const gchar * groupname)
-{
- g_return_val_if_fail(keyfile != NULL, NULL); /* NOTE: No way to check if that's really a keyfile :-( */
- g_return_val_if_fail(groupname != NULL, NULL);
-
- if (!g_key_file_has_group(keyfile, groupname)) {
- g_warning("Server specified but group '%s' was not found", groupname);
- return NULL;
- }
-
- X2GoServer * server = g_object_new(X2GO_SERVER_TYPE, NULL);
-
- if (g_key_file_has_key(keyfile, groupname, CONFIG_SERVER_NAME, NULL)) {
- gchar * keyname = g_key_file_get_string(keyfile, groupname, CONFIG_SERVER_NAME, NULL);
- server->parent.name = g_strdup(_(keyname));
- g_free(keyname);
- }
-
- if (g_key_file_has_key(keyfile, groupname, CONFIG_SERVER_URI, NULL)) {
- server->parent.uri = g_key_file_get_string(keyfile, groupname, CONFIG_SERVER_URI, NULL);
- }
-
- return SERVER(server);
-}
-
-/* Build the X2Go server from information in the JSON object */
-Server *
-x2go_server_new_from_json (JsonObject * object)
-{
- X2GoServer * server = g_object_new(X2GO_SERVER_TYPE, NULL);
-
- if (json_object_has_member(object, JSON_SERVER_NAME)) {
- JsonNode * node = json_object_get_member(object, JSON_SERVER_NAME);
- if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) {
- const gchar * name = json_node_get_string(node);
- server->parent.name = g_strdup(name);
- }
- }
-
- if (json_object_has_member(object, JSON_URI)) {
- JsonNode * node = json_object_get_member(object, JSON_URI);
- if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) {
- const gchar * uri = json_node_get_string(node);
- server->parent.uri = g_strdup(uri);
- }
- }
-
- if (json_object_has_member(object, JSON_USERNAME)) {
- JsonNode * node = json_object_get_member(object, JSON_USERNAME);
- if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) {
- const gchar * username = json_node_get_string(node);
- server->username = g_strdup(username);
- }
- }
-
- if (json_object_has_member(object, JSON_PASSWORD)) {
- JsonNode * node = json_object_get_member(object, JSON_PASSWORD);
- if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) {
- const gchar * password = json_node_get_string(node);
- server->password = g_strdup(password);
- mlock(server->password, strlen(server->password));
- }
- }
-
- if (json_object_has_member(object, JSON_SESSIONTYPE)) {
- JsonNode * node = json_object_get_member(object, JSON_SESSIONTYPE);
- if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) {
- const gchar * sessiontype = json_node_get_string(node);
- server->sessiontype = g_strdup(sessiontype);
- }
- }
-
- if (json_object_has_member(object, JSON_SESSIONTYPE_REQ)) {
- JsonNode * node = json_object_get_member(object, JSON_SESSIONTYPE_REQ);
- if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_BOOLEAN) {
- server->sessiontype_required = json_node_get_boolean(node);
- }
- }
-
- return SERVER(server);
-}
diff --git a/src/x2go-server.h b/src/x2go-server.h
deleted file mode 100644
index 6135321..0000000
--- a/src/x2go-server.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright © 2012 Canonical Ltd.
- * Copyright © 2013 Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
- * Copyright © 2015 The Arctica Project
- *
- * This program is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 3, as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranties of
- * MERCHANTABILITY, SATISFACTORY QUALITY, 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, see <http://www.gnu.org/licenses/>.
- *
- * Authors: Ted Gould <ted at canonical.com>
- * Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
- */
-
-#ifndef __X2GO_SERVER_H__
-#define __X2GO_SERVER_H__
-
-#include <glib-object.h>
-#include <json-glib/json-glib.h>
-#include "server.h"
-
-G_BEGIN_DECLS
-
-#define X2GO_SERVER_TYPE (x2go_server_get_type ())
-#define X2GO_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), X2GO_SERVER_TYPE, X2GoServer))
-#define X2GO_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), X2GO_SERVER_TYPE, X2GoServerClass))
-#define IS_X2GO_SERVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), X2GO_SERVER_TYPE))
-#define IS_X2GO_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), X2GO_SERVER_TYPE))
-#define X2GO_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), X2GO_SERVER_TYPE, X2GoServerClass))
-
-typedef struct _X2GoServer X2GoServer;
-typedef struct _X2GoServerClass X2GoServerClass;
-
-struct _X2GoServerClass {
- ServerClass parent_class;
-};
-
-struct _X2GoServer {
- Server parent;
-
- gchar * username;
- gchar * password;
- gchar * sessiontype;
- gboolean sessiontype_required;
-};
-
-GType x2go_server_get_type (void);
-Server * x2go_server_new_from_keyfile (GKeyFile * keyfile, const gchar * name);
-Server * x2go_server_new_from_json (JsonObject * object);
-
-G_END_DECLS
-
-#endif
diff --git a/tests/Makefile.am b/tests/Makefile.am
deleted file mode 100644
index 9a34654..0000000
--- a/tests/Makefile.am
+++ /dev/null
@@ -1,73 +0,0 @@
-
-CLEANFILES =
-DISTCLEANFILES =
-EXTRA_DIST =
-check_PROGRAMS =
-
-TESTS = \
- server-tester \
- dbus-interface-tester
-
-#####################################
-# Server Test
-#####################################
-
-SERVER_XML_REPORT = server-test.xml
-server-tester: server-test Makefile.am
- @echo "#!/bin/bash" > $@
- @echo gtester --verbose -k -o $(SERVER_XML_REPORT) $(abs_builddir)/server-test >> $@
- @chmod +x $@
-
-CLEANFILES += \
- $(SERVER_XML_REPORT) \
- server-tester
-
-server_test_SOURCES = \
- server-test.c
-server_test_CFLAGS = \
- -I$(top_srcdir)/src \
- -I$(top_builddir)/src \
- $(SERVICE_CFLAGS)
-server_test_LDADD = \
- $(top_builddir)/src/libservers.la \
- $(SERVICE_LIBS)
-
-check_PROGRAMS += server-test
-
-#####################################
-# DBus Interface
-#####################################
-
-DBUS_XML_REPORT = dbus-interface.xml
-dbus-interface-tester: dbus-interface uccs-config.conf slmock-config.conf Makefile.am
- @echo "#!/bin/bash" > $@
- @echo gtester --verbose -k -o $(DBUS_XML_REPORT) $(abs_builddir)/dbus-interface >> $@
- @chmod +x $@
-
-CLEANFILES += \
- $(DBUS_XML_REPORT) \
- dbus-interface-tester \
- slmock-config.conf
-
-EXTRA_DIST += \
- null-config.conf \
- uccs-config.conf \
- slmock \
- slmock-config.conf.in
-
-slmock-config.conf: slmock-config.conf.in
- sed -e "s|\@slmock\@|$(abs_srcdir)/slmock|" $< > $@
-dbus_interface_SOURCES = \
- dbus-interface.c
-dbus_interface_CFLAGS = \
- -DREMOTE_LOGON_SERVICE="\"$(abs_top_builddir)/src/remote-logon-service\"" \
- -DUCCS_CONFIG_FILE="\"$(abs_srcdir)/uccs-config.conf\"" \
- -DSLMOCK_CONFIG_FILE="\"$(abs_builddir)/slmock-config.conf\"" \
- -DNULL_CONFIG_FILE="\"$(abs_srcdir)/null-config.conf\"" \
- $(SERVICE_CFLAGS) \
- $(TEST_CFLAGS)
-dbus_interface_LDADD = \
- $(SERVICE_LIBS) \
- $(TEST_LIBS)
-
-check_PROGRAMS += dbus-interface
diff --git a/tests/dbus-interface.c b/tests/dbus-interface.c
deleted file mode 100644
index e67b60c..0000000
--- a/tests/dbus-interface.c
+++ /dev/null
@@ -1,583 +0,0 @@
-
-#include <glib.h>
-#include <gio/gio.h>
-#include <libdbustest/dbus-test.h>
-
-typedef struct _slmock_table_t slmock_table_t;
-typedef struct _slmock_server_t slmock_server_t;
-
-struct _slmock_table_t {
- const gchar * username;
- const gchar * password;
- slmock_server_t * servers;
-};
-
-struct _slmock_server_t {
- const gchar * name;
- const gchar * uri;
- const gchar * type;
- gboolean last_used;
- const gchar * username;
- const gchar * password;
- const gchar * domain;
-};
-
-slmock_server_t citrix_server_table[] = {
- {"Citrix USA", "107.21.17.35", "ica", FALSE, "useradmin1", "", "IP-0A00001E"},
- {"Citrix 2", "107.21.17.35", "ica", FALSE, "useradmin2", "", "IP-0A00001E"},
- {"Citrix 3", "107.21.17.35", "ica", FALSE, "useradmin3", "", "IP-0A00001E"},
- {"Citrix 4", "107.21.17.35", "ica", FALSE, "useradmin4", "userpass", "IP-0A00001E"},
- {NULL, NULL, NULL}
-};
-
-slmock_server_t freerdp_server_table[] = {
- {"FreeRDP US", "23.21.151.133", "freerdp", TRUE, "Administrator", "", ""},
- {"FreeRDP Asia", "46.137.222.181", "freerdp", FALSE, "Administrator", "", ""},
- {"FreeRDP UK", "46.137.189.194", "freerdp", FALSE, "Administrator", "", ""},
- {NULL, NULL, NULL}
-};
-
-slmock_server_t freerdp_server_table_after_set_last_used[] = {
- {"FreeRDP US", "23.21.151.133", "freerdp", FALSE, "Administrator", "", ""},
- {"FreeRDP Asia", "46.137.222.181", "freerdp", TRUE, "Administrator", "", ""},
- {"FreeRDP UK", "46.137.189.194", "freerdp", FALSE, "Administrator", "", ""},
- {NULL, NULL, NULL}
-};
-
-slmock_server_t big_server_table[] = {
- {"XenServer", "107.21.17.35", "ica", FALSE, "", "", "ASIA"},
- {"Citrix2", "http://1.2.3.4", "ica", FALSE, "fakeuser", "fakepassword", "DOMAIN1"},
- {"Accenture", "10.21.17.35", "freerdp", FALSE, "fakeuser", "", "EUROPE"},
- {"Accenture 2", "https://4.5.6.7", "freerdp", TRUE, "", "", "domain2"},
- {NULL, NULL, NULL}
-};
-
-slmock_table_t slmock_table[] = {
- {"c", "c", citrix_server_table},
- {"f", "f", freerdp_server_table},
- {"b", "b", big_server_table},
- {"f", "f", freerdp_server_table_after_set_last_used}
-};
-
-static gboolean
-find_server (GVariant * varray, slmock_server_t * server)
-{
- int ichild;
- for (ichild = 0; ichild < g_variant_n_children(varray); ichild++) {
- GVariant * child = g_variant_get_child_value(varray, ichild);
- gboolean test = FALSE;
-
- GVariant * type = g_variant_get_child_value(child, 0);
- test = g_strcmp0(g_variant_get_string(type, NULL), server->type) == 0;
- g_variant_unref(type);
- if (!test) {
- g_variant_unref(child);
- continue;
- }
-
- GVariant * name = g_variant_get_child_value(child, 1);
- test = g_strcmp0(g_variant_get_string(name, NULL), server->name) == 0;
- g_variant_unref(name);
- if (!test) {
- g_variant_unref(child);
- continue;
- }
-
- GVariant * uri = g_variant_get_child_value(child, 2);
- test = g_strcmp0(g_variant_get_string(uri, NULL), server->uri) == 0;
- g_variant_unref(uri);
- if (!test) {
- g_variant_unref(child);
- continue;
- }
-
- GVariant * last_used = g_variant_get_child_value(child, 3);
- test = g_variant_get_boolean(last_used) == server->last_used;
- g_variant_unref(last_used);
- if (!test) {
- g_variant_unref(child);
- continue;
- }
-
- gboolean match_username = FALSE;
- gboolean match_password = FALSE;
- gboolean match_domain = FALSE;
-
- GVariant * props = g_variant_get_child_value(child, 4);
- int iprop;
- for (iprop = 0; iprop < g_variant_n_children(props); iprop++) {
- GVariant * prop = g_variant_get_child_value(props, iprop);
-
- GVariant * prop_type = g_variant_get_child_value(prop, 0);
- GVariant * prop_value_wrap = g_variant_get_child_value(prop, 2);
- GVariant * prop_value = g_variant_get_variant(prop_value_wrap);
-
- if (g_strcmp0(g_variant_get_string(prop_type, NULL), "username") == 0) {
- if (g_strcmp0(g_variant_get_string(prop_value, NULL), server->username) == 0) {
- match_username = TRUE;
- }
- } else if (g_strcmp0(g_variant_get_string(prop_type, NULL), "password") == 0) {
- if (g_strcmp0(g_variant_get_string(prop_value, NULL), server->password) == 0) {
- match_password = TRUE;
- }
- } else if (g_strcmp0(g_variant_get_string(prop_type, NULL), "domain") == 0) {
- if (g_strcmp0(g_variant_get_string(prop_value, NULL), server->domain) == 0) {
- match_domain = TRUE;
- }
- }
-
- g_variant_unref(prop_value);
- g_variant_unref(prop_value_wrap);
- g_variant_unref(prop_type);
- g_variant_unref(prop);
- }
- g_variant_unref(props);
-
- g_variant_unref(child);
-
- if (match_username && match_password && match_domain) {
- return TRUE;
- } else {
- continue;
- }
- }
-
- return FALSE;
-}
-
-static gboolean
-slmock_check_login(GDBusConnection * session, slmock_table_t * slmockdata, gboolean clear_cache)
-{
- if (clear_cache) {
- gchar *username_sha = g_compute_checksum_for_string (G_CHECKSUM_SHA256, slmockdata->username, -1);
- gchar *file_path = g_build_path ("/", g_get_user_cache_dir(), "remote-logon-service", "cache", username_sha, NULL);
- unlink (file_path);
- g_free (username_sha);
- g_free (file_path);
- }
- GVariant * retval = g_dbus_connection_call_sync(session,
- "org.ArcticaProject.RemoteLogon",
- "/org/ArcticaProject/RemoteLogon",
- "org.ArcticaProject.RemoteLogon",
- "GetServersForLogin",
- g_variant_new("(sssb)",
- "https://slmock.com/",
- slmockdata->username,
- slmockdata->password,
- TRUE), /* params */
- G_VARIANT_TYPE("(bsa(sssba(sbva{sv})a(si)))"), /* ret type */
- G_DBUS_CALL_FLAGS_NONE,
- -1,
- NULL,
- NULL);
-
- g_assert(retval != NULL);
- g_assert(g_variant_n_children(retval) == 3);
-
- GVariant * loggedin = g_variant_get_child_value(retval, 0);
- g_assert(g_variant_get_boolean(loggedin));
- g_variant_unref(loggedin); loggedin = NULL;
-
- GVariant * data = g_variant_get_child_value(retval, 1);
- g_assert(g_strcmp0(g_variant_get_string(data, NULL), "network") == 0);
- g_variant_unref(data); data = NULL;
-
- GVariant * array = g_variant_get_child_value(retval, 2);
- int i;
- // Check all servers should be in the result are in the result
- for (i = 0; slmockdata->servers[i].name != NULL; i++) {
- g_assert(find_server(array, &slmockdata->servers[i]));
- }
- // Check there is no more servers in the result than we expected
- g_assert(i == g_variant_n_children(array));
- g_variant_unref(array);
-
- g_variant_unref(retval);
-
- return TRUE;
-}
-
-static void
-test_getservers_slmock (gconstpointer data)
-{
- DbusTestService * service = dbus_test_service_new(NULL);
-
- /* RLS */
- DbusTestProcess * rls = dbus_test_process_new(REMOTE_LOGON_SERVICE);
- dbus_test_process_append_param(rls, "--config-file=" SLMOCK_CONFIG_FILE);
- dbus_test_service_add_task(service, DBUS_TEST_TASK(rls));
-
- /* Dummy */
- DbusTestTask * dummy = dbus_test_task_new();
- dbus_test_task_set_wait_for(dummy, "org.ArcticaProject.RemoteLogon");
- dbus_test_service_add_task(service, dummy);
-
- /* Get RLS up and running and us on that bus */
- dbus_test_service_start_tasks(service);
-
- GDBusConnection * session = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, NULL);
- g_dbus_connection_set_exit_on_close(session, FALSE);
-
- g_assert(slmock_check_login(session, (slmock_table_t *)data, TRUE));
-
- g_object_unref(session);
- g_object_unref(rls);
- g_object_unref(service);
-
- return;
-}
-
-static void
-test_getservers_slmock_none (void)
-{
- DbusTestService * service = dbus_test_service_new(NULL);
-
- /* RLS */
- DbusTestProcess * rls = dbus_test_process_new(REMOTE_LOGON_SERVICE);
- dbus_test_process_append_param(rls, "--config-file=" SLMOCK_CONFIG_FILE);
- dbus_test_service_add_task(service, DBUS_TEST_TASK(rls));
-
- /* Dummy */
- DbusTestTask * dummy = dbus_test_task_new();
- dbus_test_task_set_wait_for(dummy, "org.ArcticaProject.RemoteLogon");
- dbus_test_service_add_task(service, dummy);
-
- /* Get RLS up and running and us on that bus */
- dbus_test_service_start_tasks(service);
-
- GDBusConnection * session = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, NULL);
- g_dbus_connection_set_exit_on_close(session, FALSE);
-
- GVariant * retval = g_dbus_connection_call_sync(session,
- "org.ArcticaProject.RemoteLogon",
- "/org/ArcticaProject/RemoteLogon",
- "org.ArcticaProject.RemoteLogon",
- "GetServersForLogin",
- g_variant_new("(sssb)",
- "https://slmock.com/",
- "Baduser",
- "Badpass",
- TRUE), /* params */
- G_VARIANT_TYPE("(bsa(sssba(sbva{sv})a(si)))"), /* ret type */
- G_DBUS_CALL_FLAGS_NONE,
- -1,
- NULL,
- NULL);
-
- g_assert(retval != NULL);
- g_assert(g_variant_n_children(retval) == 3);
-
- GVariant * loggedin = g_variant_get_child_value(retval, 0);
- g_assert(!g_variant_get_boolean(loggedin));
- g_variant_unref(loggedin); loggedin = NULL;
-
- GVariant * array = g_variant_get_child_value(retval, 2);
- g_assert(g_variant_n_children(array) == 0);
- g_variant_unref(array);
- g_variant_unref(retval);
-
- g_object_unref(session);
- g_object_unref(rls);
- g_object_unref(service);
-
- return;
-}
-
-static void
-test_getservers_slmock_two (void)
-{
- DbusTestService * service = dbus_test_service_new(NULL);
-
- /* RLS */
- DbusTestProcess * rls = dbus_test_process_new(REMOTE_LOGON_SERVICE);
- dbus_test_process_append_param(rls, "--config-file=" SLMOCK_CONFIG_FILE);
- dbus_test_service_add_task(service, DBUS_TEST_TASK(rls));
-
- /* Dummy */
- DbusTestTask * dummy = dbus_test_task_new();
- dbus_test_task_set_wait_for(dummy, "org.ArcticaProject.RemoteLogon");
- dbus_test_service_add_task(service, dummy);
-
- /* Get RLS up and running and us on that bus */
- dbus_test_service_start_tasks(service);
-
- GDBusConnection * session = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, NULL);
- g_dbus_connection_set_exit_on_close(session, FALSE);
-
- g_assert(slmock_check_login(session, &slmock_table[0], TRUE));
- g_assert(slmock_check_login(session, &slmock_table[1], TRUE));
-
- g_object_unref(session);
- g_object_unref(rls);
- g_object_unref(service);
-
- return;
-}
-
-static void
-test_getservers_none (void)
-{
- DbusTestService * service = dbus_test_service_new(NULL);
-
- /* RLS */
- DbusTestProcess * rls = dbus_test_process_new(REMOTE_LOGON_SERVICE);
- dbus_test_process_append_param(rls, "--config-file=" NULL_CONFIG_FILE);
- dbus_test_service_add_task(service, DBUS_TEST_TASK(rls));
-
- /* Dummy */
- DbusTestTask * dummy = dbus_test_task_new();
- dbus_test_task_set_wait_for(dummy, "org.ArcticaProject.RemoteLogon");
- dbus_test_service_add_task(service, dummy);
-
- /* Get RLS up and running and us on that bus */
- dbus_test_service_start_tasks(service);
-
- GDBusConnection * session = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, NULL);
- g_dbus_connection_set_exit_on_close(session, FALSE);
-
- GVariant * retval = g_dbus_connection_call_sync(session,
- "org.ArcticaProject.RemoteLogon",
- "/org/ArcticaProject/RemoteLogon",
- "org.ArcticaProject.RemoteLogon",
- "GetServers",
- NULL, /* params */
- G_VARIANT_TYPE("(a(sssba(sbva{sv})a(si)))"), /* ret type */
- G_DBUS_CALL_FLAGS_NONE,
- -1,
- NULL,
- NULL);
-
- g_assert(retval != NULL);
- g_assert(g_variant_n_children(retval) == 1);
-
- GVariant * array = g_variant_get_child_value(retval, 0);
- g_assert(g_variant_n_children(array) == 0);
- g_assert(g_variant_is_of_type(array, G_VARIANT_TYPE_ARRAY));
-
- g_variant_unref(array);
- g_variant_unref(retval);
-
- g_object_unref(session);
- g_object_unref(rls);
- g_object_unref(service);
-
- return;
-}
-
-static void
-test_getservers_uccs (void)
-{
- DbusTestService * service = dbus_test_service_new(NULL);
-
- /* RLS */
- DbusTestProcess * rls = dbus_test_process_new(REMOTE_LOGON_SERVICE);
- dbus_test_process_append_param(rls, "--config-file=" UCCS_CONFIG_FILE);
- dbus_test_service_add_task(service, DBUS_TEST_TASK(rls));
-
- /* Dummy */
- DbusTestTask * dummy = dbus_test_task_new();
- dbus_test_task_set_wait_for(dummy, "org.ArcticaProject.RemoteLogon");
- dbus_test_service_add_task(service, dummy);
-
- /* Get RLS up and running and us on that bus */
- dbus_test_service_start_tasks(service);
-
- GDBusConnection * session = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, NULL);
- g_dbus_connection_set_exit_on_close(session, FALSE);
-
- GVariant * retval = g_dbus_connection_call_sync(session,
- "org.ArcticaProject.RemoteLogon",
- "/org/ArcticaProject/RemoteLogon",
- "org.ArcticaProject.RemoteLogon",
- "GetServers",
- NULL, /* params */
- G_VARIANT_TYPE("(a(sssba(sbva{sv})a(si)))"), /* ret type */
- G_DBUS_CALL_FLAGS_NONE,
- -1,
- NULL,
- NULL);
-
- g_assert(retval != NULL);
- g_assert(g_variant_n_children(retval) == 1);
-
- GVariant * array = g_variant_get_child_value(retval, 0);
- g_assert(g_variant_n_children(array) == 1);
- g_assert(g_variant_is_of_type(array, G_VARIANT_TYPE_ARRAY));
-
- GVariant * tuple = g_variant_get_child_value(array, 0);
-
- if (TRUE) { /* type check */
- GVariant * type = g_variant_get_child_value(tuple, 0);
- g_assert(g_variant_is_of_type(type, G_VARIANT_TYPE_STRING));
- g_assert(g_strcmp0(g_variant_get_string(type, NULL), "uccs") == 0);
- g_variant_unref(type);
- }
-
- if (TRUE) { /* name check */
- GVariant * name = g_variant_get_child_value(tuple, 1);
- g_assert(g_variant_is_of_type(name, G_VARIANT_TYPE_STRING));
- g_assert(g_strcmp0(g_variant_get_string(name, NULL), "Test Server Name") == 0);
- g_variant_unref(name);
- }
-
- if (TRUE) { /* uri check */
- GVariant * uri = g_variant_get_child_value(tuple, 2);
- g_assert(g_variant_is_of_type(uri, G_VARIANT_TYPE_STRING));
- g_assert(g_strcmp0(g_variant_get_string(uri, NULL), "https://uccs.test.mycompany.com/") == 0);
- g_variant_unref(uri);
- }
-
- g_variant_unref(tuple);
- g_variant_unref(array);
- g_variant_unref(retval);
-
- g_object_unref(session);
- g_object_unref(rls);
- g_object_unref(service);
-
- return;
-}
-
-static void
-test_getdomains_basic (void)
-{
- DbusTestService * service = dbus_test_service_new(NULL);
-
- /* RLS */
- DbusTestProcess * rls = dbus_test_process_new(REMOTE_LOGON_SERVICE);
- dbus_test_process_append_param(rls, "--config-file=" SLMOCK_CONFIG_FILE);
- dbus_test_service_add_task(service, DBUS_TEST_TASK(rls));
-
- /* Dummy */
- DbusTestTask * dummy = dbus_test_task_new();
- dbus_test_task_set_wait_for(dummy, "org.ArcticaProject.RemoteLogon");
- dbus_test_service_add_task(service, dummy);
-
- /* Get RLS up and running and us on that bus */
- dbus_test_service_start_tasks(service);
-
- GDBusConnection * session = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, NULL);
- g_dbus_connection_set_exit_on_close(session, FALSE);
-
- GError * error = NULL;
- GVariant * retval = g_dbus_connection_call_sync(session,
- "org.ArcticaProject.RemoteLogon",
- "/org/ArcticaProject/RemoteLogon",
- "org.ArcticaProject.RemoteLogon",
- "GetCachedDomainsForServer",
- g_variant_new("(s)", "https://slmock.com/"), /* params */
- G_VARIANT_TYPE("(as)"), /* ret type */
- G_DBUS_CALL_FLAGS_NONE,
- -1,
- NULL,
- &error);
-
- if (error != NULL) {
- g_debug("Error from GetCachedDomainsForServer: %s", error->message);
- g_error_free(error);
- error = NULL;
- }
-
- g_assert(retval != NULL);
- g_assert(g_variant_n_children(retval) == 1);
-
- GVariant * child = g_variant_get_child_value(retval, 0);
- g_assert(g_variant_is_of_type(child, G_VARIANT_TYPE_ARRAY));
- g_variant_unref(child);
-
- g_variant_unref(retval);
-
- g_object_unref(session);
- g_object_unref(rls);
- g_object_unref(service);
-
- return;
-}
-
-
-static void
-test_setlastused_basic (void)
-{
- DbusTestService * service = dbus_test_service_new(NULL);
-
- /* RLS */
- DbusTestProcess * rls = dbus_test_process_new(REMOTE_LOGON_SERVICE);
- dbus_test_process_append_param(rls, "--config-file=" SLMOCK_CONFIG_FILE);
- dbus_test_service_add_task(service, DBUS_TEST_TASK(rls));
-
- /* Dummy */
- DbusTestTask * dummy = dbus_test_task_new();
- dbus_test_task_set_wait_for(dummy, "org.ArcticaProject.RemoteLogon");
- dbus_test_service_add_task(service, dummy);
-
- /* Get RLS up and running and us on that bus */
- dbus_test_service_start_tasks(service);
-
- GDBusConnection * session = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, NULL);
- g_dbus_connection_set_exit_on_close(session, FALSE);
-
- g_assert(slmock_check_login(session, &slmock_table[1], TRUE));
-
- GError * error = NULL;
- GVariant * retval = g_dbus_connection_call_sync(session,
- "org.ArcticaProject.RemoteLogon",
- "/org/ArcticaProject/RemoteLogon",
- "org.ArcticaProject.RemoteLogon",
- "SetLastUsedServer",
- g_variant_new("(ss)", "Landscape", freerdp_server_table[1].uri), /* params */
- NULL, /* ret type */
- G_DBUS_CALL_FLAGS_NONE,
- -1,
- NULL,
- &error);
-
- if (error != NULL) {
- g_debug("Error from SetLastUsedServer: %s", error->message);
- g_error_free(error);
- error = NULL;
- }
-
- g_assert(retval != NULL);
- g_assert(g_variant_n_children(retval) == 0);
- g_variant_unref(retval);
-
- g_assert(slmock_check_login(session, &slmock_table[3], FALSE));
-
- g_object_unref(session);
- g_object_unref(rls);
- g_object_unref(service);
-
- return;
-}
-
-
-/* Build the test suite */
-static void
-test_dbus_suite (void)
-{
- g_test_add_func ("/dbus/interface/GetServers/None", test_getservers_none);
- g_test_add_func ("/dbus/interface/GetServers/UCCS", test_getservers_uccs);
- g_test_add_data_func ("/dbus/interface/GetServers/SLMock/citrix", &slmock_table[0], test_getservers_slmock);
- g_test_add_data_func ("/dbus/interface/GetServers/SLMock/freerdp", &slmock_table[1], test_getservers_slmock);
- g_test_add_data_func ("/dbus/interface/GetServers/SLMock/big", &slmock_table[2], test_getservers_slmock);
- g_test_add_func ("/dbus/interface/GetServers/SLMock/none", test_getservers_slmock_none);
- g_test_add_func ("/dbus/interface/GetServers/SLMock/two", test_getservers_slmock_two);
- g_test_add_func ("/dbus/interface/GetDomains/Basic", test_getdomains_basic);
- g_test_add_func ("/dbus/interface/SetLastUsed/Basic", test_setlastused_basic);
-
- return;
-}
-
-gint
-main (gint argc, gchar * argv[])
-{
-#if !GLIB_CHECK_VERSION (2, 35, 1)
- g_type_init();
-#endif
- g_test_init(&argc, &argv, NULL);
-
- /* Test suites */
- test_dbus_suite();
-
- return g_test_run ();
-}
diff --git a/tests/null-config.conf b/tests/null-config.conf
deleted file mode 100644
index f00a4f8..0000000
--- a/tests/null-config.conf
+++ /dev/null
@@ -1,2 +0,0 @@
-[Remote Logon Service]
-DummyValue=This is intentionally left blank
diff --git a/tests/server-test.c b/tests/server-test.c
deleted file mode 100644
index 06b6233..0000000
--- a/tests/server-test.c
+++ /dev/null
@@ -1,282 +0,0 @@
-#include <glib.h>
-
-#include "defines.h"
-#include "server.h"
-#include "citrix-server.h"
-#include "rdp-server.h"
-#include "uccs-server.h"
-
-static gboolean
-no_fatal_warnings (const gchar * log_domain, GLogLevelFlags level, const gchar * message, gpointer userdata)
-{
- if (level & (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG)) {
- return FALSE;
- }
-
- return TRUE;
-}
-
-static void
-state_signal (Server * server, ServerState newstate, gboolean * signaled)
-{
- *signaled = TRUE;
- return;
-}
-
-static void
-test_update_signal (void)
-{
- g_test_log_set_fatal_handler(no_fatal_warnings, NULL);
-
- GKeyFile * keyfile = g_key_file_new();
- const gchar * groupname = CONFIG_SERVER_PREFIX " Server Name";
- g_key_file_set_string(keyfile, groupname, CONFIG_SERVER_NAME, "My Server");
- g_key_file_set_string(keyfile, groupname, CONFIG_SERVER_URI, "http://my.domain.com");
- g_key_file_set_string(keyfile, groupname, CONFIG_UCCS_NETWORK, CONFIG_UCCS_NETWORK_NONE);
-
- Server * server = NULL;
- server = server_new_from_keyfile(keyfile, groupname);
- g_assert(server != NULL);
- g_assert(g_strcmp0(server->name, "My Server") == 0);
- g_assert(g_strcmp0(server->uri, "http://my.domain.com") == 0);
-
- UccsServer * userver = UCCS_SERVER(server);
- g_assert(userver != NULL);
-
- gboolean signaled = FALSE;
- g_signal_connect(G_OBJECT(server), SERVER_SIGNAL_STATE_CHANGED, G_CALLBACK(state_signal), &signaled);
-
- if (server->state == SERVER_STATE_ALLGOOD) {
- signaled = FALSE;
- uccs_server_set_exec(userver, "thisshouldnotexist");
- g_assert(signaled);
- g_assert(server->state == SERVER_STATE_UNAVAILABLE);
- }
-
- signaled = FALSE;
- uccs_server_set_exec(userver, "ls");
- g_assert(signaled);
- g_assert(server->state == SERVER_STATE_ALLGOOD);
-
- return;
-}
-
-static void
-test_uccs_domains (void)
-{
- g_test_log_set_fatal_handler(no_fatal_warnings, NULL);
-
- GKeyFile * keyfile = g_key_file_new();
- const gchar * groupname = CONFIG_SERVER_PREFIX " Server Name";
- g_key_file_set_string(keyfile, groupname, CONFIG_SERVER_NAME, "My Server");
- g_key_file_set_string(keyfile, groupname, CONFIG_SERVER_URI, "http://my.domain.com");
-
- Server * server = NULL;
- server = server_new_from_keyfile(keyfile, groupname);
- g_assert(server != NULL);
- g_assert(g_strcmp0(server->name, "My Server") == 0);
- g_assert(g_strcmp0(server->uri, "http://my.domain.com") == 0);
-
- GVariant * domains = server_cached_domains(server);
- g_assert(domains != NULL);
- g_assert(g_variant_is_of_type(domains, G_VARIANT_TYPE_ARRAY));
- g_variant_ref_sink(domains);
- g_variant_unref(domains);
-
- g_object_unref(server);
- g_key_file_unref(keyfile);
-
- return;
-}
-
-static void
-test_uccs_exec (void)
-{
- g_test_log_set_fatal_handler(no_fatal_warnings, NULL);
-
- GKeyFile * keyfile = g_key_file_new();
- const gchar * groupname = CONFIG_SERVER_PREFIX " Server Name";
- g_key_file_set_string(keyfile, groupname, CONFIG_SERVER_NAME, "My Server");
- g_key_file_set_string(keyfile, groupname, CONFIG_SERVER_URI, "http://my.domain.com");
- g_key_file_set_string(keyfile, groupname, CONFIG_UCCS_EXEC, "ls");
-
- Server * server = NULL;
- server = server_new_from_keyfile(keyfile, groupname);
- g_assert(server != NULL);
- g_assert(g_strcmp0(server->name, "My Server") == 0);
- g_assert(g_strcmp0(server->uri, "http://my.domain.com") == 0);
- g_assert(g_strcmp0(UCCS_SERVER(server)->exec, "/bin/ls") == 0);
-
- g_object_unref(server);
- g_key_file_unref(keyfile);
-
- return;
-}
-
-typedef struct _type_data_t type_data_t;
-struct _type_data_t {
- GType type;
- const gchar * name;
- const gchar * config_type;
-};
-
-type_data_t type_data[3] = {
- {0, "ica", CONFIG_SERVER_TYPE_ICA},
- {0, "freerdp", CONFIG_SERVER_TYPE_RDP},
- {0, "uccs", CONFIG_SERVER_TYPE_UCCS}
-};
-
-/*
-static void
-type_data_dump (type_data_t * data)
-{
- g_debug("Type data: %X", data);
- g_debug(" type: %d", data->type);
- g_debug(" name: %s", data->name);
- g_debug(" c. type: %s", data->config_type);
-}
-*/
-
-static gboolean
-fatal_func (const gchar * log_domain, GLogLevelFlags level, const gchar * message, gpointer userdata)
-{
- return FALSE;
-}
-
-static void
-test_object_variant (gconstpointer data)
-{
- g_test_log_set_fatal_handler(fatal_func, NULL);
-
- type_data_t * typedata = (type_data_t *)data;
-
- Server * server = g_object_new(typedata->type, NULL);
-
- g_assert(server != NULL);
- g_assert(IS_SERVER(server));
-
- server->name = g_strdup("My Name");
- server->uri = g_strdup("http://mysite.loves.testing.com");
-
- GVariant * variant = server_get_variant(server);
-
- g_assert(g_variant_n_children(variant) == 6);
-
- GVariant * child = g_variant_get_child_value(variant, 0);
- g_assert(g_variant_is_of_type(child, G_VARIANT_TYPE_STRING));
- g_assert(g_strcmp0(g_variant_get_string(child, NULL), typedata->name) == 0);
- g_variant_unref(child);
-
- child = g_variant_get_child_value(variant, 1);
- g_assert(g_variant_is_of_type(child, G_VARIANT_TYPE_STRING));
- g_assert(g_strcmp0(g_variant_get_string(child, NULL), "My Name") == 0);
- g_variant_unref(child);
-
- child = g_variant_get_child_value(variant, 2);
- g_assert(g_variant_is_of_type(child, G_VARIANT_TYPE_STRING));
- g_assert(g_strcmp0(g_variant_get_string(child, NULL), "http://mysite.loves.testing.com") == 0);
- g_variant_unref(child);
-
- g_variant_ref_sink(variant);
- g_variant_unref(variant);
- g_object_unref(G_OBJECT(server));
-
- return;
-}
-
-static void
-test_object_keyfile_basics (gconstpointer data)
-{
- g_test_log_set_fatal_handler(fatal_func, NULL);
-
- type_data_t * typedata = (type_data_t *)data;
-
- Server * server = NULL;
-
- server = server_new_from_keyfile(NULL, NULL);
- g_assert(server == NULL);
-
- GKeyFile * keyfile = g_key_file_new();
- server = server_new_from_keyfile(keyfile, NULL);
- g_assert(server == NULL);
-
- server = server_new_from_keyfile(keyfile, CONFIG_SERVER_PREFIX " Server Name");
- g_assert(server == NULL);
-
- gchar * groupname = g_strdup_printf("%s %s", CONFIG_SERVER_PREFIX, "Server Name");
- g_key_file_set_string(keyfile, groupname, CONFIG_SERVER_NAME, "My Server");
- g_key_file_set_string(keyfile, groupname, CONFIG_SERVER_URI, "http://my.domain.com");
- g_key_file_set_string(keyfile, groupname, CONFIG_SERVER_TYPE, typedata->config_type);
- g_key_file_set_string(keyfile, groupname, "dumbledorf", "Bad data, don't screw up!");
-
- server = server_new_from_keyfile(keyfile, CONFIG_SERVER_PREFIX " Server Name");
- g_assert(server != NULL);
- g_assert(g_strcmp0(server->name, "My Server") == 0);
- g_assert(g_strcmp0(server->uri, "http://my.domain.com") == 0);
- g_assert(typedata->type == G_OBJECT_TYPE(server));
-
- g_object_unref(server);
- g_free(groupname);
- g_key_file_unref(keyfile);
-
- return;
-}
-
-static void
-test_object_creation (gconstpointer data)
-{
- g_test_log_set_fatal_handler(no_fatal_warnings, NULL);
-
- type_data_t * typedata = (type_data_t *)data;
-
- Server * server = g_object_new(typedata->type, NULL);
-
- g_assert(server != NULL);
- g_assert(IS_SERVER(server));
-
- g_object_unref(G_OBJECT(server));
- return;
-}
-
-/* Build the test suite */
-static void
-test_objects_suite (void)
-{
- /* Here because they might require code to create the type so can't be
- statically defined in the global */
- type_data[0].type = CITRIX_SERVER_TYPE;
- type_data[1].type = RDP_SERVER_TYPE;
- type_data[2].type = UCCS_SERVER_TYPE;
-
- g_test_add_data_func ("/server/object/creation/citrix", &type_data[0], test_object_creation);
- g_test_add_data_func ("/server/object/creation/rdp", &type_data[1], test_object_creation);
- g_test_add_data_func ("/server/object/creation/uccs", &type_data[2], test_object_creation);
-
- g_test_add_data_func ("/server/object/keyfile/citrix", &(type_data[0]), test_object_keyfile_basics);
- g_test_add_data_func ("/server/object/keyfile/rdp", &(type_data[1]), test_object_keyfile_basics);
- g_test_add_data_func ("/server/object/keyfile/uccs", &(type_data[2]), test_object_keyfile_basics);
-
- g_test_add_data_func ("/server/object/variant/citrix", &(type_data[0]), test_object_variant);
- g_test_add_data_func ("/server/object/variant/rdp", &(type_data[1]), test_object_variant);
- g_test_add_data_func ("/server/object/variant/uccs", &(type_data[2]), test_object_variant);
-
- g_test_add_func ("/server/uccs/exec", test_uccs_exec);
- g_test_add_func ("/server/uccs/domains", test_uccs_domains);
- g_test_add_func ("/server/uccs/signal", test_update_signal);
-
- return;
-}
-
-gint
-main (gint argc, gchar * argv[])
-{
-#if !GLIB_CHECK_VERSION (2, 35, 1)
- g_type_init();
-#endif
- g_test_init(&argc, &argv, NULL);
-
- /* Test suites */
- test_objects_suite();
-
- return g_test_run ();
-}
diff --git a/tests/slmock b/tests/slmock
deleted file mode 100755
index 10ccc95..0000000
--- a/tests/slmock
+++ /dev/null
@@ -1,252 +0,0 @@
-#!/usr/bin/python3
-#
-# Copyright (C) 2012 Canonical, Ltd.
-# Copyright (C) 2015 The Arctica Project
-# Authors: Matthew Fischer <matthew.fischer at canonical.com>
-# Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
-
-import sys
-import json
-import random
-import argparse
-import string
-
-class ManagementServer():
- def __init__(self, url, name):
- self.RemoteDesktopServers = []
- self.AdditionalManagementServers = []
- self.URL = url
- self.Name = name
-
- def set_default(self, tsName):
- if isinstance(tsName, str):
- self.DefaultServer = tsName
- else:
- raise TypeError("set_default expects a string argument")
-
- def add_terminal_server(self, server):
- self.RemoteDesktopServers.append(server)
-
- def add_additional_management_server(self, amserver):
- if isinstance(amserver, AdditionalManagementServer):
- self.AdditionalManagementServers.append(amserver)
- else:
- raise TypeError("add_additional_management_server expects a "\
- "AdditionalManagementServer argument")
-
- def toJson(self):
- return json.dumps(self, default=convert_to_builtin_type)
-
-class AdditionalManagementServer():
- def __init__(self, url, name):
- self.URL = url
- self.Name = name
-
-class TerminalServer():
- def __init__(self, url, name, protocol, domainRequired = True,
- username = None, password = None):
- self.URL = url
- self.Name = name
- self.Protocol = protocol
- self.DomainRequired = domainRequired
- self.Username = username
- self.Password = password
-
- def add_domain(self, domainName):
- if isinstance(domainName, str):
- self.WindowsDomain = domainName
- else:
- raise TypeError("add_domain expects a string argument")
-
- def toJson(self):
- return json.dumps(self, default=convert_to_builtin_type)
-
-def convert_to_builtin_type(obj):
- d = { }
- d.update(obj.__dict__)
- return d
-
-def freerdp(email):
- ms = ManagementServer("http://tc.arctica-project.org", "Landscape")
- ts1 = TerminalServer("23.21.151.133", "FreeRDP US", "freerdp", False,
- "Administrator")
- ts2 = TerminalServer("46.137.222.181", "FreeRDP Asia", "freerdp", False,
- "Administrator")
- ts3 = TerminalServer("46.137.189.194", "FreeRDP UK", "freerdp", False,
- "Administrator")
- ms.add_terminal_server(ts1)
- ms.add_terminal_server(ts2)
- ms.add_terminal_server(ts3)
- ms.set_default(ts1.Name)
- print(ms.toJson())
-
-def x2go(email):
- ms = ManagementServer("http://x2go.intern", "X2GoSessionBroker")
- ts1 = TerminalServer("10.0.2.11", "X2Go Server 1", "x2go", False,
- "foo")
- ts2 = TerminalServer("10.0.2.12", "X2Go Server 2", "x2go", False,
- "bar")
- ts3 = TerminalServer("10.0.2.13", "X2Go Server 3", "x2go", False,
- "foobar")
- ms.add_terminal_server(ts1)
- ms.add_terminal_server(ts2)
- ms.add_terminal_server(ts3)
- ms.set_default(ts1.Name)
- print(ms.toJson())
-
-def print_error(text):
- print("{ \"Error\": \"%s\" }" % text)
-
-def error(email):
- print_error("Server did not respond")
-
-def citrix(email):
- ms = ManagementServer("http://tc.arctica-project.org", "Landscape")
- ts1 = TerminalServer("107.21.17.35", "Citrix USA", "ICA", True,
- "useradmin1")
- ts2 = TerminalServer("107.21.17.35", "Citrix 2", "ICA", True,
- "useradmin2")
- ts3 = TerminalServer("107.21.17.35", "Citrix 3", "ICA", True,
- "useradmin3")
- ts4 = TerminalServer("107.21.17.35", "Citrix 4", "ICA", True,
- "useradmin4", "userpass")
- ts1.add_domain("IP-0A00001E")
- ts2.add_domain("IP-0A00001E")
- ts3.add_domain("IP-0A00001E")
- ts4.add_domain("IP-0A00001E")
- ms.add_terminal_server(ts1)
- ms.add_terminal_server(ts2)
- ms.add_terminal_server(ts3)
- ms.add_terminal_server(ts4)
- print(ms.toJson())
-
-def vmware(email):
- ms = ManagementServer("http://tc.arctica-project.org", "Landscape")
- ts = TerminalServer("https://10.193.37.140", "VMWare-View Lexington",
- "vmware", True, "Administrator")
- ts.add_domain("VMWARE")
- ms.add_terminal_server(ts)
- print(ms.toJson())
-
-def defaults(email):
- ms = ManagementServer("http://tc.arctica-project.org", "Landscape")
- ts1 = TerminalServer("https://10.10.10.10", "AAA", "vmware")
- ts2 = TerminalServer("https://10.10.10.10", "ZZZ", "vmware")
- ts3 = TerminalServer("https://10.10.10.10", "MMM-Default", "vmware", True)
- ts1.add_domain("VMWARE")
- ts2.add_domain("VMWARE")
- ts3.add_domain("VMWARE")
- ms.set_default(ts3.Name)
- ms.add_terminal_server(ts1)
- ms.add_terminal_server(ts2)
- ms.add_terminal_server(ts3)
- print(ms.toJson())
-
-# a choice of random problems in the json that the parser should catch
-def missing_fields(email):
- val = random.randint(1,4)
- ms = ManagementServer("http://tc.arctica-project.org", "Landscape")
- ts3 = TerminalServer("https://10.10.10.10", "TS1-Default", "vmware", True)
- ts3.add_domain("VMWARE")
- ms.set_default(ts3.Name)
-
- # no ts's
- if val == 1:
- print(ms.toJson())
- return
-
- # no protocol in TS
- elif val == 2:
- ts3.Protocol = None
-
- # no url in TS
- elif val == 3:
- ts3.URL = None
-
- # no name in TS
- elif val == 4:
- ts3.Name = None
-
- ms.add_terminal_server(ts3)
- print(ms.toJson())
-
-def big(email):
- ms = ManagementServer("http://tc.arctica-project.org", "Landscape")
-
- ts1 = TerminalServer("107.21.17.35", "XenServer", "ICA")
- ts2 = TerminalServer("http://1.2.3.4", "Citrix2", "ICA", True,
- "fakeuser", "fakepassword")
- ts3 = TerminalServer("10.21.17.35", "Accenture", "freerdp", True,
- "fakeuser")
- ts4 = TerminalServer("https://4.5.6.7", "Accenture 2", "freerdp", False)
- ts5 = TerminalServer("5.21.17.35", "VmWare Cloud", "vmware", False,
- "fakeuser", "fakepassword")
- ts6 = TerminalServer("http://8.9.10.11", "Canonicloud", "vmware", True)
-
- ts1.add_domain("ASIA")
- ts2.add_domain("DOMAIN1")
- ts3.add_domain("EUROPE")
- ts4.add_domain("domain2")
-
- ms.add_terminal_server(ts1)
- ms.add_terminal_server(ts2)
- ms.add_terminal_server(ts3)
- ms.add_terminal_server(ts4)
- ms.add_terminal_server(ts5)
- ms.add_terminal_server(ts6)
- ms.set_default(ts4.Name)
-
- ams1 = AdditionalManagementServer("http://1.2.3.4", "AMS1")
- ams2 = AdditionalManagementServer("http://5.6.7.8", "Landscape - Accenture")
- ams3 = AdditionalManagementServer("http://10.10.10.10", "AMS3")
- ms.add_additional_management_server(ams1)
- ms.add_additional_management_server(ams2)
- ms.add_additional_management_server(ams3)
-
- print(ms.toJson())
-
-def garbage(email):
- print("{, garbage''''''''}}}}}}}}{{{},garbage\n\r\n\n\n\n")
-
-def random_string(email):
- numchars = random.randint(0,4096)
- print(''.join(random.choice(string.printable) for x in range(numchars)))
-
-emailaddrs = {"b" : big, #lots of domains/servers
- "c" : citrix,
- "d" : defaults, #for easy testing of default ts
- "e" : error,
- "f" : freerdp,
- "x" : x2go,
- "g" : garbage,
- "m" : missing_fields, #json missing some fields
- "r" : random_string,
- "v" : vmware,
-}
-
-def help():
- helpstr = "Email address to retrieve server info for. Currently "\
- "the options are: "
- emaillist = ""
- for key in emailaddrs:
- emaillist += key + ", "
- helpstr += emaillist[:-2]
- return helpstr
-
-if __name__ == "__main__":
- parser = argparse.ArgumentParser()
- parser.add_argument('email', help=help())
-
- args = parser.parse_args()
-
- password = sys.stdin.read()
-
- if args.email in emailaddrs:
- if password != args.email:
- print_error("Invalid password")
- sys.exit(-1);
- else:
- emailaddrs[args.email](args.email)
- else:
- print_error("Invalid username")
- sys.exit(-1);
diff --git a/tests/slmock-config.conf.in b/tests/slmock-config.conf.in
deleted file mode 100644
index 153ab2e..0000000
--- a/tests/slmock-config.conf.in
+++ /dev/null
@@ -1,9 +0,0 @@
-[Remote Logon Service]
-Servers=SLMock Server
-
-[Server SLMock Server]
-Name=SLMock
-Type=UCCS
-URI=https://slmock.com/
-Exec=@slmock@
-NetworkRequired=None
diff --git a/tests/uccs-config.conf b/tests/uccs-config.conf
deleted file mode 100644
index 55a6573..0000000
--- a/tests/uccs-config.conf
+++ /dev/null
@@ -1,9 +0,0 @@
-[Remote Logon Service]
-Servers=Test Server
-
-[Server Test Server]
-Name=Test Server Name
-Type=UCCS
-URI=https://uccs.test.mycompany.com/
-Exec=ls
-NetworkRequired=None
--
Alioth's /srv/git/code.x2go.org/remote-login-service-x2go.git//..//_hooks_/post-receive-email on /srv/git/code.x2go.org/remote-login-service-x2go.git
More information about the x2go-commits
mailing list