Пример #1
0
    public void FillHistory(ThinWebClientHistory history)
    {
        this.HistoryItems = new List <SelectListItem>();

        this.HistoryItems.Add(new SelectListItem("", ""));

        foreach (var item in history.Items.AsEnumerable().Reverse())
        {
            this.HistoryItems.Add(new SelectListItem(item.Pcid, $"/?pcid={item.Pcid._MakeVerySafeAsciiOnlyNonSpaceString()}"));
        }
    }
Пример #2
0
    public static ThinWebClientHistory LoadFromCookie(Controller c, string easyEncryptPassword)
    {
        ThinWebClientHistory ret = new ThinWebClientHistory();

        for (int i = 0; i < ThinWebClientConsts.MaxHistory; i++)
        {
            string tagName = $"thin_history_{i:D4}";
            var    data    = c._EasyLoadCookie <ThinWebClientProfile>(tagName, true, easyEncryptPassword);
            if (data != null)
            {
                ret.Items.Add(data);
            }
        }

        return(ret);
    }
Пример #3
0
    public async Task <IActionResult> IndexAsync(ThinWebClientModelIndex form, string?pcid, string?deleteAll, string?button_wol)
    {
        ThinWebClientProfile?historySelectedProfile = null;

        ThinWebClientProfile profile = form.CurrentProfile;

        profile.Normalize();

        ThinWebClientHistory history = ThinWebClientHistory.LoadFromCookie(this, this.Client.SettingsFastSnapshot.CookieEncryptPassword);

        if (this._IsPostBack())
        {
            if (profile.Pcid._IsFilled())
            {
                // 現在のプロファイルの保存
                this._EasySaveCookie("thin_current_profile", profile.CloneAsDefault(), GetCookieOption(), true, this.Client.SettingsFastSnapshot.CookieEncryptPassword);

                // ヒストリへの追加
                history.Add(profile);
                history.SaveToCookie(this, GetCookieOption(), this.Client.SettingsFastSnapshot.CookieEncryptPassword);

                // thin_last_pcid の保存
                this._EasySaveCookie("thin_last_pcid", profile.Pcid, GetCookieOption());

                var    clientIp   = Request.HttpContext.Connection.RemoteIpAddress._UnmapIPv4() !;
                var    clientPort = Request.HttpContext.Connection.RemotePort;
                string clientFqdn = await Client.DnsResolver.GetHostNameSingleOrIpAsync(clientIp);

                // Rate limit
                if (this.Client.RateLimit.TryInput(clientIp.ToString(), out _) == false)
                {
                    throw new CoresException(this.Page.Stb["THINWEB_RATELIMIT_EXCEEDED"]);
                }

                var tc = this.Client.CreateThinClient(this.StrTable);

                if (button_wol._ToBool() == false)
                {
                    // 普通の接続
                    WideTunnelClientOptions wideOptions = new WideTunnelClientOptions(WideTunnelClientFlags.None, clientIp.ToString(), clientFqdn, clientPort);

                    // セッションの開始
                    var session = tc.StartConnect(new ThinClientConnectOptions(profile.Pcid, clientIp, clientFqdn, this.Client.SettingsFastSnapshot.Debug_EnableGuacdMode, wideOptions, form.IsWebpSupported, profile.Preference, profile._CloneWithJson()),
                                                  this.Client.SettingsFastSnapshot.MaxConcurrentSessionsPerClientIp);
                    string sessionId = session.SessionId;

                    // セッション ID をもとにした URL にリダイレクト
                    return(Redirect($"/ThinWebClient/Session/{sessionId}/?pcid={profile.Pcid._MakeVerySafeAsciiOnlyNonSpaceString()}"));
                }
                else
                {
                    try
                    {
                        // WoL 信号の発射
                        WideTunnelClientOptions wideOptions = new WideTunnelClientOptions(WideTunnelClientFlags.WoL, clientIp.ToString(), clientFqdn, clientPort);

                        await tc.ExecuteWoLAsync(new ThinClientConnectOptions(profile.Preference.WoLTriggerPcid, clientIp, clientFqdn, false, wideOptions, form.IsWebpSupported, profile.Preference, profile._CloneWithJson()),
                                                 profile.Pcid, this._GetRequestCancellationToken());

                        // WoL OK メッセージ
                        form.WolOkMessage = this.Page.Stb["DU_WOL_MSG"]._FormatC(profile.Pcid, profile.Preference.WoLTriggerPcid);
                    }
                    catch (Exception ex)
                    {
                        // WoL エラーメッセージの文字列化
                        string msg = ThinWebClientErrorUtil.GetFriendlyErrorMessage(ex, this.Page);

                        form.WolErrorMessage = msg;

                        form.JumpToWol = true;
                    }
                }
            }
        }
        else
        {
            if (pcid._IsEmpty())
            {
                // Query String の pcid が空の場合、Cookie から読み出す
                pcid = this._EasyLoadCookie <string>("thin_last_pcid")._NonNullTrim();
            }

            if (deleteAll._ToBool())
            {
                // History をすべて消去するよう指示された
                // Cookie の History をすべて消去する
                history.Clear();
                history.SaveToCookie(this, GetCookieOption(), this.Client.SettingsFastSnapshot.CookieEncryptPassword);
                this._EasySaveCookie("thin_last_pcid", "", GetCookieOption());

                // トップページにリダイレクトする
                return(Redirect("/"));
            }
            else if (pcid._IsFilled())
            {
                // History から履歴を指定された。id を元に履歴からプロファイルを読み出す
                historySelectedProfile = history.Items.Where(h => h.Pcid._IsSamei(pcid)).FirstOrDefault();
            }

            if (historySelectedProfile == null)
            {
                // デフォルト値
                GuaKeyboardLayout defaultKeyboardLayout = GuaKeyboardLayout.Japanese;

                if (Page.CurrentLanguage.Key._IsSamei("ja") == false)
                {
                    // 日本語以外の環境では英語キーボードをデフォルトで選択する
                    defaultKeyboardLayout = GuaKeyboardLayout.EnglishUs;
                }

                profile = this._EasyLoadCookie <ThinWebClientProfile>("thin_current_profile", true, this.Client.SettingsFastSnapshot.CookieEncryptPassword) ?? new ThinWebClientProfile(defaultKeyboardLayout);
            }
            else
            {
                // History で選択された値
                profile = historySelectedProfile;
            }

            profile.Normalize();
            form.CurrentProfile = profile;

            // GET の場合は必ず PCID 入力ボックスをフォーカスする
            form.FocusToPcid = true;
        }

        form.FillHistory(history);

        if (historySelectedProfile != null)
        {
            form.SelectedHistory = form.HistoryItems.Where(x => x.Text._IsSamei(historySelectedProfile.Pcid)).FirstOrDefault()?.Value ?? "";
        }

        return(View(form));
    }