816.TXT
=====================================================================
Generating Random Text
=====================================================================
PRODUCT: R:BASE VERSION: All
=====================================================================
CATALOG: General Information AREA : Data Manipulation
=====================================================================
A random string of numbers and letters can be used as a user
identifier or password. Many database applications store actual
GRANT/REVOKE access names in a look-up table. The user uses their own
name to retrieve a particular granted user identifier and level of
access from the look-up table. In this type of application, the user
identifier is never known by any user of the database. To ensure
security to the data, the user identifiers stored in the look-up table
are changed on a regular basis. This command file uses the #TIME and
#DATE system variables and various date and time functions to create a
random character string of numbers and letters. The password look-up
table is updated with the random string created by the program.
*(randtext.cmd)
SET VAR vName TEXT = NULL
-- The source variable, make sure there are
-- no spaces in the string.
SET VAR vKey TEXT = +
('A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,+
U,V,W,X,Y,Z,0,1,2,3,4,5,6,7,8,9')
SET VAR vTime TIME = .#TIME
SET VAR ch1 INTEGER = (ISEC(.vTime))
-- Require the first character to be a letter.
WHILE ch1 > 26 THEN
SET VAR ch1 = (.ch1 - 26)
ENDWH
-- Set character 2 to the minutes portion of the time.
-- This section needs a test for greater than 36,
-- if the value is out of range, the result is null
SET VAR ch2 INTEGER = (IMIN(.vTime))
-- Set character 3 to the minutes divided by 6,
-- this will never be a number greater than 10.
SET VAR ch3 INTEGER = (IMIN(.vTime)/6)
-- Set character 4 to the day portion of the date.
SET VAR ch4 INTEGER = (IDAY(.#DATE))
-- Character 4 can never be greater than 36.
SET VAR ch4 = (.ch4 + 5)
--IF ch4 > 36 THEN
-- SET VAR ch4 = (ch4 - 36)
--ENDIF
-- Set character 5 to the number of the day
-- of the week, this is a number between 1 and 7,
-- and then multiply by the value of character 3.
-- The maximum value for this number is 70.
SET VAR ch5 INTEGER = (IDWK(.#DATE))
SET VAR ch5 = (.ch5 * .ch3)
-- Make sure this number is less than 36.
IF ch5 > 36 THEN
SET VAR ch5 = (.ch5 - 36)
ENDIF
-- Set character 6 to the month portion of the date
-- and then add the value of character 5
-- (maximum for 5 is 34, plus 12 = 46).
SET VAR ch6 INTEGER = (IMON(.#DATE))
SET VAR ch6 = (.ch6 + .ch5)
IF ch6 > 36 THEN
SET VAR ch6 = (.ch6 - 36)
ENDIF
-- Set character 7 to the Julian date of the date,
-- then get the third and fourth characters from it.
-- This will be a number between 0 and 36.
-- Need to test for 0, when 0 this character is null.
SET VAR ch7 INTEGER = (JDATE(.#DATE))
SET VAR ch7 TEXT
SET VAR ch7 = (SGET(.ch7,2,3))
IF ch7 = '00' THEN
SET VAR ch7 = (SGET(.ch7,2,4))
ENDIF
SET VAR ch7 INTEGER
-- The hour portion of the time plus 12, is a number
-- between 12 and 24.
SET VAR ch8 INTEGER = ((IHR(.vTime))+12)
-- Add all the previous character values together
-- and divide by 8, the average of all the previous
-- characters
SET VAR ch9 INTEGER = +
((.ch1+.ch2+.ch3+.ch4+.ch5+.ch6+.ch7+.ch8)/8)
-- Get the actual characters from the source variable.
SET VAR vName2 = +
(SSUB(.vKey,.ch1) + SSUB(.vKey,.ch2) + +
SSUB(.vKey,.ch3) + SSUB(.vKey,.ch4) + +
SSUB(.vKey,.ch5) + SSUB(.vKey,.ch6) + +
SSUB(.vKey,.ch7) + SSUB(.vKey,.ch8) + +
SSUB(.vKey,.ch9))
CLEAR VAR ch%, vKey, vTime
RETURN