program login; uses md5, crt, utils in '../lib/utils.pas'; type CONNECTION = record hotel : string[10]; distance : integer; end; HOTEL = record name : string[10]; conn : CONNECTION; end; USER = record un: string; pw: string; l: boolean; end; const users: array [0..4] of USER = ( (un: 'user1'; pw: '16d7a4fca7442dda3ad93c9a726597e4'; l: false), (un: 'user2'; pw: 'ccd2fc33d2d423d7209035dbfff82b29'; l: false), (un: 'user3'; pw: '57c2877c1d84c4b49f3289657deca65c'; l: false), (un: 'user4'; pw: '4101bef8794fed986e95dfb54850c68b'; l: false), (un: 'root'; pw: '63a9f0ea7bb98050796b649e85481845'; l: false) ); var readinput: string; j, hnum1, hnum2: integer; correct: boolean; usersuccess: boolean = false; time: real; hotels_f: File of HOTEL; function get_hotel_by_name(hname: String) : HOTEL; { Read the hotels from the file and find the one with the right name } var htemp : HOTEL; begin Reset(hotels_f); while not EOF(hotels_f) do begin Read(hotels_f, htemp); if htemp.name = hname then begin get_hotel_by_name := htemp; Break; end; end; end; function get_total_length : integer; { Calculates the total lenght between two hotels } var htemp: HOTEL; begin Reset(hotels_f); get_total_length := 0; while not EOF(hotels_f) do begin Read(hotels_f, htemp); get_total_length := get_total_length + htemp.conn.distance; end; end; function get_path_length (hotel1, hotel2 : String) : Integer; var htemp: HOTEL; next_name: String; i : integer; begin htemp := get_hotel_by_name(hotel1); next_name := htemp.conn.hotel; get_path_length := 0; get_path_length := get_path_length + htemp.conn.distance; i := 0; Writeln(next_name, ' ',hotel2); while not (next_name = hotel2) do begin i += 1; htemp := get_hotel_by_name(next_name); next_name := htemp.conn.hotel; get_path_length := get_path_length + htemp.conn.distance; if i > 1000 then begin get_path_length := -1; Break; end; end; end; procedure calcway; { Calculate the sum of all distances and call functions that use this value. } var i, distance_total : integer; h1, h2: HOTEL; rin : String; begin distance_total := get_total_length; Writeln('Total tour length: ', distance_total, ' km'); Write('First Hotel Name: '); ReadLn(rin); h1 := get_hotel_by_name(rin); Writeln; Write('Second Hotel Number: '); ReadLn(rin); h2 := get_hotel_by_name(rin); Writeln(get_path_length(h1.name, h2.name)); end; procedure hotelmain; { Calculates the total distance between hotels based on the hotel number input. (Only numbers accepted!). After printing the total distance a velocity can be input to calculate the estimated time. } var i : integer; exit : boolean = false; begin while exit = false do begin calcway; Write('Exit? (y/n)'); ReadLn(readinput); if readinput = 'y' then exit := true else exit := false; end; end; procedure login; var i : integer; begin Write('User: '); ReadLn(readinput); usersuccess := false; correct := false; { Iterate over all 5 user entries to find the one that fits the input. set usersuccess to true if found else it remains false and an user not found error is printed to the console. } for i := 0 to 4 do if readinput = users[i].un then begin usersuccess := true; if (users[i].l) then begin TextColor(Red); Writeln('This user is locked.'); TextColor(White); Break; end; { 3 tries for password input. Return to the username input after failure. correct is set to true if the loggin was a success. } for j := 0 to 2 do begin WriteLn('Password: '); ReadLn(readinput); if MD5Print(MD5String(readinput)) = users[i].pw then begin WriteLn('Login Successful!'); correct := true; Break; end else WriteLn('Wrong password! ', 2 - j, ' trys left.'); end; { @section userfunctions } if correct = true then hotelmain() else users[i].l := true; end; if usersuccess = false then WriteLn('User not found'); end; begin TextColor(8); Writeln('Tourplanner'); Writeln('Written by J.Riegel.'); TextColor(White); Assign(hotels_f, 'hotels.bin'); { endless loop/main loop of the program. Exit with CTRL-C } while true do login; { Login starts all the other functions } end.