func (af *AuthenticationFilter) OnPacketReceived(s *netlib.Session, packetid int, packet interface{}) bool { if s.GetAttribute(SessionAttributeAuth) == nil { if auth, ok := packet.(*protocol.SSPacketAuth); ok { h := md5.New() rawText := fmt.Sprintf("%v;%v", auth.GetTimestamp(), s.GetSessionConfig().AuthKey) logger.Tracef("AuthenticationFilter rawtext=%v IsInnerLink(%v)", rawText, s.GetSessionConfig().IsInnerLink) h.Write([]byte(rawText)) expectKey := hex.EncodeToString(h.Sum(nil)) if expectKey != auth.GetAuthKey() { if af.SessionAuthHandler != nil { af.SessionAuthHandler(s, false) } s.Close() logger.Tracef("AuthenticationFilter AuthKey error[expect:%v get:%v]", expectKey, auth.GetAuthKey()) return false } s.SetAttribute(SessionAttributeAuth, true) if af.SessionAuthHandler != nil { af.SessionAuthHandler(s, true) } return false } else { s.Close() logger.Warn("AuthenticationFilter packet not expect") return false } } return true }
func (this *SessionHandlerServiceRegiste) OnSessionOpened(s *netlib.Session) { sc := s.GetSessionConfig() if sc.IsClient { /*报告自己的监听信息*/ srvlib.ServiceMgr.ReportService(s) } else { s.SetAttribute(srvlib.SessionAttributeServiceFlag, 1) } }
func (sfcl *SessionHandlerClientLoad) reportLoad(s *netlib.Session) { sc := s.GetSessionConfig() pack := &protocol.ServerLoad{ SrvType: proto.Int32(int32(sc.Type)), SrvId: proto.Int32(int32(sc.Id)), CurLoad: proto.Int32(int32(srvlib.ClientSessionMgrSington.Count())), } proto.SetDefaults(pack) srvlib.ServerSessionMgrSington.Broadcast(pack, netlib.Config.SrvInfo.AreaID, srvlib.BalanceServerType) logger.Tracef("SessionHandlerClientLoad.reportLoad %v", pack) }
func (this *MulticastHandler) Process(s *netlib.Session, data interface{}) error { if mp, ok := data.(*protocol.SSPacketMulticast); ok { pd := mp.GetData() sis := mp.GetSessions() for _, si := range sis { ns := this.getSession(si) if ns != nil { ns.Send(pd, s.GetSessionConfig().IsInnerLink) } } } return nil }
func (af *AuthenticationFilter) OnSessionOpened(s *netlib.Session) bool { timestamp := time.Now().Unix() h := md5.New() sc := s.GetSessionConfig() h.Write([]byte(fmt.Sprintf("%v;%v", timestamp, sc.AuthKey))) authPack := &protocol.SSPacketAuth{ Timestamp: proto.Int64(timestamp), AuthKey: proto.String(hex.EncodeToString(h.Sum(nil))), } proto.SetDefaults(authPack) s.Send(authPack) return true }
func (this *PacketSlicesHandler) Process(s *netlib.Session, data interface{}) error { if packetslices, ok := data.(*protocol.SSPacketSlices); ok { seqNo := int(packetslices.GetSeqNo()) if seqNo < 1 { return errors.New("PacketSlicesHandler unexpect packet seq:" + strconv.Itoa(seqNo)) } totalSize := int(packetslices.GetTotalSize()) if totalSize > s.GetSessionConfig().MaxPacket { return errors.New("PacketSlicesHandler exceed MaxPacket size:" + strconv.Itoa(s.GetSessionConfig().MaxPacket) + " size=" + strconv.Itoa(totalSize)) } attr := s.GetAttribute(SessionAttributeBigBuf) if seqNo == 1 { if attr == nil { attr = bytes.NewBuffer(make([]byte, 0, packetslices.GetTotalSize())) s.SetAttribute(SessionAttributeBigBuf, attr) } } if seqNo > 1 { if attr == nil { return errors.New("PacketSlicesHandler Incorrect packet seq, expect seq=1") } } else if attr == nil { return errors.New("PacketSlicesHandler get bytesbuf failed") } buf := attr.(*bytes.Buffer) if seqNo == 1 { buf.Reset() } if buf.Len() != int(packetslices.GetOffset()) { return errors.New("PacketSlicesHandler get next packet offset error") } buf.Write(packetslices.GetPacketData()) if buf.Len() == totalSize { packetid, pck, err := netlib.UnmarshalPacket(buf.Bytes()) if err != nil { return err } h := netlib.GetHandler(packetid) if h != nil { h.Process(s, pck) } } } return nil }
func (this *SessionHandlerServiceRegiste) OnSessionClosed(s *netlib.Session) { sc := s.GetSessionConfig() if !sc.IsClient { srvlib.ServiceMgr.ClearServiceBySession(s) } }
func NewSessionId(s *netlib.Session) SessionId { sc := s.GetSessionConfig() id := int64(sc.AreaId)<<SessionIdSrvAreaOffset | int64(sc.Type)<<SessionIdSrvTypeOffset | int64(sc.Id)<<SessionIdSrvIdOffset | int64(s.Id) return SessionId(id) }