func (u *User) GetCipher() (*ss.Cipher, error, bool) { method := u.method auth := false if strings.HasSuffix(method, "-auth") { method = method[:len(method)-5] auth = true } s, e := ss.NewCipher(method, u.passwd) return s, e, auth }
func runWithCustomMethod(user user.User) { // port, password string, Cipher *ss.Cipher port := strconv.Itoa(user.GetPort()) password := user.GetPasswd() ln, err := net.Listen("tcp", ":"+port) if err != nil { Log.Error(fmt.Sprintf("error listening port %v: %v\n", port, err)) os.Exit(1) } passwdManager.add(port, password, ln) cipher, err, auth := user.GetCipher() if err != nil { return } Log.Info(fmt.Sprintf("server listening port %v ...\n", port)) for { conn, err := ln.Accept() if err != nil { // listener maybe closed to update password Log.Debug(fmt.Sprintf("accept error: %v\n", err)) return } // Creating cipher upon first connection. if cipher == nil { Log.Debug("creating cipher for port:", port) method := user.GetMethod() if strings.HasSuffix(method, "-auth") { method = method[:len(method)-5] auth = true } else { auth = false } cipher, err = ss.NewCipher(method, password) if err != nil { Log.Error(fmt.Sprintf("Error generating cipher for port: %s %v\n", port, err)) conn.Close() continue } } go handleConnection(user, ss.NewConn(conn, cipher.Copy()), auth) } }