/* rsaextconv.p                                                              */ 
/*****************************************************************************/
/* Copyright (c) 1994-2005 RSA Security Inc. All rights reserved.            */
/*****************************************************************************/
/* RSA Authentiction Manager 6.1                                             */

/* Define shared vars to be used by HLC routine errSDGetCurrentDateTime() */
DEFINE NEW SHARED VARIABLE tMyLocalTOD AS INTEGER.
DEFINE NEW SHARED VARIABLE dtMyLocalDate AS DATE.
DEFINE NEW SHARED VARIABLE tMyGMTTOD AS INTEGER.
DEFINE NEW SHARED VARIABLE dtMyGMTDate AS DATE.
DEFINE NEW SHARED VARIABLE iErrNo AS INTEGER.


DEFINE BUFFER profile FOR SDProfile.
DEFINE BUFFER av FOR SDAttributeValue.
DEFINE BUFFER userbuf FOR SDUser.
DEFINE BUFFER userext FOR CustUserExtension.

DEFINE VARIABLE countav AS INTEGER INIT 0.


DEFINE VARIABLE firstProfile AS LOGICAL INIT TRUE.
DEFINE VARIABLE firstUser AS LOGICAL INIT TRUE.
DEFINE VARIABLE wasConverted AS LOGICAL INIT FALSE.
DEFINE VARIABLE newkey AS CHARACTER.

DEFINE TEMP-TABLE AVCopy LIKE SDAttributeValue
    INDEX valueIndex chValue ASCENDING.

IF SESSION:WINDOW-SYSTEM = "TTY" THEN
DO:
    MESSAGE "Utility can be executed only on Windows platform."
    VIEW-AS ALERT-BOX ERROR.
    RETURN.    
END.


/* Check if any convertion might be needed */
FIND FIRST av WHERE chValue BEGINS "E" NO-LOCK NO-ERROR.
IF NOT AVAILABLE(av) THEN
DO:
    MESSAGE "Database does not require extension conversion."
    VIEW-AS ALERT-BOX INFORMATION.
    RETURN.
END.



/* Display hourglass */
RUN wait.p.

OUTPUT TO rsaextconv.log.

MESSAGE "CONVERSION JOB:".
MESSAGE "    OPTION: Create new user extensions, Delete old user extensions, Update profiles.".
MESSAGE "    MODE: Simulation mode.".

RUN reportTime(INPUT "START").



/* Go through profiles to find the users and extensions that need to be converted */
FOR EACH profile NO-LOCK:

    /* Check that profile has anything to convert */
    countav = 0.
    SELECT COUNT(*) INTO countav FROM SDAttributeValue 
    WHERE SDAttributeValue.iProfileNum = profile.iProfileNum AND
          SDAttributeValue.chValue BEGINS "E".

    IF (countav > 0) THEN
    DO:
        /* Report the profile */
        IF firstProfile THEN
        DO:
            firstProfile = FALSE.
            MESSAGE "    PROFILES:".
        END.

        MESSAGE "        PROFILE:".
        MESSAGE "            NAME:" profile.chName.
        MESSAGE "            ATTRIBUTES:".

        FOR EACH av WHERE av.iProfileNum = profile.iProfileNum AND
                          av.chValue BEGINS "E":
        
            IF NOT CAN-FIND(FIRST AVCopy WHERE (AVCopy.chValue = av.chValue) AND 
                            (AVCopy.iRadiusAttributeID = av.iRadiusAttributeID))
                            THEN
            DO:
                MESSAGE "                ATTRIBUTE:".
                MESSAGE "                    ID:" av.iRadiusAttributeID.
                MESSAGE "                    VALUE:" SUBSTRING(av.chValue,2).
                MESSAGE "                END ATTRIBUTE.".

                CREATE AVCopy.
                BUFFER-COPY av TO AVCopy NO-ERROR.
                RELEASE AVCopy.
            END.

        END.
        MESSAGE "            END ATTRIBUTES.".

        firstUser = TRUE.

        FOR EACH userbuf WHERE userbuf.iProfileNum = profile.iProfileNum NO-LOCK:
                
            IF firstUser THEN
            DO:
                firstUser = FALSE.
                MESSAGE "            USERS:".
            END.

            MESSAGE "                USER:".
            MESSAGE "                    LOGIN:" userbuf.chDefaultLogin.

            wasConverted = FALSE.

            /* Do comparison of the extensions and profile attributes */

            FOR EACH userext
            WHERE userext.iUserNum = userbuf.iUserNum NO-LOCK:

                FOR EACH AVCopy USE-INDEX valueIndex 
                    WHERE userext.chKey BEGINS SUBSTRING(AVCopy.chValue,2)
                    NO-LOCK:
                    
                    /* Report conversion */
                    MESSAGE "                    CONVERSION:".
                    MESSAGE "                        KEY:" userext.chKey.
                    newkey = "ATTR" + STRING(AVCopy.iRadiusAttributeID) + "_" + userext.chKey.
                    IF LENGTH(newkey) <= 48 THEN
                    DO:
                        MESSAGE "                        NEW KEY:" newkey.
                        MESSAGE "                        STATUS: Ok.".
                    END.
                    ELSE
                    DO:
                        MESSAGE "                        STATUS: Error: Converted key does not fit into the database field. Skipped.".
                    END.

                    MESSAGE "                    END CONVERSION.".

                    wasConverted = TRUE.
                END.
            END.

            IF NOT wasConverted THEN 
            DO:
                MESSAGE "                    STATUS: No conversion needed.".                    
            END.

            MESSAGE "                END USER.".
        END.
        IF NOT firstUser THEN
        DO:
            firstUser = TRUE.
            MESSAGE "            END USERS.".
        END.

        FOR EACH AVCopy:
            DELETE AVCopy.
        END. 

        MESSAGE "        END PROFILE.".

    END.
