Generate a connect protocol message, issuing user/password if applicable. The lock is assumed to be held upon entering.
()
| 2914 | // Generate a connect protocol message, issuing user/password if |
| 2915 | // applicable. The lock is assumed to be held upon entering. |
| 2916 | func (nc *Conn) connectProto() (string, error) { |
| 2917 | o := nc.Opts |
| 2918 | var nkey, sig, user, pass, token, ujwt string |
| 2919 | u := nc.current.URL.User |
| 2920 | if u != nil { |
| 2921 | // if no password, assume username is authToken |
| 2922 | if _, ok := u.Password(); !ok { |
| 2923 | token = u.Username() |
| 2924 | } else { |
| 2925 | user = u.Username() |
| 2926 | pass, _ = u.Password() |
| 2927 | } |
| 2928 | } else { |
| 2929 | // Take from options (possibly all empty strings) |
| 2930 | user = o.User |
| 2931 | pass = o.Password |
| 2932 | token = o.Token |
| 2933 | nkey = o.Nkey |
| 2934 | |
| 2935 | if nc.Opts.UserInfo != nil { |
| 2936 | if user != _EMPTY_ || pass != _EMPTY_ { |
| 2937 | return _EMPTY_, ErrUserInfoAlreadySet |
| 2938 | } |
| 2939 | user, pass = nc.Opts.UserInfo() |
| 2940 | } |
| 2941 | } |
| 2942 | |
| 2943 | // Look for user jwt. |
| 2944 | if o.UserJWT != nil { |
| 2945 | if jwt, err := o.UserJWT(); err != nil { |
| 2946 | return _EMPTY_, err |
| 2947 | } else { |
| 2948 | ujwt = jwt |
| 2949 | } |
| 2950 | if nkey != _EMPTY_ { |
| 2951 | return _EMPTY_, ErrNkeyAndUser |
| 2952 | } |
| 2953 | } |
| 2954 | |
| 2955 | if ujwt != _EMPTY_ || nkey != _EMPTY_ { |
| 2956 | if o.SignatureCB == nil { |
| 2957 | if ujwt == _EMPTY_ { |
| 2958 | return _EMPTY_, ErrNkeyButNoSigCB |
| 2959 | } |
| 2960 | return _EMPTY_, ErrUserButNoSigCB |
| 2961 | } |
| 2962 | sigraw, err := o.SignatureCB([]byte(nc.info.Nonce)) |
| 2963 | if err != nil { |
| 2964 | return _EMPTY_, fmt.Errorf("error signing nonce: %w", err) |
| 2965 | } |
| 2966 | sig = base64.RawURLEncoding.EncodeToString(sigraw) |
| 2967 | } |
| 2968 | |
| 2969 | if nc.Opts.TokenHandler != nil { |
| 2970 | if token != _EMPTY_ { |
| 2971 | return _EMPTY_, ErrTokenAlreadySet |
| 2972 | } |
| 2973 | token = nc.Opts.TokenHandler() |