home *** CD-ROM | disk | FTP | other *** search
/ HomeWare 14 / HOMEWARE14.bin / bbsutils / lsru_21.arj / LSRU.PPS < prev    next >
Text File  |  1993-07-14  |  15KB  |  379 lines

  1. ;┌──────────────┬────────────────────────────────────────────────────────────┐
  2. ;│              │                                                            │
  3. ;│ PROGRAM      │ LSRU.PPE              *** RELEASED TO PUBLIC DOMAIN ***    │
  4. ;│              │                                                            │
  5. ;│ AUTHOR       │ MOONCROW                                                   │
  6. ;│              │ Mooncrow's Aeyrie BBS                                      │
  7. ;│              │ NODE#1: (206) 737-0244 [14.4 HST]                          │
  8. ;│              │ NODE#2: (206) 737-8944 [14.4 V32]                          │
  9. ;│              │ NODE#3: (206) 737-8950 [14.4 V32]                          │
  10. ;│              │ NODE#4: (206) PRI-VATE [16.8 D/S]                          │
  11. ;│              │                                                            │
  12. ;│ VERSION      │ 2.1                                                        │
  13. ;│              │                                                            │
  14. ;│ DESCRIPTION  │ A [PPE] program for PCBOARD 15.0 or higher.                │
  15. ;│              │ Randomly selects a new logon screen for each new caller.   │
  16. ;│              │ NOTE: 2.1 is NOT compatible with 1.0 or 1.1 - Reinstall!   │
  17. ;│              │                                                            │
  18. ;│ HOW TO USE   │ The intended use for this PPE is for it to be executed in  │
  19. ;│              │ one of two places.  If you are using LSRU only to rotate   │
  20. ;│              │ your welcome screens, then install this PPE as the first   │
  21. ;│              │ and only line in your WELCOME. & WELCOMEG. files.          │
  22. ;│              │                                                            │
  23. ;│              │ If you are using LSRU to replace your logon screens, then  │
  24. ;│              │ do NOT install LSRU in your WELCOME screens.  Instead,     │
  25. ;│              │ install LSRU in PCBTEXT record #259, the prompt that asks  │
  26. ;│              │ the caller for his FIRST name and also install NULL.PPE in │
  27. ;│              │ PCBTEXT record #260, the prompt that asks for the caller's │
  28. ;│              │ LAST name.  This new installation procedure eliminates     │
  29. ;│              │ those annoying double echoes of the name prompts.  See     │
  30. ;│              │ LSRU.DOC for more detailed instructions.                   │
  31. ;│              │                                                            │
  32. ;│              │ LRSU.CNF (or whatever you choose to call the CNF file)     │
  33. ;│              │ must be located in the same directory as LSRU.PPE.  The    │
  34. ;│              │ specific format for this CNF file is described in the      │
  35. ;│              │ sample LSRU.CNF that accompanies this archive.             │
  36. ;│              │                                                            │
  37. ;│ HISTORY      │ See the attached LSRU.HIS file for a detailed history.     │
  38. ;│              │                                                            │
  39. ;└──────────────┴────────────────────────────────────────────────────────────┘
  40.  
  41. ;┌───────────────────────────────────────────────────────────────────────────┐
  42. ;│ Declare Variable Types                                                    │
  43. ;└───────────────────────────────────────────────────────────────────────────┘
  44.  
  45. INTEGER FILE_NUM, INPUT_FLAG, NUM_FILES, POINTER, TEMP
  46. INTEGER HANDLE_POS(1), PWORD_POS(1)
  47.  
  48. BOOLEAN ERROR_FLAG, GRAPHICS_FLAG
  49.  
  50. STRING  CMDLINE, CONFIG_FILE, ERROR_MSG, LOG_FILE, LOGON_FILE, OPTION
  51. STRING  HANDLE, PASSWORD, RETRY_COUNT, TEMP_STRING, CR, CRLF, NAG_FILE
  52. STRING  KBDSTUFF_STRING1, KBDSTUFF_STRING2, KBDSTUFF_STRING3, PROMPT_COLOR
  53.  
  54. ;┌───────────────────────────────────────────────────────────────────────────┐
  55. ;│ Initialize special variables... just to be on the safe side               │
  56. ;└───────────────────────────────────────────────────────────────────────────┘
  57.  
  58. RETRY_COUNT = 0
  59. TEMP = 0
  60.  
  61. ERROR_FLAG = 0
  62. GRAPHICS_FLAG = (GRAFMODE() = "G" | GRAFMODE() = "R")
  63.  
  64. CR = CHR(13)
  65. CRLF = CHR(10) + CHR(13)
  66. HANDLE = ""
  67. KBDSTUFF_STRING1 = ""
  68. KBDSTUFF_STRING2 = ""
  69. KBDSTUFF_STRING3 = ""
  70. NAG_FILE = "NAG_USER.ASC"
  71. PROMPT_COLOR = "00h"
  72. PASSWORD = ""
  73. TEMP_STRING = ""
  74.  
  75. ;┌───────────────────────────────────────────────────────────────────────────┐
  76. ;│ Verify that a CONFIG file was identified on the command line              │
  77. ;└───────────────────────────────────────────────────────────────────────────┘
  78.  
  79. ; Store the commandline in CMDLINE var
  80. CMDLINE = TOKENSTR()
  81. TOKENIZE CMDLINE
  82.  
  83. ; If no command line parameters, ABORT!
  84. IF (TOKCOUNT() < 1) THEN
  85.    ERROR_MSG = "NO CONFIG FILE SPECIFIED ON LSRU COMMAND LINE"
  86.    GOSUB ERROR_HANDLER
  87.    HANGUP
  88. ENDIF
  89.  
  90. ; If the specified LSRU config file does not exist, ABORT!
  91. GETTOKEN CONFIG_FILE
  92. IF (!EXIST(PPEPATH() + CONFIG_FILE)) THEN
  93.    ERROR_MSG = "LSRU CONFIG FILE NOT FOUND IN PPE DIRECTORY"
  94.    GOSUB ERROR_HANDLER
  95.    HANGUP
  96. END IF
  97.  
  98. ;┌───────────────────────────────────────────────────────────────────────────┐
  99. ;│ Make sure the first CONFIG line is a valid number between 1 and 20        │
  100. ;└───────────────────────────────────────────────────────────────────────────┘
  101.  
  102. FOPEN 1, PPEPATH() + CONFIG_FILE, O_RD, S_DN
  103.  
  104. FGET 1, NUM_FILES
  105. IF (NUM_FILES < 1) THEN
  106.    ERROR_MSG = "LINE 1 OF LSRU CONFIG FILE IS NOT AN INTEGER"
  107.    GOSUB ERROR_HANDLER
  108.    HANGUP
  109. END IF
  110.  
  111. IF (NUM_FILES > 20) NUM_FILES = 20
  112.  
  113. ;┌───────────────────────────────────────────────────────────────────────────┐
  114. ;│ If the second CONFIG line is "YES", then LSRU will prompt the caller for  │
  115. ;│ his Handle and Password.  A "NO" here means LSRU will only rotate screens │
  116. ;└───────────────────────────────────────────────────────────────────────────┘
  117.  
  118. FGET 1, OPTION
  119. IF ((OPTION <> "YES") & (OPTION <> "yes")) OPTION = "NO"
  120. FCLOSE 1
  121.  
  122. ;┌───────────────────────────────────────────────────────────────────────────┐
  123. ;│ Randomly select a logon file from the list in the Config file             │
  124. ;└───────────────────────────────────────────────────────────────────────────┘
  125.  
  126. ; Pick a random number between 1 and the number in the config file's Line #1
  127. FILE_NUM = 1 + (RANDOM(NUM_FILES - 1))
  128.  
  129. ; Set index pointer to random filename
  130. POINTER = 2+ (5 * FILE_NUM - 4)
  131.  
  132. ;┌───────────────────────────────────────────────────────────────────────────┐
  133. ;│ Get the logon filename and cursor position from the Config file           │
  134. ;└───────────────────────────────────────────────────────────────────────────┘
  135.  
  136. LOGON_FILE = READLINE(PPEPATH() + CONFIG_FILE, POINTER)
  137. HANDLE_POS(0) = READLINE(PPEPATH() + CONFIG_FILE, POINTER + 1)
  138. HANDLE_POS(1) = READLINE(PPEPATH() + CONFIG_FILE, POINTER + 2)
  139. PWORD_POS(0) = READLINE(PPEPATH() + CONFIG_FILE, POINTER + 3)
  140. PWORD_POS(1) = READLINE(PPEPATH() + CONFIG_FILE, POINTER + 4)
  141.  
  142. ;┌───────────────────────────────────────────────────────────────────────────┐
  143. ;│ Make sure the HANDLE & PASSWORD screen coordinates are on the screen!     │
  144. ;│ [0 <= ROW <= 22] and [0 <= COLUMN <= 67]                                  │
  145. ;└───────────────────────────────────────────────────────────────────────────┘
  146.  
  147. ; Check the HANDLE column #
  148. IF ((HANDLE_POS(0) < 0) | (HANDLE_POS(0) > 67)) THEN
  149.    ERROR_FLAG = 1
  150.    ERROR_MSG = "BAD HANDLE SCREEN COLUMN COORDINATE:" + STRING(HANDLE_POS(0))
  151.    GOSUB ERROR_HANDLER
  152.    GOTO GET_USER_HANDLE
  153. END IF
  154.  
  155. ; Check the HANDLE row #
  156. IF ((HANDLE_POS(1) < 1) | (HANDLE_POS(1) > 22)) THEN
  157.    ERROR_FLAG = 1
  158.    ERROR_MSG = "BAD HANDLE SCREEN ROW COORDINATE:" + STRING(HANDLE_POS(1))
  159.    GOSUB ERROR_HANDLER
  160.    GOTO GET_USER_HANDLE
  161. END IF
  162.  
  163. ; Check the PASSWORD column #
  164. IF ((PWORD_POS(0) < 0) | (PWORD_POS(0) > 67)) THEN
  165.    ERROR_FLAG = 1
  166.    ERROR_MSG = "BAD PASSWORD SCREEN COLUMN COORDINATE:" + STRING(PWORD_POS(0))
  167.    GOSUB ERROR_HANDLER
  168.    GOTO GET_USER_HANDLE
  169. END IF
  170.  
  171. ; Check the PASSWORD row #
  172. IF ((PWORD_POS(1) < 0) | (PWORD_POS(1) > 22)) THEN
  173.    ERROR_FLAG = 1
  174.    ERROR_MSG = "BAD SCREEN ROW COORDINATE:" + STRING(PWORD_POS(1))
  175.    GOSUB ERROR_HANDLER
  176.    GOTO GET_USER_HANDLE
  177. END IF
  178.  
  179. ;┌───────────────────────────────────────────────────────────────────────────┐
  180. ;│ If the logon file exists, display it to the caller, else use default logon│
  181. ;└───────────────────────────────────────────────────────────────────────────┘
  182.  
  183. ; If the caller is not in ANSI or RIP graphics mode, tell him how wonderful
  184. ; color screens can be and how much hard work goes into creating them.
  185. IF (!GRAPHICS_FLAG) LOGON_FILE = NAG_FILE
  186.  
  187. IF (EXIST(PPEPATH() + LOGON_FILE)) THEN
  188.    DISPFILE PPEPATH() + LOGON_FILE, LANG + SEC + GRAPH
  189. ELSE
  190.    ERROR_FLAG = 1
  191.    ERROR_MSG = "COULD NOT FIND LOGON FILE - " + LOGON_FILE
  192.    GOSUB ERROR_HANDLER
  193.    GOTO GET_USER_HANDLE
  194. END IF
  195.  
  196. ;┌───────────────────────────────────────────────────────────────────────────┐
  197. ;│ If the second line of the Config file contains "NO, exit to PCBOARD.      │
  198. ;│ This is MANDATORY if all you want to do is rotate WELCOME screens.        │
  199. ;└───────────────────────────────────────────────────────────────────────────┘
  200.  
  201. IF (OPTION = "NO") GOTO EXIT
  202.  
  203. ;┌───────────────────────────────────────────────────────────────────────────┐
  204. ;│ Get the caller's handle                                                   │
  205. ;└───────────────────────────────────────────────────────────────────────────┘
  206.  
  207. :GET_USER_HANDLE
  208.  
  209. ; Give the caller 3 tries to enter ANY handle longer than 3 characters
  210. IF (RETRY_COUNT = 3) THEN
  211.    IF (GRAPHICS_FLAG & EXIST(PPEPATH() + "DENIED.ANS")) THEN
  212.        DISPFILE PPEPATH() + "DENIED.ANS", 0
  213.        DELAY 182                            ; 10 second delay (10*18.2)
  214.    ELSE
  215.        CLS
  216.        FOR TEMP = 1 TO 9
  217.            PRINTLN ""
  218.        END FOR
  219.        PRINTLN SPACE(15) + "@X0CAccess Denied - Excessive Invalid User ID Attempts!@X07"
  220.    END IF
  221.    HANGUP
  222. END IF
  223.  
  224. IF (GRAPHICS_FLAG & !ERROR_FLAG) THEN
  225.    ANSIPOS HANDLE_POS(0),HANDLE_POS(1)
  226.    INPUTSTR "",HANDLE,PROMPT_COLOR,25,MASK_ASCII(),NOCLEAR + UPCASE
  227. ELSE
  228.    CLS
  229.    INPUTSTR "What is your handle",HANDLE,0Eh,25,MASK_ASCII(),NOCLEAR + UPCASE + LFAFTER + LFBEFORE
  230. END IF
  231.  
  232. ; Make sure caller's handle is at least 3 characters long
  233. IF (LEN(HANDLE) < 3) THEN
  234.    HANDLE = ""
  235.    RETRY_COUNT = RETRY_COUNT + 1
  236.    GOTO GET_USER_HANDLE
  237. END IF
  238.  
  239. ; Trim any leading or trailing "space" characters
  240. TEMP_STRING = TRIM(HANDLE,CHR(32))
  241. HANDLE = TEMP_STRING
  242. TEMP_STRING = ""
  243.  
  244. ; If the caller's Handle does NOT contain a "space", fake the last name
  245. TEMP = INSTR(HANDLE,CHR(32))
  246. IF (TEMP = 0) THEN
  247.    KBDSTUFF_STRING1 = HANDLE + "   "
  248. ELSE
  249.    KBDSTUFF_STRING1 = HANDLE + " "
  250. END IF
  251. TEMP = 0
  252.  
  253. ;┌───────────────────────────────────────────────────────────────────────────┐
  254. ;│ Check the USERS file to see if the caller is a registered user.           │
  255. ;└───────────────────────────────────────────────────────────────────────────┘
  256.  
  257. TEMP = U_RECNUM(HANDLE)
  258. ; Thanks to Mr. Wyzard for pointing out the fact that PCBOARD hiccups during
  259. ; the U_RECNUM call if the caller rapidly presses the ENTER key after entering
  260. ; a one word handle and immediately aborts the PPE and exits to the prompt for
  261. ; the caller's last name.  Be sure you add the call to NULL.PPE to record #260
  262. ; of your PCBTEXT file.
  263.  
  264. ; A value of -1 means the caller is NOT a registered user, so exit to PCBOARD
  265. IF (TEMP = -1) THEN
  266.    CLS
  267.    KBDSTUFF_STRING1 = KBDSTUFF_STRING1 + " " + CR
  268.    GOTO STUFF_KEYBOARD
  269. END IF
  270.  
  271. ; A value of 0 probably indicates a program error, so abort & hangup
  272. IF (TEMP = 0) THEN
  273.    IF (ANSION()) ANSIPOS 0,22
  274.    ERROR_MSG = "User record number out of bounds"
  275.    GOSUB ERROR_HANDLER
  276.    HANGUP
  277. END IF
  278. TEMP = 0
  279.  
  280. ;┌───────────────────────────────────────────────────────────────────────────┐
  281. ;│ Ok, the caller is a registered user, so get him to enter his PASSWORD     │
  282. ;└───────────────────────────────────────────────────────────────────────────┘
  283.  
  284. IF (GRAPHICS_FLAG & !ERROR_FLAG) THEN
  285.    ANSIPOS PWORD_POS(0),PWORD_POS(1)
  286.    INPUTSTR "",PASSWORD,PROMPT_COLOR,13,MASK_PWD(),NOCLEAR + ECHODOTS + UPCASE
  287. ELSE
  288.    INPUTSTR "What is your password",PASSWORD,0Eh,13,MASK_PWD(),NOCLEAR + ECHODOTS + UPCASE + LFAFTER + LFBEFORE
  289. END IF
  290.  
  291. ; Trim any leading or trailing "space" characters
  292. TEMP_STRING = TRIM(PASSWORD,CHR(32))
  293. PASSWORD = TEMP_STRING
  294. TEMP_STRING = ""
  295.  
  296. KBDSTUFF_STRING2 = PASSWORD + CR
  297.  
  298. ;┌───────────────────────────────────────────────────────────────────────────┐
  299. ;│ Move cursor to the bottom of the screen (Column 0, Row 22) so the next    │
  300. ;│ prompt won't overwrite the middle of the ANSI logon screen                │
  301. ;└───────────────────────────────────────────────────────────────────────────┘
  302.  
  303. IF (ANSION()) ANSIPOS 0,22
  304.  
  305. ;┌───────────────────────────────────────────────────────────────────────────┐
  306. ;│ Ok, we have the caller's handle & password, so stuff the keyboard buffer  │
  307. ;│ and return control to PCBOARD                                             │
  308. ;└───────────────────────────────────────────────────────────────────────────┘
  309.  
  310. :STUFF_KEYBOARD
  311. SHOWOFF
  312. KBDSTUFF KBDSTUFF_STRING1 + KBDSTUFF_STRING2
  313. SHOWON
  314. CLS
  315. GOTO EXIT
  316.  
  317. ;┌───────────────────────────────────────────────────────────────────────────┐
  318. ;│ Error Handler                                                             │
  319. ;└───────────────────────────────────────────────────────────────────────────┘
  320.  
  321. :ERROR_HANDLER
  322.  
  323. ; Log the error to the CALLER file
  324. LOG_FILE = READLINE(PCBDAT(),30)
  325.  
  326. FOPEN 2, LOG_FILE, O_RW, S_DW
  327.  
  328. TEMP_STRING = STRING(DATE()) + " (" + STRING(TIME()) + ") (" + "@NODE@" + ") " + HANDLE
  329. GOSUB PAD_LOG_STRING
  330. FPUT 2, TEMP_STRING
  331.  
  332. FPUT 2, SPACE(62) + CRLF
  333.  
  334. TEMP_STRING = "LSRU ERROR: " + ERROR_MSG
  335. GOSUB PAD_LOG_STRING
  336. FPUT 2, TEMP_STRING
  337.  
  338. FPUT 2, SPACE(62) + CRLF
  339.  
  340. ; If FATAL error occurred, log it, let the caller know and then hangup!
  341. TEMP_STRING = "**************************************************************"
  342.  
  343. IF (ERROR_FLAG) THEN
  344.    FPUT 2, TEMP_STRING
  345.    FCLOSE 2
  346. ELSE
  347.    CLS
  348.    PRINTLN "@X0CFATAL ERROR@X07:" + ERROR_MSG
  349.    PRINTLN ""
  350.    PRINTLN "@X0EFAIL SAFE TRIPPED... @X0FSHUTTING SYSTEM DOWN...@X07"
  351.    PRINTLN ""
  352.    PRINTLN "Notify SysOp - If possible!"
  353.    FPUT 2, "CALLER OFF ABNORMALLY"
  354.    FPUT 2, TEMP_STRING
  355.    FCLOSE 2
  356.    FCLOSE 1
  357.    HANGUP
  358. END IF
  359. RETURN
  360.  
  361. ;┌───────────────────────────────────────────────────────────────────────────┐
  362. ;│ PCBOARD CALLER log entries MUST have a fixed line length of 64 bytes      │
  363. ;└───────────────────────────────────────────────────────────────────────────┘
  364.  
  365. :PAD_LOG_STRING
  366. IF (LEN(TEMP_STRING) > 62) THEN
  367.    TEMP_STRING = LEFT(TEMP_STRING,62) + CRLF
  368. ELSE
  369.    TEMP_STRING = TEMP_STRING + SPACE(62-LEN(TEMP_STRING)) + CRLF
  370. END IF
  371. RETURN
  372.  
  373. ;┌───────────────────────────────────────────────────────────────────────────┐
  374. ;│ EXITS PPE and returns control to PCBOARD                                  │
  375. ;└───────────────────────────────────────────────────────────────────────────┘
  376.  
  377. :EXIT
  378. END
  379.