func (c *Controller) NewUser() (string, error) { txType := "NewUser" txTypeId := utils.TypeInt(txType) timeNow := utils.Time() param := utils.ParamType{X: 176, Y: 100, Width: 100, Bg_path: "static/img/k_bg.png"} refPhotos := make(map[int64][]string) myRefsKeys := make(map[int64]map[string]string) if c.SessRestricted == 0 { join := c.MyPrefix + `my_new_users.user_id` if c.ConfigIni["db_type"] == "sqlite" || c.ConfigIni["db_type"] == "postgresql" { join = `"` + c.MyPrefix + `my_new_users".user_id` } rows, err := c.Query(c.FormatQuery(` SELECT users.user_id, private_key, log_id FROM ` + c.MyPrefix + `my_new_users LEFT JOIN users ON users.user_id = ` + join + ` WHERE status = 'approved' `)) if err != nil { return "", utils.ErrInfo(err) } defer rows.Close() for rows.Next() { var user_id, log_id int64 var private_key string err = rows.Scan(&user_id, &private_key, &log_id) if err != nil { return "", utils.ErrInfo(err) } // проверим, не сменил ли уже юзер свой ключ StrUserId := utils.Int64ToStr(user_id) if log_id != 0 { myRefsKeys[user_id] = map[string]string{"user_id": StrUserId} } else { myRefsKeys[user_id] = map[string]string{"user_id": StrUserId, "private_key": private_key} md5 := string(utils.Md5(private_key)) kPath := *utils.Dir + "/public/" + md5[0:16] kPathPng := kPath + ".png" kPathTxt := kPath + ".txt" if _, err := os.Stat(kPathPng); os.IsNotExist(err) { privKey := strings.Replace(private_key, "-----BEGIN RSA PRIVATE KEY-----", "", -1) privKey = strings.Replace(privKey, "-----END RSA PRIVATE KEY-----", "", -1) _, err = utils.KeyToImg(privKey, kPathPng, user_id, c.TimeFormat, param) if err != nil { return "", utils.ErrInfo(err) } err := ioutil.WriteFile(kPathTxt, []byte(privKey), 0644) if err != nil { return "", utils.ErrInfo(err) } /*$gd = key_to_img($private_key, $param, $row['user_id']); imagepng($gd, $k_path_png); file_put_contents($k_path_txt, trim($private_key));*/ } } } } refs := make(map[int64]map[int64]float64) // инфа по рефам юзера rows, err := c.Query(c.FormatQuery(` SELECT referral, sum(amount) as amount, currency_id FROM referral_stats WHERE user_id = ? GROUP BY currency_id, referral `), c.SessUserId) if err != nil { return "", utils.ErrInfo(err) } defer rows.Close() for rows.Next() { var referral, currency_id int64 var amount float64 err = rows.Scan(&referral, &amount, ¤cy_id) if err != nil { return "", utils.ErrInfo(err) } refs[referral] = map[int64]float64{currency_id: amount} } myRefsAmounts := make(map[int64]myRefsType) for refUserId, refData := range refs { data, err := c.OneRow("SELECT * FROM miners_data WHERE user_id = ?", refUserId).String() if err != nil { return "", utils.ErrInfo(err) } // получим ID майнеров, у которых лежат фото нужного нам юзера if len(data) == 0 { continue } minersIds := utils.GetMinersKeepers(data["photo_block_id"], data["photo_max_miner_id"], data["miners_keepers"], true) if len(minersIds) > 0 { hosts, err := c.GetList("SELECT http_host FROM miners_data WHERE miner_id IN (" + utils.JoinInts(minersIds, ",") + ")").String() if err != nil { return "", utils.ErrInfo(err) } myRefsAmounts[refUserId] = myRefsType{Amounts: refData, Hosts: hosts} refPhotos[refUserId] = hosts } } myRefs := make(map[int64]myRefsType) for refUserId, refData := range myRefsAmounts { myRefs[refUserId] = refData } for refUserId, refData := range myRefsKeys { md5 := string(utils.Md5(refData["private_key"])) myRefs[refUserId] = myRefsType{Key: refData["private_key"], KeyUrl: c.NodeConfig["pool_url"] + "public/" + md5[0:16]} } /* * Общая стата по рефам */ globalRefs := make(map[int64]globalRefsType) // берем лидеров по USD rows, err = c.Query(c.FormatQuery(` SELECT user_id, sum(amount) as amount FROM referral_stats WHERE currency_id = 72 GROUP BY user_id ORDER BY amount DESC `)) if err != nil { return "", utils.ErrInfo(err) } defer rows.Close() for rows.Next() { var user_id int64 var amount float64 err = rows.Scan(&user_id, &amount) if err != nil { return "", utils.ErrInfo(err) } // вся прибыль с рефов у данного юзера refAmounts, err := c.GetAll(` SELECT ROUND(sum(amount)) as amount, currency_id FROM referral_stats WHERE user_id = ? GROUP BY currency_id `, -1, user_id) if err != nil { return "", utils.ErrInfo(err) } data, err := c.OneRow("SELECT * FROM miners_data WHERE user_id = ?", user_id).String() if err != nil { return "", utils.ErrInfo(err) } // получим ID майнеров, у которых лежат фото нужного нам юзера minersIds := utils.GetMinersKeepers(data["photo_block_id"], data["photo_max_miner_id"], data["miners_keepers"], true) hosts, err := c.GetList("SELECT http_host FROM miners_data WHERE miner_id IN (" + utils.JoinInts(minersIds, ",") + ")").String() if err != nil { return "", utils.ErrInfo(err) } globalRefs[user_id] = globalRefsType{Amounts: refAmounts, Hosts: hosts} refPhotos[user_id] = hosts } lastTx, err := c.GetLastTx(c.SessUserId, utils.TypesToIds([]string{"NewUser"}), 1, c.TimeFormat) lastTxFormatted := "" if len(lastTx) > 0 { lastTxFormatted, _ = utils.MakeLastTx(lastTx, c.Lang) } TemplateStr, err := makeTemplate("new_user", "newUser", &newUserPage{ Alert: c.Alert, Lang: c.Lang, CountSignArr: c.CountSignArr, ShowSignData: c.ShowSignData, UserId: c.SessUserId, TimeNow: timeNow, TxType: txType, TxTypeId: txTypeId, SignData: "", LastTxFormatted: lastTxFormatted, MyRefs: myRefs, GlobalRefs: globalRefs, CurrencyList: c.CurrencyList, RefPhotos: refPhotos, PoolUrl: c.NodeConfig["pool_url"]}) if err != nil { return "", utils.ErrInfo(err) } return TemplateStr, nil }
func (c *Controller) DcoinKey() (string, error) { var err error c.r.ParseForm() // на IOS/Android запрос ключа идет без сессии из objective C (UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://127.0.0.1:8089/ajax?controllerName=dcoinKey&ios=1"]]];) local := false // чтобы по локалке никто не украл приватный ключ if ok, _ := regexp.MatchString(`^(\:\:)|(127\.0\.0\.1)(:[0-9]+)?$`, c.r.RemoteAddr); ok { local = true } if utils.Mobile() && c.SessUserId == 0 && !local { return "", utils.ErrInfo(errors.New("Not local request from " + c.r.RemoteAddr)) } privKey := "" if len(c.r.FormValue("first")) > 0 { privKey, err = c.Single(`SELECT private_key FROM ` + c.MyPrefix + `my_keys WHERE status='my_pending'`).String() if err != nil { return "", utils.ErrInfo(err) } } else { privKey, _ = utils.GenKeys() } paramNoPass := utils.ParamType{X: 176, Y: 100, Width: 100, Bg_path: "static/img/k_bg.png"} paramPass := utils.ParamType{X: 167, Y: 93, Width: 118, Bg_path: "static/img/k_bg_pass.png"} var param utils.ParamType var privateKey string if len(c.r.FormValue("password")) > 0 { privateKey_, err := utils.Encrypt(utils.Md5(c.r.FormValue("password")), []byte(privKey)) privateKey = base64.StdEncoding.EncodeToString(privateKey_) if err != nil { return "", utils.ErrInfo(err) } param = paramPass } else { privateKey = strings.Replace(privKey, "-----BEGIN RSA PRIVATE KEY-----", "", -1) privateKey = strings.Replace(privateKey, "-----END RSA PRIVATE KEY-----", "", -1) param = paramNoPass } ios := false if ok, _ := regexp.MatchString("(iPod|iPhone|iPad)", c.r.UserAgent()); ok { ios = true } if len(c.r.FormValue("ios")) > 0 { ios = true } if ios || utils.Android() { buffer, err := utils.KeyToImg(privateKey, "", c.SessUserId, c.TimeFormat, param) if err != nil { return "", utils.ErrInfo(err) } c.w.Header().Set("Content-Type", "image/png") c.w.Header().Set("Content-Length", utils.IntToStr(len(buffer.Bytes()))) c.w.Header().Set("Content-Disposition", `attachment; filename="Dcoin-private-key-`+utils.Int64ToStr(c.SessUserId)+`.png"`) if _, err := c.w.Write(buffer.Bytes()); err != nil { return "", utils.ErrInfo(errors.New("unable to write image")) } } else { c.w.Header().Set("Content-Type", "text/plain") c.w.Header().Set("Content-Length", utils.IntToStr(len(privateKey))) c.w.Header().Set("Content-Disposition", `attachment; filename="Dcoin-private-key-`+utils.Int64ToStr(c.SessUserId)+`.txt"`) if _, err := c.w.Write([]byte(privateKey)); err != nil { return "", utils.ErrInfo(errors.New("unable to write text")) } } return "", nil }