From 10379207b0af8c019ad8a1b052a8862109f37966 Mon Sep 17 00:00:00 2001
From: Eric Oulashin <nightfox@synchro.net>
Date: Tue, 31 May 2022 21:33:48 +0000
Subject: [PATCH] SlyEdit 1.77: Fix for aborting when trying to access
 sub-board information when there are no sub-boards

---
 exec/SlyEdit.js      | 39 ++++++++++++------
 exec/SlyEdit_Misc.js | 97 +++++++++++++++++++++++---------------------
 2 files changed, 76 insertions(+), 60 deletions(-)

diff --git a/exec/SlyEdit.js b/exec/SlyEdit.js
index be2b6a1c1b..9fb778557b 100644
--- a/exec/SlyEdit.js
+++ b/exec/SlyEdit.js
@@ -136,12 +136,16 @@
  *                              Finished refactoring to use DDLightbarMenu
  *                              for the cross-posting menus. Also used DDLightbarMenu
  *                              for the quote selection window.
- * 2022-03-05                   Version 1.76
+ * 2022-03-05 Eric Oulashin     Version 1.76
  *                              When selecting quote lines in a reply message, SlyEdit now
  *                              remembers the position in the quote selection menu so that
  *                              the quote menu isn't always at the top whenever it's opened
  *                              again.  This issue may have been introduced when SlyEdit
  *                              was refactored to use DDLightbarMenu for its lightbar stuff.
+ * 2022-05-27 Eric Oulashin     Version 1.77
+ *                              Fixed a few instances where SlyEdit was trying to access
+ *                              sub-board information with an empty sub-board code (in the rare
+ *                              case when no sub-boards are configured).
  */
 
 /* Command-line arguments:
@@ -238,8 +242,8 @@ if (console.screen_columns < 80)
 }
 
 // Constants
-const EDITOR_VERSION = "1.76";
-const EDITOR_VER_DATE = "2022-03-05";
+const EDITOR_VERSION = "1.77";
+const EDITOR_VER_DATE = "2022-05-27";
 
 
 // Program variables
@@ -304,6 +308,8 @@ gCrossPostMsgSubs.propIsFuncName = function(pPropName) {
 gCrossPostMsgSubs.subCodeExists = function(pSubCode) {
 	if (typeof(pSubCode) != "string")
 		return false;
+	if (pSubCode === "")
+		return false;
 
 	var grpIndex = msg_area.sub[pSubCode].grp_index;
 	var foundIt = false;
@@ -318,6 +324,8 @@ gCrossPostMsgSubs.subCodeExists = function(pSubCode) {
 gCrossPostMsgSubs.add = function(pSubCode) {
 	if (typeof(pSubCode) != "string")
 		return;
+	if (pSubCode === "")
+		return;
 	if (this.subCodeExists(pSubCode))
 		return;
 
@@ -333,6 +341,8 @@ gCrossPostMsgSubs.add = function(pSubCode) {
 gCrossPostMsgSubs.remove = function(pSubCode) {
 	if (typeof(pSubCode) != "string")
 		return;
+	if (pSubCode === "")
+		return;
 
 	var grpIndex = msg_area.sub[pSubCode].grp_index;
 	if (this.hasOwnProperty(grpIndex))
@@ -4177,9 +4187,9 @@ function spellCheckWordInLine(pDictionaries, pEditLineIdx, pWordArray, pWordIdx,
 	// Ensure the word to test is all lowercase for case-insensitive matching
 	var currentWord = pWordArray[pWordIdx].toLowerCase();
 	// Ensure the word we're checking only has letters and/or an apostrophe.
-	var currentWord = currentWord.replace(/^[^a-zA-ZÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜáíóúñÑß']*([a-zA-ZÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜáíóúñÑß']+)[^a-zA-ZÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜáíóúñÑß']*$/, "$1");
+	var currentWord = currentWord.replace(/^[^a-zA-ZÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜáíóúñÑß']*([a-zA-ZÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜáíóúñÑß']+)[^a-zA-ZÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜáíóúñÑß']*$/, "$1");
 	// Now, ensure the word only certain characters: Letters, apostrophe.  Skip it if not.
-	if (!/^[a-zA-ZÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜáíóúñÑß']+$/g.test(currentWord))
+	if (!/^[a-zA-ZÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜáíóúñÑß']+$/g.test(currentWord))
 	{
 		retObj.skipped = true;
 		return retObj;
@@ -5890,15 +5900,18 @@ function writeMsgOntBtmHelpLineWithPause(pMsg, pPauseMS)
 function getSignName(pSubCode, pRealNameOnlyFirst, pRealNameForEmail)
 {
 	var useRealName = false;
-	if (pSubCode.toUpperCase() == "MAIL")
-		useRealName = pRealNameForEmail;
-	else
+	if (typeof(pSubCode) === "string" && pSubCode != "")
 	{
-		var msgbase = new MsgBase(pSubCode);
-		if (msgbase.open())
+		if (pSubCode.toUpperCase() == "MAIL")
+			useRealName = pRealNameForEmail;
+		else
 		{
-			useRealName = ((msgbase.cfg.settings & SUB_NAME) == SUB_NAME);
-			msgbase.close();
+			var msgbase = new MsgBase(pSubCode);
+			if (msgbase.open())
+			{
+				useRealName = ((msgbase.cfg.settings & SUB_NAME) == SUB_NAME);
+				msgbase.close();
+			}
 		}
 	}
 	var signName = "";
@@ -5992,4 +6005,4 @@ function letUserUploadMessageFile(pCurpos)
 
 	console.gotoxy(originalCurpos);
 	return uploadedMessage;
-}
\ No newline at end of file
+}
diff --git a/exec/SlyEdit_Misc.js b/exec/SlyEdit_Misc.js
index cbd783b2a4..cfe12d39a1 100644
--- a/exec/SlyEdit_Misc.js
+++ b/exec/SlyEdit_Misc.js
@@ -43,6 +43,9 @@
  *                              property of the sub-board rather than checking the
  *                              ARS.  The can_post property covers more cases.
  * 2021-12-09 Eric Oulashin     Added consolePauseWithoutText()
+ * 2022-05-27                   Fixed a few instances where SlyEdit was trying to access
+ *                              sub-board information with an empty sub-board code (in the rare
+ *                              case when no sub-boards are configured).
  */
  
 if (typeof(require) === "function")
