inbound.go 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631
  1. package service
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "strings"
  6. "time"
  7. "x-ui/database"
  8. "x-ui/database/model"
  9. "x-ui/logger"
  10. "x-ui/util/common"
  11. "x-ui/xray"
  12. "gorm.io/gorm"
  13. )
  14. type InboundService struct {
  15. xrayApi xray.XrayAPI
  16. }
  17. func (s *InboundService) GetInbounds(userId int) ([]*model.Inbound, error) {
  18. db := database.GetDB()
  19. var inbounds []*model.Inbound
  20. err := db.Model(model.Inbound{}).Preload("ClientStats").Where("user_id = ?", userId).Find(&inbounds).Error
  21. if err != nil && err != gorm.ErrRecordNotFound {
  22. return nil, err
  23. }
  24. return inbounds, nil
  25. }
  26. func (s *InboundService) GetAllInbounds() ([]*model.Inbound, error) {
  27. db := database.GetDB()
  28. var inbounds []*model.Inbound
  29. err := db.Model(model.Inbound{}).Preload("ClientStats").Find(&inbounds).Error
  30. if err != nil && err != gorm.ErrRecordNotFound {
  31. return nil, err
  32. }
  33. return inbounds, nil
  34. }
  35. func (s *InboundService) checkPortExist(port int, ignoreId int) (bool, error) {
  36. db := database.GetDB()
  37. db = db.Model(model.Inbound{}).Where("port = ?", port)
  38. if ignoreId > 0 {
  39. db = db.Where("id != ?", ignoreId)
  40. }
  41. var count int64
  42. err := db.Count(&count).Error
  43. if err != nil {
  44. return false, err
  45. }
  46. return count > 0, nil
  47. }
  48. func (s *InboundService) GetClients(inbound *model.Inbound) ([]model.Client, error) {
  49. settings := map[string][]model.Client{}
  50. json.Unmarshal([]byte(inbound.Settings), &settings)
  51. if settings == nil {
  52. return nil, fmt.Errorf("setting is null")
  53. }
  54. clients := settings["clients"]
  55. if clients == nil {
  56. return nil, nil
  57. }
  58. return clients, nil
  59. }
  60. func (s *InboundService) getAllEmails() ([]string, error) {
  61. db := database.GetDB()
  62. var emails []string
  63. err := db.Raw(`
  64. SELECT JSON_EXTRACT(client.value, '$.email')
  65. FROM inbounds,
  66. JSON_EACH(JSON_EXTRACT(inbounds.settings, '$.clients')) AS client
  67. `).Scan(&emails).Error
  68. if err != nil {
  69. return nil, err
  70. }
  71. return emails, nil
  72. }
  73. func (s *InboundService) contains(slice []string, str string) bool {
  74. for _, s := range slice {
  75. if s == str {
  76. return true
  77. }
  78. }
  79. return false
  80. }
  81. func (s *InboundService) checkEmailsExistForClients(clients []model.Client) (string, error) {
  82. allEmails, err := s.getAllEmails()
  83. if err != nil {
  84. return "", err
  85. }
  86. var emails []string
  87. for _, client := range clients {
  88. if client.Email != "" {
  89. if s.contains(emails, client.Email) {
  90. return client.Email, nil
  91. }
  92. if s.contains(allEmails, client.Email) {
  93. return client.Email, nil
  94. }
  95. emails = append(emails, client.Email)
  96. }
  97. }
  98. return "", nil
  99. }
  100. func (s *InboundService) checkEmailExistForInbound(inbound *model.Inbound) (string, error) {
  101. clients, err := s.GetClients(inbound)
  102. if err != nil {
  103. return "", err
  104. }
  105. allEmails, err := s.getAllEmails()
  106. if err != nil {
  107. return "", err
  108. }
  109. var emails []string
  110. for _, client := range clients {
  111. if client.Email != "" {
  112. if s.contains(emails, client.Email) {
  113. return client.Email, nil
  114. }
  115. if s.contains(allEmails, client.Email) {
  116. return client.Email, nil
  117. }
  118. emails = append(emails, client.Email)
  119. }
  120. }
  121. return "", nil
  122. }
  123. func (s *InboundService) AddInbound(inbound *model.Inbound) (*model.Inbound, bool, error) {
  124. exist, err := s.checkPortExist(inbound.Port, 0)
  125. if err != nil {
  126. return inbound, false, err
  127. }
  128. if exist {
  129. return inbound, false, common.NewError("Port already exists:", inbound.Port)
  130. }
  131. existEmail, err := s.checkEmailExistForInbound(inbound)
  132. if err != nil {
  133. return inbound, false, err
  134. }
  135. if existEmail != "" {
  136. return inbound, false, common.NewError("Duplicate email:", existEmail)
  137. }
  138. clients, err := s.GetClients(inbound)
  139. if err != nil {
  140. return inbound, false, err
  141. }
  142. db := database.GetDB()
  143. tx := db.Begin()
  144. defer func() {
  145. if err == nil {
  146. tx.Commit()
  147. } else {
  148. tx.Rollback()
  149. }
  150. }()
  151. err = tx.Save(inbound).Error
  152. if err == nil {
  153. for _, client := range clients {
  154. s.AddClientStat(tx, inbound.Id, &client)
  155. }
  156. }
  157. needRestart := false
  158. if inbound.Enable {
  159. s.xrayApi.Init(p.GetAPIPort())
  160. inboundJson, err1 := json.MarshalIndent(inbound.GenXrayInboundConfig(), "", " ")
  161. if err1 != nil {
  162. logger.Debug("Unable to marshal inbound config:", err1)
  163. }
  164. err1 = s.xrayApi.AddInbound(inboundJson)
  165. if err1 == nil {
  166. logger.Debug("New inbound added by api:", inbound.Tag)
  167. } else {
  168. logger.Debug("Unable to add inbound by api:", err1)
  169. needRestart = true
  170. }
  171. s.xrayApi.Close()
  172. }
  173. return inbound, needRestart, err
  174. }
  175. func (s *InboundService) AddInbounds(inbounds []*model.Inbound) error {
  176. for _, inbound := range inbounds {
  177. exist, err := s.checkPortExist(inbound.Port, 0)
  178. if err != nil {
  179. return err
  180. }
  181. if exist {
  182. return common.NewError("Port already exists:", inbound.Port)
  183. }
  184. }
  185. db := database.GetDB()
  186. tx := db.Begin()
  187. var err error
  188. defer func() {
  189. if err == nil {
  190. tx.Commit()
  191. } else {
  192. tx.Rollback()
  193. }
  194. }()
  195. for _, inbound := range inbounds {
  196. err = tx.Save(inbound).Error
  197. if err != nil {
  198. return err
  199. }
  200. }
  201. return nil
  202. }
  203. func (s *InboundService) DelInbound(id int) (bool, error) {
  204. db := database.GetDB()
  205. var tag string
  206. needRestart := false
  207. result := db.Model(model.Inbound{}).Select("tag").Where("id = ? and enable = ?", id, true).First(&tag)
  208. if result.Error == nil {
  209. s.xrayApi.Init(p.GetAPIPort())
  210. err1 := s.xrayApi.DelInbound(tag)
  211. if err1 == nil {
  212. logger.Debug("Inbound deleted by api:", tag)
  213. } else {
  214. logger.Debug("Unable to delete inbound by api:", err1)
  215. needRestart = true
  216. }
  217. s.xrayApi.Close()
  218. } else {
  219. logger.Debug("No enabled inbound founded to removing by api", tag)
  220. }
  221. // Delete client traffics of inbounds
  222. err := db.Where("inbound_id = ?", id).Delete(xray.ClientTraffic{}).Error
  223. if err != nil {
  224. return false, err
  225. }
  226. inbound, err := s.GetInbound(id)
  227. if err != nil {
  228. return false, err
  229. }
  230. clients, err := s.GetClients(inbound)
  231. if err != nil {
  232. return false, err
  233. }
  234. for _, client := range clients {
  235. err := s.DelClientIPs(db, client.Email)
  236. if err != nil {
  237. return false, err
  238. }
  239. }
  240. return needRestart, db.Delete(model.Inbound{}, id).Error
  241. }
  242. func (s *InboundService) GetInbound(id int) (*model.Inbound, error) {
  243. db := database.GetDB()
  244. inbound := &model.Inbound{}
  245. err := db.Model(model.Inbound{}).First(inbound, id).Error
  246. if err != nil {
  247. return nil, err
  248. }
  249. return inbound, nil
  250. }
  251. func (s *InboundService) UpdateInbound(inbound *model.Inbound) (*model.Inbound, bool, error) {
  252. exist, err := s.checkPortExist(inbound.Port, inbound.Id)
  253. if err != nil {
  254. return inbound, false, err
  255. }
  256. if exist {
  257. return inbound, false, common.NewError("Port already exists:", inbound.Port)
  258. }
  259. oldInbound, err := s.GetInbound(inbound.Id)
  260. if err != nil {
  261. return inbound, false, err
  262. }
  263. tag := oldInbound.Tag
  264. err = s.updateClientTraffics(oldInbound, inbound)
  265. if err != nil {
  266. return inbound, false, err
  267. }
  268. oldInbound.Up = inbound.Up
  269. oldInbound.Down = inbound.Down
  270. oldInbound.Total = inbound.Total
  271. oldInbound.Remark = inbound.Remark
  272. oldInbound.Enable = inbound.Enable
  273. oldInbound.ExpiryTime = inbound.ExpiryTime
  274. oldInbound.Listen = inbound.Listen
  275. oldInbound.Port = inbound.Port
  276. oldInbound.Protocol = inbound.Protocol
  277. oldInbound.Settings = inbound.Settings
  278. oldInbound.StreamSettings = inbound.StreamSettings
  279. oldInbound.Sniffing = inbound.Sniffing
  280. oldInbound.Tag = fmt.Sprintf("inbound-%v", inbound.Port)
  281. needRestart := false
  282. s.xrayApi.Init(p.GetAPIPort())
  283. err1 := s.xrayApi.DelInbound(tag)
  284. if err1 != nil {
  285. logger.Debug("Unable to delete old inbound by api:", err1)
  286. needRestart = true
  287. } else {
  288. logger.Debug("Old inbound deleted by api:", tag)
  289. if inbound.Enable {
  290. inboundJson, err2 := json.MarshalIndent(oldInbound.GenXrayInboundConfig(), "", " ")
  291. if err2 != nil {
  292. logger.Debug("Unable to marshal updated inbound config:", err2)
  293. needRestart = true
  294. } else {
  295. err2 = s.xrayApi.AddInbound(inboundJson)
  296. if err2 == nil {
  297. logger.Debug("Updated inbound added by api:", oldInbound.Tag)
  298. } else {
  299. logger.Debug("Unable to update inbound by api:", err2)
  300. needRestart = true
  301. }
  302. }
  303. }
  304. }
  305. s.xrayApi.Close()
  306. db := database.GetDB()
  307. return inbound, needRestart, db.Save(oldInbound).Error
  308. }
  309. func (s *InboundService) updateClientTraffics(oldInbound *model.Inbound, newInbound *model.Inbound) error {
  310. oldClients, err := s.GetClients(oldInbound)
  311. if err != nil {
  312. return err
  313. }
  314. newClients, err := s.GetClients(newInbound)
  315. if err != nil {
  316. return err
  317. }
  318. db := database.GetDB()
  319. tx := db.Begin()
  320. defer func() {
  321. if err != nil {
  322. tx.Rollback()
  323. } else {
  324. tx.Commit()
  325. }
  326. }()
  327. var emailExists bool
  328. for _, oldClient := range oldClients {
  329. emailExists = false
  330. for _, newClient := range newClients {
  331. if oldClient.Email == newClient.Email {
  332. emailExists = true
  333. break
  334. }
  335. }
  336. if !emailExists {
  337. err = s.DelClientStat(tx, oldClient.Email)
  338. if err != nil {
  339. return err
  340. }
  341. }
  342. }
  343. for _, newClient := range newClients {
  344. emailExists = false
  345. for _, oldClient := range oldClients {
  346. if newClient.Email == oldClient.Email {
  347. emailExists = true
  348. break
  349. }
  350. }
  351. if !emailExists {
  352. err = s.AddClientStat(tx, oldInbound.Id, &newClient)
  353. if err != nil {
  354. return err
  355. }
  356. }
  357. }
  358. return nil
  359. }
  360. func (s *InboundService) AddInboundClient(data *model.Inbound) (bool, error) {
  361. clients, err := s.GetClients(data)
  362. if err != nil {
  363. return false, err
  364. }
  365. var settings map[string]interface{}
  366. err = json.Unmarshal([]byte(data.Settings), &settings)
  367. if err != nil {
  368. return false, err
  369. }
  370. interfaceClients := settings["clients"].([]interface{})
  371. existEmail, err := s.checkEmailsExistForClients(clients)
  372. if err != nil {
  373. return false, err
  374. }
  375. if existEmail != "" {
  376. return false, common.NewError("Duplicate email:", existEmail)
  377. }
  378. oldInbound, err := s.GetInbound(data.Id)
  379. if err != nil {
  380. return false, err
  381. }
  382. var oldSettings map[string]interface{}
  383. err = json.Unmarshal([]byte(oldInbound.Settings), &oldSettings)
  384. if err != nil {
  385. return false, err
  386. }
  387. oldClients := oldSettings["clients"].([]interface{})
  388. oldClients = append(oldClients, interfaceClients...)
  389. oldSettings["clients"] = oldClients
  390. newSettings, err := json.MarshalIndent(oldSettings, "", " ")
  391. if err != nil {
  392. return false, err
  393. }
  394. oldInbound.Settings = string(newSettings)
  395. db := database.GetDB()
  396. tx := db.Begin()
  397. defer func() {
  398. if err != nil {
  399. tx.Rollback()
  400. } else {
  401. tx.Commit()
  402. }
  403. }()
  404. needRestart := false
  405. s.xrayApi.Init(p.GetAPIPort())
  406. for _, client := range clients {
  407. if len(client.Email) > 0 {
  408. s.AddClientStat(tx, data.Id, &client)
  409. if client.Enable {
  410. cipher := ""
  411. if oldInbound.Protocol == "shadowsocks" {
  412. cipher = oldSettings["method"].(string)
  413. }
  414. err1 := s.xrayApi.AddUser(string(oldInbound.Protocol), oldInbound.Tag, map[string]interface{}{
  415. "email": client.Email,
  416. "id": client.ID,
  417. "flow": client.Flow,
  418. "password": client.Password,
  419. "cipher": cipher,
  420. })
  421. if err1 == nil {
  422. logger.Debug("Client added by api:", client.Email)
  423. } else {
  424. logger.Debug("Error in adding client by api:", err1)
  425. needRestart = true
  426. }
  427. }
  428. } else {
  429. needRestart = true
  430. }
  431. }
  432. s.xrayApi.Close()
  433. return needRestart, tx.Save(oldInbound).Error
  434. }
  435. func (s *InboundService) DelInboundClient(inboundId int, clientId string) (bool, error) {
  436. oldInbound, err := s.GetInbound(inboundId)
  437. if err != nil {
  438. logger.Error("Load Old Data Error")
  439. return false, err
  440. }
  441. var settings map[string]interface{}
  442. err = json.Unmarshal([]byte(oldInbound.Settings), &settings)
  443. if err != nil {
  444. return false, err
  445. }
  446. email := ""
  447. client_key := "id"
  448. if oldInbound.Protocol == "trojan" {
  449. client_key = "password"
  450. }
  451. if oldInbound.Protocol == "shadowsocks" {
  452. client_key = "email"
  453. }
  454. inerfaceClients := settings["clients"].([]interface{})
  455. var newClients []interface{}
  456. for _, client := range inerfaceClients {
  457. c := client.(map[string]interface{})
  458. c_id := c[client_key].(string)
  459. if c_id == clientId {
  460. email = c["email"].(string)
  461. } else {
  462. newClients = append(newClients, client)
  463. }
  464. }
  465. settings["clients"] = newClients
  466. newSettings, err := json.MarshalIndent(settings, "", " ")
  467. if err != nil {
  468. return false, err
  469. }
  470. oldInbound.Settings = string(newSettings)
  471. db := database.GetDB()
  472. err = s.DelClientStat(db, email)
  473. if err != nil {
  474. logger.Error("Delete stats Data Error")
  475. return false, err
  476. }
  477. err = s.DelClientIPs(db, email)
  478. if err != nil {
  479. logger.Error("Error in delete client IPs")
  480. return false, err
  481. }
  482. needRestart := false
  483. if len(email) > 0 {
  484. s.xrayApi.Init(p.GetAPIPort())
  485. err1 := s.xrayApi.RemoveUser(oldInbound.Tag, email)
  486. if err1 == nil {
  487. logger.Debug("Client deleted by api:", email)
  488. needRestart = false
  489. } else {
  490. logger.Debug("Unable to del client by api:", err1)
  491. needRestart = true
  492. }
  493. s.xrayApi.Close()
  494. }
  495. return needRestart, db.Save(oldInbound).Error
  496. }
  497. func (s *InboundService) UpdateInboundClient(data *model.Inbound, clientId string) (bool, error) {
  498. clients, err := s.GetClients(data)
  499. if err != nil {
  500. return false, err
  501. }
  502. var settings map[string]interface{}
  503. err = json.Unmarshal([]byte(data.Settings), &settings)
  504. if err != nil {
  505. return false, err
  506. }
  507. inerfaceClients := settings["clients"].([]interface{})
  508. oldInbound, err := s.GetInbound(data.Id)
  509. if err != nil {
  510. return false, err
  511. }
  512. oldClients, err := s.GetClients(oldInbound)
  513. if err != nil {
  514. return false, err
  515. }
  516. oldEmail := ""
  517. clientIndex := 0
  518. for index, oldClient := range oldClients {
  519. oldClientId := ""
  520. if oldInbound.Protocol == "trojan" {
  521. oldClientId = oldClient.Password
  522. } else if oldInbound.Protocol == "shadowsocks" {
  523. oldClientId = oldClient.Email
  524. } else {
  525. oldClientId = oldClient.ID
  526. }
  527. if clientId == oldClientId {
  528. oldEmail = oldClient.Email
  529. clientIndex = index
  530. break
  531. }
  532. }
  533. if len(clients[0].Email) > 0 && clients[0].Email != oldEmail {
  534. existEmail, err := s.checkEmailsExistForClients(clients)
  535. if err != nil {
  536. return false, err
  537. }
  538. if existEmail != "" {
  539. return false, common.NewError("Duplicate email:", existEmail)
  540. }
  541. }
  542. var oldSettings map[string]interface{}
  543. err = json.Unmarshal([]byte(oldInbound.Settings), &oldSettings)
  544. if err != nil {
  545. return false, err
  546. }
  547. settingsClients := oldSettings["clients"].([]interface{})
  548. settingsClients[clientIndex] = inerfaceClients[0]
  549. oldSettings["clients"] = settingsClients
  550. newSettings, err := json.MarshalIndent(oldSettings, "", " ")
  551. if err != nil {
  552. return false, err
  553. }
  554. oldInbound.Settings = string(newSettings)
  555. db := database.GetDB()
  556. tx := db.Begin()
  557. defer func() {
  558. if err != nil {
  559. tx.Rollback()
  560. } else {
  561. tx.Commit()
  562. }
  563. }()
  564. if len(clients[0].Email) > 0 {
  565. if len(oldEmail) > 0 {
  566. err = s.UpdateClientStat(oldEmail, &clients[0])
  567. if err != nil {
  568. return false, err
  569. }
  570. err = s.UpdateClientIPs(tx, oldEmail, clients[0].Email)
  571. if err != nil {
  572. return false, err
  573. }
  574. } else {
  575. s.AddClientStat(tx, data.Id, &clients[0])
  576. }
  577. } else {
  578. err = s.DelClientStat(tx, oldEmail)
  579. if err != nil {
  580. return false, err
  581. }
  582. err = s.DelClientIPs(tx, oldEmail)
  583. if err != nil {
  584. return false, err
  585. }
  586. }
  587. needRestart := false
  588. if len(oldEmail) > 0 {
  589. s.xrayApi.Init(p.GetAPIPort())
  590. s.xrayApi.RemoveUser(oldInbound.Tag, oldEmail)
  591. if clients[0].Enable {
  592. cipher := ""
  593. if oldInbound.Protocol == "shadowsocks" {
  594. cipher = oldSettings["method"].(string)
  595. }
  596. err1 := s.xrayApi.AddUser(string(oldInbound.Protocol), oldInbound.Tag, map[string]interface{}{
  597. "email": clients[0].Email,
  598. "id": clients[0].ID,
  599. "flow": clients[0].Flow,
  600. "password": clients[0].Password,
  601. "cipher": cipher,
  602. })
  603. if err1 == nil {
  604. logger.Debug("Client edited by api:", clients[0].Email)
  605. } else {
  606. logger.Debug("Error in adding client by api:", err1)
  607. needRestart = true
  608. }
  609. } else {
  610. logger.Debug("Client disabled by api:", clients[0].Email)
  611. }
  612. s.xrayApi.Close()
  613. } else {
  614. logger.Debug("Client old email not found")
  615. needRestart = true
  616. }
  617. return needRestart, tx.Save(oldInbound).Error
  618. }
  619. func (s *InboundService) AddTraffic(traffics []*xray.Traffic) error {
  620. if len(traffics) == 0 {
  621. return nil
  622. }
  623. // Update traffics in a single transaction
  624. err := database.GetDB().Transaction(func(tx *gorm.DB) error {
  625. for _, traffic := range traffics {
  626. if traffic.IsInbound {
  627. update := tx.Model(&model.Inbound{}).Where("tag = ?", traffic.Tag).
  628. Updates(map[string]interface{}{
  629. "up": gorm.Expr("up + ?", traffic.Up),
  630. "down": gorm.Expr("down + ?", traffic.Down),
  631. })
  632. if update.Error != nil {
  633. return update.Error
  634. }
  635. }
  636. }
  637. return nil
  638. })
  639. return err
  640. }
  641. func (s *InboundService) AddClientTraffic(traffics []*xray.ClientTraffic) (err error) {
  642. if len(traffics) == 0 {
  643. return nil
  644. }
  645. db := database.GetDB()
  646. tx := db.Begin()
  647. defer func() {
  648. if err != nil {
  649. tx.Rollback()
  650. } else {
  651. tx.Commit()
  652. }
  653. }()
  654. emails := make([]string, 0, len(traffics))
  655. for _, traffic := range traffics {
  656. emails = append(emails, traffic.Email)
  657. }
  658. dbClientTraffics := make([]*xray.ClientTraffic, 0, len(traffics))
  659. err = db.Model(xray.ClientTraffic{}).Where("email IN (?)", emails).Find(&dbClientTraffics).Error
  660. if err != nil {
  661. return err
  662. }
  663. // Avoid empty slice error
  664. if len(dbClientTraffics) == 0 {
  665. return nil
  666. }
  667. dbClientTraffics, err = s.adjustTraffics(tx, dbClientTraffics)
  668. if err != nil {
  669. return err
  670. }
  671. for dbTraffic_index := range dbClientTraffics {
  672. for traffic_index := range traffics {
  673. if dbClientTraffics[dbTraffic_index].Email == traffics[traffic_index].Email {
  674. dbClientTraffics[dbTraffic_index].Up += traffics[traffic_index].Up
  675. dbClientTraffics[dbTraffic_index].Down += traffics[traffic_index].Down
  676. break
  677. }
  678. }
  679. }
  680. err = tx.Save(dbClientTraffics).Error
  681. if err != nil {
  682. logger.Warning("AddClientTraffic update data ", err)
  683. }
  684. return nil
  685. }
  686. func (s *InboundService) adjustTraffics(tx *gorm.DB, dbClientTraffics []*xray.ClientTraffic) ([]*xray.ClientTraffic, error) {
  687. inboundIds := make([]int, 0, len(dbClientTraffics))
  688. for _, dbClientTraffic := range dbClientTraffics {
  689. if dbClientTraffic.ExpiryTime < 0 {
  690. inboundIds = append(inboundIds, dbClientTraffic.InboundId)
  691. }
  692. }
  693. if len(inboundIds) > 0 {
  694. var inbounds []*model.Inbound
  695. err := tx.Model(model.Inbound{}).Where("id IN (?)", inboundIds).Find(&inbounds).Error
  696. if err != nil {
  697. return nil, err
  698. }
  699. for inbound_index := range inbounds {
  700. settings := map[string]interface{}{}
  701. json.Unmarshal([]byte(inbounds[inbound_index].Settings), &settings)
  702. clients, ok := settings["clients"].([]interface{})
  703. if ok {
  704. var newClients []interface{}
  705. for client_index := range clients {
  706. c := clients[client_index].(map[string]interface{})
  707. for traffic_index := range dbClientTraffics {
  708. if dbClientTraffics[traffic_index].ExpiryTime < 0 && c["email"] == dbClientTraffics[traffic_index].Email {
  709. oldExpiryTime := c["expiryTime"].(float64)
  710. newExpiryTime := (time.Now().Unix() * 1000) - int64(oldExpiryTime)
  711. c["expiryTime"] = newExpiryTime
  712. dbClientTraffics[traffic_index].ExpiryTime = newExpiryTime
  713. break
  714. }
  715. }
  716. newClients = append(newClients, interface{}(c))
  717. }
  718. settings["clients"] = newClients
  719. modifiedSettings, err := json.MarshalIndent(settings, "", " ")
  720. if err != nil {
  721. return nil, err
  722. }
  723. inbounds[inbound_index].Settings = string(modifiedSettings)
  724. }
  725. }
  726. err = tx.Save(inbounds).Error
  727. if err != nil {
  728. logger.Warning("AddClientTraffic update inbounds ", err)
  729. logger.Error(inbounds)
  730. }
  731. }
  732. return dbClientTraffics, nil
  733. }
  734. func (s *InboundService) DisableInvalidInbounds() (bool, int64, error) {
  735. db := database.GetDB()
  736. now := time.Now().Unix() * 1000
  737. needRestart := false
  738. if p != nil {
  739. var tags []string
  740. err := db.Table("inbounds").
  741. Select("inbounds.tag").
  742. Where("((total > 0 and up + down >= total) or (expiry_time > 0 and expiry_time <= ?)) and enable = ?", now, true).
  743. Scan(&tags).Error
  744. if err != nil {
  745. return false, 0, err
  746. }
  747. s.xrayApi.Init(p.GetAPIPort())
  748. for _, tag := range tags {
  749. err1 := s.xrayApi.DelInbound(tag)
  750. if err == nil {
  751. logger.Debug("Inbound disabled by api:", tag)
  752. } else {
  753. logger.Debug("Error in disabling inbound by api:", err1)
  754. needRestart = true
  755. }
  756. }
  757. s.xrayApi.Close()
  758. }
  759. result := db.Model(model.Inbound{}).
  760. Where("((total > 0 and up + down >= total) or (expiry_time > 0 and expiry_time <= ?)) and enable = ?", now, true).
  761. Update("enable", false)
  762. err := result.Error
  763. count := result.RowsAffected
  764. return needRestart, count, err
  765. }
  766. func (s *InboundService) DisableInvalidClients() (bool, int64, error) {
  767. db := database.GetDB()
  768. now := time.Now().Unix() * 1000
  769. needRestart := false
  770. if p != nil {
  771. var results []struct {
  772. Tag string
  773. Email string
  774. }
  775. err := db.Table("inbounds").
  776. Select("inbounds.tag, client_traffics.email").
  777. Joins("JOIN client_traffics ON inbounds.id = client_traffics.inbound_id").
  778. Where("((client_traffics.total > 0 AND client_traffics.up + client_traffics.down >= client_traffics.total) OR (client_traffics.expiry_time > 0 AND client_traffics.expiry_time <= ?)) AND client_traffics.enable = ?", now, true).
  779. Scan(&results).Error
  780. if err != nil {
  781. return false, 0, err
  782. }
  783. s.xrayApi.Init(p.GetAPIPort())
  784. for _, result := range results {
  785. err1 := s.xrayApi.RemoveUser(result.Tag, result.Email)
  786. if err1 == nil {
  787. logger.Debug("Client disabled by api:", result.Email)
  788. } else {
  789. logger.Debug("Error in disabling client by api:", err1)
  790. needRestart = true
  791. }
  792. }
  793. s.xrayApi.Close()
  794. }
  795. result := db.Model(xray.ClientTraffic{}).
  796. Where("((total > 0 and up + down >= total) or (expiry_time > 0 and expiry_time <= ?)) and enable = ?", now, true).
  797. Update("enable", false)
  798. err := result.Error
  799. count := result.RowsAffected
  800. return needRestart, count, err
  801. }
  802. func (s *InboundService) MigrationRemoveOrphanedTraffics() {
  803. db := database.GetDB()
  804. db.Exec(`
  805. DELETE FROM client_traffics
  806. WHERE email NOT IN (
  807. SELECT JSON_EXTRACT(client.value, '$.email')
  808. FROM inbounds,
  809. JSON_EACH(JSON_EXTRACT(inbounds.settings, '$.clients')) AS client
  810. )
  811. `)
  812. }
  813. func (s *InboundService) AddClientStat(tx *gorm.DB, inboundId int, client *model.Client) error {
  814. clientTraffic := xray.ClientTraffic{}
  815. clientTraffic.InboundId = inboundId
  816. clientTraffic.Email = client.Email
  817. clientTraffic.Total = client.TotalGB
  818. clientTraffic.ExpiryTime = client.ExpiryTime
  819. clientTraffic.Enable = true
  820. clientTraffic.Up = 0
  821. clientTraffic.Down = 0
  822. result := tx.Create(&clientTraffic)
  823. err := result.Error
  824. if err != nil {
  825. return err
  826. }
  827. return nil
  828. }
  829. func (s *InboundService) UpdateClientStat(email string, client *model.Client) error {
  830. db := database.GetDB()
  831. result := db.Model(xray.ClientTraffic{}).
  832. Where("email = ?", email).
  833. Updates(map[string]interface{}{
  834. "enable": true,
  835. "email": client.Email,
  836. "total": client.TotalGB,
  837. "expiry_time": client.ExpiryTime})
  838. err := result.Error
  839. if err != nil {
  840. return err
  841. }
  842. return nil
  843. }
  844. func (s *InboundService) UpdateClientIPs(tx *gorm.DB, oldEmail string, newEmail string) error {
  845. return tx.Model(model.InboundClientIps{}).Where("client_email = ?", oldEmail).Update("client_email", newEmail).Error
  846. }
  847. func (s *InboundService) DelClientStat(tx *gorm.DB, email string) error {
  848. return tx.Where("email = ?", email).Delete(xray.ClientTraffic{}).Error
  849. }
  850. func (s *InboundService) DelClientIPs(tx *gorm.DB, email string) error {
  851. logger.Warning(email)
  852. return tx.Where("client_email = ?", email).Delete(model.InboundClientIps{}).Error
  853. }
  854. func (s *InboundService) GetClientInboundByTrafficID(trafficId int) (traffic *xray.ClientTraffic, inbound *model.Inbound, err error) {
  855. db := database.GetDB()
  856. var traffics []*xray.ClientTraffic
  857. err = db.Model(xray.ClientTraffic{}).Where("id = ?", trafficId).Find(&traffics).Error
  858. if err != nil {
  859. logger.Warning(err)
  860. return nil, nil, err
  861. }
  862. if len(traffics) > 0 {
  863. inbound, err = s.GetInbound(traffics[0].InboundId)
  864. return traffics[0], inbound, err
  865. }
  866. return nil, nil, nil
  867. }
  868. func (s *InboundService) GetClientInboundByEmail(email string) (traffic *xray.ClientTraffic, inbound *model.Inbound, err error) {
  869. db := database.GetDB()
  870. var traffics []*xray.ClientTraffic
  871. err = db.Model(xray.ClientTraffic{}).Where("email = ?", email).Find(&traffics).Error
  872. if err != nil {
  873. logger.Warning(err)
  874. return nil, nil, err
  875. }
  876. if len(traffics) > 0 {
  877. inbound, err = s.GetInbound(traffics[0].InboundId)
  878. return traffics[0], inbound, err
  879. }
  880. return nil, nil, nil
  881. }
  882. func (s *InboundService) GetClientByEmail(clientEmail string) (*xray.ClientTraffic, *model.Client, error) {
  883. traffic, inbound, err := s.GetClientInboundByEmail(clientEmail)
  884. if err != nil {
  885. return nil, nil, err
  886. }
  887. if inbound == nil {
  888. return nil, nil, common.NewError("Inbound Not Found For Email:", clientEmail)
  889. }
  890. clients, err := s.GetClients(inbound)
  891. if err != nil {
  892. return nil, nil, err
  893. }
  894. for _, client := range clients {
  895. if client.Email == clientEmail {
  896. return traffic, &client, nil
  897. }
  898. }
  899. return nil, nil, common.NewError("Client Not Found In Inbound For Email:", clientEmail)
  900. }
  901. func (s *InboundService) SetClientTelegramUserID(trafficId int, tgId string) error {
  902. traffic, inbound, err := s.GetClientInboundByTrafficID(trafficId)
  903. if err != nil {
  904. return err
  905. }
  906. if inbound == nil {
  907. return common.NewError("Inbound Not Found For Traffic ID:", trafficId)
  908. }
  909. clientEmail := traffic.Email
  910. oldClients, err := s.GetClients(inbound)
  911. if err != nil {
  912. return err
  913. }
  914. clientId := ""
  915. for _, oldClient := range oldClients {
  916. if oldClient.Email == clientEmail {
  917. if inbound.Protocol == "trojan" {
  918. clientId = oldClient.Password
  919. } else {
  920. clientId = oldClient.ID
  921. }
  922. break
  923. }
  924. }
  925. if len(clientId) == 0 {
  926. return common.NewError("Client Not Found For Email:", clientEmail)
  927. }
  928. var settings map[string]interface{}
  929. err = json.Unmarshal([]byte(inbound.Settings), &settings)
  930. if err != nil {
  931. return err
  932. }
  933. clients := settings["clients"].([]interface{})
  934. var newClients []interface{}
  935. for client_index := range clients {
  936. c := clients[client_index].(map[string]interface{})
  937. if c["email"] == clientEmail {
  938. c["tgId"] = tgId
  939. newClients = append(newClients, interface{}(c))
  940. }
  941. }
  942. settings["clients"] = newClients
  943. modifiedSettings, err := json.MarshalIndent(settings, "", " ")
  944. if err != nil {
  945. return err
  946. }
  947. inbound.Settings = string(modifiedSettings)
  948. _, err = s.UpdateInboundClient(inbound, clientId)
  949. if err != nil {
  950. return err
  951. }
  952. return nil
  953. }
  954. func (s *InboundService) ToggleClientEnableByEmail(clientEmail string) (bool, error) {
  955. _, inbound, err := s.GetClientInboundByEmail(clientEmail)
  956. if err != nil {
  957. return false, err
  958. }
  959. if inbound == nil {
  960. return false, common.NewError("Inbound Not Found For Email:", clientEmail)
  961. }
  962. oldClients, err := s.GetClients(inbound)
  963. if err != nil {
  964. return false, err
  965. }
  966. clientId := ""
  967. clientOldEnabled := false
  968. for _, oldClient := range oldClients {
  969. if oldClient.Email == clientEmail {
  970. if inbound.Protocol == "trojan" {
  971. clientId = oldClient.Password
  972. } else {
  973. clientId = oldClient.ID
  974. }
  975. clientOldEnabled = oldClient.Enable
  976. break
  977. }
  978. }
  979. if len(clientId) == 0 {
  980. return false, common.NewError("Client Not Found For Email:", clientEmail)
  981. }
  982. var settings map[string]interface{}
  983. err = json.Unmarshal([]byte(inbound.Settings), &settings)
  984. if err != nil {
  985. return false, err
  986. }
  987. clients := settings["clients"].([]interface{})
  988. var newClients []interface{}
  989. for client_index := range clients {
  990. c := clients[client_index].(map[string]interface{})
  991. if c["email"] == clientEmail {
  992. c["enable"] = !clientOldEnabled
  993. newClients = append(newClients, interface{}(c))
  994. }
  995. }
  996. settings["clients"] = newClients
  997. modifiedSettings, err := json.MarshalIndent(settings, "", " ")
  998. if err != nil {
  999. return false, err
  1000. }
  1001. inbound.Settings = string(modifiedSettings)
  1002. _, err = s.UpdateInboundClient(inbound, clientId)
  1003. if err != nil {
  1004. return false, err
  1005. }
  1006. return !clientOldEnabled, nil
  1007. }
  1008. func (s *InboundService) ResetClientIpLimitByEmail(clientEmail string, count int) error {
  1009. _, inbound, err := s.GetClientInboundByEmail(clientEmail)
  1010. if err != nil {
  1011. return err
  1012. }
  1013. if inbound == nil {
  1014. return common.NewError("Inbound Not Found For Email:", clientEmail)
  1015. }
  1016. oldClients, err := s.GetClients(inbound)
  1017. if err != nil {
  1018. return err
  1019. }
  1020. clientId := ""
  1021. for _, oldClient := range oldClients {
  1022. if oldClient.Email == clientEmail {
  1023. if inbound.Protocol == "trojan" {
  1024. clientId = oldClient.Password
  1025. } else {
  1026. clientId = oldClient.ID
  1027. }
  1028. break
  1029. }
  1030. }
  1031. if len(clientId) == 0 {
  1032. return common.NewError("Client Not Found For Email:", clientEmail)
  1033. }
  1034. var settings map[string]interface{}
  1035. err = json.Unmarshal([]byte(inbound.Settings), &settings)
  1036. if err != nil {
  1037. return err
  1038. }
  1039. clients := settings["clients"].([]interface{})
  1040. var newClients []interface{}
  1041. for client_index := range clients {
  1042. c := clients[client_index].(map[string]interface{})
  1043. if c["email"] == clientEmail {
  1044. c["limitIp"] = count
  1045. newClients = append(newClients, interface{}(c))
  1046. }
  1047. }
  1048. settings["clients"] = newClients
  1049. modifiedSettings, err := json.MarshalIndent(settings, "", " ")
  1050. if err != nil {
  1051. return err
  1052. }
  1053. inbound.Settings = string(modifiedSettings)
  1054. _, err = s.UpdateInboundClient(inbound, clientId)
  1055. if err != nil {
  1056. return err
  1057. }
  1058. return nil
  1059. }
  1060. func (s *InboundService) ResetClientExpiryTimeByEmail(clientEmail string, expiry_time int64) error {
  1061. _, inbound, err := s.GetClientInboundByEmail(clientEmail)
  1062. if err != nil {
  1063. return err
  1064. }
  1065. if inbound == nil {
  1066. return common.NewError("Inbound Not Found For Email:", clientEmail)
  1067. }
  1068. oldClients, err := s.GetClients(inbound)
  1069. if err != nil {
  1070. return err
  1071. }
  1072. clientId := ""
  1073. for _, oldClient := range oldClients {
  1074. if oldClient.Email == clientEmail {
  1075. if inbound.Protocol == "trojan" {
  1076. clientId = oldClient.Password
  1077. } else {
  1078. clientId = oldClient.ID
  1079. }
  1080. break
  1081. }
  1082. }
  1083. if len(clientId) == 0 {
  1084. return common.NewError("Client Not Found For Email:", clientEmail)
  1085. }
  1086. var settings map[string]interface{}
  1087. err = json.Unmarshal([]byte(inbound.Settings), &settings)
  1088. if err != nil {
  1089. return err
  1090. }
  1091. clients := settings["clients"].([]interface{})
  1092. var newClients []interface{}
  1093. for client_index := range clients {
  1094. c := clients[client_index].(map[string]interface{})
  1095. if c["email"] == clientEmail {
  1096. c["expiryTime"] = expiry_time
  1097. newClients = append(newClients, interface{}(c))
  1098. }
  1099. }
  1100. settings["clients"] = newClients
  1101. modifiedSettings, err := json.MarshalIndent(settings, "", " ")
  1102. if err != nil {
  1103. return err
  1104. }
  1105. inbound.Settings = string(modifiedSettings)
  1106. _, err = s.UpdateInboundClient(inbound, clientId)
  1107. if err != nil {
  1108. return err
  1109. }
  1110. return nil
  1111. }
  1112. func (s *InboundService) ResetClientTrafficByEmail(clientEmail string) error {
  1113. db := database.GetDB()
  1114. result := db.Model(xray.ClientTraffic{}).
  1115. Where("email = ?", clientEmail).
  1116. Updates(map[string]interface{}{"enable": true, "up": 0, "down": 0})
  1117. err := result.Error
  1118. if err != nil {
  1119. return err
  1120. }
  1121. return nil
  1122. }
  1123. func (s *InboundService) ResetClientTraffic(id int, clientEmail string) (bool, error) {
  1124. needRestart := false
  1125. traffic, err := s.GetClientTrafficByEmail(clientEmail)
  1126. if err != nil {
  1127. return false, err
  1128. }
  1129. if !traffic.Enable {
  1130. inbound, err := s.GetInbound(id)
  1131. if err != nil {
  1132. return false, err
  1133. }
  1134. clients, err := s.GetClients(inbound)
  1135. if err != nil {
  1136. return false, err
  1137. }
  1138. for _, client := range clients {
  1139. if client.Email == clientEmail {
  1140. s.xrayApi.Init(p.GetAPIPort())
  1141. cipher := ""
  1142. if string(inbound.Protocol) == "shadowsocks" {
  1143. var oldSettings map[string]interface{}
  1144. err = json.Unmarshal([]byte(inbound.Settings), &oldSettings)
  1145. if err != nil {
  1146. return false, err
  1147. }
  1148. cipher = oldSettings["method"].(string)
  1149. }
  1150. err1 := s.xrayApi.AddUser(string(inbound.Protocol), inbound.Tag, map[string]interface{}{
  1151. "email": client.Email,
  1152. "id": client.ID,
  1153. "flow": client.Flow,
  1154. "password": client.Password,
  1155. "cipher": cipher,
  1156. })
  1157. if err1 == nil {
  1158. logger.Debug("Client enabled due to reset traffic:", clientEmail)
  1159. } else {
  1160. logger.Debug("Error in enabling client by api:", err1)
  1161. needRestart = true
  1162. }
  1163. s.xrayApi.Close()
  1164. break
  1165. }
  1166. }
  1167. }
  1168. traffic.Up = 0
  1169. traffic.Down = 0
  1170. traffic.Enable = true
  1171. db := database.GetDB()
  1172. err = db.Save(traffic).Error
  1173. if err != nil {
  1174. return false, err
  1175. }
  1176. return needRestart, nil
  1177. }
  1178. func (s *InboundService) ResetAllClientTraffics(id int) error {
  1179. db := database.GetDB()
  1180. whereText := "inbound_id "
  1181. if id == -1 {
  1182. whereText += " > ?"
  1183. } else {
  1184. whereText += " = ?"
  1185. }
  1186. result := db.Model(xray.ClientTraffic{}).
  1187. Where(whereText, id).
  1188. Updates(map[string]interface{}{"enable": true, "up": 0, "down": 0})
  1189. err := result.Error
  1190. if err != nil {
  1191. return err
  1192. }
  1193. return nil
  1194. }
  1195. func (s *InboundService) ResetAllTraffics() error {
  1196. db := database.GetDB()
  1197. result := db.Model(model.Inbound{}).
  1198. Where("user_id > ?", 0).
  1199. Updates(map[string]interface{}{"up": 0, "down": 0})
  1200. err := result.Error
  1201. if err != nil {
  1202. return err
  1203. }
  1204. return nil
  1205. }
  1206. func (s *InboundService) DelDepletedClients(id int) (err error) {
  1207. db := database.GetDB()
  1208. tx := db.Begin()
  1209. defer func() {
  1210. if err == nil {
  1211. tx.Commit()
  1212. } else {
  1213. tx.Rollback()
  1214. }
  1215. }()
  1216. whereText := "inbound_id "
  1217. if id < 0 {
  1218. whereText += "> ?"
  1219. } else {
  1220. whereText += "= ?"
  1221. }
  1222. depletedClients := []xray.ClientTraffic{}
  1223. err = db.Model(xray.ClientTraffic{}).Where(whereText+" and enable = ?", id, false).Select("inbound_id, GROUP_CONCAT(email) as email").Group("inbound_id").Find(&depletedClients).Error
  1224. if err != nil {
  1225. return err
  1226. }
  1227. for _, depletedClient := range depletedClients {
  1228. emails := strings.Split(depletedClient.Email, ",")
  1229. oldInbound, err := s.GetInbound(depletedClient.InboundId)
  1230. if err != nil {
  1231. return err
  1232. }
  1233. var oldSettings map[string]interface{}
  1234. err = json.Unmarshal([]byte(oldInbound.Settings), &oldSettings)
  1235. if err != nil {
  1236. return err
  1237. }
  1238. oldClients := oldSettings["clients"].([]interface{})
  1239. var newClients []interface{}
  1240. for _, client := range oldClients {
  1241. deplete := false
  1242. c := client.(map[string]interface{})
  1243. for _, email := range emails {
  1244. if email == c["email"].(string) {
  1245. deplete = true
  1246. break
  1247. }
  1248. }
  1249. if !deplete {
  1250. newClients = append(newClients, client)
  1251. }
  1252. }
  1253. if len(newClients) > 0 {
  1254. oldSettings["clients"] = newClients
  1255. newSettings, err := json.MarshalIndent(oldSettings, "", " ")
  1256. if err != nil {
  1257. return err
  1258. }
  1259. oldInbound.Settings = string(newSettings)
  1260. err = tx.Save(oldInbound).Error
  1261. if err != nil {
  1262. return err
  1263. }
  1264. } else {
  1265. // Delete inbound if no client remains
  1266. s.DelInbound(depletedClient.InboundId)
  1267. }
  1268. }
  1269. err = tx.Where(whereText+" and enable = ?", id, false).Delete(xray.ClientTraffic{}).Error
  1270. if err != nil {
  1271. return err
  1272. }
  1273. return nil
  1274. }
  1275. func (s *InboundService) GetClientTrafficTgBot(tguname string) ([]*xray.ClientTraffic, error) {
  1276. db := database.GetDB()
  1277. var inbounds []*model.Inbound
  1278. err := db.Model(model.Inbound{}).Where("settings like ?", fmt.Sprintf(`%%"tgId": "%s"%%`, tguname)).Find(&inbounds).Error
  1279. if err != nil && err != gorm.ErrRecordNotFound {
  1280. return nil, err
  1281. }
  1282. var emails []string
  1283. for _, inbound := range inbounds {
  1284. clients, err := s.GetClients(inbound)
  1285. if err != nil {
  1286. logger.Error("Unable to get clients from inbound")
  1287. }
  1288. for _, client := range clients {
  1289. if client.TgID == tguname {
  1290. emails = append(emails, client.Email)
  1291. }
  1292. }
  1293. }
  1294. var traffics []*xray.ClientTraffic
  1295. err = db.Model(xray.ClientTraffic{}).Where("email IN ?", emails).Find(&traffics).Error
  1296. if err != nil {
  1297. if err == gorm.ErrRecordNotFound {
  1298. logger.Warning(err)
  1299. return nil, err
  1300. }
  1301. }
  1302. return traffics, err
  1303. }
  1304. func (s *InboundService) GetClientTrafficByEmail(email string) (traffic *xray.ClientTraffic, err error) {
  1305. db := database.GetDB()
  1306. var traffics []*xray.ClientTraffic
  1307. err = db.Model(xray.ClientTraffic{}).Where("email = ?", email).Find(&traffics).Error
  1308. if err != nil {
  1309. logger.Warning(err)
  1310. return nil, err
  1311. }
  1312. if len(traffics) > 0 {
  1313. return traffics[0], nil
  1314. }
  1315. return nil, nil
  1316. }
  1317. func (s *InboundService) SearchClientTraffic(query string) (traffic *xray.ClientTraffic, err error) {
  1318. db := database.GetDB()
  1319. inbound := &model.Inbound{}
  1320. traffic = &xray.ClientTraffic{}
  1321. err = db.Model(model.Inbound{}).Where("settings like ?", "%\""+query+"\"%").First(inbound).Error
  1322. if err != nil {
  1323. if err == gorm.ErrRecordNotFound {
  1324. logger.Warning(err)
  1325. return nil, err
  1326. }
  1327. }
  1328. traffic.InboundId = inbound.Id
  1329. // get settings clients
  1330. settings := map[string][]model.Client{}
  1331. json.Unmarshal([]byte(inbound.Settings), &settings)
  1332. clients := settings["clients"]
  1333. for _, client := range clients {
  1334. if client.ID == query && client.Email != "" {
  1335. traffic.Email = client.Email
  1336. break
  1337. }
  1338. if client.Password == query && client.Email != "" {
  1339. traffic.Email = client.Email
  1340. break
  1341. }
  1342. }
  1343. if traffic.Email == "" {
  1344. return nil, err
  1345. }
  1346. err = db.Model(xray.ClientTraffic{}).Where("email = ?", traffic.Email).First(traffic).Error
  1347. if err != nil {
  1348. logger.Warning(err)
  1349. return nil, err
  1350. }
  1351. return traffic, err
  1352. }
  1353. func (s *InboundService) GetInboundClientIps(clientEmail string) (string, error) {
  1354. db := database.GetDB()
  1355. InboundClientIps := &model.InboundClientIps{}
  1356. err := db.Model(model.InboundClientIps{}).Where("client_email = ?", clientEmail).First(InboundClientIps).Error
  1357. if err != nil {
  1358. return "", err
  1359. }
  1360. return InboundClientIps.Ips, nil
  1361. }
  1362. func (s *InboundService) ClearClientIps(clientEmail string) error {
  1363. db := database.GetDB()
  1364. result := db.Model(model.InboundClientIps{}).
  1365. Where("client_email = ?", clientEmail).
  1366. Update("ips", "")
  1367. err := result.Error
  1368. if err != nil {
  1369. return err
  1370. }
  1371. return nil
  1372. }
  1373. func (s *InboundService) SearchInbounds(query string) ([]*model.Inbound, error) {
  1374. db := database.GetDB()
  1375. var inbounds []*model.Inbound
  1376. err := db.Model(model.Inbound{}).Preload("ClientStats").Where("remark like ?", "%"+query+"%").Find(&inbounds).Error
  1377. if err != nil && err != gorm.ErrRecordNotFound {
  1378. return nil, err
  1379. }
  1380. return inbounds, nil
  1381. }
  1382. func (s *InboundService) MigrationRequirements() {
  1383. db := database.GetDB()
  1384. tx := db.Begin()
  1385. var err error
  1386. defer func() {
  1387. if err == nil {
  1388. tx.Commit()
  1389. } else {
  1390. tx.Rollback()
  1391. }
  1392. }()
  1393. // Fix inbounds based problems
  1394. var inbounds []*model.Inbound
  1395. err = tx.Model(model.Inbound{}).Where("protocol IN (?)", []string{"vmess", "vless", "trojan"}).Find(&inbounds).Error
  1396. if err != nil && err != gorm.ErrRecordNotFound {
  1397. return
  1398. }
  1399. for inbound_index := range inbounds {
  1400. settings := map[string]interface{}{}
  1401. json.Unmarshal([]byte(inbounds[inbound_index].Settings), &settings)
  1402. clients, ok := settings["clients"].([]interface{})
  1403. if ok {
  1404. // Fix Clinet configuration problems
  1405. var newClients []interface{}
  1406. for client_index := range clients {
  1407. c := clients[client_index].(map[string]interface{})
  1408. // Add email='' if it is not exists
  1409. if _, ok := c["email"]; !ok {
  1410. c["email"] = ""
  1411. }
  1412. // Remove "flow": "xtls-rprx-direct"
  1413. if _, ok := c["flow"]; ok {
  1414. if c["flow"] == "xtls-rprx-direct" {
  1415. c["flow"] = ""
  1416. }
  1417. }
  1418. newClients = append(newClients, interface{}(c))
  1419. }
  1420. settings["clients"] = newClients
  1421. modifiedSettings, err := json.MarshalIndent(settings, "", " ")
  1422. if err != nil {
  1423. return
  1424. }
  1425. inbounds[inbound_index].Settings = string(modifiedSettings)
  1426. }
  1427. // Add client traffic row for all clients which has email
  1428. modelClients, err := s.GetClients(inbounds[inbound_index])
  1429. if err != nil {
  1430. return
  1431. }
  1432. for _, modelClient := range modelClients {
  1433. if len(modelClient.Email) > 0 {
  1434. var count int64
  1435. tx.Model(xray.ClientTraffic{}).Where("email = ?", modelClient.Email).Count(&count)
  1436. if count == 0 {
  1437. s.AddClientStat(tx, inbounds[inbound_index].Id, &modelClient)
  1438. }
  1439. }
  1440. }
  1441. }
  1442. tx.Save(inbounds)
  1443. // Remove orphaned traffics
  1444. tx.Where("inbound_id = 0").Delete(xray.ClientTraffic{})
  1445. }
  1446. func (s *InboundService) MigrateDB() {
  1447. s.MigrationRequirements()
  1448. s.MigrationRemoveOrphanedTraffics()
  1449. }