Skip to content

Commit 5342418

Browse files
authored
Merge pull request #61 from ComputerScienceHouse/develop
Containerfile, removed LDAP requirement
2 parents 0ef0572 + 4997a96 commit 5342418

12 files changed

Lines changed: 194 additions & 86 deletions

File tree

.containerignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.venv

.github/workflows/pylint.yml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,17 @@ jobs:
1515

1616
strategy:
1717
matrix:
18-
python-version: [3.6]
18+
python-version: [3.9]
1919

2020
steps:
21-
- name: Install ldap dependencies
22-
run: sudo apt-get update && sudo apt-get install libldap2-dev libsasl2-dev
2321
- uses: actions/checkout@v2
2422
- name: Set up Python ${{ matrix.python-version }}
2523
uses: actions/setup-python@v2
2624
with:
2725
python-version: ${{ matrix.python-version }}
2826
- name: Install dependencies
2927
run: |
30-
python -m pip install --upgrade pip
28+
#python -m pip install --upgrade pip
3129
pip install -r requirements.txt
3230
- name: Lint with pylint
3331
run: |

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
.vscode/
2+
.idea/
3+
.venv/
14
__pycache__
25
*env
36
config.py
@@ -7,4 +10,3 @@ AUTHORS
710
ChangeLog
811
creds
912
.eggs
10-
.vscode

Containerfile

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#FROM docker.io/python:3.13-alpine
2+
FROM ghcr.io/astral-sh/uv:python3.9-alpine
3+
4+
RUN apk add git
5+
6+
WORKDIR /app
7+
COPY . ./
8+
RUN git rev-parse --short HEAD > commit.txt
9+
RUN uv pip install -r requirements.txt --system
10+
11+
CMD ["gunicorn", "-b", "0.0.0.0", "audiophiler:app"]

audiophiler/__init__.py

Lines changed: 11 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,13 @@
55
import os
66
import random
77
import subprocess
8-
import json
98
import requests
109
import flask_migrate
1110
from flask import Flask, render_template, request, jsonify, redirect
1211
from flask_pyoidc.provider_configuration import *
1312
from flask_pyoidc.flask_pyoidc import OIDCAuthentication
1413
from flask_sqlalchemy import SQLAlchemy
1514
from werkzeug.utils import secure_filename
16-
from csh_ldap import CSHLDAP
1715

1816
from audiophiler.s3 import *
1917

@@ -26,9 +24,6 @@
2624
else:
2725
app.config.from_pyfile(os.path.join(os.getcwd(), "config.env.py"))
2826