@@ -59,43 +62,43 @@ var BKG_ATTR = 2;  // Background color attribute
 var SPECIAL_ATTR = 3; // Special attribute
 
 // Box-drawing/border characters: Single-line
-var UPPER_LEFT_SINGLE = "Ú";
-var HORIZONTAL_SINGLE = "Ä";
-var UPPER_RIGHT_SINGLE = "¿";
-var VERTICAL_SINGLE = "³";
-var LOWER_LEFT_SINGLE = "À";
-var LOWER_RIGHT_SINGLE = "Ù";
-var T_SINGLE = "Â";
-var LEFT_T_SINGLE = "Ã";
-var RIGHT_T_SINGLE = "´";
-var BOTTOM_T_SINGLE = "Á";
-var CROSS_SINGLE = "Å";
+var UPPER_LEFT_SINGLE = "Ú";
+var HORIZONTAL_SINGLE = "Ä";
+var UPPER_RIGHT_SINGLE = "¿";
+var VERTICAL_SINGLE = "³";
+var LOWER_LEFT_SINGLE = "À";
+var LOWER_RIGHT_SINGLE = "Ù";
+var T_SINGLE = "Â";
+var LEFT_T_SINGLE = "Ã";
+var RIGHT_T_SINGLE = "´";
+var BOTTOM_T_SINGLE = "Á";
+var CROSS_SINGLE = "Ã…";
 // Box-drawing/border characters: Double-line
