Mercurial > mercurial > hgweb_rsearcher.cgi
comparison go/server.go @ 16:b651aa41b9d4 default tip
hhsinfo method (server)
| author | pyon@macmini |
|---|---|
| date | Mon, 15 Jul 2019 07:03:05 +0900 |
| parents | c262e17de9b1 |
| children |
comparison
equal
deleted
inserted
replaced
| 15:c262e17de9b1 | 16:b651aa41b9d4 |
|---|---|
| 1 /* | 1 /* |
| 2 server.go : server-program. | 2 server.go : server-program. |
| 3 Version : 1.5 | 3 Version : 1.6 |
| 4 Last Change: 2019-05-29 水 08:58:19. | 4 Last Change: 2019-07-15 Mon 06:34:42. |
| 5 | 5 |
| 6 install to: server_root/ | 6 install to: server_root/ |
| 7 | 7 |
| 8 server_root/server | 8 server_root/server |
| 9 + db/ | 9 + db/ |
| 12 */ | 12 */ |
| 13 package main | 13 package main |
| 14 | 14 |
| 15 import( | 15 import( |
| 16 "bufio" | 16 "bufio" |
| 17 "crypto/aes" | |
| 18 "crypto/cipher" | |
| 19 "encoding/hex" | |
| 17 "flag" | 20 "flag" |
| 18 "fmt" | 21 "fmt" |
| 19 "io" | 22 "io" |
| 23 "io/ioutil" | |
| 20 "log" | 24 "log" |
| 21 "net" | 25 "net" |
| 22 "net/http" | 26 "net/http" |
| 23 "os" | 27 "os" |
| 24 "path/filepath" | 28 "path/filepath" |
| 25 "strings" | 29 "strings" |
| 26 "time" | 30 "time" |
| 27 ) | 31 ) |
| 28 | 32 |
| 33 type hhs struct { | |
| 34 no string | |
| 35 name string | |
| 36 kana string | |
| 37 addr string | |
| 38 birth string | |
| 39 sex string | |
| 40 } | |
| 41 | |
| 42 func (h *hhs) String() string { | |
| 43 s := []string{h.no, h.name, h.kana, h.addr, h.birth, h.sex} | |
| 44 return strings.Join(s, ",") | |
| 45 } | |
| 46 | |
| 47 func (h *hhs) SString() string { | |
| 48 s := []string{h.no, h.name, h.kana} | |
| 49 return strings.Join(s, ",") | |
| 50 } | |
| 51 | |
| 29 var ( | 52 var ( |
| 30 version string | 53 version string |
| 31 server string | 54 server string |
| 32 port string | 55 port string |
| 33 server_root string | 56 server_root string |
| 34 logfile string | 57 logfile string |
| 35 not_ac bool | 58 not_ac bool |
| 36 wlfile string | 59 wlfile string |
| 60 | |
| 61 hdbfile string | |
| 62 key string | |
| 63 hhash map[string]hhs | |
| 37 ) | 64 ) |
| 38 | 65 |
| 39 func init() { | 66 func init() { |
| 40 version = "1.5" // piece-image version | 67 version = "1.6" // 1.6: hhs info version |
| 41 port = ":3910" | 68 port = ":3910" |
| 42 server_root = filepath.Dir(os.Args[0]) | 69 server_root = filepath.Dir(os.Args[0]) |
| 43 logfile = filepath.Join(server_root, "rsearcher.log") | 70 logfile = filepath.Join(server_root, "rsearcher.log") |
| 44 wlfile = "rsearcher.whitelist" | 71 wlfile = filepath.Join(server_root, "rsearcher.whitelist") |
| 72 | |
| 73 hdbfile = filepath.Join(server_root, "db", "hhs.db") | |
| 74 key = "1234567890abcdef1234567890abcdef" // len = 32 | |
| 75 read_hhsdb() | |
| 45 } | 76 } |
| 46 | 77 |
| 47 func main() { | 78 func main() { |
| 48 | 79 |
| 49 flag.BoolVar(¬_ac, "d", false, "no access control ( for debug )") | 80 flag.BoolVar(¬_ac, "d", false, "no access control ( for debug )") |
| 65 } | 96 } |
| 66 } | 97 } |
| 67 | 98 |
| 68 // start Web-server | 99 // start Web-server |
| 69 fmt.Println("server start [", server, "] ( program version", version, ")") | 100 fmt.Println("server start [", server, "] ( program version", version, ")") |
| 70 http.HandleFunc("/", handler ) | 101 http.HandleFunc("/", handler) |
| 71 http.HandleFunc("/upload/", upload_handler) | 102 http.HandleFunc("/upload/", upload_handler) |
| 72 http.HandleFunc("/mngdb/", mngdb_handler ) | 103 http.HandleFunc("/mngdb/", mngdb_handler) |
| 104 http.HandleFunc("/hinfo/", hinfo_handler) | |
| 105 http.HandleFunc("/hlist/", hlist_handler) | |
| 73 log.Fatal(http.ListenAndServe(server, nil)) | 106 log.Fatal(http.ListenAndServe(server, nil)) |
| 74 } | 107 } |
| 75 | 108 |
| 109 /* 各種ハンドラ */ | |
| 110 // 静的ファイル | |
| 76 func handler(w http.ResponseWriter, r *http.Request) { | 111 func handler(w http.ResponseWriter, r *http.Request) { |
| 77 if !not_ac && !is_valid_host(r.RemoteAddr) { | 112 if !not_ac && !is_valid_host(r.RemoteAddr) { |
| 78 http.NotFound(w, r) | 113 http.NotFound(w, r) |
| 79 return | 114 return |
| 80 } | 115 } |
| 98 w.Header().Set("Content-Type", "rsearcher/octet-stream") | 133 w.Header().Set("Content-Type", "rsearcher/octet-stream") |
| 99 w.Header().Set("Content-Length", fmt.Sprintf("%d", fi.Size())) | 134 w.Header().Set("Content-Length", fmt.Sprintf("%d", fi.Size())) |
| 100 io.Copy(w, f) | 135 io.Copy(w, f) |
| 101 } | 136 } |
| 102 | 137 |
| 138 // アップローダ | |
| 103 func upload_handler(w http.ResponseWriter, r *http.Request) { | 139 func upload_handler(w http.ResponseWriter, r *http.Request) { |
| 104 if !not_ac && !is_valid_host(r.RemoteAddr) { | 140 if !not_ac && !is_valid_host(r.RemoteAddr) { |
| 105 http.NotFound(w, r) | 141 http.NotFound(w, r) |
| 106 return | 142 return |
| 107 } | 143 } |
| 121 } | 157 } |
| 122 f.Close() | 158 f.Close() |
| 123 w.Write([]byte(fmt.Sprintf("%d bytes are recieved.\n", n))) | 159 w.Write([]byte(fmt.Sprintf("%d bytes are recieved.\n", n))) |
| 124 } | 160 } |
| 125 | 161 |
| 162 // データベース保存 | |
| 126 func mngdb_handler(w http.ResponseWriter, r *http.Request) { | 163 func mngdb_handler(w http.ResponseWriter, r *http.Request) { |
| 127 if !not_ac && !is_valid_host(r.RemoteAddr) { | 164 if !not_ac && !is_valid_host(r.RemoteAddr) { |
| 128 http.NotFound(w, r) | 165 http.NotFound(w, r) |
| 129 return | 166 return |
| 130 } | 167 } |
| 131 | 168 |
| 132 fmt.Println("[access]", r.RemoteAddr, "|", time.Now().Format("2006-01-02 15:04" ), "|", "/mngdb") | 169 fmt.Println("[access]", r.RemoteAddr, "|", time.Now().Format("2006-01-02 15:04" ), "|", "/mngdb") |
| 133 write_log("[access] " + r.RemoteAddr + "manage-db") | 170 write_log("[access] " + r.RemoteAddr + "manage-db") |
| 171 | |
| 134 db := r.URL.Path[len("/mngdb/"):] | 172 db := r.URL.Path[len("/mngdb/"):] |
| 135 | 173 |
| 136 file := filepath.Join(server_root, "db", db) | 174 file := filepath.Join(server_root, "db", db) |
| 137 | 175 |
| 138 f, err := os.Create(file) | 176 f, err := os.Create(file) |
| 146 return | 184 return |
| 147 } | 185 } |
| 148 f.Close() | 186 f.Close() |
| 149 } | 187 } |
| 150 | 188 |
| 189 // 被保険者情報取得 | |
| 190 func hinfo_handler(w http.ResponseWriter, r *http.Request) { | |
| 191 if !not_ac && !is_valid_host(r.RemoteAddr) { | |
| 192 http.NotFound(w, r) | |
| 193 return | |
| 194 } | |
| 195 fmt.Println("[access]", r.RemoteAddr, "|", time.Now().Format("2006-01-02 15:04" ), "|", "/hinfo") | |
| 196 write_log("[access] " + r.RemoteAddr + "hinfo") | |
| 197 | |
| 198 h := r.URL.Path[len("/hinfo/"):] | |
| 199 hhs := hhash[h] | |
| 200 | |
| 201 w.Write([]byte(hhs.String())) | |
| 202 } | |
| 203 | |
| 204 func hlist_handler(w http.ResponseWriter, r *http.Request) { | |
| 205 if !not_ac && !is_valid_host(r.RemoteAddr) { | |
| 206 http.NotFound(w, r) | |
| 207 return | |
| 208 } | |
| 209 fmt.Println("[access]", r.RemoteAddr, "|", time.Now().Format("2006-01-02 15:04" ), "|", "/hlist") | |
| 210 write_log("[access] " + r.RemoteAddr + "list") | |
| 211 | |
| 212 hlist := r.URL.Path[len("/hlist/"):] | |
| 213 var s string | |
| 214 for _, h := range strings.Split(hlist, ":") { | |
| 215 hhs := hhash[h] | |
| 216 s += hhs.SString() + "\n" | |
| 217 } | |
| 218 | |
| 219 w.Write([]byte(s)) | |
| 220 } | |
| 221 | |
| 222 // ホワイトリスト判定 | |
| 151 func is_valid_host(host string) bool { | 223 func is_valid_host(host string) bool { |
| 152 f, _ := os.Open(wlfile) | 224 f, _ := os.Open(wlfile) |
| 153 defer f.Close() | 225 defer f.Close() |
| 154 input := bufio.NewScanner(f) | 226 input := bufio.NewScanner(f) |
| 155 for input.Scan() { | 227 for input.Scan() { |
| 158 } | 230 } |
| 159 } | 231 } |
| 160 return false | 232 return false |
| 161 } | 233 } |
| 162 | 234 |
| 235 // 被保険者DB読み込み | |
| 236 func read_hhsdb() { | |
| 237 hhash = make(map[string]hhs) | |
| 238 pt := decrypto(key, hdbfile) | |
| 239 for _, line := range strings.Split(pt, "\n") { | |
| 240 c := strings.Split(line, ",") | |
| 241 if len(c) == 6 { | |
| 242 hhash[c[0]] = hhs{no: c[0], name: c[1], kana: c[2], addr: c[3], birth: c[4], sex: c[5]} | |
| 243 } | |
| 244 } | |
| 245 } | |
| 246 | |
| 247 // 復号化 | |
| 248 func decrypto( key, file string ) string { | |
| 249 k, _ := hex.DecodeString(key) | |
| 250 block, err := aes.NewCipher(k) | |
| 251 if err != nil { | |
| 252 panic( err ) | |
| 253 } | |
| 254 ciphertext, err := ioutil.ReadFile(file) | |
| 255 if err != nil { | |
| 256 log.Fatal(err) | |
| 257 } | |
| 258 | |
| 259 iv := ciphertext[ :aes.BlockSize ] | |
| 260 plaintext := make([]byte, len(ciphertext[ aes.BlockSize: ])) | |
| 261 stream := cipher.NewCTR(block, iv) | |
| 262 stream.XORKeyStream(plaintext, ciphertext[ aes.BlockSize: ]) | |
| 263 | |
| 264 return string(plaintext) | |
| 265 } | |
| 266 | |
| 267 // ログ | |
| 163 func write_log(msg string) { | 268 func write_log(msg string) { |
| 164 f, err := os.OpenFile(logfile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) | 269 f, err := os.OpenFile(logfile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) |
| 165 if err != nil { | 270 if err != nil { |
| 166 log.Fatal(err) | 271 log.Fatal(err) |
| 167 } | 272 } |
