2003-07-01 20:37:09 +00:00
|
|
|
// The contents of this file are subject to the BOINC Public License
|
2002-09-27 23:43:29 +00:00
|
|
|
// Version 1.0 (the "License"); you may not use this file except in
|
|
|
|
// compliance with the License. You may obtain a copy of the License at
|
2003-07-01 20:37:09 +00:00
|
|
|
// http://boinc.berkeley.edu/license_1.0.txt
|
2003-08-21 00:07:03 +00:00
|
|
|
//
|
2002-09-27 23:43:29 +00:00
|
|
|
// Software distributed under the License is distributed on an "AS IS"
|
|
|
|
// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
|
|
|
// License for the specific language governing rights and limitations
|
2003-08-21 00:07:03 +00:00
|
|
|
// under the License.
|
|
|
|
//
|
|
|
|
// The Original Code is the Berkeley Open Infrastructure for Network Computing.
|
|
|
|
//
|
2002-09-27 23:43:29 +00:00
|
|
|
// The Initial Developer of the Original Code is the SETI@home project.
|
2003-07-01 20:37:09 +00:00
|
|
|
// Portions created by the SETI@home project are Copyright (C) 2002
|
2003-08-21 00:07:03 +00:00
|
|
|
// University of California at Berkeley. All Rights Reserved.
|
|
|
|
//
|
2002-09-27 23:43:29 +00:00
|
|
|
// Contributor(s):
|
|
|
|
//
|
|
|
|
|
2004-03-04 11:41:43 +00:00
|
|
|
#ifdef _WIN32
|
2004-06-16 23:16:08 +00:00
|
|
|
#include "boinc_win.h"
|
2004-03-04 11:41:43 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _WIN32
|
2004-07-13 13:54:09 +00:00
|
|
|
#include <cstdio>
|
2003-06-24 00:17:36 +00:00
|
|
|
#include <cassert>
|
2004-03-04 11:41:43 +00:00
|
|
|
#endif
|
2002-09-27 23:43:29 +00:00
|
|
|
|
2004-04-08 08:15:23 +00:00
|
|
|
#include "filesys.h"
|
|
|
|
#include "util.h"
|
2002-09-27 23:43:29 +00:00
|
|
|
#include "client_state.h"
|
2004-04-08 08:15:23 +00:00
|
|
|
#include "client_msgs.h"
|
2002-09-27 23:43:29 +00:00
|
|
|
#include "error_numbers.h"
|
|
|
|
#include "file_names.h"
|
|
|
|
|
2004-06-30 18:17:21 +00:00
|
|
|
using std::string;
|
|
|
|
|
2004-07-11 21:54:00 +00:00
|
|
|
#if 0
|
|
|
|
static string filename_to_project_dirname(const string& filename) {
|
2003-06-24 00:17:36 +00:00
|
|
|
assert(starts_with(filename, "account_"));
|
|
|
|
assert(ends_with(filename, ".xml"));
|
|
|
|
return string(PROJECTS_DIR) + PATH_SEPARATOR + filename.substr(8,filename.size()-12);
|
|
|
|
}
|
|
|
|
|
|
|
|
// we want to canonicalize filenames to NOT have a trailing _ . However, old
|
|
|
|
// clients <=1.03 did not ensure this so we have to rename them when someone
|
|
|
|
// upgrades.
|
|
|
|
// returns true if an error occurred.
|
2003-07-01 20:37:09 +00:00
|
|
|
//
|
|
|
|
static bool maybe_rename_old_filename_format(string& filename) {
|
2003-06-24 00:17:36 +00:00
|
|
|
if (ends_with(filename, "_.xml")) {
|
|
|
|
string newfilename = filename.substr(0, filename.length()-5) + ".xml";
|
|
|
|
msg_printf(NULL, MSG_INFO, "Renaming %s to %s", filename.c_str(), newfilename.c_str());
|
|
|
|
if (rename(filename.c_str(), newfilename.c_str())) {
|
|
|
|
msg_printf(NULL, MSG_ERROR, "Couldn't rename %s to %s", filename.c_str(), newfilename.c_str());
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
// also rename the project directory.
|
|
|
|
string newproject_dir = filename_to_project_dirname(newfilename);
|
|
|
|
string oldproject_dir = newproject_dir + '_';
|
|
|
|
msg_printf(NULL, MSG_INFO, "Renaming %s to %s", oldproject_dir.c_str(), newproject_dir.c_str());
|
|
|
|
if (rename(oldproject_dir.c_str(), newproject_dir.c_str())) {
|
|
|
|
msg_printf(NULL, MSG_ERROR, "Couldn't rename %s to %s", oldproject_dir.c_str(), newproject_dir.c_str());
|
|
|
|
}
|
|
|
|
filename = newfilename;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
2004-07-11 21:54:00 +00:00
|
|
|
#endif
|
2003-06-24 00:17:36 +00:00
|
|
|
|
2002-09-27 23:43:29 +00:00
|
|
|
int CLIENT_STATE::parse_account_files() {
|
2003-06-24 00:17:36 +00:00
|
|
|
string name;
|
2002-09-27 23:43:29 +00:00
|
|
|
PROJECT* project;
|
|
|
|
FILE* f;
|
|
|
|
|
2003-06-24 00:17:36 +00:00
|
|
|
DirScanner dir(".");
|
|
|
|
while (dir.scan(name)) {
|
|
|
|
if (is_account_file((char*)name.c_str())) {
|
2004-07-11 21:54:00 +00:00
|
|
|
#if 0
|
2003-06-24 00:17:36 +00:00
|
|
|
if (maybe_rename_old_filename_format(name)) {
|
|
|
|
msg_printf(NULL, MSG_ERROR, "Warning: not adding project %s", name.c_str());
|
|
|
|
continue; // Error occurred renaming
|
|
|
|
}
|
2004-07-11 21:54:00 +00:00
|
|
|
#endif
|
2003-06-24 00:17:36 +00:00
|
|
|
f = fopen(name.c_str(), "r");
|
2002-09-27 23:43:29 +00:00
|
|
|
if (!f) continue;
|
|
|
|
project = new PROJECT;
|
|
|
|
project->parse_account(f);
|
|
|
|
projects.push_back(project);
|
|
|
|
fclose(f);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2004-07-11 21:54:00 +00:00
|
|
|
int CLIENT_STATE::add_project(const char* master_url, const char* _auth) {
|
|
|
|
char path[256], canonical_master_url[256], auth[256];
|
2002-12-06 19:44:31 +00:00
|
|
|
PROJECT* project;
|
|
|
|
FILE* f;
|
2003-02-06 19:01:49 +00:00
|
|
|
int retval;
|
2002-12-06 19:44:31 +00:00
|
|
|
|
2004-02-28 19:11:40 +00:00
|
|
|
safe_strcpy(canonical_master_url, master_url);
|
2004-07-11 21:54:00 +00:00
|
|
|
strip_whitespace(canonical_master_url);
|
2004-02-28 19:11:40 +00:00
|
|
|
canonicalize_master_url(canonical_master_url);
|
2004-07-11 21:54:00 +00:00
|
|
|
if (invalid_url(canonical_master_url)) {
|
|
|
|
msg_printf(0, MSG_ERROR, "Invalid project URL: %s", canonical_master_url);
|
|
|
|
return ERR_INVALID_URL;
|
|
|
|
}
|
|
|
|
|
|
|
|
safe_strcpy(auth, _auth);
|
|
|
|
strip_whitespace(auth);
|
|
|
|
if (!strlen(auth)) {
|
|
|
|
msg_printf(0, MSG_ERROR, "Invalid account ID: %s", auth);
|
|
|
|
return ERR_AUTHENTICATOR;
|
|
|
|
}
|
2003-06-06 17:43:45 +00:00
|
|
|
|
2003-02-06 19:01:49 +00:00
|
|
|
// check if this project is already running
|
2003-02-13 22:49:26 +00:00
|
|
|
//
|
2004-02-28 19:11:40 +00:00
|
|
|
if (lookup_project(canonical_master_url)) {
|
|
|
|
msg_printf(0, MSG_ERROR, "Already attached to %s", canonical_master_url);
|
2003-05-21 17:59:10 +00:00
|
|
|
return ERR_ALREADY_ATTACHED;
|
|
|
|
}
|
2002-12-06 19:44:31 +00:00
|
|
|
|
2003-02-06 19:01:49 +00:00
|
|
|
// create project state
|
2003-02-13 22:49:26 +00:00
|
|
|
//
|
2003-05-13 18:55:07 +00:00
|
|
|
project = new PROJECT;
|
2004-02-28 19:11:40 +00:00
|
|
|
strcpy(project->master_url, canonical_master_url);
|
2004-07-11 21:54:00 +00:00
|
|
|
strcpy(project->authenticator, auth);
|
2003-05-15 17:10:26 +00:00
|
|
|
|
2003-05-13 18:55:07 +00:00
|
|
|
project->tentative = true;
|
|
|
|
retval = project->write_account_file();
|
2003-03-08 23:48:05 +00:00
|
|
|
if (retval) return retval;
|
2003-05-13 18:55:07 +00:00
|
|
|
|
2004-02-28 19:11:40 +00:00
|
|
|
get_account_filename(canonical_master_url, path);
|
2002-12-06 19:44:31 +00:00
|
|
|
f = fopen(path, "r");
|
|
|
|
if (!f) return ERR_FOPEN;
|
|
|
|
retval = project->parse_account(f);
|
|
|
|
fclose(f);
|
2003-05-13 18:55:07 +00:00
|
|
|
if (retval) return retval;
|
2002-12-06 19:44:31 +00:00
|
|
|
|
2003-02-06 19:01:49 +00:00
|
|
|
// remove any old files
|
2003-02-13 22:49:26 +00:00
|
|
|
//
|
2003-02-06 19:01:49 +00:00
|
|
|
retval = remove_project_dir(*project);
|
2002-12-06 19:44:31 +00:00
|
|
|
|
2003-02-06 19:01:49 +00:00
|
|
|
retval = make_project_dir(*project);
|
2003-02-13 22:49:26 +00:00
|
|
|
if (retval) return retval;
|
2002-12-06 19:44:31 +00:00
|
|
|
projects.push_back(project);
|
2003-02-06 19:01:49 +00:00
|
|
|
return 0;
|
2002-12-06 19:44:31 +00:00
|
|
|
}
|
2003-11-02 22:51:49 +00:00
|
|
|
|
|
|
|
int CLIENT_STATE::parse_preferences_for_user_files() {
|
|
|
|
unsigned int i;
|
|
|
|
|
|
|
|
for (i=0; i<projects.size(); i++) {
|
|
|
|
projects[i]->parse_preferences_for_user_files();
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|