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 }
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 }