Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions compose/dserver/scripts/make-venv.sh
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ pip install -e /app/dserver-dependency-graph-plugin
echo "==> Installing dserver-signed-url-plugin..."
pip install -e /app/dserver-signed-url-plugin

echo "==> Installing dserver-token-generator-plugin-oauth2..."
pip install -e /app/dserver-token-generator-plugin-oauth2
echo "==> Installing dserver-dummy-token-generator (dev only, accepts any username)..."
pip install -e /app/dserver-dummy-token-generator

echo "==> Installing additional dependencies..."
pip install gunicorn psycopg2-binary PyJWT requests authlib httpx python-dotenv
Expand Down
4 changes: 1 addition & 3 deletions compose/webapp/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,12 @@ COPY ./dtool-lookup-webapp/dtool-lookup-webapp/package.json ./
RUN sed -i 's|file:../../dserver-client-js|file:/dserver-client-js|g' package.json

# Install dependencies (generates fresh lockfile)
RUN npm install
RUN npm install --legacy-peer-deps

# Copy source files only (exclude node_modules, package-lock.json which would override)
COPY ./dtool-lookup-webapp/dtool-lookup-webapp/src ./src
COPY ./dtool-lookup-webapp/dtool-lookup-webapp/public ./public
COPY ./dtool-lookup-webapp/dtool-lookup-webapp/tsconfig*.json ./
COPY ./dtool-lookup-webapp/dtool-lookup-webapp/babel.config.js ./
COPY ./dtool-lookup-webapp/dtool-lookup-webapp/vue.config.js ./
COPY ./dtool-lookup-webapp/dtool-lookup-webapp/.eslintrc.js ./
COPY ./dtool-lookup-webapp/dtool-lookup-webapp/.browserslistrc ./

Expand Down
2 changes: 1 addition & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ services:
- dserver_net
command: /scripts/start-dserver.sh
healthcheck:
test: curl -sf http://localhost:5000/config/health || exit 1
test: curl -sf http://localhost:5000/config/info -o /dev/null -w "%{http_code}" | grep -qE "^(200|401)$" || exit 1
interval: 10s
timeout: 5s
retries: 5
Expand Down
2 changes: 1 addition & 1 deletion dserver-client-js
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
"""Dummy token generator extension for dserver development.
Accepts any username/password and issues a valid JWT.
DO NOT use in production.
"""
__version__ = "0.1.0"

import datetime
import logging

import jwt
from flask import current_app, jsonify, request
from flask_smorest import Blueprint

logger = logging.getLogger(__name__)

bp = Blueprint("dummy_auth", __name__, url_prefix="/auth")


@bp.route("/token", methods=["POST"])
def create_token():
data = request.get_json(silent=True) or {}
username = data.get("username") or request.form.get("username")
if not username:
return jsonify({"error": "Missing api_key or username"}), 401

import os
private_key_file = current_app.config.get("JWT_PRIVATE_KEY_FILE") or os.environ.get("JWT_PRIVATE_KEY_FILE")
algorithm = current_app.config.get("JWT_ALGORITHM") or os.environ.get("JWT_ALGORITHM", "RS256")
with open(private_key_file, "r") as f:
private_key = f.read()

payload = {
"sub": username,
"identity": username,
"iat": datetime.datetime.utcnow(),
"exp": datetime.datetime.utcnow() + datetime.timedelta(hours=24),
}
token = jwt.encode(payload, private_key, algorithm=algorithm)
return jsonify({"token": token})


@bp.route("/token", methods=["GET"])
def get_token_info():
return jsonify({"msg": 'POST /auth/token with {"username": "..."}'}), 200


@bp.route("/info", methods=["GET"])
def auth_info():
return jsonify({"configured": True, "provider": "dummy", "login_url": None})


class DummyTokenGeneratorPlugin:
"""dservercore ExtensionABC-compatible dummy token generator."""

def __init__(self, app=None):
if app is not None:
self.init_app(app)

def init_app(self, app, *args, **kwargs):
logger.warning("DummyTokenGeneratorPlugin loaded — dev only, not for production!")

def get_blueprint(self):
return bp

def get_config(self):
return {}

def get_config_secrets_to_obfuscate(self):
return []
16 changes: 16 additions & 0 deletions dserver-dummy-token-generator/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
[build-system]
requires = ["setuptools>=61"]
build-backend = "setuptools.build_meta"

