github.com/amitbet/vnc2video@v0.0.0-20190616012314-9d50b9dab1d9/security_aten.go (about)

     1  package vnc2video
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/binary"
     6  	"fmt"
     7  )
     8  
     9  type ClientAuthATEN struct {
    10  	Username []byte
    11  	Password []byte
    12  }
    13  
    14  func (*ClientAuthATEN) Type() SecurityType {
    15  	return SecTypeATEN
    16  }
    17  
    18  func (*ClientAuthATEN) SubType() SecuritySubType {
    19  	return SecSubTypeUnknown
    20  }
    21  
    22  func charCodeAt(s string, n int) rune {
    23  	for i, r := range s {
    24  		if i == n {
    25  			return r
    26  		}
    27  	}
    28  	return 0
    29  }
    30  
    31  func (auth *ClientAuthATEN) Auth(c Conn) error {
    32  	var definedAuthLen = 24
    33  
    34  	if len(auth.Username) > definedAuthLen || len(auth.Password) > definedAuthLen {
    35  		return fmt.Errorf("username/password is too long, allowed 0-23")
    36  	}
    37  
    38  	nt, err := readTightTunnels(c)
    39  	if err != nil {
    40  		return err
    41  	}
    42  	/*
    43  		fmt.Printf("tunnels %d\n", nt)
    44  		for i := uint32(0); i < nt; i++ {
    45  			code, vendor, signature, err := readTightCaps(c)
    46  			if err != nil {
    47  				return err
    48  			}
    49  			fmt.Printf("code %d vendor %s signature %s\n", code, vendor, signature)
    50  		}
    51  	*/
    52  	if ((nt&0xffff0ff0)>>0 == 0xaff90fb0) || (nt <= 0 || nt > 0x1000000) {
    53  		c.SetProtoVersion("aten1")
    54  		var skip [20]byte
    55  		binary.Read(c, binary.BigEndian, &skip)
    56  		//fmt.Printf("skip %v\n", skip)
    57  	}
    58  
    59  	username := make([]byte, definedAuthLen)
    60  	password := make([]byte, definedAuthLen)
    61  	copy(username, auth.Username)
    62  	copy(password, auth.Password)
    63  	challenge := bytes.Join([][]byte{username, password}, []byte(""))
    64  	if err := binary.Write(c, binary.BigEndian, challenge); err != nil {
    65  		return err
    66  	}
    67  
    68  	if err := c.Flush(); err != nil {
    69  		return err
    70  	}
    71  	/*
    72  
    73  		sendUsername := make([]byte, definedAuthLen)
    74  		for i := 0; i < definedAuthLen; i++ {
    75  			if i < len(auth.Username) {
    76  				sendUsername[i] = byte(charCodeAt(string(auth.Username), i))
    77  			} else {
    78  				sendUsername[i] = 0
    79  			}
    80  		}
    81  
    82  		sendPassword := make([]byte, definedAuthLen)
    83  
    84  		for i := 0; i < definedAuthLen; i++ {
    85  			if i < len(auth.Password) {
    86  				sendPassword[i] = byte(charCodeAt(string(auth.Password), i))
    87  			} else {
    88  				sendPassword[i] = 0
    89  			}
    90  		}
    91  
    92  		if err := binary.Write(c, binary.BigEndian, sendUsername); err != nil {
    93  			return err
    94  		}
    95  		if err := binary.Write(c, binary.BigEndian, sendPassword); err != nil {
    96  			return err
    97  		}
    98  
    99  		if err := c.Flush(); err != nil {
   100  			return err
   101  		}
   102  	*/
   103  	//var pp [10]byte
   104  	//binary.Read(c, binary.BigEndian, &pp)
   105  	//fmt.Printf("ddd %v\n", pp)
   106  	return nil
   107  }