[Python-modules-commits] [python-oxd] 01/03: Initial python-oxd_2.4.4.orig.tar.gz

Adrian Alves alvesadrian-guest at moszumanska.debian.org
Sat Aug 13 01:04:49 UTC 2016


This is an automated email from the git hooks/post-receive script.

alvesadrian-guest pushed a commit to branch master
in repository python-oxd.

commit 50347498e85b1c6d99443d6674846caf2697eef9
Author: Adrian Alves <aalves at gmail.com>
Date:   Fri Aug 12 22:00:50 2016 -0300

    Initial python-oxd_2.4.4.orig.tar.gz
---
 .gitignore                                         |    60 +
 LICENSE                                            |    22 +
 README.md                                          |   100 +
 demosite/README.md                                 |    75 +
 demosite/demosite.cfg                              |    19 +
 demosite/demosite.conf                             |    44 +
 demosite/demosite.py                               |    51 +
 demosite/demosite.wsgi                             |    11 +
 demosite/static/css/bootstrap-theme.css            |   587 ++
 demosite/static/css/bootstrap-theme.css.map        |     1 +
 demosite/static/css/bootstrap-theme.min.css        |     5 +
 demosite/static/css/bootstrap.css                  |  6800 ++++++++++++
 demosite/static/css/bootstrap.css.map              |     1 +
 demosite/static/css/bootstrap.min.css              |     5 +
 demosite/static/css/prettify.css                   |     1 +
 .../static/fonts/glyphicons-halflings-regular.eot  |   Bin 0 -> 20127 bytes
 .../static/fonts/glyphicons-halflings-regular.svg  |   288 +
 .../static/fonts/glyphicons-halflings-regular.ttf  |   Bin 0 -> 45404 bytes
 .../static/fonts/glyphicons-halflings-regular.woff |   Bin 0 -> 23424 bytes
 .../fonts/glyphicons-halflings-regular.woff2       |   Bin 0 -> 18028 bytes
 demosite/static/js/bootstrap.js                    |  2363 +++++
 demosite/static/js/bootstrap.min.js                |     7 +
 demosite/static/js/npm.js                          |    13 +
 demosite/static/js/prettify.js                     |    30 +
 demosite/static/js/run_prettify.js                 |    34 +
 demosite/templates/base.html                       |    23 +
 demosite/templates/home.html                       |   169 +
 docs/Makefile                                      |   216 +
 docs/conf.py                                       |   289 +
 docs/html/.buildinfo                               |     4 +
 docs/html/_modules/index.html                      |   186 +
 docs/html/_modules/oxdpython/client.html           |   491 +
 docs/html/_sources/index.txt                       |    11 +
 docs/html/_static/ajax-loader.gif                  |   Bin 0 -> 673 bytes
 docs/html/_static/basic.css                        |   599 ++
 docs/html/_static/comment-bright.png               |   Bin 0 -> 3500 bytes
 docs/html/_static/comment-close.png                |   Bin 0 -> 3578 bytes
 docs/html/_static/comment.png                      |   Bin 0 -> 3445 bytes
 docs/html/_static/css/badge_only.css               |     2 +
 docs/html/_static/css/theme.css                    |     5 +
 docs/html/_static/doctools.js                      |   287 +
 docs/html/_static/down-pressed.png                 |   Bin 0 -> 347 bytes
 docs/html/_static/down.png                         |   Bin 0 -> 347 bytes
 docs/html/_static/file.png                         |   Bin 0 -> 358 bytes
 docs/html/_static/fonts/Inconsolata-Bold.ttf       |   Bin 0 -> 66352 bytes
 docs/html/_static/fonts/Inconsolata-Regular.ttf    |   Bin 0 -> 84548 bytes
 docs/html/_static/fonts/Lato-Bold.ttf              |   Bin 0 -> 121788 bytes
 docs/html/_static/fonts/Lato-Regular.ttf           |   Bin 0 -> 120196 bytes
 docs/html/_static/fonts/RobotoSlab-Bold.ttf        |   Bin 0 -> 170616 bytes
 docs/html/_static/fonts/RobotoSlab-Regular.ttf     |   Bin 0 -> 169064 bytes
 docs/html/_static/fonts/fontawesome-webfont.eot    |   Bin 0 -> 56006 bytes
 docs/html/_static/fonts/fontawesome-webfont.svg    |   520 +
 docs/html/_static/fonts/fontawesome-webfont.ttf    |   Bin 0 -> 112160 bytes
 docs/html/_static/fonts/fontawesome-webfont.woff   |   Bin 0 -> 65452 bytes
 docs/html/_static/jquery-1.11.1.js                 | 10308 +++++++++++++++++++
 docs/html/_static/jquery.js                        |     4 +
 docs/html/_static/js/modernizr.min.js              |     4 +
 docs/html/_static/js/theme.js                      |   153 +
 docs/html/_static/minus.png                        |   Bin 0 -> 173 bytes
 docs/html/_static/plus.png                         |   Bin 0 -> 173 bytes
 docs/html/_static/pygments.css                     |    65 +
 docs/html/_static/searchtools.js                   |   651 ++
 docs/html/_static/underscore-1.3.1.js              |   999 ++
 docs/html/_static/underscore.js                    |    31 +
 docs/html/_static/up-pressed.png                   |   Bin 0 -> 345 bytes
 docs/html/_static/up.png                           |   Bin 0 -> 345 bytes
 docs/html/_static/websupport.js                    |   808 ++
 docs/html/genindex.html                            |   260 +
 docs/html/index.html                               |   365 +
 docs/html/objects.inv                              |   Bin 0 -> 332 bytes
 docs/html/py-modindex.html                         |   210 +
 docs/html/search.html                              |   202 +
 docs/html/searchindex.js                           |     1 +
 docs/index.rst                                     |    11 +
 nativeapp/integration_oath.py                      |    77 +
 nativeapp/native.cfg                               |    16 +
 nativeapp/nativeapp.py                             |    55 +
 nativeapp/setup.txt                                |    64 +
 oxdpython/__init__.py                              |    12 +
 oxdpython/client.py                                |   303 +
 oxdpython/configurer.py                            |    66 +
 oxdpython/messenger.py                             |   107 +
 requirements/dev.txt                               |    28 +
 sample.cfg                                         |    74 +
 setup.py                                           |    55 +
 tests/__init__.py                                  |     0
 tests/data/initial.cfg                             |    20 +
 tests/data/no_oxdid.cfg                            |    10 +
 tests/test_client.py                               |   191 +
 tests/test_configurer.py                           |    38 +
 tests/test_messenger.py                            |    51 +
 tests/test_package.py                              |     9 +
 92 files changed, 28567 insertions(+)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..69c5a69
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,60 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+env/
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+*.egg-info/
+.installed.cfg
+*.egg
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*,cover
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# generated test config files
+tests/*.cfg
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..2311399
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Gluu
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..6f3969d
--- /dev/null
+++ b/README.md
@@ -0,0 +1,100 @@
+# oxd-python
+oxD Python is a client library for the Gluu oxD Server. For information about oxD, visit [http://oxd.gluu.org](http://oxd.gluu.org)
+
+## Deployment
+
+### Prerequisites
+
+* Python 2.7
+* Gluu oxD Server - [Installation docs](https://www.gluu.org/docs-oxd/oxdserver/install/)
+
+### Installation
+* Download the zip of the oxD Python Library from [here](https://github.com/GluuFederation/oxd-python/releases) and unzip to your location of choice
+
+```
+cd oxdpython-version
+python setup.py install
+```
+
+* OPTIONAL - Check code via unit tests using Nose.
+```
+pip install nose
+nosetests
+```
+
+### Next Steps
+
+* Scroll [below](#using-the-library-in-your-website) to learn how to use the library in an application.
+* See the [API docs](http://oxd-python.readthedocs.io/en/2.4.4/) for in-depth information about the various functions and their parameters.
+* See the code of a [sample Flask app](https://github.com/GluuFederation/oxd-python/blob/master/demosite/demosite.py) built using oxd-python.
+* Browse the source code is hosted in Github [here](https://github.com/GluuFederation/oxd-python).
+
+### Using the Library in your website
+
+#### Configure the site
+
+Once the library is installed, it can be used by any Python web application deployed on the server. First, create a copy of the sample configuration file for your website in a server *writable* location and edit the configuration. For example
+
+```
+cp sample.cfg /var/www/demosite/demosite.cfg
+```
+
+**Note:** The website is registered with the OP and its ID is stored in this config file, also are the other peristant information about the website. So the config file needs to be *writable* for the server. The [sample.cfg](https://github.com/GluuFederation/oxd-python/blob/master/sample.cfg) file contains complete documentation about itself.
+
+#### Website Registration
+
+The `Client` class of the library provides all the required methods required for the website to communicate with the oxD RP through sockets.
+
+```python
+from oxdpython import Client
+
+config = "/var/www/demosite/demosite.cfg"  # This should be writable by the server
+client = Client(config)
+client.register_site()
+```
+
+**Note:** `register_site()` can be skipped as any `get_authorization_url()` automatically registers the site.
+
+#### Get Authorization URL
+
+Next Generate an authorization url which the user can visit to authorize your application to use the information from the OP.
+
+```python
+auth_url = client.get_authorization_url()
+```
+
+#### Get access token
+
+In the web application, redirect the user to the `auth_url`. After authentication and authorization at the OP, the user is sent back to the website. The website needs to parse the information from the callback url and use it to get the access token. Refer to your web framework to how to get these values from the callback url.
+
+```python
+# code, scopes, state = parse_callback_url_querystring()  # Refer your web framework
+tokens = client.get_tokens_by_code(code, scopes, state)
+```
+
+#### Get user claims
+
+Claims (information fields) made availble by the OP can be fethed using the access token obtained above.
+
+```python
+user = oxc.get_user_info(tokens.access_token)
+
+# The claims can be accessed using the dot notation.
+print user.username
+print user.website
+
+print user._fields  # to print all the fields
+
+# to check for a particular field and get the information
+if 'website' in user._fields:
+    print getattr(user, 'website')
+    # or
+    print user.website
+```
+
+#### Logout the user
+
+```python
+logout_uri = oxc.get_logout_uri()
+```
+Redirect the user to this uri from your web application to logout the user.
diff --git a/demosite/README.md b/demosite/README.md
new file mode 100644
index 0000000..022d2dc
--- /dev/null
+++ b/demosite/README.md
@@ -0,0 +1,75 @@
+# oxD Python Demo site
+
+This is a demo site for oxd-python written using Python Flask to demonstrate how to use oxd-python to perform authorization with an OpenID Provider and fetch information.
+
+## Deployment
+
+### Prerequisites
+
+Ubuntu 14.04 with some basic utilities listed below
+
+```bash
+apt-get install apache2 libapache2-mod-wsgi python-dev git python-pip
+a2enmod wsgi
+a2enmod ssl
+```
+
+###Gluu Development Binaries
+
+```bash
+echo "deb http://repo.gluu.org/ubuntu/ trusty-devel main" > /etc/apt/sources.list.d/gluu-devel-repo.list
+curl http://repo.gluu.org/ubuntu/gluu-apt.key | apt-key add -
+apt-get update
+apt-get install gluu-oxd-server
+```
+
+### Configuring the oxd-server
+
+Edit the file `/opt/oxd-server/conf/oxd-conf.json`
+
+* Change the OP HOST name to your OpenID Provider domain at the line `"op_host": "https://ce-dev.gluu.org"`
+
+Edit the file `/opt/oxd-server/conf/oxd-default-site-config.json`
+
+* Change the `response_types` line to `"response_types": ["code"]`
+
+Start the oxd-server
+```bash
+service gluu-oxd-server start
+```
+
+## Demosite deployment
+
+OpenID Connect works only with HTTPS connections. So let us get the ssl certs ready
+```bash
+mkdir /etc/certs
+cd /etc/certs
+openssl genrsa -des3 -out demosite.key 2048
+openssl rsa -in demosite.key -out demosite.key.insecure
+mv demosite.key.insecure demosite.key
+openssl req -new -key demosite.key -out demosite.csr
+openssl x509 -req -days 365 -in demosite.csr -signkey demosite.key -out demosite.crt
+```
+
+Get the source code for demosite
+
+```bash
+cd /var/www/html
+git clone https://github.com/GluuFederation/oxd-python.git
+```
+
+Deploying the site
+
+```bash
+cd oxd-python
+pip install -r requirements.txt
+cp demosite/demosite.conf /etc/apache2/sites-available/demosite.conf
+chown www-data demosite/demosite.cfg
+a2ensite demosite
+service apache2 restart
+```
+Now the site would be available as the default site for https (port 443) at your domain.
+However the callback urls need to be configured before you can see things working.
+Edit `demosite/demosite.cfg` and change the redirect uris for yor domain. **OR** If you are testing
+at a local server then you can add `client.example.com` to you `/etc/hosts` to point to your
+IP, instead of editing the uris in the `demosite.cfg` file.
diff --git a/demosite/demosite.cfg b/demosite/demosite.cfg
new file mode 100644
index 0000000..9801572
--- /dev/null
+++ b/demosite/demosite.cfg
@@ -0,0 +1,19 @@
+[oxd]
+host = localhost
+port = 8099
+id = 
+
+[client]
+op_host = https://gluu.example.com
+application_type = web
+authorization_redirect_uri = https://client.example.com/callback
+redirect_uris = https://client.example.com/callback
+post_logout_redirect_uri = https://client.example.com/
+client_logout_uris = https://client.example.com/logout
+grant_types = 
+acr_values = 
+client_jwks_uri = 
+client_token_endpoint_auth_method = 
+client_request_uris = 
+contacts = demo at example.com
+
diff --git a/demosite/demosite.conf b/demosite/demosite.conf
new file mode 100644
index 0000000..b32892b
--- /dev/null
+++ b/demosite/demosite.conf
@@ -0,0 +1,44 @@
+<IfModule mod_ssl.c>
+    <VirtualHost *:443>
+        ServerAdmin webmaster at localhost
+
+        DocumentRoot /var/www/html
+
+        LogLevel info ssl:warn
+        ErrorLog ${APACHE_LOG_DIR}/error.log
+        CustomLog ${APACHE_LOG_DIR}/access.log combined
+
+        SSLEngine on
+        SSLCertificateFile  /etc/certs/demosite.crt
+        SSLCertificateKeyFile /etc/certs/demosite.key
+
+        <FilesMatch "\.(cgi|shtml|phtml|php)$">
+                SSLOptions +StdEnvVars
+        </FilesMatch>
+        <Directory /usr/lib/cgi-bin>
+                SSLOptions +StdEnvVars
+        </Directory>
+
+        BrowserMatch "MSIE [2-6]" \
+                nokeepalive ssl-unclean-shutdown \
+                downgrade-1.0 force-response-1.0
+        # MSIE 7 and newer should be able to use keepalive
+        BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
+
+        WSGIDaemonProcess demosite threads=5 display-name=%{GROUP}
+        WSGIProcessGroup demosite
+
+        WSGIScriptAlias / /var/www/html/oxd-python/demosite/demosite.wsgi
+        <Directory /var/www/html/oxd-python/demosite/>
+            Order allow,deny
+            Allow from all
+        </Directory>
+        Alias /static /var/www/html/oxd-python/demosite/static
+        <Directory /var/www/html/oxd-python/demosite/static/>
+            Order allow,deny
+            Allow from all
+        </Directory>
+    </VirtualHost>
+</IfModule>
+
+# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
diff --git a/demosite/demosite.py b/demosite/demosite.py
new file mode 100644
index 0000000..6200cfe
--- /dev/null
+++ b/demosite/demosite.py
@@ -0,0 +1,51 @@
+import os
+import sys
+from flask import Flask, render_template, redirect, request
+
+this_dir = os.path.dirname(os.path.realpath(__file__))
+config = os.path.join(this_dir, 'demosite.cfg')
+
+# relative import of oxd-python. Comment out the following 3 lines
+# if the library has been installed with setup.py install
+oxd_path = os.path.dirname(this_dir)
+if oxd_path not in sys.path:
+    sys.path.insert(0, oxd_path)
+
+import oxdpython
+
+app = Flask(__name__)
+oxc = oxdpython.Client(config)
+
+
+ at app.route('/')
+def home():
+    return render_template("home.html")
+
+
+ at app.route('/authorize/')
+def authorize():
+    auth_url = oxc.get_authorization_url()
+    return redirect(auth_url)
+
+
+ at app.route('/callback')
+def callabck():
+    # using request from Flask to parse the query string of the callback
+    state = request.args.get('state')
+    code = request.args.get('code')
+    scopes = request.args.get('scope').split(" ")
+
+    tokens = oxc.get_tokens_by_code(code, scopes, state)
+
+    user = oxc.get_user_info(tokens.access_token)
+
+    return render_template("home.html", user=user)
+
+
+ at app.route('/logout')
+def logout():
+    logout_url = oxc.get_logout_uri()
+    return redirect(logout_url)
+
+if __name__ == "__main__":
+    app.run(debug=True, port=8080)
diff --git a/demosite/demosite.wsgi b/demosite/demosite.wsgi
new file mode 100644
index 0000000..6fa4019
--- /dev/null
+++ b/demosite/demosite.wsgi
@@ -0,0 +1,11 @@
+#!/usr/bin/python
+import sys
+import logging
+
+logging.basicConfig(stream=sys.stderr)
+location = '/var/www/html/oxd-python/demosite/'
+if not location in sys.path:
+    sys.path.insert(0, location)
+
+import demosite
+application = demosite.app
diff --git a/demosite/static/css/bootstrap-theme.css b/demosite/static/css/bootstrap-theme.css
new file mode 100644
index 0000000..c19cd5c
--- /dev/null
+++ b/demosite/static/css/bootstrap-theme.css
@@ -0,0 +1,587 @@
+/*!
+ * Bootstrap v3.3.5 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+.btn-default,
+.btn-primary,
+.btn-success,
+.btn-info,
+.btn-warning,
+.btn-danger {
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
+}
+.btn-default:active,
+.btn-primary:active,
+.btn-success:active,
+.btn-info:active,
+.btn-warning:active,
+.btn-danger:active,
+.btn-default.active,
+.btn-primary.active,
+.btn-success.active,
+.btn-info.active,
+.btn-warning.active,
+.btn-danger.active {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+}
+.btn-default.disabled,
+.btn-primary.disabled,
+.btn-success.disabled,
+.btn-info.disabled,
+.btn-warning.disabled,
+.btn-danger.disabled,
+.btn-default[disabled],
+.btn-primary[disabled],
+.btn-success[disabled],
+.btn-info[disabled],
+.btn-warning[disabled],
+.btn-danger[disabled],
+fieldset[disabled] .btn-default,
+fieldset[disabled] .btn-primary,
+fieldset[disabled] .btn-success,
+fieldset[disabled] .btn-info,
+fieldset[disabled] .btn-warning,
+fieldset[disabled] .btn-danger {
+  -webkit-box-shadow: none;
+          box-shadow: none;
+}
+.btn-default .badge,
+.btn-primary .badge,
+.btn-success .badge,
+.btn-info .badge,
+.btn-warning .badge,
+.btn-danger .badge {
+  text-shadow: none;
+}
+.btn:active,
+.btn.active {
+  background-image: none;
+}
+.btn-default {
+  text-shadow: 0 1px 0 #fff;
+  background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
+  background-image:      -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));
+  background-image:         linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #dbdbdb;
+  border-color: #ccc;
+}
+.btn-default:hover,
+.btn-default:focus {
+  background-color: #e0e0e0;
+  background-position: 0 -15px;
+}
+.btn-default:active,
+.btn-default.active {
+  background-color: #e0e0e0;
+  border-color: #dbdbdb;
+}
+.btn-default.disabled,
+.btn-default[disabled],
+fieldset[disabled] .btn-default,
+.btn-default.disabled:hover,
+.btn-default[disabled]:hover,
+fieldset[disabled] .btn-default:hover,
+.btn-default.disabled:focus,
+.btn-default[disabled]:focus,
+fieldset[disabled] .btn-default:focus,
+.btn-default.disabled.focus,
+.btn-default[disabled].focus,
+fieldset[disabled] .btn-default.focus,
+.btn-default.disabled:active,
+.btn-default[disabled]:active,
+fieldset[disabled] .btn-default:active,
+.btn-default.disabled.active,
+.btn-default[disabled].active,
+fieldset[disabled] .btn-default.active {
+  background-color: #e0e0e0;
+  background-image: none;
+}
+.btn-primary {
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #265a88 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #265a88 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #245580;
+}
+.btn-primary:hover,
+.btn-primary:focus {
+  background-color: #265a88;
+  background-position: 0 -15px;
+}
+.btn-primary:active,
+.btn-primary.active {
+  background-color: #265a88;
+  border-color: #245580;
+}
+.btn-primary.disabled,
+.btn-primary[disabled],
+fieldset[disabled] .btn-primary,
+.btn-primary.disabled:hover,
+.btn-primary[disabled]:hover,
+fieldset[disabled] .btn-primary:hover,
+.btn-primary.disabled:focus,
+.btn-primary[disabled]:focus,
+fieldset[disabled] .btn-primary:focus,
+.btn-primary.disabled.focus,
+.btn-primary[disabled].focus,
+fieldset[disabled] .btn-primary.focus,
+.btn-primary.disabled:active,
+.btn-primary[disabled]:active,
+fieldset[disabled] .btn-primary:active,
+.btn-primary.disabled.active,
+.btn-primary[disabled].active,
+fieldset[disabled] .btn-primary.active {
+  background-color: #265a88;
+  background-image: none;
+}
+.btn-success {
+  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
+  background-image:      -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
+  background-image:         linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #3e8f3e;
+}
+.btn-success:hover,
+.btn-success:focus {
+  background-color: #419641;
+  background-position: 0 -15px;
+}
+.btn-success:active,
+.btn-success.active {
+  background-color: #419641;
+  border-color: #3e8f3e;
+}
+.btn-success.disabled,
+.btn-success[disabled],
+fieldset[disabled] .btn-success,
+.btn-success.disabled:hover,
+.btn-success[disabled]:hover,
+fieldset[disabled] .btn-success:hover,
+.btn-success.disabled:focus,
+.btn-success[disabled]:focus,
+fieldset[disabled] .btn-success:focus,
+.btn-success.disabled.focus,
+.btn-success[disabled].focus,
+fieldset[disabled] .btn-success.focus,
+.btn-success.disabled:active,
+.btn-success[disabled]:active,
+fieldset[disabled] .btn-success:active,
+.btn-success.disabled.active,
+.btn-success[disabled].active,
+fieldset[disabled] .btn-success.active {
+  background-color: #419641;
+  background-image: none;
+}
+.btn-info {
+  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
+  background-image:      -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
+  background-image:         linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #28a4c9;
+}
+.btn-info:hover,
+.btn-info:focus {
+  background-color: #2aabd2;
+  background-position: 0 -15px;
+}
+.btn-info:active,
+.btn-info.active {
+  background-color: #2aabd2;
+  border-color: #28a4c9;
+}
+.btn-info.disabled,
+.btn-info[disabled],
+fieldset[disabled] .btn-info,
+.btn-info.disabled:hover,
+.btn-info[disabled]:hover,
+fieldset[disabled] .btn-info:hover,
+.btn-info.disabled:focus,
+.btn-info[disabled]:focus,
+fieldset[disabled] .btn-info:focus,
+.btn-info.disabled.focus,
+.btn-info[disabled].focus,
+fieldset[disabled] .btn-info.focus,
+.btn-info.disabled:active,
+.btn-info[disabled]:active,
+fieldset[disabled] .btn-info:active,
+.btn-info.disabled.active,
+.btn-info[disabled].active,
+fieldset[disabled] .btn-info.active {
+  background-color: #2aabd2;
+  background-image: none;
+}
+.btn-warning {
+  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
+  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
+  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #e38d13;
+}
+.btn-warning:hover,
+.btn-warning:focus {
+  background-color: #eb9316;
+  background-position: 0 -15px;
+}
+.btn-warning:active,
+.btn-warning.active {
+  background-color: #eb9316;
+  border-color: #e38d13;
+}
+.btn-warning.disabled,
+.btn-warning[disabled],
+fieldset[disabled] .btn-warning,
+.btn-warning.disabled:hover,
+.btn-warning[disabled]:hover,
+fieldset[disabled] .btn-warning:hover,
+.btn-warning.disabled:focus,
+.btn-warning[disabled]:focus,
+fieldset[disabled] .btn-warning:focus,
+.btn-warning.disabled.focus,
+.btn-warning[disabled].focus,
+fieldset[disabled] .btn-warning.focus,
+.btn-warning.disabled:active,
+.btn-warning[disabled]:active,
+fieldset[disabled] .btn-warning:active,
+.btn-warning.disabled.active,
+.btn-warning[disabled].active,
+fieldset[disabled] .btn-warning.active {
+  background-color: #eb9316;
+  background-image: none;
+}
+.btn-danger {
+  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+  background-image:      -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
+  background-image:         linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #b92c28;
+}
+.btn-danger:hover,
+.btn-danger:focus {
+  background-color: #c12e2a;
+  background-position: 0 -15px;
+}
+.btn-danger:active,
+.btn-danger.active {
+  background-color: #c12e2a;
+  border-color: #b92c28;
+}
+.btn-danger.disabled,
+.btn-danger[disabled],
+fieldset[disabled] .btn-danger,
+.btn-danger.disabled:hover,
+.btn-danger[disabled]:hover,
+fieldset[disabled] .btn-danger:hover,
+.btn-danger.disabled:focus,
+.btn-danger[disabled]:focus,
+fieldset[disabled] .btn-danger:focus,
+.btn-danger.disabled.focus,
+.btn-danger[disabled].focus,
+fieldset[disabled] .btn-danger.focus,
+.btn-danger.disabled:active,
+.btn-danger[disabled]:active,
+fieldset[disabled] .btn-danger:active,
+.btn-danger.disabled.active,
+.btn-danger[disabled].active,
+fieldset[disabled] .btn-danger.active {
+  background-color: #c12e2a;
+  background-image: none;
+}
+.thumbnail,
+.img-thumbnail {
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+}
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+  background-color: #e8e8e8;
+  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
+  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
+  background-repeat: repeat-x;
+}
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+  background-color: #2e6da4;
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
+  background-repeat: repeat-x;
+}
+.navbar-default {
+  background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
+  background-image:      -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));
+  background-image:         linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
+}
+.navbar-default .navbar-nav > .open > a,
+.navbar-default .navbar-nav > .active > a {
+  background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
+  background-image:      -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));
+  background-image:         linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);
+  background-repeat: repeat-x;
+  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
+}
+.navbar-brand,
+.navbar-nav > li > a {
+  text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
+}
+.navbar-inverse {
+  background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
+  background-image:      -o-linear-gradient(top, #3c3c3c 0%, #222 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));
+  background-image:         linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-radius: 4px;
+}
+.navbar-inverse .navbar-nav > .open > a,
+.navbar-inverse .navbar-nav > .active > a {
+  background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);
+  background-image:      -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));
+  background-image:         linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);
+  background-repeat: repeat-x;
+  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
+          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
+}
+.navbar-inverse .navbar-brand,
+.navbar-inverse .navbar-nav > li > a {
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
+}
+.navbar-static-top,
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  border-radius: 0;
+}
+ at media (max-width: 767px) {
+  .navbar .navbar-nav .open .dropdown-menu > .active > a,
+  .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,
+  .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {
+    color: #fff;
+    background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+    background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
+    background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
+    background-repeat: repeat-x;
+  }
+}
+.alert {
+  text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
+}
+.alert-success {
+  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
+  background-image:      -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
+  background-image:         linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #b2dba1;
+}
+.alert-info {
+  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
+  background-image:      -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
+  background-image:         linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #9acfea;
+}
+.alert-warning {
+  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
+  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
+  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #f5e79e;
+}
+.alert-danger {
+  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
+  background-image:      -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
+  background-image:         linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #dca7a7;
+}
+.progress {
+  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
+  background-image:      -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
+  background-image:         linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar {
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #286090 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #286090 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);
+  background-repeat: repeat-x;
+}
... 28186 lines suppressed ...

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/python-oxd.git



More information about the Python-modules-commits mailing list