python-fedora-0.10.0/0000775000175000017500000000000013234574425016776 5ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/README.rst0000664000175000017500000002333413137632523020466 0ustar puiterwijkpuiterwijk00000000000000==================== Python Fedora Module ==================== :Author: Patrick Uiterwijk :Date: 21 April 2016 :Version: 0.8.x The Fedora module provides a python API for building `Fedora Services`_ and clients that connect to them. It has functions and classes that help to build TurboGears_ applications and classes to make building clients of those services much easier. .. _`Fedora Services`: doc/service.html .. _TurboGears: http://www.turbogears.org .. contents:: ------- License ------- This python module is distributed under the terms of the GNU Lesser General Public License Version 2 or later. ------------ Dependencies ------------ ``python-fedora`` requires the ``munch``, ``kitchen``, and ``requests`` python modules. It used to use ``pycurl``, but was updated to use ``requests`` as of version ``0.3.32``. The ``flask_fas_openid`` module requires the ``python-openid`` and ``python-openid-teams`` modules. ---------- Installing ---------- ``python-fedora`` is found in rpm form in Fedora proper. Sometimes a new version will be placed in the Fedora Infrastructure ``yum`` repository for testing within Infrastructure before being released to the general public. Installing from the yum repository should be as easy as:: $ yum install python-fedora If you want to install from a checkout of the development branch, follow these procedures:: $ git clone https://github.com/fedora-infra/python-fedora.git $ cd python-fedora $ ./setup.py install See the configuration notes in each section for information on configuring your application after install. --------------------------- Fedora Accounts Integration --------------------------- We provide several modules that make connecting to the `Fedora Account System`_ easier. .. _`Fedora Account System`: https://fedorahosted.org/fas General Purpose API =================== The ``fedora.accounts.fas2`` module allows code to integrate with the `Fedora Account System`_. It uses the JSON interface provided by the Account System servre to retrieve information about users. Note: This API is not feature complete. If you'd like to help add methods, document the existing methods, or otherwise aid in development of this API please contact us on the infrastructure list: infrastructure@lists.fedoraproject.org or on IRC: lmacken, abadger1999, and ricky in ``#fedora-admin``, ``irc.freenode.net`` Using the general API requires instantiating an ``AccountSystem`` object. You then use methods on the ``AccountSystem`` to get and set information on the people in the account system. At the moment, there are only a few methods implemented. Full documentation on these methods is available from the ``AccountSystem``'s docstrings from the interpreter or, for instance, by running:: $ pydoc fedora.accounts.fas2.AccountSystem Here's an example of using the ``AccountSystem``:: from fedora.accounts.fas2 import AccountSystem from fedora.client import AuthError # Get an AccountSystem object. All AccountSystem methods need to be # authenticated so you might as well give username and password here. fas = AccountSystem(username='foo', password='bar') people = fas.people_by_id() TurboGears Interface ==================== The TurboGears_ interface also uses the JSON interface to the account system. It provides a TurboGears_ ``visit`` and ``identity`` plugin so a TurboGears_ application can authorize via FAS. Since the plugin operates over JSON, it is possible to use these plugins on hosts outside of Fedora Infrastructure as well as within. Remember, however, that entering your Fedora password on a third party website requires you to trust that website. So doing things this way is more useful for developers wanting to work on their apps outside of Fedora Infrastructure than a general purpose solution for allowing Fedora Users to access your web app. (SSL client certificates and OpenID are better solutions to this problem but they are still being implemented in the FAS2 server.) Configuring ----------- To configure your TurboGears_ application, you need to set the following variables in your pkgname/config/app.cfg file:: fas.url='https://admin.fedoraproject.org/accounts/' visit.on=True visit.manager="jsonfas" identity.on="True" identity.failure_url="/login" identity.provider="jsonfas" --------------- Fedora Services --------------- ``python-fedora`` provides several helper classes and functions for building a TurboGears_ application that works well with other `Fedora Services`_. the `Fedora Services`_ documentation is the best place to learn more about these. ----------------- TurboGears Client ----------------- There is a module to make writing a client for our TurboGears services very easy. Please see the `client documentation`_ for more details .. _`client documentation`: doc/client.rst ----------------- Building the docs ----------------- You'll need to install python-sphinx for this:: yum install python-sphinx Then run this command:: python setup.py build_sphinx ------------ Translations ------------ The strings in python-fedora has mainly error messages. These are translated so we should make sure that translators are able to translate them when necessary. You will need babel, setuptools, and zanata-client to run these commands:: yum install babel setuptools zanata-client Much information about using zanata for translations can be found in the `zanata user's guide`_. The information in this section is largely from experimenting with the information in the `zanata client documentation`_ .. _`zanata user's guide`: http://zanata.readthedocs.org .. _`zanata client documentation`: http://zanata-client.readthedocs.org/en/latest/ Updating the POT File ===================== When you make changes that change the translatable strings in the package, you should update the POT file. Use the following distutils command (provided by python-babel) to do that:: ./setup.py extract_messages -o translations/python-fedora.pot zanata-cli push Then commit your changes to source control. Updating the PO Files ===================== `fedora.zanata.org `_ will merge the strings inside the pot file with the already translated strings. To merge these, we just need to pull revised versions of the po files:: zanata-cli pull Then commit the changes to source control (look for any brand new PO files that zanata may have created). Creating a new PO File ====================== The easiest way to create a new po file for a new language is in 's web UI. * Visit `this `_ Compiling Message Catalogs ========================== Message catalogs can be compiled for testing and should always be compiled just prior to release. Do this with the following script:: python releaseutils.py build_catalogs Compiled message catalogs should not be committed to source control. Installing Message Catalogs =========================== ``python releaseutils.py install_catalogs`` will install the catalogs. This command may be customized through the use of environment variables. See ``python releaseutils.py --help`` for details. ------- Release ------- 0) Commit all features, hotfixes, etc that you want in the release into the develop branch. 1) Checkout a copy of the repository and setup git flow:: git clone https://github.com/fedora-infra/python-fedora.git cd python-fedora git flow init 2) Create a release branch for all of our work:: git flow release start $VERSION 3) Download new translations and verify they are valid by compiling them:: zanata-cli pull python releaseutils.py build_catalogs # If everything checks out git commit -m 'Merge new translations from fedora.zanata.org' 4) Make sure that the NEWS file is accurate (use ``git log`` if needed). 5) Update python-fedora.spec and fedora/release.py with the new version information.:: # Make edits to python-fedora.spec and release.py git commit 6) Make sure the docs are proper and publish them:: # Build docs and check for errors python setup.py build_sphinx # pypi python setup.py upload_docs 7) Push the release branch to the server:: # Update files git flow release publish $VERSION 8) Go to a temporary directory and checkout a copy of the release:: cd .. git clone https://github.com/fedora-infra/python-fedora.git release cd release git checkout release/$VERSION 9) Create the tarball in this clean checkout:: python setup.py sdist 10) copy the dist/python-fedora-VERSION.tar.gz and python-fedora.spec files to where you build Fedora RPMS. Do a test build:: cp dist/python-fedora-*.tar.gz python-fedora.spec /srv/git/python-fedora/ pushd /srv/git/python-fedora/ fedpkg switch-branch master make mockbuild 11) Make sure the build completes. Run rpmlint on the results. Install and test the new packages:: rpmlint *rpm sudo rpm -Uvh *noarch.rpm [test] 12) When satisfied that the build works, create a fresh tarball and upload to pypi:: popd # Back to the release directory python setup.py sdist upload --sign 13) copy the same tarball to fedorahosted. The directory to upload to is slightly different for fedorahosted admins vs normal fedorahosted users: Admin:: scp dist/python-fedora*tar.gz* fedorahosted.org:/srv/web/releases/p/y/python-fedora/ Normal contributor:: scp dist/python-fedora*tar.gz* fedorahosted.org:python-fedora 14) mark the release as finished in git:: cd ../python-fedora git flow release finish $VERSION git push --all git push --tags 15) Finish building and pushing packages for Fedora. python-fedora-0.10.0/.tx/0000775000175000017500000000000013234574425017507 5ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/.tx/config0000664000175000017500000000025513137632523020675 0ustar puiterwijkpuiterwijk00000000000000[main] host = https://www.transifex.com [python-fedora.python-fedorapot] file_filter = translations/.po source_file = translations/python-fedora.pot source_lang = en python-fedora-0.10.0/COPYING0000664000175000017500000004311613137632523020032 0ustar puiterwijkpuiterwijk00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) 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 this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. 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. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the 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 a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE 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. 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 convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision 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, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This 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 Library General Public License instead of this License. python-fedora-0.10.0/doc/0000775000175000017500000000000013234574425017543 5ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/doc/CSRF.rst0000664000175000017500000004027213137632523021033 0ustar puiterwijkpuiterwijk00000000000000.. _CSRF-Protection: =============== CSRF Protection =============== :Authors: Toshio Kuratomi :Date: 21 February 2009 :For Version: 0.3.x .. currentmodule:: fedora.tg.utils :term:`CSRF`, Cross-Site Request Forgery is a technique where a malicious website can gain access to a Fedora Service by hijacking a currently open session in a user's web browser. This technique affects identification via SSL Certificates, cookies, or anything else that the browser sends to the server automatically when a request to that server is made. It can take place over both GET and POST. GET requests just need to hit a vulnerable URL. POST requests require JavaScript to construct the form that is sent to the vulnerable server. .. note:: If you just want to implement this in :ref:`Fedora-Services`, skip to the `Summary of Changes Per App`_ section -------------- How CSRF Works -------------- 1) A vulnerable web service allows users to change things on their site using just a cookie for authentication and submission of a form or by hitting a URL with an ``img`` tag. 2) A malicious website is crafted that looks harmless but has JavaScript or an ``img`` tag that sends a request to the web service with the form data or just hits the vulnerable URL. 3) The user goes somewhere that people who are frequently logged into the site are at and posts something innocuous that gets people to click on the link to the malicious website. 4) When a user who is logged into the vulnerable website clicks on the link, their web browser loads the page. It sees the img tag and contacts the vulnerable website to request the listed URL *sending the user's authentication cookie automatically*. 5) The vulnerable server performs the action that the URL requires as the user whose cookies were sent and the damage is done... typically without the user knowing any better until much later. ----------------- How to Prevent It ----------------- Theory ====== In order to remove this problem we need to have a shared secret between the user's browser and the web site that is only available via the http request-response. This secret is required in order for any actions to be performed on the site. Because the :term:`Same Origin Policy` prevents the malicious website from reading the web page itself, a shared secret passed in this manner will prevent the malicious site from performing any actions. Note that this secret cannot be transferred from the user's browser to the server via a cookie because this is something that the browser does automatically. It can, however, be transferred from the server to the browser via a cookie because the browser prevents scripts from other domains from *reading* the cookies. Practice ======== The strategy we've adopted is sometimes called :term:`double submit`. Every time we POST a form or make a GET request that requires us to be authenticated we must also submit a token consisting of a hash of the ``tg-visit`` to show the server that we were able to read either the cookie or the response from a previous request. We store the token value in a GET or POST parameter named ``_csrf_token``. If the server receives the ``tg-visit`` without the ``_csrf_token`` parameter, the server renders the user anonymous until the user clicks another link. .. note:: We hash the ``tg-visit`` session to make the token because we sometimes send the token as a parameter in GET requests so it will show up in the servers http logs. Verifying the Token ------------------- The :mod:`~fedora.tg.identity.jsonfasprovider1` does the work of verifying that ``_csrf_token`` has been set and that it is a valid hash of the ``tg-visit`` token belonging to the user. The sequence of events to verify a user's identity follows this outline: 1) If username and password given 1. Verify with the identity provider that the username and password match 1) [YES] authenticate the user 2) [NO] user is anonymous. 2) if tg-visit cookie present 1. if session_id from ``tg-visit`` is in the db and not expired and (sha1sum(``tg-visit``) matches ``_csrf_token`` given as a (POST variable or GET variable) 1) [YES] authenticate the user 2) [NO] Take user to login page that just requires the user to click a link. Clicking the link shows that it's not just JavaScript in the browser attempting to load the page but an actual user. Once the link is clicked, the user will have a ``_csrf_token``. If the link is not clicked the user is treated as anonymous. 2. Verify via SSL Certificate 1) SSL Certificate is not revoked and able to retrieve info for the username and (sha1sum(``tg-visit``) matches ``_csrf_token`` given as a POST variable or GET variable) 1. [YES] authenticate the user 2. [NO] Take user to login page that just requires the user to click a link. Clicking the link shows that it's not just JavaScript in the browser attempting to load the page but an actual user. Once the link is clicked, the user will have a ``_csrf_token``. If the link is not clicked the user is treated as anonymous. This work should mostly happen behind the scenes so the application programmer does not need to worry about this. .. seealso:: The :mod:`~fedora.tg.identity.jsonfasprovider1` documentation has more information on methods that are provided by the identity provider in case you do need to tell what the authentication token is and whether it is missing. Getting the Token into the Page ------------------------------- Embedding the :term:`CSRF` token into the URLs that the user can click on is the other half of this problem. :mod:`fedora.tg.utils` provides two functions to make this easier. .. autofunction:: url This function does everything :func:`tg.url` does in the templates. In addition it makes sure that ``_csrf_token`` is appended to the URL. .. autofunction:: enable_csrf This function sets config values to allow ``_csrf_token`` to be passed to any URL on the server and makes :func:`turbogears.url` point to our :func:`url` function. Once this is run, the :func:`tg.url` function you use in the templates will make any links that use with it contain the :term:`CSRF` protecting token. Intra-Application Links ~~~~~~~~~~~~~~~~~~~~~~~ We support single sign-on among the web applications we've written for Fedora. In order for this to continue working with this :term:`CSRF` protection scheme we have to add the ``_csrf_token`` parameter to links between :ref:`Fedora-Services`. Linking from the PackageDB to Bodhi, for instance, needs to have the hash appended to the URL for Bodhi. Our :func:`url` function is capable of generating these by passing the full URL into the function like this:: Bodhi .. note:: You probably already use :func:`tg.url` for links within you web app to support :attr:`server.webpath`. Adding :func:`tg.url` to external links is new. You will likely have to update your application's templates to call :func:`url` on these URLs. Logging In ---------- Each app's :meth:`login` controller method and templates need to be modified in several ways. .. _CSRF-Login-Template: Templates ~~~~~~~~~ For the templates, python-fedora provides a set of standard templates that can be used to add the token. .. automodule:: fedora.tg.templates.genshi Using the ```` template will give you a login form that automatically does several things for you. 1. The ``forward_url`` and ``previous_url`` parameters that are passed in hidden form elements will be run through :func:`tg.url` in order to get the ``_csrf_token`` added. 2. The page will allow "Click through validation" of a user when they have a valid ``tg-visit`` but do not have a ``_csrf_token``. Here's a complete login.html from the pkgdb to show what this could look like:: Login to the PackageDB ${message} You should notice that this looks like a typical genshi_ template in your project with two new features. The ```` tag in the body that's defined in :mod:`fedora.tg.templates.genshi` is used in the body to pull in the login formand the ```` of :file:`login.html` uses :func:`tg.fedora_template` to load the template from python-fedora. This function resides in :mod:`fedora.tg.utils` and is added to the ``tg`` template variable when :func:`~fedora.tg.utils.enable_csrf` is called at startup. It does the following: .. currentmodule:: fedora.tg.utils .. autofunction:: fedora_template .. _genshi: http://genshi.edgewall.org .. _`genshi match template`: http://genshi.edgewall.org/wiki/Documentation/0.5.x/xml-templates.html#py:match The second match template in :file:`login.html` is to help you modify the login and logout links that appear at the top of a typical application's page. This is an optional change that lets the links display a click-through login link in addition to the usual login and logout. To use this, you would follow the example to add a ``toolbar`` with the ```` into your master template. Here's some snippets from a :file:`master.html` to illustrate:: [...] [...] [...] .. warning:: Notice that the ```` of :file:`login.html` happens after the ```` tag? It is important to do that because the ```` tag in :file:`master.html` is a match template just like ````. In genshi_, the order in which match templates are defined is significant. If you need to look at these templates to modify them yourself (perhaps to port them to a different templating language) you can find them in :file:`fedora/tg/templates/genshi/login.html` in the source tarball. .. _CSRF-controller-methods: Controllers ~~~~~~~~~~~ Calling :ref:`Fedora-Services` from JavaScript poses one further problem. Sometimes the user will not have a current :term:`CSRF` token and will need to log in. When this is done with a username and password there's no problem because the username and password are sufficient to prove the user is in control of the browser. However, when using an SSL Certificate, we need the browser to log in and then use the new :term:`CSRF` token to show the user is in control. Since JavaScript calls are most likely going to request the information as JSON, we need to provide the token in the dict returned from :meth:`login`. You can either modify your :meth:`login` method to do that or use the one provided in :func:`fedora.tg.controllers.login`. .. note:: Fedora Services do not currently use certificate authentication but doing it would not take much code. Working out the security ramifications within Infrastructure is the main sticking point to turning this on. .. note:: The `Fedora Account System `_ has a slightly different login() method. This is because it has to handle account expiration, mandatory password resets, and other things tied to the status of an account. Other Fedora Services rely on FAS to do this instead of having to handle it themselves. .. automodule:: fedora.tg.controllers :members: AJAX ==== Making JavaScript calls requires that we can get the token and add it to the URLs we request. Since JavaScript doesn't have a standard library of crypto functions we provide the token by setting it via a template so we do not have to calculate it on the client. This has the added bonus of propagating a correct token even if we change the hash function later. Making use of the token can then be done in ad hoc JavaScript code but is better handled via a dedicated JavaScript method like the :class:`fedora.dojo.BaseClient`. Template -------- .. automodule:: fedora.tg.templates.genshi.jsglobals .. warning:: Just like :file:`login.html`, the ```` tag needs to come after the ```` tag since they're both match templates. JavaScript ---------- The :class:`fedora.dojo.BaseClient` class has been modified to send and update the csrf token that is provided by fedora.identity.token. It is highly recommended that you use this library or another like it to make all calls to the server. This keeps you from having to deal with adding the :term:`CSRF` token to every call yourself. Here's a small bit of sample code:: -------------------------- Summary of Changes Per App -------------------------- * On startup, run :func:`~fedora.tg.utils.enable_csrf`. This could be done in a start-APP.py and APP.wsgi scripts. Code like this will do it:: from turbogears import startup from fedora.tg.utils import enable_csrf startup.call_on_startup.append(enable_csrf) * Links to other :ref:`Fedora-Services` in the templates must be run through the :func:`tg.url` method so that the :term:`CSRF` token can be appended. * You must use an updated login template. Using the one provided in python-fedora is possible by changing your login template as shown in the :ref:`CSRF-login-template` section. * Optional: update the master template that shows the Login/Logout Link to have a "Verify Login" button. You can add one to a toolbar in your application following the instructions in the :ref:`CSRF-login-template` section. * Use an updated identity provider from python-fedora. At this time, you need python-fedora 0.3.10 or later which has a :mod:`~fedora.tg.identity.jsonfasprovider2` and :mod:`~fedora.tg.visit.jsonfasvisit2` that provide :term:`CSRF` protection. The original :mod:`~fedora.tg.identity.jsonfasprovider1` is provided for applications that have not yet started using :func:`~fedora.tg.utils.enable_csrf` so you have to make this change in your configuration file (:file:`APPNAME/config/app.cfg`) * Get the :term:`CSRF` token into your forms and URLs. The recommended way to do this is to use :func:`tg.url` in your forms for URLs that are local to the app or are for :ref:`Fedora-Services`. * Update your :meth:`login` method to make sure you're setting ``forward_url = request.path_info`` rather than ``request.path``. One easy way to do this is to use the :meth:`~fedora.tg.controllers.login` and :meth:`~fedora.tg.controllers.logout` as documented in :ref:`CSRF-controller-methods` * Add the token and other identity information so JavaScript can get at it. Use the :mod:`~fedora.tg.templates.genshi.jsglobals` template to accomplish this. **This one still needs to be implemented** * AJAX calls need to be enhanced to append the CSRF token to the data. This is best done using a JavaScript function for this like the :class:`fedora.dojo.BaseClient` library. python-fedora-0.10.0/doc/glossary.rst0000664000175000017500000001075113137632523022140 0ustar puiterwijkpuiterwijk00000000000000.. _glossary: ======== Glossary ======== .. glossary:: controller In MVC design, the controller is in charge of things. It takes processes events and decides what data to ask the :term:`model` for, manipulates the data according to the information in the event, and decides which :term:`view` to send the results to to be rendered. CSRF `Cross-site request forgery `_ is a technique where a malicious website can gain access to another web site by hijaacking a currently open session that the user has open to the site. This technique can also affect identification via SSL Certificates or anything else that the browser sends to the server automatically when a request is made. .. seealso:: :ref:`CSRF-Protection` Dojo Dojo is a JavaScript toolkit that aims to be a standard library for JavaScript. It provides a small core library with useful functions and an expanded set of scripts that can be added that provide widgets and other features. .. seealso:: http://www.dojotoolkit.org double submit A strategy to foil :term:`CSRF` attacks. This strategy involves sending the value of the authentication cookie (or something derivable only from knowing the value of the authentication cookie) in the body of the request. Since the :term:`Same Origin Policy` prevents a web site other than the one originating the cookie from reading what's in the cookie, the server can be reasonably assured that the request does not originate from an unknown request on another website. Note that this and other anti-CSRF measures do not protect against spoofing or getting a user to actively click on a link on an attacked website by mistake. flask A simple Python web framework that we're using in parts of Fedora Infrastructure. It provides good documentation and simplicity in its design. .. seealso:: http://flask.pocoo.org/docs/ JSON `JavaScript Object Notation `_ is a format for marshalling data. It is based on a subset of JavaScript that is used to declare objects. Compared to xml, JSON is a lightweight, easily parsed format. .. seealso:: `Wikipedia's JSON Entry `_ model In MVC design, the layer that deals directly with the data. OpenID A specification for single sign on to web services where the authentication server and the application seeking to have the user authenticated do not need to have complete trust in each other. .. seealso:: http://openid.net/get-an-openid/what-is-openid/ Same Origin Policy A web browser security policy that prevents one website from reading: 1) the cookies from another website 2) the response body from another website .. seealso:: http://en.wikipedia.org/wiki/Same_origin_policy single sign-on A feature that allows one login to authenticate a user for multiple applications. So logging into one application will authenticate you for all the applications that support the same single-sign-on infrastructure. TurboGears A Python web framework that most of Fedora Infrastructure's apps are built on. .. seealso:: http://www.turbogears.org/ TurboGears2 The successor to :term:`TurboGears`, TurboGears2 provides a very similar framework to coders but has some notable differences. It is based on pylons and paste so it is much more tightly integrated with :term:`WSGI`. The differences with :ref`TurboGears`1 are largely with the organization of code and how to configure the application. .. seealso:: http://www.turbogears.org/ view In MVC design, the layer that takes care of formatting and rendering data for the consumer. This could be displaying the data as an html page or marshalling it into :term:`JSON` objects. WSGI WSGI is an interface between web servers and web frameworks that originated in the Python community. WSGI lets different components embed each other even if they were originally written for different python web frameworks. .. seealso:: http://en.wikipedia.org/wiki/Web_Server_Gateway_Interface python-fedora-0.10.0/doc/static/0000775000175000017500000000000013234574425021032 5ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/doc/static/EMPTY0000664000175000017500000000000013137632523021635 0ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/doc/auth.rst0000664000175000017500000000760513137632523021242 0ustar puiterwijkpuiterwijk00000000000000===================== Authentication to FAS ===================== The :ref:`Fedora-Account-System` has a :term:`JSON` interface that we make use of to authenticate users in our web apps. Currently, there are two modes of operation. Some web apps have :term:`single sign-on` capability with :ref:`FAS`. These are the :term:`TurboGears` applications that use the :mod:`~fedora.tg.identity.jsonfasprovider`. Other apps do not have :term:`single sign-on` but they do connect to :ref:`FAS` to verify the username and password so changing the password in :ref:`FAS` changes it everywhere. .. _jsonfas2: TurboGears Identity Provider 2 ============================== An identity provider with :term:`CSRF` protection. This will install as a TurboGears identity plugin. To use it, set the following in your :file:`APPNAME/config/app.cfg` file:: identity.provider='jsonfas2' visit.manager='jsonfas2' .. seealso:: :ref:`CSRF-Protection` .. automodule:: fedora.tg.identity.jsonfasprovider2 :members: JsonFasIdentity, JsonFasIdentityProvider :undoc-members: .. automodule:: fedora.tg.visit.jsonfasvisit2 :members: JsonFasVisitManager :undoc-members: .. _jsonfas1: Turbogears Identity Provider 1 ============================== These methods are **deprecated** because they do not provide the :term:`CSRF` protection of :ref:`jsonfas2`. Please use that identity provider instead. .. automodule:: fedora.tg.identity.jsonfasprovider1 :members: JsonFasIdentity, JsonFasIdentityProvider :undoc-members: :deprecated: .. automodule:: fedora.tg.visit.jsonfasvisit1 :members: JsonFasVisitManager :undoc-members: :deprecated: .. _djangoauth: Django Authentication Backend ============================= .. toctree:: :maxdepth: 2 django .. _flask_fas: Flask Auth Plugin ================= .. toctree:: :maxdepth: 2 flask_fas .. _flaskopenid: Flask FAS OpenId Auth Plugin ============================ The flask_openid provider is an alternative to the flask_fas auth plugin. It leverages our FAS-OpenID server to do authn and authz (group memberships). Note that not every feature is available with a generic OpenID provider -- the plugin depends on the OpenID provider having certain extensions in order to provide more than basic OpenID auth. * Any compliant OpenID server should allow you to use the basic authn features of OpenID OpenID authentication core: http://openid.net/specs/openid-authentication-2_0.html * Retrieving simple information about the user such as username, human name, email is done with sreg: http://openid.net/specs/openid-simple-registration-extension-1_0.html which is an extension supported by many providers. * Advanced security features such as requiring a user to re-login to the OpenID provider or specifying that the user login with a hardware token requires the PAPE extension: http://openid.net/specs/openid-provider-authentication-policy-extension-1_0.html * To get groups information, the provider must implement the https://dev.launchpad.net/OpenIDTeams extension. * We have extended the teams extension so you can request a team name of ``_FAS_ALL_GROUPS_`` to retrieve all the groups that a user belongs to. Without this addition to the teams extension you will need to manually configure which groups you are interested in knowing about. See the documentation for how to do so. * Retrieving information about whether a user has signed a CLA (For Fedora, this is the Fedora Project Contributor Agreement). http://fedoraproject.org/specs/open_id/cla If the provider you use does not support one of these extensions, the plugin should still work but naturally, it will return empty values for the information that the extension would have provided. .. toctree:: :maxdepth: 2 flask_fas_openid .. _faswho: FAS Who Plugin for TurboGears2 ============================== .. toctree:: :maxdepth: 2 faswho python-fedora-0.10.0/doc/flask_fas.rst0000664000175000017500000002250513137632523022226 0ustar puiterwijkpuiterwijk00000000000000===================== FAS Flask Auth Plugin ===================== :Authors: Toshio Kuratomi, Ian Weller :Date: 29 October 2012 :For Version: 0.3.x The :ref:`Fedora-Account-System` has a :term:`JSON` interface that we make use of to authenticate users in our web apps. For our :term:`Flask` applications we have an identity provider that has :term:`single sign-on` with our :term:`TurboGears` 1 and 2 applications. It does not protect against :term:`CSRF` attacks in the identity layer. The flask-wtf forms package should be used to provide that. ------------- Configuration ------------- The FAS auth plugin has several config values that can be used to control how the auth plugin functions. You can set these in your application's config file. FAS_BASE_URL Set this to the URL of the FAS server you are authenticating against. Default is "https://admin.fedoraproject.org/accounts/" FAS_USER_AGENT User agent string to be used when connecting to FAS. You can set this to something specific to your application to aid in debugging a connection to the FAS server as it will show up in the FAS server's logs. Default is "Flask-FAS/|version|" FAS_CHECK_CERT When set, this will check the SSL Certificate for the FAS server to make sure that it is who it claims to be. This is useful to set to False when testing against a local FAS server but should always be set to True in production. Default: True FAS_COOKIE_NAME The name of the cookie used to store the session id across the Fedora Applications that support :term:`single sign-on`. Default: "tg-visit" FAS_FLASK_COOKIE_REQUIRES_HTTPS When this is set to True, the session cookie will only be returned to the server via ssl (https). If you connect to the server via plain http, the cookie will not be sent. This prevents sniffing of the cookie contents. This may be set to False when testing your application but should always be set to True in production. Default is True. ------------------ Sample Application ------------------ The following is a sample, minimal flask application that uses fas_flask for authentication:: #!/usr/bin/python -tt # Flask-FAS - A Flask extension for authorizing users with FAS # Primary maintainer: Ian Weller # # Copyright (c) 2012, Red Hat, Inc. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # * Neither the name of the Red Hat, Inc. nor the names of its contributors may # be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ''AS IS'' AND ANY # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # This is a sample application. In addition to using Flask-FAS, it uses # Flask-WTF (WTForms) to handle the login form. Use of Flask-WTF is highly # recommended because of its CSRF checking. import flask from flask.ext import wtf from flask.ext.fas import FAS, fas_login_required # Set up Flask application app = flask.Flask(__name__) # Set up FAS extension fas = FAS(app) # Application configuration # SECRET_KEY is necessary to CSRF in WTForms. It nees to be secret to # make the csrf tokens unguessable but if you have multiple servers behind # a load balancer, the key needs to be the same on each. app.config['SECRET_KEY'] = 'change me!' # Other configuration options for Flask-FAS: # FAS_BASE_URL: the base URL for the accounts system # (default https://admin.fedoraproject.org/accounts/) # FAS_CHECK_CERT: check the SSL certificate of FAS (default True) # FAS_FLASK_COOKIE_REQUIRES_HTTPS: send the 'secure' option with # the login cookie (default True) # You should use these options' defaults for production applications! app.config['FAS_BASE_URL'] = 'https://fakefas.fedoraproject.org/accounts/' app.config['FAS_CHECK_CERT'] = False app.config['FAS_FLASK_COOKIE_REQUIRES_HTTPS'] = False # A basic login form class LoginForm(wtf.Form): username = wtf.TextField('Username', [wtf.validators.Required()]) password = wtf.PasswordField('Password', [wtf.validators.Required()]) # Inline templates keep this test application all in one file. Don't do this in # a real application. Please. TEMPLATE_START = """

Flask-FAS test app

{% if g.fas_user %}

Hello, {{ g.fas_user.username }} — Log out {% else %}

You are not logged in — Log in {% endif %} — Main page

""" @app.route('/') def index(): data = TEMPLATE_START data += '

Check if you are cla+1

' % \ flask.url_for('claplusone') data += '

See a secret message (requires login)

' % \ flask.url_for('secret') return flask.render_template_string(data) @app.route('/login', methods=['GET', 'POST']) def auth_login(): # Your application should probably do some checking to make sure the URL # given in the next request argument is sane. (For example, having next set # to the login page will cause a redirect loop.) Some more information: # http://flask.pocoo.org/snippets/62/ if 'next' in flask.request.args: next_url = flask.request.args['next'] else: next_url = flask.url_for('index') # If user is already logged in, return them to where they were last if flask.g.fas_user: return flask.redirect(next_url) # Init login form form = LoginForm() # Init template data = TEMPLATE_START data += ('

Log into the ' 'Fedora Accounts System:') # If this is POST, process the form if form.validate_on_submit(): if fas.login(form.username.data, form.password.data): # Login successful, return return flask.redirect(next_url) else: # Login unsuccessful data += '

Invalid login

' data += """
{% for field in [form.username, form.password] %}

{{ field.label }}: {{ field|safe }}

{% if field.errors %}
    {% for error in field.errors %}
  • {{ error }}
  • {% endfor %}
{% endif %} {% endfor %} {{ form.csrf_token }}
""" return flask.render_template_string(data, form=form) @app.route('/logout') def logout(): if flask.g.fas_user: fas.logout() return flask.redirect(flask.url_for('index')) # This demonstrates the use of the fas_login_required decorator. The # secret message can only be viewed by those who are logged in. @app.route('/secret') @fas_login_required def secret(): data = TEMPLATE_START + '

Be sure to drink your Ovaltine

' return flask.render_template_string(data) # This demonstrates checking for group membership inside of a function. # The flask_fas adapter also provides a cla_plus_one_required decorator that # can restrict a url so that you can only access it from an account that has # cla +1. @app.route('/claplusone') def claplusone(): data = TEMPLATE_START if not flask.g.fas_user: # Not logged in return flask.render_template_string(data + '

You must log in to check your cla +1 status

') non_cla_groups = [x.name for x in flask.g.fas_user.approved_memberships if x.group_type != 'cla'] if len(non_cla_groups) > 0: data += '

Your account is cla+1.

' else: data += '

Your account is not cla+1.

' return flask.render_template_string(data) if __name__ == '__main__': app.run(debug=True) python-fedora-0.10.0/doc/client.rst0000664000175000017500000003136413137632523021556 0ustar puiterwijkpuiterwijk00000000000000============= Fedora Client ============= :Authors: Toshio Kuratomi Luke Macken :Date: 28 May 2008 :For Version: 0.3.x The client module allows you to easily code an application that talks to a `Fedora Service`_. It handles the details of decoding the data sent from the Service into a python data structure and raises an Exception_ if an error is encountered. .. _`Fedora Service`: service.html .. _Exception: Exceptions_ .. toctree:: ---------- BaseClient ---------- The :class:`~fedora.client.BaseClient` class is the basis of all your interactions with the server. It is flexible enough to be used as is for talking with a service but is really meant to be subclassed and have methods written for it that do the things you specifically need to interact with the `Fedora Service`_ you care about. Authors of a `Fedora Service`_ are encouraged to provide their own subclasses of :class:`~fedora.client.BaseClient` that make it easier for other people to use a particular Service out of the box. Using Standalone ================ If you don't want to subclass, you can use :class:`~fedora.client.BaseClient` as a utility class to talk to any `Fedora Service`_. There's three steps to this. First you import the :class:`~fedora.client.BaseClient` and Exceptions_ from the ``fedora.client`` module. Then you create a new :class:`~fedora.client.BaseClient` with the URL that points to the root of the `Fedora Service`_ you're interacting with. Finally, you retrieve data from a method on the server. Here's some code that illustrates the process:: from fedora.client import BaseClient, AppError, ServerError client = BaseClient('https://admin.fedoraproject.org/pkgdb') try: collectionData = client.send_request('/collections', auth=False) except ServerError as e: print('%s' % e) except AppError as e: print('%s: %s' % (e.name, e.message)) for collection in collectionData['collections']: print('%s %s' % (collection['name'], collection['version']) BaseClient Constructor ~~~~~~~~~~~~~~~~~~~~~~ In our example we only provide ``BaseClient()`` with the URL fragment it uses as the base of all requests. There are several more optional parameters that can be helpful. If you need to make an authenticated request you can specify the username and password to use when you construct your :class:`~fedora.client.BaseClient` using the ``username`` and ``password`` keyword arguments. If you do not use these, authenticated requests will try to connect via a cookie that was saved from previous runs of :class:`~fedora.client.BaseClient`. If that fails as well, :class:`~fedora.client.BaseClient` will throw an Exception_ which you can catch in order to prompt for a new username and password:: from fedora.client import BaseClient, AuthError import getpass MAX_RETRIES = 5 client = BaseClient('https://admin.fedoraproject.org/pkgdb', username='foo', password='bar') # Note this is simplistic. It only prompts once for another password. # Your application may want to loop through this several times. while (count < MAX_RETRIES): try: collectionData = client.send_request('/collections', auth=True) except AuthError as e: client.password = getpass.getpass('Retype password for %s: ' % username) else: # data retrieved or we had an error unrelated to username/password break count = count + 1 .. warning:: Note that although you can set the ``username`` and ``password`` as shown above you do have to be careful in cases where your application is multithreaded or simply processes requests for more than one user with the same :class:`~fedora.client.BaseClient`. In those cases, you can accidentally overwrite the ``username`` and ``password`` between two requests. To avoid this, make sure you instantiate a separate :class:`~fedora.client.BaseClient` for every thread of control or for every request you handle or use :class:`~fedora.client.ProxyClient` instead. The ``useragent`` parameter is useful for identifying in log files that your script is calling the server rather than another. The default value is ``Fedora BaseClient/VERSION`` where VERSION is the version of the :class:`~fedora.client.BaseClient` module. If you want to override this just give another string to this:: client = BaseClient('https://admin.fedoraproject.org/pkgdb', useragent='Package Database Client/1.0') The ``debug`` parameter turns on a little extra output when running the program. Set it to true if you're having trouble and want to figure out what is happening inside of the :class:`~fedora.client.BaseClient` code. send_request() ~~~~~~~~~~~~~~ ``send_request()`` is what does the heavy lifting of making a request of the server, receiving the reply, and turning that into a python dictionary. The usage is pretty straightforward. The first argument to ``send_request()`` is ``method``. It contains the name of the method on the server. It also has any of the positional parameters that the method expects (extra path information interpreted by the server for those building non-`TurboGears`_ applications). The ``auth`` keyword argument is a boolean. If True, the session cookie for the user is sent to the server. If this fails, the ``username`` and ``password`` are sent. If that fails, an Exception_ is raised that you can handle in your code. ``req_params`` contains a dictionary of additional keyword arguments for the server method. These would be the names and values returned via a form if it was a CGI. Note that parameters passed as extra path information should be added to the ``method`` argument instead. An example:: import BaseClient client = BaseClient('https://admin.fedoraproject.org/pkgdb/') client.send_request('/package/name/python-fedora', auth=False, req_params={'collectionVersion': '9', 'collectionName': 'Fedora'}) In this particular example, knowing how the server works, ``/packages/name/`` defines the method that the server is going to invoke. ``python-fedora`` is a positional parameter for the name of the package we're looking up. ``auth=False`` means that we'll try to look at this method without having to authenticate. The ``req_params`` sends two additional keyword arguments: ``collectionName`` which specifies whether to filter on a single distro or include Fedora, Fedora EPEL, Fedora OLPC, and Red Hat Linux in the output and ``collectionVersion`` which specifies which version of the distribution to output for. The URL constructed by :class:`~fedora.client.BaseClient` to the server could be expressed as[#]_:: https://admin.fedoraproject.org/pkgdb/package/name/python-fedora/?collectionName=Fedora&collectionVersion=9 In previous releases of python-fedora, there would be one further query parameter: ``tg_format=json``. That parameter instructed the server to return the information as JSON data instead of HTML. Although this is usually still supported in the server, :class:`~fedora.client.BaseClient` has deprecated this method. Servers should be configured to use an ``Accept`` header to get this information instead. See the `JSON output`_ section of the `Fedora Service`_ documentation for more information about the server side. .. _`TurboGears`: http://www.turbogears.org/ .. _`JSON output`: service.html#selecting-json-output .. _[#]: Note that the ``req_params`` are actually sent via ``POST`` request rather than ``GET``. Among other things, this means that values in ``req_params`` won't show up in apache logs. Subclassing =========== Building a client using subclassing builds on the information you've already seen inside of :class:`~fedora.client.BaseClient`. You might want to use this if you want to provide a module for third parties to access a particular `Fedora Service`_. A subclass can provide a set of standard methods for calling the server instead of forcing the user to remember the URLs used to access the server directly. Here's an example that turns the previous calls into the basis of a python API to the `Fedora Package Database`_:: import getpass import sys from fedora.client import BaseClient, AuthError class MyClient(BaseClient): def __init__(self, baseURL='https://admin.fedoraproject.org/pkgdb', username=None, password=None, useragent='Package Database Client/1.0', debug=None): super(BaseClient, self).__init__(baseURL, username, password, useragent, debug) def collection_list(self): '''Return a list of collections.''' return client.send_request('/collection') def package_owners(self, package, collectionName=None, collectionVersion=None): '''Return a mapping of release to owner for this package.''' pkgData = client.send_request('/packages/name/%s' % (package), {'collectionName': collectionName, 'collectionVersion': collectionVersion}) ownerMap = {} for listing in pkgData['packageListings']: ownerMap['-'.join(listing['collection']['name'], listing['collection']['version'])] = \ listing['owneruser'] return ownerMap A few things to note: 1) In our constructor we list a default ``baseURL`` and ``useragent``. This is usually a good idea as we know the URL of the `Fedora Service`_ we're connecting to and we want to know that people are using our specific API. 2) Sometimes we'll want methods that are thin shells around the server methods like ``collection_list()``. Other times we'll want to do more post processing to get specific results as ``package_owners()`` does. Both types of methods are valid if they fit the needs of your API. If you find yourself writing more of the latter, though, you may want to consider getting a new method implemented in the server that can return results more appropriate to your needs as it could save processing on the server and bandwidth downloading the data to get information that more closely matches what you need. See ``pydoc fedora.accounts.fas2`` for a module that implements a standard client API for the `Fedora Account System`_ .. _`Fedora Package Database`: https://fedorahosted.org/packagedb .. _`Fedora Account System`: https://fedorahosted.org/fas/ --------------- Handling Errors --------------- :class:`~fedora.client.BaseClient` will throw a variety of errors that can be caught to tell you what kind of error was generated. Exceptions ========== :``FedoraServiceError``: The base of all exceptions raised by :class:`~fedora.client.BaseClient`. If your code needs to catch any of the listed errors then you can catch that to do so. :``ServerError``: Raised if there's a problem communicating with the service. For instance, if we receive an HTML response instead of JSON. :``AuthError``: If something happens during authentication, like an invalid usernsme or password, ``AuthError`` will be raised. You can catch this to prompt the user for a new usernsme. :``AppError``: If there is a `server side error`_ when processing a request, the `Fedora Service`_ can alert the client of this by setting certain flags in the response. :class:`~fedora.client.BaseClient` will see these flags and raise an AppError. The name of the error will be stored in AppError's ``name`` field. The error's message will be stored in ``message``. .. _`server side error`: service.html#Error Handling Example ======= Here's an example of the exceptions in action:: from fedora.client import ServerError, AuthError, AppError, BaseClient import getpass MAXRETRIES = 5 client = BaseClient('https://admin.fedoraproject.org/pkgdb') for retry in range(0, MAXRETRIES): try: collectionData = client.send_request('/collections', auth=True) except AuthError as e: from six.moves import input client.username = input('Username: ').strip() client.password = getpass.getpass('Password: ') continue except ServerError as e: print('Error talking to the server: %s' % e) break except AppError as e: print('The server issued the following exception: %s: %s' % ( e.name, e.message)) for collection in collectionData['collections']: print('%s %s' % (collection[0]['name'], collection[0]['version'])) ---------------- OpenIdBaseClient ---------------- Applications that use OpenId to authenticate are not able to use the standard BaseClient because the pattern of authenticating is very different. We've written a separate client object called :class:`~fedora.client.OpenIdBaseClient` to do this. python-fedora-0.10.0/doc/index.rst0000664000175000017500000000104313137632523021376 0ustar puiterwijkpuiterwijk00000000000000================================== Python Fedora Module Documentation ================================== The python-fedora module makes it easier for programmers to create both Fedora Services and clients that talk to the services. It's licensed under the GNU Lesser General Public License version 2 or later. .. toctree:: :maxdepth: 2 client existing service auth javascript api glossary ================== Indices and tables ================== * :ref:`glossary` * :ref:`genindex` * :ref:`modindex` * :ref:`search` python-fedora-0.10.0/doc/service.rst0000664000175000017500000005362413137632523021743 0ustar puiterwijkpuiterwijk00000000000000.. _Fedora-Services: =============== Fedora Services =============== :Authors: Toshio Kuratomi Luke Macken :Date: 02 February 2009 :For Version: 0.3.x In the loosest sense, a Fedora Service is a web application that sends data that :class:`~fedora.client.BaseClient` is able to understand. This document defines things that a web application must currently do for :class:`~fedora.client.BaseClient` to understand it. .. fedora.tg: ------------------------ TurboGears and fedora.tg ------------------------ .. automodule:: fedora.tg All current Fedora Services are written in :term:`TurboGears`. Examples in this document will be for that framework. However, other frameworks can be used to write a Service if they can correctly create the data that :class:`~fedora.client.BaseClient` needs. A Fedora Service differs from other web applications in that certain URLs for the web application are an API layer that the Service can send and receive :term:`JSON` data from for :class:`~fedora.client.BaseClient` to interpret. This imposes certain constraints on what data can be sent and what data can be received from those URLs. The :mod:`fedora.tg` module contains functions that help you write code that communicated well with :class:`~fedora.client.BaseClient`. The :term:`TurboGears` framework separates an application into :term:`model`, :term:`view`, and :term:`controller` layers. The model is typically a database and holds the raw data that the application needs. The view formats the data before output. The controller makes decisions about what data to retrieve from the model and which view to pass it onto. The code that you'll most often need to use from :mod:`fedora.tg` operates on the :term:`controller` layer but there's also code that works on the model and view behind the scenes. ----------- Controllers ----------- .. automodule:: fedora.tg.utils The :term:`controller` is the code that processes an http request. It validates and processes requests and parameters sent by the user, gets data from the model to satisfy the request, and then passes it onto a view layer to be returned to the user. :mod:`fedora.tg.utils` contains several helpful functions for working with controllers. ----------- URLs as API ----------- .. autofunction:: request_format .. autofunction:: jsonify_validation_errors .. autofunction:: json_or_redirect In :term:`TurboGears` and most web frameworks, a URL is a kind of API for accessing the data your web app provides. This data can be made available in multiple formats. :term:`TurboGears` allows you to use one URL to serve multiple formats by specifying a query parameter or a special header. Selecting JSON Output ===================== A URL in :term:`TurboGears` can serve double duty by returning multiple formats depending on how it is called. In most cases, the URL will return HTML or XHTML by default. By adding the query parameter, ``tg_format=json`` you can switch from returning the default format to returning :term:`JSON` data. You need to add an ``@expose(allow_json=True)`` decorator [#]_ to your controller method to tell :term:`TurboGears` that this controller should return :term:`JSON` data:: @expose(allow_json=True) @expose(template='my.templates.amplifypage') def amplify(self, data): ``allow_json=True`` is a shortcut for this:: @expose("json", content_type="text/javascript", as_format="json", accept_format="text/javascript") That means that the controller method will use the ``json`` template (uses TurboJson to marshal the returned data to :term:`JSON`) to return data of type ``text/javascript`` when either of these conditions is met: a query param of ``tg_format=json`` or an ``Accept: text/javascript`` header is sent. :class:`~fedora.client.BaseClient` in python-fedora 0.1.x and 0.2.x use the query parameter method of selecting :term:`JSON` output. :class:`~fedora.client.BaseClient` 0.2.99.6 and 0.3.x use both the header method and the query parameter since the argument was made that the header method is friendlier to other web frameworks. 0.4 intends to use the header alone. If you use ``allow_json=True`` this change shouldn't matter. If you specify the ``@expose("json")`` decorator only ``accept_format`` is set. So it is advisable to include both ``as_format`` and ``accept_format`` in your decorator. Note that this is a limitation of :term:`TurboGears` <= 1.0.4.4. If your application is only going to run on :term:`TurboGears` > 1.0.4.4 you should be able to use a plain ``@expose("json")`` [#]_. .. [#] http://docs.turbogears.org/1.0/ExposeDecorator#same-method-different-template .. [#] http://trac.turbogears.org/ticket/1459#comment:4 Why Two Formats from a Single URL? ================================== When designing your URLs you might wonder why you'd want to return :term:`JSON` and HTML from a single controller method instead of having two separate controller methods. For instance, separating the URLs into their own namespaces might seem logical: ``/app/json/get_user/USERNAME`` as opposed to ``/app/user/USERNAME``. Doing things with two URLs as opposed to one has both benefits and drawbacks. Benefits of One Method Handling Multiple Formats ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Usually less code as there's only one controller method * When a user sees a page that they want to get data from, they can get it as :term:`JSON` instead of screen scraping. * Forces the application designer to think more about the API that is being provided to the users instead of just the needs of the web page they are creating. * Makes it easier to see what data an application will need to implement an alternate interface since you can simply look at the template code to see what variables are being used on a particular page. Benefits of Multiple Methods for Each Format ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Avoids special casing for error handlers (See below) * Separates URLs that you intend users to grab :term:`JSON` data from URLs where you only want to display HTML. * Allows the URLs that support :term:`JSON` to concentrate on trimming the size of the data sent while URLs that only return HTML can return whole objects. * Organization can be better if you don't have to include all of the pages that may only be useful for user interface elements. Personal use has found that allowing :term:`JSON` requests on one controller method works well for cases where you want the user to get data and for traditional form based user interaction. AJAX requests have been better served via dedicated methods. ------------- Return Values ------------- The toplevel of the return values should be a dict. This is the natural return value for :term:`TurboGears` applications. Marshaling =========== All data should be encoded in :term:`JSON` before being returned. This is normally taken care of automatically by :term:`TurboGears` and simplejson. If you are returning non-builtin objects you may have to define an `__json__()`_ method. .. _`__json__()`: `Using __json__()`_ Unicode ======= simplejson (and probably other :term:`JSON` libraries) will take care of encoding Unicode strings to :term:`JSON` so be sure that you are passing Unicode strings around rather than encoded byte strings. Error Handling ============== In python, error conditions are handled by raising an exception. However, an exception object will not propagate automatically through a return from the server. Instead we set several special variables in the returned data to inform :class:`~fedora.client.BaseClient` of any errors. At present, when :class:`~fedora.client.BaseClient` receives an error it raises an exception of its own with the exception information from the server inside. Raising the same exception as the server is being investigated but may pose security risks so hasn't yet been implemented. exc ~~~ All URLs which return :term:`JSON` data should set the ``exc`` variable when the method fails unexpectedly (a database call failed, a place where you would normally raise an exception, or where you'd redirect to an error page if a user was viewing the HTML version of the web app). ``exc`` should be set to the name of an exception and tg_flash_ set to the message that would normally be given to the exception's constructor. If the return is a success (expected values are being returned from the method or a value was updated successfully) ``exc`` may either be unset or set to ``None``. tg_flash ~~~~~~~~ When viewing the HTML web app, ``tg_flash`` can be set with a message to display to the user either on the next page load or via an AJAX handler. When used in conjunction with :term:`JSON`, ``exc=EXCEPTIONNAME``, and :class:`~fedora.client.BaseClient`, ``tg_flash`` should be set to an error message that the client can use to identify what went wrong or display to the user. It's equivalent to the message you would normally give when raising an exception. Authentication Errors ~~~~~~~~~~~~~~~~~~~~~ Errors in authentication are a special case. Instead of returning an error with ``exc='AuthError'`` set, the server should return with ``response.status = 403``. :class:`~fedora.client.BaseClient` will see the 403 and raise an `AuthError`. This is the signal for the client to ask the user for new credentials (usually a new username and password). .. note:: Upstream :term:`TurboGears` has switched to sending a 401 for authentication problems. However, their use of 401 is against the http specification (It doesn't set the 'WWW-Authentication' header) and it causes problems for konqueror and webkit based browsers so we probably will not be switching. ------------------------------------------------ Performing Different Actions when Returning JSON ------------------------------------------------ So far we've run across three features of :term:`TurboGears` that provide value to a web application but don't work when returning :term:`JSON` data. We provide a function that can code around this. ``fedora.tg.utils.request_format()`` will return the format that the page is being returned as. Code can use this to check whether :term:`JSON` output is expected and do something different based on it:: output = {'tg_flash': 'An Error Occurred'} if fedora.tg.utils.request_format() == 'json': output['exc'] = 'ServerError' else: output['tg_template'] = 'my.templates.error' return output In this example, we return an error through our "exception" mechanism if we are returning :term:`JSON` and return an error page by resetting the template if not. Redirects ========= Redirects do not play well with :term:`JSON` [#]_ because :term:`TurboGears` is unable to turn the function returned from the redirect into a dictionary that can be turned into :term:`JSON`. Redirects are commonly used to express errors. This is actually better expressed using tg_template_ because that method leaves the URL intact. That allows the end user to look for spelling mistakes in their URL. If you need to use a redirect, the same recipe as above will allow you to split your code paths. .. [#] Last checked in TurboGears 1.0.4 tg_template =========== Setting what template is returned to a user by setting tg_template in the return dict (for instance, to display an error page without changing the URL) is a perfectly valid way to use :term:`TurboGears`. Unfortunately, since :term:`JSON` is simply another template in :term:`TurboGears` you have to be sure not to interfere with the generation of :term:`JSON` data. You need to check whether :term:`JSON` was requested using ``fedora.tg.utils.request_format()`` and only return a different template if that's not the case. The recipe above shows how to do this. Validators ========== Validators are slightly different than the issues we've encountered so far. Validators are used to check and convert parameters sent to a controller method so that only good data is dealt with in the controller method itself. The problem is that when a validator detects a parameter that is invalid, it performs a special internal redirect to a method that is its ``error_handler``. We can't intercept this redirect because it happens in the decorators before our method is invoked. So we have to deal with the aftermath of the redirect in the ``error_handler`` method:: class NotNumberValidator(turbogears.validators.FancyValidator): messages = {'Number': 'Numbers are not allowed'} def to_python(self, value, state=None): try: number = turbogears.validators.Number(value.strip()) except: return value raise validators.Invalid(self.message('Number', state), value, state) class AmplifyForm(turbogears.widgets.Form): template = my.templates.amplifyform submit_text = 'Enter word to amplify' fields = [ turbogears.widgets.TextField(name='data', validator=NotNumberValidator()) ] amplify_form = AmplifyForm() class mycontroller(RootController): @expose(template='my.templates.errorpage', allow_json=True) def no_numbers(self, data): errors = fedora.tg.utils.jsonify_validation_errors() if errors: return errors # Construct a dict to return the data error message as HTML via # the errorpage template pass @validate(form=amplify_form) @error_handler('no_numbers') @expose(template='my.templates.amplifypage', allow_json=True) def amplify(self, data): return dict(data=data.upper()) When a user hits ``amplify()``'s URL, the validator checks whether ``data`` is a number. If it is, it redirects to the error_handler, ``no_numbers()``. ``no_numbers()`` will normally return HTML which is fine if we're simply hitting ``amplify()`` from a web browser. If we're hitting it from a :class:`~fedora.client.BaseClient` app, however, we need it to return :term:`JSON` data instead. To do that we use ``jsonify_validation_errors()`` which checks whether there was a validation error and whether we need to return :term:`JSON` data. If both of those are true, it returns a dictionary with the validation errors. This dictionary is appropriate for returning from the controller method in response to a :term:`JSON` request. .. warning:: When defining @error_handler() order of decorators can be important. The short story is to always make @validate() and @error_handler() the first decorators of your method. The longer version is that this is known to cause errors with the json request not being honored or skipping identity checks when the method is its own error handler. ---------------- Expected Methods ---------------- Certain controller methods are necessary in order for :class:`~fedora.client.BaseClient` to properly talk to your service. :term:`TurboGears` can quickstart an application template for you that sets most of these variables correctly:: $ tg-admin quickstart -i -s -p my my # edit my/my/controllers.py login() ======= You need to have a ``login()`` method in your application's root. This method allows :class:`~fedora.client.BaseClient` to authenticate against your Service:: @expose(template="my.templates.login") + @expose(allow_json=True) def login(self, forward_url=None, previous_url=None, \*args, \**kw): if not identity.current.anonymous \ and identity.was_login_attempted() \ and not identity.get_identity_errors(): + # User is logged in + if 'json' == fedora.tg.utils.request_format(): + return dict(user=identity.current.user) + if not forward_url: + forward_url = turbogears.url('/') raise redirect(forward_url) For non-TurboGears Implementors ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you are implementing a server in a non-TurboGears framework, note that one of the ways to reach the ``login()`` method is through special parameters parsed by the :term:`TurboGears` framework. :class:`~fedora.client.BaseClient` uses these parameters instead of invoking the ``login()`` method directly as it saves a round trip when authenticating to the server. It will be necessary for you to implement handling of these parameters (passed via ``POST``) on your application as well. The parameters are: ``user_name``, ``password``, and ``login``. When these three parameters are sent to the server, the server authenticates the user and records their information before deciding what information to return to them from the URL. logout() ======== The ``logout()`` method is similar to ``login()``. It also needs to be modified to allow people to connect to it via :term:`JSON`:: - @expose() + @expose(allow_json=True) def logout(self): identity.current.logout() + if 'json' in fedora.tg.utils.request_format(): + return dict() raise redirect("/") --------------- CSRF Protection --------------- For an overview of CSRF and how to protect :term:`TurboGears` 1 based services, look at this document. .. toctree:: :maxdepth: 2 CSRF .. _Using-SABase: ------------ Using SABase ------------ ``fedora.tg.json`` contains several functions that help to convert SQLAlchemy_ objects into :term:`JSON`. For the most part, these do their work behind the scenes. The ``SABase`` object, however, is one that you might need to take an active role in using. When you return an SQLAlchemy_ object in a controller to a template, the template is able to access any of the relations mapped to it. So, instead of having to construct a list of people records from a table and the the list of groups that each of them are in you can pass in the list of people and let your template reference the relation properties to get the groups. This is extremely convenient for templates but has a negative effect when returning :term:`JSON`. Namely, the default methods for marshaling SQLAlchemy_ objects to :term:`JSON` only return the attributes of the object, not the relations that are linked to it. So you can easily run into a situation where someone querying the :term:`JSON` data for a page will not have all the information that a template has access to. SABase fixes this by allowing you to specify relations that your SQLAlchemy_ backed objects should marshal as :term:`JSON` data. Further information on SABase can be found in the API documentation:: pydoc fedora.tg.json .. _SQLAlchemy: http://www.sqlalchemy.org Example ======= SABase is a base class that you can use when defining objects in your project's model. So the first step is defining the classes in your model to inherit from SABase:: from fedora.tg.json import SABase from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey from turbogears.database import metadata, mapper class Person(SABase): pass PersonTable = Table('person', metadata Column('name', String, primary_key=True), ) class Address(SABase): pass AddressTable = Table ( Column('id', Integer, primary_key=True), Column('street', string), Column('person_id', Integer, ForeignKey('person.name') ) mapper(PersonTable, Person) mapper(AddressTable, Address, properties = { person: relation(Person, backref = 'addresses'), }) The next step is to tell SABase which properties should be copied (this allows you to omit large trees of objects when you only need the data from a few of them):: @expose('my.templates.about_me') @expose(allow_json=True) def my_info(self): person = Person.query.filter_by(name='Myself').one() person.jsonProps = {'Person': ['addresses']} return dict(myself=person} Now, when someone requests :term:`JSON` data from my_info, they should get back a record for person that includes a property addresses. Addresses will be a list of address records associated with the person. How it Works ============ SABase adds a special `__json__()`_ method to the class. By default, this method returns a dict with all of the attributes that are backed by fields in the database. Adding entries to jsonProps adds the values for those properties to the returned dict as well. If you need to override the `__json__()`_ method in your class you probably want to call SABase's `__json__()`_ unless you know that neither you nor any future subclasses will need it. .. _Using-__json__: ---------------- Using __json__() ---------------- Sometimes you need to return an object that isn't a basic python type (list, tuple, dict, number. string, etc). When that occurs, simplejson_ won't know how to marshal the data into :term:`JSON` until you write own method to transform the values. If this method is named __json__(), :term:`TurboGears` will automatically perform the conversion when you return the object. Example:: class MyObject(object): def _init__(self, number): self.someNumber = number self.cached = None def _calc_data(self): if not self.cached: self.cached = self.someNumber * 2 return self.cached twiceData = property(_calc_data) def __json__(self): return {'someNumber': self.someNumber, 'twiceData': self.twiceData} In this class, you have a variable and a property. If you were to return it from a controller method without defining the __json__() method, :term:`TurboGears` would give you an error that it was unable to adapt the object to :term:`JSON`. The :term:`JSON` method transforms the object into a dict with sensibly named values for the variable and property so that simplejson is able to marshal the data to :term:`JSON`. Note that you will often have to choose between space (more data takes more bandwidth to deliver to the end user) and completeness (you need to return enough data so the client isn't looking for another method that can complete its needs) when returning data. .. _simplejson: http://undefined.org/python/#simplejson python-fedora-0.10.0/doc/faswho.rst0000664000175000017500000000406613137632523021566 0ustar puiterwijkpuiterwijk00000000000000============= FASWho Plugin ============= :Authors: Luke Macken Toshio Kuratomi :Date: 3 September 2011 This plugin provides authentication to the Fedora Account System using the `repoze.who` WSGI middleware. It is designed for use with :term:`TurboGears2` but it may be used with any `repoze.who` using application. Like :ref:`jsonfas2`, faswho has builtin :term:`CSRF` protection. This protection is implemented as a second piece of middleware and may be used with other `repoze.who` authentication schemes. ------------------------------------------- Authenticating against FAS with TurboGears2 ------------------------------------------- Setting up authentication against FAS in :term:`TurboGears2` is very easy. It requires one change to be made to :file:`app/config/app_cfg.py`. This change will take care of registering faswho as the authentication provider, enabling :term:`CSRF` protection, switching :func:`tg.url` to use :func:`fedora.ta2g.utils.url` instead, and allowing the `_csrf_token` parameter to be given to any URL. .. autofunction:: fedora.tg2.utils.add_fas_auth_middleware .. autofunction:: fedora.wsgi.faswho.faswhoplugin.make_faswho_middleware --------------------------------------------- Using CSRF middleware with other Auth Methods --------------------------------------------- This section needs to be made clearer so that apps like mirrormanager can be ported to use this. .. automodule:: fedora.wsgi.csrf .. autoclass:: fedora.wsgi.csrf.CSRFProtectionMiddleware .. autoclass:: fedora.wsgi.csrf.CSRFMetadataProvider --------- Templates --------- The :mod:`fedora.tg2.utils` module contains some templates to help you write :term:`CSRF` aware login forms and buttons. You can use the :func:`~fedora.tg2.utils.fedora_template` function to integrate them into your templates: .. autofunction:: fedora.tg2.utils.fedora_template The templates themselves come in two flavors. One set for use with mako and one set for use with genshi. Mako ==== .. automodule:: fedora.tg2.templates.mako Genshi ====== .. automodule:: fedora.tg2.templates.genshi python-fedora-0.10.0/doc/django.rst0000664000175000017500000000464213137632523021541 0ustar puiterwijkpuiterwijk00000000000000==================================== Fedora Django Authentication Backend ==================================== :Authors: Ignacio Vazquez-Abrams :Date: 23 Feb 2009 :For Version: 0.3.x The django.auth package provides an authentication backend for Django projects. .. note:: Django authentication does not provide :term:`single sign-on` with other Fedora web apps. it also does not provide :term:`CSRF` protection. Look at the way that Dango's builtin forms implement :term:`CSRF` protection for guidance on how to protect against this sort of attack. ------------------ fedora.django.auth ------------------ As FAS users are authenticated they are added to :class:`~fedora.django.auth.models.FasUser`. FAS groups are added to :class:`~django.contrib.auth.models.Group` both during ``syncdb`` and when a user is authenticated. Integrating into a Django Project ================================= Add the following lines to the project's :file:`settings.py`:: AUTHENTICATION_BACKENDS = ( 'fedora.django.auth.backends.FasBackend', ) FAS_USERNAME = '' FAS_PASSWORD = '' FAS_USERAGENT = '' FAS_URL = '' FAS_ADMINS = ( ... ) ``FAS_USERNAME`` and ``FAS_PASSWORD`` are used to retrieve group information during ``syncdb`` as well as to retrieve users via the authentication backend. They should be set to a low-privilege account that can read group and user information. ``FAS_USERAGENT`` is the string used to identify yourself to the FAS server. ``FAS_URL`` is the base URL of the FAS server to authenticate against. ``FAS_ADMINS`` is a tuple of usernames that you want to have superuser rights in the Django project. Add ``fedora.django.auth.middleware.FasMiddleware`` to the ``MIDDLEWARE_CLASSES`` tuple, between ``django.contrib.sessions.middleware.SessionMiddleware`` and ``django.contrib.auth.middleware.AuthenticationMiddleware``. Additionally, set ``FAS_GENERICEMAIL`` to ``False`` in order to use the email address specified in FAS instead of ``@fedoraproject.org``. Add ``fedora.django.auth`` to ``INSTALLED_APPS``. Finally, run ``python manage.py syncdb`` to add the models for the added app to the database. .. warning:: The ``User.first_name`` and ``User.last_name`` attributes are always empty since FAS does not have any equivalents. The ``name`` read-only property results in a round trip to the FAS server. python-fedora-0.10.0/doc/conf.py0000664000175000017500000001225613137632523021044 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Python Fedora Module documentation build configuration file, created by # sphinx-quickstart on Mon Jun 9 08:12:44 2008. # # This file is execfile()d with the current directory set to its containing # dir. # The contents of this file are pickled, so don't put values in the namespace # that aren't pickleable (module imports are okay, they're removed # automatically). # # All configuration values have a default value; values that are commented out # serve to show the default value. import sys import os sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) import fedora.release # If your extensions are in another directory, add it here. #sys.path.append(os.path.dirname(__file__)) # General configuration # --------------------- # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest'] # Add any paths that contain templates here, relative to this directory. templates_path = ['templates'] # The suffix of source filenames. source_suffix = '.rst' # The master toctree document. master_doc = 'index' # General substitutions. project = fedora.release.NAME copyright = fedora.release.COPYRIGHT # The default replacements for |version| and |release|, also used in various # other places throughout the built documents. # # The short X.Y version. version = '0.3' # The full version, including alpha/beta/rc tags. release = fedora.release.VERSION # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. today_fmt = '%B %d, %Y' # List of documents that shouldn't be included in the build. #unused_docs = [] # List of directories, relative to source directories, that shouldn't be # searched for source files. #exclude_dirs = [] # If true, '()' will be appended to :func: etc. cross-reference text. add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. show_authors = True # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # Options for HTML output # ----------------------- # The style sheet to use for HTML and HTML Help pages. A file of that name # must exist either in Sphinx' static/ path, or in one of the custom paths # given in html_static_path. html_style = 'default.css' # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # The name of an image file (within the static path) to place at the top of # the sidebar. #html_logo = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Content template for the index page. html_index = 'index.html' # Custom sidebar templates, maps page names to templates. #html_sidebars = {'index': 'indexsidebar.html'} # Additional templates that should be rendered to pages, maps page names to # templates. #html_additional_pages = {'index': 'index.html'} # If false, no module index is generated. #html_use_modindex = True # If true, the reST sources are included in the HTML build as _sources/. #html_copy_source = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. html_use_opensearch = fedora.release.DOWNLOAD_URL + 'doc/' # Output file base name for HTML help builder. htmlhelp_basename = 'Sphinxdoc' # Options for LaTeX output # ------------------------ # The paper size ('letter' or 'a4'). #latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). #latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, document class # [howto/manual]). latex_documents = [ ( 'index', 'Python Fedora Module.tex', 'Python Fedora Module Documentation', 'Toshio Kuratomi', 'manual' ), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # Additional stuff for the LaTeX preamble. #latex_preamble = '' # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_use_modindex = True automodule_skip_lines = 4 python-fedora-0.10.0/doc/api.rst0000664000175000017500000000265613137632523021053 0ustar puiterwijkpuiterwijk00000000000000================= API Documentation ================= This API Documentation is currently a catch-all. We're going to merge the API docs into the hand created docs as we have time to integrate them. .. toctree:: :maxdepth: 2 ------ Client ------ .. automodule:: fedora.client :members: FedoraServiceError, ServerError, AuthError, AppError, FedoraClientError, FASError, CLAError, BodhiClientException, DictContainer Generic Clients =============== BaseClient ---------- .. autoclass:: fedora.client.BaseClient :members: :undoc-members: ProxyClient ----------- .. autoclass:: fedora.client.ProxyClient :members: :undoc-members: OpenIdBaseClient ---------------- .. autoclass:: fedora.client.OpenIdBaseClient :members: :undoc-members: .. autofunction:: fedora.client.openidbaseclient.requires_login OpenIdProxyClient ----------------- .. autoclass:: fedora.client.OpenIdProxyClient :members: :undoc-members: Clients for Specific Services ============================= Wiki ---- .. autoclass:: fedora.client.Wiki :members: :undoc-members: ------- Service ------- Transforming SQLAlchemy Objects into JSON ========================================= .. automodule:: fedora.tg.json :members: jsonify_sa_select_results, jsonify_salist, jsonify_saresult, jsonify_set :undoc-members: .. autoclass:: fedora.tg.json.SABase :members: __json__ :undoc-members: python-fedora-0.10.0/doc/flask_fas_openid.rst0000664000175000017500000001532013137632523023561 0ustar puiterwijkpuiterwijk00000000000000============================ FAS Flask OpenID Auth Plugin ============================ :Authors: Patrick Uiterwjk :Date: 18 February 2013 :For Version: 0.3.x The :ref:`Fedora-Account-System` has a :term:`OpenID` provider that applications can use to authenticate users in web apps. For our :term:`Flask` applications we have an identity provider that uses this OpenID service to authenticate users. It is almost completely compatible with :ref:`flask_fas` except that it does not use the username/password provided by the client application (it is silently ignored). It can be configured to use any OpenID authentication service that implements the OpenID Teams Extension, Simple Registration Extension and CLA Extension. ------------- Configuration ------------- The FAS OpenID auth plugin has several config values that can be used to control how the auth plugin functions. You can set these in your application's config file. FAS_OPENID_ENDPOINT Set this to the OpenID endpoint url you are authenticating against. Default is "http://id.fedoraproject.org/" FAS_CHECK_CERT When set, this will check the SSL Certificate for the FAS server to make sure that it is who it claims to be. This is useful to set to False when testing against a local FAS server but should always be set to True in production. Default: True ------------------ Sample Application ------------------ The following is a sample, minimal flask application that uses fas_flask for authentication:: #!/usr/bin/python -tt # Flask-FAS-OpenID - A Flask extension for authorizing users with OpenID # Primary maintainer: Patrick Uiterwijk # # Copyright (c) 2012-2013, Red Hat, Inc., Patrick Uiterwijk # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # * Neither the name of the Red Hat, Inc. nor the names of its contributors may # be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ''AS IS'' AND ANY # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # This is a sample application. import flask from flask_fas_openid import fas_login_required, cla_plus_one_required, FAS # Set up Flask application app = flask.Flask(__name__) # Set up FAS extension fas = FAS(app) # Application configuration # SECRET_KEY is necessary for the Flask session system. It nees to be secret to # make the sessions secret but if you have multiple servers behind # a load balancer, the key needs to be the same on each. app.config['SECRET_KEY'] = 'change me!' # Other configuration options for Flask-FAS-OpenID: # FAS_OPENID_ENDPOINT: the OpenID endpoint URL # (default http://id.fedoraproject.org/) # FAS_CHECK_CERT: check the SSL certificate of FAS (default True) # You should use these options' defaults for production applications! app.config['FAS_OPENID_ENDPOINT'] = 'http://id.fedoraproject.org/' app.config['FAS_CHECK_CERT'] = True # Inline templates keep this test application all in one file. Don't do this in # a real application. Please. TEMPLATE_START = """

Flask-FAS-OpenID test app

{% if g.fas_user %}

Hello, {{ g.fas_user.username }} — Log out {% else %}

You are not logged in — Log in {% endif %} — Main page

""" @app.route('/') def index(): data = TEMPLATE_START data += '

Check if you are cla+1

' % \ flask.url_for('claplusone') data += '

See a secret message (requires login)

' % \ flask.url_for('secret') return flask.render_template_string(data) @app.route('/login', methods=['GET', 'POST']) def auth_login(): # Your application should probably do some checking to make sure the URL # given in the next request argument is sane. (For example, having next set # to the login page will cause a redirect loop.) Some more information: # http://flask.pocoo.org/snippets/62/ if 'next' in flask.request.args: next_url = flask.request.args['next'] else: next_url = flask.url_for('index') # If user is already logged in, return them to where they were last if flask.g.fas_user: return flask.redirect(next_url) return fas.login(return_url=next_url) @app.route('/logout') def logout(): if flask.g.fas_user: fas.logout() return flask.redirect(flask.url_for('index')) # This demonstrates the use of the fas_login_required decorator. The # secret message can only be viewed by those who are logged in. @app.route('/secret') @fas_login_required def secret(): data = TEMPLATE_START + '

Be sure to drink your Ovaltine

' return flask.render_template_string(data) # This demonstrates checking for group membership inside of a function. # The flask_fas adapter also provides a cla_plus_one_required decorator that # can restrict a url so that you can only access it from an account that has # cla +1. @app.route('/claplusone') @cla_plus_one_required def claplusone(): data = TEMPLATE_START data += '

Your account is cla+1.

' return flask.render_template_string(data) if __name__ == '__main__': app.run(debug=True) python-fedora-0.10.0/doc/javascript.rst0000664000175000017500000000264213137632523022443 0ustar puiterwijkpuiterwijk00000000000000.. _JavaScript: ========== JavaScript ========== :Authors: Toshio Kuratomi :Date: 26 February 2009 :For Version: 0.3.x python-fedora currently provides some JavaScript files to make coding :ref:`Fedora-Services` easier. In the future we may move these to their own package. ------------------ :mod:`fedora.dojo` ------------------ .. module:: fedora.dojo :synopsis: JavaScript helper scripts using Dojo .. moduleauthor:: Toshio Kuratomi .. versionadded:: 0.3.10 :term:`Dojo` is one of several JavaScript Toolkits. It aims to be a standard library for JavaScript. The :mod:`fedora.dojo` module has JavaScript code that make use of :term:`Dojo` to do their work. It is most appropriate to use when the :term:`Dojo` libraries are being used as the JavaScript library for the app. However, it is well namespaced and nothing should prevent it from being used in other apps as well. .. class::dojo.BaseClient(base_url, kw=[useragent, username, password, debug]) A client configured to make requests of a particular service. :arg base_url: Base of every URL used to contact the server :kwarg useragent: useragent string to use. If not given, default to "Fedora DojoClient/VERSION" :kwarg username: Username for establishing authenticated connections :kwarg password: Password to use with authenticated connections :kwarg debug: If True, log debug information Default: false python-fedora-0.10.0/doc/existing.rst0000664000175000017500000000356413137632523022133 0ustar puiterwijkpuiterwijk00000000000000================= Existing Services ================= There are many Services in Fedora. Many of these have an interface that we can query and get back information as :term:`JSON` data. There is documentation here about both the services and the client modules that can access them. .. _`Fedora-Account-System`: .. _`FAS`: --------------------- Fedora Account System --------------------- FAS is the Fedora Account System. It holds the account data for all of our contributors. .. toctree:: :maxdepth: 2 .. autoclass:: fedora.client.AccountSystem :members: :undoc-members: Threadsafe Account System Access ================================ It is not safe to use a single instance of the :class:`~fedora.client.AccountSystem` object in multiple threads. This is because instance variables are used to hold some connection-specific information (for instance, the user who is logging in). For this reason, we also provide the :class:`fedora.client.FasProxyClient` object. This is especially handy when writing authn and authz adaptors that talk to fas from a multithreaded webserver. .. toctree:: :maxdepth: 2 .. autoclass:: fedora.client.FasProxyClient :members: :undoc-members: .. _`Bodhi`: ------------------------ Bodhi, the Update Server ------------------------ Bodhi is used to push updates from the build system to the download repositories. It lets packagers send packages to the testing repository or to the update repository. pythyon-fedora currently supports both the old Bodhi1 interface and the new Bodhi2 interface. By using ``fedora.client.BodhiCLient``, the correct one should be returned to you depending on what is running live on Fedora Infrastructure servers. .. toctree:: :maxdepth: 2 .. autoclass:: fedora.client.Bodhi2Client :members: :undoc-members: .. autoclass:: fedora.client.Bodhi1Client :members: :undoc-members: python-fedora-0.10.0/releaseutils.py0000775000175000017500000001534613137632523022061 0ustar puiterwijkpuiterwijk00000000000000#!/usr/bin/python -tt # Copyright Red Hat Inc 2013-2015 # Licensed under the terms of the LGPLv2+ from __future__ import print_function import glob import os import shutil import sys import textwrap from contextlib import contextmanager from distutils.sysconfig import get_python_lib from kitchen.pycompat27 import subprocess import pkg_resources import fedora.release from six.moves import configparser, map # # Helper functions # @contextmanager def pushd(dirname): '''Contextmanager so that we can switch directories that the script is running in and have the current working directory restored afterwards. ''' curdir = os.getcwd() os.chdir(dirname) try: yield curdir finally: os.chdir(curdir) class MsgFmt(object): def run(self, args): cmd = subprocess.Popen(args, shell=False) cmd.wait() def setup_message_compiler(): # Look for msgfmt try: # Prefer msgfmt because it will throw errors on misformatted messages subprocess.Popen(['msgfmt', '-h'], stdout=subprocess.PIPE) except OSError: import babel.messages.frontend return ( babel.messages.frontend.CommandLineInterface(), 'pybabel compile -D %(domain)s -d locale -i %(pofile)s -l %(lang)s' ) else: return ( MsgFmt(), 'msgfmt -c -o locale/%(lang)s/LC_MESSAGES/%(domain)s.mo %(pofile)s' ) def build_catalogs(): # Get the directory with message catalogs # Reuse transifex's config file first as it will know this cfg = configparser.SafeConfigParser() cfg.read('.tx/config') cmd, args = setup_message_compiler() try: shutil.rmtree('locale') except OSError as e: # If the error is that locale does not exist, we're okay. We're # deleting it here, afterall if e.errno != 2: raise for section in [s for s in cfg.sections() if s != 'main']: try: file_filter = cfg.get(section, 'file_filter') source_file = cfg.get(section, 'source_file') except configparser.NoOptionError: continue glob_pattern = file_filter.replace('', '*') pot = os.path.basename(source_file) if pot.endswith('.pot'): pot = pot[:-4] arg_values = {'domain': pot} for po_file in glob.glob(glob_pattern): file_pattern = os.path.basename(po_file) lang = file_pattern.replace('.po', '') os.makedirs(os.path.join('locale', lang, 'LC_MESSAGES')) arg_values['pofile'] = po_file arg_values['lang'] = lang compile_args = args % arg_values compile_args = compile_args.split(' ') cmd.run(compile_args) def _add_destdir(path): if ENVVARS['DESTDIR'] is not None: if path.startswith('/'): path = path[1:] path = os.path.join(ENVVARS['DESTDIR'], path) return path def _install_catalogs(localedir): with pushd('locale'): for catalog in glob.glob('*/LC_MESSAGES/*.mo'): # Make the directory for the locale dirname = os.path.dirname(catalog) dst = os.path.join(localedir, dirname) try: os.makedirs(dst, 0o755) except OSError as e: # Only allow file exists to pass if e.errno != 17: raise shutil.copy2(catalog, dst) def install_catalogs(): # First try to install the messages to an FHS location if ENVVARS['INSTALLSTRATEGY'] == 'EGG': localedir = get_python_lib() # Need certain info from the user if ENVVARS['PACKAGENAME'] is None: print ('Set the PACKAGENAME environment variable and try again') sys.exit(2) if ENVVARS['MODULENAME'] is None: print ('Set the MODULENAME environment variable and try again') sys.exit(2) # Get teh egg name from pkg_resources dist = pkg_resources.Distribution(project_name=ENVVARS['PACKAGENAME'], version=fedora.release.VERSION) # Set the localedir to be inside the egg directory localedir = os.path.join(localedir, '{}.egg'.format(dist.egg_name()), ENVVARS['MODULENAME'], 'locale') # Tack on DESTDIR if needed localedir = _add_destdir(localedir) _install_catalogs(localedir) elif ENVVARS['INSTALLSTRATEGY'] == 'SITEPACKAGES': # For a generic utility to be used with other modules, this would also # need to handle arch-specific locations (get_python_lib(1)) # Retrieve the site-packages directory localedir = get_python_lib() # Set the install path to be inside of the module in site-packages if ENVVARS['MODULENAME'] is None: print ('Set the MODULENAME environment variable and try again') sys.exit(2) localedir = os.path.join(localedir, ENVVARS['MODULENAME'], 'locale') localedir = _add_destdir(localedir) _install_catalogs(localedir) else: # FHS localedir = _add_destdir('/usr/share/locale') _install_catalogs(localedir) def usage(): print ('Subcommands:') for command in sorted(SUBCOMMANDS.keys()): print('%-15s %s' % (command, SUBCOMMANDS[command][1])) print() print('This script can be customized by setting the following ENV VARS:') for var in sorted(ENVVARDESC.keys()): lines = textwrap.wrap( '%-15s %s' % (var, ENVVARDESC[var]), subsequent_indent=' '*8 ) for line in lines: print(line.rstrip()) sys.exit(1) SUBCOMMANDS = { 'build_catalogs': ( build_catalogs, 'Compile the message catalogs from po files' ), 'install_catalogs': ( install_catalogs, 'Install the message catalogs to the system' ), } ENVVARDESC = { 'DESTDIR': 'Alternate root directory hierarchy to install into', 'PACKAGENAME': 'Pypi packagename (commonly the setup.py name field)', 'MODULENAME': 'Python module name (commonly used with import NAME)', 'INSTALLSTRATEGY': 'One of FHS, EGG, SITEPACKAGES. FHS will work' ' for system packages installed using' ' --single-version-externally-managed. EGG install into an egg' ' directory. SITEPACKAGES will install into a $PACKAGENAME' ' directory directly in site-packages. Default FHS' } ENVVARS = dict(map(lambda k: (k, os.environ.get(k)), ENVVARDESC.keys())) if __name__ == '__main__': if len(sys.argv) < 2: print('At least one subcommand is needed\n') usage() try: SUBCOMMANDS[sys.argv[1]][0]() except KeyError: print ('Unknown subcommand: %s\n' % sys.argv[1]) usage() python-fedora-0.10.0/AUTHORS0000664000175000017500000000135213137632523020043 0ustar puiterwijkpuiterwijk00000000000000The following people are major contributors to the code in this package: * Ionuț Arțăriși * Ralph Bean * Adam M Dutko * Paul W. Frields * Stephen Gallagher * Dmitry Kolesov * Toshio Kuratomi * Luke Macken * Mike Mcgrath * Jef Spaleta * Ignacio Vazquez-Abrams * Ricky Zhou * Ian Weller * Frank Chiulli * Xavier Lamien * Patrick Uiterwijk python-fedora-0.10.0/MANIFEST.in0000664000175000017500000000052513137632523020532 0ustar puiterwijkpuiterwijk00000000000000include setup.py include releaseutils.py include *.spec include COPYING AUTHORS NEWS README.rst recursive-include doc * include fedora/tg/templates/genshi/*.html include fedora/tg2/templates/mako/*.mak include fedora/tg2/templates/genshi/*.html include translations/*.pot include translations/*.po include .tx/config include locale/*/*/*.mo python-fedora-0.10.0/flask_fas_openid.py0000664000175000017500000003332213234573627022645 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # Flask-FAS-OpenID - A Flask extension for authorizing users with FAS-OpenID # # Primary maintainer: Patrick Uiterwijk # # Copyright (c) 2013, Patrick Uiterwijk # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see ''' FAS-OpenID authentication plugin for the flask web framework .. moduleauthor:: Patrick Uiterwijk ..versionadded:: 0.3.33 ''' from functools import wraps import logging import time from munch import Munch import flask try: from flask import _app_ctx_stack as stack except ImportError: from flask import _request_ctx_stack as stack from openid.consumer import consumer from openid.fetchers import setDefaultFetcher, Urllib2Fetcher from openid.extensions import pape, sreg, ax from openid_cla import cla from openid_teams import teams import six log = logging.getLogger(__name__) # http://flask.pocoo.org/snippets/45/ def request_wants_json(): ''' Return wether the user requested the data in JSON or not. ''' best = flask.request.accept_mimetypes \ .best_match(['application/json', 'text/html']) return best == 'application/json' and \ flask.request.accept_mimetypes[best] > \ flask.request.accept_mimetypes['text/html'] class FASJSONEncoder(flask.json.JSONEncoder): """ Dedicated JSON encoder for the FAS openid information. """ def default(self, o): """Implement this method in a subclass such that it returns a serializable object for ``o``, or calls the base implementation (to raise a ``TypeError``). For example, to support arbitrary iterators, you could implement default like this:: def default(self, o): try: iterable = iter(o) except TypeError: pass else: return list(iterable) return JSONEncoder.default(self, o) """ if isinstance(o, (set, frozenset)): return list(o) return flask.json.JSONEncoder.default(self, o) class FAS(object): """ The Flask plugin. """ def __init__(self, app=None): self.postlogin_func = None self.app = app if self.app is not None: self.init_app(app) def init_app(self, app): """ Constructor for the Flask application. """ self.app = app app.config.setdefault('FAS_OPENID_ENDPOINT', 'https://id.fedoraproject.org/openid/') app.config.setdefault('FAS_OPENID_CHECK_CERT', True) if not self.app.config['FAS_OPENID_CHECK_CERT']: setDefaultFetcher(Urllib2Fetcher()) # json_encoder is only available from flask 0.10 version = flask.__version__.split('.') assume_recent = False try: major = int(version[0]) minor = int(version[1]) except ValueError: # We'll assume we're using a recent enough flask as the packages # of old versions used sane version numbers. assume_recent = True if assume_recent or (major >= 0 and minor >= 10): self.app.json_encoder = FASJSONEncoder @app.route('/_flask_fas_openid_handler/', methods=['GET', 'POST']) def flask_fas_openid_handler(): """ Endpoint for OpenID results. """ return self._handle_openid_request() app.before_request(self._check_session) def postlogin(self, f): """Marks a function as post login handler. This decorator calls your function after the login has been performed. """ self.postlogin_func = f return f def _handle_openid_request(self): return_url = flask.session.get('FLASK_FAS_OPENID_RETURN_URL', None) cancel_url = flask.session.get('FLASK_FAS_OPENID_CANCEL_URL', None) base_url = self.normalize_url(flask.request.base_url) oidconsumer = consumer.Consumer(flask.session, None) info = oidconsumer.complete(flask.request.values, base_url) display_identifier = info.getDisplayIdentifier() if info.status == consumer.FAILURE and display_identifier: return 'FAILURE. display_identifier: %s' % display_identifier elif info.status == consumer.CANCEL: if cancel_url: return flask.redirect(cancel_url) return 'OpenID request was cancelled' elif info.status == consumer.SUCCESS: if info.endpoint.server_url != \ self.app.config['FAS_OPENID_ENDPOINT']: log.warn('Claim received from invalid issuer: %s', info.endpoint.server_url) return 'Invalid provider issued claim!' sreg_resp = sreg.SRegResponse.fromSuccessResponse(info) teams_resp = teams.TeamsResponse.fromSuccessResponse(info) cla_resp = cla.CLAResponse.fromSuccessResponse(info) ax_resp = ax.FetchResponse.fromSuccessResponse(info) user = {'fullname': '', 'username': '', 'email': '', 'timezone': '', 'cla_done': False, 'groups': []} if not sreg_resp: # If we have no basic info, be gone with them! return flask.redirect(cancel_url) user['username'] = sreg_resp.get('nickname') user['fullname'] = sreg_resp.get('fullname') user['email'] = sreg_resp.get('email') user['timezone'] = sreg_resp.get('timezone') user['login_time'] = time.time() if cla_resp: user['cla_done'] = cla.CLA_URI_FEDORA_DONE in cla_resp.clas if teams_resp: # The groups do not contain the cla_ groups user['groups'] = frozenset(teams_resp.teams) if ax_resp: ssh_keys = ax_resp.get( 'http://fedoauth.org/openid/schema/SSH/key') if isinstance(ssh_keys, (list, tuple)): ssh_keys = '\n'.join( ssh_key for ssh_key in ssh_keys if ssh_key.strip() ) if ssh_keys: user['ssh_key'] = ssh_keys user['gpg_keyid'] = ax_resp.get( 'http://fedoauth.org/openid/schema/GPG/keyid') flask.session['FLASK_FAS_OPENID_USER'] = user flask.session.modified = True if self.postlogin_func is not None: self._check_session() return self.postlogin_func(return_url) else: return flask.redirect(return_url) else: return 'Strange state: %s' % info.status def _check_session(self): if 'FLASK_FAS_OPENID_USER' not in flask.session \ or flask.session['FLASK_FAS_OPENID_USER'] is None: flask.g.fas_user = None else: user = flask.session['FLASK_FAS_OPENID_USER'] # Add approved_memberships to provide backwards compatibility # New applications should only use g.fas_user.groups user['approved_memberships'] = [] for group in user['groups']: membership = dict() membership['name'] = group user['approved_memberships'].append(Munch.fromDict(membership)) flask.g.fas_user = Munch.fromDict(user) flask.g.fas_user.groups = frozenset(flask.g.fas_user.groups) flask.g.fas_session_id = 0 def _check_safe_root(self, url): if url is None: return None if url.startswith(flask.request.url_root) or url.startswith('/'): # A URL inside the same app is deemed to always be safe return url return None def login(self, username=None, password=None, return_url=None, cancel_url=None, groups=['_FAS_ALL_GROUPS_']): """Tries to log in a user. Sets the user information on :attr:`flask.g.fas_user`. Will set 0 to :attr:`flask.g.fas_session_id, for compatibility with flask_fas. :kwarg username: Not used, but accepted for compatibility with the flask_fas module :kwarg password: Not used, but accepted for compatibility with the flask_fas module :kwarg return_url: The URL to forward the user to after login :kwarg groups: A string or a list of group the user should belong to to be authentified. :returns: True if the user was succesfully authenticated. :raises: Might raise an redirect to the OpenID endpoint """ if return_url is None: if 'next' in flask.request.args.values(): return_url = flask.request.args.values['next'] else: return_url = flask.request.url_root # This makes sure that we only allow stuff where # ?next= value is in a safe root (the application # root) return_url = (self._check_safe_root(return_url) or flask.request.url_root) session = {} oidconsumer = consumer.Consumer(session, None) try: request = oidconsumer.begin(self.app.config['FAS_OPENID_ENDPOINT']) except consumer.DiscoveryFailure as exc: # VERY strange, as this means it could not discover an OpenID # endpoint at FAS_OPENID_ENDPOINT log.warn(exc) return 'discoveryfailure' if request is None: # Also very strange, as this means the discovered OpenID # endpoint is no OpenID endpoint return 'no-request' if isinstance(groups, six.string_types): groups = [groups] request.addExtension(sreg.SRegRequest( required=['nickname', 'fullname', 'email', 'timezone'])) request.addExtension(pape.Request([])) request.addExtension(teams.TeamsRequest(requested=groups)) request.addExtension(cla.CLARequest( requested=[cla.CLA_URI_FEDORA_DONE])) ax_req = ax.FetchRequest() ax_req.add(ax.AttrInfo( type_uri='http://fedoauth.org/openid/schema/GPG/keyid')) ax_req.add(ax.AttrInfo( type_uri='http://fedoauth.org/openid/schema/SSH/key', count='unlimited')) request.addExtension(ax_req) trust_root = self.normalize_url(flask.request.url_root) return_to = trust_root + '_flask_fas_openid_handler/' flask.session['FLASK_FAS_OPENID_RETURN_URL'] = return_url flask.session['FLASK_FAS_OPENID_CANCEL_URL'] = cancel_url if request_wants_json(): output = request.getMessage(trust_root, return_to=return_to).toPostArgs() output['server_url'] = request.endpoint.server_url return flask.jsonify(output) elif request.shouldSendRedirect(): redirect_url = request.redirectURL(trust_root, return_to, False) return flask.redirect(redirect_url) else: return request.htmlMarkup( trust_root, return_to, form_tag_attrs={'id': 'openid_message'}, immediate=False) def logout(self): '''Logout the user associated with this session ''' flask.session['FLASK_FAS_OPENID_USER'] = None flask.g.fas_session_id = None flask.g.fas_user = None flask.session.modified = True def normalize_url(self, url): ''' Replace the scheme prefix of a url with our preferred scheme. ''' scheme = self.app.config['PREFERRED_URL_SCHEME'] scheme_index = url.index('://') return scheme + url[scheme_index:] # This is a decorator we can use with any HTTP method (except login, obviously) # to require a login. # If the user is not logged in, it will redirect them to the login form. # http://flask.pocoo.org/docs/patterns/viewdecorators/#login-required-decorator def fas_login_required(function): """ Flask decorator to ensure that the user is logged in against FAS. To use this decorator you need to have a function named 'auth_login'. Without that function the redirect if the user is not logged in will not work. """ @wraps(function) def decorated_function(*args, **kwargs): if flask.g.fas_user is None: return flask.redirect(flask.url_for('auth_login', next=flask.request.url)) return function(*args, **kwargs) return decorated_function def cla_plus_one_required(function): """ Flask decorator to retrict access to CLA+1. To use this decorator you need to have a function named 'auth_login'. Without that function the redirect if the user is not logged in will not work. """ @wraps(function) def decorated_function(*args, **kwargs): if flask.g.fas_user is None or not flask.g.fas_user.cla_done \ or len(flask.g.fas_user.groups) < 1: # FAS-OpenID does not return cla_ groups return flask.redirect(flask.url_for('auth_login', next=flask.request.url)) else: return function(*args, **kwargs) return decorated_function python-fedora-0.10.0/tests/0000775000175000017500000000000013234574425020140 5ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/tests/__init__.py0000664000175000017500000000000013137632523022233 0ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/tests/functional/0000775000175000017500000000000013234574425022302 5ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/tests/functional/test_openidbaseclient.py0000664000175000017500000000352513137632523027224 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- """ Test the OpenIdBaseClient. """ import os import shutil import tempfile import unittest from .functional_test_utils import networked from fedora.client import FedoraServiceError from fedora.client.openidbaseclient import OpenIdBaseClient BASE_URL = 'http://127.0.0.1:5000' BASE_URL = 'http://209.132.184.188' LOGIN_URL = '{}/login/'.format(BASE_URL) class OpenIdBaseClientTest(unittest.TestCase): """Test the OpenId Base Client.""" def setUp(self): self.client = OpenIdBaseClient(BASE_URL) self.session_file = os.path.expanduser( '~/.fedora/baseclient-sessions.sqlite') try: self.backup_dir = tempfile.mkdtemp(dir='~/.fedora/') except OSError: self.backup_dir = tempfile.mkdtemp() self.saved_session_file = os.path.join( self.backup_dir, 'baseclient-sessions.sqlite.bak') self.clear_cookies() def tearDown(self): self.restore_cookies() shutil.rmtree(self.backup_dir) def clear_cookies(self): try: shutil.move(self.session_file, self.saved_session_file) except IOError as e: # No previous sessionfile is fine if e.errno != 2: raise # Sentinel to say that there was no previous session_file self.saved_session_file = None def restore_cookies(self): if self.saved_session_file: shutil.move(self.saved_session_file, self.session_file) @networked def test_no_openid_session(self): """Raise FedoraServiceError for no session on service or openid server.""" self.assertRaises(FedoraServiceError, self.client.login, 'username', 'password') @networked def test_no_service_session(self): """Open a service session when we have an openid session.""" pass python-fedora-0.10.0/tests/functional/__init__.py0000664000175000017500000000000013137632523024375 0ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/tests/functional/functional_test_utils.py0000664000175000017500000000155213137632523027274 0ustar puiterwijkpuiterwijk00000000000000import functools import os from nose.exc import SkipTest try: from nose.tools.nontrivial import make_decorator except ImportError: # It lives here in older versions of nose (el6) from nose.tools import make_decorator def _asbool(s): return s.lower() in ['y', 'yes', 'true', '1'] def networked(func): """A decorator that skips tests if $NETWORKED is false or undefined. This decorator allows us to have tests that a developer might want to run but shouldn't be run by random people building the package. It also makes non-networked build systems happy. """ @functools.wraps(func) def newfunc(self, *args, **kw): if not _asbool(os.environ.get('NETWORKED', 'False')): raise SkipTest('Only run if you have network access.') return func(self, *args, **kw) return make_decorator(func)(newfunc) python-fedora-0.10.0/tests/test_urlutils.py0000664000175000017500000000317113137632523023432 0ustar puiterwijkpuiterwijk00000000000000#!/usr/bin/python2 -tt # -*- coding: utf-8 -*- """ Test the OpenIdBaseClient. """ import unittest from fedora.urlutils import update_qs base = 'http://threebean.org/' class TestURLUtils(unittest.TestCase): def test_simple_add(self): original = base expected = base + "?foo=yes" params = dict(foo="yes") actual = update_qs(original, params) self.assertEqual(actual, expected) def test_simple_idempotence(self): original = base + "?foo=yes" expected = base + "?foo=yes" params = dict(foo="yes") actual = update_qs(original, params) self.assertEqual(actual, expected) def test_simple_with_overwrite(self): original = base + "?foo=yes" expected = base + "?foo=no" params = dict(foo="no") actual = update_qs(original, params) self.assertEqual(actual, expected) def test_simple_without_overwrite(self): original = base + "?foo=yes" expected = base + "?foo=yes&foo=no" params = dict(foo="no") actual = update_qs(original, params, overwrite=False) self.assertEqual(actual, expected) def test_simple_without_overwrite_and_same(self): original = base + "?foo=yes" expected = base + "?foo=yes&foo=yes" params = dict(foo="yes") actual = update_qs(original, params, overwrite=False) self.assertEqual(actual, expected) def test_simple_with_tuples(self): original = base expected = base + "?foo=yes" params = [('foo', 'yes')] actual = update_qs(original, params) self.assertEqual(actual, expected) python-fedora-0.10.0/translations/0000775000175000017500000000000013234574425021517 5ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/translations/tr.po0000664000175000017500000001325013137632523022501 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # # Translators: # doganaydin , 2011 # Hasan Alp İNAN , 2011 # Talha Okur , 2013 # Ralph Bean , 2015. #zanata msgid "" msgstr "" "Project-Id-Version: python-fedora 0.8.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2016-04-21 16:57+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2014-08-07 11:51-0400\n" "Last-Translator: Toshio Kuratomi \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/python-fedora/" "language/tr/)\n" "Generated-By: Babel 1.3\n" "Language: tr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Zanata 3.8.3\n" #: fedora/client/wiki.py:102 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:105 #, python-format msgid "%d wiki changes in the past week" msgstr "%d wiki geçtiğimiz hafta değişti" #: fedora/client/wiki.py:107 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:118 msgid "\n" "== Most active wiki users ==" msgstr "\n" "== En aktif wiki kullanıcıları ==" #: fedora/client/wiki.py:125 msgid "\n" "== Most edited pages ==" msgstr "\n" "==En çok düzenlenen sayfalar ==" #: fedora/django/auth/models.py:54 msgid "Loading FAS groups..." msgstr "FAS grupları yükleniyor..." #: fedora/django/auth/models.py:60 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" "FAS grupları yüklenemiyor. FAS_USERNAME ve FAS_PASSWORD değişkenlerini " "atadınız mı?" #: fedora/django/auth/models.py:67 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "Hoşgeldiniz, %s" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "Lütfen giriş yapın." #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "Başarıyla çıkış yaptınız." #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "Giriş" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "Parola:" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "Giriş" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "CSRF saldırıları" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you " "are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "Ben bir insanım" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "Parolanızı mı unuttunuz?" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "Kayıt Ol" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "Hoşgeldiniz" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "Giriş yapmadınız" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "CSRF korumalı" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "Girişi Doğrula" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "Çıkış" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/kw@uccor.po0000664000175000017500000001172313137632523023634 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Cornish (Unified Orthography)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: kw@uccor\n" "Plural-Forms: nplurals=4; plural= (n==1) ? 0 : (n==2) ? 1 : (n == 3) ? 2 : 3\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/eu.po0000664000175000017500000001162313137632523022467 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Basque\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: eu\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/ko.po0000664000175000017500000001161413137632523022467 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Korean\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ko\n" "Plural-Forms: nplurals=1; plural=0\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/te.po0000664000175000017500000001162313137632523022466 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Telugu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: te\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/eo.po0000664000175000017500000001162613137632523022464 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Esperanto\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: eo\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/python-fedora.pot0000664000175000017500000001164213137632523025022 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2016 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2016. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: python-fedora 0.8.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2016-04-21 16:57+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" #: fedora/client/wiki.py:102 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:105 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:107 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:118 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:125 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:54 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:60 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:67 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a" " low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The" "\n" " purpose of this page is to help protect your account and this " "server\n" " from attacks from such malicious web sites. By clicking below, " "you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/af.po0000664000175000017500000001162613137632523022447 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Afrikaans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: af\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/yo.po0000664000175000017500000001162313137632523022505 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Yoruba\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: yo\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/bal.po0000664000175000017500000001161613137632523022616 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Baluchi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bal\n" "Plural-Forms: nplurals=1; plural=0\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/zh_TW.po0000664000175000017500000001277213137632523023117 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # # Translators: # Cheng-Chia Tseng , 2011 # Ralph Bean , 2015. #zanata msgid "" msgstr "" "Project-Id-Version: python-fedora 0.8.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2016-04-21 16:57+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2014-08-07 11:51-0400\n" "Last-Translator: Toshio Kuratomi \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/python-" "fedora/language/zh_TW/)\n" "Generated-By: Babel 1.3\n" "Language: zh-TW\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Zanata 3.8.3\n" #: fedora/client/wiki.py:102 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:105 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:107 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:118 msgid "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:125 msgid "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:54 msgid "Loading FAS groups..." msgstr "正在登入 FAS 群組..." #: fedora/django/auth/models.py:60 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "無法載入 FAS 群組。您是否已設定 FAS_USERNAME 與 FAS_PASSWORD?" #: fedora/django/auth/models.py:67 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "FAS 群組已載入。不要忘記設定低特權帳號的 FAS_USERNAME 與 FAS_PASSWORD 。" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "歡迎您,%s" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "請登入。" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "您已經成功登出。" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "登入" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "密碼:" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "登入" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "CSRF 攻擊" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you " "are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "我是人類" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "忘記密碼?" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "註冊" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "歡迎" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "CSRF 已受保護" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "驗證登入" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "登出" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "正在更新訪問 (%s)" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/et.po0000664000175000017500000001162513137632523022470 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Estonian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: et\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/ar.po0000664000175000017500000001173313137632523022462 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Arabic\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ar\n" "Plural-Forms: nplurals=6; plural= n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/ru.po0000664000175000017500000001304413137632523022503 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # # Translators: # FIRST AUTHOR , 2009 # Narek Babadjanyan , 2011 # Andrey Olykainen , 2010 # Ralph Bean , 2015. #zanata msgid "" msgstr "" "Project-Id-Version: python-fedora 0.8.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2016-04-21 16:57+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2014-08-07 11:51-0400\n" "Last-Translator: Toshio Kuratomi \n" "Language-Team: Russian (http://www.transifex.com/projects/p/python-fedora/" "language/ru/)\n" "Generated-By: Babel 1.3\n" "Language: ru\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Zanata 3.8.3\n" #: fedora/client/wiki.py:102 #, python-format msgid "From %(then)s to %(now)s" msgstr "Из %(then)s в %(now)s" #: fedora/client/wiki.py:105 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:107 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:118 msgid "\n" "== Most active wiki users ==" msgstr "\n" "== Самые активные пользователи Wiki ==" #: fedora/client/wiki.py:125 msgid "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:54 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:60 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:67 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "Добро пожаловать, %s" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "Пароль:" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "Логин" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you " "are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "Я человек" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "Забыли пароль?" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "Войти" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "Добро пожаловать" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "Вы не вошли" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "Выйти" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/mk.po0000664000175000017500000001164713137632523022473 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Macedonian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: mk\n" "Plural-Forms: nplurals=2; plural= n==1 || n%10==1 ? 0 : 1\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/anp.po0000664000175000017500000001162413137632523022635 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Angika\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: anp\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/ca.po0000664000175000017500000001556313137632523022450 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # # Translators: # Albert Carabasa Giribet , 2009 # Robert Antoni Buj i Gelonch , 2010 # Ralph Bean , 2015. #zanata # Robert Antoni Buj Gelonch , 2015. #zanata msgid "" msgstr "" "Project-Id-Version: python-fedora 0.8.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2016-04-21 16:57+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2015-09-29 06:23-0400\n" "Last-Translator: Robert Antoni Buj Gelonch \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/python-fedora/" "language/ca/)\n" "Generated-By: Babel 1.3\n" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Zanata 3.8.3\n" #: fedora/client/wiki.py:102 #, python-format msgid "From %(then)s to %(now)s" msgstr "Des del %(then)s fins al %(now)s" #: fedora/client/wiki.py:105 #, python-format msgid "%d wiki changes in the past week" msgstr "%d canvis al wiki la passada setmana" #: fedora/client/wiki.py:107 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" "Advertència: el nombre de canvis arriba al límit de retorn de l'API.\n" "No obtindreu la llista completa de canvis llevat que\n" "executeu aquest script utilitzant un compte «bot»." #: fedora/client/wiki.py:118 msgid "\n" "== Most active wiki users ==" msgstr "\n" "== Els usuaris més actius del wiki ==" #: fedora/client/wiki.py:125 msgid "\n" "== Most edited pages ==" msgstr "\n" "== Les pàgines més modificades ==" #: fedora/django/auth/models.py:54 msgid "Loading FAS groups..." msgstr "S'estan carregant els grups del FAS..." #: fedora/django/auth/models.py:60 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" "No es poden carregar els grups del FAS. Heu establert FAS_USERNAME i " "FAS_PASSWORD?" #: fedora/django/auth/models.py:67 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" "Es van carregar els grups del FAS. No oblideu d'establir FAS_USERNAME i " "FAS_PASSWORD per als comptes amb pocs privilegis." #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "Benvingut, %s" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" "Les credencials proporcionades no són correctes o bé no donen permís per " "accedir a aquest recurs." #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" "Heu de proporcionar les vostres credencials abans d'accedir a aquest recurs." #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "Si us plau, inicieu la sessió." #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "Heu tancat la sessió correctament." #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "Inici de la sessió" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "Nom d'usuari:" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "Contrasenya:" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "Inicia la sessió" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "Atacs CSRF" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you " "are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" " són un mitjà perquè un lloc web maliciós faci una petició a un altre\n" " lloc web, com si l'usuari hagués contactat amb el lloc web\n" " maliciós. El propòsit d'aquesta pàgina és ajudar a protegir el " "vostre\n" " compte i aquest servidor d'atacs de llocs web maliciosos. En fer " "clic\n" " a sota, esteu provant que sou una persona en lloc d'un navegador\n" " web reenviant les seves galetes d'autenticació en nom d'un lloc web\n" " maliciós." #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "Sóc humà" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "Heu oblidat la contrasenya?" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "Registrar-se" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "Benvingut" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "No heu iniciat la sessió" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "Amb protecció contra CSRF" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "Verifiqueu l'inici de la sessió" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "Tanca la sessió" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "s'està actualitzant la visita (%s)" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "Nom d'usuari:" python-fedora-0.10.0/translations/hi.po0000664000175000017500000001162213137632523022455 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Hindi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hi\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/cy.po0000664000175000017500000001170013137632523022465 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Welsh\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cy\n" "Plural-Forms: nplurals=4; plural= (n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/kw@kkcor.po0000664000175000017500000001172213137632523023631 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Cornish (Common Orthography)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: kw@kkcor\n" "Plural-Forms: nplurals=4; plural= (n==1) ? 0 : (n==2) ? 1 : (n == 3) ? 2 : 3\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/mai.po0000664000175000017500000001162613137632523022627 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Maithili\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: mai\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/zh_CN.po0000664000175000017500000001457413137632523023067 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # # Translators: # caoyu1099 , 2011 # chongfengcf , 2012 # Christopher Meng , 2012 # Ji WenCong , 2012 # Tommy He , 2011, 2012 # simonyanix , 2011 # Ralph Bean , 2015. #zanata msgid "" msgstr "" "Project-Id-Version: python-fedora 0.8.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2016-04-21 16:57+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2014-08-07 11:51-0400\n" "Last-Translator: Toshio Kuratomi \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/python-" "fedora/language/zh_CN/)\n" "Generated-By: Babel 1.3\n" "Language: zh-CN\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Zanata 3.8.3\n" #: fedora/client/wiki.py:102 #, python-format msgid "From %(then)s to %(now)s" msgstr "从 %(then)s 到 %(now)s" #: fedora/client/wiki.py:105 #, python-format msgid "%d wiki changes in the past week" msgstr "在上一周有 %d Wiki 更改" #: fedora/client/wiki.py:107 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "警告:通过 API 返回的变更次数达到上限。\n" "您将无法获得完整的变化列表除非\n" "您使用 'bot' 账户运行该脚本。" #: fedora/client/wiki.py:118 msgid "\n" "== Most active wiki users ==" msgstr "\n" "== 最活跃的 Wiki 用户 ==" #: fedora/client/wiki.py:125 msgid "\n" "== Most edited pages ==" msgstr "\n" "== 编辑数最多的页面 ==" #: fedora/django/auth/models.py:54 msgid "Loading FAS groups..." msgstr "加载 FAS 组..." #: fedora/django/auth/models.py:60 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "不能加载 FAS groups. 您是否设置了 FAS_USERNAME 和 FAS_PASSWORD?" #: fedora/django/auth/models.py:67 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "FAS 组已加载。别忘记设定 FAS_USERNAME 和 FAS_PASSWORD 为低权限账户。" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "欢迎,%s" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "您提供的证书信息不正确,或者并未授权访问该资源。" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "您必须提供您的证书来访问该资源。" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "请登录" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "您已经注销成功。" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "登录" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "密码:" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "登录" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "CSRF 攻击" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you " "are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" "是恶意站点伪装成受害用户的身份来请求其他网站服务器的方式。\n" "该页面的目的是协助您保护账户和该服务器免受此类站点的攻击。\n" "点击下面的内容将证明您是真实的人,而不是恶意站点转发您授权 cookies 的浏览器。" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "我是人类" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "忘记密码?" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "注册" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "欢迎" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "您还没有登录" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "CSRF 保护" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "登录确认" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "注销" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "更新访问 (%s)" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "用户名:" python-fedora-0.10.0/translations/br.po0000664000175000017500000001162213137632523022460 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Breton\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: br\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/hr.po0000664000175000017500000001173713137632523022475 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Croatian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hr\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/pa.po0000664000175000017500000001162413137632523022457 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Punjabi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pa\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/ml.po0000664000175000017500000001162613137632523022471 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Malayalam\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ml\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/da.po0000664000175000017500000001511413137632523022441 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # # Translators: # Kris Thomsen , 2011, 2012 # Morten Juhl-Johansen Zölde-Fejér , 2011 # Ralph Bean , 2015. #zanata msgid "" msgstr "" "Project-Id-Version: python-fedora 0.8.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2016-04-21 16:57+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2014-08-07 11:51-0400\n" "Last-Translator: Toshio Kuratomi \n" "Language-Team: Danish (http://www.transifex.com/projects/p/python-fedora/" "language/da/)\n" "Generated-By: Babel 1.3\n" "Language: da\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Zanata 3.8.3\n" #: fedora/client/wiki.py:102 #, python-format msgid "From %(then)s to %(now)s" msgstr "Fra %(then)s til %(now)s" #: fedora/client/wiki.py:105 #, python-format msgid "%d wiki changes in the past week" msgstr "%d wiki-ændringer den seneste uge" #: fedora/client/wiki.py:107 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" "Advarsel: Antallet af ændringer når API-returneringsgræsen.\n" "Du vil ikke få den komplette liste over ændringer medmindre\n" "du kører dette script med \"bot\"-kontoen." #: fedora/client/wiki.py:118 msgid "\n" "== Most active wiki users ==" msgstr "\n" "== Mest aktive wiki-brugere ==" #: fedora/client/wiki.py:125 msgid "\n" "== Most edited pages ==" msgstr "\n" "== Mest redigerede sider ==" #: fedora/django/auth/models.py:54 msgid "Loading FAS groups..." msgstr "Indlæser FAS-grupper..." #: fedora/django/auth/models.py:60 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" "Kunne ikke indlæse FAS-grupper. Angav du FAS_USERNAME og FAS_PASSWORD?" #: fedora/django/auth/models.py:67 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" "FAS-grupper indlæst. Glem ikke at angive FAS_USERNAME og FAS_PASSWORD til en " "konto med få privilegier." #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "Velkommen, %s" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" "Kredentialerne du angav var ikke korrekte eller fik ikke adgang til denne " "ressource." #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" "Du skal angive dine kredentialer før du kan få adgang til denne ressource." #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "Log venligst ind." #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "Du er logget ud med success." #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "Logind" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "Adgangskode:" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "Logind" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "CSRF-angreb" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you " "are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" " er et middel for et ondsindet websted at lave en forespørgsel af en anden\n" " web-server som brugeren der har kontaktet det ondsindede websted.\n" " Formålet med denne side er at hjælpe med at beskytte din konto og " "denne server\n" " fra angreb fra sådanne ondsindede websteder. Ved at klikke nedenfor, " "bekræfter\n" " du at du er et mennesker og ikke bare webbrowseren som vidersender " "din\n" " godkendelsescookie på vegne af et ondsindet websted." #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "Jeg er et menneske" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "Glemt adgangskode?" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "Meld dig til" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "Velkommen" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "Du er nu logget ind" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "CSRF-beskyttet" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "Bekræft logind" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "Log ud" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "opdaterer besøg (%s)" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "Brugernavn:" python-fedora-0.10.0/translations/brx.po0000664000175000017500000001162213137632523022650 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Bodo\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: brx\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/is.po0000664000175000017500000001164413137632523022474 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Icelandic\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: is\n" "Plural-Forms: nplurals=2; plural=(n%10!=1 || n%100==11)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/bn.po0000664000175000017500000001162413137632523022456 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Bengali\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bn\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/el.po0000664000175000017500000001162213137632523022455 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Greek\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: el\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/bn_IN.po0000664000175000017500000001163713137632523023050 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Bengali (India)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bn-IN\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/si.po0000664000175000017500000001162413137632523022472 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Sinhala\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: si\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/nn.po0000664000175000017500000001163613137632523022475 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Norwegian Nynorsk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nn\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/cs.po0000664000175000017500000001277113137632523022470 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # # Translators: # Jiří Vírava , 2012 # Jan Varta , 2011 # Ralph Bean , 2015. #zanata msgid "" msgstr "" "Project-Id-Version: python-fedora 0.8.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2016-04-21 16:57+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2014-08-07 11:51-0400\n" "Last-Translator: Toshio Kuratomi \n" "Language-Team: Czech (http://www.transifex.com/projects/p/python-fedora/" "language/cs/)\n" "Generated-By: Babel 1.3\n" "Language: cs\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Zanata 3.8.3\n" #: fedora/client/wiki.py:102 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:105 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:107 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:118 msgid "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:125 msgid "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:54 msgid "Loading FAS groups..." msgstr "Nahrávání FAS skupin..." #: fedora/django/auth/models.py:60 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "Nelze načíst FAS skupiny. Nastavili jste FAS_USERNAME a FAS_PASSWORD?" #: fedora/django/auth/models.py:67 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "Vítejte, %s" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "Přihlaste se, prosím." #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "Jste úspěšně odhlášeni." #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "Přihlášení" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "Heslo:" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "Přihlásit" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "CSRF útoky" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you " "are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "Jsem člověk" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "Zapomenuté heslo?" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "Registrace" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "Vítejte" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "Nejste přihlášeni" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "CSRF chráněno" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "Ověřit přihlášení" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "Odhlásit" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/nso.po0000664000175000017500000001163413137632523022657 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Northern Sotho\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nso\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/uk.po0000664000175000017500000001763713137632523022510 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # # Translators: # Yuri Chornoivan , 2011-2013 # Ralph Bean , 2015. #zanata msgid "" msgstr "" "Project-Id-Version: python-fedora 0.8.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2016-04-21 16:57+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2014-08-07 11:51-0400\n" "Last-Translator: Toshio Kuratomi \n" "Language-Team: Ukrainian (http://www.transifex.com/projects/p/python-fedora/" "language/uk/)\n" "Generated-By: Babel 1.3\n" "Language: uk\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Zanata 3.8.3\n" #: fedora/client/wiki.py:102 #, python-format msgid "From %(then)s to %(now)s" msgstr "З %(then)s до %(now)s" #: fedora/client/wiki.py:105 #, python-format msgid "%d wiki changes in the past week" msgstr "%d змін у вікі протягом попереднього тижня" #: fedora/client/wiki.py:107 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" "Попередження: кількість змін досягла обмеження, яке накладено програмним " "інтерфейсом.\n" "Вам не буде повернуто повний список змін, якщо ви не запустите цей скрипт\n" "від імені облікового запису «bot»." #: fedora/client/wiki.py:118 msgid "\n" "== Most active wiki users ==" msgstr "\n" "== Найактивніші користувачі вікі ==" #: fedora/client/wiki.py:125 msgid "\n" "== Most edited pages ==" msgstr "\n" "== Найчастіше редаговані сторінки ==" #: fedora/django/auth/models.py:54 msgid "Loading FAS groups..." msgstr "Завантаження груп FAS…" #: fedora/django/auth/models.py:60 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" "Не вдалося завантажити групи FAS. Чи встановили ви значення FAS_USERNAME і " "FAS_PASSWORD?" #: fedora/django/auth/models.py:67 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" "Групи FAS завантажено. Не забудьте встановити FAS_USERNAME і FAS_PASSWORD на " "значення облікового запису зі зниженими правами доступу." #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "Вітаємо, %s" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" "Вами було вказано реєстраційні дані, які не є коректними або не надають " "доступу до цього ресурсу." #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" "До отримання доступу до цього ресурсу вам слід вказати ваші реєстраційні " "дані." #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "Будь ласка, увійдіть до системи." #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "Ви успішно вийшли з системи." #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "Вхід" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "Користувач:" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "Пароль:" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "Увійти" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "Напади типу CSRF" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you " "are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" " — це можливість для зловмисників, що володіють певним веб-сайтом, виконати " "запит\n" " до іншого веб-сервера від імені користувача, який встановив " "з’єднання з веб-сайтом\n" " зловмисників. Метою цієї сторінки є захист вашого облікового запису " "і цього сервера\n" " від нападів з таких веб-сайтів. Натисканням відповідної кнопки, " "розташованої нижче,\n" " ви підтверджуєте, що ви людина, а на просто програма, яка " "переспрямовує\n" " ваші куки розпізнавання з веб-сайта зловмисників." #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "Я — людина" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "Забули пароль?" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "Зареєструватися" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "Ласкаво просимо" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "Ви не увійшли до системи" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "Захищено від CSRF" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "Перевірити реєстраційні дані" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "Вийти" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "оновлення відвідування (%s)" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "Користувач:" python-fedora-0.10.0/translations/ur.po0000664000175000017500000001162113137632523022502 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Urdu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ur\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/tw.po0000664000175000017500000001161113137632523022505 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Twi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tw\n" "Plural-Forms: nplurals=1; plural=0\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/ta.po0000664000175000017500000001162213137632523022461 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Tamil\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ta\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/sl.po0000664000175000017500000001171213137632523022473 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Slovenian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sl\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/fa.po0000664000175000017500000001161513137632523022445 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Persian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa\n" "Plural-Forms: nplurals=1; plural=0\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/th.po0000664000175000017500000002003213137632523022463 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # # Translators: # FIRST AUTHOR , 2009 # Manatsawin Hanmongkolchai , 2010 # Ralph Bean , 2015. #zanata msgid "" msgstr "" "Project-Id-Version: python-fedora 0.8.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2016-04-21 16:57+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2014-08-07 11:51-0400\n" "Last-Translator: Toshio Kuratomi \n" "Language-Team: Thai (http://www.transifex.com/projects/p/python-fedora/" "language/th/)\n" "Generated-By: Babel 1.3\n" "Language: th\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Zanata 3.8.3\n" #: fedora/client/wiki.py:102 #, python-format msgid "From %(then)s to %(now)s" msgstr "จาก %(then)s ถึง %(now)s" #: fedora/client/wiki.py:105 #, python-format msgid "%d wiki changes in the past week" msgstr "มีการแก้ไขวิกิ %d ครั้งในสัปดาห์ที่ผ่านมา" #: fedora/client/wiki.py:107 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" "คำเตือน: จำนวนการเปลี่ยนแปลงครบการจำกัดจำนวนการคืนค่าของ\n" "API คุณจะไม่ได้รับรายการการเปลี่ยนแปลงทั้งหมดเว้นเสียแต่ว่าคุณรัน\n" "สคริปต์นี้ด้วยบัญชี 'bot'" #: fedora/client/wiki.py:118 msgid "\n" "== Most active wiki users ==" msgstr "\n" "== ผู้ใช้วิกิที่ขยันที่สุด ==" #: fedora/client/wiki.py:125 msgid "\n" "== Most edited pages ==" msgstr "\n" "== หน้าที่แก้ไขมากที่สุด ==" #: fedora/django/auth/models.py:54 msgid "Loading FAS groups..." msgstr "กำลังโหลดกลุ่มใน FAS..." #: fedora/django/auth/models.py:60 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" "ไม่สามารถโหลดกลุ่มใน FAS คุณกำหนด FAS_USERNAME และ FAS_PASSWORD หรือยัง?" #: fedora/django/auth/models.py:67 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "ยินดีต้อนรับ %s" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "ข้อมูลที่คุณระบุมาไม่ถูกต้อง หรือไม่มีสิทธิพอที่จะเข้าถึงทรัพยากรนี้" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "คุณต้องระบุข้อมูลของคุณก่อนเข้าใช้ทรัพยากรนี้" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "โปรดเข้าระบบ" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "คุณได้ออกจากระบบสำเร็จแล้ว" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "เข้าระบบ" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "รหัสผ่าน:" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "เข้าระบบ" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "การโจมตี CSRF" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you " "are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" " เป็นวิธีที่เว็บไซต์ประสงค์ร้ายสร้างคำขอร้องไปยังเว็บเซิร์ฟเวอร์อื่นโดยใช้ผู้ใช้ของ\n" " ผู้ที่เข้าสู่เว็บไซต์นั้น " "วัตถุประสงค์ของหน้านี้คือช่วยคุณป้องกันบัญชีของคุณ\n" " และเซิร์ฟเวอร์นี้จากการโจมตีจากเว็บไซต์เหล่านั้น " "การคลิกด้านล่างนี้คุณจะ\n" " แสดงว่าคุณเป็นมนุษย์ " "ไม่ใช่เว็บเบราว์เซอร์ที่ส่งคุ๊กกี้ยึนยันตนของคุณจาก\n" " เว็บไซต์ประสงค์ร้าย" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "เราคือมนุษย์" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "ลืมรหัสผ่าน?" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "สมัครสมาชิก" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "ยินดีต้อนรับ" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "คุณยังไม่ได้เข้าระบบ" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "ป้องกันจาก CSRF แล้ว" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "ยึนยันการเข้าระบบ" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "ออกจากระบบ" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "อัพเดตกรุณาเข้าที่ (%s)" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/sr@latin.po0000664000175000017500000001175413137632523023637 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Serbian (LATIN)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sr@latin\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/mn.po0000664000175000017500000001162613137632523022473 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Mongolian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: mn\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/ka.po0000664000175000017500000001161613137632523022453 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Georgian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ka\n" "Plural-Forms: nplurals=1; plural=0\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/de_CH.po0000664000175000017500000001164413137632523023023 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: German (Switzerland)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de-CH\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/gu.po0000664000175000017500000001162513137632523022473 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Gujarati\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: gu\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/kw.po0000664000175000017500000001166713137632523022507 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Cornish\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: kw\n" "Plural-Forms: nplurals=4; plural= (n==1) ? 0 : (n==2) ? 1 : (n == 3) ? 2 : 3\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/bg.po0000664000175000017500000001162613137632523022451 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Bulgarian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bg\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/fr.po0000664000175000017500000001540513137632523022467 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # # Translators: # Jérôme Fenal , 2012 # Kévin Raymond , 2011 # Jibec , 2015. #zanata # Ralph Bean , 2015. #zanata msgid "" msgstr "" "Project-Id-Version: python-fedora 0.8.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2016-04-21 16:57+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2015-10-28 08:55-0400\n" "Last-Translator: Jibec \n" "Language-Team: French (http://www.transifex.com/projects/p/python-fedora/" "language/fr/)\n" "Generated-By: Babel 1.3\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Zanata 3.8.3\n" #: fedora/client/wiki.py:102 #, python-format msgid "From %(then)s to %(now)s" msgstr "De %(then)s à %(now)s" #: fedora/client/wiki.py:105 #, python-format msgid "%d wiki changes in the past week" msgstr "%d changements du wiki cette semaine" #: fedora/client/wiki.py:107 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" "Attention : la limite de retour de l'API est atteinte.\n" "Vous n'aurez pas la liste complète des modifications sauf en\n" "exécutant ce script avec un compte « bot »." #: fedora/client/wiki.py:118 msgid "\n" "== Most active wiki users ==" msgstr "\n" "== Utilisateurs du wiki les plus actifs ==" #: fedora/client/wiki.py:125 msgid "\n" "== Most edited pages ==" msgstr "\n" "== Pages les plus éditées ==" #: fedora/django/auth/models.py:54 msgid "Loading FAS groups..." msgstr "Chargement des groupes FAS..." #: fedora/django/auth/models.py:60 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" "Impossible de charger les groupes FAS. Avez-vous défini FAS_USERNAME et " "FAS_PASSWORD ?" #: fedora/django/auth/models.py:67 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" "Groupes FAS chargés. N'oubliez pas de définir FAS_USERNAME et FAS_PASSWORD " "sur un compte à faibles privilèges." #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "Bienvenue %s" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" "Les accréditations fournies ne sont pas correctes ou ne vous permettent pas " "l'accès à cette ressource." #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" "Vous devez fournir les accréditations avant d'accéder à cette ressource." #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "Veuillez vous connecter." #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "Vous vous êtes déconnecté avec succès." #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "Connexion" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "Nom d'utilisateur :" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "Mot de passe :" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "Se connecter" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "Attaques CSRF" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you " "are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" " moyen pour un site malicieux de faire une requête vers un autre serveur\n" " en se faisant passer pour l'utilisateur qui a joint le site. Le but " "de\n" " cette page est de vous aider à protéger votre compte et le serveur\n" " des attaques de ces sites malicieux. En cliquant ci-dessous, vous\n" " prouvez que vous êtes une personne et non pas un simple navigateur\n" " qui relaie le cookie d'authentification pour le compte d'un site " "malicieux." #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "Je suis un humain" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "Mot de passe oublié ?" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "S'enregistrer" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "Bienvenue" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "Vous n'êtes pas connecté" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "Protégé contre les CSRF" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "Vérifier l'identifiant" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "Se déconnecter" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "Mise à jour de la visite (%s)" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "Nom d'utilisateur :" python-fedora-0.10.0/translations/nb.po0000664000175000017500000001163613137632523022461 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Norwegian Bokmål\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nb\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/nds.po0000664000175000017500000001162113137632523022640 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Low German\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nds\n" "Plural-Forms: nplurals=1; plural=0\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/pl.po0000664000175000017500000001532213137632523022471 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # # Translators: # Piotr Drąg , 2011, 2012 # Piotr Drąg , 2015. #zanata # Ralph Bean , 2015. #zanata msgid "" msgstr "" "Project-Id-Version: python-fedora 0.8.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2016-04-21 16:57+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2015-08-28 10:55-0400\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish (http://www.transifex.com/projects/p/python-fedora/" "language/pl/)\n" "Generated-By: Babel 1.3\n" "Language: pl\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" "X-Generator: Zanata 3.8.3\n" #: fedora/client/wiki.py:102 #, python-format msgid "From %(then)s to %(now)s" msgstr "Od %(then)s do %(now)s" #: fedora/client/wiki.py:105 #, python-format msgid "%d wiki changes in the past week" msgstr "%d zmian wiki w przeszłym tygodniu" #: fedora/client/wiki.py:107 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" "Ostrzeżenie: liczba zmian osiąga ograniczenie zwrotu API.\n" "Pełna lista zmian nie zostanie uzyskana, chyba że ten\n" "skrypt zostanie wykonany używając konta „bot”." #: fedora/client/wiki.py:118 msgid "\n" "== Most active wiki users ==" msgstr "\n" "== Najbardziej aktywni użytkownicy wiki ==" #: fedora/client/wiki.py:125 msgid "\n" "== Most edited pages ==" msgstr "\n" "== Najczęściej modyfikowane strony ==" #: fedora/django/auth/models.py:54 msgid "Loading FAS groups..." msgstr "Wczytywanie grup FAS…" #: fedora/django/auth/models.py:60 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "Nie można wczytać grup FAS. Ustawiono FAS_USERNAME i FAS_PASSWORD?" #: fedora/django/auth/models.py:67 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" "Wczytano grupy FAS. Proszę nie zapomnieć o ustawieniu NAZWY_UŻYTKOWNIKA_FAS " "i HASŁA_FAS nisko uprawnionego konta." #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "Witaj, %s" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" "Podane dane uwierzytelniające nie są poprawne lub nie gwarantują dostępu do " "tego zasobu." #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" "Należy podać dane uwierzytelniające przed uzyskaniem dostępu do tego zasobu." #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "Proszę się zalogować." #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "Pomyślnie wylogowano." #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "Zaloguj" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "Nazwa użytkownika:" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "Hasło:" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "Login" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "Ataki CSRF" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you " "are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" " służą złośliwym stronom WWW, aby utworzyć żądanie innego serwera WWW\n" " jako użytkownik, który skontaktował się ze złośliwą stroną WWW.\n" " Celem tej strony jest ochrona konta użytkownika i tego serwera\n" " przed atakami z takich złośliwych stron WWW. Naciskając przycisk\n" " poniżej użytkownik udowadnia, że jesteś osobą, a nie przeglądarką\n" " WWW, przekierowującą ciasteczka uwierzytelniania na złośliwą\n" " stronę WWW." #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "Jestem człowiekiem" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "Zapomniano hasło?" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "Zarejestruj się" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "Witaj" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "Użytkownik nie jest zalogowany" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "Ochrona przed CSRF" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "Sprawdzenie logowania" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "Wyloguj" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "aktualizowanie wizyty (%s)" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "Nazwa użytkownika:" python-fedora-0.10.0/translations/or.po0000664000175000017500000001162213137632523022475 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Oriya\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: or\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/sr.po0000664000175000017500000001173613137632523022507 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Serbian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sr\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/ne.po0000664000175000017500000001162313137632523022460 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Nepali\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ne\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/pt.po0000664000175000017500000001326013137632523022500 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # # Translators: # nunmiranda , 2011 # Rui Gouveia , 2011 # Ralph Bean , 2015. #zanata msgid "" msgstr "" "Project-Id-Version: python-fedora 0.8.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2016-04-21 16:57+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2014-08-07 11:51-0400\n" "Last-Translator: Toshio Kuratomi \n" "Language-Team: Portuguese (http://www.transifex.com/projects/p/python-fedora/" "language/pt/)\n" "Generated-By: Babel 1.3\n" "Language: pt\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Zanata 3.8.3\n" #: fedora/client/wiki.py:102 #, python-format msgid "From %(then)s to %(now)s" msgstr "De %(then)s para %(now)s" #: fedora/client/wiki.py:105 #, python-format msgid "%d wiki changes in the past week" msgstr "%d mudanças na wiki na semana passada" #: fedora/client/wiki.py:107 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:118 msgid "\n" "== Most active wiki users ==" msgstr "\n" "== Utilizadores da wiki mais ativos ==" #: fedora/client/wiki.py:125 msgid "\n" "== Most edited pages ==" msgstr "\n" "== Páginas mais editadas ==" #: fedora/django/auth/models.py:54 msgid "Loading FAS groups..." msgstr "A ler grupos FAS..." #: fedora/django/auth/models.py:60 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:67 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "Bem-vindo, %s" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" "As credenciais fornecidas não estão corretas ou não concedem acesso a este " "recurso." #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "Deve fornecer as suas credenciais antes de aceder a este recurso." #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "Por favor, inicie sessão." #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "A sua sessão foi terminada com sucesso." #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "Iniciar Sessão" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "Senha:" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "Iniciar sessão" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "ataques CSRF" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you " "are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "Eu sou humano" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "Esqueceu a senha?" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "Bem vindo" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "Não tem sessão iniciada" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "Terminar a sessão" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/mr.po0000664000175000017500000001162413137632523022475 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Marathi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: mr\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/de.po0000664000175000017500000001476113137632523022454 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # # Translators: # Fabian Affolter , 2009 # Gerd Koenig , 2011 # Laurin , 2011 # Mario Blättermann , 2011 # Tobias Portmann , 2011 # Mario Blättermann , 2015. #zanata # Ralph Bean , 2015. #zanata msgid "" msgstr "" "Project-Id-Version: python-fedora 0.8.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2016-04-21 16:57+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2014-08-07 11:51-0400\n" "Last-Translator: Toshio Kuratomi \n" "Language-Team: German (http://www.transifex.com/projects/p/python-fedora/" "language/de/)\n" "Generated-By: Babel 1.3\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Zanata 3.8.3\n" #: fedora/client/wiki.py:102 #, python-format msgid "From %(then)s to %(now)s" msgstr "Von %(then)s bis %(now)s" #: fedora/client/wiki.py:105 #, python-format msgid "%d wiki changes in the past week" msgstr "%d Wiki-Änderungen in der letzten Woche" #: fedora/client/wiki.py:107 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" "Warnung: Anzahl der Änderungen erreichte das Limit der API. Sie werden keine " "vollständige Liste der Änderungen erhalten, es sei denn, Sie führen dieses " "Skript mit einem »bot«-Konto aus." #: fedora/client/wiki.py:118 msgid "\n" "== Most active wiki users ==" msgstr "\n" "== Aktivste Wiki-Benutzer ==" #: fedora/client/wiki.py:125 msgid "\n" "== Most edited pages ==" msgstr "\n" "== Am meisten bearbeitete Seiten ==" #: fedora/django/auth/models.py:54 msgid "Loading FAS groups..." msgstr "FAS-Gruppen werden geladen …" #: fedora/django/auth/models.py:60 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" "FAS-Gruppen konnten nicht geladen werden. Haben Sie FAS_USERNAME und " "FAS_PASSWORD gesetzt?" #: fedora/django/auth/models.py:67 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" "FAS-Gruppen wurden geladen. Vergessen Sie nicht, FAS_USERNAME und " "FAS_PASSWORD zu setzen, um die Zugriffsrechte des Kontos zu beschränken." #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "Willkommen, %s" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" "Die von Ihnen angegebenen Anmeldeinformationen waren nicht korrekt oder " "erlauben keinen Zugriff auf diese Ressource." #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" "Sie müssen Ihre Anmeldeinformationen eingeben, bevor Sie auf diese Ressource " "zugreifen können." #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "Bitte melden Sie sich an." #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "Sie haben sich erfolgreich angemeldet." #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "Anmeldung" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "Benutzername:" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "Passwort:" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "Anmelden" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "CSRF-Angriffe" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you " "are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "Ich bin ein Mensch" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "Passwort vergessen?" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "Registrieren" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "Willkommen" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "Sie sind nicht angemeldet" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "CSRF-geschützt" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "Anmeldung bestätigen" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "Abmelden" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "Besuch wird aktualisiert (%s)" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "Benutzername:" python-fedora-0.10.0/translations/vi.po0000664000175000017500000001162013137632523022471 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Vietnamese\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: vi\n" "Plural-Forms: nplurals=1; plural=0\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/it.po0000664000175000017500000001525213137632523022474 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # # Translators: # Francesco D'Aluisio , 2011 # Francesco Tombolini , 2011 # mario_santagiuliana , 2009 # Ralph Bean , 2015. #zanata msgid "" msgstr "" "Project-Id-Version: python-fedora 0.8.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2016-04-21 16:57+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2014-08-07 11:51-0400\n" "Last-Translator: Toshio Kuratomi \n" "Language-Team: Italian (http://www.transifex.com/projects/p/python-fedora/" "language/it/)\n" "Generated-By: Babel 1.3\n" "Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Zanata 3.8.3\n" #: fedora/client/wiki.py:102 #, python-format msgid "From %(then)s to %(now)s" msgstr "Da %(then)s a %(now)s" #: fedora/client/wiki.py:105 #, python-format msgid "%d wiki changes in the past week" msgstr "%d cambiamenti wiki nella scorsa settimana" #: fedora/client/wiki.py:107 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" "Avvertenza: Numero di cambiamenti portano l'API al limite.\n" "Non si otterrà la lista completa di cambiamenti a meno che\n" "non si usa lo script in un account 'bot'." #: fedora/client/wiki.py:118 msgid "\n" "== Most active wiki users ==" msgstr "\n" "== Utenti wiki più attivi ==" #: fedora/client/wiki.py:125 msgid "\n" "== Most edited pages ==" msgstr "\n" "== Pagine più modificate ==" #: fedora/django/auth/models.py:54 msgid "Loading FAS groups..." msgstr "Caricamento gruppi FAS..." #: fedora/django/auth/models.py:60 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" "Impossibile caricare i gruppi FAS. Sono stati impostati FAS_USERNAME e " "FAS_PASSWORD?" #: fedora/django/auth/models.py:67 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" "Gruppi FAS caricati. Non dimenticare di impostare FAS_USERNAME e " "FAS_PASSWORD su un account con bassi privilegi." #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "Benvenuto, %s" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" "Le credenziali fornite non sono corrette o non garantiscono l'accesso a " "questa risorsa." #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" "Si devono fornire le proprie credenziali prima di accedere alla risorsa." #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "Per favore autenticarsi." #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "Ti sei disconnesso correttamente." #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "Log In" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "Password:" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "Entra" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "attacchi CSRF" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you " "are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" " sono un modo per un sito web malizioso di fare una richiesta ad un altro\n" " web server come se fosse l'utente che ha contattato il sito web\n" " maligno. Lo scopo di questa pagina è di aiutare a proteggere il tuo \n" " account e questo server da attacchi provenienti da questi siti web \n" " maliziosi. Cliccando qui sotto, proverai che tu sei una persona e " "non \n" " solo un browser web che inoltra i tuoi cookie di autenticazione al " "posto\n" " di un sito web malizioso." #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "Sono un uomo" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "Passowrd dimenticata?" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "Iscriviti" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "Benvenuto" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "Non sei autenticato" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "CSRF protetto" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "Verifica Login" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "Uscita" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "aggiornamento visite (%s)" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "Username:" python-fedora-0.10.0/translations/hu.po0000664000175000017500000001536013137632523022474 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # # Translators: # Sulyok Péter , 2009 # Zoltan Hoppár , 2011, 2012 # Ralph Bean , 2015. #zanata msgid "" msgstr "" "Project-Id-Version: python-fedora 0.8.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2016-04-21 16:57+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2014-08-07 11:51-0400\n" "Last-Translator: Toshio Kuratomi \n" "Language-Team: Hungarian (http://www.transifex.com/projects/p/python-fedora/" "language/hu/)\n" "Generated-By: Babel 1.3\n" "Language: hu\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Zanata 3.8.3\n" #: fedora/client/wiki.py:102 #, python-format msgid "From %(then)s to %(now)s" msgstr "%(then)s - %(now)s" #: fedora/client/wiki.py:105 #, python-format msgid "%d wiki changes in the past week" msgstr "%d wiki változás a múlt héten" #: fedora/client/wiki.py:107 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" "Figyelmeztetés: Számos változás éri el az API visszatérés korlátot.\n" "Nem fogja megkapni a változások teljes listáját, hacsak nem\n" "„bot” számlára futtatja ezt az írást." #: fedora/client/wiki.py:118 msgid "\n" "== Most active wiki users ==" msgstr "\n" "== Legtevékenyebb wiki használók ==" #: fedora/client/wiki.py:125 msgid "\n" "== Most edited pages ==" msgstr "\n" "== Legtöbbet szerkesztett oldalak ==" #: fedora/django/auth/models.py:54 msgid "Loading FAS groups..." msgstr "Fedora csoportok betöltése…" #: fedora/django/auth/models.py:60 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" "Nem lehet Fedora csoportokat betölteni. FAS_USERNAME és FAS_PASSWORD " "beállítva?" #: fedora/django/auth/models.py:67 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" "FAS csoport betöltve. Ne felejtse el beállítani a FAS_USERNAME és " "FAS_PASSWORD változókat az alacsony prioritású felhasználói nevekhez." #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "Üdvözlöm, %s" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" "A megadott igazolvány nem jó vagy nem jogosítja fel a hozzáférésre az " "erőforráshoz." #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "Fel kell mutatnia az igazolványát, mielőtt hozzáfér az erőforráshoz." #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "Kérem jelentkezzen be." #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "Sikerült kijelentkezni." #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "Bejelentkezés" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "Jelszó:" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "Bejelentkezés" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "CSRF támadások" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you " "are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" "rosszindulatú webhelyek eszköze arra, hogy kérést intézzen más\n" " webszolgálókhoz a rosszindulatú webhellyel kapcsolatba lépő\n" " használóként. E lap célja, hogy segítsen megvédeni az ön\n" " számláját és e szolgálót az ilyen rosszindulatú webhelyektől.\n" " Alább kattintva ön bizonyítja, hogy inkább élő személy\n" " mint csak egy rosszindulatú webhely nevében eljáró és az\n" " ön hitelesítő sütijét továbbító webböngésző." #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "Ember vagyok" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "Elfelejtett jelszó?" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "Beiratkozás" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "Üdvözöm" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "Ön nem jelentkezett be" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "CSRF védve" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "Bejelentkezés ellenőrzése" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "Kijelentkezés" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "látogatás frissítése (%s)" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "Felhasználói név:" python-fedora-0.10.0/translations/es.po0000664000175000017500000001560613137632523022472 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # # Translators: # Claudio Rodrigo Pereyra Diaz , 2011, 2012 # Daniel Cabrera , 2011 # beckerde , 2011 # FIRST AUTHOR , 2009 # Gladys Guerrero , 2009 # Daniel Cabrera , 2011 # Kenneth Guerra , 2015. #zanata # Ralph Bean , 2015. #zanata msgid "" msgstr "" "Project-Id-Version: python-fedora 0.8.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2016-04-21 16:57+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2015-04-29 08:36-0400\n" "Last-Translator: Kenneth Guerra \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/python-fedora/" "language/es/)\n" "Generated-By: Babel 1.3\n" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Zanata 3.8.3\n" #: fedora/client/wiki.py:102 #, python-format msgid "From %(then)s to %(now)s" msgstr "Desde %(then)s hasta %(now)s" #: fedora/client/wiki.py:105 #, python-format msgid "%d wiki changes in the past week" msgstr "%d cambios en la wiki en la semana pasada" #: fedora/client/wiki.py:107 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" "Advertencia: El número de cambios ha alcanzado el límite de regreso de la " "API.\n" "Usted no tendrá la lista completa de cambios a menos que\n" "ejecute este programa usando una cuenta 'bot'." #: fedora/client/wiki.py:118 msgid "\n" "== Most active wiki users ==" msgstr "\n" "== Usuarios wiki más activos ==" #: fedora/client/wiki.py:125 msgid "\n" "== Most edited pages ==" msgstr "\n" "== Páginas más editadas ==" #: fedora/django/auth/models.py:54 msgid "Loading FAS groups..." msgstr "Cargando grupos FAS..." #: fedora/django/auth/models.py:60 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" "No se pudieron cargar los grupos FAS. ¿Se establecieron FAS_USERNAME y " "FAS_PASSWORD?" #: fedora/django/auth/models.py:67 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" "Los grupos FAS han sido cargados. No olvide poner FAS_USERNAME y " "FAS_PASSWORD a una cuenta de bajos privilegios." #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "Bienvenido, %s" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" "Las credenciales que se proporcionaron no son correctas o no proveen el " "acceso a este recurso." #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "Debe proveer sus credenciales antes de acceder a este recurso." #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "Por favor, inicie sesión." #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "Ha cerrado con éxito su sesión." #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "Iniciar sesión" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "Nombre de usuario:" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "Contraseña:" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "Entrar" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "ataques CSRF" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you " "are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" " son un medio para que un sitio web maligno haga un pedido de otro\n" " sitio web como el usuario que contactó el sitio maligno. El\n" " propósito de este paquete es ayudar a proteger su cuenta y a este " "servidor\n" " de ataques de dichos sitios. Haciendo clic abajo, estará probando\n" " que Ud. es la persona en vez del navegador de web que usó sus " "cookies de\n" " autenticación como si fuera el sitio\n" " web maligno." #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "Soy un humano" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "¿Olvidó la contraseña?" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "Registrarse" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "Bienvenido" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "No ha ingresado al sistema" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "Protegido por CSRF" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "Verificar Entrada" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "Salir" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "actualizando visita (%s)" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "Nombre de Usuario:" python-fedora-0.10.0/translations/tg.po0000664000175000017500000001161313137632523022467 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Tajik\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tg\n" "Plural-Forms: nplurals=1; plural=0\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/fi.po0000664000175000017500000001162413137632523022455 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Finnish\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/id.po0000664000175000017500000001162013137632523022447 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Indonesian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: id\n" "Plural-Forms: nplurals=1; plural=0\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/ja.po0000664000175000017500000001631113137632523022447 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # # Translators: # FIRST AUTHOR , 2009 # Hajime Taira , 2011 # Tomoyuki KATO , 2011, 2012 # carrotsoft , 2011 # Ralph Bean , 2015. #zanata # Noriko Mizumoto , 2016. #zanata msgid "" msgstr "" "Project-Id-Version: python-fedora 0.8.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2016-04-21 16:57+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2016-01-27 10:35-0500\n" "Last-Translator: Noriko Mizumoto \n" "Language-Team: Japanese (http://www.transifex.com/projects/p/python-fedora/" "language/ja/)\n" "Generated-By: Babel 1.3\n" "Language: ja\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Zanata 3.8.3\n" #: fedora/client/wiki.py:102 #, python-format msgid "From %(then)s to %(now)s" msgstr "%(then)s から %(now)s" #: fedora/client/wiki.py:105 #, python-format msgid "%d wiki changes in the past week" msgstr "%d wiki は先週変更されました" #: fedora/client/wiki.py:107 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" "警告: このAPIの返り値の制限に対し、多くの変更がされました。\n" "あなたがこのスクリプトで 'bot' アカウントを使用している限り、\n" "全ての変更リストを入手することはできません。" #: fedora/client/wiki.py:118 msgid "\n" "== Most active wiki users ==" msgstr "\n" "== 最も活発な wiki ユーザ ==" #: fedora/client/wiki.py:125 msgid "\n" "== Most edited pages ==" msgstr "\n" "== 最も編集されているページ ==" #: fedora/django/auth/models.py:54 msgid "Loading FAS groups..." msgstr "FAS グループをロードしています..." #: fedora/django/auth/models.py:60 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "FAS グループをロード出来ません。FAS_USERNAME と FAS_PASSWORDをセットしましたか?" #: fedora/django/auth/models.py:67 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" "FAS グループがロードされました。FAS_USERNAME と FAS_PASSWORDを 制限アカウントにセットするのを忘れないでください。" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "ようこそ %s" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "あなたの証明書は正しくないか、このソースにアクセスする権限がありません。" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "このソースにアクセスする前に、あなたの証明書を提示しなければいけません。" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "ログインしてください。" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "ログアウトに成功しました。" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "ログイン" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "ユーザー名:" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "パスワード:" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "ログイン" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "CSRF アタック" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you " "are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" "とは、有害なウェブサイトが他のウェブサーバーに対し、その有害なウェブサイト\n" "  にアクセスしたことのあるユーザのアカウント利用してリクエストをすることです。\n" "  このページの目的は、あなたのアカウントと、\n" "  このサーバーを有害なウェブサイトからの攻撃から守ることです。\n" "  以下をクリックしてください。あなたが人間であり、\n" "  有害なウェブサイトが貴方の認証を転送してきたのではないことを証明できます。" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "私は人間です" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "パスワードを忘れましたか?" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "サインアップ" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "ようこそ" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "ログインしていません" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "CSRF は保護されました" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "ログイン認証" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "ログアウト" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "(%s) の訪問をアップデートしています" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "ユーザー名:" python-fedora-0.10.0/translations/he.po0000664000175000017500000001162313137632523022452 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Hebrew\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: he\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/bs.po0000664000175000017500000001173613137632523022467 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Bosnian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bs\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/zh_HK.po0000664000175000017500000001164613137632523023066 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Chinese (Hong Kong SAR China)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh-HK\n" "Plural-Forms: nplurals=1; plural=0\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/pt_BR.po0000664000175000017500000001555513137632523023074 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # # Translators: # Cleiton Lima , 2011 # Diego Búrigo Zacarão , 2009 # felipemocruha , 2013 # FIRST AUTHOR , 2008, 2009 # Marcelo Barbosa , 2013 # ufa , 2010 # Marco Aurélio Krause , 2015. #zanata # Ralph Bean , 2015. #zanata msgid "" msgstr "" "Project-Id-Version: python-fedora 0.8.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2016-04-21 16:57+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2015-09-21 05:09-0400\n" "Last-Translator: Marco Aurélio Krause \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/" "python-fedora/language/pt_BR/)\n" "Generated-By: Babel 1.3\n" "Language: pt-BR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Zanata 3.8.3\n" #: fedora/client/wiki.py:102 #, python-format msgid "From %(then)s to %(now)s" msgstr "De %(then)s para %(now)s" #: fedora/client/wiki.py:105 #, python-format msgid "%d wiki changes in the past week" msgstr "%d mudanças na wiki na semana passada" #: fedora/client/wiki.py:107 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" "Atenção: Números de mudanças ultrapassou o limite de retorno da API.\n" "Você não obterá a lista completa das mudanças sem que\n" "você execute esse script utilizando uma conta 'bot'." #: fedora/client/wiki.py:118 msgid "\n" "== Most active wiki users ==" msgstr "\n" "== Usuários mais ativos do wiki ==" #: fedora/client/wiki.py:125 msgid "\n" "== Most edited pages ==" msgstr "\n" "== Páginas mais editadas ==" #: fedora/django/auth/models.py:54 msgid "Loading FAS groups..." msgstr "Abrindo grupos do FAS..." #: fedora/django/auth/models.py:60 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" "Não foi possível abrir os grupos do FAS. Você definiu FAS_USERNAME e " "FAS_PASSWORD?" #: fedora/django/auth/models.py:67 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" "Grupos FAS carregados. Não esqueça de configurar o FAS_USERNAME e " "FAS_PASSWORD para uma conta de baixo privilégio." #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "Bem vindo, %s" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" "As credenciais que forneceu não foram corretas ou não concederam o acesso a " "este recurso." #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "Você deve prover sua credencial antes de acessar esse recurso." #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "Por favor efetue log in." #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "Você efetuou log off com sucesso." #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "Log In" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "Nome de usuário:" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "Senha:" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "Login" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "Ataques CSRF" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you " "are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" "São um meio para um site malicioso fazer uma requisição para outro\n" " servidor web como o usuário contactou o malicioso site. O\n" " propósito dessa página é ajudar a proteger sua conta e esse servidor\n" " de ataques desses sites maliciosos. Clicando abaixo, você está\n" " provando que você é uma pessoa e não apenas o navegador web\n" " encaminhando seus cookies de autenticação em nome de um site\n" " malicioso." #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "Eu sou humano" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "Esqueceu a senha" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "Inscrever-se" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "Bem vindo" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "Você não está logado" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "Protegido contra CSRF" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "Verifique o login" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "Logout" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "atualizando visita (%s)" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "Usuário" python-fedora-0.10.0/translations/ilo.po0000664000175000017500000001161413137632523022641 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Iloko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ilo\n" "Plural-Forms: nplurals=1; plural=0\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/kk.po0000664000175000017500000001161413137632523022463 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Kazakh\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: kk\n" "Plural-Forms: nplurals=1; plural=0\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/ast.po0000664000175000017500000001162613137632523022650 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Asturian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ast\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/ro.po0000664000175000017500000001170613137632523022500 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Romanian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ro\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2);\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/zu.po0000664000175000017500000001161213137632523022512 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Zulu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zu\n" "Plural-Forms: nplurals=1; plural=0\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/as.po0000664000175000017500000001162513137632523022463 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Assamese\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: as\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/am.po0000664000175000017500000001162313137632523022453 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Amharic\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: am\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/kw_GB.po0000664000175000017500000001171313137632523023047 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Cornish (United Kingdom)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: kw-GB\n" "Plural-Forms: nplurals=4; plural= (n==1) ? 0 : (n==2) ? 1 : (n == 3) ? 2 : 3\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/sk.po0000664000175000017500000001165613137632523022501 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Slovak\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sk\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/ky.po0000664000175000017500000001161513137632523022502 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Kirghiz\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ky\n" "Plural-Forms: nplurals=1; plural=0\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/gl.po0000664000175000017500000001162513137632523022462 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Galician\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: gl\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/wba.po0000664000175000017500000001161213137632523022625 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: wba\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: wba\n" "Plural-Forms: nplurals=1; plural=0\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/nl.po0000664000175000017500000001540513137632523022471 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # # Translators: # Geert Warrink , 2011 # Geert Warrink , 2015. #zanata # Ralph Bean , 2015. #zanata # Patrick Uiterwijk , 2016. #zanata msgid "" msgstr "" "Project-Id-Version: python-fedora 0.8.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2016-04-21 16:57+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2016-01-27 08:27-0500\n" "Last-Translator: Patrick Uiterwijk \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/python-fedora/" "language/nl/)\n" "Generated-By: Babel 1.3\n" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Zanata 3.8.3\n" #: fedora/client/wiki.py:102 #, python-format msgid "From %(then)s to %(now)s" msgstr "Van %(then)s naar %(now)s " #: fedora/client/wiki.py:105 #, python-format msgid "%d wiki changes in the past week" msgstr "%d wiki veranderingen in de afgelopen week" #: fedora/client/wiki.py:107 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" "Waarschuwing: Het aantal veranderingen bereikt de API return limiet.\n" "Je krijgt niet de complete lijst van wijzigingen, tenzij\n" "je dit script uitvoert met een 'bot' account." #: fedora/client/wiki.py:118 msgid "\n" "== Most active wiki users ==" msgstr "\n" "== Meest actieve wiki gebruikers ==" #: fedora/client/wiki.py:125 msgid "\n" "== Most edited pages ==" msgstr "\n" "== De meeste bewerkte pagina's ==" #: fedora/django/auth/models.py:54 msgid "Loading FAS groups..." msgstr "FAS groepen laden..." #: fedora/django/auth/models.py:60 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" "Kan FAS groepen niet laden. Heb je FAS_USERNAME en FAS_PASSWORD ingesteld?" #: fedora/django/auth/models.py:67 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" "FAS groepen geladen. Vergeet niet om FAS_USERNAME en FAS_PASSWORD in te " "stellen op een lage-rechten account." #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "Welkom, %s" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" "De referenties die je opgegeven hebt zijn niet juist of verlenen geen " "toegang tot deze hulpbron." #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" "Je moet jouw referenties aanbieden voordat deze hulpbron toegankelijk wordt." #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "Gelieve in te loggen." #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "Je hebt succesvol afgemeld." #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "Inloggen" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "Gebruikersnaam" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "Wachtwoord:" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "Inloggen" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "CSRF aanvallen" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you " "are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" " zijn een manier voor een kwaadaardige website om een verzoek van een andere\n" " webserver te vragen als de gebruiker die contact opgenomen heeft met " "de schadelijke website. Het\n" " doel van deze pagina is te helpen om jouw account en deze server\n" " te beschermen tegen aanvallen van dergelijke kwaadaardige websites. " " Door hieronder\n" " te klikken, bewijs je dat je een persoon bent in plaats van alleen de " "webbrowser\n" " die jouw authenticatie cookies doorstuurt in naam van een " "kwaadaardige\n" " website." #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "Ik ben een mens" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "Wachtwoord vergeten?" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "Aanmelden" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "Welkom" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "Je bent niet ingelogd" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "CSRF beschermd" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "Inlog verifiëren" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "Afmelden" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "bijwerken van bezoek (%s)" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "Gebruikersnaam:" python-fedora-0.10.0/translations/ms.po0000664000175000017500000001161313137632523022474 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Malay\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ms\n" "Plural-Forms: nplurals=1; plural=0\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/ia.po0000664000175000017500000001163013137632523022445 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Interlingua\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ia\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/sv.po0000664000175000017500000001525613137632523022514 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # # Translators: # Göran Uddeborg , 2011 # Ulrika , 2012 # Göran Uddeborg , 2015. #zanata # Ralph Bean , 2015. #zanata msgid "" msgstr "" "Project-Id-Version: python-fedora 0.8.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2016-04-21 16:57+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2015-08-31 01:43-0400\n" "Last-Translator: Göran Uddeborg \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/python-fedora/" "language/sv/)\n" "Generated-By: Babel 1.3\n" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Zanata 3.8.3\n" #: fedora/client/wiki.py:102 #, python-format msgid "From %(then)s to %(now)s" msgstr "Från %(then)s till %(now)s" #: fedora/client/wiki.py:105 #, python-format msgid "%d wiki changes in the past week" msgstr "%d wiki-förändringar under den senaste veckan" #: fedora/client/wiki.py:107 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" "Varning: Antalet förändringar når API:ets gräns för returer.\n" "Du kommer inte få den kompletta listan över förändringar om du\n" "inte kör detta skript med ett ”bot”-konto." #: fedora/client/wiki.py:118 msgid "\n" "== Most active wiki users ==" msgstr "\n" "== Mest aktiva wiki-användare ==" #: fedora/client/wiki.py:125 msgid "\n" "== Most edited pages ==" msgstr "\n" "== Mest redigerade sidor ==" #: fedora/django/auth/models.py:54 msgid "Loading FAS groups..." msgstr "Läser in FAS-grupper …" #: fedora/django/auth/models.py:60 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" "Kan inte läsa in FAS-grupper. Har du ställt in FAS_USERNAME och " "FAS_PASSWORD?" #: fedora/django/auth/models.py:67 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" "FAS-grupper inlästa. Glöm inte att ställa in FAS_USERNAME och FAS_PASSWORD " "till ett lågprivilegierat konto." #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "Välkommen, %s" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" "Kreditiven du angav var inte korrekta eller gav inte tillgång till denna " "resurs." #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "Du måste ange dina kreditiv före åtkomst till denna resurs." #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "Logga in." #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "Du har nu loggat ut." #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "Logga in" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "Användarnamn:" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "Lösenord:" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "Logga in" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "CSRF-attacker" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you " "are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" "är ett sätt för en skadlig webbplats att skicka en begäran till en annan\n" " webbserver som den användare som kontaktade den skadliga webbplatsen." "\n" " Syftet med denna sida är att hjälpa till att skydda ditt konto och\n" " denna server från attacker från sådana skadliga webbplatser. Genom\n" " att klicka nedan, bevisar du att du är en person snarare än bara\n" " webbläsaren som vidarebefordrar dina autentiseringskakor på uppdrag\n" " av en skadlig webbplats." #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "Jag är en människa" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "Glömt lösenord?" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "Registrera dig" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "Välkommen" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "Du är inte inloggad" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "CSRF-skyddad" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "Verifiera inloggning" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "Logga ut" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "uppdaterar besök (%s)" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "Användarnamn:" python-fedora-0.10.0/translations/be.po0000664000175000017500000001174113137632523022445 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Belarusian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: be\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/lv.po0000664000175000017500000001166713137632523022507 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Latvian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: lv\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/km.po0000664000175000017500000001161313137632523022464 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Khmer\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: km\n" "Plural-Forms: nplurals=1; plural=0\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/kn.po0000664000175000017500000001162213137632523022465 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Kannada\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: kn\n" "Plural-Forms: nplurals=2; plural=(n!=1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/en_GB.po0000664000175000017500000001165013137632523023030 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: English (United Kingdom)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: en-GB\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/sq.po0000664000175000017500000001162513137632523022503 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Albanian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sq\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/el_GR.po0000664000175000017500000001213413137632523023044 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # # Translators: # Michael Michaelides , 2011 # Toshio Kuratomi , 2013 msgid "" msgstr "" "Project-Id-Version: python-fedora\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: 2014-08-07 15:51+0000\n" "Last-Translator: Toshio Kuratomi \n" "Language-Team: Greek (Greece) (http://www.transifex.com/projects/p/python-fedora/language/el_GR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: el_GR\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/translations/bo.po0000664000175000017500000001161513137632523022457 0ustar puiterwijkpuiterwijk00000000000000# Translations template for python-fedora. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the python-fedora # project. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: python-fedora 0.3.35\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-08-07 08:36-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Tibetan\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bo\n" "Plural-Forms: nplurals=1; plural=0\n" "X-Generator: Zanata 3.7.3\n" #: fedora/client/wiki.py:93 #, python-format msgid "From %(then)s to %(now)s" msgstr "" #: fedora/client/wiki.py:96 #, python-format msgid "%d wiki changes in the past week" msgstr "" #: fedora/client/wiki.py:98 msgid "" "Warning: Number of changes reaches the API return limit.\n" "You will not get the complete list of changes unless\n" "you run this script using a 'bot' account." msgstr "" #: fedora/client/wiki.py:109 msgid "" "\n" "== Most active wiki users ==" msgstr "" #: fedora/client/wiki.py:116 msgid "" "\n" "== Most edited pages ==" msgstr "" #: fedora/django/auth/models.py:52 msgid "Loading FAS groups..." msgstr "" #: fedora/django/auth/models.py:58 msgid "Unable to load FAS groups. Did you set FAS_USERNAME and FAS_PASSWORD?" msgstr "" #: fedora/django/auth/models.py:65 msgid "" "FAS groups loaded. Don't forget to set FAS_USERNAME and FAS_PASSWORD to a " "low-privilege account." msgstr "" #: fedora/tg/controllers.py:73 #, python-format msgid "Welcome, %s" msgstr "" #: fedora/tg/controllers.py:82 msgid "" "The credentials you supplied were not correct or did not grant access to " "this resource." msgstr "" #: fedora/tg/controllers.py:85 msgid "You must provide your credentials before accessing this resource." msgstr "" #: fedora/tg/controllers.py:88 msgid "Please log in." msgstr "" #: fedora/tg/controllers.py:116 msgid "You have successfully logged out." msgstr "" #: fedora/tg/templates/genshi/login.html:14 #: fedora/tg2/templates/genshi/login.html:9 #: fedora/tg2/templates/mako/login.mak:3 msgid "Log In" msgstr "" #: fedora/tg/templates/genshi/login.html:18 msgid "User Name:" msgstr "" #: fedora/tg/templates/genshi/login.html:21 #: fedora/tg2/templates/genshi/login.html:31 #: fedora/tg2/templates/mako/login.mak:25 msgid "Password:" msgstr "" #: fedora/tg/templates/genshi/login.html:25 #: fedora/tg/templates/genshi/login.html:88 #: fedora/tg2/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:66 #: fedora/tg2/templates/mako/login.mak:27 #: fedora/tg2/templates/mako/login.mak:63 msgid "Login" msgstr "" #: fedora/tg/templates/genshi/login.html:32 #: fedora/tg2/templates/genshi/login.html:14 #: fedora/tg2/templates/mako/login.mak:9 msgid "CSRF attacks" msgstr "" #: fedora/tg/templates/genshi/login.html:33 #: fedora/tg2/templates/genshi/login.html:15 #: fedora/tg2/templates/mako/login.mak:10 msgid "" " are a means for a malicious website to make a request of another\n" " web server as the user who contacted the malicious web site. The\n" " purpose of this page is to help protect your account and this server\n" " from attacks from such malicious web sites. By clicking below, you are\n" " proving that you are a person rather than just the web browser\n" " forwarding your authentication cookies on behalf of a malicious\n" " website." msgstr "" #: fedora/tg/templates/genshi/login.html:40 #: fedora/tg2/templates/genshi/login.html:23 #: fedora/tg2/templates/mako/login.mak:18 msgid "I am a human" msgstr "" #: fedora/tg/templates/genshi/login.html:45 #: fedora/tg2/templates/genshi/login.html:37 #: fedora/tg2/templates/mako/login.mak:31 msgid "Forgot Password?" msgstr "" #: fedora/tg/templates/genshi/login.html:46 #: fedora/tg2/templates/genshi/login.html:38 #: fedora/tg2/templates/mako/login.mak:32 msgid "Sign Up" msgstr "" #: fedora/tg/templates/genshi/login.html:64 #: fedora/tg2/templates/genshi/login.html:47 #: fedora/tg2/templates/mako/login.mak:40 msgid "Welcome" msgstr "" #: fedora/tg/templates/genshi/login.html:86 #: fedora/tg2/templates/genshi/login.html:64 #: fedora/tg2/templates/mako/login.mak:61 msgid "You are not logged in" msgstr "" #: fedora/tg/templates/genshi/login.html:93 #: fedora/tg2/templates/genshi/login.html:70 #: fedora/tg2/templates/mako/login.mak:69 msgid "CSRF protected" msgstr "" #: fedora/tg/templates/genshi/login.html:95 #: fedora/tg2/templates/genshi/login.html:72 #: fedora/tg2/templates/mako/login.mak:72 msgid "Verify Login" msgstr "" #: fedora/tg/templates/genshi/login.html:101 #: fedora/tg2/templates/genshi/login.html:78 #: fedora/tg2/templates/mako/login.mak:79 msgid "Logout" msgstr "" #: fedora/tg/visit/jsonfasvisit1.py:109 #, python-format msgid "updating visit (%s)" msgstr "" #: fedora/tg2/templates/genshi/login.html:28 #: fedora/tg2/templates/mako/login.mak:22 msgid "Username:" msgstr "" python-fedora-0.10.0/fedora/0000775000175000017500000000000013234574425020236 5ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/fedora/wsgi/0000775000175000017500000000000013234574425021207 5ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/fedora/wsgi/faswho/0000775000175000017500000000000013234574425022476 5ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/fedora/wsgi/faswho/__init__.py0000664000175000017500000000021713137632523024603 0ustar puiterwijkpuiterwijk00000000000000from fedora.wsgi.faswho.faswhoplugin import ( FASWhoPlugin, make_faswho_middleware ) __all__ = (FASWhoPlugin, make_faswho_middleware) python-fedora-0.10.0/fedora/wsgi/faswho/faswhoplugin.py0000664000175000017500000003636413137632523025566 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2008-2011 Red Hat, Inc. # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # ''' repoze.who plugin to authenticate against hte Fedora Account System .. moduleauthor:: John (J5) Palmieri .. moduleauthor:: Luke Macken .. moduleauthor:: Toshio Kuratomi .. versionadded:: 0.3.17 .. versionchanged:: 0.3.26 - Added secure and httponly as optional attributes to the session cookie - Removed too-aggressive caching (wouldn't detect logout from another app) - Added ability to authenticate and request a page in one request ''' import os import sys import logging import pkg_resources from beaker.cache import Cache from munch import Munch from kitchen.text.converters import to_bytes, exception_to_bytes from paste.httpexceptions import HTTPFound from repoze.who.middleware import PluggableAuthenticationMiddleware from repoze.who.classifiers import default_request_classifier from repoze.who.classifiers import default_challenge_decider from repoze.who.interfaces import IChallenger, IIdentifier from repoze.who.plugins.basicauth import BasicAuthPlugin from repoze.who.plugins.friendlyform import FriendlyFormPlugin from paste.request import parse_dict_querystring, parse_formvars from six.moves.urllib.parse import quote_plus import webob from fedora.client import AuthError from fedora.client.fasproxy import FasProxyClient from fedora.wsgi.csrf import CSRFMetadataProvider, CSRFProtectionMiddleware log = logging.getLogger(__name__) FAS_URL = 'https://admin.fedoraproject.org/accounts/' FAS_CACHE_TIMEOUT = 900 # 15 minutes (FAS visits timeout after 20) fas_cache = Cache('fas_repozewho_cache', type='memory') def fas_request_classifier(environ): classifier = default_request_classifier(environ) if classifier == 'browser': request = webob.Request(environ) if not request.accept.best_match( ['application/xhtml+xml', 'text/html']): classifier = 'app' return classifier def make_faswho_middleware( app, log_stream=None, login_handler='/login_handler', login_form_url='/login', logout_handler='/logout_handler', post_login_url='/post_login', post_logout_url=None, fas_url=FAS_URL, insecure=False, ssl_cookie=True, httponly=True): ''' :arg app: WSGI app that is being wrapped :kwarg log_stream: :class:`logging.Logger` to log auth messages :kwarg login_handler: URL where the login form is submitted :kwarg login_form_url: URL where the login form is displayed :kwarg logout_handler: URL where the logout form is submitted :kwarg post_login_url: URL to redirect the user to after login :kwarg post_logout_url: URL to redirect the user to after logout :kwarg fas_url: Base URL to the FAS server :kwarg insecure: Allow connecting to a fas server without checking the server's SSL certificate. Opens you up to MITM attacks but can be useful when testing. *Do not enable this in production* :kwarg ssl_cookie: If :data:`True` (default), tell the browser to only send the session cookie back over https. :kwarg httponly: If :data:`True` (default), tell the browser that the session cookie should only be read for sending to a server, not for access by JavaScript or other clientside technology. This prevents using the session cookie to pass information to JavaScript clients but also prevents XSS attacks from stealing the session cookie information. ''' # Because of the way we override values (via a dict in AppConfig), we # need to make this a keyword arg and then check it here to make it act # like a positional arg. if not log_stream: raise TypeError( 'log_stream must be set when calling make_fasauth_middleware()') faswho = FASWhoPlugin(fas_url, insecure=insecure, ssl_cookie=ssl_cookie, httponly=httponly) csrf_mdprovider = CSRFMetadataProvider() form = FriendlyFormPlugin(login_form_url, login_handler, post_login_url, logout_handler, post_logout_url, rememberer_name='fasident', charset='utf-8') form.classifications = {IIdentifier: ['browser'], IChallenger: ['browser']} # only for browser basicauth = BasicAuthPlugin('repoze.who') identifiers = [ ('form', form), ('fasident', faswho), ('basicauth', basicauth) ] authenticators = [('fasauth', faswho)] challengers = [('form', form), ('basicauth', basicauth)] mdproviders = [('fasmd', faswho), ('csrfmd', csrf_mdprovider)] if os.environ.get('FAS_WHO_LOG'): log_stream = sys.stdout app = CSRFProtectionMiddleware(app) app = PluggableAuthenticationMiddleware( app, identifiers, authenticators, challengers, mdproviders, fas_request_classifier, default_challenge_decider, log_stream=log_stream, ) return app class FASWhoPlugin(object): def __init__(self, url, insecure=False, session_cookie='tg-visit', ssl_cookie=True, httponly=True): self.url = url self.insecure = insecure self.fas = FasProxyClient(url, insecure=insecure) self.session_cookie = session_cookie self.ssl_cookie = ssl_cookie self.httponly = httponly self._session_cache = {} self._metadata_plugins = [] for entry in pkg_resources.iter_entry_points( 'fas.repoze.who.metadata_plugins'): self._metadata_plugins.append(entry.load()) def _retrieve_user_info(self, environ, auth_params=None): ''' Retrieve information from fas and cache the results. We need to retrieve the user fresh every time because we need to know that the password hasn't changed or the session_id hasn't been invalidated by the user logging out. ''' if not auth_params: return None user_data = self.fas.get_user_info(auth_params) if not user_data: self.forget(environ, None) return None if isinstance(user_data, tuple): user_data = list(user_data) # Set session_id in here so it can be found by other plugins user_data[1]['session_id'] = user_data[0] # we don't define permissions since we don't have any peruser data # though other services may wish to add another metadata plugin to do # so if not 'permissions' in user_data[1]: user_data[1]['permissions'] = set() # we keep the approved_memberships list because there is also an # unapproved_membership field. The groups field is for repoze.who # group checking and may include other types of groups besides # memberships in the future (such as special fedora community groups) groups = set() for g in user_data[1]['approved_memberships']: groups.add(g['name']) user_data[1]['groups'] = groups # If we have information on the user, cache it for later fas_cache.set_value(user_data[1]['username'], user_data, expiretime=FAS_CACHE_TIMEOUT) return user_data def identify(self, environ): '''Extract information to identify a user Retrieve either a username and password or a session_id that can be passed on to FAS to authenticate the user. ''' log.info('in identify()') # friendlyform compat if not 'repoze.who.logins' in environ: environ['repoze.who.logins'] = 0 req = webob.Request(environ, charset='utf-8') cookie = req.cookies.get(self.session_cookie) # This is compatible with TG1 and it gives us a way to authenticate # a user without making two requests query = req.GET form = Munch(req.POST) form.update(query) if form.get('login', None) == 'Login' and \ 'user_name' in form and \ 'password' in form: identity = { 'login': form['user_name'], 'password': form['password'] } keys = ('login', 'password', 'user_name') for k in keys: if k in req.GET: del(req.GET[k]) if k in req.POST: del(req.POST[k]) return identity if cookie is None: return None log.info('Request identify for cookie %(cookie)s' % {'cookie': to_bytes(cookie)}) try: user_data = self._retrieve_user_info( environ, auth_params={'session_id': cookie}) except Exception as e: # pylint:disable-msg=W0703 # For any exceptions, returning None means we failed to identify log.warning(e) return None if not user_data: return None # Preauthenticated identity = {'repoze.who.userid': user_data[1]['username'], 'login': user_data[1]['username'], 'password': user_data[1]['password']} return identity def remember(self, environ, identity): log.info('In remember()') result = [] user_data = fas_cache.get_value(identity['login']) try: session_id = user_data[0] except Exception: return None set_cookie = ['%s=%s; Path=/;' % (self.session_cookie, session_id)] if self.ssl_cookie: set_cookie.append('Secure') if self.httponly: set_cookie.append('HttpOnly') set_cookie = '; '.join(set_cookie) result.append(('Set-Cookie', set_cookie)) return result def forget(self, environ, identity): log.info('In forget()') # return a expires Set-Cookie header user_data = fas_cache.get_value(identity['login']) try: session_id = user_data[0] except Exception: return None log.info('Forgetting login data for cookie %(s_id)s' % {'s_id': to_bytes(session_id)}) self.fas.logout(session_id) result = [] fas_cache.remove_value(key=identity['login']) expired = '%s=\'\'; Path=/; Expires=Sun, 10-May-1971 11:59:00 GMT'\ % self.session_cookie result.append(('Set-Cookie', expired)) return result # IAuthenticatorPlugin def authenticate(self, environ, identity): log.info('In authenticate()') def set_error(msg): log.info(msg) err = 1 environ['FAS_AUTH_ERROR'] = err # HTTPForbidden ? err_app = HTTPFound(err_goto + '?' + 'came_from=' + quote_plus(came_from)) environ['repoze.who.application'] = err_app err_goto = '/login' default_came_from = '/' if 'SCRIPT_NAME' in environ: sn = environ['SCRIPT_NAME'] err_goto = sn + err_goto default_came_from = sn + default_came_from query = parse_dict_querystring(environ) form = parse_formvars(environ) form.update(query) came_from = form.get('came_from', default_came_from) try: auth_params = {'username': identity['login'], 'password': identity['password']} except KeyError: try: auth_params = {'session_id': identity['session_id']} except: # On error we return None which means that auth failed set_error('Parameters for authenticating not found') return None try: user_data = self._retrieve_user_info(environ, auth_params) except AuthError as e: set_error('Authentication failed: %s' % exception_to_bytes(e)) log.warning(e) return None except Exception as e: set_error('Unknown auth failure: %s' % exception_to_bytes(e)) return None if user_data: try: del user_data[1]['password'] environ['CSRF_AUTH_SESSION_ID'] = user_data[0] return user_data[1]['username'] except ValueError: set_error('user information from fas not in expected format!') return None except Exception: pass set_error('An unknown error happened when trying to log you in.' ' Please try again.') return None def add_metadata(self, environ, identity): log.info('In add_metadata') if identity.get('error'): log.info('Error exists in session, no need to set metadata') return 'error' plugin_user_info = {} for plugin in self._metadata_plugins: plugin(plugin_user_info) identity.update(plugin_user_info) del plugin_user_info user = identity.get('repoze.who.userid') (session_id, user_info) = fas_cache.get_value( key=user, expiretime=FAS_CACHE_TIMEOUT) #### FIXME: Deprecate this line!!! # If we make a new version of fas.who middleware, get rid of saving # user information directly into identity. Instead, save it into # user, as is done below identity.update(user_info) identity['userdata'] = user_info identity['user'] = Munch() identity['user'].created = user_info['creation'] identity['user'].display_name = user_info['human_name'] identity['user'].email_address = user_info['email'] identity['user'].groups = user_info['groups'] identity['user'].password = None identity['user'].permissions = user_info['permissions'] identity['user'].user_id = user_info['id'] identity['user'].user_name = user_info['username'] identity['groups'] = user_info['groups'] identity['permissions'] = user_info['permissions'] if 'repoze.what.credentials' not in environ: environ['repoze.what.credentials'] = {} environ['repoze.what.credentials']['groups'] = user_info['groups'] permissions = user_info['permissions'] environ['repoze.what.credentials']['permissions'] = permissions # Adding the userid: userid = identity['repoze.who.userid'] environ['repoze.what.credentials']['repoze.what.userid'] = userid def __repr__(self): return '<%s %s>' % (self.__class__.__name__, id(self)) python-fedora-0.10.0/fedora/wsgi/__init__.py0000664000175000017500000000000013137632523023302 0ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/fedora/wsgi/csrf.py0000664000175000017500000003122013137632523022510 0ustar puiterwijkpuiterwijk00000000000000# # -*- coding: utf-8 -*- # # Copyright (C) 2008-2011 Red Hat, Inc. # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # ''' Cross-site Request Forgery Protection. http://en.wikipedia.org/wiki/Cross-site_request_forgery .. moduleauthor:: John (J5) Palmieri .. moduleauthor:: Luke Macken .. versionadded:: 0.3.17 ''' from hashlib import sha1 import logging from munch import Munch from kitchen.text.converters import to_bytes from webob import Request try: # webob > 1.0 from webob.headers import ResponseHeaders except ImportError: # webob < 1.0 from webob.headerdict import HeaderDict as ResponseHeaders from paste.httpexceptions import HTTPFound from paste.response import replace_header from repoze.who.interfaces import IMetadataProvider from zope.interface import implements from fedora.urlutils import update_qs log = logging.getLogger(__name__) class CSRFProtectionMiddleware(object): ''' CSRF Protection WSGI Middleware. A layer of WSGI middleware that is responsible for making sure authenticated requests originated from the user inside of the app's domain and not a malicious website. This middleware works with the :mod:`repoze.who` middleware, and requires that it is placed below :mod:`repoze.who` in the WSGI stack, since it relies upon ``repoze.who.identity`` to exist in the environ before it is called. To utilize this middleware, you can just add it to your WSGI stack below the :mod:`repoze.who` middleware. Here is an example of utilizing the `CSRFProtectionMiddleware` within a TurboGears2 application. In your ``project/config/middleware.py``, you would wrap your main application with the `CSRFProtectionMiddleware`, like so: .. code-block:: python from fedora.wsgi.csrf import CSRFProtectionMiddleware def make_app(global_conf, full_stack=True, **app_conf): app = make_base_app(global_conf, wrap_app=CSRFProtectionMiddleware, full_stack=full_stack, **app_conf) You then need to add the CSRF token to every url that you need to be authenticated for. When used with TurboGears2, an overridden version of :func:`tg.url` is provided. You can use it directly by calling:: from fedora.tg2.utils import url [...] url = url('/authentication_needed') An easier and more portable way to use that is from within TG2 to set this up is to use :func:`fedora.tg2.utils.enable_csrf` when you setup your application. This function will monkeypatch TurboGears2's :func:`tg.url` so that it adds a csrf token to urls. This way, you can keep the same code in your templates and controller methods whether or not you configure the CSRF middleware to provide you with protection via :func:`~fedora.tg2.utils.enable_csrf`. ''' def __init__(self, application, csrf_token_id='_csrf_token', clear_env='repoze.who.identity repoze.what.credentials', token_env='CSRF_TOKEN', auth_state='CSRF_AUTH_STATE'): ''' Initialize the CSRF Protection WSGI Middleware. :csrf_token_id: The name of the CSRF token variable :clear_env: Variables to clear out of the `environ` on invalid token :token_env: The name of the token variable in the environ :auth_state: The environ key that will be set when we are logging in ''' log.info('Creating CSRFProtectionMiddleware') self.application = application self.csrf_token_id = csrf_token_id self.clear_env = clear_env.split() self.token_env = token_env self.auth_state = auth_state def _clean_environ(self, environ): ''' Delete the ``keys`` from the supplied ``environ`` ''' log.debug('clean_environ(%s)' % to_bytes(self.clear_env)) for key in self.clear_env: if key in environ: log.debug('Deleting %(key)s from environ' % {'key': to_bytes(key)}) del(environ[key]) def __call__(self, environ, start_response): ''' This method is called for each request. It looks for a user-supplied CSRF token in the GET/POST parameters, and compares it to the token attached to ``environ['repoze.who.identity']['_csrf_token']``. If it does not match, or if a token is not provided, it will remove the user from the ``environ``, based on the ``clear_env`` setting. ''' request = Request(environ) log.debug('CSRFProtectionMiddleware(%(r_path)s)' % {'r_path': to_bytes(request.path)}) token = environ.get('repoze.who.identity', {}).get(self.csrf_token_id) csrf_token = environ.get(self.token_env) if token and csrf_token and token == csrf_token: log.debug('User supplied CSRF token matches environ!') else: if not environ.get(self.auth_state): log.debug('Clearing identity') self._clean_environ(environ) if 'repoze.who.identity' not in environ: environ['repoze.who.identity'] = Munch() if 'repoze.who.logins' not in environ: # For compatibility with friendlyform environ['repoze.who.logins'] = 0 if csrf_token: log.warning('Invalid CSRF token. User supplied' ' (%(u_token)s) does not match what\'s in our' ' environ (%(e_token)s)' % {'u_token': to_bytes(csrf_token), 'e_token': to_bytes(token)}) response = request.get_response(self.application) if environ.get(self.auth_state): log.debug('CSRF_AUTH_STATE; rewriting headers') token = environ.get('repoze.who.identity', {})\ .get(self.csrf_token_id) loc = update_qs( response.location, {self.csrf_token_id: str(token)}) response.location = loc log.debug('response.location = %(r_loc)s' % {'r_loc': to_bytes(response.location)}) environ[self.auth_state] = None return response(environ, start_response) class CSRFMetadataProvider(object): ''' Repoze.who CSRF Metadata Provider Plugin. This metadata provider is called with an authenticated users identity automatically by repoze.who. It will then take the SHA1 hash of the users session cookie, and set it as the CSRF token in ``environ['repoze.who.identity']['_csrf_token']``. This plugin will also set ``CSRF_AUTH_STATE`` in the environ if the user has just authenticated during this request. To enable this plugin in a TurboGears2 application, you can add the following to your ``project/config/app_cfg.py`` .. code-block:: python from fedora.wsgi.csrf import CSRFMetadataProvider base_config.sa_auth.mdproviders = [('csrfmd', CSRFMetadataProvider())] Note: If you use the faswho plugin, this is turned on automatically. ''' implements(IMetadataProvider) def __init__(self, csrf_token_id='_csrf_token', session_cookie='tg-visit', clear_env='repoze.who.identity repoze.what.credentials', login_handler='/post_login', token_env='CSRF_TOKEN', auth_session_id='CSRF_AUTH_SESSION_ID', auth_state='CSRF_AUTH_STATE'): ''' Create the CSRF Metadata Provider Plugin. :kwarg csrf_token_id: The name of the CSRF token variable. The identity will contain an entry with this as key and the computed csrf_token as the value. :kwarg session_cookie: The name of the session cookie :kwarg login_handler: The path to the login handler, used to determine if the user logged in during this request :kwarg token_env: The name of the token variable in the environ. The environ will contain the token from the request :kwarg auth_session_id: The environ key containing an optional session id :kwarg auth_state: The environ key that indicates when we are logging in ''' self.csrf_token_id = csrf_token_id self.session_cookie = session_cookie self.clear_env = clear_env self.login_handler = login_handler self.token_env = token_env self.auth_session_id = auth_session_id self.auth_state = auth_state def strip_script(self, environ, path): # Strips the script portion of a url path so the middleware works even # when mounted under a path other than root if path.startswith('/') and 'SCRIPT_NAME' in environ: prefix = environ.get('SCRIPT_NAME') if prefix.endswith('/'): prefix = prefix[:-1] if path.startswith(prefix): path = path[len(prefix):] return path def add_metadata(self, environ, identity): request = Request(environ) log.debug('CSRFMetadataProvider.add_metadata(%(r_path)s)' % {'r_path': to_bytes(request.path)}) session_id = environ.get(self.auth_session_id) if not session_id: session_id = request.cookies.get(self.session_cookie) log.debug('session_id = %(s_id)r' % {'s_id': to_bytes(session_id)}) if session_id and session_id != 'Set-Cookie:': environ[self.auth_session_id] = session_id token = sha1(session_id).hexdigest() identity.update({self.csrf_token_id: token}) log.debug('Identity updated with CSRF token') path = self.strip_script(environ, request.path) if path == self.login_handler: log.debug('Setting CSRF_AUTH_STATE') environ[self.auth_state] = True environ[self.token_env] = token else: environ[self.token_env] = self.extract_csrf_token(request) app = environ.get('repoze.who.application') if app: # This occurs during login in some application configurations if isinstance(app, HTTPFound) and environ.get(self.auth_state): log.debug('Got HTTPFound(302) from' ' repoze.who.application') # What possessed people to make this a string or # a function? location = app.location if hasattr(location, '__call__'): location = location() loc = update_qs(location, {self.csrf_token_id: str(token)}) headers = app.headers.items() replace_header(headers, 'location', loc) app.headers = ResponseHeaders(headers) log.debug('Altered headers: %(headers)s' % { 'headers': to_bytes(app.headers)}) else: log.warning('Invalid session cookie %(s_id)r, not setting CSRF' ' token!' % {'s_id': to_bytes(session_id)}) def extract_csrf_token(self, request): '''Extract and remove the CSRF token from a given :class:`webob.Request` ''' csrf_token = None if self.csrf_token_id in request.GET: log.debug("%(token)s in GET" % {'token': to_bytes(self.csrf_token_id)}) csrf_token = request.GET[self.csrf_token_id] del(request.GET[self.csrf_token_id]) request.query_string = '&'.join(['%s=%s' % (k, v) for k, v in request.GET.items()]) if self.csrf_token_id in request.POST: log.debug("%(token)s in POST" % {'token': to_bytes(self.csrf_token_id)}) csrf_token = request.POST[self.csrf_token_id] del(request.POST[self.csrf_token_id]) return csrf_token python-fedora-0.10.0/fedora/release.py0000664000175000017500000000125413234574347022235 0ustar puiterwijkpuiterwijk00000000000000''' Information about this python-fedora release ''' NAME = 'python-fedora' VERSION = '0.10.0' DESCRIPTION = 'Python modules for interacting with Fedora Services' LONG_DESCRIPTION = ''' The Fedora Project runs many different services. These services help us to package software, develop new programs, and generally put together the distro. This package contains software that helps us do that. ''' AUTHOR = 'Toshio Kuratomi, Luke Macken, Ricky Elrod, Ralph Bean, Patrick Uiterwijk' EMAIL = 'admin@fedoraproject.org' COPYRIGHT = '2007-2018 Red Hat, Inc.' URL = 'https://fedorahosted.org/python-fedora' DOWNLOAD_URL = 'https://pypi.python.org/pypi/python-fedora' LICENSE = 'LGPLv2+' python-fedora-0.10.0/fedora/django/0000775000175000017500000000000013234574425021500 5ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/fedora/django/__init__.py0000664000175000017500000000246513137632523023614 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2009 Ignacio Vazquez-Abrams # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # ''' .. moduleauthor:: Ignacio Vazquez-Abrams .. moduleauthor:: Toshio Kuratomi ''' from fedora.client import FasProxyClient from django.conf import settings connection = None if not connection: connection = FasProxyClient( base_url=settings.FAS_URL, useragent=settings.FAS_USERAGENT ) def person_by_id(userid): sid, userinfo = connection.person_by_id( userid, {'username': settings.FAS_USERNAME, 'password': settings.FAS_PASSWORD} ) return userinfo python-fedora-0.10.0/fedora/django/auth/0000775000175000017500000000000013234574425022441 5ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/fedora/django/auth/middleware.py0000664000175000017500000001001713137632523025123 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2009 Ignacio Vazquez-Abrams # Copyright (C) 2012 Red Hat, Inc # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # ''' .. moduleauthor:: Ignacio Vazquez-Abrams .. moduleauthor:: Toshio Kuratomi .. note:: Toshio only added httponly cookie support .. versionchanged:: 0.3.26 Made session cookies httponly ''' from fedora.client import AuthError import django from django.contrib.auth import authenticate, login, logout from django.contrib.auth.models import AnonymousUser class FasMiddleware(object): def process_request(self, request): # Retrieve the sessionid that the user gave, associating them with the # account system session sid = request.COOKIES.get('tg-visit', None) # Check if the session is still valid authenticated = False if sid: user = authenticate(session_id=sid) if user: try: login(request, user) authenticated = True except AuthError: pass if not authenticated: # Hack around misthought out djiblits/django interaction; # If we're logging in in django and get to here without having # the second factor of authentication, we need to logout the # django kept session information. Since we can't know precisely # what private information django might be keeping we need to use # django API to remove everything. However, djiblits requires the # request.session.test_cookie_worked() function in order to log # someone in later. The django logout function has removed that # function from the session attribute so the djiblit login fails. # # Save the necessary pieces of the session architecture here cookie_status = request.session.test_cookie_worked() logout(request) # python doesn't have closures if cookie_status: request.session.test_cookie_worked = lambda: True else: request.session.test_cookie_worked = lambda: False request.session.delete_test_cookie = lambda: None def process_response(self, request, response): if response.status_code != 301: if isinstance(request.user, AnonymousUser): response.set_cookie(key='tg-visit', value='', max_age=0) if 'tg-visit' in request.session: del request.session['tg-visit'] else: try: if django.VERSION[:2] <= (1, 3): response.set_cookie( 'tg-visit', request.user.session_id, max_age=1814400, path='/', secure=True) else: response.set_cookie( 'tg-visit', request.user.session_id, max_age=1814400, path='/', secure=True, httponly=True) except AttributeError: # We expect that request.user.session_id won't be set # if the user is logging in with a non-FAS account # (ie: Django local auth). pass return response python-fedora-0.10.0/fedora/django/auth/models.py0000664000175000017500000001110413137632523024267 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2009 Ignacio Vazquez-Abrams # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # ''' .. moduleauthor:: Ignacio Vazquez-Abrams .. moduleauthor:: Toshio Kuratomi ''' from __future__ import print_function from fedora.client import AuthError from fedora.django import connection, person_by_id from fedora import _ import django.contrib.auth.models as authmodels from django.conf import settings import six # Map FAS user elements to model attributes _fasmap = { 'id': 'id', 'username': 'username', 'email': 'email', } def _new_group(group): try: g = authmodels.Group.objects.get(id=group['id']) except authmodels.Group.DoesNotExist: g = authmodels.Group(id=group['id']) g.name = group['name'] g.save() return g def _syncdb_handler(sender, **kwargs): # Import FAS groups verbosity = kwargs.get('verbosity', 1) if verbosity > 0: print(_('Loading FAS groups...')) try: gl = connection.group_list({'username': settings.FAS_USERNAME, 'password': settings.FAS_PASSWORD}) except AuthError: if verbosity > 0: print(_('Unable to load FAS groups. Did you set ' 'FAS_USERNAME and FAS_PASSWORD?')) else: groups = gl[1]['groups'] for group in groups: _new_group(group) if verbosity > 0: print(_('FAS groups loaded. Don\'t forget to set ' 'FAS_USERNAME and FAS_PASSWORD to a low-privilege ' 'account.')) class FasUserManager(authmodels.UserManager): def user_from_fas(self, user): """ Creates a user in the table based on the structure returned by FAS """ log = open('/var/tmp/django.log', 'a') log.write('in models user_from_fas\n') log.close() d = {} for k, v in six.iteritems(_fasmap): d[v] = user[k] u = FasUser(**d) u.set_unusable_password() u.is_active = user['status'] == 'active' admin = (user['username'] in getattr(settings, 'FAS_ADMINS', ())) u.is_staff = admin u.is_superuser = admin if getattr(settings, 'FAS_GENERICEMAIL', True): u.email = u._get_email() u.save() known_groups = [] for group in u.groups.values(): known_groups.append(group['id']) fas_groups = [] for group in user['approved_memberships']: fas_groups.append(group['id']) # This user has been added to one or more FAS groups for group in (g for g in user['approved_memberships'] if g['id'] not in known_groups): newgroup = _new_group(group) u.groups.add(newgroup) # This user has been removed from one or more FAS groups for gid in known_groups: found = False for g in user['approved_memberships']: if g['id'] == gid: found = True break if not found: u.groups.remove(authmodels.Group.objects.get(id=gid)) u.save() return u class FasUser(authmodels.User): def _get_name(self): log = open('/var/tmp/django.log', 'a') log.write('in models _get_name\n') log.close() userinfo = person_by_id(self.id) return userinfo['human_name'] def _get_email(self): log = open('/var/tmp/django.log', 'a') log.write('in models _get_email\n') log.close() return '%s@fedoraproject.org' % self.username name = property(_get_name) objects = FasUserManager() def get_full_name(self): log = open('/var/tmp/django.log', 'a') log.write('in models get_full_name\n') log.close() if self.name: return self.name.strip() return self.username.strip() python-fedora-0.10.0/fedora/django/auth/management/0000775000175000017500000000000013234574425024555 5ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/fedora/django/auth/management/__init__.py0000664000175000017500000000174413137632523026670 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2009 Ignacio Vazquez-Abrams # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # ''' .. moduleauthor:: Ignacio Vazquez-Abrams ''' from fedora.django.auth import models from django.db.models.signals import post_syncdb post_syncdb.connect(models._syncdb_handler, sender=models) python-fedora-0.10.0/fedora/django/auth/__init__.py0000664000175000017500000000000013137632523024534 0ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/fedora/django/auth/backends.py0000664000175000017500000000366713137632523024575 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2009 Ignacio Vazquez-Abrams # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # ''' .. moduleauthor:: Ignacio Vazquez-Abrams .. moduleauthor:: Toshio Kuratomi ''' from fedora.client import AuthError from fedora.django import connection, person_by_id from fedora.django.auth.models import FasUser from django.contrib.auth.models import AnonymousUser from django.contrib.auth.backends import ModelBackend class FasBackend(ModelBackend): def authenticate(self, username=None, password=None, session_id=None): try: if session_id: auth = {'session_id': session_id} else: auth = {'username': username, 'password': password} session_id, userinfo = connection.get_user_info(auth_params=auth) user = FasUser.objects.user_from_fas(userinfo) user.session_id = session_id if user.is_active: return user except AuthError: pass def get_user(self, userid): try: userinfo = person_by_id(userid) if userinfo: return FasUser.objects.user_from_fas(userinfo) except AuthError: return AnonymousUser() python-fedora-0.10.0/fedora/urlutils.py0000664000175000017500000000654513137632523022501 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2009 Red Hat, Inc. # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # ''' Functions to manipulate urls. .. versionadded:: 0.3.17 .. moduleauthor:: John (J5) Palmieri .. moduleauthor:: Toshio Kuratomi ''' from kitchen.iterutils import isiterable from six.moves.urllib.parse import parse_qs, urlencode, urlparse, urlunparse def update_qs(uri, new_params, overwrite=True): '''Helper function for updating query string values. Similar to calling update on a dictionary except we modify the query string of the uri instead of another dictionary. :arg uri: URI to modify :arg new_params: Dict of new query parameters to add. :kwarg overwrite: If True (default), any old query parameter with the same name as a new query parameter will be overwritten. If False, the new query parameters will be appended to a list with the old parameters at the start of the list. :returns: URI with the new parameters added. ''' loc = list(urlparse(uri)) query_dict = parse_qs(loc[4]) if overwrite: # Overwrite any existing values with the new values query_dict.update(new_params) else: # Add new values in addition to the existing parameters # For every new entry for key in new_params: # If the entry already is present if key in query_dict: if isiterable(new_params[key]): # If the new entry is a non-string iterable try: # Try to add the new values to the existing entry query_dict[key].extend(new_params[key]) except AttributeError: # Existing value wasn't a list, make it one query_dict[key] = [query_dict[key], new_params[key]] else: # The new entry is a scalar, so try to append it try: query_dict[key].append(new_params[key]) except AttributeError: # Existing value wasn't a list, make it one query_dict[key] = [query_dict[key], new_params[key]] else: # No previous entry, just set to the new entry query_dict[key] = new_params[key] # seems that we have to sanitize a bit here query_list = [] for key, value in query_dict.items(): if isiterable(value): for item in value: query_list.append((key, item)) continue query_list.append((key, value)) loc[4] = urlencode(query_list) return urlunparse(loc) __all__ = ['update_qs'] python-fedora-0.10.0/fedora/__init__.py0000664000175000017500000000271513137632523022350 0ustar puiterwijkpuiterwijk00000000000000# Copyright 2010 Red Hat, Inc. # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # ''' Python Fedora Modules to communicate with and help implement Fedora Services. ''' import kitchen # Setup gettext for all of kitchen. # Remember -- _() is for marking most messages # b_() is for marking messages that are used in exceptions (_, N_) = kitchen.i18n.easy_gettext_setup('python-fedora') (b_, bN_) = kitchen.i18n.easy_gettext_setup('python-fedora', use_unicode=False) from fedora import release __version__ = release.VERSION __all__ = ('__version__', 'accounts', 'client', 'release', 'tg') python-fedora-0.10.0/fedora/iterutils.py0000664000175000017500000000376113137632523022637 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2009 Red Hat, Inc. # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # ''' Functions to manipulate iterables .. versionadded:: 0.3.17 .. versionchanged:: 0.3.21 Deprecated in favor of the kitchen.iterutils module .. moduleauthor:: Toshio Kuratomi ''' import warnings from kitchen.iterutils import isiterable as _isiterable warnings.warn('fedora.iterutils is deprecated. Use kitchen.iterutils' ' instead', DeprecationWarning, stacklevel=2) def isiterable(obj, include_string=True): '''*Deprecated* Use kitchen.iterutils.isiterable instead. .. warning:: kitchen.iterutils.isiterable uses False as the default value for :attr:`include_string` instead of True. Check whether an object is an iterable. :arg obj: Object to test whether it is an iterable :include_string: If True (default), if `obj` is a str or unicode this function will return True. If set to False, strings and unicodes will cause this function to return False. :returns: True if `obj` is iterable, otherwise False. ''' warnings.warn('fedora.iterutils.isiterable is deprecated, use' ' kitchen.iterutils.isiterable instead', DeprecationWarning, stacklevel=2) return _isiterable(obj, include_string) __all__ = ['isiterable'] python-fedora-0.10.0/fedora/tg/0000775000175000017500000000000013234574425020650 5ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/fedora/tg/visit/0000775000175000017500000000000013234574425022006 5ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/fedora/tg/visit/__init__.py0000664000175000017500000000015013137632523024107 0ustar puiterwijkpuiterwijk00000000000000'''TurboGears visit manager to save visit in the Fedora Account System.''' __all__ = ('jsonfasvisit',) python-fedora-0.10.0/fedora/tg/visit/jsonfasvisit2.py0000664000175000017500000001325713137632523025170 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2007-2008 Red Hat, Inc. # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # # Adapted from code in the TurboGears project licensed under the MIT license. # ''' This plugin provides integration with the Fedora Account System using JSON calls to the account system server. .. moduleauthor:: Toshio Kuratomi ''' import threading from turbogears import config from turbogears.visit.api import Visit, BaseVisitManager from kitchen.text.converters import to_bytes from fedora.client import FasProxyClient from fedora import __version__ import logging log = logging.getLogger("turbogears.identity.jsonfasvisit") class JsonFasVisitManager(BaseVisitManager): ''' This proxies visit requests to the Account System Server running remotely. ''' fas_url = config.get('fas.url', 'https://admin.fedoraproject.org/accounts') fas = None debug = config.get('jsonfas.debug', False) error_session_id = 0 error_session_id_lock = threading.Lock() def __init__(self, timeout): self.log = log if not self.fas: JsonFasVisitManager.fas = FasProxyClient( self.fas_url, debug=self.debug, session_name=config.get('visit.cookie.name', 'tg-visit'), useragent='JsonFasVisitManager/%s' % __version__, retries=3 ) BaseVisitManager.__init__(self, timeout) self.log.debug('JsonFasVisitManager.__init__: exit') def create_model(self): ''' Create the Visit table if it doesn't already exist. Not needed as the visit tables reside remotely in the FAS2 database. ''' pass def new_visit_with_key(self, visit_key): ''' Return a new Visit object with the given key. ''' self.log.debug('JsonFasVisitManager.new_visit_with_key: enter') # Hit any URL in fas2 with the visit_key set. That will call the # new_visit method in fas2 # We only need to get the session cookie from this request try: request_data = self.fas.refresh_session(visit_key) except Exception: # HACK -- if we get an error from calling FAS, we still need to # return something to the application try: JsonFasVisitManager.error_session_id_lock.acquire() session_id = str(JsonFasVisitManager.error_session_id) JsonFasVisitManager.error_session_id += 1 finally: JsonFasVisitManager.error_session_id_lock.release() else: session_id = request_data[0] self.log.debug('JsonFasVisitManager.new_visit_with_key: exit') return Visit(session_id, True) def visit_for_key(self, visit_key): ''' Return the visit for this key or None if the visit doesn't exist or has expired. ''' self.log.debug('JsonFasVisitManager.visit_for_key: enter') # Hit any URL in fas2 with the visit_key set. That will call the # new_visit method in fas2 # We only need to get the session cookie from this request try: request_data = self.fas.refresh_session(visit_key) except Exception: # HACK -- if we get an error from calling FAS, we still need to # return something to the application try: JsonFasVisitManager.error_session_id_lock.acquire() session_id = str(JsonFasVisitManager.error_session_id) JsonFasVisitManager.error_session_id += 1 finally: JsonFasVisitManager.error_session_id_lock.release() else: session_id = request_data[0] # Knowing what happens in turbogears/visit/api.py when this is called, # we can shortcircuit this step and avoid a round trip to the FAS # server. # if visit_key != session_id: # # visit has expired # return None # # Hitting FAS has already updated the visit. # return Visit(visit_key, False) self.log.debug('JsonFasVisitManager.visit_for_key: exit') if visit_key != session_id: return Visit(session_id, True) else: return Visit(visit_key, False) def update_queued_visits(self, queue): '''Update the visit information on the server''' self.log.debug( 'JsonFasVisitManager.update_queued_visits: %s' % len(queue)) # Hit any URL in fas with each visit_key to update the sessions for visit_key in queue: self.log.info('updating visit (%s)', to_bytes(visit_key)) try: self.fas.refresh_session(visit_key) except Exception: # If fas returns an error, push the visit back onto the queue try: self.lock.acquire() self.queue[visit_key] = queue[visit_key] finally: self.lock.release() self.log.debug('JsonFasVisitManager.update_queued_visitsr exit') python-fedora-0.10.0/fedora/tg/visit/jsonfasvisit1.py0000664000175000017500000001022213137632523025154 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright © 2007-2008 Red Hat, Inc. All rights reserved. # # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # # Adapted from code in the TurboGears project licensed under the MIT license. ''' This plugin provides integration with the Fedora Account System using JSON calls to the account system server. .. moduleauthor:: Toshio Kuratomi ''' from turbogears import config from turbogears.visit.api import Visit, BaseVisitManager from fedora.client import FasProxyClient from fedora import _, __version__ import logging log = logging.getLogger("turbogears.identity.savisit") class JsonFasVisitManager(BaseVisitManager): ''' This proxies visit requests to the Account System Server running remotely. ''' fas_url = config.get('fas.url', 'https://admin.fedoraproject.org/accounts') fas = None def __init__(self, timeout): self.debug = config.get('jsonfas.debug', False) if not self.fas: self.fas = FasProxyClient( self.fas_url, debug=self.debug, session_name=config.get('visit.cookie.name', 'tg-visit'), useragent='JsonFasVisitManager/%s' % __version__) BaseVisitManager.__init__(self, timeout) log.debug('JsonFasVisitManager.__init__: exit') def create_model(self): ''' Create the Visit table if it doesn't already exist. Not needed as the visit tables reside remotely in the FAS2 database. ''' pass def new_visit_with_key(self, visit_key): ''' Return a new Visit object with the given key. ''' log.debug('JsonFasVisitManager.new_visit_with_key: enter') # Hit any URL in fas2 with the visit_key set. That will call the # new_visit method in fas2 # We only need to get the session cookie from this request request_data = self.fas.refresh_session(visit_key) session_id = request_data[0] log.debug('JsonFasVisitManager.new_visit_with_key: exit') return Visit(session_id, True) def visit_for_key(self, visit_key): ''' Return the visit for this key or None if the visit doesn't exist or has expired. ''' log.debug('JsonFasVisitManager.visit_for_key: enter') # Hit any URL in fas2 with the visit_key set. That will call the # new_visit method in fas2 # We only need to get the session cookie from this request request_data = self.fas.refresh_session(visit_key) session_id = request_data[0] # Knowing what happens in turbogears/visit/api.py when this is called, # we can shortcircuit this step and avoid a round trip to the FAS # server. # if visit_key != session_id: # # visit has expired # return None # # Hitting FAS has already updated the visit. # return Visit(visit_key, False) log.debug('JsonFasVisitManager.visit_for_key: exit') if visit_key != session_id: return Visit(session_id, True) else: return Visit(visit_key, False) def update_queued_visits(self, queue): '''Update the visit information on the server''' log.debug('JsonFasVisitManager.update_queued_visits: enter') # Hit any URL in fas with each visit_key to update the sessions for visit_key in queue: log.info(_('updating visit (%s)'), visit_key) self.fas.refresh_session(visit_key) log.debug('JsonFasVisitManager.update_queued_visits: exit') python-fedora-0.10.0/fedora/tg/client.py0000664000175000017500000000051513137632523022475 0ustar puiterwijkpuiterwijk00000000000000'''This is for compatibility. The canonical location for this module from 0.3 on is fedora.client ''' import warnings warnings.warn('fedora.tg.client has moved to fedora.client. This location' ' will disappear in 0.4', DeprecationWarning, stacklevel=2) # pylint: disable-msg=W0401,W0614 from fedora.client import * python-fedora-0.10.0/fedora/tg/tg1utils.py0000664000175000017500000000315713137632523023000 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2011 Red Hat, Inc. # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # ''' Miscellaneous functions of use on a TurboGears Server. This interface is *deprecated* .. versionchanged:: 0.3.25 Deprecated .. moduleauthor:: Toshio Kuratomi ''' # Pylint Messages # :W0401: This file is for backwards compatibility. It has been renamed to # tg/utils. We use a wildcard import just to import the names for # functions into this namespace. # :W0614: Ditto. from fedora.tg.utils import * # pylint:disable-msg=W0614,W0401 import warnings warnings.warn('fedora.tg.tg1utils is deprecated. Switch to' ' fedora.tg.utils instead. This file will disappear in 0.4', DeprecationWarning, stacklevel=2) __all__ = ('add_custom_stdvars', 'absolute_url', 'enable_csrf', 'fedora_template', 'jsonify_validation_errors', 'json_or_redirect', 'request_format', 'tg_absolute_url', 'tg_url', 'url') python-fedora-0.10.0/fedora/tg/utils.py0000664000175000017500000004044013234573627022367 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2008-2012 Red Hat, Inc. # Copyright (C) 2008 Ricky Zhou # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # ''' Miscellaneous functions of use on a TurboGears Server .. versionchanged:: 0.3.14 Save the original turbogears.url function as :func:`fedora.tg.util.tg_url` .. versionchanged:: 0.3.17 Renamed from fedora.tg.util .. versionchanged:: 0.3.25 Renamed from fedora.tg.tg1utils .. moduleauthor:: Toshio Kuratomi .. moduleauthor:: Ricky Zhou ''' from itertools import chain import cgi import os import cherrypy from cherrypy import request from decorator import decorator import pkg_resources import turbogears from turbogears import flash, redirect, config, identity import turbogears.util as tg_util from turbogears.controllers import check_app_root from turbogears.identity.exceptions import RequestRequiredException import six from six.moves.urllib.parse import urlencode, urlparse, urlunparse # Save this for people who need the original url() function tg_url = turbogears.url def add_custom_stdvars(new_vars): return new_vars.update({'fedora_template': fedora_template}) def url(tgpath, tgparams=None, **kwargs): '''Computes URLs. This is a replacement for :func:`turbogears.controllers.url` (aka :func:`tg.url` in the template). In addition to the functionality that :func:`tg.url` provides, it adds a token to prevent :term:`CSRF` attacks. :arg tgpath: a list or a string. If the path is absolute (starts with a "/"), the :attr:`server.webpath`, :envvar:`SCRIPT_NAME` and the approot of the application are prepended to the path. In order for the approot to be detected properly, the root object should extend :class:`turbogears.controllers.RootController`. :kwarg tgparams: See param: ``kwargs`` :kwarg kwargs: Query parameters for the URL can be passed in as a dictionary in the second argument *or* as keyword parameters. Values which are a list or a tuple are used to create multiple key-value pairs. :returns: The changed path .. versionadded:: 0.3.10 Modified from turbogears.controllers.url for :ref:`CSRF-Protection` ''' if not isinstance(tgpath, six.string_types): tgpath = '/'.join(list(tgpath)) if not tgpath.startswith('/') or tgpath.startswith('//'): # Do not allow the url() function to be used for external urls. # This function is primarily used in redirect() calls, so this prevents # covert redirects and thus CSRF leaking. tgpath = '/' if tgpath.startswith('/'): webpath = (config.get('server.webpath') or '').rstrip('/') if tg_util.request_available(): check_app_root() tgpath = request.app_root + tgpath try: webpath += request.wsgi_environ['SCRIPT_NAME'].rstrip('/') except (AttributeError, KeyError): # pylint: disable-msg=W0704 # :W0704: Lack of wsgi environ is fine... we still have # server.webpath pass tgpath = webpath + tgpath if tgparams is None: tgparams = kwargs else: try: tgparams = tgparams.copy() tgparams.update(kwargs) except AttributeError: raise TypeError( 'url() expects a dictionary for query parameters') args = [] # Add the _csrf_token try: if identity.current.csrf_token: tgparams.update({'_csrf_token': identity.current.csrf_token}) except RequestRequiredException: # pylint: disable-msg=W0704 # :W0704: If we are outside of a request (called from non-controller # methods/ templates) just don't set the _csrf_token. pass # Check for query params in the current url query_params = six.iteritems(tgparams) scheme, netloc, path, params, query_s, fragment = urlparse(tgpath) if query_s: query_params = chain((p for p in cgi.parse_qsl(query_s) if p[0] != '_csrf_token'), query_params) for key, value in query_params: if value is None: continue if isinstance(value, (list, tuple)): pairs = [(key, v) for v in value] else: pairs = [(key, value)] for key, value in pairs: if value is None: continue if isinstance(value, unicode): value = value.encode('utf8') args.append((key, str(value))) query_string = urlencode(args, True) tgpath = urlunparse((scheme, netloc, path, params, query_string, fragment)) return tgpath # this is taken from turbogears 1.1 branch def _get_server_name(): """Return name of the server this application runs on. Respects 'Host' and 'X-Forwarded-Host' header. See the docstring of the 'absolute_url' function for more information. .. note:: This comes from turbogears 1.1 branch. It is only needed for _tg_absolute_url(). If we find that turbogears.get_server_name() exists, we replace this function with that one. """ get = config.get h = request.headers host = get('tg.url_domain') or h.get('X-Forwarded-Host', h.get('Host')) if not host: host = '%s:%s' % (get('server.socket_host', 'localhost'), get('server.socket_port', 8080)) return host # this is taken from turbogears 1.1 branch def tg_absolute_url(tgpath='/', params=None, **kw): """Return absolute URL (including schema and host to this server). Tries to account for 'Host' header and reverse proxying ('X-Forwarded-Host'). The host name is determined this way: * If the config setting 'tg.url_domain' is set and non-null, use this value. * Else, if the 'base_url_filter.use_x_forwarded_host' config setting is True, use the value from the 'Host' or 'X-Forwarded-Host' request header. * Else, if config setting 'base_url_filter.on' is True and 'base_url_filter.base_url' is non-null, use its value for the host AND scheme part of the URL. * As a last fallback, use the value of 'server.socket_host' and 'server.socket_port' config settings (defaults to 'localhost:8080'). The URL scheme ('http' or 'http') used is determined in the following way: * If 'base_url_filter.base_url' is used, use the scheme from this URL. * If there is a 'X-Use-SSL' request header, use 'https'. * Else, if the config setting 'tg.url_scheme' is set, use its value. * Else, use the value of 'cherrypy.request.scheme'. .. note:: This comes from turbogears 1.1 branch with one change: we call tg_url() rather than turbogears.url() so that it never adds the csrf_token .. versionadded:: 0.3.19 Modified from turbogears.absolute_url() for :ref:`CSRF-Protection` """ get = config.get use_xfh = get('base_url_filter.use_x_forwarded_host', False) if request.headers.get('X-Use-SSL'): scheme = 'https' else: scheme = get('tg.url_scheme') if not scheme: scheme = request.scheme base_url = '%s://%s' % (scheme, _get_server_name()) if get('base_url_filter.on', False) and not use_xfh: base_url = get('base_url_filter.base_url').rstrip('/') return '%s%s' % (base_url, tg_url(tgpath, params, **kw)) def absolute_url(tgpath='/', params=None, **kw): """Return absolute URL (including schema and host to this server). Tries to account for 'Host' header and reverse proxying ('X-Forwarded-Host'). The host name is determined this way: * If the config setting 'tg.url_domain' is set and non-null, use this value. * Else, if the 'base_url_filter.use_x_forwarded_host' config setting is True, use the value from the 'Host' or 'X-Forwarded-Host' request header. * Else, if config setting 'base_url_filter.on' is True and 'base_url_filter.base_url' is non-null, use its value for the host AND scheme part of the URL. * As a last fallback, use the value of 'server.socket_host' and 'server.socket_port' config settings (defaults to 'localhost:8080'). The URL scheme ('http' or 'http') used is determined in the following way: * If 'base_url_filter.base_url' is used, use the scheme from this URL. * If there is a 'X-Use-SSL' request header, use 'https'. * Else, if the config setting 'tg.url_scheme' is set, use its value. * Else, use the value of 'cherrypy.request.scheme'. .. versionadded:: 0.3.19 Modified from turbogears.absolute_url() for :ref:`CSRF-Protection` """ return url(tg_absolute_url(tgpath, params, **kw)) def enable_csrf(): '''A startup function to setup :ref:`CSRF-Protection`. This should be run at application startup. Code like the following in the start-APP script or the method in :file:`commands.py` that starts it:: from turbogears import startup from fedora.tg.util import enable_csrf startup.call_on_startup.append(enable_csrf) If we can get the :ref:`CSRF-Protection` into upstream :term:`TurboGears`, we might be able to remove this in the future. .. versionadded:: 0.3.10 Added to enable :ref:`CSRF-Protection` ''' # Override the turbogears.url function with our own # Note, this also changes turbogears.absolute_url since that calls # turbogears.url turbogears.url = url turbogears.controllers.url = url # Ignore the _csrf_token parameter ignore = config.get('tg.ignore_parameters', []) if '_csrf_token' not in ignore: ignore.append('_csrf_token') config.update({'tg.ignore_parameters': ignore}) # Add a function to the template tg stdvars that looks up a template. turbogears.view.variable_providers.append(add_custom_stdvars) def request_format(): '''Return the output format that was requested by the user. The user is able to specify a specific output format using either the ``Accept:`` HTTP header or the ``tg_format`` query parameter. This function checks both of those to determine what format the reply should be in. :rtype: string :returns: The requested format. If none was specified, 'default' is returned .. versionchanged:: 0.3.17 Return symbolic names for json, html, xhtml, and xml instead of letting raw mime types through ''' output_format = cherrypy.request.params.get('tg_format', '').lower() if not output_format: ### TODO: Two problems with this: # 1) TG lets this be extended via as_format and accept_format. We need # tie into that as well somehow. # 2) Decide whether to standardize on "json" or "application/json" accept = tg_util.simplify_http_accept_header( request.headers.get('Accept', 'default').lower()) if accept in ('text/javascript', 'application/json'): output_format = 'json' elif accept == 'text/html': output_format = 'html' elif accept == 'text/plain': output_format = 'plain' elif accept == 'text/xhtml': output_format = 'xhtml' elif accept == 'text/xml': output_format = 'xml' else: output_format = accept return output_format def jsonify_validation_errors(): '''Return an error for :term:`JSON` if validation failed. This function checks for two things: 1) We're expected to return :term:`JSON` data. 2) There were errors in the validation process. If both of those are true, this function constructs a response that will return the validation error messages as :term:`JSON` data. All controller methods that are error_handlers need to use this:: @expose(template='templates.numberform') def enter_number(self, number): errors = fedora.tg.util.jsonify_validation_errors() if errors: return errors [...] @expose(allow_json=True) @error_handler(enter_number) @validate(form=number_form) def save(self, number): return dict(success=True) :rtype: None or dict :Returns: None if there are no validation errors or :term:`JSON` isn't requested, otherwise a dictionary with the error that's suitable for return from the controller. The error message is set in tg_flash whether :term:`JSON` was requested or not. ''' # Check for validation errors errors = getattr(cherrypy.request, 'validation_errors', None) if not errors: return None # Set the message for both html and json output message = u'\n'.join([u'%s: %s' % (param, msg) for param, msg in errors.items()]) format = request_format() if format in ('html', 'xhtml'): message.translate({ord('\n'): u'
\n'}) flash(message) # If json, return additional information to make this an exception if format == 'json': # Note: explicit setting of tg_template is needed in TG < 1.0.4.4 # A fix has been applied for TG-1.0.4.5 return dict(exc='Invalid', tg_template='json') return None def json_or_redirect(forward_url): '''If :term:`JSON` is requested, return a dict, otherwise redirect. This is a decorator to use with a method that returns :term:`JSON` by default. If :term:`JSON` is requested, then it will return the dict from the method. If :term:`JSON` is not requested, it will redirect to the given URL. The method that is decorated should be constructed so that it calls turbogears.flash() with a message that will be displayed on the forward_url page. Use it like this:: import turbogears @json_or_redirect('http://localhost/calc/') @expose(allow_json=True) def divide(self, dividend, divisor): try: answer = dividend * 1.0 / divisor except ZeroDivisionError: turbogears.flash('Division by zero not allowed') return dict(exc='ZeroDivisionError') turbogears.flash('The quotient is %s' % answer) return dict(quotient=answer) In the example, we return either an exception or an answer, using :func:`turbogears.flash` to tell people of the result in either case. If :term:`JSON` data is requested, the user will get back a :term:`JSON` string with the proper information. If html is requested, we will be redirected to 'http://localhost/calc/' where the flashed message will be displayed. :arg forward_url: If :term:`JSON` was not requested, redirect to this URL after. .. versionadded:: 0.3.7 To make writing methods that use validation easier ''' def call(func, *args, **kwargs): if request_format() == 'json': return func(*args, **kwargs) else: func(*args, **kwargs) raise redirect(forward_url) return decorator(call) if hasattr(turbogears, 'get_server_name'): _get_server_name = turbogears.get_server_name def fedora_template(template, template_type='genshi'): '''Function to return the path to a template. :arg template: filename of the template itself. Ex: login.html :kwarg template_type: template language we need the template written in Defaults to 'genshi' :returns: filesystem path to the template ''' # :E1101: pkg_resources does have resource_filename # pylint: disable-msg=E1101 return pkg_resources.resource_filename( 'fedora', os.path.join('tg', 'templates', template_type, template)) __all__ = ( 'add_custom_stdvars', 'absolute_url', 'enable_csrf', 'fedora_template', 'jsonify_validation_errors', 'json_or_redirect', 'request_format', 'tg_absolute_url', 'tg_url', 'url') python-fedora-0.10.0/fedora/tg/__init__.py0000664000175000017500000000025013137632523022752 0ustar puiterwijkpuiterwijk00000000000000''' Functions and classes to help build a Fedora Service. ''' __all__ = ('client', 'json', 'tg1utils', 'tg2utils', 'widgets', 'identity', 'utils', 'visit') python-fedora-0.10.0/fedora/tg/json.py0000664000175000017500000001644113137632523022175 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2007-2008 Red Hat, Inc. # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # ''' JSON Helper functions. Most JSON code directly related to classes is implemented via the __json__() methods in model.py. These methods define methods of transforming a class into json for a few common types. A JSON-based API(view) for your app. Most rules would look like:: @jsonify.when("isinstance(obj, YourClass)") def jsonify_yourclass(obj): return [obj.val1, obj.val2] @jsonify can convert your objects to following types: lists, dicts, numbers and strings .. moduleauthor:: Toshio Kuratomi ''' # Pylint ignored messages # :E1101: turbogears.jsonify monkey patches some functionality in. These do # not show up when we pylint so it thinks the members di not exist. import sqlalchemy import sqlalchemy.orm import sqlalchemy.ext.associationproxy import sqlalchemy.engine.base from turbojson.jsonify import jsonify class SABase(object): '''Base class for SQLAlchemy mapped objects. This base class makes sure we have a __json__() method on each SQLAlchemy mapped object that knows how to: 1) Return json for the object. 2) Selectively add tables pulled in from the table to the data we're returning. ''' # :R0903: The SABase object just adds a __json__ method to all SA mapped # classes so they can be serialized as json. It's used as a base class # and that's it. # pylint: disable-msg=R0903 def __json__(self): '''Transform any SA mapped class into json. This method takes an SA mapped class and turns the "normal" python attributes into json. The properties (from properties in the mapper) are also included if they have an entry in json_props. You make use of this by setting json_props in the controller. Example controller:: john = model.Person.get_by(name='John') # Person has a property, addresses, linking it to an Address class. # Address has a property, phone_nums, linking it to a Phone class. john.json_props = {'Person': ['addresses'], 'Address': ['phone_nums']} return dict(person=john) json_props is a dict that maps class names to lists of properties you want to output. This allows you to selectively pick properties you are interested in for one class but not another. You are responsible for avoiding loops. ie: *don't* do this:: john.json_props = {'Person': ['addresses'], 'Address': ['people']} ''' props = {} prop_list = {} if hasattr(self, 'json_props'): for base_class in self.__class__.__mro__: # pylint: disable-msg=E1101 if base_class.__name__ in self.json_props: prop_list = self.json_props[base_class.__name__] break # pylint: enable-msg=E1101 # Load all the columns from the table for column in sqlalchemy.orm.object_mapper(self).iterate_properties: if isinstance(column, sqlalchemy.orm.properties.ColumnProperty): props[column.key] = getattr(self, column.key) # Load things that are explicitly listed for field in prop_list: props[field] = getattr(self, field) try: # pylint: disable-msg=E1101 props[field].json_props = self.json_props except AttributeError: # pylint: disable-msg=W0704 # :W0704: Certain types of objects are terminal and won't # allow setting json_props pass # Note: Because of the architecture of simplejson and turbojson, # anything that inherits from a builtin list, tuple, basestring, # or dict but needs special handling needs to be specified # expicitly here. Using the @jsonify.when() decorator won't work. if isinstance(props[field], sqlalchemy.orm.collections.InstrumentedList): props[field] = jsonify_salist(props[field]) return props @jsonify.when('isinstance(obj, sqlalchemy.orm.query.Query)') def jsonify_sa_select_results(obj): '''Transform selectresults into lists. The one special thing is that we bind the special json_props into each descendent. This allows us to specify a json_props on the toplevel query result and it will pass to all of its children. :arg obj: sqlalchemy Query object to jsonify :Returns: list representation of the Query with each element in it given a json_props attributes ''' if 'json_props' in obj.__dict__: for element in obj: element.json_props = obj.json_props return list(obj) # Note: due to the way simplejson works, InstrumentedList has to be taken care # of explicitly in SABase's __json__() method. (This is true of any object # derived from a builtin type (list, dict, tuple, etc)) @jsonify.when('''( isinstance(obj, sqlalchemy.orm.collections.InstrumentedList) or isinstance(obj, sqlalchemy.orm.attributes.InstrumentedAttribute) or isinstance(obj, sqlalchemy.ext.associationproxy._AssociationList))''') def jsonify_salist(obj): '''Transform SQLAlchemy InstrumentedLists into json. The one special thing is that we bind the special json_props into each descendent. This allows us to specify a json_props on the toplevel query result and it will pass to all of its children. :arg obj: One of the sqlalchemy list types to jsonify :Returns: list of jsonified elements ''' if 'json_props' in obj.__dict__: for element in obj: element.json_props = obj.json_props return [jsonify(element) for element in obj] @jsonify.when('''( isinstance(obj, sqlalchemy.engine.ResultProxy) )''') def jsonify_saresult(obj): '''Transform SQLAlchemy ResultProxy into json. The one special thing is that we bind the special json_props into each descendent. This allows us to specify a json_props on the toplevel query result and it will pass to all of its children. :arg obj: sqlalchemy ResultProxy to jsonify :Returns: list of jsonified elements ''' if 'json_props' in obj.__dict__: for element in obj: element.json_props = obj.json_props return [list(row) for row in obj] @jsonify.when('''(isinstance(obj, set))''') def jsonify_set(obj): '''Transform a set into a list. simplejson doesn't handle sets natively so transform a set into a list. :arg obj: set to jsonify :Returns: list representation of the set ''' return list(obj) python-fedora-0.10.0/fedora/tg/util.py0000664000175000017500000000335513137632523022201 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2008-2009 Red Hat, Inc. # Copyright (C) 2008 Ricky Zhou # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # ''' Miscellaneous functions of use on a TurboGears Server. This interface is *deprecated* .. versionchanged:: 0.3.17 Deprecated .. moduleauthor:: Toshio Kuratomi .. moduleauthor:: Ricky Zhou ''' # Pylint Messages # :W0401: This file is for backwards compatibility. It has been renamed to # tg1utils. We use a wildcard import just to import the names for functions # into this namespace. # :W0614: Ditto. from fedora.tg.tg1utils import * # pylint:disable-msg=W0614,W0401 import warnings warnings.warn('fedora.tg.util is deprecated. Switch to one of these ' 'instead: TG1 apps: fedora.tg.utils TG2 apps: fedora.tg2.utils.' ' This file will disappear in 0.4', DeprecationWarning, stacklevel=2) __all__ = ('add_custom_stdvars', 'enable_csrf', 'fedora_template', 'jsonify_validation_errors', 'json_or_redirect', 'request_format', 'tg_url', 'url') python-fedora-0.10.0/fedora/tg/identity/0000775000175000017500000000000013234574425022501 5ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/fedora/tg/identity/jsonfasprovider2.py0000664000175000017500000004571013137632523026356 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2007-2011 Red Hat, Inc. # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # # Adapted from code in the TurboGears project licensed under the MIT license. # ''' This plugin provides authentication by integrating with the Fedora Account System using JSON calls. .. moduleauthor:: Toshio Kuratomi .. moduleauthor:: Ricky Zhou ''' import crypt from hashlib import sha1 import six from turbogears import config, identity from turbogears.identity import set_login_attempted import cherrypy from kitchen.pycompat24 import sets from kitchen.text.converters import to_bytes sets.add_builtin_set() from fedora.client import ( AccountSystem, AuthError, BaseClient, FedoraServiceError ) from fedora import __version__ import logging log = logging.getLogger('turbogears.identity.jsonfasprovider') if config.get('identity.ssl', False): fas_user = config.get('fas.username', None) fas_password = config.get('fas.password', None) if not (fas_user and fas_password): raise identity.IdentityConfigurationException( 'Cannot enable ssl certificate auth via identity.ssl' ' without setting fas.usernamme and fas.password for' ' authorization') __url = config.get('fas.url', None) if __url: fas = AccountSystem(__url, username=config.get('fas.username'), password=config.get('fas.password'), retries=3) class JsonFasIdentity(BaseClient): '''Associate an identity with a person in the auth system. ''' cookie_name = config.get('visit.cookie.name', 'tg-visit') fas_url = config.get( 'fas.url', 'https://admin.fedoraproject.org/accounts/' ) useragent = 'JsonFasIdentity/%s' % __version__ cache_session = False def __init__(self, visit_key=None, user=None, username=None, password=None, using_ssl=False): # The reason we have both _retrieved_user and _user is this: # _user is set if both the user is authenticated and a csrf_token is # present. # _retrieved_user actually caches the user info from the server. # Sometimes we have to determine if a user is only lacking a token, # then retrieved_user comes in handy. self._retrieved_user = None self.log = log self.visit_key = visit_key session_id = visit_key self._group_ids = frozenset() self.using_ssl = using_ssl if user: self._user = user self._user_retrieved = user self._groups = frozenset( [g['name'] for g in user['approved_memberships']] ) debug = config.get('jsonfas.debug', False) super(JsonFasIdentity, self).__init__( self.fas_url, useragent=self.useragent, debug=debug, username=username, password=password, session_id=session_id, cache_session=self.cache_session, retries=3 ) if self.debug: import inspect caller = inspect.getouterframes(inspect.currentframe())[1][3] self.log.debug('JsonFasIdentity.__init__ caller: %s' % caller) cherrypy.response.simple_cookie[self.cookie_name] = visit_key self.login(using_ssl) self.log.debug('Leaving JsonFasIdentity.__init__') def send_request(self, method, req_params=None, auth=False): '''Make an HTTP Request to a server method. We need to override the send_request provided by ``BaseClient`` to keep the visit_key in sync. ''' self.log.debug('entering jsonfas send_request') if self.session_id != self.visit_key: # When the visit_key changes (because the old key had expired or # been deleted from the db) change the visit_key in our variables # and the session cookie to be sent back to the client. self.visit_key = self.session_id cherrypy.response.simple_cookie[self.cookie_name] = self.visit_key self.log.debug('leaving jsonfas send_request') return super(JsonFasIdentity, self).send_request( method, req_params=req_params, auth=auth, retries=3 ) def __retrieve_user(self): '''Attempt to load the user from the visit_key. :returns: a user or None ''' if self.debug: import inspect caller = inspect.getouterframes(inspect.currentframe())[2][3] self.log.debug('JSONFASPROVIDER.send_request caller: %s' % caller) # The cached value can be in four states: # Holds a user: we successfully retrieved it last time, return it # Holds None: we haven't yet tried to retrieve a user, do so now # Holds a session_id that is the same as our session_id, we # unsuccessfully tried to retrieve a session with this id already, # return None Holds a session_id that is different than the current # session_id: we tried with a previous session_id; try again with the # new one. if self._retrieved_user: if isinstance(self._retrieved_user, six.string_types): if self._retrieved_user == self.session_id: return None else: self._retrieved_user = None else: return self._retrieved_user # I hope this is a safe place to double-check the SSL variables. # TODO: Double check my logic with this - is it unnecessary to # check that the username matches up? if self.using_ssl: if cherrypy.request.headers['X-Client-Verify'] != 'SUCCESS': self.logout() return None # Retrieve the user information differently when using ssl try: person = fas.person_by_username(self.username, auth=True) except Exception as e: # pylint: disable-msg=W0703 # :W0703: Any errors have to result in no user being set. The # rest of the framework doesn't know what to do otherwise. self.log.warning('jsonfasprovider, ssl, returned errors' ' from send_request: %s' % to_bytes(e)) person = None self._retrieved_user = person or None return self._retrieved_user # pylint: disable-msg=W0702 try: data = self.send_request('user/view', auth=True) except AuthError as e: # Failed to login with present credentials self._retrieved_user = self.session_id return None except Exception as e: # pylint: disable-msg=W0703 # :W0703: Any errors have to result in no user being set. The rest # of the framework doesn't know what to do otherwise. self.log.warning('jsonfasprovider returned errors from' ' send_request: %s' % to_bytes(e)) return None # pylint: enable-msg=W0702 self._retrieved_user = data['person'] or None return self._retrieved_user def _get_user(self): '''Get user instance for this identity.''' visit = self.visit_key if not visit: # No visit, no user self._user = None else: if not (self.username and self.password): # Unless we were given the user_name and password to login on # this request, a CSRF token is required if (not '_csrf_token' in cherrypy.request.params or cherrypy.request.params['_csrf_token'] != sha1(self.visit_key).hexdigest()): self.log.info("Bad _csrf_token") if '_csrf_token' in cherrypy.request.params: self.log.info("visit: %s token: %s" % ( self.visit_key, cherrypy.request.params['_csrf_token'])) else: self.log.info('No _csrf_token present') cherrypy.request.fas_identity_failure_reason = 'bad_csrf' self._user = None # pylint: disable-msg=W0704 try: return self._user except AttributeError: # User hasn't already been set # Attempt to load the user. After this code executes, there # *will* be a _user attribute, even if the value is None. self._user = self.__retrieve_user() if self._user: self._groups = frozenset( [g['name'] for g in self._user.approved_memberships] ) else: self._groups = frozenset() # pylint: enable-msg=W0704 return self._user user = property(_get_user) def _get_token(self): '''Get the csrf token for this identity''' if self.visit_key: return sha1(self.visit_key).hexdigest() else: return '' csrf_token = property(_get_token) def _get_user_name(self): '''Get user name of this identity.''' if self.debug: import inspect caller = inspect.getouterframes(inspect.currentframe())[1][3] self.log.debug( 'JsonFasProvider._get_user_name caller: %s' % caller) if not self.user: return None return self.user.username user_name = property(_get_user_name) ### TG: Same as TG-1.0.8 def _get_user_id(self): ''' Get user id of this identity. ''' if not self.user: return None return self.user.id user_id = property(_get_user_id) ### TG: Same as TG-1.0.8 def _get_anonymous(self): ''' Return True if not logged in. ''' return not self.user anonymous = property(_get_anonymous) def _get_only_token(self): ''' In one specific instance in the login template we need to know whether an anonymous user is just lacking a token. ''' if self.__retrieve_user(): # user is valid, just the token is missing return True # Else the user still has to login return False only_token = property(_get_only_token) def _get_permissions(self): '''Get set of permission names of this identity.''' # pylint: disable-msg=R0201 # :R0201: method is part of the TG Identity API ### TG difference: No permissions in FAS return frozenset() permissions = property(_get_permissions) def _get_display_name(self): '''Return the user's display name. .. warning:: This is not a TG standard attribute. Don't use this if you want to be compatible with other identity providers. ''' if not self.user: return None return self.user['human_name'] display_name = property(_get_display_name) def _get_groups(self): '''Return the groups that a user is a member of.''' try: return self._groups except AttributeError: # pylint: disable-msg=W0704 # :W0704: Groups haven't been computed yet pass if not self.user: # User and groups haven't been returned. Since the json call # computes both user and groups, this will now be set. self._groups = frozenset() return self._groups groups = property(_get_groups) def _get_group_ids(self): '''Get set of group IDs of this identity.''' try: return self._group_ids except AttributeError: # pylint: disable-msg=W0704 # :W0704: Groups haven't been computed yet pass if not self.groups: self._group_ids = frozenset() else: self._group_ids = frozenset([g.id for g in self._user.approved_memberships]) return self._group_ids group_ids = property(_get_group_ids) ### TG: Same as TG-1.0.8 def _get_login_url(self): '''Get the URL for the login page.''' return identity.get_failure_url() login_url = property(_get_login_url) def login(self, using_ssl=False): '''Send a request so that we associate the visit_cookie with the user :kwarg using_ssl: Boolean that tells whether ssl was used to authenticate ''' if not using_ssl: # This is only of value if we have username and password # which we don't if using ssl certificates self.send_request('', auth=True) self.using_ssl = using_ssl def logout(self): ''' Remove the link between this identity and the visit. ''' if not self.visit_key: return # Call Account System Server logout method self.send_request('logout', auth=True) class JsonFasIdentityProvider(object): ''' IdentityProvider that authenticates users against the fedora account system ''' def __init__(self): # Default encryption algorithm is to use plain text passwords algorithm = config.get( 'identity.saprovider.encryption_algorithm', None) self.log = log # pylint: disable-msg=W0212 # TG does this so we shouldn't get rid of it. self.encrypt_password = lambda pw: identity._encrypt_password( algorithm, pw) def create_provider_model(self): ''' Create the database tables if they don't already exist. ''' # No database tables to create because the db is behind the FAS2 # server pass def validate_identity(self, user_name, password, visit_key): ''' Look up the identity represented by user_name and determine whether the password is correct. Must return either None if the credentials weren't valid or an object with the following properties: :user_name: original user name :user: a provider dependant object (TG_User or similar) :groups: a set of group IDs :permissions: a set of permission IDs :arg user_name: user_name we're authenticating. If None, we'll try to lookup a username from SSL variables :arg password: password to authenticate user_name with :arg visit_key: visit_key from the user's session ''' using_ssl = False if not user_name and config.get('identity.ssl'): if cherrypy.request.headers['X-Client-Verify'] == 'SUCCESS': user_name = cherrypy.request.headers['X-Client-CN'] cherrypy.request.fas_provided_username = user_name using_ssl = True # pylint: disable-msg=R0201 # TG identity providers have this method so we can't get rid of it. try: user = JsonFasIdentity(visit_key, username=user_name, password=password, using_ssl=using_ssl) except FedoraServiceError as e: self.log.warning('Error logging in %(user)s: %(error)s' % { 'user': to_bytes(user_name), 'error': to_bytes(e)}) return None return user def validate_password(self, user, user_name, password): ''' Check the supplied user_name and password against existing credentials. Note: user_name is not used here, but is required by external password validation schemes that might override this method. If you use SqlAlchemyIdentityProvider, but want to check the passwords against an external source (i.e. PAM, LDAP, Windows domain, etc), subclass SqlAlchemyIdentityProvider, and override this method. :arg user: User information. :arg user_name: Given username. Not used. :arg password: Given, plaintext password. :returns: True if the password matches the username. Otherwise False. Can return False for problems within the Account System as well. ''' # pylint: disable-msg=R0201,W0613 # :R0201: TG identity providers must instantiate this method. # crypt.crypt(stuff, '') == '' # Just kill any possibility of blanks. if not user.password: return False if not password: return False # pylint: disable-msg=W0613 # :W0613: TG identity providers have this method return to_bytes(user.password) == crypt.crypt( to_bytes(password), to_bytes(user.password) ) def load_identity(self, visit_key): '''Lookup the principal represented by visit_key. :arg visit_key: The session key for whom we're looking up an identity. :return: an object with the following properties: :user_name: original user name :user: a provider dependant object (TG_User or similar) :groups: a set of group IDs :permissions: a set of permission IDs ''' # pylint: disable-msg=R0201 # :R0201: TG identity providers must instantiate this method. ident = JsonFasIdentity(visit_key) if 'csrf_login' in cherrypy.request.params: cherrypy.request.params.pop('csrf_login') set_login_attempted(True) return ident def anonymous_identity(self): '''Returns an anonymous user object :return: an object with the following properties: :user_name: original user name :user: a provider dependant object (TG_User or similar) :groups: a set of group IDs :permissions: a set of permission IDs ''' # pylint: disable-msg=R0201 # :R0201: TG identity providers must instantiate this method. return JsonFasIdentity(None) def authenticated_identity(self, user): ''' Constructs Identity object for user that has no associated visit_key. :arg user: The user structure the identity is constructed from :return: an object with the following properties: :user_name: original user name :user: a provider dependant object (TG_User or similar) :groups: a set of group IDs :permissions: a set of permission IDs ''' # pylint: disable-msg=R0201 # :R0201: TG identity providers must instantiate this method. return JsonFasIdentity(None, user) python-fedora-0.10.0/fedora/tg/identity/__init__.py0000664000175000017500000000013113137632523024601 0ustar puiterwijkpuiterwijk00000000000000'''TurboGears identity modules that work with Fedora.''' __all__ = ('jsonfasprovider',) python-fedora-0.10.0/fedora/tg/identity/jsonfasprovider1.py0000664000175000017500000002535313137632523026356 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2007-2008 Red Hat, Inc. # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # '''**Deprecated** Use jsonfasprovider2 instead a it provides CSRF protection. This plugin provides integration with the Fedora Account System using :term:`JSON` calls. .. moduleauthor:: Toshio Kuratomi .. moduleauthor:: Ricky Zhou ''' from cherrypy import response from turbogears import config, identity from kitchen.text.converters import to_bytes from kitchen.pycompat24 import sets sets.add_builtin_set() from fedora.client import BaseClient, FedoraServiceError from fedora import __version__ import crypt import logging log = logging.getLogger('turbogears.identity.safasprovider') class JsonFasIdentity(BaseClient): ''' Associate an identity with a person in the auth system. ''' cookie_name = config.get('visit.cookie.name', 'tg-visit') fas_url = config.get( 'fas.url', 'https://admin.fedoraproject.org/accounts/' ) useragent = 'JsonFasIdentity/%s' % __version__ cache_session = False def __init__(self, visit_key, user=None, username=None, password=None): if user: self._user = user self._groups = frozenset( [g['name'] for g in user['approved_memberships']] ) self.visit_key = visit_key if visit_key: # Set the cookie to the user's tg_visit key before requesting # authentication. That way we link the two together. session_id = visit_key else: session_id = None debug = config.get('jsonfas.debug', False) super(JsonFasIdentity, self).__init__( self.fas_url, useragent=self.useragent, debug=debug, username=username, password=password, session_id=session_id, cache_session=self.cache_session) if self.debug: import inspect caller = inspect.getouterframes(inspect.currentframe())[1][3] log.debug('JsonFasIdentity.__init__ caller: %s' % caller) response.simple_cookie[self.cookie_name] = visit_key # Send a request so that we associate the visit_cookie with the user self.send_request('', auth=True) log.debug('Leaving JsonFasIdentity.__init__') def send_request(self, method, req_params=None, auth=False): ''' Make an HTTP Request to a server method. We need to override the send_request provided by ``BaseClient`` to keep the visit_key in sync. ''' log.debug('Entering jsonfas send_request') if self.session_id != self.visit_key: # When the visit_key changes (because the old key had expired or # been deleted from the db) change the visit_key in our variables # and the session cookie to be sent back to the client. self.visit_key = self.session_id response.simple_cookie[self.cookie_name] = self.visit_key log.debug('Leaving jsonfas send_request') return super(JsonFasIdentity, self).send_request( method, req_params=req_params, auth=auth) def _get_user(self): '''Retrieve information about the user from cache or network.''' # pylint: disable-msg=W0704 try: return self._user except AttributeError: # User hasn't already been set pass # pylint: enable-msg=W0704 if self.debug: import inspect caller = inspect.getouterframes(inspect.currentframe())[1][3] log.debug('JSONFASPROVIDER.send_request caller: %s' % caller) # Attempt to load the user. After this code executes, there *WILL* be # a _user attribute, even if the value is None. # Query the account system URL for our given user's sessionCookie # FAS returns user and group listing # pylint: disable-msg=W0702 try: data = self.send_request('user/view', auth=True) except: # Any errors have to result in no user being set. The rest of the # framework doesn't know what to do otherwise. self._user = None return None # pylint: enable-msg=W0702 if not data['person']: self._user = None return None self._user = data['person'] self._groups = frozenset( [g['name'] for g in data['person']['approved_memberships']] ) return self._user user = property(_get_user) def _get_user_name(self): '''Return the username for the user.''' if self.debug: import inspect caller = inspect.getouterframes(inspect.currentframe())[1][3] log.debug('JsonFasProvider._get_user_name caller: %s' % caller) if not self.user: return None return self.user['username'] user_name = property(_get_user_name) def _get_anonymous(self): '''Return True if there's no user logged in.''' return not self.user anonymous = property(_get_anonymous) def _get_display_name(self): '''Return the user's display name.''' if not self.user: return None return self.user['human_name'] display_name = property(_get_display_name) def _get_groups(self): '''Return the groups that a user is a member of.''' try: return self._groups except AttributeError: # User and groups haven't been returned. Since the json call # returns both user and groups, this is set at user creation time. self._groups = frozenset() return self._groups groups = property(_get_groups) def logout(self): ''' Remove the link between this identity and the visit. ''' if not self.visit_key: return # Call Account System Server logout method self.send_request('logout', auth=True) class JsonFasIdentityProvider(object): ''' IdentityProvider that authenticates users against the fedora account system ''' def __init__(self): # Default encryption algorithm is to use plain text passwords algorithm = config.get( 'identity.saprovider.encryption_algorithm', None ) # pylint: disable-msg=W0212 # TG does this so we shouldn't get rid of it. self.encrypt_password = lambda pw: identity._encrypt_password( algorithm, pw) def create_provider_model(self): ''' Create the database tables if they don't already exist. ''' # No database tables to create because the db is behind the FAS2 # server pass def validate_identity(self, user_name, password, visit_key): ''' Look up the identity represented by user_name and determine whether the password is correct. Must return either None if the credentials weren't valid or an object with the following properties: :user_name: original user name :user: a provider dependant object (TG_User or similar) :groups: a set of group IDs :permissions: a set of permission IDs ''' # pylint: disable-msg=R0201 # TG identity providers have this method so we can't get rid of it. try: user = JsonFasIdentity(visit_key, username=user_name, password=password) except FedoraServiceError as e: log.warning('Error logging in %(user)s: %(error)s' % { 'user': to_bytes(user_name), 'error': to_bytes(e)}) return None return user def validate_password(self, user, user_name, password): ''' Check the supplied user_name and password against existing credentials. Note: user_name is not used here, but is required by external password validation schemes that might override this method. If you use SqlAlchemyIdentityProvider, but want to check the passwords against an external source (i.e. PAM, LDAP, Windows domain, etc), subclass SqlAlchemyIdentityProvider, and override this method. :arg user: User information. Not used. :arg user_name: Given username. :arg password: Given, plaintext password. :returns: True if the password matches the username. Otherwise False. Can return False for problems within the Account System as well. ''' # pylint: disable-msg=W0613,R0201 # TG identity providers take user_name in case an external provider # needs it so we can't get rid of it. # TG identity providers have this method so we can't get rid of it. return user.password == crypt.crypt(password, user.password) def load_identity(self, visit_key): '''Lookup the principal represented by visit_key. :arg visit_key: The session key for whom we're looking up an identity. :returns: an object with the following properties: :user_name: original user name :user: a provider dependant object (TG_User or similar) :groups: a set of group IDs :permissions: a set of permission IDs ''' # pylint: disable-msg=R0201 # TG identity providers have this method so we can't get rid of it. return JsonFasIdentity(visit_key) def anonymous_identity(self): ''' Must return an object with the following properties: :user_name: original user name :user: a provider dependant object (TG_User or similar) :groups: a set of group IDs :permissions: a set of permission IDs ''' # pylint: disable-msg=R0201 # TG identity providers have this method so we can't get rid of it. return JsonFasIdentity(None) def authenticated_identity(self, user): ''' Constructs Identity object for user that has no associated visit_key. ''' # pylint: disable-msg=R0201 # TG identity providers have this method so we can't get rid of it. return JsonFasIdentity(None, user) python-fedora-0.10.0/fedora/tg/identity/soprovidercsrf.py0000664000175000017500000004652413137632523026134 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2009,2013 Red Hat, Inc. # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # # Adapted from code in the TurboGears project licensed under the MIT license. # ''' This plugin provides authentication from a database using sqlobject. In addition to the standard stuff provided by the TurboGears soprovider, it adds a csrf_token attribute that can be used to protect the server from csrf attacks. .. versionadded:: 0.3.14 .. moduleauthor:: Toshio Kuratomi ''' from datetime import datetime try: from hashlib import sha1 as hash_constructor except ImportError: from sha import new as hash_constructor from sqlobject import SQLObject, SQLObjectNotFound, RelatedJoin, \ DateTimeCol, IntCol, StringCol, UnicodeCol from sqlobject.inheritance import InheritableSQLObject import warnings import logging log = logging.getLogger("turbogears.identity.soprovider") import cherrypy import turbogears from turbogears import identity from turbogears.database import PackageHub from turbogears.util import load_class from turbogears.identity import set_login_attempted from turbojson.jsonify import jsonify_sqlobject, jsonify hub = PackageHub("turbogears.identity") __connection__ = hub try: set, frozenset except NameError: # Python 2.3 from sets import Set as set, ImmutableSet as frozenset def to_db_encoding(s, encoding): if isinstance(s, str): pass elif hasattr(s, '__unicode__'): s = unicode(s) if isinstance(s, unicode): s = s.encode(encoding) return s class DeprecatedAttr(object): def __init__(self, old_name, new_name): self.old_name = old_name self.new_name = new_name def __get__(self, obj, type=None): warnings.warn("%s has been deprecated in favour of %s" % (self.old_name, self.new_name), DeprecationWarning) return getattr(obj, self.new_name) def __set__(self, obj, value): warnings.warn( "%s has been deprecated in favour of %s" % (self.old_name, self.new_name), DeprecationWarning) return setattr(obj, self.new_name, value) # Global class references -- # these will be set when the provider is initialised. user_class = None group_class = None permission_class = None visit_class = None class SqlObjectCsrfIdentity(object): """Identity that uses a model from a database (via SQLObject).""" def __init__(self, visit_key=None, user=None): # The reason we have both _retrieved_user and _user is this: # _user is set if both the user is authenticated and a csrf_token is # present. # _retrieved_user actually caches the user info from the server. # Sometimes we have to determine if a user is only lacking a token, # then retrieved_user comes in handy. self._retrieved_user = None self.visit_key = visit_key if user: self._user = user self._user_retrieved = user if visit_key is not None: self.login() def __retrieve_user(self): '''Attempt to load the user from the visit_key :returns: a user or None ''' if self._retrieved_user: return self._retrieved_user # Retrieve the user info from the db visit = self.visit_link if not visit: return None try: self._retrieved_user = user_class.get(visit.user_id) except SQLObjectNotFound: log.warning("No such user with ID: %s", visit.user_id) self._retrieved_user = None return self._retrieved_user def _get_user(self): """Get user instance for this identity.""" try: return self._user except AttributeError: # User hasn't already been set pass # Attempt to load the user. After this code executes, there *will* be # a _user attribute, even if the value is None. visit = self.visit_link if not visit: # No visit, no user self._user = None else: # Unless we were given the user_name and password to login on # this request, a CSRF token is required if (not '_csrf_token' in cherrypy.request.params or cherrypy.request.params['_csrf_token'] != hash_constructor(self.visit_key).hexdigest()): log.info("Bad _csrf_token") if '_csrf_token' in cherrypy.request.params: log.info("visit: %s token: %s" % (self.visit_key, cherrypy.request.params['_csrf_token'])) else: log.info('No _csrf_token present') cherrypy.request.fas_identity_failure_reason = 'bad_csrf' self._user = None try: return self._user except AttributeError: # User hasn't already been set # Attempt to load the user. After this code executes, there # *will* be a _user attribute, even if the value is None. self._user = self.__retrieve_user() return self._user user = property(_get_user) def _get_token(self): '''Get the csrf token for this identity''' if self.visit_key: return hash_constructor(self.visit_key).hexdigest() else: return '' csrf_token = property(_get_token) def _get_user_name(self): """Get user name of this identity.""" if not self.user: return None return self.user.user_name user_name = property(_get_user_name) def _get_user_id(self): """Get user id of this identity.""" if not self.user: return None return self.user.id user_id = property(_get_user_id) def _get_anonymous(self): """Return true if not logged in.""" return not self.user anonymous = property(_get_anonymous) def _get_only_token(self): ''' In one specific instance in the login template we need to know whether an anonymous user is just lacking a token. ''' if self.__retrieve_user(): # user is valid, just the token is missing return True # Else the user still has to login return False only_token = property(_get_only_token) def _get_permissions(self): """Get set of permission names of this identity.""" try: return self._permissions except AttributeError: # Permissions haven't been computed yet pass if not self.user: self._permissions = frozenset() else: self._permissions = frozenset( [p.permission_name for p in self.user.permissions]) return self._permissions permissions = property(_get_permissions) def _get_groups(self): """Get set of group names of this identity.""" try: return self._groups except AttributeError: # Groups haven't been computed yet pass if not self.user: self._groups = frozenset() else: self._groups = frozenset([g.group_name for g in self.user.groups]) return self._groups groups = property(_get_groups) def _get_group_ids(self): """Get set of group IDs of this identity.""" try: return self._group_ids except AttributeError: # Groups haven't been computed yet pass if not self.user: self._group_ids = frozenset() else: self._group_ids = frozenset([g.id for g in self.user.groups]) return self._group_ids group_ids = property(_get_group_ids) def _get_visit_link(self): """Get the visit link to this identity.""" if self.visit_key is None: return None try: return visit_class.by_visit_key(self.visit_key) except SQLObjectNotFound: return None visit_link = property(_get_visit_link) def _get_login_url(self): """Get the URL for the login page.""" return identity.get_failure_url() login_url = property(_get_login_url) def login(self): """Set the link between this identity and the visit.""" visit = self.visit_link if visit: visit.user_id = self._user.id else: visit = visit_class(visit_key=self.visit_key, user_id=self._user.id) def logout(self): """Remove the link between this identity and the visit.""" visit = self.visit_link if visit: visit.destroySelf() # Clear the current identity identity.set_current_identity(SqlObjectCsrfIdentity()) class SqlObjectCsrfIdentityProvider(object): """IdentityProvider that uses a model from a database (via SQLObject).""" def __init__(self): super(SqlObjectCsrfIdentityProvider, self).__init__() get = turbogears.config.get global user_class, group_class, permission_class, visit_class user_class_path = get("identity.soprovider.model.user", __name__ + ".TG_User") user_class = load_class(user_class_path) if user_class: log.info("Succesfully loaded \"%s\"" % user_class_path) try: self.user_class_db_encoding = \ user_class.sqlmeta.columns['user_name'].dbEncoding or 'UTF-8' except (KeyError, AttributeError): self.user_class_db_encoding = 'UTF-8' group_class_path = get("identity.soprovider.model.group", __name__ + ".TG_Group") group_class = load_class(group_class_path) if group_class: log.info("Succesfully loaded \"%s\"" % group_class_path) permission_class_path = get("identity.soprovider.model.permission", __name__ + ".TG_Permission") permission_class = load_class(permission_class_path) if permission_class: log.info("Succesfully loaded \"%s\"" % permission_class_path) visit_class_path = get("identity.soprovider.model.visit", __name__ + ".TG_VisitIdentity") visit_class = load_class(visit_class_path) if visit_class: log.info("Succesfully loaded \"%s\"" % visit_class_path) # Default encryption algorithm is to use plain text passwords algorithm = get("identity.soprovider.encryption_algorithm", None) self.encrypt_password = lambda pw: \ identity._encrypt_password(algorithm, pw) def create_provider_model(self): """Create the database tables if they don't already exist.""" try: hub.begin() user_class.createTable(ifNotExists=True) group_class.createTable(ifNotExists=True) permission_class.createTable(ifNotExists=True) visit_class.createTable(ifNotExists=True) hub.commit() hub.end() except KeyError: log.warning("No database is configured:" " SqlObjectCsrfIdentityProvider is disabled.") return def validate_identity(self, user_name, password, visit_key): """Validate the identity represented by user_name using the password. Must return either None if the credentials weren't valid or an object with the following properties: user_name: original user name user: a provider dependant object (TG_User or similar) groups: a set of group names permissions: a set of permission names """ try: user_name = to_db_encoding(user_name, self.user_class_db_encoding) user = user_class.by_user_name(user_name) if not self.validate_password(user, user_name, password): log.info("Passwords don't match for user: %s", user_name) return None log.info("Associating user (%s) with visit (%s)", user_name, visit_key) return SqlObjectCsrfIdentity(visit_key, user) except SQLObjectNotFound: log.warning("No such user: %s", user_name) return None def validate_password(self, user, user_name, password): """Check the user_name and password against existing credentials. Note: user_name is not used here, but is required by external password validation schemes that might override this method. If you use SqlObjectCsrfIdentityProvider, but want to check the passwords against an external source (i.e. PAM, a password file, Windows domain), subclass SqlObjectCsrfIdentityProvider, and override this method. """ return user.password == self.encrypt_password(password) def load_identity(self, visit_key): """Lookup the principal represented by user_name. Return None if there is no principal for the given user ID. Must return an object with the following properties: user_name: original user name user: a provider dependant object (TG_User or similar) groups: a set of group names permissions: a set of permission names """ ident = SqlObjectCsrfIdentity(visit_key) if 'csrf_login' in cherrypy.request.params: cherrypy.request.params.pop('csrf_login') set_login_attempted(True) return ident def anonymous_identity(self): """Return anonymous identity. Must return an object with the following properties: user_name: original user name user: a provider dependant object (TG_User or similar) groups: a set of group names permissions: a set of permission names """ return SqlObjectCsrfIdentity() def authenticated_identity(self, user): """Constructs Identity object for users with no visit_key.""" return SqlObjectCsrfIdentity(user=user) class TG_VisitIdentity(SQLObject): """A visit to your website.""" class sqlmeta: table = "tg_visit_identity" visit_key = StringCol(length=40, alternateID=True, alternateMethodName="by_visit_key") user_id = IntCol() class TG_Group(InheritableSQLObject): """An ultra-simple group definition.""" class sqlmeta: table = "tg_group" group_name = UnicodeCol(length=16, alternateID=True, alternateMethodName="by_group_name") display_name = UnicodeCol(length=255) created = DateTimeCol(default=datetime.now) # Old names groupId = DeprecatedAttr("groupId", "group_name") displayName = DeprecatedAttr("displayName", "display_name") # collection of all users belonging to this group users = RelatedJoin("TG_User", intermediateTable="tg_user_group", joinColumn="group_id", otherColumn="user_id") # collection of all permissions for this group permissions = RelatedJoin("TG_Permission", joinColumn="group_id", intermediateTable="tg_group_permission", otherColumn="permission_id") [jsonify.when('isinstance(obj, TG_Group)')] def jsonify_group(obj): """Convert group to JSON.""" result = jsonify_sqlobject(obj) result["users"] = [u.user_name for u in obj.users] result["permissions"] = [p.permission_name for p in obj.permissions] return result class TG_User(InheritableSQLObject): """Reasonably basic User definition.""" class sqlmeta: table = "tg_user" user_name = UnicodeCol(length=16, alternateID=True, alternateMethodName="by_user_name") email_address = UnicodeCol(length=255, alternateID=True, alternateMethodName="by_email_address") display_name = UnicodeCol(length=255) password = UnicodeCol(length=40) created = DateTimeCol(default=datetime.now) # Old attribute names userId = DeprecatedAttr("userId", "user_name") emailAddress = DeprecatedAttr("emailAddress", "email_address") displayName = DeprecatedAttr("displayName", "display_name") # groups this user belongs to groups = RelatedJoin("TG_Group", intermediateTable="tg_user_group", joinColumn="user_id", otherColumn="group_id") def _get_permissions(self): perms = set() for g in self.groups: perms = perms | set(g.permissions) return perms def _set_password(self, cleartext_password): """Run cleartext_password through the hash algorithm before saving.""" try: hash = identity.current_provider.encrypt_password( cleartext_password) except identity.exceptions.IdentityManagementNotEnabledException: # Creating identity provider just to encrypt password # (so we don't reimplement the encryption step). ip = SqlObjectCsrfIdentityProvider() hash = ip.encrypt_password(cleartext_password) if hash == cleartext_password: log.info("Identity provider not enabled," " and no encryption algorithm specified in config." " Setting password as plaintext.") self._SO_set_password(hash) def set_password_raw(self, password): """Save the password as-is to the database.""" self._SO_set_password(password) [jsonify.when('isinstance(obj, TG_User)')] def jsonify_user(obj): """Convert user to JSON.""" result = jsonify_sqlobject(obj) del result['password'] result["groups"] = [g.group_name for g in obj.groups] result["permissions"] = [p.permission_name for p in obj.permissions] return result class TG_Permission(InheritableSQLObject): """Permissions for a given group.""" class sqlmeta: table = "tg_permission" permission_name = UnicodeCol(length=16, alternateID=True, alternateMethodName="by_permission_name") description = UnicodeCol(length=255) # Old attributes permissionId = DeprecatedAttr("permissionId", "permission_name") groups = RelatedJoin("TG_Group", intermediateTable="tg_group_permission", joinColumn="permission_id", otherColumn="group_id") [jsonify.when('isinstance(obj, TG_Permission)')] def jsonify_permission(obj): """Convert permissions to JSON.""" result = jsonify_sqlobject(obj) result["groups"] = [g.group_name for g in obj.groups] return result def encrypt_password(cleartext_password): """Encrypt given cleartext password.""" try: hash = identity.current_provider.encrypt_password(cleartext_password) except identity.exceptions.RequestRequiredException: # Creating identity provider just to encrypt password # (so we don't reimplement the encryption step). ip = SqlObjectCsrfIdentityProvider() hash = ip.encrypt_password(cleartext_password) if hash == cleartext_password: log.info("Identity provider not enabled, and no encryption " "algorithm specified in config. Setting password as plaintext.") return hash python-fedora-0.10.0/fedora/tg/tg2utils.py0000664000175000017500000000300613137632523022772 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2011 Red Hat, Inc. # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # ''' Miscellaneous functions of use on a TurboGears Server. This interface is *deprecated* .. versionchanged:: 0.3.25 Deprecated .. moduleauthor:: Toshio Kuratomi ''' # Pylint Messages # :W0401: This file is for backwards compatibility. It has been renamed to # tg2/utils. We use a wildcard import just to import the names for # functions into this namespace. # :W0614: Ditto. from fedora.tg2.utils import * # pylint:disable-msg=W0614,W0401 import warnings warnings.warn('fedora.tg.tg2utils is deprecated. Switch to' ' fedora.tg2.utils instead. This file will disappear in 0.4', DeprecationWarning, stacklevel=2) __all__ = ('add_fas_auth_middleware', 'enable_csrf', 'fedora_template', 'tg_url', 'url') python-fedora-0.10.0/fedora/tg/templates/0000775000175000017500000000000013234574425022646 5ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/fedora/tg/templates/genshi/0000775000175000017500000000000013234574425024123 5ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/fedora/tg/templates/genshi/login.html0000664000175000017500000001066413137632523026124 0ustar puiterwijkpuiterwijk00000000000000
  • ${f_('Welcome')}
  • ${f_('You are not logged in')}
  • ${f_('CSRF protected')}
  • python-fedora-0.10.0/fedora/tg/templates/genshi/jsglobals.html0000664000175000017500000000301713137632523026766 0ustar puiterwijkpuiterwijk00000000000000 python-fedora-0.10.0/fedora/tg/templates/genshi/__init__.py0000664000175000017500000000624713137632523026241 0ustar puiterwijkpuiterwijk00000000000000''' Genshi version of templates to make adding certain Fedora widgets easier. -------------------------------------------- :mod:`fedora.tg.templates.genshi.login.html` -------------------------------------------- .. module:: fedora.tg.templates.genshi.login.html :synopsis: Templates related to logging in and out. .. moduleauthor:: Toshio Kuratomi .. versionadded:: 0.3.10 Include this using:: .. function:: loginform([message]) :message: Any text or elements contained by the tag will be shown as a message to the user. This is generally used to show status of the last login attempt ("Please provide your credentials", "Supplied credentials were not correct", etc) A match template for the main login form. This is a :term:`CSRF` token-aware login form that will prompt for username and password when no session identity is present and ask the user to click a link if they merely lack a token. Typical usage would be:: ${message} .. function:: logintoolitem(@href=URL) :@href: If an href attribute is present for this tag, when a user is logged in, their username or display_name will be a link to the URL. A match template to add an entry to a toolbar. The entry will contain the user's username and a logout button if the user is logged in, a verify login button if the user has a session cookie but not a :term:`CSRF` token, or a login button if the user doesn't have a session cookie. Typical usage looks like this::
    ------------------------------------------------ :mod:`fedora.tg.templates.genshi.jsglobals.html` ------------------------------------------------ .. module:: fedora.tg.templates.genshi.jsglobals.html :synopsis: Templates to get information into javascript .. moduleauthor:: Toshio Kuratomi .. versionadded:: 0.3.10 Include this using:: .. function:: jsglobals() A match template to add global variables to a page. Typically, you'd include this in your :file:`master.html` template and let it be added to every other page from there. This adds the following variables in the fedora namespace for other scripts to access: :fedora.baseurl: URL fragment to prepend to any calls to the application. In a :term:`TurboGears` application, this is the scheme, host, and server.webpath. Example: https://admin.fedoraproject.org/pkgdb/. This may be a relative link. :fedora.identity.anonymous: If ``true``, there will be no other variables in the `fedora.identity` namespace. If ``false``, these variables are defined: :fedora.identity.userid: Numeric, unique identifier for the user :fedora.identity.username: Publically visible unique identifier for the user :fedora.identity.display_name: Common human name for the user :fedora.identity.token: csrf token for this user's session to be added to urls that query the server. Typical usage would be:: ''' python-fedora-0.10.0/fedora/tg/templates/__init__.py0000664000175000017500000000024013137632523024747 0ustar puiterwijkpuiterwijk00000000000000''' Templates to make adding templates for some common services easier. .. moduleauthor:: Toshio Kuratomi .. versionadded:: 0.3.10 ''' python-fedora-0.10.0/fedora/tg/controllers.py0000664000175000017500000001011413137632523023561 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2008-2011 Red Hat, Inc. # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # ''' Controller functions that are standard across Fedora Applications .. moduleauthor:: Toshio Kuratomi ''' from turbogears import flash from turbogears import identity, redirect from cherrypy import request, response from fedora.tg.utils import request_format from turbogears.i18n.utils import get_locale from turbogears.i18n.tg_gettext import tg_gettext def f_(msg): ''' Translate given message from current tg locale Parameters :message: text to be translated Returns: Translated message string ''' return tg_gettext(msg, get_locale(), 'python-fedora') def login(forward_url=None, *args, **kwargs): '''Page to become authenticated to the Account System. This shows a small login box to type in your username and password from the Fedora Account System. To use this, replace your current login controller method with:: from fedora.controllers import login as fc_login @expose(template='yourapp.yourlogintemplate', allow_json=True) def login(self, forward_url=None, *args, **kwargs): login_dict = fc_login(forward_url, args, kwargs) # Add anything to the return dict that you need for your app return login_dict :kwarg: forward_url: The url to send to once authentication succeeds ''' if forward_url: if isinstance(forward_url, list): forward_url = forward_url.pop(0) else: del request.params['forward_url'] if not identity.current.anonymous and identity.was_login_attempted() \ and not identity.get_identity_errors(): # User is logged in flash(f_('Welcome, %s') % identity.current.user_name) if request_format() == 'json': # When called as a json method, doesn't make any sense to redirect # to a page. Returning the logged in identity is better. return dict(user=identity.current.user, _csrf_token=identity.current.csrf_token) redirect(forward_url or '/') if identity.was_login_attempted(): msg = f_('The credentials you supplied were not correct or ' 'did not grant access to this resource.') elif identity.get_identity_errors(): msg = f_('You must provide your credentials before accessing ' 'this resource.') else: msg = f_('Please log in.') if not forward_url: forward_url = request.headers.get('Referer', '/') response.status = 403 return dict( logging_in=True, message=msg, forward_url=forward_url, previous_url=request.path_info, original_parameters=request.params ) def logout(url=None): '''Logout from the server. To use this, replace your current login controller method with:: from fedora.controllers import logout as fc_logout @expose(allow_json=True) def logout(self): return fc_logout() :kwarg url: If provided, when the user logs out, they will always be taken to this url. This defaults to taking the user to the URL they were at when they clicked logout. ''' identity.current.logout() flash(f_('You have successfully logged out.')) if request_format() == 'json': return dict() if not url: url = request.headers.get('Referer', '/') redirect(url) python-fedora-0.10.0/fedora/tg/widgets.py0000664000175000017500000001000113137632523022654 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2007 Red Hat, Inc. # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # ''' Proof-of-concept Fedora TurboGears widgets .. moduleauthor:: Luke Macken ''' import re import feedparser try: import simplejson as json except ImportError: from . import json as json from bugzilla import Bugzilla from six.moves.urllib.request import urlopen from turbogears.widgets import Widget class FedoraPeopleWidget(Widget): '''Widget to display the Fedora People RSS Feed. ''' template = """
    ${entry['title']}
    """ params = ["widget_id", "entries"] def __init__(self, widget_id=None): self.widget_id = widget_id self.entries = [] regex = re.compile('') feed = feedparser.parse('http://planet.fedoraproject.org/rss20.xml') for entry in feed['entries']: self.entries.append({ 'link': entry['link'], 'title': entry['title'], 'image': regex.match(entry['summary']).group(1) }) def __json__(self): return {'id': self.widget_id, 'entries': self.entries} class FedoraMaintainerWidget(Widget): '''Widget to show the packages a maintainer owns. ''' url = "https://admin.fedoraproject.org/pkgdb/package/rpms/${pkg['name']}/" template = """
    ${pkg['name']}
    """ % url params = ["widget_id", "packages"] def __init__(self, username, widget_id=None): self.widget_id = widget_id page = urlopen( 'https://admin.fedoraproject.org/pkgdb/' 'api/packager/package/%s/' % username ) page = json.load(page) self.packages = page['point of contact'] + page['co-maintained'] def __json__(self): return {'id': self.widget_id, 'packages': self.packages} class BugzillaWidget(Widget): '''Widget to show the stream of bugs submitted against a package.''' template = """
    ${bug.bug_id} ${bug.short_short_desc}
    """ params = ["widget_id", "bugs"] def __init__(self, email, widget_id=None): self.widget_id = widget_id bugzilla = Bugzilla(url='https://bugzilla.redhat.com/xmlrpc.cgi') # pylint: disable-msg=E1101 # :E1101: Bugzilla class monkey patches itself with methods like # query. self.bugs = bugzilla.query({ 'product': 'Fedora', 'email1': email, 'emailassigned_to1': True })[:5] # pylint: enable-msg=E1101 def __json__(self): return {'id': self.widget_id, 'bugs': self.bugs} python-fedora-0.10.0/fedora/textutils.py0000664000175000017500000000233113137632523022650 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2010 Red Hat, Inc. # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # ''' Functions to manipulate unicode and byte strings .. versionadded:: 0.3.17 .. versionchanged:: 0.3.22 Deprecate in favor of kitchen.text.converters .. moduleauthor:: Toshio Kuratomi ''' import warnings from kitchen.text.converters import to_unicode, to_bytes warnings.warn('fedora.textutils is deprecated. Use' ' kitchen.text.converters instead', DeprecationWarning, stacklevel=2) __all__ = ('to_unicode', 'to_bytes') python-fedora-0.10.0/fedora/client/0000775000175000017500000000000013234574425021514 5ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/fedora/client/openidproxyclient.py0000664000175000017500000005545413137632523025656 0ustar puiterwijkpuiterwijk00000000000000#!/usr/bin/env python2 -tt # -*- coding: utf-8 -*- # # Copyright (C) 2013-2014 Red Hat, Inc. # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # """Implement a class that sets up simple communication to a Fedora Service. .. moduleauthor:: Pierre-Yves Chibon .. moduleauthor:: Toshio Kuratomi .. versionadded: 0.3.35 """ import copy import logging import re # For handling an exception that's coming from requests: import ssl import time from six.moves import http_client as httplib from six.moves.urllib.parse import quote, parse_qs, urljoin, urlparse # Hack, hack, hack around # the horror that is logging! # Verily, verliy, verily, verily # We should all use something better try: # Python 2.7+ from logging import NullHandler except ImportError: class NullHandler(logging.Handler): def emit(self, *args): pass import requests #from munch import munchify from kitchen.text.converters import to_bytes # For handling an exception that's coming from requests: import urllib3 from fedora import __version__ from fedora.client import AuthError, ServerError, FedoraServiceError log = logging.getLogger(__name__) log.addHandler(NullHandler()) OPENID_SESSION_NAME = 'FAS_OPENID' FEDORA_OPENID_API = 'https://id.fedoraproject.org/api/v1/' FEDORA_OPENID_RE = re.compile(r'^http(s)?:\/\/id\.(|stg.|dev.)?fedoraproject\.org(/)?') def _parse_response_history(response): """ Retrieve the attributes from the response history. """ data = {} for r in response.history: if FEDORA_OPENID_RE.match(r.url): parsed = parse_qs(urlparse(r.url).query) for key, value in parsed.items(): data[key] = value[0] break return data def openid_login(session, login_url, username, password, otp=None, openid_insecure=False): """ Open a session for the user. Log in the user with the specified username and password against the FAS OpenID server. :arg session: Requests session object required to persist the cookies that are created during redirects on the openid provider. :arg login_url: The url to the login endpoint of the application. :arg username: the FAS username of the user that wants to log in :arg password: the FAS password of the user that wants to log in :kwarg otp: currently unused. Eventually a way to send an otp to the API that the API can use. :kwarg openid_insecure: If True, do not check the openid server certificates against their CA's. This means that man-in-the-middle attacks are possible against the `BaseClient`. You might turn this option on for testing against a local version of a server with a self-signed certificate but it should be off in production. """ # Log into the service response = session.get( login_url, headers={'Accept': 'application/json'}) try: data = response.json() openid_url = data.get('server_url', None) if not FEDORA_OPENID_RE.match(openid_url): raise FedoraServiceError( 'Un-expected openid provider asked: %s' % openid_url) except: # Some consumers (like pyramid_openid) return redirects with the # openid attributes encoded in the url if not FEDORA_OPENID_RE.match(response.url): raise FedoraServiceError( 'Un-expected openid provider asked: %s' % response.url) data = _parse_response_history(response) # Contact openid provider data['username'] = username data['password'] = password # Let's precise to FedOAuth that we want to authenticate with FAS data['auth_module'] = 'fedoauth.auth.fas.Auth_FAS' data['auth_flow'] = 'fedora' if not 'openid.mode' in data: data['openid.mode'] = 'checkid_setup' response = session.post( FEDORA_OPENID_API, data=data, verify=not openid_insecure) if not bool(response): raise ServerError(FEDORA_OPENID_API, response.status_code, 'Error returned from our POST to ipsilon.') output = response.json() if not output['success']: raise AuthError(output['message']) response = session.post(output['response']['openid.return_to'], data=output['response']) return response def absolute_url(beginning, end): """ Join two urls parts if the last part does not start with the first part specified """ if not end.startswith(beginning): end = urljoin(beginning, end) return end class OpenIdProxyClient(object): # pylint: disable-msg=R0903 """ A client to a Fedora Service. This class is optimized to proxy multiple users to a service. OpenIdProxyClient is designed to be usable by code that creates a single instance of this class and uses it in multiple threads. However it is not completely threadsafe. See the information on setting attributes below. If you want something that can manage one user's connection to a Fedora Service, then look into using :class:`~fedora.client.OpenIdBaseClient` instead. This class has several attributes. These may be changed after instantiation. Please note, however, that changing these values when another thread is utilizing the same instance may affect more than just the thread that you are making the change in. (For instance, changing the debug option could cause other threads to start logging debug messages in the middle of a method.) .. attribute:: base_url Initial portion of the url to contact the server. It is highly recommended not to change this value unless you know that no other threads are accessing this :class:`OpenIdProxyClient` instance. .. attribute:: useragent Changes the useragent string that is reported to the web server. .. attribute:: session_name Name of the cookie that holds the authentication value. .. attribute:: debug If :data:`True`, then more verbose logging is performed to aid in debugging issues. .. attribute:: insecure If :data:`True` then the connection to the server is not checked to be sure that any SSL certificate information is valid. That means that a remote host can lie about who it is. Useful for development but should not be used in production code. .. attribute:: retries Setting this to a positive integer will retry failed requests to the web server this many times. Setting to a negative integer will retry forever. .. attribute:: timeout A float describing the timeout of the connection. The timeout only affects the connection process itself, not the downloading of the response body. Defaults to 120 seconds. """ def __init__(self, base_url, login_url=None, useragent=None, session_name='session', debug=False, insecure=False, openid_insecure=False, retries=None, timeout=None): """Create a client configured for a particular service. :arg base_url: Base of every URL used to contact the server :kwarg login_url: The url to the login endpoint of the application. If none are specified, it uses the default `/login`. :kwarg useragent: useragent string to use. If not given, default to "Fedora ProxyClient/VERSION" :kwarg session_name: name of the cookie to use with session handling :kwarg debug: If True, log debug information :kwarg insecure: If True, do not check server certificates against their CA's. This means that man-in-the-middle attacks are possible against the `BaseClient`. You might turn this option on for testing against a local version of a server with a self-signed certificate but it should be off in production. :kwarg openid_insecure: If True, do not check the openid server certificates against their CA's. This means that man-in-the- middle attacks are possible against the `BaseClient`. You might turn this option on for testing against a local version of a server with a self-signed certificate but it should be off in production. :kwarg retries: if we get an unknown or possibly transient error from the server, retry this many times. Setting this to a negative number makes it try forever. Defaults to zero, no retries. :kwarg timeout: A float describing the timeout of the connection. The timeout only affects the connection process itself, not the downloading of the response body. Defaults to 120 seconds. """ self.debug = debug log.debug('proxyclient.__init__:entered') # When we are instantiated, go ahead and silence the python-requests # log. It is kind of noisy in our app server logs. if not debug: requests_log = logging.getLogger("requests") requests_log.setLevel(logging.WARN) if base_url[-1] != '/': base_url = base_url + '/' self.base_url = base_url self.login_url = login_url or urljoin(self.base_url, '/login') self.domain = urlparse(self.base_url).netloc self.useragent = useragent or 'Fedora ProxyClient/%(version)s' % { 'version': __version__} self.session_name = session_name self.insecure = insecure self.openid_insecure = openid_insecure # Have to do retries and timeout default values this way as BaseClient # sends None for these values if not overridden by the user. if retries is None: self.retries = 0 else: self.retries = retries if timeout is None: self.timeout = 120.0 else: self.timeout = timeout log.debug('proxyclient.__init__:exited') def __get_debug(self): """Return whether we have debug logging turned on. :Returns: True if debugging is on, False otherwise. """ if log.level <= logging.DEBUG: return True return False def __set_debug(self, debug=False): """Change debug level. :kwarg debug: A true value to turn debugging on, false value to turn it off. """ if debug: log.setLevel(logging.DEBUG) else: log.setLevel(logging.ERROR) debug = property(__get_debug, __set_debug, doc=""" When True, we log extra debugging statements. When False, we only log errors. """) def login(self, username, password, otp=None): """ Open a session for the user. Log in the user with the specified username and password against the FAS OpenID server. :arg username: the FAS username of the user that wants to log in :arg password: the FAS password of the user that wants to log in :kwarg otp: currently unused. Eventually a way to send an otp to the API that the API can use. :return: a tuple containing both the response from the OpenID provider and the session used to by this provider. """ session = requests.session() response = openid_login( session=session, login_url=self.login_url, username=username, password=password, otp=otp, openid_insecure=self.openid_insecure) return (response, session) def send_request(self, method, verb='POST', req_params=None, auth_params=None, file_params=None, retries=None, timeout=None, headers=None): """Make an HTTP request to a server method. The given method is called with any parameters set in ``req_params``. If auth is True, then the request is made with an authenticated session cookie. Note that path parameters should be set by adding onto the method, not via ``req_params``. :arg method: Method to call on the server. It's a url fragment that comes after the base_url set in __init__(). Note that any parameters set as extra path information should be listed here, not in ``req_params``. :kwarg req_params: dict containing extra parameters to send to the server :kwarg auth_params: dict containing one or more means of authenticating to the server. Valid entries in this dict are: :cookie: **Deprecated** Use ``session_id`` instead. If both ``cookie`` and ``session_id`` are set, only ``session_id`` will be used. A ``Cookie.SimpleCookie`` to send as a session cookie to the server :session_id: Session id to put in a cookie to construct an identity for the server :username: Username to send to the server :password: Password to use with username to send to the server :httpauth: If set to ``basic`` then use HTTP Basic Authentication to send the username and password to the server. This may be extended in the future to support other httpauth types than ``basic``. Note that cookie can be sent alone but if one of username or password is set the other must as well. Code can set all of these if it wants and all of them will be sent to the server. Be careful of sending cookies that do not match with the username in this case as the server can decide what to do in this case. :kwarg file_params: dict of files where the key is the name of the file field used in the remote method and the value is the local path of the file to be uploaded. If you want to pass multiple files to a single file field, pass the paths as a list of paths. :kwarg retries: if we get an unknown or possibly transient error from the server, retry this many times. Setting this to a negative number makes it try forever. Default to use the :attr:`retries` value set on the instance or in :meth:`__init__`. :kwarg timeout: A float describing the timeout of the connection. The timeout only affects the connection process itself, not the downloading of the response body. Defaults to the :attr:`timeout` value set on the instance or in :meth:`__init__`. :kwarg headers: A dictionary containing specific headers to add to the request made. :returns: A tuple of session_id and data. :rtype: tuple of session information and data from server """ log.debug('openidproxyclient.send_request: entered') # parameter mangling file_params = file_params or {} # Check whether we need to authenticate for this request session_id = None username = None password = None if auth_params: if 'session_id' in auth_params: session_id = auth_params['session_id'] if 'username' in auth_params and 'password' in auth_params: username = auth_params['username'] password = auth_params['password'] elif 'username' in auth_params or 'password' in auth_params: raise AuthError( 'username and password must both be set in auth_params' ) if not (session_id or username): raise AuthError( 'No known authentication methods specified: set ' '"cookie" in auth_params or set both username and ' 'password in auth_params') # urljoin is slightly different than os.path.join(). Make sure # method will work with it. method = method.lstrip('/') # And join to make our url. url = urljoin(self.base_url, quote(method)) # Set standard headers if headers: if not 'User-agent' in headers: headers['User-agent'] = self.useragent if not 'Accept' in headers: headers['Accept'] = 'application/json' else: headers = { 'User-agent': self.useragent, 'Accept': 'application/json', } # Files to upload for field_name, local_file_name in file_params: file_params[field_name] = open(local_file_name, 'rb') cookies = requests.cookies.RequestsCookieJar() # If we have a session_id, send it if session_id: # Anytime the session_id exists, send it so that visit tracking # works. Will also authenticate us if there's a need. Note # that there's no need to set other cookie attributes because # this is a cookie generated client-side. cookies.set(self.session_name, session_id) complete_params = req_params or {} auth = None if username and password: # OpenID login resp, session = self.login(username, password, otp=None) cookies = session.cookies # If debug, give people our debug info log.debug('Creating request %s', to_bytes(url)) log.debug('Headers: %s', to_bytes(headers, nonstring='simplerepr')) if self.debug and complete_params: debug_data = copy.deepcopy(complete_params) if 'password' in debug_data: debug_data['password'] = 'xxxxxxx' log.debug('Data: %r', debug_data) if retries is None: retries = self.retries if timeout is None: timeout = self.timeout num_tries = 0 while True: try: response = session.request( method=verb, url=url, data=complete_params, cookies=cookies, headers=headers, auth=auth, verify=not self.insecure, timeout=timeout, ) except (requests.Timeout, requests.exceptions.SSLError) as err: if isinstance(err, requests.exceptions.SSLError): # And now we know how not to code a library exception # hierarchy... We're expecting that requests is raising # the following stupidity: # requests.exceptions.SSLError( # urllib3.exceptions.SSLError( # ssl.SSLError('The read operation timed out'))) # If we weren't interested in reraising the exception with # full traceback we could use a try: except instead of # this gross conditional. But we need to code defensively # because we don't want to raise an unrelated exception # here and if requests/urllib3 can do this sort of # nonsense, they may change the nonsense in the future if not (err.args and isinstance( err.args[0], urllib3.exceptions.SSLError) and err.args[0].args and isinstance(err.args[0].args[0], ssl.SSLError) and err.args[0].args[0].args and 'timed out' in err.args[0].args[0].args[0]): # We're only interested in timeouts here raise log.debug('Request timed out') if retries < 0 or num_tries < retries: num_tries += 1 log.debug('Attempt #%s failed', num_tries) time.sleep(0.5) continue # Fail and raise an error # Raising our own exception protects the user from the # implementation detail of requests vs pycurl vs urllib raise ServerError( url, -1, 'Request timed out after %s seconds' % timeout) # When the python-requests module gets a response, it attempts to # guess the encoding using chardet (or a fork) # That process can take an extraordinarily long time for long # response.text strings.. upwards of 30 minutes for FAS queries to # /accounts/user/list JSON api! Therefore, we cut that codepath # off at the pass by assuming that the response is 'utf-8'. We can # make that assumption because we're only interfacing with servers # that we run (and we know that they all return responses # encoded 'utf-8'). response.encoding = 'utf-8' # Check for auth failures # Note: old TG apps returned 403 Forbidden on authentication # failures. # Updated apps return 401 Unauthorized # We need to accept both until all apps are updated to return 401. http_status = response.status_code if http_status in (401, 403): # Wrong username or password log.debug('Authentication failed logging in') raise AuthError( 'Unable to log into server. Invalid ' 'authentication tokens. Send new username and password' ) elif http_status >= 400: if retries < 0 or num_tries < retries: # Retry the request num_tries += 1 log.debug('Attempt #%s failed', num_tries) time.sleep(0.5) continue # Fail and raise an error try: msg = httplib.responses[http_status] except (KeyError, AttributeError): msg = 'Unknown HTTP Server Response' raise ServerError(url, http_status, msg) # Successfully returned data break # In case the server returned a new session cookie to us new_session = session.cookies.get(self.session_name, '') log.debug('openidproxyclient.send_request: exited') #data = munchify(data) return new_session, response __all__ = (OpenIdProxyClient,) python-fedora-0.10.0/fedora/client/wiki.py0000664000175000017500000002207413137632523023032 0ustar puiterwijkpuiterwijk00000000000000#!/usr/bin/python -tt # -*- coding: utf-8 -*- # # Copyright 2008-2009 Red Hat, Inc. # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # ''' A Wiki Client This interface is *deprecated*. Please use resources recommended by upstream instead: https://www.mediawiki.org/wiki/API:Client_code#Python .. moduleauthor:: Luke Macken .. moduleauthor:: Toshio Kuratomi .. moduleauthor:: Ian Weller ''' from __future__ import print_function from datetime import datetime, timedelta import time import warnings from kitchen.text.converters import to_bytes from fedora.client import BaseClient, AuthError from fedora import _ MEDIAWIKI_DATEFORMAT = "%Y-%m-%dT%H:%M:%SZ" class Wiki(BaseClient): api_high_limits = False def __init__(self, base_url='https://fedoraproject.org/w/', *args, **kwargs): super(Wiki, self).__init__(base_url, *args, **kwargs) warnings.warn( "The Wiki client is deprecated. Please use resources " "recommended by upstream instead: https://www.mediawiki." "org/wiki/API:Client_code#Python") def get_recent_changes(self, now, then, limit=500): """ Get recent wiki changes from `now` until `then` """ data = self.send_request( 'api.php', req_params={ 'list': 'recentchanges', 'action': 'query', 'format': 'json', 'rcprop': 'user|title', 'rcend': then.isoformat().split('.')[0] + 'Z', 'rclimit': limit, }) if 'error' in data: raise Exception(data['error']['info']) return data['query']['recentchanges'] def login(self, username, password): data = self.send_request('api.php', req_params={ 'action': 'login', 'format': 'json', 'lgname': username, 'lgpassword': password, }) if 'lgtoken' not in data.get('login', {}): raise AuthError( 'Login failed: %(data)s' % { 'data': to_bytes(data) }) #self.session_id = data['login']['lgtoken'] #self.username = data['login']['lgusername'] self.check_api_limits() return data def check_api_limits(self): """ Checks whether you have the 'apihighlimits' right or not. """ data = self.send_request('api.php', req_params={ 'action': 'query', 'meta': 'userinfo', 'uiprop': 'rights', 'format': 'json', }) self.api_high_limits = "apihighlimits" in \ data['query']['userinfo']['rights'] return self.api_high_limits def print_recent_changes(self, days=7, show=10): now = datetime.utcnow() then = now - timedelta(days=days) print(_(u"From %(then)s to %(now)s") % {'then': then, 'now': now}) changes = self.get_recent_changes(now=now, then=then) num_changes = len(changes) print(_(u"%d wiki changes in the past week") % num_changes) if num_changes == 500: print(_( u"""Warning: Number of changes reaches the API return limit. You will not get the complete list of changes unless you run this script using a 'bot' account.""")) users = {} pages = {} for change in changes: users.setdefault(change['user'], []).append(change['title']) pages[change['title']] = pages.setdefault(change['title'], 0) + 1 print(_(u'\n== Most active wiki users ==')) for user, changes in sorted(users.items(), key=lambda x: len(x[1]), reverse=True)[:show]: print(u' %-50s %d' % (('%s' % user).ljust(50, '.'), len(changes))) print(_(u'\n== Most edited pages ==')) for page, num in sorted(pages.items(), key=lambda x: x[1], reverse=True)[:show]: print(u' %-50s %d' % (('%s' % page).ljust(50, '.'), num)) def fetch_all_revisions(self, start=1, flags=True, timestamp=True, user=True, size=False, comment=True, content=False, title=True, ignore_imported_revs=True, ignore_wikibot=False, callback=None): """ Fetch data for all revisions. This could take a long time. You can start at a specific revision by modifying the 'start' keyword argument. To ignore revisions made by "ImportUser" and "Admin" set ignore_imported_revs to True (this is the default). To ignore edits made by Wikibot set ignore_wikibot to True (False is the default). Modifying the remainder of the keyword arguments will return less/more data. """ # first we need to get the latest revision id change = self.send_request( 'api.php', req_params={ 'list': 'recentchanges', 'action': 'query', 'format': 'json', 'rcprop': 'ids', 'rclimit': 1, 'rctype': 'edit|new', } ) latest_revid = change['query']['recentchanges'][0]['revid'] # now we loop through all the revisions we want rvprop_list = { 'flags': flags, 'timestamp': timestamp, 'user': True, 'size': size, 'comment': comment, 'content': content, 'ids': True, } rvprop = '|'.join([key for key in rvprop_list if rvprop_list[key]]) revs_to_get = list(range(start, latest_revid)) all_revs = {} if self.api_high_limits: limit = 500 else: limit = 50 for i in range(0, len(revs_to_get), limit): revid_list = revs_to_get[i:i+limit] revid_str = '|'.join([str(rev) for rev in revid_list]) data = self.send_request( 'api.php', req_params={ 'action': 'query', 'prop': 'revisions', 'rvprop': rvprop, 'revids': revid_str, 'format': 'json', } ) if 'pages' not in data['query'].keys(): continue if 'badrevids' in data['query'].keys(): [revs_to_get.remove(i['revid']) for i in data['query']['badrevids'].values()] for pageid in data['query']['pages']: page = data['query']['pages'][pageid] for revision in page['revisions']: if ignore_imported_revs and \ revision['user'] in ['ImportUser', 'Admin'] or \ ignore_wikibot and revision['user'] == 'Wikibot': revs_to_get.remove(revision['revid']) continue this_rev = {} if flags: this_rev['minor'] = 'minor' in revision.keys() if timestamp: this_rev['time'] = time.strptime(revision['timestamp'], MEDIAWIKI_DATEFORMAT) if user: this_rev['user'] = revision['user'] if size: this_rev['size'] = revision['size'] if comment: if 'comment' in revision.keys(): this_rev['comment'] = revision['comment'] else: this_rev['comment'] = None if content: this_rev['content'] = revision['content'] if title: this_rev['title'] = page['title'] all_revs[revision['revid']] = this_rev if callback: callback(all_revs, revs_to_get) return all_revs if __name__ == '__main__': #from getpass import getpass #from six.moves import input #username = input('Username: ') #password = getpass() wiki = Wiki() #cookie = wiki.login(username=username, password=password) #print "login response =", cookie #wiki = Wiki(username=username, session_id=cookie['login']['lgtoken'], # session_name='fpo-mediawiki_en_Token') wiki.print_recent_changes() python-fedora-0.10.0/fedora/client/proxyclient.py0000664000175000017500000005444513137632523024456 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2009-2013 Red Hat, Inc. # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # '''Implement a class that sets up simple communication to a Fedora Service. .. moduleauthor:: Luke Macken .. moduleauthor:: Toshio Kuratomi .. moduleauthor:: Ralph Bean ''' import copy from hashlib import sha1 import logging # For handling an exception that's coming from requests: import ssl import time import warnings from munch import munchify from kitchen.text.converters import to_bytes import requests from six.moves import http_client as httplib from six.moves import http_cookies as Cookie from six.moves.urllib.parse import quote, urljoin, urlparse from fedora import __version__ from fedora.client import AppError, AuthError, ServerError log = logging.getLogger(__name__) class ProxyClient(object): # pylint: disable-msg=R0903 ''' A client to a Fedora Service. This class is optimized to proxy multiple users to a service. ProxyClient is designed to be threadsafe so that code can instantiate one instance of the class and use it for multiple requests for different users from different threads. If you want something that can manage one user's connection to a Fedora Service, then look into using BaseClient instead. This class has several attributes. These may be changed after instantiation however, please note that this class is intended to be threadsafe. Changing these values when another thread may affect more than just the thread that you are making the change in. (For instance, changing the debug option could cause other threads to start logging debug messages in the middle of a method.) .. attribute:: base_url Initial portion of the url to contact the server. It is highly recommended not to change this value unless you know that no other threads are accessing this :class:`ProxyClient` instance. .. attribute:: useragent Changes the useragent string that is reported to the web server. .. attribute:: session_name Name of the cookie that holds the authentication value. .. attribute:: session_as_cookie If :data:`True`, then the session information is saved locally as a cookie. This is here for backwards compatibility. New code should set this to :data:`False` when constructing the :class:`ProxyClient`. .. attribute:: debug If :data:`True`, then more verbose logging is performed to aid in debugging issues. .. attribute:: insecure If :data:`True` then the connection to the server is not checked to be sure that any SSL certificate information is valid. That means that a remote host can lie about who it is. Useful for development but should not be used in production code. .. attribute:: retries Setting this to a positive integer will retry failed requests to the web server this many times. Setting to a negative integer will retry forever. .. attribute:: timeout A float describing the timeout of the connection. The timeout only affects the connection process itself, not the downloading of the response body. Defaults to 120 seconds. .. versionchanged:: 0.3.33 Added the timeout attribute ''' log = log def __init__(self, base_url, useragent=None, session_name='tg-visit', session_as_cookie=True, debug=False, insecure=False, retries=None, timeout=None): '''Create a client configured for a particular service. :arg base_url: Base of every URL used to contact the server :kwarg useragent: useragent string to use. If not given, default to "Fedora ProxyClient/VERSION" :kwarg session_name: name of the cookie to use with session handling :kwarg session_as_cookie: If set to True, return the session as a SimpleCookie. If False, return a session_id. This flag allows us to maintain compatibility for the 0.3 branch. In 0.4, code will have to deal with session_id's instead of cookies. :kwarg debug: If True, log debug information :kwarg insecure: If True, do not check server certificates against their CA's. This means that man-in-the-middle attacks are possible against the `BaseClient`. You might turn this option on for testing against a local version of a server with a self-signed certificate but it should be off in production. :kwarg retries: if we get an unknown or possibly transient error from the server, retry this many times. Setting this to a negative number makes it try forever. Defaults to zero, no retries. :kwarg timeout: A float describing the timeout of the connection. The timeout only affects the connection process itself, not the downloading of the response body. Defaults to 120 seconds. .. versionchanged:: 0.3.33 Added the timeout kwarg ''' # Setup our logger self._log_handler = logging.StreamHandler() self.debug = debug format = logging.Formatter("%(message)s") self._log_handler.setFormatter(format) self.log.addHandler(self._log_handler) # When we are instantiated, go ahead and silence the python-requests # log. It is kind of noisy in our app server logs. if not debug: requests_log = logging.getLogger("requests") requests_log.setLevel(logging.WARN) self.log.debug('proxyclient.__init__:entered') if base_url[-1] != '/': base_url = base_url + '/' self.base_url = base_url self.domain = urlparse(self.base_url).netloc self.useragent = useragent or 'Fedora ProxyClient/%(version)s' % { 'version': __version__} self.session_name = session_name self.session_as_cookie = session_as_cookie if session_as_cookie: warnings.warn( 'Returning cookies from send_request() is' ' deprecated and will be removed in 0.4. Please port your' ' code to use a session_id instead by calling the ProxyClient' ' constructor with session_as_cookie=False', DeprecationWarning, stacklevel=2) self.insecure = insecure # Have to do retries and timeout default values this way as BaseClient # sends None for these values if not overridden by the user. if retries is None: self.retries = 0 else: self.retries = retries if timeout is None: self.timeout = 120.0 else: self.timeout = timeout self.log.debug('proxyclient.__init__:exited') def __get_debug(self): '''Return whether we have debug logging turned on. :Returns: True if debugging is on, False otherwise. ''' if self._log_handler.level <= logging.DEBUG: return True return False def __set_debug(self, debug=False): '''Change debug level. :kwarg debug: A true value to turn debugging on, false value to turn it off. ''' if debug: self.log.setLevel(logging.DEBUG) self._log_handler.setLevel(logging.DEBUG) else: self.log.setLevel(logging.ERROR) self._log_handler.setLevel(logging.INFO) debug = property(__get_debug, __set_debug, doc=''' When True, we log extra debugging statements. When False, we only log errors. ''') def send_request(self, method, req_params=None, auth_params=None, file_params=None, retries=None, timeout=None): '''Make an HTTP request to a server method. The given method is called with any parameters set in ``req_params``. If auth is True, then the request is made with an authenticated session cookie. Note that path parameters should be set by adding onto the method, not via ``req_params``. :arg method: Method to call on the server. It's a url fragment that comes after the base_url set in __init__(). Note that any parameters set as extra path information should be listed here, not in ``req_params``. :kwarg req_params: dict containing extra parameters to send to the server :kwarg auth_params: dict containing one or more means of authenticating to the server. Valid entries in this dict are: :cookie: **Deprecated** Use ``session_id`` instead. If both ``cookie`` and ``session_id`` are set, only ``session_id`` will be used. A ``Cookie.SimpleCookie`` to send as a session cookie to the server :session_id: Session id to put in a cookie to construct an identity for the server :username: Username to send to the server :password: Password to use with username to send to the server :httpauth: If set to ``basic`` then use HTTP Basic Authentication to send the username and password to the server. This may be extended in the future to support other httpauth types than ``basic``. Note that cookie can be sent alone but if one of username or password is set the other must as well. Code can set all of these if it wants and all of them will be sent to the server. Be careful of sending cookies that do not match with the username in this case as the server can decide what to do in this case. :kwarg file_params: dict of files where the key is the name of the file field used in the remote method and the value is the local path of the file to be uploaded. If you want to pass multiple files to a single file field, pass the paths as a list of paths. :kwarg retries: if we get an unknown or possibly transient error from the server, retry this many times. Setting this to a negative number makes it try forever. Default to use the :attr:`retries` value set on the instance or in :meth:`__init__`. :kwarg timeout: A float describing the timeout of the connection. The timeout only affects the connection process itself, not the downloading of the response body. Defaults to the :attr:`timeout` value set on the instance or in :meth:`__init__`. :returns: If ProxyClient is created with session_as_cookie=True (the default), a tuple of session cookie and data from the server. If ProxyClient was created with session_as_cookie=False, a tuple of session_id and data instead. :rtype: tuple of session information and data from server .. versionchanged:: 0.3.17 No longer send tg_format=json parameter. We rely solely on the Accept: application/json header now. .. versionchanged:: 0.3.21 * Return data as a Bunch instead of a DictContainer * Add file_params to allow uploading files .. versionchanged:: 0.3.33 Added the timeout kwarg ''' self.log.debug('proxyclient.send_request: entered') # parameter mangling file_params = file_params or {} # Check whether we need to authenticate for this request session_id = None username = None password = None if auth_params: if 'session_id' in auth_params: session_id = auth_params['session_id'] elif 'cookie' in auth_params: warnings.warn( 'Giving a cookie to send_request() to' ' authenticate is deprecated and will be removed in 0.4.' ' Please port your code to use session_id instead.', DeprecationWarning, stacklevel=2) session_id = auth_params['cookie'].output(attrs=[], header='').strip() if 'username' in auth_params and 'password' in auth_params: username = auth_params['username'] password = auth_params['password'] elif 'username' in auth_params or 'password' in auth_params: raise AuthError('username and password must both be set in' ' auth_params') if not (session_id or username): raise AuthError( 'No known authentication methods' ' specified: set "cookie" in auth_params or set both' ' username and password in auth_params') # urljoin is slightly different than os.path.join(). Make sure method # will work with it. method = method.lstrip('/') # And join to make our url. url = urljoin(self.base_url, quote(method)) data = None # decoded JSON via json.load() # Set standard headers headers = { 'User-agent': self.useragent, 'Accept': 'application/json', } # Files to upload for field_name, local_file_name in file_params: file_params[field_name] = open(local_file_name, 'rb') cookies = requests.cookies.RequestsCookieJar() # If we have a session_id, send it if session_id: # Anytime the session_id exists, send it so that visit tracking # works. Will also authenticate us if there's a need. Note that # there's no need to set other cookie attributes because this is a # cookie generated client-side. cookies.set(self.session_name, session_id) complete_params = req_params or {} if session_id: # Add the csrf protection token token = sha1(to_bytes(session_id)) complete_params.update({'_csrf_token': token.hexdigest()}) auth = None if username and password: if auth_params.get('httpauth', '').lower() == 'basic': # HTTP Basic auth login auth = (username, password) else: # TG login # Adding this to the request data prevents it from being # logged by apache. complete_params.update({ 'user_name': to_bytes(username), 'password': to_bytes(password), 'login': 'Login', }) # If debug, give people our debug info self.log.debug('Creating request %(url)s' % {'url': to_bytes(url)}) self.log.debug('Headers: %(header)s' % {'header': to_bytes(headers, nonstring='simplerepr')}) if self.debug and complete_params: debug_data = copy.deepcopy(complete_params) if 'password' in debug_data: debug_data['password'] = 'xxxxxxx' self.log.debug('Data: %r' % debug_data) if retries is None: retries = self.retries if timeout is None: timeout = self.timeout num_tries = 0 while True: try: response = requests.post( url, data=complete_params, cookies=cookies, headers=headers, auth=auth, verify=not self.insecure, timeout=timeout, ) except (requests.Timeout, requests.exceptions.SSLError) as e: if isinstance(e, requests.exceptions.SSLError): # And now we know how not to code a library exception # hierarchy... We're expecting that requests is raising # the following stupidity: # requests.exceptions.SSLError( # urllib3.exceptions.SSLError( # ssl.SSLError('The read operation timed out'))) # If we weren't interested in reraising the exception with # full tracdeback we could use a try: except instead of # this gross conditional. But we need to code defensively # because we don't want to raise an unrelated exception # here and if requests/urllib3 can do this sort of # nonsense, they may change the nonsense in the future # # And a note on the __class__.__name__/__module__ parsing: # On top of all the other things it does wrong, requests # is bundling a copy of urllib3. Distros can unbundle it. # But because of the bundling, python will think # exceptions raised by the version downloaded by pypi # (requests.packages.urllib3.exceptions.SSLError) are # different than the exceptions raised by the unbundled # distro version (urllib3.exceptions.SSLError). We could # do a try: except trying to import both of these # SSLErrors and then code to detect either one of them but # the whole thing is just stupid. So we'll use a stupid # hack of our own that (1) means we don't have to depend # on urllib3 just for this exception and (2) is (slightly) # less likely to break on the whims of the requests # author. if not (e.args and e.args[0].__class__.__name__ == 'SSLError' and e.args[0].__class__.__module__.endswith( 'urllib3.exceptions') and e.args[0].args and isinstance(e.args[0].args[0], ssl.SSLError) and e.args[0].args[0].args and 'timed out' in e.args[0].args[0].args[0]): # We're only interested in timeouts here raise self.log.debug('Request timed out') if retries < 0 or num_tries < retries: num_tries += 1 self.log.debug( 'Attempt #%(try)s failed' % {'try': num_tries}) time.sleep(0.5) continue # Fail and raise an error # Raising our own exception protects the user from the # implementation detail of requests vs pycurl vs urllib raise ServerError( url, -1, 'Request timed out after %s seconds' % timeout) # When the python-requests module gets a response, it attempts to # guess the encoding using chardet (or a fork) # That process can take an extraordinarily long time for long # response.text strings.. upwards of 30 minutes for FAS queries to # /accounts/user/list JSON api! Therefore, we cut that codepath # off at the pass by assuming that the response is 'utf-8'. We can # make that assumption because we're only interfacing with servers # that we run (and we know that they all return responses # encoded 'utf-8'). response.encoding = 'utf-8' # Check for auth failures # Note: old TG apps returned 403 Forbidden on authentication # failures. # Updated apps return 401 Unauthorized # We need to accept both until all apps are updated to return 401. http_status = response.status_code if http_status in (401, 403): # Wrong username or password self.log.debug('Authentication failed logging in') raise AuthError( 'Unable to log into server. Invalid' ' authentication tokens. Send new username and password') elif http_status >= 400: if retries < 0 or num_tries < retries: # Retry the request num_tries += 1 self.log.debug( 'Attempt #%(try)s failed' % {'try': num_tries}) time.sleep(0.5) continue # Fail and raise an error try: msg = httplib.responses[http_status] except (KeyError, AttributeError): msg = 'Unknown HTTP Server Response' raise ServerError(url, http_status, msg) # Successfully returned data break # In case the server returned a new session cookie to us new_session = response.cookies.get(self.session_name, '') try: data = response.json() except ValueError as e: # The response wasn't JSON data raise ServerError( url, http_status, 'Error returned from' ' json module while processing %(url)s: %(err)s' % {'url': to_bytes(url), 'err': to_bytes(e)}) if 'exc' in data: name = data.pop('exc') message = data.pop('tg_flash') raise AppError(name=name, message=message, extras=data) # If we need to return a cookie for deprecated code, convert it here if self.session_as_cookie: cookie = Cookie.SimpleCookie() cookie[self.session_name] = new_session new_session = cookie self.log.debug('proxyclient.send_request: exited') data = munchify(data) return new_session, data __all__ = (ProxyClient,) python-fedora-0.10.0/fedora/client/openidcclient.py0000664000175000017500000000507013234573627024713 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2016, 2017 Red Hat, Inc. # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # """Base client for applications relying on OpenID Connect for authentication. Implementation note: this implementation hardcodes certain endpoints at the IdP to the ones as implemented by Ipsilon 2.0 and higher. .. moduleauthor:: Patrick Uiterwijk .. versionadded: 0.3.35 """ from fedora import __version__ from openidc_client import OpenIDCClient PROD_IDP = 'https://id.fedoraproject.org/openidc/' STG_IDP = 'https://id.stg.fedoraproject.org/openidc/' DEV_IDP = 'https://iddev.fedorainfracloud.org/openidc/' class OpenIDCBaseClient(OpenIDCClient): def __init__(self, app_identifier, id_provider, client_id, use_post=False, cachedir=None): """Client for interacting with web services relying on OpenID Connect. :arg app_identifier: Identifier for storage of retrieved tokens :kwarg id_provider: URL of the identity provider to get tokens from :kwarg client_id: The Client Identifier used to request credentials :kwarg use_post: Whether to use POST submission of client secrets rather than Authorization header :kwarg cachedir: The directory in which to store the token caches. Will be put through expanduer. Default is ~/.fedora. If this does not exist and we are unable to create it, the OSError will e thrown up. """ if cachedir is None: cachedir = '~/.fedora/' super(OpenIDCBaseClient, self).__init__( self, app_identifier=app_identifier, id_provider=id_provider, id_provider_mapping={'Token': 'Token', 'Authorization': 'Authorization'}, client_id=client_id, use_post=use_post, useragent='Python-Fedora/%s' % __version__, cachedir=cachedir) python-fedora-0.10.0/fedora/client/__init__.py0000664000175000017500000001275413234573627023641 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2007-2013 Red Hat, Inc. # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # ''' fedora.client is used to interact with Fedora Services. .. versionchanged:: 0.3.21 Deprecate DictContainer in favor of bunch.Bunch .. versionchanged:: 0.3.35 Add the openid clients .. moduleauthor:: Ricky Zhou .. moduleauthor:: Luke Macken .. moduleauthor:: Toshio Kuratomi ''' import errno import os import warnings from munch import Munch class FedoraClientError(Exception): '''Base Exception for problems which originate within the Clients. This should be the base class for any exceptions that the Client generates generate. For instance, if the client performs validation before passing the data on to the Fedora Service. Problems returned while talking to the Services should be returned via a `FedoraServiceError` instead. ''' pass class FedoraServiceError(Exception): '''Base Exception for any problem talking with the Service. When the Client gets an error talking to the server, an exception of this type is raised. This can be anything in the networking layer up to an error returned from the server itself. ''' pass class ServerError(FedoraServiceError): '''Unable to talk to the server properly. This includes network errors and 500 response codes. If the error was generated from an http response, :attr:`code` is the HTTP response code. Otherwise, :attr:`code` will be -1. ''' def __init__(self, url, status, msg): FedoraServiceError.__init__(self) self.filename = url self.code = status self.msg = msg def __str__(self): return 'ServerError(%s, %s, %s)' % (self.filename, self.code, self.msg) def __repr__(self): return 'ServerError(%r, %r, %r)' % (self.filename, self.code, self.msg) class AuthError(FedoraServiceError): '''Error during authentication. For instance, invalid password.''' pass class LoginRequiredError(AuthError): """ Exception raised when the call requires a logged-in user. """ pass class AppError(FedoraServiceError): '''Error condition that the server is passing back to the client.''' def __init__(self, name, message, extras=None): FedoraServiceError.__init__(self) self.name = name self.message = message self.extras = extras def __str__(self): return 'AppError(%s, %s, extras=%s)' % ( self.name, self.message, self.extras) def __repr__(self): return 'AppError(%r, %r, extras=%r)' % ( self.name, self.message, self.extras) class UnsafeFileError(Exception): def __init__(self, filename, message): super(UnsafeFileError, self).__init__(message) self.message = message self.filename = filename def __str__(self): return 'Unsafe file permissions! {}: {}'.format(self.filename, self.message) # Backwards compatibility class DictContainer(Munch): def __init__(self, *args, **kwargs): warnings.warn( 'DictContainer is deprecated. Use the Munch class' ' from python-bunch instead.', DeprecationWarning, stacklevel=2) Munch.__init__(self, *args, **kwargs) def check_file_permissions(filename, allow_notexists=False): if os.path.islink(filename): raise UnsafeFileError(filename, 'File is a symlink') try: stat = os.stat(filename) except OSError as e: if e.errno == errno.ENOENT and allow_notexists: return raise if stat.st_uid != os.getuid(): raise UnsafeFileError(filename, 'File not owned by current user') if stat.st_gid != os.getgid(): raise UnsafeFileError(filename, 'File not owner by primary group') if stat.st_mode & 0o007: raise UnsafeFileError(filename, 'File is world-readable') # We want people to be able to import fedora.client.*Client directly # pylint: disable-msg=W0611 from fedora.client.proxyclient import ProxyClient from fedora.client.fasproxy import FasProxyClient from fedora.client.baseclient import BaseClient from fedora.client.openidproxyclient import OpenIdProxyClient from fedora.client.openidbaseclient import OpenIdBaseClient from fedora.client.fas2 import AccountSystem, FASError, CLAError from fedora.client.bodhi import BodhiClient, BodhiClientException from fedora.client.wiki import Wiki # pylint: enable-msg=W0611 __all__ = ('FedoraServiceError', 'ServerError', 'AuthError', 'AppError', 'FedoraClientError', 'LoginRequiredError', 'DictContainer', 'FASError', 'CLAError', 'BodhiClientException', 'ProxyClient', 'FasProxyClient', 'BaseClient', 'OpenIdProxyClient', 'OpenIdBaseClient', 'AccountSystem', 'BodhiClient', 'Wiki') python-fedora-0.10.0/fedora/client/bodhi.py0000664000175000017500000011314313234573627023161 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright 2007-2015 Red Hat, Inc. # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # """ DEPRECATED: This module is deprecated and has moved to bodhi.client.bindings. As the bodhi-0.9 client still uses it, it will remain here until Fedora 25 is EOL. This module provides a client interface for bodhi. .. moduleauthor:: Luke Macken .. moduleauthor:: Toshio Kuratomi .. moduleauthor:: Ralph Bean """ import os import datetime import functools import getpass import logging import textwrap import warnings import re import six from fedora.client import AuthError, OpenIdBaseClient, FedoraClientError, BaseClient import fedora.client.openidproxyclient warnings.warn('fedora.client.bodhi has been deprecated. Please use bodhi.client.bindings instead.', DeprecationWarning) __version__ = '2.0.0' log = logging.getLogger(__name__) BODHI1_BASE_URL = 'https://admin.fedoraproject.org/updates/' BODHI2_BASE_URL = 'https://bodhi.fedoraproject.org/' BODHI1_STG_BASE_URL = 'https://admin.stg.fedoraproject.org/updates/' BODHI2_STG_BASE_URL = 'https://bodhi.stg.fedoraproject.org/' STG_OPENID_API = 'https://id.stg.fedoraproject.org/api/v1/' # We default to Bodhi2 now BASE_URL = BODHI2_BASE_URL STG_BASE_URL = BODHI2_STG_BASE_URL class BodhiClientException(FedoraClientError): pass def BodhiClient(base_url=BASE_URL, staging=False, **kwargs): # XXX - This is a temporary compat shim to get the bodhi1 /usr/bin/bodhi # tool to play nicely with us. It still hands us the base_url for Bodhi1, # which breaks us. if base_url == BODHI1_BASE_URL: log.warn('Overriding %r with bodhi2, %r. If you want to use Bodhi1, ' 'use fedora.client.bodhi:Bodhi1Client explicitly.' % ( base_url, BODHI2_BASE_URL)) base_url = BODHI2_BASE_URL if staging: log.info('Using bodhi2 STAGING environment') base_url = STG_BASE_URL log.debug('Using Bodhi2Client.') return Bodhi2Client(base_url=base_url, staging=staging, **kwargs) def errorhandled(method): """ A decorator for Bodhi2Client that raises exceptions on failure. """ @functools.wraps(method) def wrapper(*args, **kwargs): try: result = method(*args, **kwargs) except AuthError: # An AuthError can be raised for three different reasons: # # 0) The password is wrong. # 1) The session cookies are expired. fedora.python does not handle this automatically. # 2) The session cookies are not expired, but are no longer valid (for example, this can # happen if the server's auth secret has changed.) # # We don't know the difference between the cases, but case #1 is fairly common and we # can work around it by removing the session cookies and csrf token and retrying the # request. If the password is wrong, the second attempt will also fail but we won't # guard it and the AuthError will still be raised. args[0]._session.cookies.clear() args[0].csrf_token = None result = method(*args, **kwargs) if 'errors' not in result: return result # Otherwise, there was a problem... problems = 'An unhandled error occurred in the BodhiClient' try: problems = "\n".join([e['description'] for e in result['errors']]) except Exception: pass raise BodhiClientException(problems) return wrapper class Bodhi2Client(OpenIdBaseClient): def __init__(self, base_url=BODHI2_BASE_URL, username=None, password=None, staging=False, **kwargs): if staging: fedora.client.openidproxyclient.FEDORA_OPENID_API = STG_OPENID_API base_url = BODHI2_STG_BASE_URL super(Bodhi2Client, self).__init__(base_url, login_url=base_url + 'login', username=username, **kwargs) self._password = password self.csrf_token = None @property def password(self): if not self._password: self._password = getpass.getpass() return self._password @password.setter def password(self, value): self._password = value @errorhandled def save(self, **kwargs): """ Save an update. This entails either creating a new update, or editing an existing one. To edit an existing update, you must specify the update title in the ``edited`` keyword argument. :kwarg builds: A list of koji builds for this update. :kwarg type: The type of this update: ``security``, ``bugfix``, ``enhancement``, and ``newpackage``. :kwarg bugs: A list of Red Hat Bugzilla ID's associated with this update. :kwarg notes: Details as to why this update exists. :kwarg request: Request for this update to change state, either to ``testing``, ``stable``, ``unpush``, ``obsolete`` or None. :kwarg close_bugs: Close bugs when update is stable :kwarg suggest: Suggest that the user reboot or logout after update. (``reboot``, ``logout``) :kwarg inheritance: Follow koji build inheritance, which may result in this update being pushed out to additional releases. :kwarg autokarma: Allow bodhi to automatically change the state of this update based on the ``karma`` from user feedback. It will push your update to ``stable`` once it reaches the ``stable_karma`` and unpush your update when reaching ``unstable_karma``. :kwarg stable_karma: The upper threshold for marking an update as ``stable``. :kwarg unstable_karma: The lower threshold for unpushing an update. :kwarg edited: The update title of the existing update that we are editing. :kwarg severity: The severity of this update (``urgent``, ``high``, ``medium``, ``low``) :kwarg requirements: A list of required Taskotron tests that must pass for this update to reach stable. (``depcheck``, ``upgradepath``, ``rpmlint``) :kwarg require_bugs: A boolean to require that all of the bugs in your update have been confirmed by testers. :kwarg require_testcases: A boolean to require that this update passes all test cases before reaching stable. """ kwargs['csrf_token'] = self.csrf() if 'type_' in kwargs: # backwards compat kwargs['type'] = kwargs['type_'] return self.send_request('updates/', verb='POST', auth=True, data=kwargs) @errorhandled def request(self, update, request): """ Request an update state change. :arg update: The title of the update :arg request: The request (``testing``, ``stable``, ``obsolete``, ``unpush``, ``revoke``) """ return self.send_request('updates/{0}/request'.format(update), verb='POST', auth=True, data={'update': update, 'request': request, 'csrf_token': self.csrf()}) @errorhandled def delete(self, update): warnings.warn('Deleting updates has been disabled in Bodhi2. ' 'This API call will unpush the update instead. ' 'Please use `set_request(update, "unpush")` instead') self.request(update, 'unpush') @errorhandled def query(self, **kwargs): """ Query bodhi for a list of updates. :kwarg releases: A list of releases that you wish to query updates for. :kwarg status: The update status (``pending``, ``testing``, ``stable``, ``obsolete``, ``unpushed``, ``processing``) :kwarg type: The type of this update: ``security``, ``bugfix``, ``enhancement``, and ``newpackage``. :kwarg bugs: A list of Red Hat Bugzilla ID's :kwarg request: An update request to query for ``testing``, ``stable``, ``unpush``, ``obsolete`` or None. :kwarg mine: If True, only query the users updates. Default: False. :kwarg packages: A space or comma delimited list of package names :kwarg limit: A deprecated argument, sets ``rows_per_page``. See its docstring for more info. :kwarg approved_before: A datetime string :kwarg approved_since: A datetime string :kwarg builds: A space or comma delimited string of build nvrs :kwarg critpath: A boolean to query only critical path updates :kwarg cves: Filter by CVE IDs :kwarg locked: A boolean to filter only locked updates :kwarg modified_before: A datetime string to query updates that have been modified before a certain time. :kwarg modified_since: A datetime string to query updates that have been modified since a certain time. :kwarg pushed: A boolean to filter only pushed updates :kwarg pushed_before: A datetime string to filter updates pushed before a certain time. :kwarg pushed_since: A datetime string to filter updates pushed since a certain time. :kwarg severity: A severity type to filter by (``unspecified``, ``urgent``, ``high``, ``medium``, ``low``) :kwarg submitted_before: A datetime string to filter updates submitted before a certain time. :kwarg submitted_since: A datetime string to filter updates submitted after a certain time. :kwarg suggest: Query for updates that suggest a user restart (``logout``, ``reboot``) :kwarg user: Query for updates submitted by a specific user. :kwarg rows_per_page: Limit the results to a certain number of rows per page (min:1 max: 100 default: 20) :kwarg page: Return a specific page of results """ # bodhi1 compat if 'limit' in kwargs: kwargs['rows_per_page'] = kwargs['limit'] del(kwargs['limit']) # 'mine' may be in kwargs, but set False if kwargs.get('mine'): kwargs['user'] = self.username if 'package' in kwargs: # for Bodhi 1, 'package' could be a package name, build, or # update ID, so try and figure it out if re.search(r'(\.el|\.fc)\d\d?', kwargs['package']): kwargs['builds'] = kwargs['package'] elif re.search(r'FEDORA-(EPEL-)?\d{4,4}', kwargs['package']): kwargs['updateid'] = kwargs['package'] else: kwargs['packages'] = kwargs['package'] del(kwargs['package']) if 'release' in kwargs: kwargs['releases'] = kwargs['release'] del(kwargs['release']) if 'type_' in kwargs: kwargs['type'] = kwargs['type_'] del(kwargs['type_']) # Old Bodhi CLI set bugs default to "", but new Bodhi API # checks for 'if bugs is not None', not 'if not bugs' if 'bugs' in kwargs and kwargs['bugs'] == '': kwargs['bugs'] = None return self.send_request('updates/', verb='GET', params=kwargs) @errorhandled def comment(self, update, comment, karma=0, email=None): """ Add a comment to an update. :arg update: The title of the update comment on. :arg comment: The text of the comment. :kwarg karma: The karma of this comment (-1, 0, 1) :kwarg email: Whether or not to trigger email notifications """ return self.send_request('comments/', verb='POST', auth=True, data={'update': update, 'text': comment, 'karma': karma, 'email': email, 'csrf_token': self.csrf()}) @errorhandled def save_override(self, nvr, duration, notes): """ Save a buildroot override. This entails either creating a new buildroot override, or editing an existing one. :kwarg nvr: A nvr of a koji build. :kwarg duration: Number of days from now that this override should expire. :kwarg notes: Notes about why this override is in place. """ expiration_date = datetime.datetime.utcnow() + \ datetime.timedelta(days=duration) return self.send_request( 'overrides/', verb='POST', auth=True, data={ 'nvr': nvr, 'expiration_date': expiration_date, 'notes': notes, 'csrf_token': self.csrf(), }) @errorhandled def list_overrides(self, user=None): """ Save a buildroot overrides. This entails either creating a new buildroot override, or editing an existing one. :kwarg user: A username whose buildroot overrides you want returned. """ params = {} if user: params['user'] = user return self.send_request('overrides/', verb='GET', params=params) @errorhandled def csrf(self): if not self.csrf_token: if not self.has_cookies(): self.login(self.username, self.password) self.csrf_token = self.send_request( 'csrf', verb='GET', auth=True)['csrf_token'] return self.csrf_token def parse_file(self, input_file): """ Parse an update template file. :arg input_file: The filename of the update template. Returns an array of dictionaries of parsed update values which can be directly passed to the ``save`` method. """ from six.moves import configparser if not os.path.exists(input_file): raise ValueError("No such file or directory: %s" % input_file) defaults = dict(severity='unspecified', suggest='unspecified') config = configparser.SafeConfigParser(defaults=defaults) read = config.read(input_file) if len(read) != 1 or read[0] != input_file: raise ValueError("Invalid input file: %s" % input_file) updates = [] for section in config.sections(): update = { 'builds': section, 'bugs': config.get(section, 'bugs', raw=True), 'close_bugs': config.getboolean(section, 'close_bugs'), 'type': config.get(section, 'type', raw=True), 'type_': config.get(section, 'type', raw=True), 'request': config.get(section, 'request', raw=True), 'severity': config.get(section, 'severity', raw=True), 'notes': config.get(section, 'notes', raw=True), 'autokarma': config.get(section, 'autokarma', raw=True), 'stable_karma': config.get(section, 'stable_karma', raw=True), 'unstable_karma': config.get( section, 'unstable_karma', raw=True), 'suggest': config.get(section, 'suggest', raw=True), } updates.append(update) return updates @errorhandled def latest_builds(self, package): return self.send_request('latest_builds', params={'package': package}) def testable(self): """ Get a list of installed testing updates. This method is a generate that yields packages that you currently have installed that you have yet to test and provide feedback for. Only works on systems with dnf. """ import dnf base = dnf.Base() sack = base.fill_sack(load_system_repo=True) query = sack.query() installed = query.installed() with open('/etc/fedora-release', 'r') as f: fedora = f.readlines()[0].split()[2] tag = 'f%s-updates-testing' % fedora builds = self.get_koji_session( login=False).listTagged(tag, latest=True) for build in builds: pkgs = installed.filter(name=build['name'], version=build['version'], release=build['release']).run() if len(pkgs): update_list = self.query(builds=build['nvr'])['updates'] for update in update_list: yield update def override_str(self, override): """ Return a string representation of a given override dictionary. :arg override: An override dictionary. """ if isinstance(override, six.string_types): return override # TODO -- make this fancy. return "{submitter}'s {build} override (expires {expiry})".format( submitter=override['submitter']['name'], build=override['build']['nvr'], expiry=override['expiration_date'], ) def update_str(self, update, minimal=False): """ Return a string representation of a given update dictionary. :arg update: An update dictionary, acquired by the ``list`` method. :kwarg minimal: Return a minimal one-line representation of the update. """ if isinstance(update, six.string_types): return update if minimal: val = "" date = update['date_pushed'] and update['date_pushed'].split()[0] \ or update['date_submitted'].split()[0] val += ' %-43s %-11s %-8s %10s ' % (update['builds'][0]['nvr'], update['type'], update['status'], date) for build in update['builds'][1:]: val += '\n %s' % build['nvr'] return val val = "%s\n%s\n%s\n" % ('=' * 80, '\n'.join( textwrap.wrap(update['title'].replace(',', ', '), width=80, initial_indent=' '*5, subsequent_indent=' '*5)), '=' * 80) if update['alias']: val += " Update ID: %s\n" % update['alias'] val += """ Release: %s Status: %s Type: %s Karma: %d""" % (update['release']['long_name'], update['status'], update['type'], update['karma']) if update['request'] is not None: val += "\n Request: %s" % update['request'] if len(update['bugs']): bugs = '' i = 0 for bug in update['bugs']: bugstr = '%s%s - %s\n' % (i and ' ' * 11 + ': ' or '', bug['bug_id'], bug['title']) bugs += '\n'.join(textwrap.wrap(bugstr, width=67, subsequent_indent=' '*11+': ')) + '\n' i += 1 bugs = bugs[:-1] val += "\n Bugs: %s" % bugs if update['notes']: notes = textwrap.wrap(update['notes'], width=67, subsequent_indent=' ' * 11 + ': ') val += "\n Notes: %s" % '\n'.join(notes) val += """ Submitter: %s Submitted: %s\n""" % (update['user']['name'], update['date_submitted']) if len(update['comments']): val += " Comments: " comments = [] for comment in update['comments']: if comment['anonymous']: anonymous = " (unauthenticated)" else: anonymous = "" comments.append("%s%s%s - %s (karma %s)" % (' ' * 13, comment['user']['name'], anonymous, comment['timestamp'], comment['karma'])) if comment['text']: text = textwrap.wrap(comment['text'], initial_indent=' ' * 13, subsequent_indent=' ' * 13, width=67) comments.append('\n'.join(text)) val += '\n'.join(comments).lstrip() + '\n' if update['alias']: val += "\n %s\n" % ('%supdates/%s' % (self.base_url, update['alias'])) else: val += "\n %s\n" % ('%s%s' % (self.base_url, update['title'])) return val @errorhandled def get_releases(self, **kwargs): """ Return a list of bodhi releases. This method returns a dictionary in the following format:: {"releases": [ {"dist_tag": "dist-f12", "id_prefix": "FEDORA", "locked": false, "name": "F12", "long_name": "Fedora 12"}]} """ return self.send_request('releases/', params=kwargs) def get_koji_session(self, login=True): """ Return an authenticated koji session """ import koji from iniparse.compat import ConfigParser config = ConfigParser() if os.path.exists(os.path.join(os.path.expanduser('~'), '.koji', 'config')): config.readfp(open(os.path.join(os.path.expanduser('~'), '.koji', 'config'))) else: config.readfp(open('/etc/koji.conf')) cert = os.path.expanduser(config.get('koji', 'cert')) ca = os.path.expanduser(config.get('koji', 'ca')) serverca = os.path.expanduser(config.get('koji', 'serverca')) session = koji.ClientSession(config.get('koji', 'server')) if login: session.ssl_login(cert=cert, ca=ca, serverca=serverca) return session koji_session = property(fget=get_koji_session) def candidates(self): """ Get a list list of update candidates. This method is a generator that returns a list of koji builds that could potentially be pushed as updates. """ if not self.username: raise BodhiClientException('You must specify a username') builds = [] data = self.get_releases() koji = self.get_koji_session(login=False) for release in data['releases']: try: for build in koji.listTagged(release['candidate_tag'], latest=True): if build['owner_name'] == self.username: builds.append(build) except: log.exception('Unable to query candidate builds for %s' % release) return builds class Bodhi1Client(BaseClient): def __init__(self, base_url='https://admin.fedoraproject.org/updates/', useragent='Fedora Bodhi Client/%s' % __version__, *args, **kwargs): """The BodhiClient constructor. :kwarg base_url: Base of every URL used to contact the server. Defaults to the Fedora Bodhi instance. :kwarg useragent: useragent string to use. If not given, default to "Fedora Bodhi Client/VERSION" :kwarg username: username for establishing authenticated connections :kwarg password: password to use with authenticated connections :kwarg session_cookie: *Deprecated* Use session_id instead. User's session_cookie to connect to the server :kwarg session_id: user's session_id to connect to the server :kwarg cache_session: if set to True, cache the user's session cookie on the filesystem between runs. :kwarg debug: If True, log debug information """ self.log = log super(Bodhi1Client, self).__init__(base_url, useragent=useragent, *args, **kwargs) def save(self, builds='', type_='', bugs='', notes='', request='testing', close_bugs=True, suggest_reboot=False, inheritance=False, autokarma=True, stable_karma=3, unstable_karma=-3, edited=''): """ Save an update. This entails either creating a new update, or editing an existing one. To edit an existing update, you must specify the update title in the ``edited`` keyword argument. :kwarg builds: A list of koji builds for this update. :kwarg type\_: The type of this update: ``security``, ``bugfix``, ``enhancement``, and ``newpackage``. :kwarg bugs: A list of Red Hat Bugzilla ID's associated with this update. :kwarg notes: Details as to why this update exists. :kwarg request: Request for this update to change state, either to ``testing``, ``stable``, ``unpush``, ``obsolete`` or None. :kwarg close_bugs: Close bugs when update is stable :kwarg suggest_reboot: Suggest that the user reboot after update. :kwarg inheritance: Follow koji build inheritance, which may result in this update being pushed out to additional releases. :kwarg autokarma: Allow bodhi to automatically change the state of this update based on the ``karma`` from user feedback. It will push your update to ``stable`` once it reaches the ``stable_karma`` and unpush your update when reaching ``unstable_karma``. :kwarg stable_karma: The upper threshold for marking an update as ``stable``. :kwarg unstable_karma: The lower threshold for unpushing an update. :kwarg edited: The update title of the existing update that we are editing. """ return self.send_request( 'save', auth=True, req_params={ 'suggest_reboot': suggest_reboot, 'close_bugs': close_bugs, 'unstable_karma': unstable_karma, 'stable_karma': stable_karma, 'inheritance': inheritance, 'autokarma': autokarma, 'request': request, 'builds': builds, 'edited': edited, 'notes': notes, 'type_': type_, 'bugs': bugs, }) def query(self, release=None, status=None, type_=None, bugs=None, request=None, mine=None, package=None, username=None, limit=10): """ Query bodhi for a list of updates. :kwarg release: The release that you wish to query updates for. :kwarg status: The update status (``pending``, ``testing``, ``stable``, ``obsolete``) :kwarg type_: The type of this update: ``security``, ``bugfix``, ``enhancement``, and ``newpackage``. :kwarg bugs: A list of Red Hat Bugzilla ID's :kwarg request: An update request to query for ``testing``, ``stable``, ``unpush``, ``obsolete`` or None. :kwarg mine: If True, only query the users updates. Default: False. :kwarg package: A package name or a name-version-release. :kwarg limit: The maximum number of updates to display. Default: 10. """ params = { 'updates_tgp_limit': limit, 'username': username, 'release': release, 'package': package, 'request': request, 'status': status, 'type_': type_, 'bugs': bugs, 'mine': mine, } auth = False if params['mine']: auth = True for key, value in list(params.items()): if not value: del params[key] return self.send_request('list', req_params=params, auth=auth) def request(self, update, request): """ Request an update state change. :arg update: The title of the update :arg request: The request (``testing``, ``stable``, ``obsolete``) """ return self.send_request('request', auth=True, req_params={ 'update': update, 'action': request, }) def comment(self, update, comment, karma=0, email=None): """ Add a comment to an update. :arg update: The title of the update comment on. :arg comment: The text of the comment. :kwarg karma: The karma of this comment (-1, 0, 1) :kwarg email: Whether or not to trigger email notifications """ params = { 'karma': karma, 'title': update, 'text': comment, } if email is not None: params['email'] = email return self.send_request('comment', auth=True, req_params=params) def delete(self, update): """ Delete an update. :arg update: The title of the update to delete """ return self.send_request('delete', auth=True, req_params={'update': update}) def candidates(self): """ Get a list list of update candidates. This method is a generator that returns a list of koji builds that could potentially be pushed as updates. """ if not self.username: raise BodhiClientException('You must specify a username') data = self.send_request('candidate_tags') koji = self.get_koji_session(login=False) for tag in data['tags']: for build in koji.listTagged(tag, latest=True): if build['owner_name'] == self.username: yield build def testable(self): """ Get a list of installed testing updates. This method is a generate that yields packages that you currently have installed that you have yet to test and provide feedback for. """ from yum import YumBase yum = YumBase() yum.doConfigSetup(init_plugins=False) with open('/etc/fedora-release', 'r') as f: fedora = f.readlines()[0].split()[2] tag = 'f%s-updates-testing' % fedora builds = self.get_koji_session( login=False).listTagged(tag, latest=True) for build in builds: pkgs = yum.rpmdb.searchNevra(name=build['name'], ver=build['version'], rel=build['release'], epoch=None, arch=None) if len(pkgs): update_list = self.query(package=[build['nvr']])['updates'] for update in update_list: yield update def latest_builds(self, package): """ Get a list of the latest builds for this package. :arg package: package name to find builds for. :returns: a dictionary of the release dist tag to the latest build. .. versionadded:: 0.3.2 """ return self.send_request('latest_builds', req_params={'package': package}) def masher(self): """ Return the status of bodhi's masher """ return self.send_request('admin/masher', auth=True) def push(self): """ Return a list of requests """ return self.send_request('admin/push', auth=True) def push_updates(self, updates): """ Push a list of updates. :arg updates: A list of update titles to ``push``. """ return self.send_request('admin/mash', auth=True, req_params={'updates': updates}) def parse_file(self, input_file): """ Parse an update template file. :arg input_file: The filename of the update template. Returns an array of dictionaries of parsed update values which can be directly passed to the ``save`` method. """ from iniparse.compat import ConfigParser self.log.info('Reading from %s ' % input_file) input_file = os.path.expanduser(input_file) if os.path.exists(input_file): defaults = { 'type': 'bugfix', 'request': 'testing', 'notes': '', 'bugs': '', 'close_bugs': 'True', 'autokarma': 'True', 'stable_karma': 3, 'unstable_karma': -3, 'suggest_reboot': 'False', } config = ConfigParser(defaults) template_file = open(input_file) config.readfp(template_file) template_file.close() updates = [] for section in config.sections(): update = {} update['builds'] = section update['type_'] = config.get(section, 'type', raw=True) update['request'] = config.get(section, 'request', raw=True) update['bugs'] = config.get(section, 'bugs', raw=True) update['close_bugs'] = config.getboolean(section, 'close_bugs') update['notes'] = config.get(section, 'notes', raw=True) update['autokarma'] = config.getboolean(section, 'autokarma') update['stable_karma'] = config.getint(section, 'stable_karma') update['unstable_karma'] = config.getint( section, 'unstable_karma') update['suggest_reboot'] = config.getboolean( section, 'suggest_reboot') updates.append(update) return updates def update_str(self, update, minimal=False): """ Return a string representation of a given update dictionary. :arg update: An update dictionary, acquired by the ``list`` method. :kwarg minimal: Return a minimal one-line representation of the update. """ if isinstance(update, six.string_types): return update if minimal: val = "" date = update['date_pushed'] and update['date_pushed'].split()[0] \ or update['date_submitted'].split()[0] val += ' %-43s %-11s %-8s %10s ' % (update['builds'][0]['nvr'], update['type'], update['status'], date) for build in update['builds'][1:]: val += '\n %s' % build['nvr'] return val val = "%s\n%s\n%s\n" % ('=' * 80, '\n'.join(textwrap.wrap( update['title'].replace(',', ', '), width=80, initial_indent=' '*5, subsequent_indent=' '*5)), '=' * 80) if update['updateid']: val += " Update ID: %s\n" % update['updateid'] val += """ Release: %s Status: %s Type: %s Karma: %d""" % (update['release']['long_name'], update['status'], update['type'], update['karma']) if update['request'] is not None: val += "\n Request: %s" % update['request'] if len(update['bugs']): bugs = '' i = 0 for bug in update['bugs']: bugstr = '%s%s - %s\n' % (i and ' ' * 11 + ': ' or '', bug['bz_id'], bug['title']) bugs += '\n'.join(textwrap.wrap( bugstr, width=67, subsequent_indent=' '*11+': ')) + '\n' i += 1 bugs = bugs[:-1] val += "\n Bugs: %s" % bugs if update['notes']: notes = textwrap.wrap( update['notes'], width=67, subsequent_indent=' ' * 11 + ': ') val += "\n Notes: %s" % '\n'.join(notes) val += """ Submitter: %s Submitted: %s\n""" % (update['submitter'], update['date_submitted']) if len(update['comments']): val += " Comments: " comments = [] for comment in update['comments']: if comment['anonymous']: anonymous = " (unauthenticated)" else: anonymous = "" comments.append("%s%s%s - %s (karma %s)" % (' ' * 13, comment['author'], anonymous, comment['timestamp'], comment['karma'])) if comment['text']: text = textwrap.wrap( comment['text'], initial_indent=' ' * 13, subsequent_indent=' ' * 13, width=67) comments.append('\n'.join(text)) val += '\n'.join(comments).lstrip() + '\n' if update['updateid']: val += "\n %s\n" % ('%s%s/%s' % (self.base_url, update['release']['name'], update['updateid'])) else: val += "\n %s\n" % ('%s%s' % (self.base_url, update['title'])) return val def get_koji_session(self, login=True): """ Return an authenticated koji session """ import koji from iniparse.compat import ConfigParser config = ConfigParser() if os.path.exists(os.path.join(os.path.expanduser('~'), '.koji', 'config')): config.readfp(open(os.path.join(os.path.expanduser('~'), '.koji', 'config'))) else: config.readfp(open('/etc/koji.conf')) cert = os.path.expanduser(config.get('koji', 'cert')) ca = os.path.expanduser(config.get('koji', 'ca')) serverca = os.path.expanduser(config.get('koji', 'serverca')) session = koji.ClientSession(config.get('koji', 'server')) if login: session.ssl_login(cert=cert, ca=ca, serverca=serverca) return session koji_session = property(fget=get_koji_session) def get_releases(self): """ Return a list of bodhi releases. This method returns a dictionary in the following format:: {"releases": [ {"dist_tag": "dist-f12", "id_prefix": "FEDORA", "locked": false, "name": "F12", "long_name": "Fedora 12"}]} """ return self.send_request('releases/') python-fedora-0.10.0/fedora/client/baseclient.py0000664000175000017500000003570413137632523024204 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2013 Red Hat, Inc. # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # '''A base client for interacting with web services. .. moduleauthor:: Luke Macken .. moduleauthor:: Toshio Kuratomi .. moduleauthor:: Ralph Bean ''' import os import stat from os import path import logging import warnings from kitchen.text.converters import to_bytes from six.moves import cPickle as pickle from six.moves import http_cookies as Cookie from fedora import __version__ log = logging.getLogger(__name__) b_SESSION_DIR = path.join(path.expanduser('~'), '.fedora') b_SESSION_FILE = path.join(b_SESSION_DIR, 'fedora_session') from fedora.client import AuthError, ProxyClient class BaseClient(ProxyClient): ''' A client for interacting with web services. ''' def __init__(self, base_url, useragent=None, debug=False, insecure=False, username=None, password=None, httpauth=None, session_cookie=None, session_id=None, session_name='tg-visit', cache_session=True, retries=None, timeout=None): ''' :arg base_url: Base of every URL used to contact the server :kwarg useragent: Useragent string to use. If not given, default to "Fedora BaseClient/VERSION" :kwarg session_name: name of the cookie to use with session handling :kwarg debug: If True, log debug information :kwarg insecure: If True, do not check server certificates against their CA's. This means that man-in-the-middle attacks are possible against the `BaseClient`. You might turn this option on for testing against a local version of a server with a self-signed certificate but it should be off in production. :kwarg username: Username for establishing authenticated connections :kwarg password: Password to use with authenticated connections :kwarg httpauth: If this is set to ``basic`` then use HTTP Basic Authentication to send the username and password. Default: None, means do not use HTTP Authentication. :kwarg session_cookie: *Deprecated* Use session_id instead. If both session_id and session_cookie is given, only session_id will be used. User's session_cookie to connect to the server. :kwarg session_id: id of the user's session :kwarg cache_session: If set to true, cache the user's session data on the filesystem between runs :kwarg retries: if we get an unknown or possibly transient error from the server, retry this many times. Setting this to a negative number makes it try forever. Defaults to zero, no retries. :kwarg timeout: A float describing the timeout of the connection. The timeout only affects the connection process itself, not the downloading of the response body. Defaults to 120 seconds. .. versionchanged:: 0.3.33 Added the timeout kwarg ''' self.log = log self.useragent = useragent or 'Fedora BaseClient/%(version)s' % { 'version': __version__} super(BaseClient, self).__init__( base_url, useragent=self.useragent, session_name=session_name, session_as_cookie=False, debug=debug, insecure=insecure, retries=retries, timeout=timeout ) self.username = username self.password = password self.httpauth = httpauth self.cache_session = cache_session self._session_id = None if session_id: self.session_id = session_id elif session_cookie: warnings.warn('session_cookie is deprecated, use session_id' ' instead', DeprecationWarning, stacklevel=2) session_id = session_cookie.get(self.session_name, '') if session_id: self.session_id = session_id.value def __load_ids(self): '''load id data from a file. :Returns: Complete mapping of users to session ids ''' saved_session = {} session_file = None if path.isfile(b_SESSION_FILE): try: with open(b_SESSION_FILE, 'rb') as session_file: saved_session = pickle.load(session_file) except (IOError, EOFError): self.log.info('Unable to load session from %(file)s' % {'file': b_SESSION_FILE}) return saved_session def __save_ids(self, save): '''Save the cached ids file. :arg save: The dict of usernames to ids to save. ''' # Make sure the directory exists if not path.isdir(b_SESSION_DIR): try: os.mkdir(b_SESSION_DIR, 0o755) except OSError as e: self.log.warning('Unable to create %(dir)s: %(error)s' % {'dir': b_SESSION_DIR, 'error': to_bytes(e)}) try: with open(b_SESSION_FILE, 'wb') as session_file: os.chmod(b_SESSION_FILE, stat.S_IRUSR | stat.S_IWUSR) pickle.dump(save, session_file) except Exception as e: # pylint: disable-msg=W0703 # If we can't save the file, issue a warning but go on. The # session just keeps you from having to type your password over # and over. self.log.warning( 'Unable to write to session file %(session)s:' ' %(error)s' % { 'session': b_SESSION_FILE, 'error': to_bytes(e) } ) def _get_session_id(self): '''Attempt to retrieve the session id from the filesystem. Note: this method will cache the session_id in memory rather than fetch the id from the filesystem each time. :Returns: session_id ''' if self._session_id: return self._session_id if not self.username: self._session_id = '' else: saved_sessions = self.__load_ids() self._session_id = saved_sessions.get(self.username, '') if isinstance(self._session_id, Cookie.SimpleCookie): self._session_id = '' if not self._session_id: self.log.debug( 'No session cached for "%s"' % to_bytes(self.username)) return self._session_id def _set_session_id(self, session_id): '''Store our pickled session id. :arg session_id: id to set our internal id to This method loads our existing session file and modifies our current user's id. This allows us to retain ids for multiple users. ''' # Start with the previous users if self.cache_session and self.username: save = self.__load_ids() save[self.username] = session_id # Save the ids to the filesystem self.__save_ids(save) self._session_id = session_id def _del_session_id(self): '''Delete the session id from the filesystem.''' # Start with the previous users save = self.__load_ids() try: del save[self.username] except KeyError: # This is fine we just want the session to exist in the new # session file. pass else: # Save the ids to the filesystem self.__save_ids(save) self._session_id = None session_id = property(_get_session_id, _set_session_id, _del_session_id, '''The session_id. The session id is saved in a file in case it is needed in consecutive runs of BaseClient. ''') def _get_session_cookie(self): '''**Deprecated** Use session_id instead. Attempt to retrieve the session cookie from the filesystem. :Returns: user's session cookie ''' warnings.warn('session_cookie is deprecated, use session_id' ' instead', DeprecationWarning, stacklevel=2) session_id = self.session_id if not session_id: return '' cookie = Cookie.SimpleCookie() cookie[self.session_name] = session_id return cookie def _set_session_cookie(self, session_cookie): '''**Deprecated** Use session_id instead. Store our pickled session cookie. :arg session_cookie: cookie to set our internal cookie to This method loads our existing session file and modifies our current user's cookie. This allows us to retain cookies for multiple users. ''' warnings.warn('session_cookie is deprecated, use session_id' ' instead', DeprecationWarning, stacklevel=2) session_id = session_cookie.get(self.session_name, '') if session_id: session_id = session_id.value self.session_id = session_id def _del_session_cookie(self): '''**Deprecated** Use session_id instead. Delete the session cookie from the filesystem. ''' warnings.warn('session_cookie is deprecated, use session_id' ' instead', DeprecationWarning, stacklevel=2) del(self.session_id) session_cookie = property(_get_session_cookie, _set_session_cookie, _del_session_cookie, '''*Deprecated*, use session_id instead. The session cookie is saved in a file in case it is needed in consecutive runs of BaseClient. ''') def logout(self): '''Logout from the server. ''' try: self.send_request('logout', auth=True) except AuthError: # pylint: disable-msg=W0704 # We don't need to fail for an auth error as we're getting rid of # our authentication tokens here. pass del(self.session_id) def send_request(self, method, req_params=None, file_params=None, auth=False, retries=None, timeout=None, **kwargs): '''Make an HTTP request to a server method. The given method is called with any parameters set in req_params. If auth is True, then the request is made with an authenticated session cookie. :arg method: Method to call on the server. It's a url fragment that comes after the base_url set in __init__(). :kwarg req_params: Extra parameters to send to the server. :kwarg file_params: dict of files where the key is the name of the file field used in the remote method and the value is the local path of the file to be uploaded. If you want to pass multiple files to a single file field, pass the paths as a list of paths. :kwarg auth: If True perform auth to the server, else do not. :kwarg retries: if we get an unknown or possibly transient error from the server, retry this many times. Setting this to a negative number makes it try forever. Default to use the :attr:`retries` value set on the instance or in :meth:`__init__` (which defaults to zero, no retries). :kwarg timeout: A float describing the timeout of the connection. The timeout only affects the connection process itself, not the downloading of the response body. Default to use the :attr:`timeout` value set on the instance or in :meth:`__init__` (which defaults to 120s). :rtype: Bunch :returns: The data from the server .. versionchanged:: 0.3.21 * Return data as a Bunch instead of a DictContainer * Add file_params to allow uploading files .. versionchanged:: 0.3.33 * Added the timeout kwarg ''' # Check for deprecated arguments. This section can go once we hit 0.4 if len(kwargs) >= 1: for arg in kwargs: # If we have extra args, raise an error if arg != 'input': raise TypeError( 'send_request() got an unexpected keyword' ' argument "%(arg)s"' % {'arg': to_bytes(arg)}) if req_params: # We don't want to allow input if req_params was already given raise TypeError('send_request() got an unexpected keyword' ' argument "input"') if len(kwargs) > 1: # We shouldn't get here raise TypeError('send_request() got an unexpected keyword' ' argument') # Error checking over, set req_params to the value in input warnings.warn( 'send_request(input) is deprecated. Use' ' send_request(req_params) instead', DeprecationWarning, stacklevel=2) req_params = kwargs['input'] auth_params = {'session_id': self.session_id} if auth is True: # We need something to do auth. Check user/pass if self.username and self.password: # Add the username and password and we're all set auth_params['username'] = self.username auth_params['password'] = self.password if self.httpauth: auth_params['httpauth'] = self.httpauth else: # No? Check for session_id if not self.session_id: # Not enough information to auth raise AuthError( 'Auth was requested but no way to' ' perform auth was given. Please set username' ' and password or session_id before calling' ' this function with auth=True') # Remove empty params # pylint: disable-msg=W0104 [auth_params.__delitem__(key) for key, value in list(auth_params.items()) if not value] # pylint: enable-msg=W0104 session_id, data = super(BaseClient, self).send_request( method, req_params=req_params, file_params=file_params, auth_params=auth_params, retries=retries, timeout=timeout) # In case the server returned a new session id to us if self.session_id != session_id: self.session_id = session_id return data python-fedora-0.10.0/fedora/client/openidbaseclient.py0000664000175000017500000003352113234573627025405 0ustar puiterwijkpuiterwijk00000000000000#!/usr/bin/env python2 -tt # -*- coding: utf-8 -*- # # Copyright (C) 2013-2015 Red Hat, Inc. # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # """Base client for application relying on OpenID for authentication. .. moduleauthor:: Pierre-Yves Chibon .. moduleauthor:: Toshio Kuratomi .. moduleauthor:: Ralph Bean .. versionadded: 0.3.35 """ # :F0401: Unable to import : Disabled because these will either import on py3 # or py2 not both. # :E0611: No name $X in module: This was renamed in python3 import json import logging import os import lockfile import requests import requests.adapters from requests.packages.urllib3.util import Retry from six.moves.urllib.parse import urljoin from functools import wraps from munch import munchify from kitchen.text.converters import to_bytes from fedora import __version__ from fedora.client import (AuthError, LoginRequiredError, ServerError, UnsafeFileError, check_file_permissions) from fedora.client.openidproxyclient import ( OpenIdProxyClient, absolute_url, openid_login) log = logging.getLogger(__name__) b_SESSION_DIR = os.path.join(os.path.expanduser('~'), '.fedora') b_SESSION_FILE = os.path.join(b_SESSION_DIR, 'openidbaseclient-sessions.cache') def requires_login(func): """ Decorator function for get or post requests requiring login. Decorate a controller method that requires the user to be authenticated. Example:: from fedora.client.openidbaseclient import requires_login @requires_login def rename_user(new_name): user = new_name # [...] """ def _decorator(request, *args, **kwargs): """ Run the function and check if it redirected to the openid form. Or if we got a 403 """ output = func(request, *args, **kwargs) if output and \ 'OpenID transaction in progress' in output.text: raise LoginRequiredError( '{0} requires a logged in user'.format(output.url)) elif output.status_code == 403: raise LoginRequiredError( '{0} requires a logged in user'.format(output.url)) return output return wraps(func)(_decorator) class OpenIdBaseClient(OpenIdProxyClient): """ A client for interacting with web services relying on openid auth. """ def __init__(self, base_url, login_url=None, useragent=None, debug=False, insecure=False, openid_insecure=False, username=None, cache_session=True, retries=None, timeout=None, retry_backoff_factor=0): """Client for interacting with web services relying on fas_openid auth. :arg base_url: Base of every URL used to contact the server :kwarg login_url: The url to the login endpoint of the application. If none are specified, it uses the default `/login`. :kwarg useragent: Useragent string to use. If not given, default to "Fedora OpenIdBaseClient/VERSION" :kwarg debug: If True, log debug information :kwarg insecure: If True, do not check server certificates against their CA's. This means that man-in-the-middle attacks are possible against the `BaseClient`. You might turn this option on for testing against a local version of a server with a self-signed certificate but it should be off in production. :kwarg openid_insecure: If True, do not check the openid server certificates against their CA's. This means that man-in-the- middle attacks are possible against the `BaseClient`. You might turn this option on for testing against a local version of a server with a self-signed certificate but it should be off in production. :kwarg username: Username for establishing authenticated connections :kwarg cache_session: If set to true, cache the user's session data on the filesystem between runs :kwarg retries: if we get an unknown or possibly transient error from the server, retry this many times. Setting this to a negative number makes it try forever. Defaults to zero, no retries. Note that this can only be set during object initialization. :kwarg timeout: A float describing the timeout of the connection. The timeout only affects the connection process itself, not the downloading of the response body. Defaults to 120 seconds. :kwarg retry_backoff_factor: Exponential backoff factor to apply in between retry attempts. We will sleep for: `{retry_backoff_factor}*(2 ^ ({number of failed retries} - 1))` ...seconds inbetween attempts. The backoff factor scales the rate at which we back off. Defaults to 0 (backoff disabled). Note that this attribute can only be set at object initialization. """ # These are also needed by OpenIdProxyClient self.useragent = useragent or 'Fedora BaseClient/%(version)s' % { 'version': __version__} self.base_url = base_url self.login_url = login_url or urljoin(self.base_url, '/login') self.debug = debug self.insecure = insecure self.openid_insecure = openid_insecure self.retries = retries self.timeout = timeout # These are specific to OpenIdBaseClient self.username = username self.cache_session = cache_session self.cache_lock = lockfile.FileLock(b_SESSION_FILE) # Make sure the database for storing the session cookies exists if cache_session: self._initialize_session_cache() # python-requests session. Holds onto cookies self._session = requests.session() # Also hold on to retry logic. # http://www.coglib.com/~icordasc/blog/2014/12/retries-in-requests.html server_errors = [500, 501, 502, 503, 504, 506, 507, 508, 509, 599] method_whitelist = Retry.DEFAULT_METHOD_WHITELIST.union(set(['POST'])) if retries is not None: prefixes = ['http://', 'https://'] for prefix in prefixes: self._session.mount(prefix, requests.adapters.HTTPAdapter( max_retries=Retry( total=retries, status_forcelist=server_errors, backoff_factor=retry_backoff_factor, method_whitelist=method_whitelist, ), )) # See if we have any cookies kicking around from a previous run self._load_cookies() def _initialize_session_cache(self): # Note -- fallback to returning None on any problems as this isn't # critical. It just makes it so that we don't have to ask the user # for their password over and over. if not os.path.isdir(b_SESSION_DIR): try: os.makedirs(b_SESSION_DIR, mode=0o750) except OSError as err: log.warning('Unable to create {file}: {error}'.format( file=b_SESSION_DIR, error=err)) self.cache_session = False return None @requires_login def _authed_post(self, url, params=None, data=None, **kwargs): """ Return the request object of a post query.""" response = self._session.post(url, params=params, data=data, **kwargs) return response @requires_login def _authed_get(self, url, params=None, data=None, **kwargs): """ Return the request object of a get query.""" response = self._session.get(url, params=params, data=data, **kwargs) return response def send_request(self, method, auth=False, verb='POST', **kwargs): """Make an HTTP request to a server method. The given method is called with any parameters set in req_params. If auth is True, then the request is made with an authenticated session cookie. :arg method: Method to call on the server. It's a url fragment that comes after the :attr:`base_url` set in :meth:`__init__`. :kwarg auth: If True perform auth to the server, else do not. :kwarg req_params: Extra parameters to send to the server. :kwarg file_params: dict of files where the key is the name of the file field used in the remote method and the value is the local path of the file to be uploaded. If you want to pass multiple files to a single file field, pass the paths as a list of paths. :kwarg verb: HTTP verb to use. GET and POST are currently supported. POST is the default. """ # Decide on the set of auth cookies to use method = absolute_url(self.base_url, method) self._authed_verb_dispatcher = {(False, 'POST'): self._session.post, (False, 'GET'): self._session.get, (True, 'POST'): self._authed_post, (True, 'GET'): self._authed_get} if 'timeout' not in kwargs: kwargs['timeout'] = self.timeout try: func = self._authed_verb_dispatcher[(auth, verb)] except KeyError: raise Exception('Unknown HTTP verb') try: output = func(method, **kwargs) except LoginRequiredError: raise AuthError() try: data = output.json() except ValueError as e: # The response wasn't JSON data raise ServerError( method, output.status_code, 'Error returned from' ' json module while processing %(url)s: %(err)s\n%(output)s' % { 'url': to_bytes(method), 'err': to_bytes(e), 'output': to_bytes(output.text), }) data = munchify(data) return data def login(self, username, password, otp=None): """ Open a session for the user. Log in the user with the specified username and password against the FAS OpenID server. :arg username: the FAS username of the user that wants to log in :arg password: the FAS password of the user that wants to log in :kwarg otp: currently unused. Eventually a way to send an otp to the API that the API can use. """ if not username: raise AuthError("Username may not be %r at login." % username) if not password: raise AuthError("Password required for login.") # It looks like we're really doing this. Let's make sure that we don't # collide various cookies, and clear every cookie we had up until now # for this service. self._session.cookies.clear() self._save_cookies() response = openid_login( session=self._session, login_url=self.login_url, username=username, password=password, otp=otp, openid_insecure=self.openid_insecure) self._save_cookies() return response @property def session_key(self): return "%s:%s" % (self.base_url, self.username or '') def has_cookies(self): return bool(self._session.cookies) def _load_cookies(self): if not self.cache_session: return try: check_file_permissions(b_SESSION_FILE, True) except UnsafeFileError as e: log.debug('Current sessions ignored: {}'.format(str(e))) return try: with self.cache_lock: with open(b_SESSION_FILE, 'rb') as f: data = json.loads(f.read(), encoding='utf-8') for key, value in data[self.session_key]: self._session.cookies[key] = value except KeyError: log.debug("No pre-existing session for %s" % self.session_key) except IOError: # The file doesn't exist, so create it. log.debug("Creating %s", b_SESSION_FILE) oldmask = os.umask(0o027) with open(b_SESSION_FILE, 'wb') as f: f.write(json.dumps({}).encode('utf-8')) os.umask(oldmask) def _save_cookies(self): if not self.cache_session: return with self.cache_lock: try: check_file_permissions(b_SESSION_FILE, True) with open(b_SESSION_FILE, 'rb') as f: data = json.loads(f.read(), encoding='utf-8') except UnsafeFileError as e: log.debug('Clearing sessions: {}'.format(str(e))) os.unlink(b_SESSION_FILE) data = {} except Exception: log.warn("Failed to open cookie cache before saving.") data = {} oldmask = os.umask(0o027) data[self.session_key] = self._session.cookies.items() with open(b_SESSION_FILE, 'wb') as f: f.write(json.dumps(data).encode('utf-8')) os.umask(oldmask) __all__ = ('OpenIdBaseClient', 'requires_login') python-fedora-0.10.0/fedora/client/fasproxy.py0000664000175000017500000002035113137632523023736 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2008-2009 Red Hat, Inc. # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # '''Implement a class that sets up threadsafe communication with the Fedora Account System .. moduleauthor:: Ricky Zhou .. moduleauthor:: Toshio Kuratomi .. versionadded:: 0.3.17 ''' from fedora.client import AuthError, AppError from fedora.client.proxyclient import ProxyClient from fedora import __version__ import logging log = logging.getLogger(__name__) class FasProxyClient(ProxyClient): '''A threadsafe client to the Fedora Account System.''' def __init__(self, base_url='https://admin.fedoraproject.org/accounts/', *args, **kwargs): '''A threadsafe client to the Fedora Account System. This class is optimized to proxy multiple users to the account system. ProxyClient is designed to be threadsafe so that code can instantiate one instance of the class and use it for multiple requests for different users from different threads. If you want something that can manage a single user's connection to the Account System then use fedora.client.AccountSystem instead. :kwargs base_url: Base of every URL used to contact the server. Defaults to the Fedora Project FAS instance. :kwargs useragent: useragent string to use. If not given, default to "FAS Proxy Client/VERSION" :kwarg session_name: name of the cookie to use with session handling :kwarg debug: If True, log debug information :kwarg insecure: If True, do not check server certificates against their CA's. This means that man-in-the-middle attacks are possible against the `BaseClient`. You might turn this option on for testing against a local version of a server with a self-signed certificate but it should be off in production. ''' if 'useragent' not in kwargs: kwargs['useragent'] = 'FAS Proxy Client/%s' % __version__ if 'session_as_cookie' in kwargs and kwargs['session_as_cookie']: # No need to allow this in FasProxyClient as it's deprecated in # ProxyClient raise TypeError('FasProxyClient() got an unexpected keyword' ' argument \'session_as_cookie\'') kwargs['session_as_cookie'] = False super(FasProxyClient, self).__init__(base_url, *args, **kwargs) def login(self, username, password): '''Login to the Account System :arg username: username to send to FAS :arg password: Password to verify the username with :returns: a tuple of the session id FAS has associated with the user and the user's account information. This is similar to what is returned by :meth:`fedora.client.proxyclient.ProxyClient.get_user_info` :raises AuthError: if the username and password do not work ''' return self.send_request( '/login', auth_params={'username': username, 'password': password} ) def logout(self, session_id): '''Logout of the Account System :arg session_id: a FAS session_id to remove from FAS ''' self.send_request('/logout', auth_params={'session_id': session_id}) def refresh_session(self, session_id): '''Try to refresh a session_id to prevent it from timing out :arg session_id: FAS session_id to refresh :returns: session_id that FAS has set now ''' return self.send_request('', auth_params={'session_id': session_id}) def verify_session(self, session_id): '''Verify that a session is active. :arg session_id: session_id to verify is currently associated with a logged in user :returns: True if the session_id is valid. False otherwise. ''' try: self.send_request('/home', auth_params={'session_id': session_id}) except AuthError: return False except: raise return True def verify_password(self, username, password): '''Return whether the username and password pair are valid. :arg username: username to try authenticating :arg password: password for the user :returns: True if the username/password are valid. False otherwise. ''' try: self.send_request('/home', auth_params={'username': username, 'password': password}) except AuthError: return False except: raise return True def get_user_info(self, auth_params): '''Retrieve information about a logged in user. :arg auth_params: Auth information for a particular user. For instance, this can be a username/password pair or a session_id. Refer to :meth:`fedora.client.proxyclient.ProxyClient.send_request` for all the legal values for this. :returns: a tuple of session_id and information about the user. :raises AuthError: if the auth_params do not give access ''' request = self.send_request('/user/view', auth_params=auth_params) return (request[0], request[1]['person']) def person_by_id(self, person_id, auth_params): '''Retrieve information about a particular person :arg auth_params: Auth information for a particular user. For instance, this can be a username/password pair or a session_id. Refer to :meth:`fedora.client.proxyclient.ProxyClient.send_request` for all the legal values for this. :returns: a tuple of session_id and information about the user. :raises AppError: if the server returns an exception :raises AuthError: if the auth_params do not give access ''' request = self.send_request('/json/person_by_id', req_params={'person_id': person_id}, auth_params=auth_params) if request[1]['success']: # In a devel version of FAS, membership info was returned # separately # This has been corrected in a later version # Can remove this code at some point if 'approved' in request[1]: request[1]['person']['approved_memberships'] = \ request[1]['approved'] if 'unapproved' in request[1]: request[1]['person']['unapproved_memberships'] = \ request[1]['unapproved'] return (request[0], request[1]['person']) else: raise AppError(name='Generic AppError', message=request[1]['tg_flash']) def group_list(self, auth_params): '''Retrieve a list of groups :arg auth_params: Auth information for a particular user. For instance, this can be a username/password pair or a session_id. Refer to :meth:`fedora.client.proxyclient.ProxyClient.send_request` for all the legal values for this. :returns: a tuple of session_id and information about groups. The groups information is in two fields: :groups: contains information about each group :memberships: contains information about which users are members of which groups :raises AuthError: if the auth_params do not give access ''' request = self.send_request('/group/list', auth_params=auth_params) return request python-fedora-0.10.0/fedora/client/fas2.py0000664000175000017500000011305113234573627022725 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2008-2012 Ricky Zhou, Red Hat, Inc. # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # ''' Provide a client module for talking to the Fedora Account System. .. moduleauthor:: Ricky Zhou .. moduleauthor:: Toshio Kuratomi .. moduleauthor:: Ralph Bean ''' from hashlib import md5 import itertools import warnings from munch import Munch from kitchen.text.converters import to_bytes from six.moves.urllib.parse import quote, urlencode try: import libravatar except ImportError: libravatar = None from fedora.client import ( AppError, BaseClient, FasProxyClient, FedoraClientError, FedoraServiceError ) from fedora import __version__ ### FIXME: To merge: # /usr/bin/fasClient from fas # API from Will Woods # API from MyFedora class FASError(FedoraClientError): '''FAS Error''' pass class CLAError(FASError): '''CLA Error''' pass USERFIELDS = [ 'affiliation', 'bugzilla_email', 'certificate_serial', 'comments', 'country_code', 'creation', 'email', 'emailtoken', 'facsimile', 'gpg_keyid', 'human_name', 'id', 'internal_comments', 'ircnick', 'latitude', 'last_seen', 'longitude', 'password', 'password_changed', 'passwordtoken', 'postal_address', 'privacy', 'locale', 'ssh_key', 'status', 'status_change', 'telephone', 'unverified_email', 'timezone', 'username', 'security_question', 'security_answer', ] class AccountSystem(BaseClient): '''An object for querying the Fedora Account System. The Account System object provides a python API for talking to the Fedora Account System. It abstracts the http requests, cookie handling, and other details so you can concentrate on the methods that are important to your program. .. warning:: If your code is trying to use the AccountSystem object to connect to fas for multiple users you probably want to use :class:`~fedora.client.FasProxyClient` instead. If your code is trying to reuse a single instance of AccountSystem for multiple users you *definitely* want to use :class:`~fedora.client.FasProxyClient` instead. Using AccountSystem in these cases may result in a user being logged in as a different user. (This may be the case even if you instantiate a new AccountSystem object for each user if :attr:cache_session: is True since that creates a file on the file system that can end up loading session credentials for the wrong person. .. versionchanged:: 0.3.26 Added :meth:`~fedora.client.AccountSystem.gravatar_url` that returns a url to a gravatar for a user. .. versionchanged:: 0.3.33 Renamed :meth:`~fedora.client.AccountSystem.gravatar_url` to :meth:`~fedora.client.AccountSystem.avatar_url`. ''' # proxy is a thread-safe connection to the fas server for verifying # passwords of other users proxy = None # size that we allow to request from remote avatar providers. _valid_avatar_sizes = (32, 64, 140) # URLs for remote avatar providers. _valid_avatar_services = ['libravatar', 'gravatar'] def __init__(self, base_url='https://admin.fedoraproject.org/accounts/', *args, **kwargs): '''Create the AccountSystem client object. :kwargs base_url: Base of every URL used to contact the server. Defaults to the Fedora Project FAS instance. :kwargs useragent: useragent string to use. If not given, default to "Fedora Account System Client/VERSION" :kwargs debug: If True, log debug information :kwargs username: username for establishing authenticated connections :kwargs password: password to use with authenticated connections :kwargs session_cookie: **Deprecated** Use session_id instead. User's session_cookie to connect to the server :kwargs session_id: user's session_id to connect to the server :kwargs cache_session: if set to true, cache the user's session cookie on the filesystem between runs. ''' if 'useragent' not in kwargs: kwargs['useragent'] = \ 'Fedora Account System Client/%s' % __version__ super(AccountSystem, self).__init__(base_url, *args, **kwargs) # We need a single proxy for the class to verify username/passwords # against. if not self.proxy: self.proxy = FasProxyClient(base_url, useragent=self.useragent, session_as_cookie=False, debug=self.debug, insecure=self.insecure) # Preseed a list of FAS accounts with bugzilla addresses # This allows us to specify a different email for bugzilla than is # in the FAS db. It is a hack, however, until FAS has a field for the # bugzilla address. self.__bugzilla_email = { # Konstantin Ryabitsev: mricon@gmail.com 100029: 'icon@fedoraproject.org', # Sean Reifschneider: jafo@tummy.com 100488: 'jafo-redhat@tummy.com', # Karen Pease: karen-pease@uiowa.edu 100281: 'meme@daughtersoftiresias.org', # Robert Scheck: redhat@linuxnetz.de 100093: 'redhat-bugzilla@linuxnetz.de', # Scott Bakers: bakers@web-ster.com 100881: 'scott@perturb.org', # Colin Charles: byte@aeon.com.my 100014: 'byte@fedoraproject.org', # W. Michael Petullo: mike@flyn.org 100136: 'redhat@flyn.org', # Elliot Lee: sopwith+fedora@gmail.com 100060: 'sopwith@redhat.com', # Control Center Team: Bugzilla user but email doesn't exist 9908: 'control-center-maint@redhat.com', # Máirín Duffy 100548: 'duffy@redhat.com', # Muray McAllister: murray.mcallister@gmail.com 102321: 'mmcallis@redhat.com', # William Jon McCann: mccann@jhu.edu 102489: 'jmccann@redhat.com', # Matt Domsch's rebuild script -- bz email goes to /dev/null 103590: 'ftbfs@fedoraproject.org', # Sindre Pedersen Bjørdal: foolish@guezz.net 100460: 'sindrepb@fedoraproject.org', # Jesus M. Rodriguez: jmrodri@gmail.com 102180: 'jesusr@redhat.com', # Roozbeh Pournader: roozbeh@farsiweb.info 100350: 'roozbeh@gmail.com', # Michael DeHaan: michael.dehaan@gmail.com 100603: 'mdehaan@redhat.com', # Sebastian Gosenheimer: sgosenheimer@googlemail.com 103647: 'sebastian.gosenheimer@proio.com', # Ben Konrath: bkonrath@redhat.com 101156: 'ben@bagu.org', # Kai Engert: kaie@redhat.com 100399: 'kengert@redhat.com', # William Jon McCann: william.jon.mccann@gmail.com 102952: 'jmccann@redhat.com', # Simon Wesp: simon@w3sp.de 109464: 'cassmodiah@fedoraproject.org', # Robert M. Albrecht: romal@gmx.de 101475: 'mail@romal.de', # Davide Cescato: davide.cescato@iaeste.ch 123204: 'ceski@fedoraproject.org', # Nick Bebout: nick@bebout.net 101458: 'nb@fedoraproject.org', # Niels Haase: haase.niels@gmail.com 126862: 'arxs@fedoraproject.org', # Thomas Janssen: th.p.janssen@googlemail.com 103110: 'thomasj@fedoraproject.org', # Michael J Gruber: 'michaeljgruber+fedoraproject@gmail.com' 105113: 'mjg@fedoraproject.org', # Juan Manuel Rodriguez Moreno: 'nushio@gmail.com' 101302: 'nushio@fedoraproject.org', # Andrew Cagney: 'andrew.cagney@gmail.com' 102169: 'cagney@fedoraproject.org', # Jeremy Katz: 'jeremy@katzbox.net' 100036: 'katzj@fedoraproject.org', # Dominic Hopf: 'dmaphy@gmail.com' 124904: 'dmaphy@fedoraproject.org', # Christoph Wickert: 'christoph.wickert@googlemail.com': 100271: 'cwickert@fedoraproject.org', # Elliott Baron: 'elliottbaron@gmail.com' 106760: 'ebaron@fedoraproject.org', # Thomas Spura: 'spurath@students.uni-mainz.de' 111433: 'tomspur@fedoraproject.org', # Adam Miller: 'maxamillion@gmail.com' 110673: 'admiller@redhat.com', # Garrett Holmstrom: 'garrett.holmstrom@gmail.com' 131739: 'gholms@fedoraproject.org', # Tareq Al Jurf: taljurf.fedora@gmail.com 109863: 'taljurf@fedoraproject.org', # Josh Kayse: jokajak@gmail.com 148243: 'jokajak@fedoraproject.org', # Behdad Esfahbod: fedora@behdad.org 100102: 'behdad@fedoraproject.org', # Daniel Bruno: danielbrunos@gmail.com 101608: 'dbruno@fedoraproject.org', # Beth Lynn Eicher: bethlynneicher@gmail.com 148706: 'bethlynn@fedoraproject.org', # Andre Robatino: andre.robatino@verizon.net 114970: 'robatino@fedoraproject.org', # Jeff Sheltren: jeff@tag1consulting.com 100058: 'sheltren@fedoraproject.org', # Josh Boyer: jwboyer@gmail.com 100115: 'jwboyer@redhat.com', # Matthew Miller: mattdm@mattdm.org 100042: 'mattdm@redhat.com', # Jamie Nguyen: j@jamielinux.com 160587: 'jamielinux@fedoraproject.org', # Nikos Roussos: nikos@roussos.cc 144436: 'comzeradd@fedoraproject.org', # Benedikt Schäfer: benedikt@schaefer-flieden.de 154726: 'ib54003@fedoraproject.org', # Ricky Elrod: codeblock@elrod.me 139137: 'relrod@redhat.com', # David Xie: david.scriptfan@gmail.com 167133: 'davidx@fedoraproject.org', # Felix Schwarz: felix.schwarz@oss.schwarz.eu 103551: 'fschwarz@fedoraproject.org', # Martin Holec: martix@martix.names 137561: 'mholec@redhat.com', # John Dulaney: j_dulaney@live.com 149140: 'jdulaney@fedoraproject.org', # Niels de Vos: niels@nixpanic.net 102792: 'ndevos@redhat.com', # Shawn Wells: shawn@redhat.com 156515: 'swells@redhat.com', # Christopher Tubbs: ctubbsii+fedora@gmail.com 160404: 'ctubbsii@fedoraproject.org', # Björn Esser: bjoern.esser@gmail.com 163460: 'besser82@fedoraproject.org', # Amit Shah: amit@amitshah.net 115389: 'amitshah@fedoraproject.org', # Mark Wielard: fedora@wildebeest.org 102697: 'mjw@fedoraproject.org', # Benjamin Lefoul: benjamin.lefoul@nwise.se 189661: 'lef@fedoraproject.org', # Mike Ruckman: roshi@mykolab.com 172063: 'roshi@fedoraproject.org', } # A few people have an email account that is used in owners.list but # have setup a bugzilla account for their primary account system email # address now. Map these here. self.__alternate_email = { # Damien Durand: splinux25@gmail.com 'splinux@fedoraproject.org': 100406, # Kevin Fenzi: kevin@tummy.com 'kevin-redhat-bugzilla@tummy.com': 100037, } for bugzilla_map in self.__bugzilla_email.items(): self.__alternate_email[bugzilla_map[1]] = bugzilla_map[0] # We use the two mappings as follows:: # When looking up a user by email, use __alternate_email. # When looking up a bugzilla email address use __bugzilla_email. # # This allows us to parse in owners.list and have a value for all the # emails in there while not using the alternate email unless it is # the only option. # TODO: Use exceptions properly ### Set insecure properly ### # When setting insecure, we have to set it both on ourselves and on # self.proxy def _get_insecure(self): return self._insecure def _set_insecure(self, insecure): self._insecure = insecure self.proxy = FasProxyClient(self.base_url, useragent=self.useragent, session_as_cookie=False, debug=self.debug, insecure=insecure) return insecure #: If this attribute is set to True, do not check server certificates #: against their CA's. This means that man-in-the-middle attacks are #: possible. You might turn this option on for testing against a local #: version of a server with a self-signed certificate but it should be off #: in production. insecure = property(_get_insecure, _set_insecure) ### Groups ### def create_group(self, name, display_name, owner, group_type, invite_only=0, needs_sponsor=0, user_can_remove=1, prerequisite='', joinmsg='', apply_rules='None'): '''Creates a FAS group. :arg name: The short group name (alphanumeric only). :arg display_name: A longer version of the group's name. :arg owner: The username of the FAS account which owns the new group. :arg group_type: The kind of group being created. Current valid options are git, svn, hg, shell, and tracking. :kwarg invite_only: Users must be invited to the group, they cannot join on their own. :kwarg needs_sponsor: Users must be sponsored into the group. :kwarg user_can_remove: Users can remove themselves from the group. :kwarg prerequisite: Users must be in the given group (string) before they can join the new group. :kwarg joinmsg: A message shown to users when they apply to the group. :kwarg apply_rules: Rules for applying to the group, shown to users before they apply. :rtype: :obj:`munch.Munch` :returns: A Munch containing information about the group that was created. .. versionadded:: 0.3.29 ''' req_params = { 'invite_only': invite_only, 'needs_sponsor': needs_sponsor, 'user_can_remove': user_can_remove, 'prerequisite': prerequisite, 'joinmsg': joinmsg, 'apply_rules': apply_rules } request = self.send_request( '/group/create/%s/%s/%s/%s' % ( quote(name), quote(display_name), quote(owner), quote(group_type)), req_params=req_params, auth=True ) return request def group_by_id(self, group_id): '''Returns a group object based on its id''' params = {'group_id': int(group_id)} request = self.send_request( 'json/group_by_id', auth=True, req_params=params ) if request['success']: return request['group'] else: return dict() def group_by_name(self, groupname): '''Returns a group object based on its name''' params = {'groupname': groupname} request = self.send_request( 'json/group_by_name', auth=True, req_params=params ) if request['success']: return request['group'] else: raise AppError( message='FAS server unable to retrieve group' ' %(group)s' % {'group': to_bytes(groupname)}, name='FASError') def group_members(self, groupname): '''Return a list of people approved for a group. This method returns a list of people who are in the requested group. The people are all approved in the group. Unapproved people are not shown. The format of data is:: \[{'username': 'person1', 'role_type': 'user'}, \{'username': 'person2', 'role_type': 'sponsor'}] role_type can be one of 'user', 'sponsor', or 'administrator'. .. versionadded:: 0.3.2 .. versionchanged:: 0.3.21 Return a Bunch instead of a DictContainer ''' request = self.send_request('/group/dump/%s' % quote(groupname), auth=True) return [Munch(username=user[0], role_type=user[3]) for user in request['people']] ### People ### def person_by_id(self, person_id): '''Returns a person object based on its id''' person_id = int(person_id) params = {'person_id': person_id} request = self.send_request('json/person_by_id', auth=True, req_params=params) if request['success']: if person_id in self.__bugzilla_email: request['person']['bugzilla_email'] = \ self.__bugzilla_email[person_id] else: request['person']['bugzilla_email'] = \ request['person']['email'] # In a devel version of FAS, membership info was returned # separately # This was later corrected (can remove this code at some point) if 'approved' in request: request['person']['approved_memberships'] = request['approved'] if 'unapproved' in request: request['person']['unapproved_memberships'] = \ request['unapproved'] return request['person'] else: return dict() def person_by_username(self, username): '''Returns a person object based on its username''' params = {'username': username} request = self.send_request( 'json/person_by_username', auth=True, req_params=params) if request['success']: person = request['person'] if person['id'] in self.__bugzilla_email: person['bugzilla_email'] = self.__bugzilla_email[person['id']] else: person['bugzilla_email'] = person['email'] # In a devel version of FAS, membership info was returned # separately # This was later corrected (can remove this code at some point) if 'approved' in request: request['person']['approved_memberships'] = request['approved'] if 'unapproved' in request: request['person']['unapproved_memberships'] = \ request['unapproved'] return person else: return dict() def avatar_url(self, username, size=64, default=None, lookup_email=True, service=None): ''' Returns a URL to an avatar for a given username. Avatars are drawn from third party services. :arg username: FAS username to construct a avatar url for :kwarg size: size of the avatar. Allowed sizes are 32, 64, 140. Default: 64 :kwarg default: If the service does not have a avatar image for the email address, this url is returned instead. Default: the fedora logo at the specified size. :kwarg lookup_email: If true, use the email from FAS for gravatar.com lookups, otherwise just append @fedoraproject.org to the username. For libravatar.org lookups, this is ignored. The openid identifier of the user is used instead. Note that gravatar.com lookups will be much slower if lookup_email is set to True since we'd have to make a query against FAS itself. :kwarg service: One of 'libravatar' or 'gravatar'. Default: 'libravatar'. :raises ValueError: if the size parameter is not allowed or if the service is not one of 'libravatar' or 'gravatar' :rtype: :obj:`str` :returns: url of a avatar for the user If that user has no avatar entry, instruct the remote service to redirect us to the Fedora logo. If that user has no email attribute, then make a fake request to the third party service. .. versionadded:: 0.3.26 .. versionchanged: 0.3.30 Add lookup_email parameter to control whether we generate avatar urls with the email in fas or username@fedoraproject.org .. versionchanged: 0.3.33 Renamed from `gravatar_url` to `avatar_url` .. versionchanged: 0.3.34 Updated libravatar to use the user's openid identifier. ''' if size not in self._valid_avatar_sizes: raise ValueError( 'Size %(size)i disallowed. Must be in %(valid_sizes)r' % { 'size': size, 'valid_sizes': self._valid_avatar_sizes } ) # If our caller explicitly requested libravatar but they don't have # it installed, then we need to raise a nice error and let them know. if service == 'libravatar' and not libravatar: raise ValueError("Install python-pylibravatar if you want to " "use libravatar as an avatar provider.") # If our caller didn't specify a service, let's pick a one for them. # If they have pylibravatar installed, then by all means let freedom # ring! Otherwise, we'll use gravatar.com if we have to. if not service: if libravatar: service = 'libravatar' else: service = 'gravatar' # Just double check to make sure they didn't pass us a bogus service. if service not in self._valid_avatar_services: raise ValueError( 'Service %(service)r disallowed. ' 'Must be in %(valid_services)r' % { 'service': service, 'valid_services': self._valid_avatar_services } ) if not default: default = "http://fedoraproject.org/static/images/" + \ "fedora_infinity_%ix%i.png" % (size, size) if service == 'libravatar': openid = 'http://%s.id.fedoraproject.org/' % username return libravatar.libravatar_url( openid=openid, size=size, default=default, ) else: if lookup_email: person = self.person_by_username(username) email = person.get('email', 'no_email') else: email = "%s@fedoraproject.org" % username query_string = urlencode({ 's': size, 'd': default, }) hash = md5(email.encode("utf-8")).hexdigest() return "http://www.gravatar.com/avatar/%s?%s" % ( hash, query_string) def gravatar_url(self, *args, **kwargs): """ *Deprecated* - Use avatar_url. .. versionadded:: 0.3.26 .. versionchanged: 0.3.30 Add lookup_email parameter to control whether we generate gravatar urls with the email in fas or username@fedoraproject.org .. versionchanged: 0.3.33 Deprecated in favor of `avatar_url`. """ warnings.warn( "gravatar_url is deprecated and will be removed in" " a future version. Please port your code to use avatar_url(...," " service='libravatar', ...) instead", DeprecationWarning, stacklevel=2) if 'service' in kwargs: raise TypeError("'service' is an invalid keyword argument for" " this function. Use avatar_url() instead)") return self.avatar_url(*args, service='gravatar', **kwargs) def user_id(self): '''Returns a dict relating user IDs to usernames''' request = self.send_request('json/user_id', auth=True) people = {} for person_id, username in request['people'].items(): # change userids from string back to integer people[int(person_id)] = username return people def people_by_key(self, key=u'username', search=u'*', fields=None): '''Return a dict of people For example: >>> ret_val = FASCLIENT.people_by_key( ... key='email', search='toshio*', fields=['id']) >>> ret_val.keys() a.badger@[...].com a.badger+test1@[...].com a.badger+test2@[...].com >>> ret_val.values() 100068 102023 102434 :kwarg key: Key used to organize the returned dictionary. Valid values are 'id', 'username', or 'email'. Default is 'username'. :kwarg search: Pattern to match usernames against. Defaults to the '*' wildcard which matches everyone. :kwarg fields: Limit the data returned to a specific list of fields. The default is to retrieve all fields. Valid fields are: * affiliation * alias_enabled * bugzilla_email * certificate_serial * comments * country_code * creation * email * emailtoken * facsimile * gpg_keyid * group_roles * human_name * id * internal_comments * ircnick * last_seen * latitude * locale * longitude * memberships * old_password * password * password_changed * passwordtoken * postal_address * privacy * roles * ssh_key * status * status_change * telephone * timezone * unverified_email * username Note that for most users who access this data, many of these fields will be set to None due to security or privacy settings. :returns: a dict relating the key value to the fields. .. versionchanged:: 0.3.21 Return a Bunch instead of a DictContainer .. versionchanged:: 0.3.26 Fixed to return a list with both people who have signed the CLA and have not ''' # Make sure we have a valid key value if key not in ('id', 'username', 'email'): raise KeyError('key must be one of "id", "username", or' ' "email"') if fields: fields = list(fields) for field in fields: if field not in USERFIELDS: raise KeyError('%(field)s is not a valid field to' ' filter' % {'field': to_bytes(field)}) else: fields = USERFIELDS # Make sure we retrieve the key value unrequested_fields = [] if key not in fields: unrequested_fields.append(key) fields.append(key) if 'bugzilla_email' in fields: # Need id and email for the bugzilla information if 'id' not in fields: unrequested_fields.append('id') fields.append('id') if 'email' not in fields: unrequested_fields.append('email') fields.append('email') request = self.send_request( '/user/list', req_params={ 'search': search, 'fields': [f for f in fields if f != 'bugzilla_email'] }, auth=True) people = Munch() for person in itertools.chain(request['people'], request['unapproved_people']): # Retrieve bugzilla_email from our list if necessary if 'bugzilla_email' in fields: if person['id'] in self.__bugzilla_email: person['bugzilla_email'] = \ self.__bugzilla_email[person['id']] else: person['bugzilla_email'] = person['email'] person_key = person[key] # Remove any fields that weren't requested by the user if unrequested_fields: for field in unrequested_fields: del person[field] # Add the person record to the people dict people[person_key] = person return people def people_by_id(self): '''*Deprecated* Use people_by_key() instead. Returns a dict relating user IDs to human_name, email, username, and bugzilla email .. versionchanged:: 0.3.21 Return a Bunch instead of a DictContainer ''' warnings.warn( "people_by_id() is deprecated and will be removed in" " 0.4. Please port your code to use people_by_key(key='id'," " fields=['human_name', 'email', 'username', 'bugzilla_email'])" " instead", DeprecationWarning, stacklevel=2) request = self.send_request('/json/user_id', auth=True) user_to_id = {} people = Munch() for person_id, username in request['people'].items(): person_id = int(person_id) # change userids from string back to integer people[person_id] = {'username': username, 'id': person_id} user_to_id[username] = person_id # Retrieve further useful information about the users request = self.send_request('/group/dump', auth=True) for user in request['people']: userid = user_to_id[user[0]] person = people[userid] person['email'] = user[1] person['human_name'] = user[2] if userid in self.__bugzilla_email: person['bugzilla_email'] = self.__bugzilla_email[userid] else: person['bugzilla_email'] = person['email'] return people ### Utils ### def people_by_groupname(self, groupname): '''Return a list of persons for the given groupname. :arg groupname: Name of the group to look up :returns: A list of person objects from the group. If the group contains no entries, then an empty list is returned. ''' people = self.people_by_id() group = dict(self.group_by_name(groupname)) userids = [user[u'person_id'] for user in group[u'approved_roles'] + group[u'unapproved_roles']] return [people[userid] for userid in userids] ### Configs ### def get_config(self, username, application, attribute): '''Return the config entry for the key values. :arg username: Username of the person :arg application: Application for which the config is set :arg attribute: Attribute key to lookup :raises AppError: if the server returns an exception :returns: The unicode string that describes the value. If no entry matched the username, application, and attribute then None is returned. ''' request = self.send_request('config/list/%s/%s/%s' % (username, application, attribute), auth=True) if 'exc' in request: raise AppError( name=request['exc'], message=request['tg_flash'] ) # Return the value if it exists, else None. if 'configs' in request and attribute in request['configs']: return request['configs'][attribute] return None def get_configs_like(self, username, application, pattern=u'*'): '''Return the config entries that match the keys and the pattern. Note: authentication on the server will prevent anyone but the user or a fas admin from viewing or changing their configs. :arg username: Username of the person :arg application: Application for which the config is set :kwarg pattern: A pattern to select values for. This accepts * as a wildcard character. Default='*' :raises AppError: if the server returns an exception :returns: A dict mapping ``attribute`` to ``value``. ''' request = self.send_request( 'config/list/%s/%s/%s' % (username, application, pattern), auth=True) if 'exc' in request: raise AppError( name=request['exc'], message=request['tg_flash']) return request['configs'] def set_config(self, username, application, attribute, value): '''Set a config entry in FAS for the user. Note: authentication on the server will prevent anyone but the user or a fas admin from viewing or changing their configs. :arg username: Username of the person :arg application: Application for which the config is set :arg attribute: The name of the config key that we're setting :arg value: The value to set this to :raises AppError: if the server returns an exception ''' request = self.send_request( 'config/set/%s/%s/%s' % (username, application, attribute), req_params={'value': value}, auth=True) if 'exc' in request: raise AppError( name=request['exc'], message=request['tg_flash']) def people_query(self, constraints=None, columns=None): '''Returns a list of dicts representing database rows :arg constraints: A dictionary specifying WHERE constraints on columns :arg columns: A list of columns to be selected in the query :raises AppError: if the query failed on the server (most likely because the server was given a bad query) :returns: A list of dicts representing database rows (the keys of the dict are the columns requested) .. versionadded:: 0.3.12.1 ''' if constraints is None: constraints = {} if columns is None: columns = [] req_params = {} req_params.update(constraints) req_params['columns'] = ','.join(columns) try: request = self.send_request( 'json/people_query', req_params=req_params, auth=True) if request['success']: return request['data'] else: raise AppError(message=request['error'], name='FASError') except FedoraServiceError: raise ### Certs ### def user_gencert(self): '''Generate a cert for a user''' try: request = self.send_request('user/dogencert', auth=True) except FedoraServiceError: raise if not request['cla']: raise CLAError return "%(cert)s\n%(key)s" % request ### Passwords ### def verify_password(self, username, password): '''Return whether the username and password pair are valid. :arg username: username to try authenticating :arg password: password for the user :returns: True if the username/password are valid. False otherwise. ''' return self.proxy.verify_password(username, password) ### fasClient Special Methods ### def group_data(self, force_refresh=None): '''Return administrators/sponsors/users and group type for all groups :arg force_refresh: If true, the returned data will be queried from the database, as opposed to memcached. :raises AppError: if the query failed on the server :returns: A dict mapping group names to the group type and the user IDs of the administrator, sponsors, and users of the group. .. versionadded:: 0.3.8 ''' params = {} if force_refresh: params['force_refresh'] = True try: request = self.send_request( 'json/fas_client/group_data', req_params=params, auth=True) if request['success']: return request['data'] else: raise AppError( message='FAS server unable to retrieve' ' group members', name='FASError') except FedoraServiceError: raise def user_data(self): '''Return user data for all users in FAS Note: If the user is not authorized to see password hashes, '*' is returned for the hash. :raises AppError: if the query failed on the server :returns: A dict mapping user IDs to a username, password hash, SSH public key, email address, and status. .. versionadded:: 0.3.8 ''' try: request = self.send_request('json/fas_client/user_data', auth=True) if request['success']: return request['data'] else: raise AppError( message='FAS server unable to retrieve user' ' information', name='FASError') except FedoraServiceError: raise python-fedora-0.10.0/fedora/tg2/0000775000175000017500000000000013234574425020732 5ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/fedora/tg2/utils.py0000664000175000017500000002061713137632523022446 0ustar puiterwijkpuiterwijk00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2009-2011 Red Hat, Inc. # This file is part of python-fedora # # python-fedora is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # python-fedora is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with python-fedora; if not, see # ''' Miscellaneous functions of use on a TurboGears 2 Server .. versionadded:: 0.3.17 .. versionchanged:: 0.3.25 Moved from fedora.tg.tg2utils Modified fedora_template to allow dotted lookup .. moduleauthor:: Toshio Kuratomi ''' from copy import copy from hashlib import sha1 import logging import os from munch import Munch from kitchen.text.converters import to_unicode import pkg_resources from repoze.what.plugins.pylonshq import booleanize_predicates import tg from tg import config from fedora.wsgi.faswho import make_faswho_middleware from fedora.urlutils import update_qs tg_url = tg.url ### FIXME: Need jsonify_validation_errors, json_or_redirect, request_format # To have all of the functions that exist for TG1 def url(*args, **kwargs): '''Compute URL This is a replacement for :func:`tg.controllers.url` (aka :func:`tg.url` in the template). In addition to the functionality that :func:`tg.url` provides, it adds a token to prevent :term:`CSRF` attacks. The arguments and return value are the same as for :func:`tg.url` The original :func:`tg.url` is accessible as :func:`fedora.tg2.utils.tg_url` .. versionadded:: 0.3.17 Added to enable :ref:`CSRF-Protection` for TG2 ''' new_url = tg_url(*args, **kwargs) # Set the current _csrf_token on the url. It will overwrite any current # _csrf_token csrf_token = None identity = tg.request.environ.get('repoze.who.identity') if identity: csrf_token = identity.get('_csrf_token', None) else: session_id = tg.request.environ.get('CSRF_AUTH_SESSION_ID') if session_id: csrf_token = sha1(session_id).hexdigest() if csrf_token: new_url = update_qs(new_url, {'_csrf_token': csrf_token}, overwrite=True) return new_url def fedora_template(template, template_type='mako', dotted_lookup=True): '''Function to return the path to a template. :arg template: filename of the template itself. Ex: login.mak :kwarg template_type: template language we need the template written in Defaults to 'mako' :kwarg dotted_lookup: if True, return the resource as a dotted module path If False, return the resource as a filename. Default: True :returns: filesystem path or dotted module path equivalent to the template .. versionchanged:: 0.3.25 Added dotted_lookup Made this work with tg2 ''' # :E1101: pkg_resources does have resource_filename # pylint: disable-msg=E1101 resource = pkg_resources.resource_filename( 'fedora', os.path.join('tg2', 'templates', template_type, template) ) # pylint: enable-msg=E1101 if dotted_lookup: # Find the location of the base resource (fedora) base = pkg_resources.resource_filename('fedora', '') if resource.startswith(base): # subtract that from the resource resource = resource[len(base):] if resource[0] == '/': resource = 'fedora%s' % resource else: resource = 'fedora/%s' % resource # Strip the filename extension resource = os.path.splitext(resource)[0] # Turn '/' into '.' resource = to_unicode(resource) resource = resource.translate({ord(u'/'): u'.'}) return resource def add_fas_auth_middleware(self, app, *args): ''' Add our FAS authentication middleware. This is a convenience method that sets up the FAS authentication middleware. It needs to be used in :file:`app/config/app_cfg.py` like this: .. code-block:: diff from myapp import model from myapp.lib import app_globals, helpers. -base_config = AppConfig() +from fedora.tg2.utils import add_fas_auth_middleware + +class MyAppConfig(AppConfig): + add_auth_middleware = add_fas_auth_middleware + +base_config = MyAppConfig() + base_config.renderers = [] base_config.package = myapp The configuration of the faswho middleware is done via attributes on MyAppConfig. For instance, to change the base url for the FAS server to be authenticated against, set the connection to insecure for testing, and the url of the login form, do this:: from munch import Munch class MyAppConfig(AppConfig): fas_auth = Munch( fas_url='https://fakefas.fedoraproject.org/accounts', insecure=True, login_form_url='/alternate/login') add_auth_middleware = add_fas_auth_middleware The complete set of values that can be set in :attr:`fas_auth` is the same as the parameters that can be passed to :func:`fedora.wsgi.faswho.faswhoplugin.make_faswho_middleware` ''' # Set up csrf protection enable_csrf() booleanize_predicates() if not hasattr(self, 'fas_auth'): self.fas_auth = Munch() # Configuring auth logging: if 'log_stream' not in self.fas_auth: self.fas_auth['log_stream'] = logging.getLogger('auth') # Pull in some of the default auth arguments auth_args = copy(self.fas_auth) app = make_faswho_middleware(app, **auth_args) return app def enable_csrf(): '''A startup function to setup :ref:`CSRF-Protection`. This should be run at application startup. It does three things: 1) overrides the :func:`tg.url` function with :func:`fedora.tg2.utils.url` so that :term:`CSRF` tokens are appended to URLs. 2) tells the TG2 app to ignore `_csrf_token`. This lets the app know not to throw an error if the variable is passed through to the app. 3) adds :func:`fedora.tg.fedora_template` function to the template variables. This lets us xi:include templates from python-fedora in our templates. Presently, this is run when the faswho middleware is invoked. See the documentation for :func:`fedora.tg.tgutils.add_fas_auth_middleware` for how to enable that. .. note:: The following code is broken at least as late as :term:`TurboGears`-2.0.3. We need to have something similar in order to use CSRF protection with applications that do not always want to rely on FAS to authenticate. .. seealso:: http://trac.turbogears.org/ticket/2432 To run this at application startup, add code like the following to :file:`MYAPP/config/app_config.py`:: from fedora.tg2.utils import enable_csrf base_config.call_on_startup = [enable_csrf] If we can get the :ref:`CSRF-Protection` into upstream :term:`TurboGears`, we might be able to remove this in the future. .. versionadded:: 0.3.17 Added to enable :ref:`CSRF-Protection` ''' # Override the tg.url function with our own tg.url = url tg.controllers.url = url try: # TG-2.1+ tg.controllers.util.url = url except AttributeError: # TG-2.0.x pass # Ignore the _csrf_token parameter ignore = config.get('ignore_parameters', []) if '_csrf_token' not in ignore: ignore.append('_csrf_token') config['ignore_parameters'] = ignore # Add a function to the template tg stdvars that looks up a template. var_provider = config.get('variable_provider', None) if var_provider: config['variable_provider'] = lambda: \ var_provider().update({'fedora_template': fedora_template}) else: config['variable_provider'] = lambda: {'fedora_template': fedora_template} __all__ = ('add_fas_auth_middleware', 'enable_csrf', 'fedora_template', 'tg_url', 'url') python-fedora-0.10.0/fedora/tg2/__init__.py0000664000175000017500000000014013137632523023032 0ustar puiterwijkpuiterwijk00000000000000''' Functions and classes to help build a Fedora Service. ''' __all__ = ('templates', 'utils') python-fedora-0.10.0/fedora/tg2/templates/0000775000175000017500000000000013234574425022730 5ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/fedora/tg2/templates/genshi/0000775000175000017500000000000013234574425024205 5ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/fedora/tg2/templates/genshi/login.html0000664000175000017500000001010613137632523026175 0ustar puiterwijkpuiterwijk00000000000000
  • ${_('Welcome')}
  • ${_('You are not logged in')}
  • ${_('CSRF protected')}
  • python-fedora-0.10.0/fedora/tg2/templates/genshi/jsglobals.html0000664000175000017500000000202713137632523027050 0ustar puiterwijkpuiterwijk00000000000000 python-fedora-0.10.0/fedora/tg2/templates/genshi/__init__.py0000664000175000017500000000633113137632523026315 0ustar puiterwijkpuiterwijk00000000000000''' Genshi version of templates to make adding certain Fedora widgets easier. --------------------------------------------- :mod:`fedora.tg2.templates.genshi.login.html` --------------------------------------------- .. module:: fedora.tg2.templates.genshi.login.html :synopsis: Templates related to logging in and out. .. moduleauthor:: Toshio Kuratomi .. versionadded:: 0.3.26 Include this using:: .. function:: loginform([message]) :message: Any text or elements contained by the tag will be shown as a message to the user. This is generally used to show status of the last login attempt ("Please provide your credentials", "Supplied credentials were not correct", etc) A match template for the main login form. This is a :term:`CSRF` token-aware login form that will prompt for username and password when no session identity is present and ask the user to click a link if they merely lack a token. Typical usage would be:: ${message} .. function:: logintoolitem(@href=URL) :@href: If an href attribute is present for this tag, when a user is logged in, their username or display_name will be a link to the URL. A match template to add an entry to a toolbar. The entry will contain the user's username and a logout button if the user is logged in, a verify login button if the user has a session cookie but not a :term:`CSRF` token, or a login button if the user doesn't have a session cookie. Typical usage looks like this::
    ------------------------------------------------- :mod:`fedora.tg2.templates.genshi.jsglobals.html` ------------------------------------------------- .. module:: fedora.tg2.templates.genshi.jsglobals.html :synopsis: Templates to get information into javascript .. moduleauthor:: Toshio Kuratomi .. versionadded:: 0.3.26 Include this using:: .. function:: jsglobals() A match template to add global variables to a page. Typically, you'd include this in your :file:`master.html` template and let it be added to every other page from there. This adds the following variables in the fedora namespace for other scripts to access: :fedora.baseurl: URL fragment to prepend to any calls to the application. In a :term:`TurboGears` application, this is the scheme, host, and server.webpath. Example: https://admin.fedoraproject.org/pkgdb/. This may be a relative link. :fedora.identity.anonymous: If ``true``, there will be no other variables in the `fedora.identity` namespace. If ``false``, these variables are defined: :fedora.identity.userid: Numeric, unique identifier for the user :fedora.identity.username: Publically visible unique identifier for the user :fedora.identity.display_name: Common human name for the user :fedora.identity.token: csrf token for this user's session to be added to urls that query the server. Typical usage would be:: ''' python-fedora-0.10.0/fedora/tg2/templates/__init__.py0000664000175000017500000000024013137632523025031 0ustar puiterwijkpuiterwijk00000000000000''' Templates to make adding templates for some common services easier. .. moduleauthor:: Toshio Kuratomi .. versionadded:: 0.3.25 ''' python-fedora-0.10.0/fedora/tg2/templates/mako/0000775000175000017500000000000013234574425023657 5ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/fedora/tg2/templates/mako/jsglobals.mak0000664000175000017500000000132313137632523026324 0ustar puiterwijkpuiterwijk00000000000000<%def name="jsglobals()"> % if request.identity: % endif python-fedora-0.10.0/fedora/tg2/templates/mako/__init__.py0000664000175000017500000000654413137632523025775 0ustar puiterwijkpuiterwijk00000000000000''' Mako version of templates to make adding certain Fedora widgets easier. ------------------------------------------ :mod:`fedora.tg2.templates.mako.login.mak` ------------------------------------------ .. module:: fedora.tg2.templates.mako.login.mak :synopsis: Templates related to logging in and out. .. moduleauthor:: Toshio Kuratomi .. versionadded:: 0.3.25 Include this using:: <%namespace name="fedora" file="${context['fedora_template']('login.mak')}" /> .. function:: loginform(message='') :kwarg message: Any text or elements contained by the tag will be shown as a message to the user. This is generally used to show status of the last login attempt ("Please provide your credentials", "Supplied credentials were not correct", etc) A function for generating the main login form. This is a :term:`CSRF` token-aware login form that will prompt for username and password when no session identity is present and ask the user to click a link if they merely lack a token. Typical usage, given the above import of the :file:`login.mak` template would be:: ${fedora.loginform()} .. function:: logintoolitem(href=None) :kwarg href: If an href is given, when a user is logged in, their username or display_name will be a link to the URL. This function creates an entry into a toolbar for logging into a web app. The entry will contain the user's username and a logout button if the user is logged in, a verify login button if the user has a session cookie but not a :term:`CSRF` token, or a login button if the user doesn't have a session cookie. Typical usage looks like this::
      ${fedora.logintoolitem(href=tg.url('/users/info'))}
    ---------------------------------------------- :mod:`fedora.tg2.templates.mako.jsglobals.mak` ---------------------------------------------- .. module:: fedora.tg2.templates.mako.jsglobals.mak :synopsis: Templates to get information into javascript .. moduleauthor:: Toshio Kuratomi .. versionadded:: 0.3.25 Include this using:: <%namespace name="jsglobals" file="${context['fedora_template']('jsglobals.mak')}" /> .. function:: jsglobals() A function to add global variables to a page. Typically, you'd include this in your :file:`master.mak` template and let the javascript variables defined there propogate to every page on your site (since they all should inherit from :file:`master.mak`). This adds the following variables in the fedora namespace for other scripts to access: :fedora.baseurl: URL fragment to prepend to any calls to the application. In a :term:`TurboGears` application, this is the scheme, host, and server.webpath. Example: https://admin.fedoraproject.org/pkgdb/. This may be a relative link. :fedora.identity.anonymous: If ``true``, there will be no other variables in the `fedora.identity` namespace. If ``false``, these variables are defined: :fedora.identity.userid: Numeric, unique identifier for the user :fedora.identity.username: Publically visible unique identifier for the user :fedora.identity.display_name: Common human name for the user :fedora.identity.token: csrf token for this user's session to be added to urls that query the server. Typical usage would be:: ${jsglobals.jsglobals()} ''' python-fedora-0.10.0/fedora/tg2/templates/mako/login.mak0000664000175000017500000000711213137632523025456 0ustar puiterwijkpuiterwijk00000000000000<%def name="loginform(message='')"> <%def name="logintoolitem(href)"> % if request.identity:
  • ${_('Welcome')} % if href: % if hasattr(request.identity['user'], 'display_name'): ${request.identity['user'].display_name} % else: ${request.identity['user'].user_name} % endif % else: % if hasattr(request.identity['user'], 'display_name'): ${request.identity['user'].display_name} % else: ${request.identity['user'].user_name} % endif % endif
  • % elif not request.identity and not request.environ.get('CSRF_AUTH_SESSION_ID'): ## If not logged in and no sign that we just lack a csrf token, offer login
  • ${_('You are not logged in')}
  • % elif not request.identity: ## Only CSRF_token missing
  • ${_('CSRF protected')} ## Just go back to the present page using tg.url() to append the _csrf_token
  • % endif % if request.identity or request.environ.get('CSRF_AUTH_SESSION_ID'):
  • % endif python-fedora-0.10.0/python_fedora.egg-info/0000775000175000017500000000000013234574425023331 5ustar puiterwijkpuiterwijk00000000000000python-fedora-0.10.0/python_fedora.egg-info/dependency_links.txt0000644000175000017500000000000113234574425027375 0ustar puiterwijkpuiterwijk00000000000000 python-fedora-0.10.0/python_fedora.egg-info/entry_points.txt0000644000175000017500000000065313234574425026631 0ustar puiterwijkpuiterwijk00000000000000[turbogears.identity.provider] jsonfas = fedora.tg.identity.jsonfasprovider1:JsonFasIdentityProvider [tg] jsonfas2 = fedora.tg.identity.jsonfasprovider2:JsonFasIdentityProvider [tg] sqlobjectcsrf = fedora.tg.identity.soprovidercsrf:SqlObjectCsrfIdentityProvider [tg] [turbogears.visit.manager] jsonfas = fedora.tg.visit.jsonfasvisit1:JsonFasVisitManager [tg] jsonfas2 = fedora.tg.visit.jsonfasvisit2:JsonFasVisitManager [tg] python-fedora-0.10.0/python_fedora.egg-info/requires.txt0000644000175000017500000000035313234574425025730 0ustar puiterwijkpuiterwijk00000000000000munch kitchen requests beautifulsoup4 urllib3 six>=1.4.0 lockfile openidc-client [flask] Flask Flask_WTF python-openid python-openid-teams python-openid-cla [tg] TurboGears>=1.0.4 SQLAlchemy decorator [wsgi] repoze.who Beaker Paste python-fedora-0.10.0/python_fedora.egg-info/top_level.txt0000644000175000017500000000005013234574425026054 0ustar puiterwijkpuiterwijk00000000000000fedora flask_fas flask_fas_openid tests python-fedora-0.10.0/python_fedora.egg-info/PKG-INFO0000644000175000017500000000164613234574425024433 0ustar puiterwijkpuiterwijk00000000000000Metadata-Version: 1.1 Name: python-fedora Version: 0.10.0 Summary: Python modules for interacting with Fedora Services Home-page: https://fedorahosted.org/python-fedora Author: Toshio Kuratomi, Luke Macken, Ricky Elrod, Ralph Bean, Patrick Uiterwijk Author-email: admin@fedoraproject.org License: LGPLv2+ Description-Content-Type: UNKNOWN Description: UNKNOWN Keywords: Fedora Python Webservices Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Framework :: TurboGears Classifier: Framework :: Django Classifier: Intended Audience :: Developers Classifier: Intended Audience :: System Administrators Classifier: License :: OSI Approved :: GNU Lesser General Public License v2 or later (LGPLv2+) Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Topic :: Internet :: WWW/HTTP Classifier: Topic :: Software Development :: Libraries :: Python Modules python-fedora-0.10.0/python_fedora.egg-info/SOURCES.txt0000644000175000017500000001012313234574425025210 0ustar puiterwijkpuiterwijk00000000000000AUTHORS COPYING MANIFEST.in NEWS README.rst flask_fas_openid.py releaseutils.py setup.cfg setup.py .tx/config doc/CSRF.rst doc/api.rst doc/auth.rst doc/client.rst doc/conf.py doc/django.rst doc/existing.rst doc/faswho.rst doc/flask_fas.rst doc/flask_fas_openid.rst doc/glossary.rst doc/index.rst doc/javascript.rst doc/service.rst doc/static/EMPTY fedora/__init__.py fedora/iterutils.py fedora/release.py fedora/textutils.py fedora/urlutils.py fedora/client/__init__.py fedora/client/baseclient.py fedora/client/bodhi.py fedora/client/fas2.py fedora/client/fasproxy.py fedora/client/openidbaseclient.py fedora/client/openidcclient.py fedora/client/openidproxyclient.py fedora/client/proxyclient.py fedora/client/wiki.py fedora/django/__init__.py fedora/django/auth/__init__.py fedora/django/auth/backends.py fedora/django/auth/middleware.py fedora/django/auth/models.py fedora/django/auth/management/__init__.py fedora/tg/__init__.py fedora/tg/client.py fedora/tg/controllers.py fedora/tg/json.py fedora/tg/tg1utils.py fedora/tg/tg2utils.py fedora/tg/util.py fedora/tg/utils.py fedora/tg/widgets.py fedora/tg/identity/__init__.py fedora/tg/identity/jsonfasprovider1.py fedora/tg/identity/jsonfasprovider2.py fedora/tg/identity/soprovidercsrf.py fedora/tg/templates/__init__.py fedora/tg/templates/genshi/__init__.py fedora/tg/templates/genshi/jsglobals.html fedora/tg/templates/genshi/login.html fedora/tg/visit/__init__.py fedora/tg/visit/jsonfasvisit1.py fedora/tg/visit/jsonfasvisit2.py fedora/tg2/__init__.py fedora/tg2/utils.py fedora/tg2/templates/__init__.py fedora/tg2/templates/genshi/__init__.py fedora/tg2/templates/genshi/jsglobals.html fedora/tg2/templates/genshi/login.html fedora/tg2/templates/mako/__init__.py fedora/tg2/templates/mako/jsglobals.mak fedora/tg2/templates/mako/login.mak fedora/wsgi/__init__.py fedora/wsgi/csrf.py fedora/wsgi/faswho/__init__.py fedora/wsgi/faswho/faswhoplugin.py python_fedora.egg-info/PKG-INFO python_fedora.egg-info/SOURCES.txt python_fedora.egg-info/dependency_links.txt python_fedora.egg-info/entry_points.txt python_fedora.egg-info/requires.txt python_fedora.egg-info/top_level.txt tests/__init__.py tests/test_urlutils.py tests/functional/__init__.py tests/functional/functional_test_utils.py tests/functional/test_openidbaseclient.py translations/af.po translations/am.po translations/anp.po translations/ar.po translations/as.po translations/ast.po translations/bal.po translations/be.po translations/bg.po translations/bn.po translations/bn_IN.po translations/bo.po translations/br.po translations/brx.po translations/bs.po translations/ca.po translations/cs.po translations/cy.po translations/da.po translations/de.po translations/de_CH.po translations/el.po translations/el_GR.po translations/en_GB.po translations/eo.po translations/es.po translations/et.po translations/eu.po translations/fa.po translations/fi.po translations/fr.po translations/gl.po translations/gu.po translations/he.po translations/hi.po translations/hr.po translations/hu.po translations/ia.po translations/id.po translations/ilo.po translations/is.po translations/it.po translations/ja.po translations/ka.po translations/kk.po translations/km.po translations/kn.po translations/ko.po translations/kw.po translations/kw@kkcor.po translations/kw@uccor.po translations/kw_GB.po translations/ky.po translations/lv.po translations/mai.po translations/mk.po translations/ml.po translations/mn.po translations/mr.po translations/ms.po translations/nb.po translations/nds.po translations/ne.po translations/nl.po translations/nn.po translations/nso.po translations/or.po translations/pa.po translations/pl.po translations/pt.po translations/pt_BR.po translations/python-fedora.pot translations/ro.po translations/ru.po translations/si.po translations/sk.po translations/sl.po translations/sq.po translations/sr.po translations/sr@latin.po translations/sv.po translations/ta.po translations/te.po translations/tg.po translations/th.po translations/tr.po translations/tw.po translations/uk.po translations/ur.po translations/vi.po translations/wba.po translations/yo.po translations/zh_CN.po translations/zh_HK.po translations/zh_TW.po translations/zu.popython-fedora-0.10.0/NEWS0000664000175000017500000006411013234574306017475 0ustar puiterwijkpuiterwijk00000000000000==== NEWS ==== :Authors: Toshio Kuratomi, Luke Macken, Ricky Elrod, Patrick Uiterwijk, Ralph Bean :Date: 5 May 2017 :Version: 0.10.x ------ 0.10.0 ------ * Seperate init_app in flask_fas_openid * Some py3 compatibility * Harden url() function ----- 0.9.0 ----- * Deprecated fedora.client.bodhi in favor of bodhi.client.bindings. * Added OpenID Connect client * Added file permission checks on openidbaseclient cookies ----- 0.8.0 ----- * Removed python 2.5 compatibility code * Various python 3 fixes * Documentation fixes * OpenID endpoint check * Cookie clearing on login in openidbaseclient * Removed flask_fas backwards compatibility module ----- 0.7.1 ----- * Fix a regression in BodhiClient config parsing introduced in 0.7.0. ----- 0.7.0 ----- * Removed the pkgdb1 client. The server has been gone for over a year now. * Removed the flask_fas server component in favor of flask_fas_openid. * Updated flask_fas_openid to forward along ssh and gpg public key information. * Python3 compat enhancements from Craig Rodrigues and Ville Skyttä. ----- 0.6.4 ----- * Bodhi2Client query: document new _before query params * Also perform request retries for failed POST requests. ----- 0.6.3 ----- * Adjust download URL for pypi. ----- 0.6.2 ----- * Force the Bodhi2 url in the BodhiClient shim (for /usr/bin/bodhi). ----- 0.6.1 ----- * Fix a bug in the BodhiClient where the Bodhi2Client would try to use the old Bodhi1 base url. * Raise an AuthError if no username or password is provided to the openid login function. ----- 0.6.0 ----- * Cache session cookies between use for clients using OpenID. * Retry failed requests for clients using OpenID * Remove Bodhi server version detection code. * Python3 support for the BodhiClient. * Drop support for python-requests-1.x ----- 0.5.6 ----- * Python2.6 fix for string formatting in the BodhiClient. ----- 0.5.5 ----- * Consistent exception handling in the Bodhi2Client. * More adjustments to bodhi server version detection. ----- 0.5.4 ----- * Adjust usage of python-six to be compatible with older versions on rhel7. * More updates to detection of the bodhi server version. ----- 0.5.3 ----- * Better bodhi compatibility with 'fedpkg update'. ----- 0.5.2 ----- * Better version checking against the bodhi server. ----- 0.5.1 ----- * Typofix in the BodhiClient ----- 0.5.0 ----- * Bodhi2 compatibility! * Ensure that the OpenIdBaseClient returns a munch object like the old BaseClient did. * Minor fixes to some python3 compatibility. ----- 0.4.0 ----- * Port most modules to a python2/python3 compatible codebase! Hooray! * Deprecate the wiki client (it will be removed in the next major release). * Switch over to using zanata for translations. ------ 0.3.37 ------ * Make the fedora_session file unhidden * Instead of returning the JSON returned by fedoauth/ipsilon we return the response from the application when we sent to it the data returned by fedoauth/ipsilon. * Update OpenIdProxyClient to allow specifying headers when sending a request * Update bugzilla exception list. ------ 0.3.36 ------ * Fix the OpenId BaseClient NullHandler for logging ------ 0.3.35 ------ * Add Openid BaseClient for talking to our new web services that are using openid to auth. * flask_fas_openid can return the json data from the openid request instead of the html page if requested. * Add a requirement on urllib3 in setup.py so that pip will install it. ------ 0.3.34 ------ * **SECURITY** Fix the jsglobals.html template to escape usernames and human names to fix potential XSS flaw. * **SECURITY** Make flask-fas-openid check that the page it is returning the user to after authentication is from within the application. * Updated libravatar lookups to use the user's openid identifier instead of their email address. ------ 0.3.33 ------ * Minimum version of python is now 2.6. Some things may work on older python but this is not guaranteed. Patches to make it work may or may not be accepted. * Added flask_fas_openid for the migration to OpenID This adds the requirements for python-openid, python-openid-teams and python-openid-cla. * Rename the FAS_HTTPS_REQUIRED config variable in the flask_fas auth adapter to FAS_FLASK_COOKIE_REQUIRES_HTTPS. The longer name is more cumbersome but the previous name was too often mistaken to be setting whether we needed to connect to the fas server with https when it really was about whether the session cookie should require https to be returned to the server (the cookie's secure flag). * Change the groups attribute of the flask_fas and flask_fas_openid auth adapters to be a frozenset instead of a list * Set a configurable timeout on how long a client request will wait for the server to setup a connection in BaseClient and ProxyClient. * Fix instance-wide default retries in BaseClient (and subclasses) being overridden by the default value of retries in BaseClient.send_request() * Fix a performance bug in the client modules when the server returns large json strings. python-requests defaults to trying to detect the charset of response strings. This takes a very long time on large return values. Since we know that all responses from the services we're talking to will be utf-8, we can skip this detection step. * No longer use paver for building. We just need setuptools now * Deprecated AccountSystem's gravatar_url method in favor of a new avatar_url method. This defaults to using the free libravatar service but still allows API users to fall back on the proprietary gravatar service if they prefer. python-pylibravatar must be installed for the default to work. If it isn't found on the user's system, then gravatar.com is made the new default. -------- 0.3.32.3 -------- * Fix BodhiClient's knowledge of koji tags -------- 0.3.32.2 -------- * Stop setting cookie attributes on the cookie we generate client-side as those aren't sent to the server and it provokes bugs in python-requests -------- 0.3.32.1 -------- * Update documentation on fasproxy.FasProxyClient.login() ------ 0.3.32 ------ * Replace pyCurl with python-requests in ProxyClient (ralph). This was in order to fix bugs we were seeing with curl/nss in some contexts. ------ 0.3.31 ------ * Fix a problem getting encodings in the soprovidercsrf tg1 identity provider * Fix for login template issuing a traceback when viewed as a localized page (lmacken) ------ 0.3.30 ------ * Added a lookup_email parameter to fedora.client.AccountSystem.gravatar_url() to allow generating gravaar urls without looking up email addresses in fas. * Fixed a bug in fedora.tg.utils.tg_absolute_url() where it was still appending the csrf_token. * Add an auth adapter for flask web apps to authenticate to FAS * New minimum version of python: requires python-2.5 or higher * Fix localization of login templates (laxathom) --------- 0.3.29 --------- * Added a create_group method to AccountSystem to allow for creating FAS groups. --------- 0.3.28.90 --------- To finish --------- * For the faswho repoze.who plugin, allow TG1-style authentication -- ie: if all of the following are set on any URL, authenticate the user prior to loading the web page:: login=Login&user_name=$FAS_USERNAME&password=$FAS_PASSWORD -------- 0.3.28.1 -------- * Previous fix for curl/apache interaction was incomplete. Apache returns a 417 error even if the request would have completed okay (for our case, even if the request is unauthenticated). Have to apply the workaround unconditionally. ------ 0.3.28 ------ * Fix Django auth provider with Django-1.2.x or less. These versions of Django do not have the API necessary to do httponly cookies so we need to not use httponly if that's the version of Django that we're using. * Fix for a bad curl-apache < 2.2.18 interaction. Apache < 2.2.18 has a bug in processing Expect: 100-continue headers if there's data in the body that the client expects apache to process. Curl is a client that does just that. This workaround clears the Expect: header so that we do not have those issues. ------ 0.3.27 ------ * Fix problem with tg_paginate_limit no longer being available in TG-1.1.x. Use FOO_tg_limit instead in various client libraries. ------ 0.3.26 ------ * Fix the AccountSystem() class's verify_password() method so that verification of server SSL certificates may be disabled by setting insecure=True. * Fixed AccountSystem.people_by_key() to return a list with both people who have signed the CLA and have not * Fix the tg2.utils.url handling with TG-2.0.x * Fix a deprecation warning in fedora.tg.controllers * Fix issue in proxyclient where unicode passwords might be encoded to the wrong byte sequence depending on the locale of the process running it. * Fix jsonfasprovider2's group handling to not traceback when assigning groups if there is no record for a given username. * Fix a traceback in jsonfasprovider2's user_id handling. * Fix comparison of passwords in jsonfasprovider when unicode passwords are used. However, this method is actually not invoked under normal use as the password comparison is done on the server. * Fix faswho plugin to handle unicode passwords and usernames. Note that this is a different bug than affected the TG1 auth provider. * Fix faswho auth plugin to set session cookies as secure and httponly * Set the Django session cookies httponly * Add a genshi login template for TG2 * For faswho repoze.who plugin, remove caching during authentication (as caching does not pick up on logout of a different app invalidating the session and password changes). We could use caching again if retrieving the full information about a user took more time than validating their username and password. * Simplify implementation of the faswho plugin. Should save on per-request memory and cache. * Add AccountSystem.gravatar_url() method that will return a url to a gravatar for a person. -------- 0.3.25.1 -------- * Update bugzilla email mapping ------ 0.3.25 ------ * Modify caching of User data in the tg1 identity provider, jsonfas2provider so that anonymous page requests don't call fas excessively. * Make :func:`fedora.tg.tg2utils.enable_csrf` a public function so that TG2 users can use it without using faswho * Make :func:`fedora.tg.tg2utils.url` work with other repoze.who plugins other than faswho. * Allow using a test fas server with :func:`make_faswho_middleware` * Update faswho metadata to be compatible with the default TG2 identity metadata for portability * Allow recovering authenticated state from lack of csrf_token when using the TG2 csrf protecting middleware * Split the TG1 and TG2 code into two separate directories so packagers can split the dependencies even more * Add login and jsglobals template for TG2-mako * Modify fedora_template for TG2 -- now defaults to mako templates and returns a dotted_lookup string by default. This matches with the templates we have and the default template lookup strategy in TG2. ------ 0.3.24 ------ * Fix tg.tg2utils._enable_csrf so that redirect() appends the CSRF token in TG2. * Fix an example in the documentation * Fix a proxyclient error with new pycurl and cookies * Use transifex.net for translations ------ 0.3.23 ------ * Get BodhiClient.comment() working with older version of bodhi ------ 0.3.22 ------ * Bodhi.comment() adds an email parameter to control whether to send email for a comment * Fix ProxyClient issue when using unicode type for a URL * Fix for AccountSystem.group_members() bug with the Bunch port ------ 0.3.21 ------ * Add support for uploading files in BaseClient and ProxyClient. * Add retry capability to BaseClient and ProxyClient. * Have identity and visit managers retry 3 times. * Fix some errors in the wsgi csrf middleware. * Fix wsgi csrf middleware to work with webob >= 1.0 * Fix how we're using data from FasProxy.group_list() in the django auth provider * New PackageDB() methods, :meth:`~fedora.client.PackageDB.add_comaintainers` and :meth:`~fedora.client.PackageDB.change_owner` Internal Cleanups ================= * Port to kitchen for things that have moved there. * Port from DictContainer to python-bunch * Add code to fallback to the stdlib json library so that simplejson is no longer required ------ 0.3.20 ------ * Fix Django auth provider so it times out when the auth provider is used in a django + djblets app. ------ 0.3.19 ------ * Fix DJango Auth Provider to use a cookie shared with the TG apps * Fix DJango Auth Provider to timeout with the fas session * Optimize group lookup in DJango auth provider for ReviewBoard * Add absolute_url() and tg_absolute_url() functions to tg1utils * Attempt to stop tracebacks in tg.visit code * Don't crash DJango auth if the user is hiding their Real Name. ------ 0.3.18 ------ * Fixes for Django auth provider tracebacks and session not being cleared between users. * Revert the connection pool for ProxyClient. It was part of the reason that Django auth (and the other auth providers although no one noticed) were failing. ------ 0.3.17 ------ * Add a connection pool to ProxyClient. Reusing the curl objects from the pool speeds up requests that go to the same server. * New class FasProxyClient that is used to implement thread-safe communication with the Fedora Account System. Our authentication plugins that talk to FAS have been ported to use this internally. * For all clients, remove tg_format=json from the requests that are sent. The Accept header that we send has been serving this purpose for a long time. * New PackageDB methods - get_collection_list() that returns the list of collections that are registered in the pkgdb. - orphan_packages() that returns the list of packages orphaned in non-EOL releases. - get_critpath_pkgs(): Return the packages marked for the critical path - set_critpath(): Mark pkgs as critical path * In fedora.client.pkgdb, Wherever a collection is asked for, have the API take params named collctn_* for consistency. Using the old names as keyword arguments will yield a deprecation warning. * fedora.client.PackageDB now works with pkgdb server 0.5.x rather than 0.4.x * fedora.client.wiki: add ignore_wikibot and callback kwargs to Wiki.fetch_all_revisions() and minor bug fixes * New functions: - fedora.iterutils.isiterable(): Can tell whether an object is an iterable. Can also exclude strings if desired. - fedora.urlutils.update_qs(): Updates a http query string. - fedora.textutils.to_unicode(): Converts a byte string to unicode string. - fedora.textutils.to_bytes(): Converts a unicode string into a byte string. * Fix fedora.tg.tg1utils.request_format() to return a symbolic name for the data format requested whether using the Accept header or tg_format query parameter. * fedora.tg.tg2utils module added with some of the functions from fedora.tg.tg1utils ported to TG2. * faswho and csrf middleware that allow TG2 apps to authenticate against FAS * Documentation on how to use faswho and CSRF in a TG2 app. * Fix some bugs in the Django auth layer. ------ 0.3.16 ------ * Update paver-minilib.zip to pull in more of paver. Fixes a bug when used with easy_install * Fix a bug in fedora.tg.util.url that was creating more than one _csrf_token entry. ------ 0.3.15 ------ * Relicense to LGPLv2+ * Fix user_gencert URL ------ 0.3.14 ------ * Save the original tg.url() function as fedora.tg.tg_url(). That allows us to change the url to have the base_url without adding the csrf token. * Update fedora.client.AccountSystem for compatibility with the next FAS server update (backwards compatible). * Add fedora.client.PackageDB.user_packages() method that retrieves the packages that a particular user owns. * Add a function for fetching all revisions of the wiki (fetch_all_revisions) * Add a function for seeing if we have the wiki API high limits right (check_api_limits) * Add an identity provider, sqlobjectcsrf, to implement csrf_token protection for applications that use sqlobject for database interaction and don't want to use FAS for auth. -------- 0.3.13.1 -------- * Merge the 0.3.13 and 0.3.12.1 release together. * Bugfix for Django Auth provider and new fas server. ------ 0.3.13 ------ * Add new pkgdb methods: add_package() to add a new package and edit_package() to edit an existing one. add_edit_package() was removed. * More translations. * Change from 401 response code to 403. 401 was causing problems for konqueror and webkit and our usage wasn't http spec compliant. * New fedora.compat25 that has python-2.5 features for older releases. - fedora.compat25.defaultdict a defaultdict implementation for older python releases. -------- 0.3.12.1 -------- * Add people_query method * Rename group_by_id and person_by_id request parameters * Add force_refresh parameter to group_data ------ 0.3.12 ------ * Bugfix to django auth to allow login * Bugfix to jsonfas2 that allows login when using json calls with Cherrypy 2.3+ * Get i18n infrastructure ready and take translations from transifex * Include a setup.py so easy_install works * Update build to work with paver 1.0 and somewhat with 0.8 * Add remove_user() to pkgdb client module. -------- 0.3.11.1 -------- * Fix a bug with django auth and redirects ------ 0.3.11 ------ Re-add the old jsonfasprovider and jsonfasvisit plugins until we get everything ported over to CSRF protection. To use the new providers, change your app.cfg:: -visit.manager="jsonfas" -identity.provider="jsonfas" +visit.manager="jsonfas2" +identity.provider="jsonfas2" ------ 0.3.10 ------ CSRF ==== CSRF is a vulnerability that can allow malicious web sites to execute server methods on behalf of an authenticated user. This update has some methods to help deal with that: * Added helpers for enabling CSRF protection to services. For information on adding support to your app, read doc/CSRF.rst or the html version: https://fedorahosted.org/releases/p/y/python-fedora/doc/CSRF.html * Update client code to use CSRF tokens when needed. Other Feature Changes ===================== * Add Django Authentication provider. * Undeprecate AccountSystem.people_by_id() for now -- we need a fas server update before we can use people_by_key(). * Correct loggers to show messages originate from jsonfasprovider and jsonfasvisit. * Add parameter to client classes to allow not checking server certificates. This is **only** intended for use when running test servers with bad certs. Bugfixes ======== * python-2.4 compatibility fix when an http error is received in ProxyClient * Fix fedora.client.ServerError to print information about the error in the traceback. 0.3.9.1 ------- * Fix to the mediawiki client for python-2.4 compatibility. ----- 0.3.9 ----- * Minor fix for traceback when the session file is unreadable. * Fix so that ProxyClient follows redirects. * Fix a bug where fas2.py::AccountSystem::verify_password() always returns True. * Add task to publish documentation to the website. Publish documentation to the website at: https://fedorahosted.org/releases/p/y/python-fedora/doc/ ----- 0.3.8 ----- * Port the client module to use pycurl instead of urllib2. This prepares the way for SSL authentication and fixes a problem with https proxying. * Fix bug in BodhiClient.testable() * Update proxyclient to accept either 403 or 401 as http status codes raising AuthErrors. * New client.fas2.AccountSystem methods to make fasClient more efficient: - group_data(): returns mapping group names to group type and the userids of the administrator, sponsors, and users of the group. - user_data(): returns mapping of userids to a username, password hash, SSH pub key, email address, and status. * Fix AppError exception on python-2.4 ----- 0.3.7 ----- * Update to bugzilla email addresses. * Add documentation for working with translations. * add username argument for BodhiClient. * Update PackageDB.clone_branch() command for new server method. * Allow exceptions passed back by the server to contain extra information. * New fedora.tg.util.json_or_redirect() decorator that allows server methods to either return a dict per normal or redirect to another URL. ----- 0.3.6 ----- * fedora.client.pkgdb merge with pkgdb-client from Mike Watters and Toshio Kuratomi. * Generate documentation for json and util modules. * Delay import of koji, yum, and iniparse in the bodhi client libraries so they're not strict dependencies for now. ----- 0.3.5 ----- * Fix client.AccountSystem.person_by_username() to not traceback when given an unknown username. * Deprecate cookie auth in favor of session_id auth (but maintain compatibility) * Internally, use session_id instead of cookie. * Change the session file from ~/.fedora_session to ~/.fedora/.fedora_session * Switch from using setuptools to build the package to paver_. * Generate html documentation using sphinx_. * Bodhi update template parsing improvements, thanks to Ricky. .. _paver:: http://www.blueskyonmars.com/projects/paver/ .. _sphix:: http://sphinx.pocoo.org/ ----- 0.3.4 ----- * Fix to proxyclient allow sending sequence types via send_request(). * New fedora.client.fas2.AccountSystem method people_by_groupname() ----- 0.3.3 ----- * Allow json_props in SABase to follow class inheritance. * Remove 0.2 compatibility variable jsonProps. This was broken and everything that was using it has been ported to use json_props instead. * Misc bugfixes with the jsonfas provider. ----- 0.3.2 ----- * Bodhi API parameter 'type' renamed to 'type_' * Added BodhiClient.latest_builds method * New FAS group_members() method to return people's status in a group. * Fixed the default fas.url value in the jsonfas visit manager * Creation of a new FedoraClientError base Exception class * Better i18n support * Added all clients to the base of the fedora.client module * Various other bugfixes ----- 0.3.1 ----- * Fix an unported portion of the jsonfasvisit manager. * Make validation errors set a flash message for both html and json * Create a function to jsonify sets. * Make sure we don't log a user's password. * Bugfixes in the bodhi update template parsing code --- 0.3 --- * New fedora.client.bodhi API * Lots of bugfixes * New fedora.client.ProxyClient class that can be used for writing proxies and lower level clients that talk to Fedora Services. - BaseClient rewritten to run on top of ProxyClient. * Rearranging of many modules. The old names should still work but issue a DeprecationWarning and the new location to import the module from. * Documentation on how to build a Fedora Service that will work well with BaseClient and documentation on building apps with BaseClient. - Note that present Fedora Services (Bodhi, PackageDB, MirrorManager, FAS2) will need to be updated to conform to this spec. Until that happens, not everything (notably, error handling) will work 100% correctly. Incompatibilities ================= * Removal of camelCase. Rename keyword arguments and public instance variables: * client.BaseClient *Note* that changes to this class propogate out to the same variable in derived classes like fas2.AccountSystem and the BaseClient used in JsonFasIdentity. * __init__(): baseURL => base_url * _sessionCookie => _session_cookie: this is a private variable but some users use this anyway. For users needing to access this, there's now a more appropriate class for doing so (ProxyClient). * accounts.fas2.AccountSystem * group_by_id(): groupId => group_id * person_by_id(): personId => person_id * tg.widgets * All widgets had widgetId => widget_id * Also means accessing the variable is done via self.widget_id * tg.json.SABase * self.jsonProps => self.json_props *Note*: jsonProps will still work but is Deprecated. Please update your code as we will be removing jsonProps in 0.4.x. * The input keyword argument to BaseClient.send_request has been deprecated in favor of req_params. *Note*: Using input will still work in 0.3. Please update your code as we will be removing input in 0.4.x. * Restructuring of Exceptions in BaseClient * New base exception is FedoraServiceError if you want to catch that. * Movement of fedora.tg.client to fedora.client * Movement of fedora.accounts.fas2 to fedora.client.fas2 * Rename fedora.client.fas2.AccountSystem.authenticate() to verify_password() ----------- 0.2.99.11.1 ----------- Brown paper bag the previous release. Fix a crasher bug. --------- 0.2.99.11 --------- Hopefully the last in this line of API. * Fix handling of tg_format=json asa query param when the server uses tg.util.request_format() * Add a default jsonify method for SA ResultProxys * Don't traceback if there's a corrupted session file * Set permissions on the session file so only the user can read it. * Add a default BaseURL for fas2.AccountSystem --------- 0.2.99.10 --------- * Minor update that: 1) Adds bugzilla email to the return from people_by_id(). 2) Adds several more users whose bugzilla address don't match their fas email. -------- 0.2.99.9 -------- * This is what 0.2.99.9 was supposed to be. The last release compatible with 0.2.99.7 and less. Unfortunately, some incompatibilities snuck in. Reverting those changes here. -------- 0.2.99.8 -------- * Fix a bug involving bugzilla_email addresses. * Fix a bug where an expired session cookie will cause send_request to complete successfully but report failure. -------- 0.2.99.7 -------- * Fixes to json.py for JSON output with SA-0.4 * Add bugzila_email to output of fas2 methods * Add people_by_id() method to fas2.AccountSystem that returns a dict of people indexed by ID. The people structure contains username, email, and human_name... what we need for most of our lookups. -------- 0.2.99.6 -------- Remove fas1 code. Document how BaseClient interacts with a server Move client code. Change BaseClient to work with Accept headers. -------- 0.2.99.5 -------- fas2.py shim to connect to fas2 via json for certain information. BaseClient bugfixes. -------- 0.2.99.4 -------- Enhancement to jsonfasprovider to provide both user.human_name and user['human_name']. -------- 0.2.99.3 -------- Bugfixes to BaseClient -------- 0.2.99.2 -------- Integrate a first working json fas identity provider and visit manager. -------- 0.2.99.0 -------- This release is the first to offer TG-1.0.4 and SA-0.4 compatibility. When this is considered stable we will release as 0.3. python-fedora-0.10.0/PKG-INFO0000664000175000017500000000164613234574425020102 0ustar puiterwijkpuiterwijk00000000000000Metadata-Version: 1.1 Name: python-fedora Version: 0.10.0 Summary: Python modules for interacting with Fedora Services Home-page: https://fedorahosted.org/python-fedora Author: Toshio Kuratomi, Luke Macken, Ricky Elrod, Ralph Bean, Patrick Uiterwijk Author-email: admin@fedoraproject.org License: LGPLv2+ Description-Content-Type: UNKNOWN Description: UNKNOWN Keywords: Fedora Python Webservices Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Framework :: TurboGears Classifier: Framework :: Django Classifier: Intended Audience :: Developers Classifier: Intended Audience :: System Administrators Classifier: License :: OSI Approved :: GNU Lesser General Public License v2 or later (LGPLv2+) Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Topic :: Internet :: WWW/HTTP Classifier: Topic :: Software Development :: Libraries :: Python Modules python-fedora-0.10.0/setup.py0000775000175000017500000000463213234573627020523 0ustar puiterwijkpuiterwijk00000000000000#!/usr/bin/python -tt import sys exec(compile(open("fedora/release.py").read(), "fedora/release.py", 'exec')) from setuptools import find_packages, setup setup( name=NAME, version=VERSION, description=DESCRIPTION, author=AUTHOR, author_email=EMAIL, license=LICENSE, keywords='Fedora Python Webservices', url=URL, packages=find_packages(), py_modules=['flask_fas', 'flask_fas_openid'], include_package_data=True, # non-setuptools package. When everything we care about uses # python-2.5 distutils we can add these: # for bodhi (koji yum) install_requires=[ 'munch', 'kitchen', 'requests', 'beautifulsoup4', 'urllib3', 'six >= 1.4.0', 'lockfile', 'openidc-client', ], extras_require={ 'tg': ['TurboGears >= 1.0.4', 'SQLAlchemy', 'decorator'], 'wsgi': ['repoze.who', 'Beaker', 'Paste'], 'flask': [ 'Flask', 'Flask_WTF', 'python-openid', 'python-openid-teams', 'python-openid-cla', ], }, entry_points={ 'turbogears.identity.provider': ( 'jsonfas = fedora.tg.identity.jsonfasprovider1:JsonFasIdentityProvider [tg]', 'jsonfas2 = fedora.tg.identity.jsonfasprovider2:JsonFasIdentityProvider [tg]', 'sqlobjectcsrf = fedora.tg.identity.soprovidercsrf:SqlObjectCsrfIdentityProvider [tg]'), 'turbogears.visit.manager': ( 'jsonfas = fedora.tg.visit.jsonfasvisit1:JsonFasVisitManager [tg]', 'jsonfas2 = fedora.tg.visit.jsonfasvisit2:JsonFasVisitManager [tg]' ), }, message_extractors={ 'fedora': [ ('**.py', 'python', None), ('tg2/templates/mako/**.mak', 'mako', None), ('tg2/templates/genshi/**.html', 'mako', None), ('tg/templates/genshi/**.html', 'genshi', None), ], }, classifiers=[ 'Development Status :: 4 - Beta', 'Framework :: TurboGears', 'Framework :: Django', 'Intended Audience :: Developers', 'Intended Audience :: System Administrators', 'License :: OSI Approved :: GNU Lesser General Public License v2 or later (LGPLv2+)', 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', 'Topic :: Internet :: WWW/HTTP', 'Topic :: Software Development :: Libraries :: Python Modules', ], ) python-fedora-0.10.0/setup.cfg0000664000175000017500000000050313234574425020615 0ustar puiterwijkpuiterwijk00000000000000[extract_messages] output_file = translations/python-fedora.pot keywords = _ N_ b_ bN_ f_ [upload_docs] upload_dir = build/sphinx/html [pep8] exclude = setup.py,./fedora/tg/identity/soprovidercsrf.py,./fedora/tg2/templates/mako/__init__.py,./fedora/tg2/templates/genshi/__init__.py [egg_info] tag_build = tag_date = 0