// replyTopicDescBasic loads minimal topic Desc when the requester is not subscribed to the topic func replyTopicDescBasic(sess *Session, topic string, get *MsgClientGet) { log.Printf("hub.replyTopicDescBasic: topic %s", topic) now := time.Now().UTC().Round(time.Millisecond) desc := &MsgTopicDesc{} if strings.HasPrefix(topic, "grp") { stopic, err := store.Topics.Get(topic) if err == nil { desc.CreatedAt = &stopic.CreatedAt desc.UpdatedAt = &stopic.UpdatedAt desc.Public = stopic.Public } else { sess.queueOut(ErrUnknown(get.Id, get.Topic, now)) return } } else { // 'me' and p2p topics var uid types.Uid if strings.HasPrefix(topic, "usr") { // User specified as usrXXX uid = types.ParseUserId(topic) } else if strings.HasPrefix(topic, "p2p") { // User specified as p2pXXXYYY uid1, uid2, _ := types.ParseP2P(topic) if uid1 == sess.uid { uid = uid2 } else if uid2 == sess.uid { uid = uid1 } } if uid.IsZero() { sess.queueOut(ErrMalformed(get.Id, get.Topic, now)) return } suser, err := store.Users.Get(uid) if err == nil { desc.CreatedAt = &suser.CreatedAt desc.UpdatedAt = &suser.UpdatedAt desc.Public = suser.Public } else { log.Printf("hub.replyTopicInfoBasic: sending error 3") sess.queueOut(ErrUnknown(get.Id, get.Topic, now)) return } } log.Printf("hub.replyTopicDescBasic: sending desc -- OK") sess.queueOut(&ServerComMessage{ Meta: &MsgServerMeta{Id: get.Id, Topic: get.Topic, Timestamp: &now, Desc: desc}}) }
// SubsForUser loads a list of user's subscriptions to topics func (a *RethinkDbAdapter) SubsForUser(forUser t.Uid) ([]t.Subscription, error) { if forUser.IsZero() { return nil, errors.New("RethinkDb adapter: invalid user ID in TopicGetAll") } q := rdb.DB(a.dbName).Table("subscriptions").GetAllByIndex("User", forUser.String()).Limit(MAX_RESULTS) rows, err := q.Run(a.conn) if err != nil { return nil, err } var subs []t.Subscription var ss t.Subscription for rows.Next(&ss) { subs = append(subs, ss) } return subs, rows.Err() }
// Create creates a topic and owner's subscription to topic func (TopicsObjMapper) Create(topic *types.Topic, owner types.Uid, private interface{}) error { topic.InitTimes() err := adaptr.TopicCreate(topic) if err != nil { return err } if !owner.IsZero() { err = Subs.Create(&types.Subscription{ ObjHeader: types.ObjHeader{CreatedAt: topic.CreatedAt}, User: owner.String(), Topic: topic.Name, ModeGiven: types.ModeFull, ModeWant: topic.GetAccess(owner), Private: private}) } return err }
// replySetSub is a response to new subscription request or an update to a subscription {set.sub}: // update topic metadata cache, save/update subs, reply to the caller as {ctrl} message, generate an invite func (t *Topic) replySetSub(h *Hub, sess *Session, set *MsgClientSet) error { now := time.Now().UTC().Round(time.Millisecond) var uid types.Uid if uid = types.ParseUserId(set.Sub.User); uid.IsZero() && set.Sub.User != "" { // Invalid user ID sess.queueOut(ErrMalformed(set.Id, set.Topic, now)) return errors.New("invalid user id") } // if set.User is not set, request is for the current user if !uid.IsZero() { uid = sess.uid } if uid == sess.uid { return t.requestSub(h, sess, set.Id, set.Sub.Mode, set.Sub.Info, nil, false) } else { return t.approveSub(h, sess, uid, set) } }
// Authenticate func (s *Session) login(msg *ClientComMessage) { var uid types.Uid var err error if !s.uid.IsZero() { s.QueueOut(ErrAlreadyAuthenticated(msg.Login.Id, "", msg.timestamp)) return } else if msg.Login.Scheme == "" || msg.Login.Scheme == "basic" { uid, err = store.Users.Login(msg.Login.Scheme, msg.Login.Secret) if err != nil { // DB error log.Println(err) s.QueueOut(ErrUnknown(msg.Login.Id, "", msg.timestamp)) return } else if uid.IsZero() { // Invalid login or password s.QueueOut(ErrAuthFailed(msg.Login.Id, "", msg.timestamp)) return } } else { s.QueueOut(ErrAuthUnknownScheme(msg.Login.Id, "", msg.timestamp)) return } s.uid = uid s.userAgent = msg.Login.UserAgent s.QueueOut(&ServerComMessage{Ctrl: &MsgServerCtrl{ Id: msg.Login.Id, Code: http.StatusOK, Text: http.StatusText(http.StatusOK), Timestamp: msg.timestamp, Params: map[string]interface{}{"uid": uid.UserId()}}}) }