1.0.5 - added lal webhooks
parent
cba7f8ca13
commit
f7c5b43dce
24
.env
24
.env
|
|
@ -1,13 +1,13 @@
|
|||
# Mysql Live
|
||||
|
||||
#Used when creating a JWT. It can be anything.
|
||||
API_SECRET=nyEX8BZ44KqTXeV2
|
||||
API_PORT=8111
|
||||
|
||||
# DB configuration
|
||||
DB_HOST=185.167.97.70
|
||||
DB_DRIVER=mysql
|
||||
DB_USER=root
|
||||
DB_PASSWORD=@407S732nwPhon
|
||||
DB_NAME=pcast
|
||||
# Mysql Live
|
||||
|
||||
#Used when creating a JWT. It can be anything.
|
||||
API_SECRET=nyEX8BZ44KqTXeV2
|
||||
API_PORT=8111
|
||||
|
||||
# DB configuration
|
||||
DB_HOST=185.167.97.70
|
||||
DB_DRIVER=mysql
|
||||
DB_USER=root
|
||||
DB_PASSWORD=@407S732nwPhon
|
||||
DB_NAME=pcast
|
||||
DB_PORT=3306
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
.vscode
|
||||
|
||||
api
|
||||
api.exe
|
||||
.vscode
|
||||
|
||||
api
|
||||
api.exe
|
||||
|
|
|
|||
|
|
@ -4,6 +4,6 @@ import "github.com/gofiber/fiber/v2"
|
|||
|
||||
func Version(c *fiber.Ctx) error {
|
||||
return c.JSON(fiber.Map{
|
||||
"version": "1.0.4",
|
||||
"version": "1.0.5",
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,87 @@
|
|||
package controllers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
)
|
||||
|
||||
type Pub struct {
|
||||
Server string `json:"server_id"`
|
||||
Protocol string `json:"protocol"`
|
||||
Url string `json:"url"`
|
||||
AppName string `json:"app_name"`
|
||||
Channel string `json:"stream_name"`
|
||||
UrlParam string `json:"url_param"`
|
||||
RemoteAddress string `json:"remotet_addr"`
|
||||
HasInSession bool `json:"has_in_session"`
|
||||
HasOutSession bool `json:"has_out_session"`
|
||||
}
|
||||
|
||||
type Update struct {
|
||||
Server string `json:"server_id"`
|
||||
Groups []Group `json:"groups"`
|
||||
}
|
||||
|
||||
type Group struct {
|
||||
Channel string `json:"stream_name"`
|
||||
AudioCodec string `json:"audio_codec"`
|
||||
VideoCodec string `json:"video_codec"`
|
||||
VideoWidth int `json:"video_width"`
|
||||
VideoHeight int `json:"video_height"`
|
||||
UpdPub UpdPub `json:"pub"`
|
||||
Subs string `json:"subs"`
|
||||
UpdPull UpdPub `json:"pull"`
|
||||
}
|
||||
|
||||
type UpdPub struct {
|
||||
Protocol string `json:"protocol"`
|
||||
SessionId string `json:"session_id"`
|
||||
RemoteAddress string `json:"remote_addr"`
|
||||
StartTime string `json:"start_time"`
|
||||
ReadBytesSum int `json:"read_bytes_sum"`
|
||||
WroteBytesSum int `json:"wrote_bytes_sum"`
|
||||
Bitrate int `json:"bitrate"`
|
||||
ReadBitrate int `json:"read_bitrate"`
|
||||
WriteBitrate int `json:"write_bitrate"`
|
||||
}
|
||||
|
||||
func ServerStart(c *fiber.Ctx) error {
|
||||
fmt.Println("Server started")
|
||||
log.Println(string(c.Body()))
|
||||
return c.SendString("Server started: " + string(c.Body()))
|
||||
}
|
||||
|
||||
func OnUpdate(c *fiber.Ctx) error {
|
||||
p := new(Update)
|
||||
if err := c.BodyParser(p); err != nil {
|
||||
log.Printf("Error Update: %s\n", err)
|
||||
return err
|
||||
}
|
||||
|
||||
if len(p.Groups) > 0 {
|
||||
for _, g := range p.Groups {
|
||||
log.Printf("Update %s %s [(%dx%d) %d]\n", g.Channel, g.UpdPub.StartTime, g.VideoWidth, g.VideoHeight, g.UpdPub.ReadBytesSum)
|
||||
}
|
||||
}
|
||||
return c.SendString("On_Update: " + string(c.Body()))
|
||||
}
|
||||
|
||||
func OnPubStart(c *fiber.Ctx) error {
|
||||
p := new(Pub)
|
||||
if err := c.BodyParser(p); err != nil {
|
||||
return err
|
||||
}
|
||||
log.Printf("Start %s\n", p.Channel)
|
||||
return c.SendString("On_Pub_Start: " + string(c.Body()))
|
||||
}
|
||||
|
||||
func OnPubStop(c *fiber.Ctx) error {
|
||||
p := new(Pub)
|
||||
if err := c.BodyParser(p); err != nil {
|
||||
return err
|
||||
}
|
||||
log.Printf("Stop %s\n", p.Channel)
|
||||
return c.SendString("On_Pub_Stop: " + string(c.Body()))
|
||||
}
|
||||
|
|
@ -1,14 +1,14 @@
|
|||
package dbaccess
|
||||
|
||||
import (
|
||||
"api/database"
|
||||
"api/models"
|
||||
)
|
||||
|
||||
func GetUserById(id int) models.User {
|
||||
var user models.User
|
||||
|
||||
database.DB.Where("id = ?", id).First(&user)
|
||||
|
||||
return user
|
||||
}
|
||||
package dbaccess
|
||||
|
||||
import (
|
||||
"api/database"
|
||||
"api/models"
|
||||
)
|
||||
|
||||
func GetUserById(id int) models.User {
|
||||
var user models.User
|
||||
|
||||
database.DB.Where("id = ?", id).First(&user)
|
||||
|
||||
return user
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1,2 +1,2 @@
|
|||
(function(e){function t(t){for(var n,a,u=t[0],s=t[1],i=t[2],p=0,v=[];p<u.length;p++)a=u[p],Object.prototype.hasOwnProperty.call(o,a)&&o[a]&&v.push(o[a][0]),o[a]=0;for(n in s)Object.prototype.hasOwnProperty.call(s,n)&&(e[n]=s[n]);c&&c(t);while(v.length)v.shift()();return l.push.apply(l,i||[]),r()}function r(){for(var e,t=0;t<l.length;t++){for(var r=l[t],n=!0,u=1;u<r.length;u++){var s=r[u];0!==o[s]&&(n=!1)}n&&(l.splice(t--,1),e=a(a.s=r[0]))}return e}var n={},o={app:0},l=[];function a(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,a),r.l=!0,r.exports}a.m=e,a.c=n,a.d=function(e,t,r){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},a.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(a.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)a.d(r,n,function(t){return e[t]}.bind(null,n));return r},a.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return a.d(t,"a",t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p="/";var u=window["webpackJsonp"]=window["webpackJsonp"]||[],s=u.push.bind(u);u.push=t,u=u.slice();for(var i=0;i<u.length;i++)t(u[i]);var c=s;l.push([0,"chunk-vendors"]),r()})({0:function(e,t,r){e.exports=r("56d7")},"034f":function(e,t,r){"use strict";r("85ec")},4805:function(e,t,r){"use strict";r("8ce0")},"56d7":function(e,t,r){"use strict";r.r(t);r("e260"),r("e6cf"),r("cca6"),r("a79d");var n=r("2b0e"),o=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{attrs:{id:"app"}},[n("img",{attrs:{alt:"Vue logo",src:r("cf05")}}),n("HelloWorld",{attrs:{msg:"Welcome to Your Vue.js App"}})],1)},l=[],a=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"hello"},[r("h1",[e._v(e._s(e.msg))]),e._m(0),r("h3",[e._v("Installed CLI Plugins")]),e._m(1),r("h3",[e._v("Essential Links")]),e._m(2),r("h3",[e._v("Ecosystem")]),e._m(3)])},u=[function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("p",[e._v(" For a guide and recipes on how to configure / customize this project,"),r("br"),e._v(" check out the "),r("a",{attrs:{href:"https://cli.vuejs.org",target:"_blank",rel:"noopener"}},[e._v("vue-cli documentation")]),e._v(". ")])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ul",[r("li",[r("a",{attrs:{href:"https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel",target:"_blank",rel:"noopener"}},[e._v("babel")])]),r("li",[r("a",{attrs:{href:"https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint",target:"_blank",rel:"noopener"}},[e._v("eslint")])])])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ul",[r("li",[r("a",{attrs:{href:"https://vuejs.org",target:"_blank",rel:"noopener"}},[e._v("Core Docs")])]),r("li",[r("a",{attrs:{href:"https://forum.vuejs.org",target:"_blank",rel:"noopener"}},[e._v("Forum")])]),r("li",[r("a",{attrs:{href:"https://chat.vuejs.org",target:"_blank",rel:"noopener"}},[e._v("Community Chat")])]),r("li",[r("a",{attrs:{href:"https://twitter.com/vuejs",target:"_blank",rel:"noopener"}},[e._v("Twitter")])]),r("li",[r("a",{attrs:{href:"https://news.vuejs.org",target:"_blank",rel:"noopener"}},[e._v("News")])])])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ul",[r("li",[r("a",{attrs:{href:"https://router.vuejs.org",target:"_blank",rel:"noopener"}},[e._v("vue-router")])]),r("li",[r("a",{attrs:{href:"https://vuex.vuejs.org",target:"_blank",rel:"noopener"}},[e._v("vuex")])]),r("li",[r("a",{attrs:{href:"https://github.com/vuejs/vue-devtools#vue-devtools",target:"_blank",rel:"noopener"}},[e._v("vue-devtools")])]),r("li",[r("a",{attrs:{href:"https://vue-loader.vuejs.org",target:"_blank",rel:"noopener"}},[e._v("vue-loader")])]),r("li",[r("a",{attrs:{href:"https://github.com/vuejs/awesome-vue",target:"_blank",rel:"noopener"}},[e._v("awesome-vue")])])])}],s={name:"HelloWorld",props:{msg:String}},i=s,c=(r("4805"),r("2877")),p=Object(c["a"])(i,a,u,!1,null,"b9167eee",null),v=p.exports,f={name:"App",components:{HelloWorld:v}},h=f,_=(r("034f"),Object(c["a"])(h,o,l,!1,null,null,null)),g=_.exports;n["a"].config.productionTip=!1,new n["a"]({render:function(e){return e(g)}}).$mount("#app")},"85ec":function(e,t,r){},"8ce0":function(e,t,r){},cf05:function(e,t,r){e.exports=r.p+"img/logo.82b9c7a5.png"}});
|
||||
(function(e){function t(t){for(var n,a,u=t[0],s=t[1],i=t[2],p=0,v=[];p<u.length;p++)a=u[p],Object.prototype.hasOwnProperty.call(o,a)&&o[a]&&v.push(o[a][0]),o[a]=0;for(n in s)Object.prototype.hasOwnProperty.call(s,n)&&(e[n]=s[n]);c&&c(t);while(v.length)v.shift()();return l.push.apply(l,i||[]),r()}function r(){for(var e,t=0;t<l.length;t++){for(var r=l[t],n=!0,u=1;u<r.length;u++){var s=r[u];0!==o[s]&&(n=!1)}n&&(l.splice(t--,1),e=a(a.s=r[0]))}return e}var n={},o={app:0},l=[];function a(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,a),r.l=!0,r.exports}a.m=e,a.c=n,a.d=function(e,t,r){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},a.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(a.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)a.d(r,n,function(t){return e[t]}.bind(null,n));return r},a.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return a.d(t,"a",t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p="/";var u=window["webpackJsonp"]=window["webpackJsonp"]||[],s=u.push.bind(u);u.push=t,u=u.slice();for(var i=0;i<u.length;i++)t(u[i]);var c=s;l.push([0,"chunk-vendors"]),r()})({0:function(e,t,r){e.exports=r("56d7")},"034f":function(e,t,r){"use strict";r("85ec")},4805:function(e,t,r){"use strict";r("8ce0")},"56d7":function(e,t,r){"use strict";r.r(t);r("e260"),r("e6cf"),r("cca6"),r("a79d");var n=r("2b0e"),o=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{attrs:{id:"app"}},[n("img",{attrs:{alt:"Vue logo",src:r("cf05")}}),n("HelloWorld",{attrs:{msg:"Welcome to Your Vue.js App"}})],1)},l=[],a=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"hello"},[r("h1",[e._v(e._s(e.msg))]),e._m(0),r("h3",[e._v("Installed CLI Plugins")]),e._m(1),r("h3",[e._v("Essential Links")]),e._m(2),r("h3",[e._v("Ecosystem")]),e._m(3)])},u=[function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("p",[e._v(" For a guide and recipes on how to configure / customize this project,"),r("br"),e._v(" check out the "),r("a",{attrs:{href:"https://cli.vuejs.org",target:"_blank",rel:"noopener"}},[e._v("vue-cli documentation")]),e._v(". ")])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ul",[r("li",[r("a",{attrs:{href:"https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel",target:"_blank",rel:"noopener"}},[e._v("babel")])]),r("li",[r("a",{attrs:{href:"https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint",target:"_blank",rel:"noopener"}},[e._v("eslint")])])])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ul",[r("li",[r("a",{attrs:{href:"https://vuejs.org",target:"_blank",rel:"noopener"}},[e._v("Core Docs")])]),r("li",[r("a",{attrs:{href:"https://forum.vuejs.org",target:"_blank",rel:"noopener"}},[e._v("Forum")])]),r("li",[r("a",{attrs:{href:"https://chat.vuejs.org",target:"_blank",rel:"noopener"}},[e._v("Community Chat")])]),r("li",[r("a",{attrs:{href:"https://twitter.com/vuejs",target:"_blank",rel:"noopener"}},[e._v("Twitter")])]),r("li",[r("a",{attrs:{href:"https://news.vuejs.org",target:"_blank",rel:"noopener"}},[e._v("News")])])])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ul",[r("li",[r("a",{attrs:{href:"https://router.vuejs.org",target:"_blank",rel:"noopener"}},[e._v("vue-router")])]),r("li",[r("a",{attrs:{href:"https://vuex.vuejs.org",target:"_blank",rel:"noopener"}},[e._v("vuex")])]),r("li",[r("a",{attrs:{href:"https://github.com/vuejs/vue-devtools#vue-devtools",target:"_blank",rel:"noopener"}},[e._v("vue-devtools")])]),r("li",[r("a",{attrs:{href:"https://vue-loader.vuejs.org",target:"_blank",rel:"noopener"}},[e._v("vue-loader")])]),r("li",[r("a",{attrs:{href:"https://github.com/vuejs/awesome-vue",target:"_blank",rel:"noopener"}},[e._v("awesome-vue")])])])}],s={name:"HelloWorld",props:{msg:String}},i=s,c=(r("4805"),r("2877")),p=Object(c["a"])(i,a,u,!1,null,"b9167eee",null),v=p.exports,f={name:"App",components:{HelloWorld:v}},h=f,_=(r("034f"),Object(c["a"])(h,o,l,!1,null,null,null)),g=_.exports;n["a"].config.productionTip=!1,new n["a"]({render:function(e){return e(g)}}).$mount("#app")},"85ec":function(e,t,r){},"8ce0":function(e,t,r){},cf05:function(e,t,r){e.exports=r.p+"img/logo.82b9c7a5.png"}});
|
||||
//# sourceMappingURL=app.e0347ad3.js.map
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -19,6 +19,12 @@ func Setup(app *fiber.App) {
|
|||
|
||||
app.Post("/check", controllers.CheckStream)
|
||||
|
||||
// Webhooks
|
||||
app.Post("/on_server_start", controllers.ServerStart)
|
||||
app.Post("/on_update", controllers.OnUpdate)
|
||||
app.Post("/on_pub_start", controllers.OnPubStart)
|
||||
app.Post("/on_pub_stop", controllers.OnPubStop)
|
||||
|
||||
// Protected routes. Needs login before.
|
||||
protected := app.Group("/")
|
||||
protected.Use(jwtware.New(jwtware.Config{
|
||||
|
|
|
|||
128
utils/utils.go
128
utils/utils.go
|
|
@ -1,64 +1,64 @@
|
|||
package utils
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/dgrijalva/jwt-go"
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
)
|
||||
|
||||
func HashPassword(password string) ([]byte, error) {
|
||||
return bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
|
||||
}
|
||||
|
||||
func VerifyAuthentication(c *fiber.Ctx, cookie string) (*jwt.StandardClaims, error) {
|
||||
|
||||
token, err := jwt.ParseWithClaims(cookie, &jwt.StandardClaims{}, func(token *jwt.Token) (interface{}, error) {
|
||||
return []byte(os.Getenv("API_SECRET")), nil
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
claims := token.Claims.(*jwt.StandardClaims)
|
||||
|
||||
return claims, nil
|
||||
}
|
||||
|
||||
func ProcessToken(c *fiber.Ctx) (interface{}, error) {
|
||||
bearToken := c.Get("Authorization")
|
||||
|
||||
var token string
|
||||
|
||||
// Normally Authorization HTTP header.
|
||||
onlyToken := strings.Split(bearToken, " ")
|
||||
if len(onlyToken) == 2 {
|
||||
token = onlyToken[1]
|
||||
} else {
|
||||
token = bearToken
|
||||
}
|
||||
|
||||
tk, err := jwt.Parse(token, jwtKeyFunc)
|
||||
|
||||
if err != nil {
|
||||
fmt.Println("Error 1")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
claims, ok := tk.Claims.(jwt.MapClaims)
|
||||
|
||||
if ok && tk.Valid {
|
||||
fmt.Printf("claims user: %v\n", claims["user"])
|
||||
return claims["user"], nil
|
||||
}
|
||||
|
||||
return nil, err
|
||||
}
|
||||
|
||||
func jwtKeyFunc(token *jwt.Token) (interface{}, error) {
|
||||
return []byte(os.Getenv("API_SECRET")), nil
|
||||
}
|
||||
package utils
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/dgrijalva/jwt-go"
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
)
|
||||
|
||||
func HashPassword(password string) ([]byte, error) {
|
||||
return bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
|
||||
}
|
||||
|
||||
func VerifyAuthentication(c *fiber.Ctx, cookie string) (*jwt.StandardClaims, error) {
|
||||
|
||||
token, err := jwt.ParseWithClaims(cookie, &jwt.StandardClaims{}, func(token *jwt.Token) (interface{}, error) {
|
||||
return []byte(os.Getenv("API_SECRET")), nil
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
claims := token.Claims.(*jwt.StandardClaims)
|
||||
|
||||
return claims, nil
|
||||
}
|
||||
|
||||
func ProcessToken(c *fiber.Ctx) (interface{}, error) {
|
||||
bearToken := c.Get("Authorization")
|
||||
|
||||
var token string
|
||||
|
||||
// Normally Authorization HTTP header.
|
||||
onlyToken := strings.Split(bearToken, " ")
|
||||
if len(onlyToken) == 2 {
|
||||
token = onlyToken[1]
|
||||
} else {
|
||||
token = bearToken
|
||||
}
|
||||
|
||||
tk, err := jwt.Parse(token, jwtKeyFunc)
|
||||
|
||||
if err != nil {
|
||||
fmt.Println("Error 1")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
claims, ok := tk.Claims.(jwt.MapClaims)
|
||||
|
||||
if ok && tk.Valid {
|
||||
fmt.Printf("claims user: %v\n", claims["user"])
|
||||
return claims["user"], nil
|
||||
}
|
||||
|
||||
return nil, err
|
||||
}
|
||||
|
||||
func jwtKeyFunc(token *jwt.Token) (interface{}, error) {
|
||||
return []byte(os.Getenv("API_SECRET")), nil
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue