Ejemplo n.º 1
0
func (w *Worker) PRCOTLVerify(otlv *hkp.OTLVerify) (result_code int) {
	//fmt.Println("prcotlv:raw otlv=", otlv)
	//fmt.Println("prcotlv otl=", otlv.OTLtext)
	/*

		1.Lookup otl_hash in verify DB >>if1
			2.if2>> Check weather it has been more than two days

				3. Show add screen with
						extra message (ur email id was detected in following request)
						show armor of the add request

						//ADD Button
							4.Set is_verified = true,veri_time=now
							again sends add request to PKS with armor data
						//CANCEL Button stops
							4.Set is_verified = false,veri_time=now

			5.else2>> Show message saying otl expiration
		6.else1>> Show message saying no such otl exists

	*/

	Temp_veri := []Veri_data{}

	veri := new(Veri_data)

	w.db.Select(&Temp_veri, `SELECT * FROM verify_email
		WHERE otl_hash=$1`, otlv.OTLtext)

	if len(Temp_veri) == 0 {
		result_code = OTLNotFound
		veri.Is_verified = false
		//fmt.Println("prc_otl_handler.go:No such OTL NOT FOUND in DB")
		//alr_verifAdd := new(hkp.Add)
		//aResp := new(AddResponse)
		keyCh := new(KeyChange)
		keyCh.ChangeMessage = "We are extremely Sorry but NO such Link Exists on this server"
		keyCh.Type = KeyNotChanged
		var changes []*KeyChange
		changes = append(changes, keyCh)
		otlv.Response() <- &AddResponse{Changes: changes}
	} else {
		*veri = Temp_veri[0]
		if veri.Expi_time.Before(time.Now()) {
			result_code = OTLExpired
			keyCh := new(KeyChange)
			keyCh.ChangeMessage = fmt.Sprintf("The link you have clicked has expired at %s", veri.Expi_time.Format(time.RFC850))
			keyCh.Type = KeyNotChanged
			var changes []*KeyChange
			changes = append(changes, keyCh)
			otlv.Response() <- &AddResponse{Changes: changes}
		} else if veri.Is_verified != true {
			//OTL has been found and it has not yet expired or verified
			result_code = OTLNotVerified
			//set isverified =true,verification time=now
			veri.Is_verified = true
			veri.Veri_time = time.Now()

			//Change isverified into DB

			if _, err := w.Begin(); err != nil {
				log.Println("OTL Verifier:Begining...", err)
				keyCh := new(KeyChange)
				keyCh.ChangeMessage = fmt.Sprintf("Problem at server.DB cant begin")
				keyCh.Type = KeyNotChanged
				var changes []*KeyChange
				changes = append(changes, keyCh)
				otlv.Response() <- &AddResponse{Changes: changes}
				return
			}
			w.tx.Execl(`UPDATE verify_email SET veri_time = $1,is_verified= $2
				WHERE otl_hash = $3`, veri.Veri_time, veri.Is_verified, veri.Otl_hash)
			if err := w.Commit(); err != nil {
				log.Println("OTL Verifier:Commiting...", err)
				keyCh := new(KeyChange)
				keyCh.ChangeMessage = fmt.Sprintf("Problem at server.DB cant commit")
				keyCh.Type = KeyNotChanged
				var changes []*KeyChange
				changes = append(changes, keyCh)
				otlv.Response() <- &AddResponse{Changes: changes}
				return
			}

			result_code = OTLVerified
			if veri.Operation == int16(1) {
				verifiedAdd := new(hkp.Add)
				verifiedAdd.Keytext = veri.Key_text
				verifiedAdd.Request = otlv.Request
				verifiedAdd.ShaOfTarget = veri.Hash_pubkey
				verifiedAdd.SetResponse(otlv.Response())
				w.Add(verifiedAdd)
			} else if veri.Operation == int16(2) {
				verifiedDelete := new(hkp.DeleteReq)
				verifiedDelete.EmailToDelete = veri.Pubkey_id
				verifiedDelete.KeyID = veri.Pubkey_id
				verifiedDelete.SetResponse(otlv.Response())
				verifiedDelete.Request = otlv.Request
				w.HandleDeleteReq(verifiedDelete)
			}
		} else if veri.Is_verified { //OTL is already verified
			//fmt.Println("prc_otl_handler.go: OTL is already verified")
			result_code = OTLAlereadyVerified
			//alr_verifAdd := new(hkp.Add)
			//			aResp := new(AddResponse)

			keyCh := new(KeyChange)
			keyCh.ChangeMessage = "The link you have clicked is already used once"
			keyCh.Type = KeyNotChanged
			var changes []*KeyChange
			changes = append(changes, keyCh)
			otlv.Response() <- &AddResponse{Changes: changes}
		}

	}

	/* TO Delete a key
	deleteString := otlv.OTLtext
	//tx := w.db.MustBegin()
	tx.Execl(`DELETE FROM openpgp_pubkey
				WHERE uuid = $1`, deleteString)
	//tx.Commit()
	//DELETE FROM table_name
	//WHERE some_column = some_value
	*/
	return

}