|
|
<%- include("partials/shared_header", { title: "Create User - OAI Reverse Proxy Admin" }) %> |
|
|
|
|
|
<style> |
|
|
#temporaryUserOptions { |
|
|
margin-top: 1em; |
|
|
max-width: 30em; |
|
|
} |
|
|
|
|
|
#temporaryUserOptions h3 { |
|
|
margin-bottom: -0.4em; |
|
|
} |
|
|
|
|
|
input[type="number"] { |
|
|
max-width: 10em; |
|
|
} |
|
|
|
|
|
.temporary-user-fieldset { |
|
|
display: grid; |
|
|
grid-template-columns: repeat(4, 1fr); |
|
|
column-gap: 1em; |
|
|
row-gap: 0.2em; |
|
|
} |
|
|
|
|
|
.full-width { |
|
|
grid-column: 1 / -1; |
|
|
} |
|
|
|
|
|
.quota-label { |
|
|
text-align: right; |
|
|
} |
|
|
</style> |
|
|
|
|
|
<h1>Create User Token</h1> |
|
|
<p>User token types:</p> |
|
|
<ul> |
|
|
<li><strong>Normal</strong> - Standard users. |
|
|
<li><strong>Special</strong> - Exempt from token quotas and <code>MAX_IPS_PER_USER</code> enforcement.</li> |
|
|
<li><strong>Temporary</strong> - Disabled after a specified duration. Quotas never refresh.</li> |
|
|
</ul> |
|
|
|
|
|
<form action="/admin/manage/create-user" method="post"> |
|
|
<input type="hidden" name="_csrf" value="<%= csrfToken %>" /> |
|
|
<label for="type">Type</label> |
|
|
<select name="type"> |
|
|
<option value="normal">Normal</option> |
|
|
<option value="special">Special</option> |
|
|
<option value="temporary">Temporary</option> |
|
|
</select> |
|
|
<input type="submit" value="Create" /> |
|
|
<fieldset id="temporaryUserOptions" style="display: none"> |
|
|
<legend>Temporary User Options</legend> |
|
|
<div class="temporary-user-fieldset"> |
|
|
<p class="full-width"> |
|
|
Temporary users will be disabled after the specified duration, and their records will be permanently deleted after some time. |
|
|
These options apply only to new temporary users; existing ones use whatever options were in effect when they were created. |
|
|
</p> |
|
|
<label for="temporaryUserDuration" class="full-width">Access duration (in minutes)</label> |
|
|
<input type="number" name="temporaryUserDuration" id="temporaryUserDuration" value="60" class="full-width" /> |
|
|
|
|
|
<span>6 hours:</span><code>360</code> |
|
|
<span>12 hours:</span><code>720</code> |
|
|
<span>1 day:</span><code>1440</code> |
|
|
<span>1 week:</span><code>10080</code> |
|
|
<h3 class="full-width">Token Quotas</h3> |
|
|
<p class="full-width">Temporary users' quotas are never refreshed.</p> |
|
|
<% Object.entries(quota).forEach(function([model, tokens]) { %> |
|
|
<label class="quota-label" for="temporaryUserQuota_<%= model %>"><%= model %></label> |
|
|
<input |
|
|
type="number" |
|
|
name="temporaryUserQuota_<%= model %>" |
|
|
id="temporaryUserQuota_<%= model %>" |
|
|
value="0" |
|
|
data-fieldtype="tokenquota" |
|
|
data-default="<%= tokens %>" /> |
|
|
<% }) %> |
|
|
</div> |
|
|
</fieldset> |
|
|
</form> |
|
|
<% if (newToken) { %> |
|
|
<p>Just created <code><%= recentUsers[0].token %></code>.</p> |
|
|
<% } %> |
|
|
<h2>Recent Tokens</h2> |
|
|
<ul> |
|
|
<% recentUsers.forEach(function(user) { %> |
|
|
<li><a href="/admin/manage/view-user/<%= user.token %>"><%= user.token %></a></li> |
|
|
<% }) %> |
|
|
</ul> |
|
|
|
|
|
<script> |
|
|
const typeInput = document.querySelector("select[name=type]"); |
|
|
const temporaryUserOptions = document.querySelector("#temporaryUserOptions"); |
|
|
typeInput.addEventListener("change", function () { |
|
|
localStorage.setItem("admin__create-user__type", typeInput.value); |
|
|
if (typeInput.value === "temporary") { |
|
|
temporaryUserOptions.style.display = "block"; |
|
|
} else { |
|
|
temporaryUserOptions.style.display = "none"; |
|
|
} |
|
|
}); |
|
|
|
|
|
function loadDefaults() { |
|
|
const defaultType = localStorage.getItem("admin__create-user__type"); |
|
|
if (defaultType) { |
|
|
typeInput.value = defaultType; |
|
|
typeInput.dispatchEvent(new Event("change")); |
|
|
} |
|
|
|
|
|
const durationInput = document.querySelector("input[name=temporaryUserDuration]"); |
|
|
const defaultDuration = localStorage.getItem("admin__create-user__duration"); |
|
|
durationInput.addEventListener("change", function () { |
|
|
localStorage.setItem("admin__create-user__duration", durationInput.value); |
|
|
}); |
|
|
if (defaultDuration) { |
|
|
durationInput.value = defaultDuration; |
|
|
} |
|
|
|
|
|
const tokenQuotaInputs = document.querySelectorAll("input[data-fieldtype=tokenquota]"); |
|
|
tokenQuotaInputs.forEach(function (input) { |
|
|
const defaultQuota = localStorage.getItem("admin__create-user__quota__" + input.id); |
|
|
input.addEventListener("change", function () { |
|
|
localStorage.setItem("admin__create-user__quota__" + input.id, input.value); |
|
|
}); |
|
|
if (defaultQuota) { |
|
|
input.value = defaultQuota; |
|
|
} |
|
|
}); |
|
|
} |
|
|
|
|
|
loadDefaults(); |
|
|
</script> |
|
|
|
|
|
<%- include("partials/admin-footer") %> |
|
|
|