/**************************************************************** if the client is capable of 'wanting hack', then the server will send the client a filename in the packet_join_game_reply packet. this function creates the file with a suitably random string in it and then sends the string to the server. If the server can open and read the string, then the client is given hack access. *****************************************************************/ void send_client_wants_hack(const char *filename) { if (filename[0] != '\0') { struct packet_single_want_hack_req req; struct section_file file; if (!is_filename_safe(filename)) { return; } /* get the full filename path */ interpret_tilde(challenge_fullname, sizeof(challenge_fullname), "~/.freeciv/"); make_dir(challenge_fullname); sz_strlcat(challenge_fullname, filename); /* generate an authentication token */ randomize_string(req.token, sizeof(req.token)); section_file_init(&file); secfile_insert_str(&file, req.token, "challenge.token"); if (!section_file_save(&file, challenge_fullname, 0, FZ_PLAIN)) { freelog(LOG_ERROR, "Couldn't write token to temporary file: %s", challenge_fullname); } section_file_free(&file); /* tell the server what we put into the file */ send_packet_single_want_hack_req(&client.conn, &req); } }
/************************************************************************** Call this at end of program only. **************************************************************************/ void audio_shutdown() { /* avoid infinite loop at end of game */ audio_stop(); audio_play_sound("e_game_quit", NULL); plugins[selected_plugin].wait(); plugins[selected_plugin].shutdown(); if (tagfile) { section_file_free(tagfile); tagfile = NULL; } }
/************************************************************************** Load auth configuration from file. We use filename just like user gave it to us. No searching from datadirs, if file with same name exist there! **************************************************************************/ static bool load_auth_config(const char *filename) { struct section_file file; assert(filename != NULL); if (!section_file_load_nodup(&file, filename)) { freelog(LOG_ERROR, _("Cannot load auth config file \"%s\"!"), filename); return FALSE; } load_auth_option(&file, &auth_config.host); load_auth_option(&file, &auth_config.port); load_auth_option(&file, &auth_config.user); load_auth_option(&file, &auth_config.password); load_auth_option(&file, &auth_config.database); load_auth_option(&file, &auth_config.table); load_auth_option(&file, &auth_config.login_table); section_file_check_unused(&file, filename); section_file_free(&file); return TRUE; }
/************************************************************************** The server sends a stream in a registry 'ini' type format. Read it using secfile functions and fill the server_list structs. **************************************************************************/ static struct server_list *parse_metaserver_data(fz_FILE *f) { struct server_list *server_list; struct section_file the_file, *file = &the_file; int nservers, i, j; /* This call closes f. */ if (!section_file_load_from_stream(file, f)) { return NULL; } server_list = server_list_new(); nservers = secfile_lookup_int_default(file, 0, "main.nservers"); for (i = 0; i < nservers; i++) { char *host, *port, *version, *state, *message, *nplayers; int n; struct server *pserver = (struct server*)fc_malloc(sizeof(struct server)); host = secfile_lookup_str_default(file, "", "server%d.host", i); pserver->host = mystrdup(host); port = secfile_lookup_str_default(file, "", "server%d.port", i); pserver->port = atoi(port); version = secfile_lookup_str_default(file, "", "server%d.version", i); pserver->version = mystrdup(version); state = secfile_lookup_str_default(file, "", "server%d.state", i); pserver->state = mystrdup(state); message = secfile_lookup_str_default(file, "", "server%d.message", i); pserver->message = mystrdup(message); nplayers = secfile_lookup_str_default(file, "0", "server%d.nplayers", i); n = atoi(nplayers); pserver->nplayers = n; if (n > 0) { pserver->players = fc_malloc(n * sizeof(*pserver->players)); } else { pserver->players = NULL; } for (j = 0; j < n; j++) { char *name, *nation, *type, *host; name = secfile_lookup_str_default(file, "", "server%d.player%d.name", i, j); pserver->players[j].name = mystrdup(name); type = secfile_lookup_str_default(file, "", "server%d.player%d.type", i, j); pserver->players[j].type = mystrdup(type); host = secfile_lookup_str_default(file, "", "server%d.player%d.host", i, j); pserver->players[j].host = mystrdup(host); nation = secfile_lookup_str_default(file, "", "server%d.player%d.nation", i, j); pserver->players[j].nation = mystrdup(nation); } server_list_append(server_list, pserver); } section_file_free(file); return server_list; }