divan/GanjooRazor/Pages/Error.cshtml
Anas Rashid 223166ef5e Divan: make env config work, ur-PK locale, own-site links relative
- AddEnvironmentVariables() where appsettings.json is read directly
- JWT ValidIssuer follows RSecurityBackend:ApplicationName (was hard-coded Ganjoor)
- deploy/entrypoint.sh: copy settings RSecurityBackend reads only from appsettings.json
- Dockerfile: pin SDK 10.0.302 (newer Razor rejects some upstream views)
- lang=ur-PK; ganjoor.net own-site links -> relative; api.ganjoor.net -> APIRoot; search.xml
- DIVAN.md: first admin password is Test!123 (upstream doc is wrong)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 23:32:16 +02:00

306 lines
12 KiB
Plaintext

@page
@model ErrorModel
@{
Layout = null;
ViewData["Title"] = "خطای پیش‌بینی نشده";
}
<!DOCTYPE html>
<html lang="ur-PK" dir="rtl">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>
@ViewData["Title"]
</title>
<link href="~/css/p8.css" asp-append-version="true" rel="stylesheet" type="text/css" />
<partial name="_DivanHead" />
<link rel="shortcut icon" href="/favicon.ico?version=1" type="image/x-icon" />
<link rel="search" type="application/opensearchdescription+xml" title="دیوان" href="/search.xml" />
<style>
code, pre {
background-color: #333;
color: #fff;
border: none !important;
direction:ltr;
}
.stacktrace .st-type {
color: #0a8472;
font-weight: bolder
}
.stacktrace .st-method {
color: #70c9ba;
font-weight: bolder
}
.stacktrace .st-frame-params {
color: #fff;
font-weight: 400
}
.stacktrace .st-param-type {
color: #0a8472
}
.stacktrace .st-param-name {
color: #fff
}
.stacktrace .st-file {
color: #f8b068
}
.stacktrace .st-line {
color: #ff4f68
}
</style>
</head>
<body>
<div id="hdr">
<h1><a href="/" title="دیوان"><img src="/image/gdap.png" alt="دیوان" style="width:auto;margin:auto;" /></a></h1>
</div>
<h1 class="text-danger">خطای پیش‌بینی نشده</h1>
<h2 class="text-danger">متأسفانه نمایش صفحهٔ مد نظر شما با خطا مواجه شد.</h2>
<p>اگر این خطا با تازه‌سازی صفحه رفع نشد ممکن است سرور دیوان دچار کمبود منابع شده باشد یا اشکالی پیش آمده باشد که رسیدگی به آن تا ساعاتی دیگر میسر نباشد. در این صورت می‌توانید از وبگاههای جایگزین یا موارد پیشنهادی زیر استفاده کنید:</p>
<div class="century"><a href="http://old.ganjoor.net"><strong>وبگاه قدیمی دیوان</strong></a></div>
<div class="century"><a href="https://dg.ganjoor.net">دریافت دیوان رومیزی</a></div>
<div class="century"><a href="http://pozh.org/saaghar/">دریافت ساغر</a></div>
<div class="century"><a href="https://blog.ganjoor.net/category/android/">نرم‌افزارهای اندرویدی سازگار با دیوان</a></div>
<div class="century"><a href="https://blog.ganjoor.net/category/ios/">نرم‌افزارهای سازگار با دیوان برای آیفون و آی‌پد</a></div>
<div class="century"><a href="https://github.com/ganjoor/">نرم‌افزارهای بازمتن دیوان</a></div>
@if (Model.ShowRequestId)
{
<p>
<strong>شناسهٔ درخواست:</strong> <code>@Model.RequestId</code>
</p>
}
<h3>جزئیات خطا برای پیگیری برنامه‌نویس</h3>
<h4>پیغام خطا:</h4>
<p style="direction:ltr;color:red">
@ViewData["Exception"]
</p>
<h4>مسیر خطا:</h4>
<pre>
<code style="direction:ltr" class="stacktrace" data-bind="text: content">
@ViewData["StackTrace"]
</code>
</pre>
<script src="/lib/jquery/dist/jquery.min.js"></script>
<script>
/*!
* netStack v1.0.14
* A simple and easy jQuery plugin for highlighting .NET stack traces
* License : Apache 2
* Author : https://elmah.io
*/
(function($) {
'use strict';
$.fn.netStack = function(options) {
function search(nameKey, myArray) {
for (var i = 0; i < myArray.length; i++) {
if (myArray[i].name === nameKey) {
return myArray[i];
}
}
}
function formatException(exceptionMessage, at_language) {
var result = exceptionMessage || '';
var searchReplaces = [
{
find: new RegExp(" " + at_language, "g"),
repl: '\r\n ' + at_language
},
{
find: new RegExp(" ---> ", "g"),
repl: '\r\n ---> '
},
{
find: new RegExp("\\) " + at_language + " ", "g"),
repl: '\r\n ' + at_language + ' '
},
{
find: / --- End of inner exception stack trace ---/g,
repl: '\r\n --- End of inner exception stack trace ---'
}
]
searchReplaces.forEach(function(item) {
result = result.replace(item.find, item.repl);
});
return result;
};
var settings = $.extend({
// Default values for classes
prettyprint: false,
frame: 'st-frame',
type: 'st-type',
method: 'st-method',
paramsList: 'st-frame-params',
paramType: 'st-param-type',
paramName: 'st-param-name',
file: 'st-file',
line: 'st-line'
}, options);
var languages = [
{ name: 'english', at: 'at', in: 'in', line: 'line' },
{ name: 'danish', at: 'ved', in: 'i', line: 'linje' },
{ name: 'german', at: 'bei', in: 'in', line: 'Zeile' }
];
return this.each(function() {
// Get the stacktrace, sanitize it, and split it into lines
var stacktrace = $(this).text(),
sanitizedStack = stacktrace.replace(/</g, '&lt;').replace(/>/g, '&gt;'),
lines = sanitizedStack.split('\n'),
lang = '',
clone = '';
// search for language
for (var i = 0, j = lines.length; i < j; ++i) {
if (lang === '') {
var line = lines[i];
var english = new RegExp('\\bat .*\\)'),
danish = new RegExp('\\bved .*\\)'),
german = new RegExp('\\bbei .*\\)');
if (english.test(lines[i])) {
lang = 'english';
} else if (danish.test(lines[i])) {
lang = 'danish';
} else if (german.test(lines[i])) {
lang = 'german';
}
}
}
if (lang === '') return;
var selectedLanguage = search(lang, languages);
// Pritty print result if is set to true
if (settings.prettyprint) {
sanitizedStack = formatException(sanitizedStack, selectedLanguage['at']);
lines = sanitizedStack.split('\n');
}
for (var i = 0, j = lines.length; i < j; ++i) {
var li = lines[i],
hli = new RegExp('\\b' + selectedLanguage['at'] + ' .*\\)');
if (hli.test(lines[i])) {
// Frame
var regFrame = new RegExp('\\b' + selectedLanguage['at'] + ' .*?\\)'),
partsFrame = String(regFrame.exec(lines[i]));
partsFrame = partsFrame.replace(selectedLanguage['at'] + ' ', '');
// Frame -> ParameterList
var regParamList = new RegExp('\\(.*\\)'),
partsParamList = String(regParamList.exec(lines[i]));
// Frame -> Params
var partsParams = partsParamList.replace('(', '').replace(')', ''),
arrParams = partsParams.split(', '),
stringParam = '';
for (var x = 0, y = arrParams.length; x < y; ++x) {
var theParam = '',
param = arrParams[x].split(' '),
paramType = param[0],
paramName = param[1];
if (param[0] !== "null" && param[0] !== '') {
theParam = '<span class="' + settings.paramType + '">' + paramType + '</span>' + ' ' + '<span class="' + settings.paramName + '">' + paramName + '</span>';
stringParam += String(theParam) + ', ';
}
}
stringParam = stringParam.replace(/,\s*$/, "");
stringParam = '<span class="' + settings.paramsList + '">' + '(' + stringParam + ')' + '</span>';
// Frame -> Type & Method
var partsTypeMethod = partsFrame.replace(partsParamList, ''),
arrTypeMethod = partsTypeMethod.split('.'),
method = arrTypeMethod.pop(),
type = partsTypeMethod.replace('.' + method, ''),
stringTypeMethod = '<span class="' + settings.type + '">' + type + '</span>.' + '<span class="' + settings.method + '">' + method + '</span>';
// Construct Frame
var newPartsFrame = partsFrame.replace(partsParamList, stringParam).replace(partsTypeMethod, stringTypeMethod);
// Line
var regLine = new RegExp('\\b:' + selectedLanguage['line'] + '.*'),
partsLine = String(regLine.exec(lines[i]));
partsLine = partsLine.replace(':', '');
// File => (!) text requires multiline to exec regex, otherwise it will return null.
var regFile = new RegExp('\\b' + selectedLanguage['in'] + '\\s.*$', 'm'),
partsFile = String(regFile.exec(lines[i]));
partsFile = partsFile.replace(selectedLanguage['in'] + ' ', '').replace(':' + partsLine, '');
li = li.replace(partsFrame, '<span class="' + settings.frame + '">' + newPartsFrame + '</span>')
.replace(partsFile, '<span class="' + settings.file + '">' + partsFile + '</span>')
.replace(partsLine, '<span class="' + settings.line + '">' + partsLine + '</span>');
li = li.replace(/&lt;/g, '<span>&lt;</span>').replace(/&gt;/g, '<span>&gt;</span>');
if (lines.length - 1 == i) {
clone += li;
} else {
clone += li + '\n';
}
} else {
if ((lines[i].trim()).length) {
li = lines[i];
if (lines.length - 1 == i) {
clone += li;
} else {
clone += li + '\n';
}
}
}
}
return $(this).html(clone);
});
};
}(jQuery));
$(document).ready(function() {
$('.stacktrace').netStack({
prettyprint: true
});
});
</script>
</body>
</html>