-var UPPER_LEFT_DOUBLE = "É";
-var HORIZONTAL_DOUBLE = "Í";
-var UPPER_RIGHT_DOUBLE = "»";
-var VERTICAL_DOUBLE = "º";
-var LOWER_LEFT_DOUBLE = "È";
-var LOWER_RIGHT_DOUBLE = "¼";
-var T_DOUBLE = "Ë";
-var LEFT_T_DOUBLE = "Ì";
-var RIGHT_T_DOUBLE = "¹";
-var BOTTOM_T_DOUBLE = "Ê";
-var CROSS_DOUBLE = "Î";
+var UPPER_LEFT_DOUBLE = "É";
+var HORIZONTAL_DOUBLE = "Í";
+var UPPER_RIGHT_DOUBLE = "»";
+var VERTICAL_DOUBLE = "º";
+var LOWER_LEFT_DOUBLE = "È";
+var LOWER_RIGHT_DOUBLE = "¼";
+var T_DOUBLE = "Ë";
+var LEFT_T_DOUBLE = "Ì";
+var RIGHT_T_DOUBLE = "¹";
+var BOTTOM_T_DOUBLE = "Ê";
+var CROSS_DOUBLE = "ÃŽ";
 // Box-drawing/border characters: Vertical single-line with horizontal double-line
-var UPPER_LEFT_VSINGLE_HDOUBLE = "Õ";
-var UPPER_RIGHT_VSINGLE_HDOUBLE = "¸";
-var LOWER_LEFT_VSINGLE_HDOUBLE = "Ô";
-var LOWER_RIGHT_VSINGLE_HDOUBLE = "¾";
+var UPPER_LEFT_VSINGLE_HDOUBLE = "Õ";
+var UPPER_RIGHT_VSINGLE_HDOUBLE = "¸";
+var LOWER_LEFT_VSINGLE_HDOUBLE = "Ô";
+var LOWER_RIGHT_VSINGLE_HDOUBLE = "¾";
 // Other special characters
-var DOT_CHAR = "ú";
-var CHECK_CHAR = "û";
-var THIN_RECTANGLE_LEFT = "Ý";
-var THIN_RECTANGLE_RIGHT = "Þ";
-var BLOCK1 = "°"; // Dimmest block
-var BLOCK2 = "±";
-var BLOCK3 = "²";
-var BLOCK4 = "Û"; // Brightest block
+var DOT_CHAR = "ú";
+var CHECK_CHAR = "û";
+var THIN_RECTANGLE_LEFT = "Ý";
+var THIN_RECTANGLE_RIGHT = "Þ";
+var BLOCK1 = "°"; // Dimmest block
+var BLOCK2 = "±";
+var BLOCK3 = "²";
+var BLOCK4 = "Û"; // Brightest block
 
 // Navigational keys
 var UP_ARROW = "";
