?? vncviewer.java
字號:
desme.encrypt(passwd, 0, passwd, 0);
// end equivalent of vncEncryptPasswdMS
// get the mslogon Challenge from server
rfb.is.readFully(challengems);
}
// mslogon support end
byte[] challenge = new byte[16];
rfb.is.readFully(challenge);
if (pw.length() > 8)
pw = pw.substring(0, 8); // Truncate to 8 chars
// vncEncryptBytes in the UNIX libvncauth truncates password
// after the first zero byte. We do to.
int firstZero = pw.indexOf(0);
if (firstZero != -1)
pw = pw.substring(0, firstZero);
// mslogon support
if (mslogon ){
for (i= 0; i<32; i++) {
challengems[i]= (byte) (passwd[i]^challengems[i]);
}
rfb.os.write(user);
rfb.os.write(domain);
rfb.os.write(challengems);
}
// mslogon support end
byte[] key = {0, 0, 0, 0, 0, 0, 0, 0};
System.arraycopy(pw.getBytes(), 0, key, 0, pw.length());
DesCipher des = new DesCipher(key);
des.encrypt(challenge, 0, challenge, 0);
des.encrypt(challenge, 8, challenge, 8);
rfb.os.write(challenge);
int authResult = rfb.is.readInt();
switch (authResult) {
case RfbProto.VncAuthOK:
System.out.println("VNC authentication succeeded");
return true;
case RfbProto.VncAuthFailed:
System.out.println("VNC authentication failed");
break;
case RfbProto.VncAuthTooMany:
throw new Exception("VNC authentication failed - too many tries");
default:
throw new Exception("Unknown VNC authentication result " + authResult);
}
break;
case RfbProto.MsLogon:
System.out.println("MS-Logon (DH) detected");
if (AuthMsLogon(us, pw)) {
return true;
}
break;
default:
throw new Exception("Unknown VNC authentication scheme " + authScheme);
}
return false;
}
// marscha@2006: Try to better hide the windows password.
// I know that this is no breakthrough in modern cryptography.
// It's just a patch/kludge/workaround.
boolean AuthMsLogon(String us, String pw) throws Exception {
byte user[] = new byte[256];
byte passwd[] = new byte[64];
long gen = rfb.is.readLong();
long mod = rfb.is.readLong();
long resp = rfb.is.readLong();
DH dh = new DH(gen, mod);
long pub = dh.createInterKey();
rfb.os.write(DH.longToBytes(pub));
long key = dh.createEncryptionKey(resp);
System.out.println("gen=" + gen + ", mod=" + mod
+ ", pub=" + pub + ", key=" + key);
DesCipher des = new DesCipher(DH.longToBytes(key));
System.arraycopy(us.getBytes(), 0, user, 0, us.length() );
// and pad it with Null
if (us.length() < 256) {
for (i=us.length(); i<256; i++){ user[i]= 0; }
}
// copy the pw (password) parameter into the password Byte formated variable
System.arraycopy(pw.getBytes(), 0, passwd, 0, pw.length() );
// and pad it with Null
if (pw.length() < 32) {
for (i=pw.length(); i<32; i++){ passwd[i]= 0; }
}
//user = domain + "\\" + user;
des.encryptText(user, user, DH.longToBytes(key));
des.encryptText(passwd, passwd, DH.longToBytes(key));
rfb.os.write(user);
rfb.os.write(passwd);
int authResult = rfb.is.readInt();
switch (authResult) {
case RfbProto.VncAuthOK:
System.out.println("MS-Logon (DH) authentication succeeded");
return true;
case RfbProto.VncAuthFailed:
System.out.println("MS-Logon (DH) authentication failed");
break;
case RfbProto.VncAuthTooMany:
throw new Exception("MS-Logon (DH) authentication failed - too many tries");
default:
throw new Exception("Unknown MS-Logon (DH) authentication result " + authResult);
}
return false;
}
//
// Do the rest of the protocol initialisation.
//
void doProtocolInitialisation() throws IOException {
rfb.writeClientInit();
rfb.readServerInit();
System.out.println("Desktop name is " + rfb.desktopName);
System.out.println("Desktop size is " + rfb.framebufferWidth + " x " +
rfb.framebufferHeight);
setEncodings();
}
//
// Send current encoding list to the RFB server.
//
void setEncodings() {
try {
if (rfb != null && rfb.inNormalProtocol) {
rfb.writeSetEncodings(options.encodings, options.nEncodings);
if (vc != null) {
vc.softCursorFree();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
//
// setCutText() - send the given cut text to the RFB server.
//
void setCutText(String text) {
try {
if (rfb != null && rfb.inNormalProtocol) {
rfb.writeClientCutText(text);
}
} catch (Exception e) {
e.printStackTrace();
}
}
//
// Order change in session recording status. To stop recording, pass
// null in place of the fname argument.
//
void setRecordingStatus(String fname) {
synchronized(recordingSync) {
sessionFileName = fname;
recordingStatusChanged = true;
}
}
//
// Start or stop session recording. Returns true if this method call
// causes recording of a new session.
//
boolean checkRecordingStatus() throws IOException {
synchronized(recordingSync) {
if (recordingStatusChanged) {
recordingStatusChanged = false;
if (sessionFileName != null) {
startRecording();
return true;
} else {
stopRecording();
}
}
}
return false;
}
//
// Start session recording.
//
protected void startRecording() throws IOException {
synchronized(recordingSync) {
if (!recordingActive) {
// Save settings to restore them after recording the session.
cursorUpdatesDef =
options.choices[options.cursorUpdatesIndex].getSelectedItem();
eightBitColorsDef =
options.choices[options.eightBitColorsIndex].getSelectedItem();
// Set options to values suitable for recording.
options.choices[options.cursorUpdatesIndex].select("Disable");
options.choices[options.cursorUpdatesIndex].setEnabled(false);
options.setEncodings();
options.choices[options.eightBitColorsIndex].select("Full");
options.choices[options.eightBitColorsIndex].setEnabled(false);
options.setColorFormat();
} else {
rfb.closeSession();
}
System.out.println("Recording the session in " + sessionFileName);
rfb.startSession(sessionFileName);
recordingActive = true;
}
}
//
// Stop session recording.
//
protected void stopRecording() throws IOException {
synchronized(recordingSync) {
if (recordingActive) {
// Restore options.
options.choices[options.cursorUpdatesIndex].select(cursorUpdatesDef);
options.choices[options.cursorUpdatesIndex].setEnabled(true);
options.setEncodings();
options.choices[options.eightBitColorsIndex].select(eightBitColorsDef);
options.choices[options.eightBitColorsIndex].setEnabled(true);
options.setColorFormat();
rfb.closeSession();
System.out.println("Session recording stopped.");
}
sessionFileName = null;
recordingActive = false;
}
}
//
// readParameters() - read parameters from the html source or from the
// command line. On the command line, the arguments are just a sequence of
// param_name/param_value pairs where the names and values correspond to
// those expected in the html applet tag source.
//
public void readParameters() {
host = readParameter("HOST", !inAnApplet);
if (host == null) {
host = getCodeBase().getHost();
if (host.equals("")) {
fatalError("HOST parameter not specified");
}
}
String str = readParameter("PORT", true);
port = Integer.parseInt(str);
if (inAnApplet) {
str = readParameter("Open New Window", false);
if (str != null && str.equalsIgnoreCase("Yes"))
inSeparateFrame = true;
}
encPasswordParam = readParameter("ENCPASSWORD", false);
if (encPasswordParam == null)
passwordParam = readParameter("PASSWORD", false);
// "Show Controls" set to "No" disables button panel.
showControls = true;
str = readParameter("Show Controls", false);
if (str != null && str.equalsIgnoreCase("No"))
showControls = false;
// Do we continue showing desktop on remote disconnect?
showOfflineDesktop = false;
str = readParameter("Show Offline Desktop", false);
if (str != null && str.equalsIgnoreCase("Yes"))
showOfflineDesktop = true;
// Fine tuning options.
deferScreenUpdates = readIntParameter("Defer screen updates", 20);
deferCursorUpdates = readIntParameter("Defer cursor updates", 10);
deferUpdateRequests = readIntParameter("Defer update requests", 50);
}
public String readParameter(String name, boolean required) {
if (inAnApplet) {
String s = getParameter(name);
if ((s == null) && required) {
fatalError(name + " parameter not specified");
}
return s;
}
for (int i = 0; i < mainArgs.length; i += 2) {
if (mainArgs[i].equalsIgnoreCase(name)) {
try {
return mainArgs[i+1];
} catch (Exception e) {
if (required) {
fatalError(name + " parameter not specified");
}
return null;
}
}
}
if (required) {
fatalError(name + " parameter not specified");
}
return null;
}
int readIntParameter(String name, int defaultValue) {
String str = readParameter(name, false);
int result = defaultValue;
if (str != null) {
try {
result = Integer.parseInt(str);
} catch (NumberFormatException e) { }
}
return result;
}
//
// moveFocusToDesktop() - move keyboard focus either to the
// VncCanvas or to the AuthPanel.
//
void moveFocusToDesktop() {
if (vncContainer != null) {
if (vc != null && vncContainer.isAncestorOf(vc)) {
vc.requestFocus();
} else if (vncContainer.isAncestorOf(authenticator)) {
authenticator.moveFocusToPasswordField();
}
}
}
//
// disconnect() - close connection to server.
//
boolean disconnectRequested = false;
synchronized public void disconnect() {
disconnectRequested = true;
if (rfb != null) {
rfb.close();
rfb = null;
}
System.out.println("Disconnect");
options.dispose();
clipboard.dispose();
if (rec != null)
rec.dispose();
if (inAnApplet) {
vncContainer.removeAll();
Label errLabel = new Label("Disconnected");
errLabel.setFont(new Font("Helvetica", Font.PLAIN, 12));
vncContainer.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 30));
vncContainer.add(errLabel);
if (inSeparateFrame) {
vncFrame.pack();
} else {
validate();
}
rfbThread.stop();
} else {
System.exit(0);
}
}
//
// fatalError() - print out a fatal error message.
//
synchronized public void fatalError(String str) {
if (rfb != null) {
rfb.close();
rfb = null;
}
System.out.println(str);
if (disconnectRequested) {
// Not necessary to show error message if the error was caused
// by I/O problems after the disconnect() method call.
disconnectRequested = false;
return;
}
if (inAnApplet) {
vncContainer.removeAll();
Label errLabel = new Label(str);
errLabel.setFont(new Font("Helvetica", Font.PLAIN, 12));
vncContainer.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 30));
vncContainer.add(errLabel);
if (inSeparateFrame) {
vncFrame.pack();
} else {
validate();
}
Thread.currentThread().stop();
} else {
System.exit(1);
}
}
//
// This method is called before the applet is destroyed.
//
public void destroy() {
vncContainer.removeAll();
options.dispose();
clipboard.dispose();
if (ftp != null)
ftp.dispose();
if (rec != null)
rec.dispose();
if (rfb != null)
rfb.close();
if (inSeparateFrame)
vncFrame.dispose();
}
//
// Close application properly on window close event.
//
public void windowClosing(WindowEvent evt) {
if (rfb != null)
disconnect();
vncFrame.dispose();
if (!inAnApplet) {
System.exit(0);
}
}
//
// Move the keyboard focus to the password field on window activation.
//
public void windowActivated(WindowEvent evt) {
if (vncFrame.isAncestorOf(authenticator))
authenticator.moveFocusToPasswordField();
}
//
// Ignore window events we're not interested in.
//
public void windowDeactivated (WindowEvent evt) {}
public void windowOpened(WindowEvent evt) {}
public void windowClosed(WindowEvent evt) {}
public void windowIconified(WindowEvent evt) {}
public void windowDeiconified(WindowEvent evt) {}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -