func PostBrowsercodeToClipboard(w rest.ResponseWriter, r *rest.Request) { conf := clientconfig.Get() ak := conf.Settings.Local.ClientAuthKey addr := conf.Settings.Local.ClientBindAddr bc := browsercode.BrowserCode{Key: ak} err := bc.SetHostport(addr) if err != nil { apiutils.WriteRestError(w, apierrors.NewInternalError(err)) return } err = bc.CopyToClipboard() if err != nil { apiutils.WriteRestError(w, apierrors.NewInternalError(err)) return } w.WriteJson(true) }
func startInternalHTTPServer(authKey string) error { lg.V(15).Infoln("starting internal api server") mux, err := createServeMux() if err != nil { lg.Error("failed to create router") return err } auth := Auth{Key: authKey, wrapped: mux} conf := clientconfig.Get() listener, err := net.Listen("tcp", conf.Settings.Local.ClientBindAddr) if err != nil { lg.Warning(err) listener, err = net.Listen("tcp", "127.0.0.1:") } if err != nil { lg.Warning(err) ui.Notify("Could not bind any local port (bootstrap)") lg.Errorln("Could not bind any local port (bootstrap)") return err } go func(listenaddr string) { // baseURL := fmt.Sprintf() baseURL := fmt.Sprintf("http://%s?suk=", listenaddr) for { select { case <-ui.Actions.CopyBrowserCodeToClipboard: bc := browsercode.BrowserCode{Key: authKey} err := bc.SetHostport(listener.Addr().String()) if err != nil { lg.Errorln(err) continue } err = bc.CopyToClipboard() if err != nil { lg.Errorln(err) } case <-ui.Actions.OpenInBrowser: browser.OpenURL(baseURL + singleUseKeys.New() + "#/") case <-ui.Actions.Help: browser.OpenURL(baseURL + singleUseKeys.New() + "#/docs/__/index") } singleUseKeys.Cleanup() } }(listener.Addr().String()) doneC := make(chan bool, 1) go func() { defer listener.Close() err = http.Serve(listener, auth) if err != nil { doneC <- false } }() select { case ok := <-doneC: if !ok { return errors.New("Could not start internal http server") } case <-time.After(time.Millisecond * 200): return nil } return nil }