1 19 package org.lucane.applications.sharedfolder; 20 21 import org.lucane.server.Service; 22 import org.lucane.server.Server; 23 import org.lucane.server.acl.AccessController; 24 import org.lucane.server.database.DatabaseAbstractionLayer; 25 import org.lucane.server.database.util.Sequence; 26 import org.lucane.common.net.ObjectConnection; 27 import org.lucane.common.Message; 28 import org.lucane.common.Logging; 29 import org.lucane.common.concepts.GroupConcept; 30 import org.lucane.common.concepts.UserConcept; 31 import org.lucane.common.acl.AclInfo; 32 import org.lucane.common.acl.AclProducer; 33 import org.lucane.applications.sharedfolder.model.FileInfo; 34 import org.lucane.applications.sharedfolder.model.FolderInfo; 35 import org.lucane.applications.sharedfolder.model.SharedItem; 36 37 import java.io.*; 38 import java.sql.*; 39 import java.util.ArrayList ; 40 import java.util.Iterator ; 41 import java.util.Date ; 42 import java.net.URLEncoder ; 43 import javax.servlet.http.HttpServletResponse ; 44 45 public class SharedFolderService extends Service 46 implements AclProducer 47 { 48 private static final String STORAGE_DIRECTORY = "SharedFolder"; 49 private static final int BUFFER_SIZE = 10240; 50 51 private DatabaseAbstractionLayer layer; 52 private File storage; 53 private AccessController acl; 54 private Sequence fileSequence; 55 private Sequence folderSequence; 56 57 public void init(Server parent) 58 { 59 this.storage = new File(parent.getWorkingDirectory()+STORAGE_DIRECTORY); 60 this.layer = parent.getDBLayer(); 61 this.acl = Server.getInstance().getAccessController(); 62 63 this.fileSequence = new Sequence("files", "id"); 64 this.folderSequence = new Sequence("folders", "id"); 65 this.storage.mkdirs(); 66 } 67 68 public void install() 69 { 70 try { 71 String dbDescription = getDirectory() + "db-sharedfolder.xml"; 72 layer.getTableCreator().createFromXml(dbDescription); 73 } catch (Exception e) { 74 Logging.getLogger().severe("Unable to install SharedFolderService !"); 75 e.printStackTrace(); 76 } 77 } 78 79 public void process(ObjectConnection oc, Message message) 80 { 81 SharedFolderAction sfa = (SharedFolderAction)message.getData(); 82 String user = message.getSender().getName(); 83 try { 84 FileInfo fileInfo; 85 FolderInfo folderInfo; 86 Integer folderId; 87 Integer fileId; 88 ArrayList items; 89 Object [] params; 90 91 switch (sfa.getAction()) 92 { 93 case SharedFolderAction.UPLOAD_FILE: 94 fileInfo = (FileInfo)sfa.getParam(); 95 doUploadFile(user, oc, fileInfo); 96 oc.write("OK"); 97 break; 98 case SharedFolderAction.CREATE_FOLDER: 99 folderInfo = (FolderInfo)sfa.getParam(); 100 doCreateFolder(user, folderInfo); 101 oc.write("OK"); 102 break; 103 case SharedFolderAction.GET_FOLDER: 104 folderId = (Integer )sfa.getParam(); 105 folderInfo = doGetFolder(user, folderId.intValue()); 106 oc.write("OK"); 107 oc.write(folderInfo); 108 break; 109 case SharedFolderAction.GET_FILE: 110 fileId = (Integer )sfa.getParam(); 111 fileInfo = doGetFile(user, fileId.intValue()); 112 oc.write("OK"); 113 oc.write(fileInfo); 114 break; 115 case SharedFolderAction.LIST_FOLDERS: 116 folderId = (Integer )sfa.getParam(); 117 items = doListFolders(user, folderId.intValue()); 118 oc.write("OK"); 119 oc.write(items); 120 break; 121 case SharedFolderAction.LIST_FILES: 122 folderId = (Integer )sfa.getParam(); 123 items = doListFiles(user, folderId.intValue()); 124 oc.write("OK"); 125 oc.write(items); 126 break; 127 case SharedFolderAction.LIST_FILE_VERSIONS: 128 fileId = (Integer )sfa.getParam(); 129 items = doListFileVersions(user, fileId.intValue()); 130 oc.write("OK"); 131 oc.write(items); 132 break; 133 case SharedFolderAction.DOWNLOAD_FILE: 134 params = (Object [])sfa.getParam(); 135 doDownloadFile(user, oc, ((Integer )params[0]).intValue(), ((Integer )params[0]).intValue()); 136 break; 137 case SharedFolderAction.UPDATE_FOLDER: 138 folderInfo = (FolderInfo)sfa.getParam(); 139 doUpdateFolder(user, folderInfo); 140 oc.write("OK"); 141 break; 142 case SharedFolderAction.UPDATE_FILE: 143 fileInfo = (FileInfo)sfa.getParam(); 144 doUpdateFile(user, fileInfo); 145 oc.write("OK"); 146 break; 147 case SharedFolderAction.REMOVE_FOLDER: 148 folderId = (Integer )sfa.getParam(); 149 doRemoveFolder(user, folderId.intValue()); 150 oc.write("OK"); 151 break; 152 case SharedFolderAction.REMOVE_FILE: 153 fileId = (Integer )sfa.getParam(); 154 doRemoveFile(user, fileId.intValue()); 155 oc.write("OK"); 156 break; 157 158 case SharedFolderAction.GET_ACLS: 159 AclInfo[] acl = getAcls((String )sfa.getParam()); 160 oc.write("OK"); 161 oc.write(acl); 162 break; 163 case SharedFolderAction.GET_GROUPS: 164 ArrayList groups = getAllGroups(); 165 oc.write("OK"); 166 oc.write(groups); 167 break; 168 case SharedFolderAction.GET_USERS: 169 ArrayList users = getAllUsers(); 170 oc.write("OK"); 171 oc.write(users); 172 break; 173 case SharedFolderAction.ADD_ACL: 174 params = (Object [])sfa.getParam(); 175 addAcl((String )params[0], (AclInfo)params[1]); 176 oc.write("OK"); 177 break; 178 case SharedFolderAction.REMOVE_ACL: 179 params = (Object [])sfa.getParam(); 180 removeAcl((String )params[0], (AclInfo)params[1]); 181 oc.write("OK"); 182 break; 183 } 184 } catch(Exception e) { 185 try { 186 e.printStackTrace(); 187 oc.write("FAILED " + e.getMessage()); 188 } catch(IOException ioe) { 189 Logging.getLogger().warning("Error : " + ioe); 190 } 191 } 192 193 oc.close(); 194 } 195 196 198 public void doUploadFile(String user, ObjectConnection oc, FileInfo fileInfo) 199 throws Exception 200 { 201 OutputStream out = insertOrUpdateFileInfo(user, fileInfo); 202 203 long length = fileInfo.getSize(); 204 long bytes = 0; 205 while(bytes < length) 206 { 207 try { 208 byte[] buffer = (byte[])oc.read(); 209 out.write(buffer); 210 bytes += buffer.length; 211 } catch(ClassNotFoundException cnfe) { 212 cnfe.printStackTrace(); 214 } 215 } 216 out.close(); 217 } 218 219 public void doUploadFile(String user, InputStream in, FileInfo fileInfo) 220 throws Exception 221 { 222 OutputStream out = insertOrUpdateFileInfo(user, fileInfo); 223 224 long length = fileInfo.getSize(); 225 long totalBytes = 0; 226 while(totalBytes < length) 227 { 228 byte[] buffer = new byte[BUFFER_SIZE]; 229 int bytes = in.read(buffer); 230 if(bytes != buffer.length); 231 { 232 byte[] temp = new byte[bytes]; 233 System.arraycopy(buffer, 0, temp, 0, bytes); 234 buffer = temp; 235 } 236 out.write(buffer); 237 totalBytes += bytes; 238 } 239 out.close(); 240 } 241 242 private OutputStream insertOrUpdateFileInfo(String user, FileInfo fileInfo) 243 throws Exception 244 { 245 int id = fileInfo.getId(); 246 if(id == FileInfo.NEW_ID) 247 id = insertFileInfo(user, fileInfo); 248 else 249 { 250 FileInfo old = doGetFile(user, id); 252 if(old.getVersion() != fileInfo.getVersion()) 253 insertFileInfo(user, fileInfo); 254 else 255 doUpdateFile(user, fileInfo); 256 } 257 258 259 File destination = new File(storage, getStorageId(id, fileInfo.getVersion())); 260 return new DataOutputStream(new FileOutputStream(destination)); 261 } 262 263 264 public int doCreateFolder(String user, FolderInfo folderInfo) 265 throws Exception 266 { 267 FolderInfo parent = doGetFolder(user, folderInfo.getParentId()); 268 if(!parent.isWritable()) 269 throw new IllegalAccessException ("User "+ user + " doesn't have write access to folder '" + parent.getName() + "'"); 270 271 int id = folderSequence.getNextId(); 272 273 Connection c = layer.getConnection(); 274 PreparedStatement insert = c.prepareStatement( 275 "INSERT INTO folders VALUES(?, ?, ?, ?, ?, null)"); 276 insert.setInt(1, id); 277 insert.setInt(2, folderInfo.getParentId()); 278 insert.setString(3, folderInfo.getName()); 279 insert.setString(4, folderInfo.getOwner()); 280 insert.setLong(5, new Date ().getTime()); 281 282 insert.execute(); 283 insert.close(); 284 c.close(); 285 286 return id; 287 } 288 289 public FolderInfo doGetFolder(String user, int folderId) 290 throws Exception 291 { 292 if(folderId == FolderInfo.ROOT_ID) 293 return new FolderInfo(FolderInfo.ROOT_ID, FolderInfo.ROOT_ID, "/", "", null, null, true, true); 294 295 FolderInfo info = null; 296 297 Connection c = layer.getConnection(); 298 PreparedStatement select = c.prepareStatement( 299 "SELECT * FROM folders WHERE id=?"); 300 select.setInt(1, folderId); 301 ResultSet rs = select.executeQuery(); 302 if(rs.next()) 303 { 304 int id = rs.getInt(1); 305 int parentId = rs.getInt(2); 306 String folderName = rs.getString(3); 307 String creator = rs.getString(4); 308 Date created = (rs.getLong(5) > 0 ? new Date (rs.getLong(5)) : null); 309 Date modified = (rs.getLong(6) > 0 ? new Date (rs.getLong(6)) : null); 310 boolean readable = user.equals(creator) || acl.hasAccess(getName(), getAclId(folderId, true), SharedItem.READ, user); 311 boolean writable = user.equals(creator) || acl.hasAccess(getName(), getAclId(folderId, true), SharedItem.WRITE, user); 312 info = new FolderInfo(id, parentId, folderName, creator, created, modified, readable, writable); 313 } 314 rs.close(); 315 select.close(); 316 c.close(); 317 318 if(info == null) 319 throw new RuntimeException ("no such folder: " + folderId); 320 321 return info; 322 } 323 324 public ArrayList doListFolders(String user, int folderId) 325 throws Exception 326 { 327 FolderInfo folder = doGetFolder(user, folderId); 328 if(!folder.isReadable()) 329 throw new IllegalAccessException ("User "+ user + " doesn't have read access to folder '" + folder.getName() + "'"); 330 331 return reallyListFolders(user, folderId); 332 } 333 334 private ArrayList reallyListFolders(String user, int folderId) 335 throws Exception 336 { 337 ArrayList items = new ArrayList (); 338 339 Connection c = layer.getConnection(); 340 PreparedStatement select = c.prepareStatement( 341 "SELECT * FROM folders WHERE parentId=?"); 342 select.setInt(1, folderId); 343 ResultSet rs = select.executeQuery(); 344 while(rs.next()) 345 { 346 int id = rs.getInt(1); 347 int parentId = rs.getInt(2); 348 String folderName = rs.getString(3); 349 String creator = rs.getString(4); 350 Date created = (rs.getLong(5) > 0 ? new Date (rs.getLong(5)) : null); 351 Date modified = (rs.getLong(6) > 0 ? new Date (rs.getLong(6)) : null); 352 boolean readable = user.equals(creator) || acl.hasAccess(getName(), getAclId(id, true), SharedItem.READ, user); 353 boolean writable = user.equals(creator) || acl.hasAccess(getName(), getAclId(id, true), SharedItem.WRITE, user); 354 items.add(new FolderInfo(id, parentId, folderName, creator, created, modified, readable, writable)); 355 } 356 rs.close(); 357 select.close(); 358 c.close(); 359 360 return items; 361 } 362 363 public ArrayList doListFiles(String user, int folderId) 364 throws Exception 365 { 366 FolderInfo folder = doGetFolder(user, folderId); 367 if(!folder.isReadable()) 368 throw new IllegalAccessException ("User "+ user + " doesn't have read access to folder '" + folder.getName() + "'"); 369 370 return reallyListFiles(user, folderId); 371 } 372 373 private ArrayList reallyListFiles(String user, int folderId) 374 throws Exception 375 { 376 ArrayList items = new ArrayList (); 377 378 Connection c = layer.getConnection(); 379 PreparedStatement select = c.prepareStatement( 380 "SELECT * FROM files WHERE folderId=? order by id, version"); 381 select.setInt(1, folderId); 382 ResultSet rs = select.executeQuery(); 383 384 FileInfo lastFile = null; 385 boolean readable = false; 386 boolean writable = false; 387 while(rs.next()) 388 { 389 int id = rs.getInt(1); 390 if(lastFile != null && lastFile.getId() != id) 391 items.add(lastFile); 392 393 int version = rs.getInt(2); 394 int parentId = rs.getInt(3); 395 String folderName = rs.getString(4); 396 String creator = rs.getString(5); 397 Date created = (rs.getLong(6) > 0 ? new Date (rs.getLong(6)) : null); 398 Date modified = (rs.getLong(7) > 0 ? new Date (rs.getLong(7)) : null); 399 long size = rs.getLong(8); 400 401 if(lastFile == null || lastFile.getId() != id) 402 { 403 readable = user.equals(creator) || acl.hasAccess(getName(), getAclId(id, false), SharedItem.READ, user); 404 writable = user.equals(creator) || acl.hasAccess(getName(), getAclId(id, false), SharedItem.WRITE, user); 405 } 406 lastFile = new FileInfo(id, version, parentId, folderName, creator, created, modified, size, readable, writable); 407 } 408 rs.close(); 409 select.close(); 410 c.close(); 411 412 if(lastFile != null) 413 items.add(lastFile); 414 415 416 return items; 417 } 418 419 public ArrayList doListFileVersions(String user, int fileId) 420 throws Exception 421 { 422 FileInfo fileInfo = doGetFile(user, fileId); 423 if(!fileInfo.isReadable()) 424 throw new IllegalAccessException ("User "+ user + " doesn't have read access to file '" + fileInfo.getName() + "'"); 425 426 427 ArrayList versions = new ArrayList (); 428 429 Connection c = layer.getConnection(); 430 PreparedStatement select = c.prepareStatement( 431 "SELECT * FROM files WHERE id=? ORDER BY version"); 432 select.setInt(1, fileId); 433 ResultSet rs = select.executeQuery(); 434 435 boolean readable = false; 436 boolean writable = false; 437 while(rs.next()) 438 { 439 int id = rs.getInt(1); 440 int version = rs.getInt(2); 441 int parentId = rs.getInt(3); 442 String folderName = rs.getString(4); 443 String creator = rs.getString(5); 444 Date created = (rs.getLong(6) > 0 ? new Date (rs.getLong(6)) : null); 445 Date modified = (rs.getLong(7) > 0 ? new Date (rs.getLong(7)) : null); 446 long size = rs.getLong(8); 447 if(versions.size() == 0) 448 { 449 readable = user.equals(creator) || acl.hasAccess(getName(), getAclId(id, false), SharedItem.READ, user); 450 writable = user.equals(creator) || acl.hasAccess(getName(), getAclId(id, false), SharedItem.WRITE, user); 451 } 452 versions.add(new FileInfo(id, version, parentId, folderName, creator, created, modified, size, readable, writable)); 453 } 454 rs.close(); 455 select.close(); 456 c.close(); 457 458 return versions; 459 } 460 461 462 public FileInfo doGetFile(String user, int fileId) 463 throws Exception 464 { 465 Connection c = layer.getConnection(); 466 PreparedStatement select = c.prepareStatement( 467 "SELECT * FROM files WHERE id=? ORDER BY version desc"); 468 select.setInt(1, fileId); 469 ResultSet rs = select.executeQuery(); 470 471 FileInfo lastFile = null; 472 if(rs.next()) 473 { 474 int id = rs.getInt(1); 475 int version = rs.getInt(2); 476 int parentId = rs.getInt(3); 477 String folderName = rs.getString(4); 478 String creator = rs.getString(5); 479 Date created = (rs.getLong(6) > 0 ? new Date (rs.getLong(6)) : null); 480 Date modified = (rs.getLong(7) > 0 ? new Date (rs.getLong(7)) : null); 481 long size = rs.getLong(8); 482 boolean readable = user.equals(creator) || acl.hasAccess(getName(), getAclId(id, false), SharedItem.READ, user); 483 boolean writable = user.equals(creator) || acl.hasAccess(getName(), getAclId(id, false), SharedItem.WRITE, user); 484 lastFile = new FileInfo(id, version, parentId, folderName, creator, created, modified, size, readable, writable); 485 } 486 rs.close(); 487 select.close(); 488 c.close(); 489 490 if(lastFile == null) 491 throw new RuntimeException ("no such file: " + fileId); 492 493 return lastFile; 494 } 495 496 public FileInfo doGetFile(String user, int fileId, int fileVersion) 497 throws Exception 498 { 499 Connection c = layer.getConnection(); 500 PreparedStatement select = c.prepareStatement( 501 "SELECT * FROM files WHERE id=? AND version=?"); 502 select.setInt(1, fileId); 503 select.setInt(2, fileVersion); 504 ResultSet rs = select.executeQuery(); 505 506 FileInfo lastFile = null; 507 if(rs.next()) 508 { 509 int id = rs.getInt(1); 510 int version = rs.getInt(2); 511 int parentId = rs.getInt(3); 512 String folderName = rs.getString(4); 513 String creator = rs.getString(5); 514 Date created = (rs.getLong(6) > 0 ? new Date (rs.getLong(6)) : null); 515 Date modified = (rs.getLong(7) > 0 ? new Date (rs.getLong(7)) : null); 516 long size = rs.getLong(8); 517 boolean readable = user.equals(creator) || acl.hasAccess(getName(), getAclId(id, false), SharedItem.READ, user); 518 boolean writable = user.equals(creator) || acl.hasAccess(getName(), getAclId(id, false), SharedItem.WRITE, user); 519 lastFile = new FileInfo(id, version, parentId, folderName, creator, created, modified, size, readable, writable); 520 } 521 rs.close(); 522 select.close(); 523 c.close(); 524 525 if(lastFile == null) 526 throw new RuntimeException ("no such file: " + fileId); 527 528 return lastFile; 529 } 530 531 public void doDownloadFile(String user, ObjectConnection oc, int fileId, int version) 532 throws Exception 533 { 534 FileInfo fileInfo = doGetFile(user, fileId, version); 535 if(!fileInfo.isReadable()) 536 throw new IllegalAccessException ("User "+ user + " doesn't have read access to file '" + fileInfo.getName() + "'"); 537 538 File file = new File(storage, getStorageId(fileId, version)); 539 oc.write(new Long (file.length())); 540 541 DataInputStream dis = new DataInputStream(new FileInputStream(file)); 542 while(dis.available() > 0) 543 { 544 byte[] buffer = new byte[BUFFER_SIZE]; 545 int bytes = dis.read(buffer); 546 if(bytes != buffer.length); 547 { 548 byte[] temp = new byte[bytes]; 549 System.arraycopy(buffer, 0, temp, 0, bytes); 550 buffer = temp; 551 } 552 oc.write(buffer); 553 } 554 } 555 556 public void doDownloadFile(String user, HttpServletResponse response, int fileId, int version) 557 throws Exception 558 { 559 FileInfo fileInfo = doGetFile(user, fileId, version); 560 if(!fileInfo.isReadable()) 561 throw new IllegalAccessException ("User "+ user + " doesn't have read access to file + '" + fileInfo.getName() + "'"); 562 563 response.setContentType("application/octet-stream"); 564 response.setHeader("Content-disposition", "attachment;filename=\""+fileInfo.getName() + '"'); 565 response.setHeader("Content-length", String.valueOf(fileInfo.getSize())); 566 OutputStream out = response.getOutputStream(); 567 568 File file = new File(storage, getStorageId(fileId, version)); 569 DataInputStream dis = new DataInputStream(new FileInputStream(file)); 570 while(dis.available() > 0) 571 { 572 byte[] buffer = new byte[BUFFER_SIZE]; 573 int bytes = dis.read(buffer); 574 if(bytes != buffer.length); 575 { 576 byte[] temp = new byte[bytes]; 577 System.arraycopy(buffer, 0, temp, 0, bytes); 578 buffer = temp; 579 } 580 out.write(buffer); 581 } 582 } 583 584 public void doUpdateFolder(String user, FolderInfo folderInfo) 585 throws Exception 586 { 587 FolderInfo folder = doGetFolder(user, folderInfo.getId()); 588 if(!folder.isWritable()) 589 throw new IllegalAccessException ("User "+ user + " doesn't have write access to folder '" + folder.getName() + "'"); 590 FolderInfo parent = doGetFolder(user, folderInfo.getParentId()); 591 if(!parent.isWritable()) 592 throw new IllegalAccessException ("User "+ user + " doesn't have write access to folder '" + parent.getName() + "'"); 593 594 595 Connection c = layer.getConnection(); 596 PreparedStatement insert = c.prepareStatement( 597 "UPDATE folders SET parentId=?, name=?, owner=?, modified=? WHERE id=?"); 598 599 insert.setInt(1, folderInfo.getParentId()); 600 insert.setString(2, folderInfo.getName()); 601 insert.setString(3, folderInfo.getOwner()); 602 insert.setLong(4, new Date ().getTime()); 603 insert.setInt(5, folderInfo.getId()); 604 605 insert.execute(); 606 insert.close(); 607 c.close(); 608 } 609 610 public void doUpdateFile(String user, FileInfo fileInfo) 611 throws Exception 612 { 613 FileInfo file = doGetFile(user, fileInfo.getId()); 614 if(!file.isWritable()) 615 throw new IllegalAccessException ("User "+ user + " doesn't have write access to file '" + file.getName() + "'"); 616 FolderInfo parent = doGetFolder(user, fileInfo.getParentId()); 617 if(!parent.isWritable()) 618 throw new IllegalAccessException ("User "+ user + " doesn't have write access to folder '" + parent.getName() + "'"); 619 620 621 Connection c = layer.getConnection(); 622 623 PreparedStatement insert = c.prepareStatement( 625 "UPDATE files SET name=?, owner=?, modified=?, size=? WHERE id=? AND version=?"); 626 627 insert.setString(1, fileInfo.getName()); 628 insert.setString(2, fileInfo.getOwner()); 629 insert.setLong(3, new Date ().getTime()); 630 insert.setLong(4, fileInfo.getSize()); 631 insert.setInt(5, fileInfo.getId()); 632 insert.setInt(6, fileInfo.getVersion()); 633 insert.execute(); 634 insert.close(); 635 636 if(fileInfo.getParentId() != file.getParentId()) 638 { 639 insert = c.prepareStatement( 640 "UPDATE files SET folderId=? WHERE id=?"); 641 642 insert.setInt(1, fileInfo.getParentId()); 643 insert.setInt(2, fileInfo.getId()); 644 insert.execute(); 645 insert.close(); 646 } 647 648 c.close(); 649 } 650 651 public void doRemoveFolder(String user, int folderId) 652 throws Exception 653 { 654 FolderInfo folder = doGetFolder(user, folderId); 655 if(!folder.isWritable()) 656 throw new IllegalAccessException ("User "+ user + " doesn't have write access to folder '" + folder.getName() + "'"); 657 658 reallyRemoveFolder(user, folderId); 659 } 660 661 private void reallyRemoveFolder(String user, int folderId) 662 throws Exception 663 { 664 Iterator folders = reallyListFolders(user, folderId).iterator(); 665 while(folders.hasNext()) 666 { 667 FolderInfo folderInfo = (FolderInfo)folders.next(); 668 reallyRemoveFolder(user, folderInfo.getId()); 669 } 670 671 Iterator files = reallyListFiles(user, folderId).iterator(); 672 while(files.hasNext()) 673 { 674 FileInfo fileInfo = (FileInfo)files.next(); 675 reallyRemoveFile(fileInfo.getId()); 676 } 677 678 Connection c = layer.getConnection(); 679 PreparedStatement delete = c.prepareStatement( 680 "DELETE FROM folders WHERE id=?"); 681 682 delete.setInt(1, folderId); 683 684 delete.execute(); 685 delete.close(); 686 c.close(); 687 } 688 689 690 public void doRemoveFile(String user, int fileId) 691 throws Exception 692 { 693 FileInfo file = doGetFile(user, fileId); 694 if(!file.isWritable()) 695 throw new IllegalAccessException ("User "+ user + " doesn't have write access to file '" + file.getName() + "'"); 696 697 reallyRemoveFile(fileId); 698 } 699 700 private void reallyRemoveFile(int fileId) 701 throws SQLException 702 { 703 Connection c = layer.getConnection(); 704 PreparedStatement delete = c.prepareStatement( 705 "DELETE FROM files WHERE id=?"); 706 707 delete.setInt(1, fileId); 708 709 delete.execute(); 710 delete.close(); 711 c.close(); 712 713 File file = new File(storage, String.valueOf(fileId)); 714 file.delete(); 715 } 716 717 719 public AclInfo[] getAcls(String itemId) 720 throws Exception 721 { 722 return acl.getAcls(getName(), itemId); 723 } 724 725 public ArrayList getAllGroups() 726 throws Exception 727 { 728 ArrayList groups = new ArrayList (); 729 Iterator i = Server.getInstance().getStore().getGroupStore().getAllGroups(); 730 while(i.hasNext()) 731 { 732 GroupConcept concept = (GroupConcept)i.next(); 733 groups.add(concept.getName()); 734 } 735 736 return groups; 737 } 738 739 public ArrayList getAllUsers() 740 throws Exception 741 { 742 ArrayList users = new ArrayList (); 743 Iterator i = Server.getInstance().getStore().getUserStore().getAllUsers(); 744 while(i.hasNext()) 745 { 746 UserConcept concept = (UserConcept)i.next(); 747 users.add(concept.getName()); 748 } 749 750 return users; 751 } 752 753 public void addAcl(String itemId, AclInfo aclInfo) 754 throws Exception 755 { 756 if(aclInfo.getGroup() != null) 757 { 758 if(aclInfo.isAllow()) 759 acl.allowGroup(getName(), itemId, aclInfo.getAccess(), aclInfo.getGroup()); 760 else 761 acl.denyGroup(getName(), itemId, aclInfo.getAccess(), aclInfo.getGroup()); 762 } 763 else if(aclInfo.getUser() != null) 764 { 765 if(aclInfo.isAllow()) 766 acl.allowUser(getName(), itemId, aclInfo.getAccess(), aclInfo.getUser()); 767 else 768 acl.denyUser(getName(), itemId, aclInfo.getAccess(), aclInfo.getUser()); 769 } 770 } 771 772 public void removeAcl(String itemId, AclInfo aclInfo) 773 throws Exception 774 { 775 if(aclInfo.getGroup() != null) 776 acl.removeAclForGroup(getName(), itemId, aclInfo.getAccess(), aclInfo.getGroup()); 777 else if(aclInfo.getUser() != null) 778 acl.removeAclForUser(getName(), itemId, aclInfo.getAccess(), aclInfo.getUser()); 779 } 780 781 public String [] getAccesses() 783 { 784 return new String [] {SharedItem.READ, SharedItem.WRITE}; 785 } 786 787 public String getItemName(String itemId) throws Exception 788 { 789 790 SharedItem item; 791 if(itemId.charAt(0) == 'f') 792 item = doGetFolder("", Integer.parseInt(itemId.substring(1))); 793 else 794 item = doGetFile("", Integer.parseInt(itemId)); 795 796 return item.getName(); 797 } 798 799 801 private synchronized int insertFileInfo(String user, FileInfo fileInfo) 802 throws Exception 803 { 804 int id = fileInfo.getId(); 805 806 if(id == FileInfo.NEW_ID) 807 { 808 FolderInfo folder = doGetFolder(user, fileInfo.getParentId()); 809 if(!folder.isWritable()) 810 throw new IllegalAccessException ("User "+ user + " doesn't have write access to folder '" + folder.getName() + "'"); 811 } 812 else 813 { 814 FileInfo file = doGetFile(user, id); 815 if(!file.isWritable()) 816 throw new IllegalAccessException ("User "+ user + " doesn't have write access to file '" + file.getName() + "'"); 817 818 } 819 820 821 if(id == FileInfo.NEW_ID) 822 id = fileSequence.getNextId(); 823 824 Connection c = layer.getConnection(); 825 PreparedStatement insert = c.prepareStatement( 826 "INSERT INTO files VALUES(?, ?, ?, ?, ?, ?, null, ?)"); 827 insert.setInt(1, id); 828 insert.setInt(2, fileInfo.getVersion()); 829 insert.setInt(3, fileInfo.getParentId()); 830 insert.setString(4, fileInfo.getName()); 831 insert.setString(5, fileInfo.getOwner()); 832 insert.setLong(6, new Date ().getTime()); 833 insert.setLong(7, fileInfo.getSize()); 834 835 insert.execute(); 836 insert.close(); 837 c.close(); 838 839 return id; 840 } 841 842 private String getStorageId(int fileId, int version) 843 { 844 return String.valueOf(fileId) + '.' + version; 845 } 846 847 private String getAclId(int id, boolean isFolder) 848 { 849 return (isFolder ? "f" : "") + id; 850 } 851 } | Popular Tags |