Beispiel #1
0
func EmailLogin(c context.Context, email string, password string) (*LoginResult, error) {
	a, err := persistence.GetAccountByEmail(email)
	if err != nil {
		log.Error(email, password)
		return nil, ErrServer
	}

	if a == nil {
		log.Error(email, password)
		return nil, ErrLogin
	}

	password = crypt.SHA1(password + fmt.Sprint(a.ID))
	if password != a.Password {
		return nil, ErrLogin
	}

	rs := &LoginResult{}
	rs.Account = &Account{}
	runtime.CopyFields(rs.Account, a)
	rs.LoginToken = a.LoginToken
	rs.Sid = GenerateSessionID(a.ID)
	return rs, nil

}
Beispiel #2
0
func MobileRegister(c context.Context, regInfo *MobileRegInfo) (*LoginResult, error) {
	var e error
	switch {
	case !validation.IsMobile(regInfo.Mobile):
		e = errors.New("invalid mobile")
	case !checkCaptcha(c, regInfo.Mobile, regInfo.Captcha):
		e = errors.New("invalid captcha")
	case persistence.IsDupMobile(regInfo.Mobile, 0):
		e = ErrDupMobile
	case len(regInfo.Nick) < 2:
		e = errors.New("invalid nick")
	case persistence.IsDupNick(regInfo.Nick, 0):
		e = ErrDupNick
	case len(regInfo.Birthdate) > 0 && !validation.IsBirthdate(regInfo.Birthdate):
		e = errors.New("invalid birthdate")
	case len(regInfo.Password) == 0:
		e = errors.New("no password")
	}

	if e != nil {
		log.Error(e)
		return nil, e
	}

	a := &persistence.Account{}
	a.ID = types.NewID()
	a.Nick = regInfo.Nick
	a.Mobile = regInfo.Mobile
	a.Password = crypt.SHA1(regInfo.Password + fmt.Sprint(a.ID))
	a.Birthdate = regInfo.Birthdate
	a.Gender = regInfo.Gender
	a.Avatar = regInfo.Avatar
	a.LoginToken = crypt.SHA1(a.Password + fmt.Sprint(a.ID))
	e = persistence.InsertAccount(a)
	if e != nil {
		log.Error(e)
		return nil, ErrServer
	}

	rs := &LoginResult{}
	rs.Account = &Account{}
	runtime.CopyFields(rs.Account, a)
	rs.LoginToken = a.LoginToken
	rs.Sid = GenerateSessionID(a.ID)
	return rs, nil
}
Beispiel #3
0
func OpenLogin(c context.Context, oa *OpenAccount) (*LoginResult, error) {
	switch {
	case len(oa.Name) == 0:
		return nil, errors.New("invalid name")
	case len(oa.OpenID) == 0:
		return nil, errors.New("no open_id")
	case len(oa.AccessToken) == 0:
		return nil, errors.New("no access_token")
	case len(oa.RefreshToken) == 0:
		return nil, errors.New("no refresh_token")
	case oa.ExpiredAt < time.Now().Unix():
		return nil, errors.New("invalid expired_at")
	}

	openID := fmt.Sprint(oa.Type) + "--" + oa.OpenID
	a, err := persistence.GetAccountByOpenID(openID)
	if err != nil {
		return nil, ErrServer
	}

	if a != nil {
		rs := &LoginResult{}
		rs.Account = &Account{}
		runtime.CopyFields(rs.Account, a)
		rs.LoginToken = a.LoginToken
		rs.Sid = GenerateSessionID(a.ID)
		return rs, nil
	}

	nick := oa.Name
	for i := 1; persistence.IsDupNick(nick, 0); i++ {
		nick = oa.Name + fmt.Sprint(i)
	}

	a = &persistence.Account{}
	a.ID = types.NewID()
	a.Nick = nick
	a.Avatar = oa.Avatar
	a.Gender = oa.Gender
	a.OpenID = openID
	a.Password = crypt.SHA1(oa.AccessToken + fmt.Sprint(a.ID))
	a.LoginToken = GenerateLoginToken(a.ID)
	err = persistence.InsertAccount(a)
	if err != nil {
		return nil, ErrServer
	}

	poa := &persistence.OpenAccount{}
	runtime.CopyFields(poa, oa)
	persistence.InsertOpenAccount(poa)

	rs := &LoginResult{}
	rs.Account = &Account{}
	runtime.CopyFields(rs.Account, a)
	rs.LoginToken = a.LoginToken
	rs.Sid = GenerateSessionID(a.ID)
	return rs, nil
}
Beispiel #4
0
func GenerateLoginToken(id types.ID) string {
	return crypt.SHA1(fmt.Sprint(id) + fmt.Sprint(time.Now().Unix()))
}
Beispiel #5
0
func GenerateSessionID(accountID types.ID) string {
	sid := crypt.SHA1(fmt.Sprint(accountID) + fmt.Sprint(time.Now().Unix()) + types.NewUUID())
	_cache.HSet("sid", sid, accountID, time.Minute*30)
	return sid
}