Skip to content
Merged
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
18 changes: 15 additions & 3 deletions eac/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import hmac
from hashlib import sha1
import base64
from typing import Any
from typing import Any, Union

import jwt
from requests.models import HTTPError
Expand Down Expand Up @@ -108,6 +108,12 @@ def _index() -> str:
services=services)


@APP.route('/status')
@_AUTH.oidc_auth('default')
def _status() -> tuple[str, int]:
return render_template('callback.html'), 200


@APP.route('/slack', methods=['GET'])
@_AUTH.oidc_auth('default')
def _auth_slack() -> werkzeug.Response:
Expand Down Expand Up @@ -159,7 +165,7 @@ def _auth_github() -> werkzeug.Response:

@APP.route('/github/return', methods=['GET'])
@_AUTH.oidc_auth('default')
def _github_landing() -> tuple[str, int]:
def _github_landing() -> Union[werkzeug.Response, tuple[str, int]]:
# Determine if we have a valid reason to do things
state = request.args.get('state')
if state != APP.config['STATE']:
Expand Down Expand Up @@ -209,7 +215,13 @@ def _github_landing() -> tuple[str, int]:
member = _LDAP.get_member(uid, uid=True)

_link_github(github_username, github_id, member, user_token)
return render_template('callback.html'), 200
status_title = 'Linked Github!'
status = f'Added {github_username} to CSH Github org, you do not have to accept the email invite'

status_title_encoded = urllib.parse.quote(status_title, safe='')
status_encoded = urllib.parse.quote(status, safe='')
return redirect(
f'/status?status-title={status_title_encoded}&status={status_encoded}')


def _get_github_jwt() -> str:
Expand Down
46 changes: 42 additions & 4 deletions eac/static/actions.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,32 @@
(function () {
const reload = () => window.location.reload();
function showModal(statusTitle, status) {
const modalEl = document.querySelector('#statusModal')
const modal = new bootstrap.Modal(modalEl)

const modalCloseBtn = modalEl.querySelector('#statusCloseButton')
modalCloseBtn.addEventListener('click', () => modal.hide())

const modalTitle = modalEl.querySelector('.modal-title')
modalTitle.append(statusTitle)

const modalBody = modalEl.querySelector('.modal-body')
modalBody.append(status)

$("#statusModal").on("hidden.bs.modal", () => {
window.location.reload()
})

modal.show()

return modal;
}

window.addEventListener('load', () => {
const controls = document.querySelectorAll("button[data-service]");
const reload = () => window.location.reload();

for (const control of controls) {
const serviceName = control.dataset.service;
const endpoint = window.location + serviceName;
const endpoint = serviceName;
const unlink = control.dataset.action === "unlink";

control.addEventListener('click', () => {
Expand All @@ -24,10 +46,26 @@
const timer = setInterval(() => {
if (popup.closed) {
clearInterval(timer);

reload();
}
try {
if (popup.location.pathname == '/status') {
clearInterval(timer);

const query = new URLSearchParams(popup.location.search);
popup.close();

const statusTitle = query.get('status-title');
const status = query.get('status');

showModal(statusTitle, status);
}
} catch {
// do this because every time you try and access the location of a window with a different origin it errors
}
}, 500);
}
});
}
}());
});
3 changes: 0 additions & 3 deletions eac/templates/callback.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@
<html lang="en">
<head>
<title>Redirecting...</title>
<script>
window.addEventListener("load", window.close);
</script>
</head>
<body>Success</body>
</html>
16 changes: 16 additions & 0 deletions eac/templates/home.html
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,22 @@
</footer>
{% endif %}

<div class="modal fade" id="statusModal" tabindex="-1" role="dialog">
<div class="modal-dialog modal-md" role="document">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5"></h1>
</div>
<div class="modal-body">

</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" id="statusCloseButton">Close</button>
</div>
</div>
</div>
</div>

<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script>
<script defer src="https://use.fontawesome.com/releases/v5.7.0/js/all.js" integrity="sha384-qD/MNBVMm3hVYCbRTSOW130+CWeRIKbpot9/gR1BHkd7sIct4QKhT1hOPd+2hO8K" crossorigin="anonymous"></script>
Expand Down