Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • exact/Rosetta
1 result
Select Git revision
Show changes
Showing with 309 additions and 320 deletions
{% load static %}
{% load static %}
{% include "header.html" %}
{% include "navigation.html" %}
{% include "logo.html" %}
......@@ -6,9 +6,9 @@
<div class="container">
<div class="dashboard">
<div class="span8 offset2">
{% if data.task %}
<h1><a href="/tasks">Tasks</a> <span style="font-size:18px"> / {{ data.task.name }}</span></h1>
<h1><a href="/tasks">Tasks</a> <span style="font-size:18px"> / {{ data.task.name }}</span></h1>
{% else %}
<h1>Tasks</h1>
{% endif %}
......@@ -23,7 +23,7 @@
{% endfor %}
{% endif %}
</div>
{% if not data.task %}
<div class="row" style="padding:10px; padding-left:15px">
<a href="/new_task">New task...</a>
......@@ -36,7 +36,7 @@
<br/>
<br/>
<br/>
</div>
</div>
</div>
......@@ -53,7 +53,7 @@ function toggle_visibility(id) {
x.style.display = "block";
y.style.display = "none"
z.style.display= "inline"
} else {
x.style.display = "none";
y.style.display= "inline"
......@@ -63,3 +63,4 @@ function toggle_visibility(id) {
</script>
......@@ -26,14 +26,14 @@ class BaseAPITestCase(TestCase):
request_func = getattr(self.client, request_method)
status_code = None
if 'multipart' in kwargs and kwargs['multipart'] is True:
# Do nothing, this is a "special", multipart request
# Do nothing, this is a "special", multipart request
pass
else:
if 'content_type' not in kwargs and request_method != 'get':
kwargs['content_type'] = 'application/json'
if 'data' in kwargs and request_method != 'get' and kwargs['content_type'] == 'application/json':
data = kwargs.get('data', '')
kwargs['data'] = json.dumps(data)
......@@ -54,10 +54,10 @@ class BaseAPITestCase(TestCase):
self.response.content_dict = json.loads(self.response.content)
else:
self.response.content_dict = {}
except:
self.response.content_dict = {}
if status_code:
if not self.response.status_code == status_code:
raise Exception('Error with response:' + str(self.response))
......@@ -91,3 +91,4 @@ class BaseAPITestCase(TestCase):
import json
from django.contrib.auth.models import User
from .common import BaseAPITestCase
from ..models import Profile
class ApiTests(BaseAPITestCase):
def setUp(self):
# Create test users
self.user = User.objects.create_user('testuser', password='testpass')
self.anotheruser = User.objects.create_user('anotheruser', password='anotherpass')
......@@ -18,8 +18,8 @@ class ApiTests(BaseAPITestCase):
def test_api_web_auth(self):
'''Test auth using login api'''
'''Test auth using login api'''
# No user at all
resp = self.post('/api/v1/base/login/', data={})
self.assertEqual(resp.status_code, 401)
......@@ -46,4 +46,4 @@ class ApiTests(BaseAPITestCase):
\ No newline at end of file
import json
from django.contrib.auth.models import User
from .common import BaseAPITestCase
from ..models import Profile, Computing
class Modeltest(BaseAPITestCase):
def setUp(self):
# Create test users
self.user = User.objects.create_user('testuser', password='testpass')
self.anotheruser = User.objects.create_user('anotheruser', password='anotherpass')
......@@ -18,9 +18,10 @@ class Modeltest(BaseAPITestCase):
def test_computing(self):
'''Test Computing and their Conf models'''
'''Test Computing and their Conf models'''
computing = Computing.objects.create(name='MyComp', type='remote')
import json
from django.contrib.auth.models import User
from .common import BaseAPITestCase
from ..utils import sanitize_container_env_vars
......@@ -11,8 +11,8 @@ class TestUtils(BaseAPITestCase):
pass
def test_sanitize_user_env_vars(self):
'''Test sanitize use env vars'''
'''Test sanitize use env vars'''
# Basic
env_vars = {'myvar': 'a'}
self.assertEqual(sanitize_container_env_vars(env_vars),env_vars)
......@@ -20,15 +20,16 @@ class TestUtils(BaseAPITestCase):
# Allowed specia
env_vars = {'myvar': '/a_directory/a-test'}
self.assertEqual(sanitize_container_env_vars(env_vars),env_vars)
# Potential malicious
env_vars = {'myvar': '$(rm -rf)'}
with self.assertRaises(ValueError):
sanitize_container_env_vars(env_vars)
......@@ -43,7 +43,7 @@ INSTALLED_APPS = [
'django.contrib.staticfiles',
'rest_framework',
'rest_framework_swagger',
'django_extensions',
'django_extensions',
]
MIDDLEWARE = [
......@@ -176,7 +176,7 @@ ROSETTA_LOG_LEVEL = os.environ.get('ROSETTA_LOG_LEVEL','ERROR')
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d '
......@@ -187,13 +187,13 @@ LOGGING = {
'datefmt': '%m/%d/%Y %I:%M:%S %p'
}
},
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
......@@ -206,18 +206,18 @@ LOGGING = {
'formatter': 'halfverbose',
},
},
'loggers': {
'rosetta': {
'handlers': ['console'],
'level': ROSETTA_LOG_LEVEL,
'propagate': False, # Do not propagate or the root logger will emit as well, and even at lower levels.
'propagate': False, # Do not propagate or the root logger will emit as well, and even at lower levels.
},
'django': {
'handlers': ['console'],
'level': DJANGO_LOG_LEVEL,
'propagate': False, # Do not propagate or the root logger will emit as well, and even at lower levels.
},
'propagate': False, # Do not propagate or the root logger will emit as well, and even at lower levels.
},
# Read more about the 'django' logger: https://docs.djangoproject.com/en/2.2/topics/logging/#django-logger
# Read more about logging in the right way: https://lincolnloop.com/blog/django-logging-right-way/
}
......@@ -246,7 +246,7 @@ if OIDC_RP_CLIENT_ID:
'django.contrib.auth.backends.ModelBackend',
'rosetta.auth.RosettaOIDCAuthenticationBackend'
)
# Base
OIDC_RP_CLIENT_SECRET = os.environ.get('OIDC_RP_CLIENT_SECRET')
OIDC_OP_AUTHORIZATION_ENDPOINT = os.environ.get('OIDC_OP_AUTHORIZATION_ENDPOINT')
......@@ -255,7 +255,7 @@ if OIDC_RP_CLIENT_ID:
OIDC_RP_SIGN_ALGO = os.environ.get('OIDC_RP_SIGN_ALGO', 'RS256')
OIDC_RP_IDP_SIGN_KEY = os.environ.get('OIDC_RP_IDP_SIGN_KEY', None)
OIDC_OP_JWKS_ENDPOINT = os.environ.get('OIDC_OP_JWKS_ENDPOINT', None)
# Check
if OIDC_RP_SIGN_ALGO == 'RS256':
if not OIDC_RP_IDP_SIGN_KEY and not OIDC_OP_JWKS_ENDPOINT:
......@@ -267,7 +267,7 @@ if OIDC_RP_CLIENT_ID:
# Custom callback to enable session-based post-login redirects
OIDC_CALLBACK_CLASS = 'rosetta.auth.RosettaOIDCAuthenticationCallbackView'
# Non-customizable stuff
LOGIN_REDIRECT_URL = '/'
LOGOUT_REDIRECT_URL = '/'
......@@ -277,7 +277,8 @@ if OIDC_RP_CLIENT_ID:
# Required for the Open ID connect redirects to work properly
USE_X_FORWARDED_HOST = True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
......
......@@ -35,7 +35,7 @@ from rest_framework.documentation import include_docs_urls
from rest_framework_swagger.views import get_swagger_view
urlpatterns = [
# Pages
url(r'^$', core_app_views.entrypoint),
path('main/', core_app_views.main_view),
......@@ -44,24 +44,24 @@ urlpatterns = [
url(r'^register/$', core_app_views.register_view),
url(r'^pages/(?P<page_id>\w{0,36})/$', core_app_views.page_view),
# Software
# Software
url(r'^software/$', core_app_views.software),
url(r'^add_software/$', core_app_views.add_software),
url(r'^import_repository/$', core_app_views.import_repository),
url(r'^add_software/$', core_app_views.add_software),
url(r'^import_repository/$', core_app_views.import_repository),
#Computing
url(r'^computing/$', core_app_views.computing),
# Storage
url(r'^storage/$', core_app_views.storage),
# Tasks
url(r'^tasks/$', core_app_views.tasks),
url(r'^new_task/$', core_app_views.new_task),
url(r'^task_log/$', core_app_views.task_log),
url(r'^task_connect/$', core_app_views.task_connect),
# Sharable and direct connection links for tasks
url(r'^direct_connect/(?P<uuid>[0-9a-f-]+)/$', core_app_views.direct_connection_handler),
url(r'^t/(?P<short_uuid>\w{0,36})/$', core_app_views.sharable_link_handler),
......@@ -76,7 +76,7 @@ urlpatterns = [
# Admin and API docs (Swagger)
path('admin/', admin.site.urls),
path('api/v1/doc/', get_swagger_view(title="Swagger Documentation")),
# APIs
path('api/v1/base/login/', core_app_api.login_api.as_view(), name='login_api'),
path('api/v1/base/logout/', core_app_api.logout_api.as_view(), name='logout_api'),
......@@ -97,7 +97,7 @@ urlpatterns = [
# Get admin files location
admin_files_path = '/'.join(django.__file__.split('/')[0:-1]) + '/contrib/admin/static/admin'
if not settings.DEBUG:
# Admin files
......@@ -105,7 +105,7 @@ if not settings.DEBUG:
# Rosetta Core app files
document_root = 'rosetta/core_app/static'
if os.path.isdir(document_root):
logger.info('Serving static files for app "core_app" from document root "{}"'.format(document_root))
# Static
......@@ -116,3 +116,4 @@ else:
logger.info('Not serving static files at all as DEBUG=True (Django will do it automatically)')
......@@ -9,5 +9,3 @@ mkdir -p /data/resources
chown rosetta:rosetta /data/resources
chown rosetta:rosetta /shared
......@@ -35,7 +35,7 @@ echo ""
if [[ "x$DJANGO_DEV_SERVER" == "xTrue" ]] ; then
# Run the (development) server
echo "Now starting the development server and logging in /var/log/webapp/server.log."
exec python3 manage.py runserver 0.0.0.0:8080 2>> /var/log/webapp/server.log
......@@ -43,7 +43,7 @@ if [[ "x$DJANGO_DEV_SERVER" == "xTrue" ]] ; then
else
# Move to the code dir
cd /opt/code
# Collect static
echo "Collecting static files..."
python3 manage.py collectstatic
......@@ -63,20 +63,3 @@ else
--disable-logging 2>> /var/log/webapp/server.log
fi