📄 ftpconnection.java
字号:
char ur = tmp.charAt(1); char uw = tmp.charAt(2); char ar = tmp.charAt(7); char aw = tmp.charAt(8); to.nextToken(); String user = to.nextToken(); //System.out.println(""+ur+":"+ar+":"+tmp); if(aw == 'w') { out.println("w"); } else if(user.equals(username) && (uw == 'w')) { out.println("w"); } else if(ar == 'r') { out.println("r"); } else if(user.equals(username) && (ur == 'r')) { out.println("r"); } else { //System.out.println(ur+":"+ar+":"+user+":"+username+":"); out.println("n"); } } out.flush(); out.close(); } catch(Exception ex) { Log.debug(ex.toString() + " @FtpConnection::getPermissions#1"); } try { in = new BufferedReader(new FileReader(Settings.permissions_out)); //String[] files = new String[length]; int[] ret = new int[length]; String fx; for(int i = 0; i < length; i++) { fx = in.readLine(); if(fx.equals("w")) { ret[i] = W; } else if(fx.equals("n")) { ret[i] = DENIED; } else { ret[i] = R; } //System.out.println(ret[i]); } return ret; } catch(Exception ex) { Log.debug(ex.toString() + " @FtpConnection::getPermissions#2"); } return new int[0]; } /** * Sort the filenames of the current working dir an return an array. * * The Array should be in sync with the other sort*-Methods * * @param file The file containing the raw server listing, usually Settings.ls_out * @return An String-array of sizes containing the name of the file (symlinks are resolved) */ public String[] sortLs(String file) { if(TESTMODE) { file = "/home/cdemon/sampleos2"; } try { BufferedReader in = new BufferedReader(new FileReader(file)); PrintStream out = new PrintStream(new FileOutputStream(Settings.sortls_out)); int length = 0; boolean newUnixDateStyle = false; dateVector = new Vector(); while(true) { String tmp = in.readLine(); if(tmp == null) { break; } // ------------------- VMS override -------------------- if(getOsType().indexOf("VMS") >= 0) { int x = tmp.indexOf(";"); if(x < 0) { continue; } tmp = tmp.substring(0, x); ; if(tmp.endsWith("DIR")) { out.println(tmp.substring(0, tmp.lastIndexOf(".")) + "/"); } else { out.println(tmp); } //Log.out("listing - (vms parser): " + tmp); length++; continue; } else if(getOsType().indexOf("OS/2") >= 0) { StringTokenizer to2 = new StringTokenizer(tmp, " ", true); if(giveFile(to2, 2).indexOf("DIR") >= 0) { to2 = new StringTokenizer(tmp, " ", true); tmp = giveFile(to2, 5); tmp = tmp + "/"; } else { to2 = new StringTokenizer(tmp, " ", true); if(giveFile(to2, 1).indexOf("DIR") >= 0) { //Log.out("OS/2 parser (DIRFIX): " + tmp); to2 = new StringTokenizer(tmp, " ", true); tmp = giveFile(to2, 4); tmp = tmp + "/"; } else { to2 = new StringTokenizer(tmp, " ", true); tmp = giveFile(to2, 4); } } Log.out("OS/2 parser: " + tmp); out.println(tmp); length++; continue; } // ------------------------------------------------------- // ------------------- Unix, Windows and others ----- boolean isDir = false; boolean isLink = false; if(tmp.startsWith("d") || (tmp.indexOf("<DIR>") >= 0)) { isDir = true; } if(tmp.startsWith("l")) { isLink = true; } if(tmp.startsWith("/") && (tmp.indexOf("denied") > 0)) { continue; } StringTokenizer to = new StringTokenizer(tmp, " ", false); StringTokenizer to2 = new StringTokenizer(tmp, " ", true); int tokens = to.countTokens(); //Log.out("listing: tokens: " + tokens + " - " + tmp); boolean set = false; //-----preparsing----- if(!newUnixDateStyle) { try { StringTokenizer tx = new StringTokenizer(tmp, " ", false); tx.nextToken(); tx.nextToken(); tx.nextToken(); tx.nextToken(); tx.nextToken(); String date = tx.nextToken(); int x = date.indexOf("-"); int y = date.lastIndexOf("-"); if(y > x) { Log.debug("Using new Unix date parser"); newUnixDateStyle = true; } } catch(Exception ex) { Log.out("could not preparse line: " + tmp); } } //-------------------- //Log.out("tmp: " + tmp); if(newUnixDateStyle) // unix, too { set = true; //Log.out("listing - (unix parser #2, token 7): " + tmp); //------- date parser testing --------- try { //Log.out(">>> date parser: " + tmp); StringTokenizer to3 = new StringTokenizer(tmp, " ", true); String tx = giveFile(to3,5); String date = tx.substring(0, tx.indexOf(" ")+1).trim(); StringTokenizer to4 = new StringTokenizer(tmp, " ", true); String tx2 = giveFile(to4,6); String date2 = tx.substring(0, tx.indexOf(" ")+1).trim(); date2.replace(":","-"); String t = date; String y = t.substring(0,t.indexOf("-")); String m = t.substring(t.indexOf("-")+1, t.lastIndexOf("-")); String day = t.substring(t.lastIndexOf("-")+1); String h = date2.substring(0,date2.indexOf("-")); String min = date2.substring(date2.lastIndexOf("-")+1); Date d = new Date(); d.setDate(Integer.parseInt(day)); d.setYear(Integer.parseInt(y)); d.setMonth(Integer.parseInt(m)); d.setHours(Integer.parseInt(h)); d.setMinutes(Integer.parseInt(min)); dateVector.add(d); //Log.out("+++ date: \"" + d.toString() + "\""); } catch(Exception ex) { ex.printStackTrace(); } // ----------------------------- tmp = giveFile(to2, 7); } else if(tokens > 8) // unix { set = true; tmp = giveFile(to2, 8); //Log.out("listing - (unix parser, token 8): " + tmp); } else if(tokens > 3) // windows { set = true; tmp = giveFile(to2, 3); if(tmp.startsWith("<error>")) { tmp = giveFile(to2, 4); //Log.out("listing - (windows parser, token 4): " + tmp); } else { //Log.out("listing - (windows parser, token 3): " + tmp); } } if(tmp.startsWith("<error>") || !set) { if(tokens < 3) { continue; } tmp = giveFile(to2, tokens); Log.out("listing - WARNING: listing style unknown, using last token as filename!"); Log.out("listing - this may work but may also fail, filesizes and permissions will probably fail, too..."); Log.out("listing - please send us a feature request with the serveraddress to let us support this listing style :)"); Log.out("listing - (backup parser, token " + tokens + " ): " + tmp); } if(isDir) { tmp = tmp + "/"; } else if(isLink) { tmp = tmp + "###"; } out.println(tmp); length++; // ------------------------------------------------------------- } in = new BufferedReader(new FileReader(Settings.sortls_out)); String[] files = new String[length]; for(int i = 0; i < length; i++) { files[i] = parseSymlink(in.readLine()); //System.out.println("> " + files[i]); } return files; } catch(Exception ex) { Log.debug(ex.toString() + " @FtpConnection::sortLs"); } //------- date parser test ------ /* String[] x = (String[]) dateVector.toArray(); for(int i=0; i<x.length; i++) { Log.out(":"+x[i]); } */ //------------------------------- return new String[0]; } /** get a filename */ private String giveFile(StringTokenizer to, int lev) { String t2 = null; for(int i = 0; i < lev; i++) { if(to.hasMoreTokens()) { String t = to.nextToken(); //Log.out("> "+t); if(t.equals(" ") || t.equals("\t")) { // - /* while(to.hasMoreTokens()) { t2 = to.nextToken(); if(!t.equals(" ") && !t.equals("\t")) break; } */ i--; } } } String tmp = "<error>"; /* if(t2 != null) { tmp = t2; } */ while(tmp.equals(" ") || tmp.equals("\t") || tmp.equals("<error>")) { if(to.hasMoreTokens()) { tmp = to.nextToken(); } else { break; } } while(to.hasMoreTokens()) { tmp = tmp + to.nextToken(); } //Log.out(">>> "+tmp); return tmp; } /** get a filesize */ private String giveSize(StringTokenizer to, int lev) { for(int i = 0; i < lev; i++) { if(to.hasMoreTokens()) { if(to.nextToken().equals(" ")) { i--; } } } while(to.hasMoreTokens()) { String tmp = to.nextToken(); if(!tmp.equals(" ")) { try { Integer.parseInt(tmp); } catch(NumberFormatException ex) { return "-1"; } return tmp; } } return "-2"; } /** * Try to determine the os-type. * (Used internally to check how to parse the ls-output) * * @return A Part of the SYST comman server response */ public String getOsType() { if(TESTMODE) { return "OS/2"; } else { return osType; } } private void setOsType(String os) { osType = os.toUpperCase(); } private int getPasvPort(String str) { int start = str.lastIndexOf(","); String lo = ""; start++; while(start < str.length()) { char c = str.charAt(start); if(!Character.isDigit(c)) { break; } lo = lo + c; start++; } String hi = ""; start = str.lastIndexOf(","); start--; while(true) { char c = str.charAt(start); if(!Character.isDigit(c)) { break; } hi = c + hi; start--; } //System.out.print(hi+":"+lo+" - "); return ((Integer.parseInt(hi) * 256) + Integer.parseInt(lo)); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -