forked from spitkov/sxbin
allow user to reset api key
This commit is contained in:
parent
de1b826928
commit
c3a8994769
14
app.py
14
app.py
@ -1222,6 +1222,20 @@ def is_valid_password(password):
|
||||
banned_passwords = ['info', 'download']
|
||||
return password not in banned_passwords
|
||||
|
||||
@app.route('/reset_api_key', methods=['POST'])
|
||||
@login_required
|
||||
def reset_api_key():
|
||||
new_api_key = secrets.token_urlsafe(32)
|
||||
db = get_db()
|
||||
cursor = db.cursor()
|
||||
cursor.execute("UPDATE users SET api_key = ? WHERE id = ?", (new_api_key, current_user.id))
|
||||
db.commit()
|
||||
return jsonify({'success': True, 'new_api_key': new_api_key})
|
||||
|
||||
@app.route('/api/docs')
|
||||
def api_docs():
|
||||
return render_template('api_docs.html')
|
||||
|
||||
if __name__ == '__main__':
|
||||
# Start the cleanup thread
|
||||
cleanup_thread = threading.Thread(target=delete_old_files)
|
||||
|
62
templates/api_docs.html
Normal file
62
templates/api_docs.html
Normal file
@ -0,0 +1,62 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>API Documentation - sxbin</title>
|
||||
<style>
|
||||
/* Add your styles here */
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>sxbin API Documentation</h1>
|
||||
|
||||
<h2>Authentication</h2>
|
||||
<p>All API requests require an API key to be sent in the X-API-Key header.</p>
|
||||
|
||||
<h2>Endpoints</h2>
|
||||
|
||||
<h3>Upload File</h3>
|
||||
<pre>
|
||||
POST /api/upload/file
|
||||
Headers:
|
||||
X-API-Key: your_api_key
|
||||
Body: multipart/form-data
|
||||
file: (binary)
|
||||
</pre>
|
||||
<p>Returns: JSON with file URL and deletion URL</p>
|
||||
|
||||
<h3>Upload Pastebin</h3>
|
||||
<pre>
|
||||
POST /api/upload/pastebin
|
||||
Headers:
|
||||
X-API-Key: your_api_key
|
||||
Content-Type: application/json
|
||||
Body:
|
||||
{
|
||||
"content": "Your pastebin content here"
|
||||
}
|
||||
</pre>
|
||||
<p>Returns: JSON with pastebin URL and deletion URL</p>
|
||||
|
||||
<h3>Shorten URL</h3>
|
||||
<pre>
|
||||
POST /api/shorten
|
||||
Headers:
|
||||
X-API-Key: your_api_key
|
||||
Content-Type: application/json
|
||||
Body:
|
||||
{
|
||||
"url": "https://example.com/your-long-url-here"
|
||||
}
|
||||
</pre>
|
||||
<p>Returns: JSON with shortened URL and deletion URL</p>
|
||||
|
||||
<h2>Error Handling</h2>
|
||||
<p>All errors are returned as JSON with an "error" field describing the issue.</p>
|
||||
|
||||
<footer>
|
||||
<p>For more information or support, please contact our team.</p>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
@ -881,7 +881,7 @@
|
||||
<div class="tabs">
|
||||
<button class="tab active" onclick="openTab(event, 'filesAndFolders')">Files and Folders</button>
|
||||
<button class="tab" onclick="openTab(event, 'myUploads')">My Uploads</button>
|
||||
<button class="tab" onclick="openTab(event, 'shareXConfig')">ShareX Config</button>
|
||||
<button class="tab" onclick="openTab(event, 'apiKeyShareX')">API Key & ShareX</button>
|
||||
</div>
|
||||
|
||||
<div id="filesAndFolders" class="tab-content active">
|
||||
@ -985,10 +985,33 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="shareXConfig" class="tab-content">
|
||||
<h3>ShareX Configuration</h3>
|
||||
<p>Click the button below to download your ShareX configuration file:</p>
|
||||
<a href="{{ url_for('generate_sharex_config') }}" class="btn" download="aCloud_ShareX.sxcu">Download ShareX Config</a>
|
||||
<div id="apiKeyShareX" class="tab-content">
|
||||
<h3>API Key & ShareX</h3>
|
||||
|
||||
<div class="sharex-config-section">
|
||||
<h4>ShareX Configuration</h4>
|
||||
<p>Download the ShareX configuration file to easily integrate with our service:</p>
|
||||
<a href="{{ url_for('generate_sharex_config') }}" class="btn">Download ShareX Config</a>
|
||||
</div>
|
||||
|
||||
<div class="api-key-section">
|
||||
<h4>Your API Key</h4>
|
||||
<p>API Key: <span id="apiKey" class="blurred">{{ current_user.api_key }}</span></p>
|
||||
<button onclick="showResetApiKeyModal()" class="btn">Reset API Key</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Reset API Key Modal -->
|
||||
<div id="resetApiKeyModal" class="modal">
|
||||
<div class="modal-content">
|
||||
<h2>Reset API Key</h2>
|
||||
<p>Are you sure you want to reset your API key? This action cannot be undone.</p>
|
||||
<p>Your old ShareX configuration will no longer work. You'll need to generate a new one after resetting.</p>
|
||||
<div class="modal-buttons">
|
||||
<button onclick="resetApiKey()" class="btn btn-danger">Reset API Key</button>
|
||||
<button onclick="closeResetApiKeyModal()" class="btn">Cancel</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -1589,6 +1612,22 @@
|
||||
.file-group-link a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.blurred {
|
||||
filter: blur(5px);
|
||||
transition: filter 0.3s ease;
|
||||
}
|
||||
|
||||
.blurred:hover {
|
||||
filter: blur(0);
|
||||
}
|
||||
|
||||
.api-key-section, .sharex-config-section {
|
||||
margin-bottom: 20px;
|
||||
padding: 15px;
|
||||
background-color: var(--highlight-bg);
|
||||
border-radius: 5px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
@ -2188,6 +2227,38 @@
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
function showResetApiKeyModal() {
|
||||
document.getElementById('resetApiKeyModal').style.display = 'block';
|
||||
}
|
||||
|
||||
function closeResetApiKeyModal() {
|
||||
document.getElementById('resetApiKeyModal').style.display = 'none';
|
||||
}
|
||||
|
||||
function resetApiKey() {
|
||||
fetch('/reset_api_key', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
})
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
if (data.success) {
|
||||
document.getElementById('apiKey').textContent = data.new_api_key;
|
||||
alert('API Key has been reset. Please update your applications and download a new ShareX configuration.');
|
||||
} else {
|
||||
alert('Error resetting API Key: ' + data.error);
|
||||
}
|
||||
closeResetApiKeyModal();
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error:', error);
|
||||
alert('An error occurred while resetting the API Key');
|
||||
closeResetApiKeyModal();
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in New Issue
Block a user