(buf []byte, sig *auth.SigInfo)
| 92 | } |
| 93 | |
| 94 | func (c *QQClient) decodeLoginResponse(buf []byte, sig *auth.SigInfo) (LoginResponse, error) { |
| 95 | reader := binary.NewReader(buf) |
| 96 | reader.SkipBytes(2) |
| 97 | typ := reader.ReadU8() |
| 98 | tlv := reader.ReadTlv() |
| 99 | |
| 100 | switch typ { |
| 101 | case 0: |
| 102 | reader = binary.NewReader(tea.NewTeaCipher(sig.Tgtgt).Decrypt(tlv[0x119])) |
| 103 | tlv = reader.ReadTlv() |
| 104 | if tgt, ok := tlv[0x10A]; ok { |
| 105 | sig.Tgt = tgt |
| 106 | } |
| 107 | if d2, ok := tlv[0x143]; ok { |
| 108 | sig.D2 = d2 |
| 109 | } |
| 110 | if d2Key, ok := tlv[0x305]; ok { |
| 111 | sig.D2Key = d2Key |
| 112 | } |
| 113 | if tlv11a, ok := tlv[0x11A]; ok { |
| 114 | c.debug("tlv11a data: %x", tlv11a) |
| 115 | tlvReader := binary.NewReader(tlv11a) |
| 116 | tlvReader.ReadU16() |
| 117 | sig.Age = tlvReader.ReadU8() |
| 118 | sig.Gender = tlvReader.ReadU8() |
| 119 | sig.Nickname = tlvReader.ReadStringWithLength("u8", false) |
| 120 | } |
| 121 | sig.Tgtgt = crypto.MD5Digest(sig.D2Key) |
| 122 | sig.TempPwd = tlv[0x106] |
| 123 | |
| 124 | var resp pb.Tlv543 |
| 125 | err := proto.Unmarshal(tlv[0x543], &resp) |
| 126 | if err != nil { |
| 127 | err = fmt.Errorf("parsing login response error: %w", err) |
| 128 | c.errorln(err) |
| 129 | return LoginResponse{ |
| 130 | Success: false, |
| 131 | Code: typ, |
| 132 | Error: UnknownLoginError, |
| 133 | ErrorMessage: err.Error(), |
| 134 | }, err |
| 135 | } |
| 136 | sig.UID = resp.Layer1.Layer2.Uid |
| 137 | |
| 138 | c.debugln("SigInfo got") |
| 139 | |
| 140 | return LoginResponse{ |
| 141 | Success: true, |
| 142 | }, nil |
| 143 | default: |
| 144 | } |
| 145 | |
| 146 | var loginErr LoginError |
| 147 | var title, content string |
| 148 | |
| 149 | if t146, ok := tlv[0x146]; ok { |
| 150 | errBuf := binary.NewReader(t146) |
| 151 | errBuf.SkipBytes(4) |
no test coverage detected