[project]
name = "dserver-dummy-token-generator"
version = "0.1.0"
description = "Development-only dummy token generator for dserver"
requires-python = ">=3.8"
dependencies = ["PyJWT", "flask", "flask-smorest"]

[project.entry-points."dservercore.extension"]
dummy = "dserver_dummy_token_generator:DummyTokenGeneratorPlugin"

[tool.setuptools.packages.find]
include = ["dserver_dummy_token_generator*"]
2 changes: 1 addition & 1 deletion dserver-notification-plugin
2 changes: 1 addition & 1 deletion dtool-dserver
2 changes: 1 addition & 1 deletion dtool-lookup-webapp
Submodule dtool-lookup-webapp updated 46 files
+10 −7 dtool-lookup-webapp/.eslintrc.js
+3 −0 dtool-lookup-webapp/jest.config.js
+0 −16,149 dtool-lookup-webapp/package-lock.json
+33 −41 dtool-lookup-webapp/package.json
+3 −5 dtool-lookup-webapp/public/index.html
+581 −631 dtool-lookup-webapp/src/App.vue
+12 −0 dtool-lookup-webapp/src/assets/css/custom.scss
+74 −57 dtool-lookup-webapp/src/components/BaseUriFilter.vue
+70 −56 dtool-lookup-webapp/src/components/CreatorUsernameFilter.vue
+247 −0 dtool-lookup-webapp/src/components/DatasetAnnotations.vue
+107 −261 dtool-lookup-webapp/src/components/DatasetManifest.vue
+83 −315 dtool-lookup-webapp/src/components/DatasetReadme.vue
+124 −119 dtool-lookup-webapp/src/components/DatasetSorting.vue
+168 −585 dtool-lookup-webapp/src/components/DatasetSummary.vue
+58 −103 dtool-lookup-webapp/src/components/DatasetTable.vue
+0 −76 dtool-lookup-webapp/src/components/NotificationSnackbar.vue
+50 −45 dtool-lookup-webapp/src/components/NumDatasets.vue
+437 −301 dtool-lookup-webapp/src/components/SignIn.vue
+93 −289 dtool-lookup-webapp/src/components/SummaryInfo.vue
+72 −56 dtool-lookup-webapp/src/components/TagFilter.vue
+100 −100 dtool-lookup-webapp/src/components/TemplateDownloader.vue
+85 −105 dtool-lookup-webapp/src/components/TextSearch.vue
+0 −219 dtool-lookup-webapp/src/components/UserMenu.vue
+0 −58 dtool-lookup-webapp/src/env.d.ts
+20 −0 dtool-lookup-webapp/src/main.js
+0 −62 dtool-lookup-webapp/src/main.ts
+0 −204 dtool-lookup-webapp/src/services/dserverApi.ts
+85 −0 dtool-lookup-webapp/src/store.js
+0 −156 dtool-lookup-webapp/src/store.ts
+0 −283 dtool-lookup-webapp/src/stores/auth.ts
+0 −71 dtool-lookup-webapp/src/stores/notifications.ts
+0 −164 dtool-lookup-webapp/src/stores/serverHealth.ts
+0 −92 dtool-lookup-webapp/src/types/index.ts
+18 −0 dtool-lookup-webapp/src/utils/jwtUtils.js
+0 −30 dtool-lookup-webapp/src/utils/jwtUtils.ts
+28 −0 dtool-lookup-webapp/tests/unit/jsontest.spec.js
+0 −53 dtool-lookup-webapp/tests/unit/jsontest.spec.ts
+27 −0 dtool-lookup-webapp/tests/unit/paginationtest.spec.js
+0 −66 dtool-lookup-webapp/tests/unit/readme.spec.ts
+0 −81 dtool-lookup-webapp/tests/unit/store.spec.ts
+45 −0 dtool-lookup-webapp/tests/unit/version.spec.js
+0 −40 dtool-lookup-webapp/tsconfig.json
+0 −10 dtool-lookup-webapp/tsconfig.node.json
+0 −23 dtool-lookup-webapp/vitest.config.ts
+0 −7 dtool-lookup-webapp/vue.config.js
+0 −6 package-lock.json
2 changes: 1 addition & 1 deletion dtool-s3
2 changes: 1 addition & 1 deletion dtoolcore