@@ -1376,7 +1379,7 @@ function displayCommandList(pDisplayHeader, pClear, pPause, pCanCrossPost, pIsSy
 
 	// Help keys and slash commands
 	printf("\1n\1g%-44s  %-33s\r\n", "Help keys", "Slash commands (on blank line)");
-	printf("\1k\1h%-44s  %-33s\r\n", "ÄÄÄÄÄÄÄÄÄ", "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ");
+	printf("\1k\1h%-44s  %-33s\r\n", "ÄÄÄÄÄÄÄÄÄ", "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ");
 	displayCmdKeyFormattedDouble("Ctrl-G", "General help", "/A", "Abort", true);
 	displayCmdKeyFormattedDouble("Ctrl-L", "Command key list (this list)", "/S", "Save", true);
 	displayCmdKeyFormattedDouble("", "", "/Q", "Quote message", true);
@@ -1390,7 +1393,7 @@ function displayCommandList(pDisplayHeader, pClear, pPause, pCanCrossPost, pIsSy
 	printf(" \1c\1h%-7s\1g  \1n\1c%s", "", "", "/?", "Show help");
 	console.crlf();
 	// Command/edit keys
-	console.print("\1n\1gCommand/edit keys\r\n\1k\1hÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ\r\n");
+	console.print("\1n\1gCommand/edit keys\r\n\1k\1hÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ\r\n");
 	displayCmdKeyFormattedDouble("Ctrl-A", "Abort message", "PageUp", "Page up", true);
 	displayCmdKeyFormattedDouble("Ctrl-Z", "Save message", "PageDown", "Page down", true);
 	displayCmdKeyFormattedDouble("Ctrl-Q", "Quote message", "Ctrl-W", "Word/text search", true);
@@ -1469,14 +1472,14 @@ function displayProgramExitInfo(pClearScreen)
 		console.clear("n");
 
 	/*console.print("ncYou have been using:\r\n");
-	console.print("hkÛ7ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß0Û\r\n");
-	console.print("Û7 nb7Üßßßß Û       Ûßßßß    Û Ü       hk0Û\r\n");
-	console.print("Û7 nb7ßÜÜÜ  Û Ü   Ü ÛÜÜÜ   ÜÜÛ Ü ÜÜÛÜÜ hk0Û\r\n");
-	console.print("Û7     nb7Û Û Û   Û Û     Û  Û Û   Û   hk0Û\r\n");
-	console.print("Û7 nb7ßßßß  ß  ßÜß  ßßßßß  ßßß ß   ßßß hk0Û\r\n");
-	console.print("Û7         nb7Üß                       hk0Û\r\n");
-	console.print("Û7        nb7ß                         hk0Û\r\n");
-	console.print("ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß\r\n");
+	console.print("hkÛ7ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß0Û\r\n");
+	console.print("Û7 nb7Üßßßß Û       Ûßßßß    Û Ü       hk0Û\r\n");
+	console.print("Û7 nb7ßÜÜÜ  Û Ü   Ü ÛÜÜÜ   ÜÜÛ Ü ÜÜÛÜÜ hk0Û\r\n");
+	console.print("Û7     nb7Û Û Û   Û Û     Û  Û Û   Û   hk0Û\r\n");
+	console.print("Û7 nb7ßßßß  ß  ßÜß  ßßßßß  ßßß ß   ßßß hk0Û\r\n");
+	console.print("Û7         nb7Üß                       hk0Û\r\n");
+	console.print("Û7        nb7ß                         hk0Û\r\n");
+	console.print("ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß\r\n");
 	console.print("ngVersion hy" + EDITOR_VERSION + " nm(" +
 	              EDITOR_VER_DATE + ")");*/
 	console.print("ncYou have been using hSlyEdit ncversion g" + EDITOR_VERSION +
@@ -3342,7 +3345,7 @@ function getCurMsgInfo(pMsgAreaName)
 	// Note: As of the May 8, 2013 build of Synchronet (3.16), the bbs.smb_sub*
 	// properties reflect the current sub-board being posted to, always.
 	// Digital Man committed a change in CVS for this on May 7, 2013.
-	if ((typeof(pMsgAreaName) == "string") && (pMsgAreaName.length > 0))
+	if ((typeof(pMsgAreaName) === "string") && (pMsgAreaName.length > 0) && (retObj.subBoardCode != "") && msg_area.sub.hasOwnProperty(retObj.subBoardCode))
 	{
 		if (msg_area.sub[retObj.subBoardCode].name.indexOf(pMsgAreaName) == -1)
 		{
@@ -3825,7 +3828,7 @@ function moveGenColorsToGenSettings(pColorsArray, pCfgObj)
 // Return value: Boolean - Whether or not the character is a letter
 function charIsLetter(pChar)
 {
-   return /^[ABCDEFGHIJKLMNOPQRSTUVWXYZÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÏÖÜäëïöüçÇßØøÅåÆæÞþÐð]$/.test(pChar.toUpperCase());
+   return /^[ABCDEFGHIJKLMNOPQRSTUVWXYZÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÏÖÜäëïöüçÇßØøÅåÆæÞþÐð]$/.test(pChar.toUpperCase());
 }
 
 // For configuration files, this function returns a fully-pathed filename.
@@ -4746,7 +4749,7 @@ function getLanguageNameFromDictFilename(pFilenameFullPath)
 	else if (languageNameLower == "pt-br")
 		languageName = "Portug" + ascii(130) + "s (BR)";
 	else if (languageNameLower == "es-es")
-		languageName = "Espa" + ascii(164) + "ol (España)";
+		languageName = "Espa" + ascii(164) + "ol (España)";
 	else if (languageNameLower == "es-co")
 		languageName = "Espa" + ascii(164) + "ol (CO)";
 	else if (languageNameLower == "es-cl")
-- 
GitLab