* programma principale * includere dumb.fll all'inizio del programma * per effettuare automaticamente le operazioni * di HL_LOGIN sulla chiave SET LIBR TO DUMB.FLL ? HL_GETAUT(41) ? HL_GETAUT(42) ? HL_GETAUT(45) ? HL_GETAUT(5) ? HL_GETAUT(11) ? HL_GETAUT(18) ? HL_GETAUT(21) ************ Funzione HL_GETAUT ************ prende in input il numero del modulo ************ di cui si vuole sapere l'abilitazione ************ restituisce: ************ 0 se non abilitato ************ 1 se abilitato FUNCTION HL_GETAUT PARAMETER MODULO DIMENSION RISULTATO(18) DIMENSION TMP_RES(18) OLD_DECIMALS = INT(VAL(SYS(2001,'DECIMALS'))) SET DECIMALS TO 6 STORE 0 TO ABILITAZIONE STORE "P39S41" TO STRINGA_SEGRETA ** Cripta la chiave di ricerca casualmente CASUALE = STR(INT(RAND(-1) * 1000000),6,0) CASUALE = CASUALE + TRANSFORM(MODULO,"@L 999") CHIAVE = STRINGA_SEGRETA + LEFT(CASUALE,3) FOR I = 1 TO 16 IF I > 9 THEN RISULTATO (I) = 32 && PAD a 16 bytes ELSE RISULTATO(I) = ASC(SUBSTR(CHIAVE,I,1)) + ASC(SUBSTR(CASUALE,I,1)) ENDIF ENDFOR ** Controlla che la chiave codificata non sia uguale =ACOPY(RISULTATO,TMP_RES) =HL_CODE(@RISULTATO) STORE .T. TO UGUALI FOR I = 1 TO 16 IF RISULTATO(I) <> TMP_RES(I) THEN UGUALI = .F. ENDIF ENDFOR IF UGUALI THEN SET DECIMALS TO OLD_DECIMALS RETURN 0 ENDIF ** Passa alla FLL la stringa da analizzare =HL_GETSTR(@RISULTATO) ** Ora analizza la stringa ritornata, prima la ricodifica =ACOPY(RISULTATO,TMP_RES) =HL_CODE(@RISULTATO) STORE .T. TO UGUALI FOR I = 1 TO 16 IF RISULTATO(I) <> TMP_RES(I) THEN UGUALI = .F. ENDIF ENDFOR IF UGUALI THEN SET DECIMALS TO OLD_DECIMALS RETURN 0 ENDIF ** Infine estrae... l'autorizzazione TERZO_CARATTERE = CHR(RISULTATO(3) - ASC(SUBSTR(STRINGA_SEGRETA,3,1))) ULTIMO_CARATTERE = CHR(RISULTATO(9) - ASC(TERZO_CARATTERE)) ABILITAZIONE = INT(VAL(ULTIMO_CARATTERE)) SET DECIMALS TO OLD_DECIMALS RETURN ABILITAZIONE