[copr] master: [frontend] including project name (0858b3a)
by asamalik@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 0858b3aecdc9b117fbce811ab109e7b064b13977
Author: Adam Samalik <asamalik(a)redhat.com>
Date: Fri Aug 29 10:55:55 2014 +0200
[frontend] including project name
>---------------------------------------------------------------
.../coprs_frontend/coprs/templates/coprs/show.html | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/show.html b/frontend/coprs_frontend/coprs/templates/coprs/show.html
index 682d131..d8ae35d 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/show.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/show.html
@@ -51,6 +51,7 @@
<div class="recent">
<span class="head">
<a href="{{url_for("coprs_ns.copr_build", username = build.copr.owner.name, coprname = build.copr.name, build_id = build.id)}}">{{build.id}}</a> - <span class="build build-{{build.state}}">{{build.state}} </span></span><br>
+ <span> <a href="{{url_for("coprs_ns.copr_detail", username = build.copr.owner.name, coprname = build.copr.name)}}"> {{build.copr.owner.name}}/{{build.copr.name}} </a> </span> <br>
<span> {{build.pkgs | pkg_name}} </span> <br>
<span class="time">{{build.ended_on|time_ago()}} ago</span>
</div>
9 years, 8 months
[copr] master: [frontend] recent builds on the home page (0ba2efa)
by asamalik@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 0ba2efaa9971a1aeaf4079221058ef916c90be69
Author: Adam Samalik <asamalik(a)redhat.com>
Date: Thu Aug 28 17:31:05 2014 +0200
[frontend] recent builds on the home page
>---------------------------------------------------------------
frontend/coprs_frontend/coprs/static/copr.css | 32 +++++++++---
.../coprs_frontend/coprs/templates/coprs/show.html | 56 ++++++++++++--------
.../coprs/views/coprs_ns/coprs_general.py | 24 ++++++---
3 files changed, 75 insertions(+), 37 deletions(-)
diff --git a/frontend/coprs_frontend/coprs/static/copr.css b/frontend/coprs_frontend/coprs/static/copr.css
index df9e141..d78df1e 100644
--- a/frontend/coprs_frontend/coprs/static/copr.css
+++ b/frontend/coprs_frontend/coprs/static/copr.css
@@ -48,21 +48,38 @@ div.left-side-space {
}
div.left-side-space div {
- margin-top: 30px;
+ margin-top: 15px;
+ margin-bottom: 15px;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ //border-top: 1px solid #ddd;
}
-div.left-side-space div a{
- font-size: 1.1em;
+div.left-side-space div div {
+ border: none;
+ margin-top: 0px;
+ //background-color: #f9f9f9;
+}
+
+div.left-side-space div a.menu {
+ font-size: 1.2em;
font-weight: bold;
+ //background-color: #ececec;
+ display: block;
+ margin-bottom: 8px;
}
-div.left-side-space div div.recent{
- margin-top: 10px;
+div.left-side-space div div.recent {
+ margin-bottom: 15px;
+ margin-top: 0px;
}
div.left-side-space div div.recent a {
- font-size: 1.3em;
- font-weight: normal;
+ font-size: 1em;
+}
+
+div.left-side-space div div.recent span.head {
+ font-weight: bold;
}
div.left-side-space div div.recent span.time {
@@ -153,6 +170,7 @@ div.about-copr {
background-color: #ececec;
padding-top: 1em;
padding-bottom: 1em;
+ margin-bottom: 1em;
border-radius: 5px;
-moz-border-radius: 5px;
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/show.html b/frontend/coprs_frontend/coprs/templates/coprs/show.html
index 517bbca..682d131 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/show.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/show.html
@@ -3,8 +3,20 @@
{% block header %}Project List{% endblock %}
{% from "_helpers.html" import render_pagination %}
{% block body %}
- {% if g.user %}
+ {% if not g.user and not fulltext%}
+ <div class="about-copr">
+ <p>Copr is an easy-to-use automatic build system providing a package repository as its output.</p>
+ <p>Start with making your own repository in these three steps:</p>
+ <ol>
+ <li>choose an architecture and system you want to build for</li>
+ <li>provide Copr with src.rpm packages available online</li>
+ <li>let Copr do all the work and wait for your new repo</li>
+ </ol>
+ <p>For more information please visit <a href="https://fedorahosted.org/copr/">Copr wiki</a></p>
+ </div>
+ {% endif %}
<div class="user-info">
+ {% if g.user %}
<a href="{{ url_for('coprs_ns.coprs_by_owner', username=g.user.name) }}" title="My Projects">
<img src="{{ g.user.gravatar_url }}" alt="User Image">
</a>
@@ -13,17 +25,33 @@
<a href="{{ url_for('coprs_ns.coprs_by_owner', username=g.user.name) }}" title="My Projects">{{ g.user.coprs_count }}</a>
</p>
<p class="other-text">projects</p>
+ {% endif %}
<div class="left-side-space">
<div>
- <a href="{{url_for('status_ns.waiting')}}">Copr status</a>
+ <a class="menu" href="{{url_for('status_ns.waiting')}}">Task queue</a>
+ <div>
+ {% if running_tasks: %}
+ {{running_tasks}}
+ {% else: %}
+ No
+ {% endif %} running <br>
+ {% if waiting_tasks: %}
+ {{waiting_tasks}}
+ {% else: %}
+ No
+ {% endif %} waiting
+ </div>
</div>
<div>
- <a href="{{url_for('recent_ns.recent')}}">My finished builds</a>
+ <a class="menu" href="{{url_for('recent_ns.recent')}}">
+ {% if g.user: %} My recent builds {% else %} Recent builds {% endif %}
+ </a>
{% if users_builds: %}
{% for build in users_builds: %}
<div class="recent">
- <a href="{{url_for("coprs_ns.copr_build", username = build.copr.owner.name, coprname = build.copr.name, build_id = build.id)}}">{{build.id}}</a> <span class="build build-{{build.state}}">{{build.state}} </span><br>
- {{build.pkgs | pkg_name}} <br>
+ <span class="head">
+ <a href="{{url_for("coprs_ns.copr_build", username = build.copr.owner.name, coprname = build.copr.name, build_id = build.id)}}">{{build.id}}</a> - <span class="build build-{{build.state}}">{{build.state}} </span></span><br>
+ <span> {{build.pkgs | pkg_name}} </span> <br>
<span class="time">{{build.ended_on|time_ago()}} ago</span>
</div>
{% endfor %}
@@ -31,23 +59,7 @@
</div>
</div>
</div>
- {% endif %}
- {% if not g.user and not fulltext%}
- <div class="about-copr">
- <p>Copr is an easy-to-use automatic build system providing a package repository as its output.</p>
- <p>Start with making your own repository in these three steps:</p>
- <ol>
- <li>choose an architecture and system you want to build for</li>
- <li>provide Copr with src.rpm packages available online</li>
- <li>let Copr do all the work and wait for your new repo</li>
- </ol>
- <p>For more information please visit <a href="https://fedorahosted.org/copr/">Copr wiki</a></p>
- </div>
- {% endif %}
- <div class="pagination">
- {{ render_pagination(request, paginator) }}
- </div>
- <div class="coprs-list-{% if g.user %}thin{% else %}thick{% endif %}">
+ <div class="coprs-list-{% if g.user %}thin{% else %}thin{% endif %}">
{% if g.user %}
<div class="add-copr">+
<a href="{{url_for('coprs_ns.copr_add', username=g.user.name) }}">
diff --git a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_general.py b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_general.py
index bb8d11b..ed7d9ca 100644
--- a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_general.py
+++ b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_general.py
@@ -34,14 +34,18 @@ def coprs_show(page=1):
coprs = paginator.sliced_query
- if flask.g.user:
- users_builds = builds_logic.BuildsLogic.get_recent_tasks(flask.g.user, 5)
- else:
- users_builds = []
+ # flask.g.user is none when no user is logged - showing builds from everyone
+ users_builds = builds_logic.BuildsLogic.get_recent_tasks(flask.g.user, 5)
+
+ waiting_tasks = len(list(builds_logic.BuildsLogic.get_build_task_queue()))
+ running_tasks = len(list(builds_logic.BuildsLogic.get_build_tasks(
+ helpers.StatusEnum("running"))))
return flask.render_template("coprs/show.html",
coprs=coprs,
paginator=paginator,
+ waiting_tasks=waiting_tasks,
+ running_tasks=running_tasks,
users_builds=users_builds)
@@ -57,14 +61,18 @@ def coprs_by_owner(username=None, page=1):
coprs = paginator.sliced_query
- if flask.g.user:
- users_builds = builds_logic.BuildsLogic.get_recent_tasks(flask.g.user, 5)
- else:
- users_builds = []
+ # flask.g.user is none when no user is logged - showing builds from everyone
+ users_builds = builds_logic.BuildsLogic.get_recent_tasks(flask.g.user, 5)
+
+ waiting_tasks = len(list(builds_logic.BuildsLogic.get_build_task_queue()))
+ running_tasks = len(list(builds_logic.BuildsLogic.get_build_tasks(
+ helpers.StatusEnum("running"))))
return flask.render_template("coprs/show.html",
coprs=coprs,
paginator=paginator,
+ waiting_tasks=waiting_tasks,
+ running_tasks=running_tasks,
users_builds=users_builds)
9 years, 8 months
[copr] master: support for kerberos authentication (8d1c813)
by asamalik@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 8d1c8135bcb261b394efb19460fbee45f2c31191
Author: Pavel Raiskup <praiskup(a)redhat.com>
Date: Thu Aug 21 11:35:38 2014 +0200
support for kerberos authentication
The krb auth method is aimed to be self-standing auth method, but
also can be used as alternative way how to connect to Copr
in parallel with Fedora OpenID authentication method.
The OpenID is currently still the default and the Copr 'username'
is bound to OpenID username (such usernames must match); this
should be fixed in future so that the Copr user is 1:N mapped to
OpenID credentials (similarly like the krb is).
>---------------------------------------------------------------
.../versions/2a4242380f24_add_krb5_login_table.py | 27 +++++
frontend/coprs_frontend/config/copr.conf | 24 +++++
frontend/coprs_frontend/coprs/config.py | 3 +
frontend/coprs_frontend/coprs/models.py | 19 ++++
frontend/coprs_frontend/coprs/templates/403.html | 10 ++
.../coprs_frontend/coprs/templates/layout.html | 7 +-
frontend/coprs_frontend/coprs/views/misc.py | 106 +++++++++++++++++---
7 files changed, 182 insertions(+), 14 deletions(-)
diff --git a/frontend/coprs_frontend/alembic/versions/2a4242380f24_add_krb5_login_table.py b/frontend/coprs_frontend/alembic/versions/2a4242380f24_add_krb5_login_table.py
new file mode 100644
index 0000000..08a7b0f
--- /dev/null
+++ b/frontend/coprs_frontend/alembic/versions/2a4242380f24_add_krb5_login_table.py
@@ -0,0 +1,27 @@
+"""Add 'krb5_login' table
+
+Revision ID: 2a4242380f24
+Revises: bd0a15c7b6f
+Create Date: 2014-08-21 11:40:19.181293
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = '2a4242380f24'
+down_revision = 'bd0a15c7b6f'
+
+from alembic import op
+import sqlalchemy as sa
+
+
+def upgrade():
+ op.create_table('krb5_login',
+ sa.Column('user_id', sa.Integer(), nullable=False),
+ sa.Column('config_name', sa.String(length=30), nullable=False),
+ sa.Column('primary', sa.String(length=80), nullable=False),
+ sa.ForeignKeyConstraint(['user_id'], ['user.id'], ),
+ sa.PrimaryKeyConstraint('primary', 'config_name')
+ )
+
+def downgrade():
+ op.drop_table('krb5_login')
diff --git a/frontend/coprs_frontend/config/copr.conf b/frontend/coprs_frontend/config/copr.conf
index 2d39d3b..4f70fe7 100644
--- a/frontend/coprs_frontend/config/copr.conf
+++ b/frontend/coprs_frontend/config/copr.conf
@@ -37,3 +37,27 @@ SQLALCHEMY_ECHO = False
# send emails when user's perms change in project?
SEND_EMAILS = True
+
+# Kerberos authentication configuration. Example configuration abbreviated
+# like 'RH' (should not changed once used, reflects what is stored in database).
+# This requires mod_auth_kerb package (Fedora/RHEL) installed on your frontend
+# machine.
+#
+# log_text - What text will be shown in top-menu link pointing to URI
+# with particular Kerberos login
+# URI - Users can do authentication on /krb5_login/<URI>/
+# (accessible from top-menu link). Note that apache must be
+# configured to perforem KRB authentication on the
+# /krb5_login/<URI>/ URI. See mod
+# email_domain - For simplicity, we expect that all users coming from the
+# same krb realm have the same (implicit) email domain. E.g.
+# kerberos user user(a)REDHAT.COM is expected to have
+# user(a)redhat.com email address.
+
+#KRB5_LOGIN = {
+# 'RH': {
+# 'URI': "redhat",
+# 'log_text': "Krb5 login",
+# 'email_domain': "redhat.com",
+# }
+#}
diff --git a/frontend/coprs_frontend/coprs/config.py b/frontend/coprs_frontend/coprs/config.py
index 31b3618..14be052 100644
--- a/frontend/coprs_frontend/coprs/config.py
+++ b/frontend/coprs_frontend/coprs/config.py
@@ -10,6 +10,9 @@ class Config(object):
SECRET_KEY = "THISISNOTASECRETATALL"
BACKEND_PASSWORD = "thisisbackend"
+ KRB5_LOGIN_BASEURI = "/krb5_login/"
+ KRB5_LOGIN = {}
+
# restrict access to a set of users
USE_ALLOWED_USERS = False
ALLOWED_USERS = []
diff --git a/frontend/coprs_frontend/coprs/models.py b/frontend/coprs_frontend/coprs/models.py
index 420f49c..f2d8838 100644
--- a/frontend/coprs_frontend/coprs/models.py
+++ b/frontend/coprs_frontend/coprs/models.py
@@ -501,3 +501,22 @@ class Action(db.Model, helpers.Serializer):
return "Action {0} on {1}, old value: {2}, new value: {3}.".format(
self.action_type, self.object_type, self.old_value, self.new_value)
+
+
+class Krb5Login(db.Model, helpers.Serializer):
+ """
+ Represents additional user information for kerberos authentication.
+ """
+
+ __tablename__ = "krb5_login"
+
+ # FK to User table
+ user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
+
+ # 'string' from 'copr.conf' from KRB5_LOGIN[string]
+ config_name = db.Column(db.String(30), nullable=False, primary_key=True)
+
+ # krb's primary, i.e. 'username' from 'username(a)EXAMPLE.COM'
+ primary = db.Column(db.String(80), nullable=False, primary_key=True)
+
+ user = db.relationship("User", backref=db.backref("krb5_logins"))
diff --git a/frontend/coprs_frontend/coprs/templates/403.html b/frontend/coprs_frontend/coprs/templates/403.html
new file mode 100644
index 0000000..ec60202
--- /dev/null
+++ b/frontend/coprs_frontend/coprs/templates/403.html
@@ -0,0 +1,10 @@
+{% extends "layout.html" %}
+{% block title %}Permission denied{% endblock %}
+{% block header %}Permission denied!{% endblock %}
+{% block body %}
+ {% if message %}
+ {{ message }}
+ {% else %}
+ You are not allowed to see this page.
+ {% endif %}
+{% endblock %}
diff --git a/frontend/coprs_frontend/coprs/templates/layout.html b/frontend/coprs_frontend/coprs/templates/layout.html
index 1d520fe..9ec9985 100644
--- a/frontend/coprs_frontend/coprs/templates/layout.html
+++ b/frontend/coprs_frontend/coprs/templates/layout.html
@@ -23,7 +23,12 @@
{% if g.user %}
<div><span class="text">logged in as </span><a href="https://admin.fedoraproject.org/accounts/user/view/{{ g.user.name }}">{{ g.user.name }}</a> | <a href="{{ url_for('misc.logout') }}">log out</a></div>
{% else %}
- <div><a href="{{ url_for('misc.login') }}">log in</a> | <a href="https://admin.fedoraproject.org/accounts/user/new">sign up</a></div>
+ <div>
+ <a href="{{ url_for('misc.login') }}">log in</a> |
+ {% for key,val in config.KRB5_LOGIN.iteritems() %}
+ <a href="{{ config.KRB5_LOGIN_BASEURI }}{{ val.URI }}/">{{ val.log_text }}</a> |
+ {% endfor %}
+ <a href="https://admin.fedoraproject.org/accounts/user/new">sign up</a></div>
{% endif %}
<form method="get" action="{{ url_for('coprs_ns.coprs_fulltext_search') }}">
<input class="rounded" type="text" name="fulltext">
diff --git a/frontend/coprs_frontend/coprs/views/misc.py b/frontend/coprs_frontend/coprs/views/misc.py
index 0d84df7..5650c4c 100644
--- a/frontend/coprs_frontend/coprs/views/misc.py
+++ b/frontend/coprs_frontend/coprs/views/misc.py
@@ -2,6 +2,7 @@ import base64
import datetime
import functools
+import re
import flask
from coprs import app
@@ -20,15 +21,39 @@ def fed_openidize_name(name):
return "http://{0}.id.fedoraproject.org/".format(name)
+
+def create_user_wrapper(username, email, timezone=None):
+ expiration_date_token = datetime.date.today() + \
+ datetime.timedelta(
+ days=flask.current_app.config["API_TOKEN_EXPIRATION"])
+
+ copr64 = base64.b64encode("copr") + "##"
+ user = models.User(username=username, mail=email,
+ timezone=timezone,
+ api_login=copr64 + helpers.generate_api_token(
+ app.config["API_TOKEN_LENGTH"] - len(copr64)),
+ api_token=helpers.generate_api_token(
+ app.config["API_TOKEN_LENGTH"]),
+ api_token_expiration=expiration_date_token)
+ return user
+
+
def fed_raw_name(oidname):
return oidname.replace(".id.fedoraproject.org/", "") \
.replace("http://", "")
+def krb_strip_realm(fullname):
+ return re.sub(r'@.*', '', fullname)
+
@app.before_request
def lookup_current_user():
- flask.g.user = None
+ flask.g.user = username = None
if "openid" in flask.session:
username = fed_raw_name(flask.session["openid"])
+ elif "krb5_login" in flask.session:
+ username = flask.session["krb5_login"]
+
+ if username:
flask.g.user = models.User.query.filter(
models.User.username == username).first()
@@ -41,6 +66,71 @@ def page_not_found(message):
misc = flask.Blueprint("misc", __name__)
+(a)misc.route(app.config['KRB5_LOGIN_BASEURI'] + "<name>/", methods=["GET"])
+def krb5_login(name):
+ """
+ Handle the Kerberos authentication.
+
+ Note that if we are able to get here, either the user is authenticated
+ correctly, or apache is mis-configured and it does not perform KRB
+ authentication at all. Note also, even if that can be considered ugly, we
+ are reusing oid's get_next_url feature with kerberos login.
+ """
+
+ # Already logged in?
+ if flask.g.user is not None:
+ return flask.redirect(oid.get_next_url())
+
+ krb_config = app.config['KRB5_LOGIN']
+
+ found = None
+ for key in krb_config.keys():
+ if krb_config[key]['URI'] == name:
+ found = key
+ break
+
+ if not found:
+ # no KRB5_LOGIN.<name> configured in copr.conf
+ return flask.render_template("404.html"), 404
+
+ if not 'REMOTE_USER' in flask.request.environ:
+ nocred = "Kerberos authentication failed (no credentials provided)"
+ return flask.render_template("403.html",
+ message=nocred), 403
+
+ krb_username = flask.request.environ['REMOTE_USER']
+ username = krb_strip_realm(krb_username)
+
+ login = models.Krb5Login.query \
+ .filter(models.Krb5Login.config_name == key) \
+ .filter(models.Krb5Login.primary == username) \
+ .first()
+ if login:
+ flask.g.user = login.user
+ flask.session['krb5_login'] = login.user.name
+ flask.flash(u"Welcome, {0}".format(flask.g.user.name))
+ return flask.redirect(oid.get_next_url())
+
+ # We need to create row in 'krb5_login' table
+ user = models.User.query \
+ .filter(models.User.username == username) \
+ .first()
+ if not user:
+ # Even the item in 'user' table does not exist, create _now_
+ email = username + "@" + krb_config[key]['email_domain']
+ user = create_user_wrapper(username, email)
+ db.session.add(user)
+
+ login = models.Krb5Login(user=user, primary=username, config_name=key)
+ db.session.add(login)
+ db.session.commit()
+
+ flask.flash(u"Welcome, {0}".format(user.name))
+ flask.g.user = user
+ flask.session['krb5_login'] = user.name
+ return flask.redirect(oid.get_next_url())
+
+
@misc.route("/login/", methods=["GET"])
@oid.loginhandler
def login():
@@ -66,18 +156,7 @@ def create_or_login(resp):
user = models.User.query.filter(
models.User.username == username).first()
if not user: # create if not created already
- expiration_date_token = datetime.date.today() + \
- datetime.timedelta(
- days=flask.current_app.config["API_TOKEN_EXPIRATION"])
-
- copr64 = base64.b64encode("copr") + "##"
- user = models.User(username=username, mail=resp.email,
- timezone=resp.timezone,
- api_login=copr64 + helpers.generate_api_token(
- app.config["API_TOKEN_LENGTH"] - len(copr64)),
- api_token=helpers.generate_api_token(
- app.config["API_TOKEN_LENGTH"]),
- api_token_expiration=expiration_date_token)
+ user = create_user_wrapper(username, resp.email, resp.timezone)
else:
user.mail = resp.email
user.timezone = resp.timezone
@@ -99,6 +178,7 @@ def create_or_login(resp):
@misc.route("/logout/")
def logout():
flask.session.pop("openid", None)
+ flask.session.pop("krb5_login", None)
flask.flash(u"You were signed out")
return flask.redirect(oid.get_next_url())
9 years, 8 months
[copr] master: do not strictly resist on Fedora's OpenID (f6d60d0)
by asamalik@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit f6d60d0a582fbec78aa1699bebc23112a354e572
Author: Pavel Raiskup <praiskup(a)redhat.com>
Date: Wed Aug 20 22:50:37 2014 +0200
do not strictly resist on Fedora's OpenID
To allow users use multiple authentication options concurrently
(e.g. simply password/hash auth in future & Fedora OpenID), we
need to keep single and unique username in our database. To allow
that, transform the 'openid_name' column from 'user' table into
simple 'username'.
>---------------------------------------------------------------
.../bd0a15c7b6f_dont_require_fed_openid.py | 66 ++++++++++++++++++++
.../coprs_frontend/coprs/logic/builds_logic.py | 3 +-
frontend/coprs_frontend/coprs/logic/coprs_logic.py | 8 +--
frontend/coprs_frontend/coprs/models.py | 31 ++++------
frontend/coprs_frontend/coprs/views/misc.py | 21 +++++-
frontend/coprs_frontend/tests/coprs_test_case.py | 12 ++--
.../test_views/test_admin/test_admin_general.py | 4 +-
7 files changed, 108 insertions(+), 37 deletions(-)
diff --git a/frontend/coprs_frontend/alembic/versions/bd0a15c7b6f_dont_require_fed_openid.py b/frontend/coprs_frontend/alembic/versions/bd0a15c7b6f_dont_require_fed_openid.py
new file mode 100644
index 0000000..d6e121f
--- /dev/null
+++ b/frontend/coprs_frontend/alembic/versions/bd0a15c7b6f_dont_require_fed_openid.py
@@ -0,0 +1,66 @@
+"""Do not require Fedora's OpenID in DB schema
+
+Revision ID: bd0a15c7b6f
+Revises: 5055336e8c44
+Create Date: 2014-08-20 21:49:05.299819
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = 'bd0a15c7b6f'
+down_revision = '5055336e8c44'
+
+from alembic import op
+import sqlalchemy as sa
+import logging
+
+logger = logging.getLogger('alembic')
+
+metadata = sa.MetaData()
+
+def username_default(oid_user):
+ return oid_user.replace(".id.fedoraproject.org/", "") \
+ .replace("http://", "")
+
+def upgrade():
+ op.add_column(u'user', sa.Column('username', sa.String(length=100)))
+
+ sa_user = sa.Table("user", metadata,
+ sa.Column("id", sa.Integer),
+ sa.Column("openid_name", sa.String(length=100)),
+ sa.Column("username", sa.String(length=100))
+ )
+
+ for u in op.get_bind().execute(sa.select([sa_user.c.id, sa_user.c.openid_name])):
+ username = username_default(u[1])
+ logger.info("converting {0}'s account".format(username))
+ op.get_bind().execute(sa_user.update() \
+ .where(sa_user.c.id==u[0]) \
+ .values(username=username))
+
+ if op.get_bind().dialect.name != 'sqlite':
+ # Pretty sad we can not set this non-nullable in SQLite
+ op.alter_column("user", "username", nullable=False)
+ # We can live with redundant openid_name column..
+ op.drop_column(u'user', u'openid_name')
+
+
+def downgrade():
+ op.add_column(u'user', sa.Column(u'openid_name', sa.VARCHAR(length=100), nullable=True))
+
+ sa_user = sa.Table("user", metadata,
+ sa.Column("id", sa.Integer),
+ sa.Column("openid_name", sa.String(length=100)),
+ sa.Column("username", sa.String(length=100))
+ )
+
+ for u in op.get_bind().execute(sa.select([sa_user.c.id, sa_user.c.username])):
+ openid_name = "http://{0}.id.fedoraproject.org/".format(str(u[1]))
+ op.get_bind().execute(sa_user.update() \
+ .where(sa_user.c.id==u[0]) \
+ .values(openid_name=openid_name)
+ )
+
+ if op.get_bind().dialect.name != 'sqlite':
+ op.drop_column(u'user', 'username')
+ op.alter_column("user", "openid_name", nullable=False)
diff --git a/frontend/coprs_frontend/coprs/logic/builds_logic.py b/frontend/coprs_frontend/coprs/logic/builds_logic.py
index 38d151f..6f8ffc4 100644
--- a/frontend/coprs_frontend/coprs/logic/builds_logic.py
+++ b/frontend/coprs_frontend/coprs/logic/builds_logic.py
@@ -78,8 +78,7 @@ class BuildsLogic(object):
.options(db.contains_eager(models.Build.copr))
.join(models.Copr.owner)
.filter(models.Copr.name == coprname)
- .filter(models.User.openid_name ==
- models.User.openidize_name(username))
+ .filter(models.User.username == username)
.order_by(models.Build.submitted_on.desc()))
else:
raise exceptions.ArgumentMissingException(
diff --git a/frontend/coprs_frontend/coprs/logic/coprs_logic.py b/frontend/coprs_frontend/coprs/logic/coprs_logic.py
index 2607ca9..b7ed37b 100644
--- a/frontend/coprs_frontend/coprs/logic/coprs_logic.py
+++ b/frontend/coprs_frontend/coprs/logic/coprs_logic.py
@@ -33,8 +33,7 @@ class CoprsLogic(object):
query = (cls.get_all()
.filter(models.Copr.name == coprname)
- .filter(models.User.openid_name ==
- models.User.openidize_name(username))
+ .filter(models.User.username == username)
)
if with_builds:
@@ -73,7 +72,7 @@ class CoprsLogic(object):
if user_relation == "owned":
query = query.filter(
- models.User.openid_name == models.User.openidize_name(username))
+ models.User.username == username)
elif user_relation == "allowed":
aliased_user = db.aliased(models.User)
@@ -82,8 +81,7 @@ class CoprsLogic(object):
.filter(models.CoprPermission.copr_builder ==
helpers.PermissionEnum('approved'))
.join(aliased_user, models.CoprPermission.user)
- .filter(aliased_user.openid_name ==
- models.User.openidize_name(username)))
+ .filter(aliased_user.username == username))
if with_mock_chroots:
query = (query.outerjoin(*models.Copr.mock_chroots.attr)
diff --git a/frontend/coprs_frontend/coprs/models.py b/frontend/coprs_frontend/coprs/models.py
index e30b819..420f49c 100644
--- a/frontend/coprs_frontend/coprs/models.py
+++ b/frontend/coprs_frontend/coprs/models.py
@@ -7,25 +7,31 @@ from coprs import constants
from coprs import db
from coprs import helpers
-
class User(db.Model, helpers.Serializer):
"""
Represents user of the copr frontend
"""
+ # PK; TODO: the 'username' could be also PK
id = db.Column(db.Integer, primary_key=True)
- # openid_name for fas, e.g. http://bkabrda.id.fedoraproject.org/
- openid_name = db.Column(db.String(100), nullable=False)
- # just mail :)
+
+ # unique username
+ username = db.Column(db.String(100), nullable=False, unique=True)
+
+ # email
mail = db.Column(db.String(150), nullable=False)
- # just timezone ;)
+
+ # optional timezone
timezone = db.Column(db.String(50), nullable=True)
+
# is this user proven? proven users can modify builder memory and
# timeout for single builds
proven = db.Column(db.Boolean, default=False)
+
# is this user admin of the system?
admin = db.Column(db.Boolean, default=False)
+
# stuff for the cli interface
api_login = db.Column(db.String(40), nullable=False, default="abc")
api_token = db.Column(db.String(40), nullable=False, default="abc")
@@ -38,8 +44,7 @@ class User(db.Model, helpers.Serializer):
Return the short username of the user, e.g. bkabrda
"""
- return self.openid_name.replace(
- ".id.fedoraproject.org/", "").replace("http://", "")
+ return self.username
def permissions_for_copr(self, copr):
"""
@@ -87,17 +92,6 @@ class User(db.Model, helpers.Serializer):
return can_edit
- @classmethod
- def openidize_name(cls, name):
- """
- Create proper openid_name from short name.
-
- >>> user.openid_name == User.openidize_name(user.name)
- True
- """
-
- return "http://{0}.id.fedoraproject.org/".format(name)
-
@property
def serializable_attributes(self):
# enumerate here to prevent exposing credentials
@@ -124,7 +118,6 @@ class User(db.Model, helpers.Serializer):
except IOError:
return ""
-
class Copr(db.Model, helpers.Serializer):
"""
diff --git a/frontend/coprs_frontend/coprs/views/misc.py b/frontend/coprs_frontend/coprs/views/misc.py
index c557511..0d84df7 100644
--- a/frontend/coprs_frontend/coprs/views/misc.py
+++ b/frontend/coprs_frontend/coprs/views/misc.py
@@ -10,13 +10,27 @@ from coprs import helpers
from coprs import models
from coprs import oid
+def fed_openidize_name(name):
+ """
+ Create proper Fedora OpenID name from short name.
+
+ >>> fedoraoid == fed_openidize_name(user.name)
+ True
+ """
+
+ return "http://{0}.id.fedoraproject.org/".format(name)
+
+def fed_raw_name(oidname):
+ return oidname.replace(".id.fedoraproject.org/", "") \
+ .replace("http://", "")
@app.before_request
def lookup_current_user():
flask.g.user = None
if "openid" in flask.session:
+ username = fed_raw_name(flask.session["openid"])
flask.g.user = models.User.query.filter(
- models.User.openid_name == flask.session["openid"]).first()
+ models.User.username == username).first()
@app.errorhandler(404)
@@ -48,15 +62,16 @@ def create_or_login(resp):
and fasusername in app.config["ALLOWED_USERS"])
or not app.config["USE_ALLOWED_USERS"]):
+ username = fed_raw_name(resp.identity_url)
user = models.User.query.filter(
- models.User.openid_name == resp.identity_url).first()
+ models.User.username == username).first()
if not user: # create if not created already
expiration_date_token = datetime.date.today() + \
datetime.timedelta(
days=flask.current_app.config["API_TOKEN_EXPIRATION"])
copr64 = base64.b64encode("copr") + "##"
- user = models.User(openid_name=resp.identity_url, mail=resp.email,
+ user = models.User(username=username, mail=resp.email,
timezone=resp.timezone,
api_login=copr64 + helpers.generate_api_token(
app.config["API_TOKEN_LENGTH"] - len(copr64)),
diff --git a/frontend/coprs_frontend/tests/coprs_test_case.py b/frontend/coprs_frontend/tests/coprs_test_case.py
index 179555c..54fe7fe 100644
--- a/frontend/coprs_frontend/tests/coprs_test_case.py
+++ b/frontend/coprs_frontend/tests/coprs_test_case.py
@@ -48,18 +48,18 @@ class CoprsTestCase(object):
@pytest.fixture
def f_users(self):
self.u1 = models.User(
- openid_name=u"http://user1.id.fedoraproject.org/",
+ username=u"user1",
proven=False,
admin=True,
mail="user1(a)foo.bar")
self.u2 = models.User(
- openid_name=u"http://user2.id.fedoraproject.org/",
+ username=u"user2",
proven=False,
mail="user2(a)spam.foo")
self.u3 = models.User(
- openid_name=u"http://user3.id.fedoraproject.org/",
+ username=u"user3",
proven=False,
mail="baz(a)bar.bar")
@@ -198,7 +198,7 @@ class TransactionDecorator(object):
with self.tc as test_client:
with c.session_transaction() as session:
- session['openid'] = self.u.openid_name
+ session['openid'] = self.u.username
where 'u' stands for any user from 'f_users' fixture, use this to decorate
your test function:
@@ -209,7 +209,7 @@ class TransactionDecorator(object):
# you can also access object 'test_client' through 'self.test_client'
where decorator parameter ''u'' stands for string representation of any
- user from 'f_users' fixture from which you wish to store 'openid_name'.
+ user from 'f_users' fixture from which you wish to store 'username'.
Please note that you **must** include 'f_users' fixture in decorated
function parameters.
@@ -223,6 +223,6 @@ class TransactionDecorator(object):
def wrapper(fn, fn_self, *args):
with fn_self.tc as fn_self.test_client:
with fn_self.test_client.session_transaction() as session:
- session["openid"] = getattr(fn_self, self.user).openid_name
+ session["openid"] = getattr(fn_self, self.user).username
return fn(fn_self, *args)
return decorator.decorator(wrapper, fn)
diff --git a/frontend/coprs_frontend/tests/test_views/test_admin/test_admin_general.py b/frontend/coprs_frontend/tests/test_views/test_admin/test_admin_general.py
index 60eba07..7489374 100644
--- a/frontend/coprs_frontend/tests/test_views/test_admin/test_admin_general.py
+++ b/frontend/coprs_frontend/tests/test_views/test_admin/test_admin_general.py
@@ -9,7 +9,7 @@ class TestAdminLogin(CoprsTestCase):
def test_nonadmin_cant_login(self, f_users, f_db):
with self.tc as c:
with c.session_transaction() as s:
- s["openid"] = self.u2.openid_name
+ s["openid"] = self.u2.username
r = c.get("/admin/", follow_redirects=True)
assert self.text_to_check not in r.data
@@ -17,7 +17,7 @@ class TestAdminLogin(CoprsTestCase):
def test_admin_can_login(self, f_users, f_db):
with self.tc as c:
with c.session_transaction() as s:
- s["openid"] = self.u1.openid_name
+ s["openid"] = self.u1.username
r = c.get("/admin/", follow_redirects=True)
assert self.text_to_check in r.data
9 years, 8 months
[copr] master: [frontend] project search update after patch (178c1ec)
by asamalik@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 178c1ec15a420a48d8bd241940807bcb60b9a0ba
Author: Adam Samalik <asamalik(a)redhat.com>
Date: Thu Aug 28 13:21:44 2014 +0200
[frontend] project search update after patch
>---------------------------------------------------------------
frontend/coprs_frontend/coprs/logic/coprs_logic.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/frontend/coprs_frontend/coprs/logic/coprs_logic.py b/frontend/coprs_frontend/coprs/logic/coprs_logic.py
index b7ed37b..45e1a1d 100644
--- a/frontend/coprs_frontend/coprs/logic/coprs_logic.py
+++ b/frontend/coprs_frontend/coprs/logic/coprs_logic.py
@@ -118,7 +118,7 @@ class CoprsLogic(object):
# searching for user/project
name = "%{}%".format(search_string.split("/")[0])
project = "%{}%".format(search_string.split("/")[1])
- query = query.filter(and_(models.User.openid_name.ilike(name),
+ query = query.filter(and_(models.User.username.ilike(name),
models.Copr.name.ilike(project)))
else:
# fulltext search
9 years, 8 months
[copr] master: Automatic commit of package [python-copr] release [1.48-1]. (07b03e9)
by vgologuz@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 07b03e9bf6847b865b119cc5313fada106b5df13
Author: Valentin Gologuzov <vgologuz(a)redhat.com>
Date: Wed Aug 27 20:55:55 2014 +0200
Automatic commit of package [python-copr] release [1.48-1].
>---------------------------------------------------------------
python/python-copr.spec | 5 ++++-
rel-eng/packages/python-copr | 2 +-
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/python/python-copr.spec b/python/python-copr.spec
index 0dd0e60..cd7ea60 100644
--- a/python/python-copr.spec
+++ b/python/python-copr.spec
@@ -10,7 +10,7 @@
%endif
Name: python-copr
-Version: 1.47
+Version: 1.48
Release: 1%{?dist}
Summary: Python interface for Copr
@@ -165,6 +165,9 @@ popd
%endif
%changelog
+* Wed Aug 27 2014 Valentin Gologuzov <vgologuz(a)redhat.com> 1.48-1
+- [python-copr] small fix due to the old version of python-six in RHEL-7
+
* Wed Aug 27 2014 Valentin Gologuzov <vgologuz(a)redhat.com> 1.47-1
- [python-copr] Build python3 package only for fedora
- [python-copr] minor description fix in .spec
diff --git a/rel-eng/packages/python-copr b/rel-eng/packages/python-copr
index 80a4a8d..fb1222d 100644
--- a/rel-eng/packages/python-copr
+++ b/rel-eng/packages/python-copr
@@ -1 +1 @@
-1.47-1 python/
+1.48-1 python/
9 years, 8 months
[copr] master: [python-copr] small fix due to the old version of python-six in RHEL-7 (8c21080)
by vgologuz@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 8c21080e8a5ee882c694755cbb4d0016546837ee
Author: Valentin Gologuzov <vgologuz(a)redhat.com>
Date: Wed Aug 27 19:59:00 2014 +0200
[python-copr] small fix due to the old version of python-six in RHEL-7
>---------------------------------------------------------------
python/copr/client/client.py | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/python/copr/client/client.py b/python/copr/client/client.py
index 662c175..2879f5b 100644
--- a/python/copr/client/client.py
+++ b/python/copr/client/client.py
@@ -72,10 +72,10 @@ class CoprClient(object):
"See man copr-cli for more information")
try:
for field in ["username", "login", "token", "copr_url"]:
- if six.PY2:
- config[field] = raw_config.get("copr-cli", field, None)
- elif six.PY3:
+ if six.PY3:
config[field] = raw_config["copr-cli"].get(field, None)
+ else:
+ config[field] = raw_config.get("copr-cli", field, None)
except configparser.Error as err:
raise CoprConfigException(
9 years, 8 months
[copr] master: Automatic commit of package [python-copr] release [1.47-1]. (f8a9a89)
by vgologuz@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit f8a9a89e27c4fc967293bbbf7d4dc8800e1f3e81
Author: Valentin Gologuzov <vgologuz(a)redhat.com>
Date: Wed Aug 27 19:00:20 2014 +0200
Automatic commit of package [python-copr] release [1.47-1].
>---------------------------------------------------------------
python/python-copr.spec | 6 +++++-
rel-eng/packages/python-copr | 2 +-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/python/python-copr.spec b/python/python-copr.spec
index 672ae44..0dd0e60 100644
--- a/python/python-copr.spec
+++ b/python/python-copr.spec
@@ -10,7 +10,7 @@
%endif
Name: python-copr
-Version: 1.46
+Version: 1.47
Release: 1%{?dist}
Summary: Python interface for Copr
@@ -165,6 +165,10 @@ popd
%endif
%changelog
+* Wed Aug 27 2014 Valentin Gologuzov <vgologuz(a)redhat.com> 1.47-1
+- [python-copr] Build python3 package only for fedora
+- [python-copr] minor description fix in .spec
+
* Fri Aug 22 2014 Valentin Gologuzov <vgologuz(a)redhat.com> 1.46-1
- [python-copr] packaging fixes to satisfy Fedora package guidelines.
diff --git a/rel-eng/packages/python-copr b/rel-eng/packages/python-copr
index f8bf078..80a4a8d 100644
--- a/rel-eng/packages/python-copr
+++ b/rel-eng/packages/python-copr
@@ -1 +1 @@
-1.46-1 python/
+1.47-1 python/
9 years, 8 months