END.


/* No process default profile case */
FIND FIRST profile WHERE chName = "default" NO-LOCK NO-ERROR.
IF AVAILABLE(profile) THEN
DO:
    /* Check that profile has anything to convert */
    countav = 0.
    SELECT COUNT(*) INTO countav FROM SDAttributeValue 
    WHERE SDAttributeValue.iProfileNum = profile.iProfileNum AND
          SDAttributeValue.chValue BEGINS "E".

    IF (countav> 0) THEN
    DO:

        IF firstProfile THEN
        DO:
            firstProfile = FALSE.
            MESSAGE "    PROFILES:".
        END.

        MESSAGE "        PROFILE:".
        MESSAGE "            NAME: DEFAULT (special processing)".
        MESSAGE "            ATTRIBUTES:".

        FOR EACH av WHERE av.iProfileNum = profile.iProfileNum AND
                          av.chValue BEGINS "E":
        
            IF NOT CAN-FIND(FIRST AVCopy WHERE (AVCopy.chValue = av.chValue) AND 
                            (AVCopy.iRadiusAttributeID = av.iRadiusAttributeID))
                            THEN
            DO:
                MESSAGE "                ATTRIBUTE:".
                MESSAGE "                    ID:" av.iRadiusAttributeID.
                MESSAGE "                    VALUE:" SUBSTRING(av.chValue,2).
                MESSAGE "                END ATTRIBUTE.".

                CREATE AVCopy.
                BUFFER-COPY av TO AVCopy NO-ERROR.
                RELEASE AVCopy.
            END.

        END.
        MESSAGE "            END ATTRIBUTES.".

        firstUser = TRUE.

        FOR EACH userbuf WHERE userbuf.iProfileNum = 0 NO-LOCK:
                
            IF firstUser THEN
            DO:
                firstUser = FALSE.
                MESSAGE "            USERS:".
            END.

            MESSAGE "                USER:".
            MESSAGE "                    LOGIN:" userbuf.chDefaultLogin.

            wasConverted = FALSE.

            /* Do comparison of the extensions and profile attributes */

            FOR EACH userext
            WHERE userext.iUserNum = userbuf.iUserNum NO-LOCK:

                FOR EACH AVCopy USE-INDEX valueIndex 
                    WHERE userext.chKey BEGINS SUBSTRING(AVCopy.chValue,2)
                    NO-LOCK:
                    
                    /* Report conversion */
                    MESSAGE "                    CONVERSION:".
                    MESSAGE "                        KEY:" userext.chKey.
                    newkey = "ATTR" + STRING(AVCopy.iRadiusAttributeID) + "_" + userext.chKey.
                    IF LENGTH(newkey) <= 48 THEN
                    DO:
                        MESSAGE "                        NEW KEY:" newkey.
                        MESSAGE "                        STATUS: Ok.".
                    END.
                    ELSE
                    DO:
                        MESSAGE "                        STATUS: Error: Converted key does not fit into the database field. Skipped.".
                    END.

                    MESSAGE "                    END CONVERSION.".

                    wasConverted = TRUE.
                END.
            END.

            IF NOT wasConverted THEN 
            DO:
                MESSAGE "                    STATUS: No conversion needed.".                    
            END.

            MESSAGE "                END USER.".

        END.
        IF NOT firstUser THEN
        DO:
            firstUser = TRUE.
            MESSAGE "            END USERS.".
        END.

        FOR EACH AVCopy:
            DELETE AVCopy.
        END. 

        MESSAGE "        END PROFILE.".

    END.
END.

IF NOT firstProfile THEN
DO:
    firstProfile = TRUE.
    MESSAGE "    END PROFILES.".
END.

RUN reportTime(INPUT "COMPLETE").
MESSAGE "END CONVERSION JOB.".
OUTPUT CLOSE.

RUN nowait.p.

MESSAGE "The log file rsaextconv.log has been created in the current directory." 
    VIEW-AS ALERT-BOX INFORMATION.

&IF "{&WINDOW-SYSTEM}" = "MS-WIN95" &THEN
    OS-COMMAND NO-CONSOLE notepad.exe rsaextconv.log.
&ENDIF


/************************************************************************/
PROCEDURE reportTime:
DEFINE INPUT PARAMETER start-end AS CHARACTER NO-UNDO.

DEFINE VARIABLE timestring AS CHARACTER.

    /* Get the current local and GMT date and time */
    CALL errSDGetCurrentDateTime "tMyLocalTOD" "dtMyLocalDate" "tMyGMTTOD"
                                 "dtMyGMTDate" "iErrNo".

    timestring = "Local " + STRING(dtMyLocalDate) + " " + STRING(tMyLocalTOD,"HH:MM:SS") +
                 " UTC " + STRING(dtMyGMTDate) + " " + STRING(tMyGMTTOD,"HH:MM:SS").


    MESSAGE "   " start-end "TIME:" timestring.

END PROCEDURE.