29-
git_cmd = ['git', 'rev-parse', '--short', 'HEAD']
30-
app.config["GIT_REVISION"] = subprocess.check_output(git_cmd).decode('utf-8').rstrip()
31-
3227
_config = ProviderConfiguration(
3328
app.config['OIDC_ISSUER'],
3429
client_metadata = ClientMetadata(
@@ -50,12 +45,6 @@
5045
from audiophiler.models import File, Harold, Auth, Tour
5146
from audiophiler.util import *
5247

53-
# Create CSHLDAP connection
54-
ldap = CSHLDAP(app.config["LDAP_BIND_DN"],
55-
app.config["LDAP_BIND_PW"])
56-
57-
# Import ldap functions after creating ldap conn
58-
from audiophiler.ldap import ldap_is_eboard, ldap_is_rtp
5948

6049
# Disable SSL certificate verification warning
6150
requests.packages.urllib3.disable_warnings()
@@ -80,12 +69,10 @@ def home(auth_dict=None):
8069
db_files = db_files.paginate(page=page, per_page=page_size).items
8170
harolds = get_harold_list(auth_dict["uid"])
8271
tour_harolds = get_harold_list("root")
83-
is_rtp = ldap_is_rtp(auth_dict["uid"])
84-
is_eboard = ldap_is_eboard(auth_dict["uid"])
8572
return render_template("main.html", db_files=db_files,
8673
get_date_modified=get_date_modified, s3_bucket=s3_bucket,
8774
auth_dict=auth_dict, harolds=harolds, tour_harolds=tour_harolds,
88-
is_rtp=is_rtp, is_eboard=is_eboard, is_tour_page=False, route="", page=page)
75+
is_rtp=auth_dict["is_rtp"], is_eboard=auth_dict["is_eboard"], is_tour_page=False, route="", page=page)
8976

9077
@app.route("/mine")
9178
@auth.oidc_auth('default')
@@ -100,15 +87,13 @@ def mine(auth_dict=None):
10087
if name:
10188
db_files = db_files.filter(File.name.like(f"%{name}%"))
10289
db_files = db_files.paginate(page=page, per_page=page_size).items
103-
is_rtp = ldap_is_rtp(auth_dict["uid"])
104-
is_eboard = ldap_is_eboard(auth_dict["uid"])
10590
# Retrieve list of files for templating
10691
harolds = get_harold_list(auth_dict["uid"])
10792
tour_harolds = get_harold_list("root")
10893
return render_template("main.html", db_files=db_files,
10994
get_file_s3=get_file_s3, get_date_modified=get_date_modified,
11095
s3_bucket=s3_bucket, auth_dict=auth_dict, harolds=harolds,
111-
tour_harolds=tour_harolds, is_rtp=is_rtp, is_eboard=is_eboard,
96+
tour_harolds=tour_harolds, is_rtp=auth_dict["is_rtp"], is_eboard=auth_dict["is_eboard"],
11297
is_tour_page=False, route="mine", page=page)
11398

11499
@app.route("/selected")
@@ -120,9 +105,6 @@ def selected(auth_dict=None):
120105
name = args.get("name", default=None, type=str)
121106
author = args.get("author", default=None, type=str)
122107
page_size = args.get("size",default=default_size, type=int)
123-
# Retrieve list of files for templating
124-
is_rtp = ldap_is_rtp(auth_dict["uid"])
125-
is_eboard = ldap_is_eboard(auth_dict["uid"])
126108
#Retrieve list of files for templating
127109
harolds = get_harold_list(auth_dict["uid"])
128110
tour_harolds = get_harold_list("root")
@@ -135,7 +117,7 @@ def selected(auth_dict=None):
135117
return render_template("main.html", db_files=db_files,
136118
get_date_modified=get_date_modified, s3_bucket=s3_bucket,
137119
auth_dict=auth_dict, harolds=harolds, tour_harolds=tour_harolds,
138-
is_rtp=is_rtp, is_eboard=is_eboard, is_tour_page=False,
120+
is_rtp=auth_dict["is_rtp"], is_eboard=auth_dict["is_eboard"], is_tour_page=False,
139121
route="selected", page=page)
140122

141123
@app.route("/tour_page")
@@ -147,9 +129,7 @@ def admin(auth_dict=None):
147129
name = args.get("name", default=None, type=str)
148130
author = args.get("author", default=None, type=str)
149131
page_size = args.get("size",default=default_size, type=int)
150-
is_rtp = ldap_is_rtp(auth_dict["uid"])
151-
is_eboard = ldap_is_eboard(auth_dict["uid"])
152-
if is_eboard or is_rtp:
132+
if auth_dict["is_rtp"] or auth_dict["is_eboard"]:
153133
harolds = get_harold_list(auth_dict["uid"])
154134
tour_harolds = get_harold_list("root")
155135
db_files = File.query.filter(File.file_hash.in_(tour_harolds))
@@ -161,7 +141,7 @@ def admin(auth_dict=None):
161141
return render_template("main.html", db_files=db_files,
162142
get_date_modified=get_date_modified, s3_bucket=s3_bucket,
163143
auth_dict=auth_dict, harolds=harolds, tour_harolds=tour_harolds,
164-
is_rtp=is_rtp, is_eboard=is_eboard, is_tour_page=True,
144+
is_rtp=auth_dict["is_rtp"], is_eboard=auth_dict["is_eboard"], is_tour_page=True,
165145
is_tour_mode=get_tour_lock_status(), route="tour_page",
166146
page=page)
167147

@@ -171,9 +151,8 @@ def admin(auth_dict=None):
171151
@auth.oidc_auth('default')
172152
@audiophiler_auth
173153
def upload_page(auth_dict=None):
174-
is_rtp = ldap_is_rtp(auth_dict["uid"])
175-
is_eboard = ldap_is_eboard(auth_dict["uid"])
176-
return render_template("upload.html", is_rtp=is_rtp, is_eboard=is_eboard, auth_dict=auth_dict)
154+
return render_template("upload.html", is_rtp=auth_dict["is_rtp"],
155+
is_eboard=auth_dict["is_eboard"], auth_dict=auth_dict)
177156

178157
@app.route("/upload", methods=["POST"])
179158
@auth.oidc_auth('default')
@@ -233,7 +212,7 @@ def delete_file(file_hash, auth_dict=None):
233212
return "File Not Found", 404
234213

235214
if not auth_dict["uid"] == file_model.author:
236-
if not (ldap_is_eboard(auth_dict["uid"]) or ldap_is_rtp(auth_dict["uid"])):
215+
if not auth_dict["is_rtp"] or auth_dict["is_eboard"]:
237216
return "Permission Denied", 403
238217

239218
# Delete file model
@@ -259,10 +238,8 @@ def get_s3_url(file_hash, auth_dict=None):
259238
@audiophiler_auth
260239
def set_harold(file_hash, auth_dict=None):
261240
is_tour = request.json["tour"]
262-
is_rtp = ldap_is_rtp(auth_dict["uid"])
263-
is_eboard = ldap_is_eboard(auth_dict["uid"])
264241
if is_tour == "true":
265-
if (is_rtp or is_eboard):
242+
if auth_dict["is_rtp"] or auth_dict["is_eboard"]:
266243
uid = "root"
267244
else:
268245
return "Not Authorized", 403
@@ -280,10 +257,8 @@ def set_harold(file_hash, auth_dict=None):
280257
@audiophiler_auth
281258
def remove_harold(file_hash, auth_dict=None):
282259
is_tour = request.json["tour"]
283-
is_rtp = ldap_is_rtp(auth_dict["uid"])
284-
is_eboard = ldap_is_eboard(auth_dict["uid"])
285260
if is_tour == "true":
286-
if is_rtp or is_eboard:
261+
if auth_dict["is_rtp"] or auth_dict["is_eboard"]:
287262
uid = "root"
288263
else:
289264
return "Not Authorized", 403
@@ -328,9 +303,7 @@ def get_harold(uid, auth_dict=None):
328303
@auth.oidc_auth('default')
329304
@audiophiler_auth
330305
def toggle_tour_mode(auth_dict=None):
331-
is_rtp = ldap_is_rtp(auth_dict["uid"])
332-
is_eboard = ldap_is_eboard(auth_dict["uid"])
333-
if is_rtp or is_eboard:
306+
if auth_dict["is_rtp"] or auth_dict["is_eboard"]:
334307
admin_query = Tour.query.first()
335308
if request.json["state"] == "t":
336309
admin_query.tour_lock = True

audiophiler/ldap.py

Lines changed: 0 additions & 20 deletions
This file was deleted.

audiophiler/templates/base.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@
105105
{% endblock %}
106106
<footer>
107107
<div class="version">
108-
<a class="footer-version" href="https://github.com/sgreene570/audiophiler">
108+
<a class="footer-version" href="https://github.com/ComputerScienceHouse/audiophiler">
109109
Audiophiler ({{ config["GIT_REVISION"] }})
110110
</a>
111111
</div>

audiophiler/util.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,13 @@ def audiophiler_auth(func):
1212
def wrapped_function(*args, **kwargs):
1313
uuid = str(session["userinfo"].get("sub", ""))
1414
uid = str(session["userinfo"].get("preferred_username", ""))
15+
groups = str(session["userinfo"].get("groups", []))
1516
auth_dict = {
1617
"uuid": uuid,
17-
"uid": uid
18+
"uid": uid,
19+
"groups": groups,
20+
"is_rtp": 'active_rtp' in groups,
21+
"is_eboard": 'eboard' in groups,
1822
}
1923
kwargs["auth_dict"] = auth_dict
2024
return func(*args, **kwargs)

config.env.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,18 @@
1616
"client_secret": os.getenv("OIDC_CLIENT_SECRET", default=None),
1717
"post_logout_redirect_uris": [os.getenv("OIDC_LOGOUT_REDIRECT_URI", default="https://audiophiler.csh.rit.edu/logout")]
1818
}
19+
OIDC_REDIRECT_URI = os.getenv("OIDC_REDIRECT_URI", default="https://"+SERVER_NAME+"/redirect_uri")
20+
21+
# Git Hash
22+
with open('commit.txt') as f: s = f.read().rstrip()
23+
GIT_REVISION = s
1924

2025
# Openshift secret
2126
SECRET_KEY = os.getenv("SECRET_KEY", default=''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(64)))
2227

2328
# Database credentials
2429
SQLALCHEMY_DATABASE_URI = os.getenv("SQLALCHEMY_DATABASE_URI", default=None)
2530

26-
# CSH_LDAP credentials
27-
LDAP_BIND_DN = os.getenv("LDAP_BIND_DN", default="cn=audiophiler,ou=Apps,dc=csh,dc=rit,dc=edu")
28-
LDAP_BIND_PW = os.getenv("LDAP_BIND_PW", default=None)
29-
3031
PLUG_SUPPORT = os.environ.get('PLUG_ENABLED', False)
3132

3233
PAGE_SIZE = os.environ.get('PAGE_SIZE', 20)

requirements.in

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
flask
2+
werkzeug
3+
flask-pyoidc
4+
boto
5+
gunicorn
6+
flask_sqlalchemy
7+
flask_migrate
8+
psycopg2
9+
requests
10+
pylint

0 commit comments

Comments
 (0)