001 /* 002 $Id: ShareManager.java,v 1.17 2003/05/02 20:29:48 culdesac Exp $ 003 */ 004 005 package sharpster.daemon.sharemanagement; 006 007 import sharpster.common.*; 008 import sharpster.daemon.usermanagement.UserManager; 009 import sharpster.daemon.filemanagement.FileManager; 010 import sharpster.daemon.groupmanagement.GroupController; 011 import java.util.Hashtable; 012 import net.jxta.id.*; 013 import net.jxta.document.*; 014 import java.io.File; 015 import java.io.FileInputStream; 016 import java.io.FileOutputStream; 017 import java.io.StringWriter; 018 import java.util.*; 019 020 /** 021 * Class responsible for the overall management of file shares. 022 */ 023 public class ShareManager { 024 025 private FileManager fileManager; 026 private UserManager userManager; 027 private GroupController groupController; 028 private ShareMap shareMap; 029 private String configFile; 030 031 032 /** 033 * 034 */ 035 public void initialize(FileManager fm, UserManager um, GroupController gc) { 036 fileManager = fm; 037 userManager = um; 038 shareMap = new ShareMap(); 039 configFile = new String(); 040 groupController = gc; 041 } 042 043 /** 044 * Store the specified file share. If recursive is true, the share 045 * operates recursively. 046 */ 047 public ResponseCollection shareFiles(FileCollection files, 048 boolean recursive) { 049 050 ResponseCollection responses = userManager.checkUsersExistance(files); 051 if (responses.hasError()) { 052 return responses; 053 } 054 055 ResponseCollection missingFiles = fileManager.checkFilesExistance(files); 056 if (missingFiles.hasError()) { 057 return missingFiles; 058 } 059 060 SharedFilesResponse sharedResponse = new SharedFilesResponse(); 061 062 for (int i = 0; i < files.getFileCount(); i++) { 063 SharedFile file = files.getFile(i); 064 065 String users[] = file.getSharedToUsers(); 066 for (int j = 0; j < users.length; j++) { 067 ID uid = userManager.getKey(users[j]); 068 ID fid = fileManager.getFileID(file.getPathInCVS() + "/" + 069 file.getFileName()); 070 071 boolean added = shareMap.add(uid, fid, 072 file.getAccessRights(), 073 file.getPluginData()); 074 } 075 } 076 077 sharedResponse.setOrigin("ShareManager"); 078 sharedResponse.setError(false); 079 sharedResponse.setUser(sharpster.daemon.SharpsterDaemon.getPeerName()); 080 sharedResponse.setFiles(files); 081 sharedResponse.setAction(1); 082 083 responses.addResponse(sharedResponse); 084 085 saveToFile(null); 086 087 return responses; 088 } 089 090 /** 091 * 092 */ 093 public ResponseCollection unshareFiles(FileCollection files, 094 boolean recursive) { 095 ResponseCollection responses = userManager.checkUsersExistance(files); 096 if (responses.hasError()) { 097 return responses; 098 } 099 100 ResponseCollection missingFiles = fileManager.checkFilesExistance(files); 101 if (missingFiles.hasError()) { 102 return missingFiles; 103 } 104 105 SharedFilesResponse sharedResponse = new SharedFilesResponse(); 106 107 for (int i = 0; i < files.getFileCount(); i++) { 108 SharedFile file = files.getFile(i); 109 String users[] = file.getSharedToUsers(); 110 for (int j = 0; j < users.length; j++) { 111 ID uid = userManager.getKey(users[j]); 112 ID fid = fileManager.getFileID(file.getFullPath()); 113 114 boolean removed = shareMap.remove(uid, fid); 115 } 116 } 117 118 sharedResponse.setOrigin("ShareManager"); 119 sharedResponse.setError(false); 120 sharedResponse.setUser(sharpster.daemon.SharpsterDaemon.getPeerName()); 121 sharedResponse.setFiles(files); 122 sharedResponse.setAction(2); 123 124 responses.addResponse(sharedResponse); 125 126 saveToFile(null); 127 128 return responses; 129 } 130 131 /** 132 * 133 */ 134 public void removeSharesWithFile(ID fileID) { 135 shareMap.removeAllFiles(fileID); 136 } 137 138 public void synchronizeShares() { 139 shareMap.synchronizeShares(fileManager); 140 } 141 142 143 public ResponseCollection getSharedFiles(String user) { 144 LinkedList list = groupController.getGroups(user); 145 System.out.println(list); 146 ResponseCollection responses = new ResponseCollection(); 147 148 for (int i=0; i < list.size(); i++) { 149 responses.addResponse(getSharedFilesLoop((String)list.get(i))); 150 151 } 152 return responses; 153 } 154 155 156 157 /** 158 * 159 */ 160 private SharedFilesResponse getSharedFilesLoop(String user) { 161 FileCollection sharedFiles = new FileCollection(); 162 // ResponseCollection responses = new ResponseCollection(); 163 SharedFilesResponse sharedFilesResponse = new SharedFilesResponse(); 164 165 ID uid = userManager.getKey(user); 166 ID[] files = shareMap.getAllShares(uid); 167 168 System.out.println("SM::Looking for shares to "+user); 169 System.out.println(uid.toString()); 170 System.out.println(files.length); 171 172 if (files != null && uid != null) { 173 for (int j = 0; j < files.length; j++) { 174 String filepath = fileManager.getFilePath(files[j]); 175 SharedFile file = new SharedFile(); 176 file.setFileName(filepath); 177 sharedFiles.addFile(file); 178 } 179 } 180 181 sharedFilesResponse.setFiles(sharedFiles); 182 sharedFilesResponse.setOrigin("ShareManager"); 183 sharedFilesResponse.setUser(sharpster.daemon.SharpsterDaemon.getPeerName()); 184 sharedFilesResponse.setError(false); 185 sharedFilesResponse.addSharedToUsers(user); 186 187 188 189 return sharedFilesResponse; 190 } 191 192 /** 193 * 194 */ 195 public ResponseCollection viewFileSharing() { 196 ResponseCollection responses = new ResponseCollection(); 197 198 String[] users = userManager.getAllUsers(); 199 for (int i = 0; i < users.length; i++) { 200 SharedFilesResponse sharedFilesResponse = new SharedFilesResponse(); 201 FileCollection sharedFiles = new FileCollection(); 202 ID[] files = shareMap.getAllShares(userManager.getKey(users[i])); 203 if (files != null) { 204 for (int j = 0; j < files.length; j++) { 205 String filepath = fileManager.getFilePath(files[j]); 206 SharedFile file = new SharedFile(); 207 file.setFileName(filepath); 208 ID userid = userManager.getKey(users[i]); 209 file.setPluginData(shareMap.getSharePluginData(userid, files[j])); 210 file.setAccessRights(shareMap.getShareAccess(userid, files[j])); 211 sharedFiles.addFile(file); 212 } 213 } 214 sharedFilesResponse.setFiles(sharedFiles); 215 sharedFilesResponse.setOrigin("ShareManager"); 216 sharedFilesResponse.setUser(sharpster.daemon.SharpsterDaemon.getPeerName()); 217 sharedFilesResponse.setError(false); 218 sharedFilesResponse.addSharedToUsers(new String(users[i])); 219 responses.addResponse(sharedFilesResponse); 220 } 221 222 return responses; 223 } 224 225 private boolean checkAccess(SharedFile file, String user, int access) { 226 LinkedList list = groupController.getGroups(user); 227 228 for (int i=0; i < list.size(); i++) { 229 if(checkAccessInLoop(file, (String)list.get(i), access)) { 230 return true; 231 } 232 } 233 return false; 234 } 235 236 private boolean checkAccessInLoop(SharedFile file, String user, int access) { 237 ID userid = userManager.getKey(user); 238 if (userid == null) { 239 return false; 240 } 241 242 ID fileid = fileManager.getFileID(file.getFullPath()); 243 if (shareMap.shareExists(userid, fileid)) { 244 int a = shareMap.getShareAccess(userid, fileid); 245 if ( (a & access) == access) { 246 file.setPluginData(shareMap.getSharePluginData(userid, fileid)); 247 return true; 248 } 249 } 250 else { 251 String[] dirList = file.getPathInCVS().split("(/)"); 252 String path = new String(""); 253 for (int i = 0; i < dirList.length; i++) { 254 path += dirList[i]; 255 fileid = fileManager.getFileID(path); 256 if (fileid != null && shareMap.shareExists(userid, fileid)) { 257 int a = shareMap.getShareAccess(userid, fileid); 258 if ( (a & access) == access) { 259 file.setPluginData(shareMap.getSharePluginData(userid, fileid)); 260 return true; 261 } 262 } 263 path += "/"; 264 } 265 } 266 return false; 267 } 268 269 public ResponseCollection checkAccess(FileCollection files, String user, 270 int access) { 271 FileCollection failedFiles = new FileCollection(); 272 ResponseCollection responses = new ResponseCollection(); 273 274 for (int i = 0; i < files.getFileCount(); i++) { 275 SharedFile file = files.getFile(i); 276 if (!checkAccess(file, user, access)) { 277 failedFiles.addFile(file); 278 } 279 } 280 281 if (failedFiles.getFileCount() > 0) { 282 MissingAccessResponse resp = new MissingAccessResponse(); 283 resp.setOrigin("ShareManager"); 284 resp.setUser(sharpster.daemon.SharpsterDaemon.getPeerName()); 285 resp.setError(true); 286 resp.setFiles(failedFiles); 287 resp.setAccess(access); 288 responses.addResponse(resp); 289 } 290 291 return responses; 292 } 293 294 /** 295 * Check if a user has read access to the specified files. 296 */ 297 public boolean hasReadAccess(FileCollection files, String user) { 298 for (int i = 0; i < files.getFileCount(); i++) { 299 SharedFile file = files.getFile(i); 300 if (!file.hasReadAccess(user)) { 301 return false; 302 } 303 } 304 return true; 305 } 306 307 /** 308 * Check if a user has write access to the specified files. 309 */ 310 public boolean hasWriteAccess(FileCollection files, String user) { 311 for (int i = 0; i < files.getFileCount(); i++) { 312 SharedFile file = files.getFile(i); 313 if (!file.hasWriteAccess(user)) { 314 return false; 315 } 316 } 317 return true; 318 } 319 320 /** 321 * Check if a user has remove access to the specified files. 322 */ 323 public boolean hasDeleteAccess(FileCollection files, String user) { 324 for (int i = 0; i < files.getFileCount(); i++) { 325 SharedFile file = files.getFile(i); 326 if (!file.hasDeleteAccess(user)) { 327 return false; 328 } 329 } 330 return true; 331 } 332 333 public boolean loadFromFile(String filepath) { 334 if (filepath == null) { 335 filepath = configFile; 336 } 337 else { 338 configFile = new String(filepath); 339 } 340 341 return shareMap.loadFromFile(configFile); 342 } 343 344 public boolean saveToFile(String filepath) { 345 if (filepath == null) { 346 filepath = configFile; 347 } 348 else { 349 configFile = new String(filepath); 350 } 351 352 return shareMap.saveToFile(configFile); 353 } 354 } 355 356 357 358 359