Esempio n. 1
0
func PutOAuthUser(mdb *Store, u *pb.OAuthUser) (*pb.OAuthUser, error) {
	key, v, err := GetOAuthUser(mdb, u.Provider, u.UserId)
	if err != nil {
		return nil, err
	}
	if v != nil {
		if u.Uuid != "" && v.Uuid != "" {
			uuid1, _ := uuid.FromString(u.Uuid)
			uuid2, _ := uuid.FromString(v.Uuid)
			if !uuid.Equal(uuid1, uuid2) {
				return nil, fmt.Errorf("user mismatch")
			}
		}
		if u.Uuid == "" {
			u.Uuid = v.Uuid
		}
	}

	bytes, err := proto.Marshal(u)
	if err != nil {
		return nil, err
	}

	// refresh OAuth User info to store
	err = mdb.Put(key.Bytes(), bytes)
	if err != nil {
		return nil, err
	}
	return u, nil
}
Esempio n. 2
0
func BindOAuthUser(mdb *Store, u *pb.OAuthUser) (*pb.OAuthUser, error) {
	var pt PrefixTable
	switch u.Provider {
	case "google":
		pt = TableOAuthGoogle
	case "twitter":
		pt = TableOAuthTwitter
	}

	key := NewMetaKey(pt, u.UserId)
	rawdata, err := mdb.Get(key.Bytes())
	if err != nil {
		return nil, err
	}

	// retrieve uuid
	if len(rawdata) == 0 {
		return nil, fmt.Errorf("No user data")
	}

	v := new(pb.OAuthUser)
	err = proto.Unmarshal(rawdata, v)
	if err != nil {
		return nil, err
	}
	// same bind
	if u.Uuid == v.Uuid {
		return v, nil
	}

	if v.Uuid != "" {
		return nil, fmt.Errorf("can not bind to another user.")
	}

	// first time bind
	v.Uuid = u.Uuid
	bytes, err := proto.Marshal(u)
	if err != nil {
		return nil, err
	}

	err = mdb.Put(key.Bytes(), bytes)
	if err != nil {
		return nil, err
	}
	return u, nil
}