/
confidential.go
221 lines (201 loc) · 5.61 KB
/
confidential.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
package controllers
import(
"os"
"io"
"fmt"
"time"
"image"
"os/exec"
"strings"
"strconv"
"mime/multipart"
"net/http"
_ "image/jpeg"
_ "image/png"
_ "image/gif"
"github.com/alessio/shellescape"
"github.com/ECHibiki/Community-Banners-2.0/bannerdb"
)
func init(){
fmt.Print("")
}
func getUserData(name string) ([]map[string]string ){
banners ,err := bannerdb.Query(`
SELECT fk_name , uri , url , clicks, size , board FROM ads
WHERE fk_name = ? ORDER BY id DESC
` , []interface{}{name})
if err != nil{
panic(err)
}
return banners;
}
func getMimeType(image multipart.File) string{
file_header := make([]byte, 512)
// Copy the headers into the FileHeader buffer
_, err := image.Read(file_header)
if err != nil {
panic(err)
}
image.Seek(0, io.SeekStart)
return http.DetectContentType(file_header)
}
func writeTmpFile( name string , image multipart.File) string{
fname := strings.ReplaceAll("tmp-" + strconv.Itoa(int(time.Now().Unix())) + "-" + name , "." , "-", )
fname = strings.ReplaceAll(fname , "/" , "-")
tmp_location := controller_settings.PublicPath + "storage/tmp/" + fname
handler, err := os.OpenFile(tmp_location,os.O_WRONLY|os.O_CREATE, 0775)
if err != nil {
return ""
}
defer handler.Close()
_ , err = io.Copy(handler , image )
if err != nil {
panic(err)
}
return tmp_location
}
func getImageDimensions(mem_image multipart.File) (int , int){
decode_image, _, err := image.Decode(mem_image)
if err != nil {
panic(err)
}
bounds := decode_image.Bounds()
mem_image.Seek(0, io.SeekStart)
return bounds.Max.X , bounds.Max.Y
}
func checkUniqueBanner(tmp_path string) (string , string){
safe_name := shellescape.Quote(tmp_path)
blockhash_cmd := exec.Command("blockhash", safe_name)
hash_result, err := blockhash_cmd.Output()
// var err_buffer , output_buffer bytes.Buffer
// blockhash_cmd.Stdout = &output_buffer
// blockhash_cmd.Stderr = &err_buffer
// hash_result := output_buffer.String()
// err_result := err_buffer.String()
if string(hash_result) == "" || err != nil{
return "Issue reading banner - 1" , ""
}
hash_result_arr := strings.Split(string(hash_result) , " ")
if len(hash_result_arr) != 3{
return "Issue reading banner - 2", ""
}
hash_result_str := hash_result_arr[0]
fmt.Println("hash_result_str" , hash_result_str)
match , err := bannerdb.Query(`
SELECT * FROM ads WHERE hash = ?
` , []interface{}{hash_result_str})
if err != nil{
panic(err)
}
if len(match) != 0{
return "This banner is not unique" , ""
} else{
return "", hash_result_str
}
}
func generateHashedFileName(tmp_path string) string{
safe_name := shellescape.Quote(tmp_path)
sha_cmd := exec.Command("sha1sum", safe_name)
sha1_and_file_result, err := sha_cmd.Output()
if err != nil{
panic(err)
}
sha1 := strings.Split(string(sha1_and_file_result) , " ")
if len(sha1) != 3 {
panic("sha1 hash issue" )
}
if sha1[0] == ""{
panic("sha1 hash issue" )
}
return sha1[0]
}
func affirmImageIsOwned(name string, uri string) bool{
banner , err := bannerdb.Query(`
SELECT * FROM ads WHERE fk_name = ? AND uri = ?
` , []interface{}{name , uri})
if err != nil{
panic(err)
}
return len(banner) == 1
}
func removeAdImage(uri string){
err := os.Remove(controller_settings.PublicPath + uri)
if err != nil{
// panic(err)
}
}
func removeAdSQL(name string, uri string){
_ , err := bannerdb.Query(`
DELETE FROM ads WHERE uri = ? AND fk_name = ?
` , []interface{}{uri , name})
fmt.Println(`
DELETE FROM ads WHERE uri = ? AND fk_name = ?
` , []interface{}{uri , name})
if err != nil{
panic(err)
}
}
func doCreationCooldown(ip string) int{
time_now := time.Now().Unix()
rows , err := bannerdb.Query(`
SELECT * FROM antispam WHERE ip = ? AND type="banner" AND unix >= ?
ORDER BY unix ASC
` , []interface{}{ ip , time_now} )
if err != nil{
panic (err)
}
timer := 0
if len(rows) != 0{
u , _ := strconv.Atoi(rows[0]["unix"])
timer = u - int(time_now)
}
return timer / 60
}
func insertHaltCooldown(ip string){
// freeze uploads for 5 sec to prevent duplicates
cooldown := time.Now().Unix() + 5
_ , err := bannerdb.Query(`
INSERT INTO antispam VALUES (? , ? , ?)
` , []interface{}{ip , cooldown , "banner"} )
if err != nil{
panic (err)
}
}
func updateCreationCooldown(ip string){
time_now := time.Now().Unix()
cooldown := time_now + controller_settings.BannerInterval * 60
_ , err := bannerdb.Query(`
DELETE FROM antispam WHERE unix < ? AND type="banner"
` , []interface{}{ time_now} )
if err != nil{
panic (err)
}
_ , err = bannerdb.Query(`
INSERT INTO antispam VALUES (? , ? , ?)
` , []interface{}{ip , cooldown , "banner"} )
if err != nil{
panic (err)
}
}
func getBase64(path string ) string{
safe_name := shellescape.Quote(path)
b64_cmd := exec.Command("base64", safe_name)
b64_or_err, err := b64_cmd.Output()
if err != nil{
panic(err)
}
b64 := strings.Split(string(b64_or_err) , " ")
if len(b64) != 1 {
panic("Base64 encode issue")
}
return b64[0]
}
func addBanner(name string, file_path string, url string, ip string, size string,
hash string , board string){
_ , err := bannerdb.Query(`
INSERT INTO ads VALUES (? , ? , ? , ? , ? , 0 , ? , NULL , ? )
` , []interface{}{name , file_path , url , ip , size , hash , board })
if err != nil{
panic(err)
}
}