Skip to content

Commit a13f63d

Browse files
committed
allow to derpmap iniitalization if it fails
In case network is not available or firewall is blocking outgoing connections and we cannot get best derp region, do not crash and allow to retry the whole process.
1 parent 13d918b commit a13f63d

File tree

2 files changed

+31
-19
lines changed

2 files changed

+31
-19
lines changed

ScreenBuddy.c

+27-15
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ static DWORD CALLBACK Buddy_GetBestDerpRegionThread(LPVOID Arg)
274274
uint8_t Buffer[64 * 1024];
275275
size_t BufferSize = Buddy_DownloadDerpMap(Buddy->HttpSession, Buffer, sizeof(Buffer));
276276

277-
JsonObject* Json = JsonObject_Parse((char*)Buffer, (int)BufferSize);
277+
JsonObject* Json = BufferSize ? JsonObject_Parse((char*)Buffer, (int)BufferSize) : NULL;
278278
JsonObject* Regions = JsonObject_GetObject(Json, JsonCSTR("Regions"));
279279
JsonIterator* Iterator = JsonObject_GetIterator(Regions);
280280
if (Iterator)
@@ -2373,6 +2373,7 @@ static INT_PTR CALLBACK Buddy_DialogProc(HWND Dialog, UINT Message, WPARAM WPara
23732373

23742374
SetFocus(GetDlgItem(Dialog, BUDDY_ID_SHARE_COPY));
23752375

2376+
Buddy->DialogWindow = Dialog;
23762377
Buddy->DerpRegionThread = CreateThread(NULL, 0, &Buddy_GetBestDerpRegionThread, Buddy, 0, NULL);
23772378
Assert(Buddy->DerpRegionThread);
23782379
}
@@ -2485,18 +2486,28 @@ static INT_PTR CALLBACK Buddy_DialogProc(HWND Dialog, UINT Message, WPARAM WPara
24852486
}
24862487
else if (Control == BUDDY_ID_SHARE_NEW)
24872488
{
2488-
DerpNet_CreateNewKey(&Buddy->MyPrivateKey);
2489-
DerpNet_GetPublicKey(&Buddy->MyPrivateKey, &Buddy->MyPublicKey);
2489+
if (Buddy->DerpRegion == 0)
2490+
{
2491+
Edit_SetText(GetDlgItem(Dialog, BUDDY_ID_SHARE_KEY), L"...initializing...");
24902492

2491-
DATA_BLOB BlobInput = { sizeof(Buddy->MyPrivateKey), Buddy->MyPrivateKey.Bytes };
2492-
DATA_BLOB BlobOutput;
2493-
BOOL Protected = CryptProtectData(&BlobInput, NULL, NULL, NULL, NULL, CRYPTPROTECT_UI_FORBIDDEN, &BlobOutput);
2494-
Assert(Protected);
2493+
Buddy->DerpRegionThread = CreateThread(NULL, 0, &Buddy_GetBestDerpRegionThread, Buddy, 0, NULL);
2494+
Assert(Buddy->DerpRegionThread);
2495+
}
2496+
else
2497+
{
2498+
DerpNet_CreateNewKey(&Buddy->MyPrivateKey);
2499+
DerpNet_GetPublicKey(&Buddy->MyPrivateKey, &Buddy->MyPublicKey);
24952500

2496-
WritePrivateProfileStructW(BUDDY_CONFIG, L"DerpPrivateKey", BlobOutput.pbData, BlobOutput.cbData, Buddy->ConfigPath);
2497-
LocalFree(BlobOutput.pbData);
2501+
DATA_BLOB BlobInput = { sizeof(Buddy->MyPrivateKey), Buddy->MyPrivateKey.Bytes };
2502+
DATA_BLOB BlobOutput;
2503+
BOOL Protected = CryptProtectData(&BlobInput, NULL, NULL, NULL, NULL, CRYPTPROTECT_UI_FORBIDDEN, &BlobOutput);
2504+
Assert(Protected);
24982505

2499-
Dialog_ShowShareKey(GetDlgItem(Dialog, BUDDY_ID_SHARE_KEY), Buddy->DerpRegion, &Buddy->MyPublicKey);
2506+
WritePrivateProfileStructW(BUDDY_CONFIG, L"DerpPrivateKey", BlobOutput.pbData, BlobOutput.cbData, Buddy->ConfigPath);
2507+
LocalFree(BlobOutput.pbData);
2508+
2509+
Dialog_ShowShareKey(GetDlgItem(Dialog, BUDDY_ID_SHARE_KEY), Buddy->DerpRegion, &Buddy->MyPublicKey);
2510+
}
25002511
}
25012512
else if (Control == BUDDY_ID_CONNECT_PASTE)
25022513
{
@@ -2561,15 +2572,16 @@ static INT_PTR CALLBACK Buddy_DialogProc(HWND Dialog, UINT Message, WPARAM WPara
25612572

25622573
case BUDDY_WM_BEST_REGION:
25632574
{
2575+
WaitForSingleObject(Buddy->DerpRegionThread, INFINITE);
2576+
CloseHandle(Buddy->DerpRegionThread);
2577+
25642578
if (WParam == 0)
25652579
{
2566-
MessageBoxW(Buddy->DialogWindow, L"Cannot determine best DERP region!", L"Error", MB_ICONERROR);
2567-
ExitProcess(0);
2580+
Edit_SetText(GetDlgItem(Dialog, BUDDY_ID_SHARE_KEY), L"Error!");
2581+
MessageBoxW(Buddy->DialogWindow, L"Cannot determine best DERP region! Please check your\ninternet connection and retry new code generation.", BUDDY_TITLE, MB_ICONERROR);
2582+
return 0;
25682583
}
2569-
25702584
Buddy->DerpRegion = (uint32_t)WParam;
2571-
WaitForSingleObject(Buddy->DerpRegionThread, INFINITE);
2572-
CloseHandle(Buddy->DerpRegionThread);
25732585

25742586
wchar_t DerpRegionText[128];
25752587
StrFormat(DerpRegionText, L"%u", Buddy->DerpRegion);

external/WindowsJson.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ JsonIterator* JsonObject_GetIterator(JsonObject* Object)
157157
__FIIterator_1___FIKeyValuePair_2_HSTRING_Windows__CData__CJson__CIJsonValue* Iterator = NULL;
158158

159159
__FIIterable_1___FIKeyValuePair_2_HSTRING_Windows__CData__CJson__CIJsonValue* Iterable;
160-
if (SUCCEEDED(__x_ABI_CWindows_CData_CJson_CIJsonObject_QueryInterface(Object, &IID_IMap_IJsonValue, (void**)&Iterable)))
160+
if (Object && SUCCEEDED(__x_ABI_CWindows_CData_CJson_CIJsonObject_QueryInterface(Object, &IID_IMap_IJsonValue, (void**)&Iterable)))
161161
{
162162
HR(__FIIterable_1___FIKeyValuePair_2_HSTRING_Windows__CData__CJson__CIJsonValue_First(Iterable, &Iterator));
163163

@@ -180,7 +180,7 @@ HSTRING JsonIterator_GetKey(JsonIterator* Iterator)
180180
HSTRING Result = NULL;
181181

182182
__FIKeyValuePair_2_HSTRING_Windows__CData__CJson__CIJsonValue* Current;
183-
if (SUCCEEDED(__FIIterator_1___FIKeyValuePair_2_HSTRING_Windows__CData__CJson__CIJsonValue_get_Current(Iterator, &Current)))
183+
if (Iterator && SUCCEEDED(__FIIterator_1___FIKeyValuePair_2_HSTRING_Windows__CData__CJson__CIJsonValue_get_Current(Iterator, &Current)))
184184
{
185185
HR(__FIKeyValuePair_2_HSTRING_Windows__CData__CJson__CIJsonValue_get_Key(Current, &Result));
186186
__FIKeyValuePair_2_HSTRING_Windows__CData__CJson__CIJsonValue_Release(Current);
@@ -194,7 +194,7 @@ JsonObject* JsonIterator_GetValue(JsonIterator* Iterator)
194194
JsonObject* Result = NULL;
195195

196196
__FIKeyValuePair_2_HSTRING_Windows__CData__CJson__CIJsonValue* Current;
197-
if (SUCCEEDED(__FIIterator_1___FIKeyValuePair_2_HSTRING_Windows__CData__CJson__CIJsonValue_get_Current(Iterator, &Current)))
197+
if (Iterator && SUCCEEDED(__FIIterator_1___FIKeyValuePair_2_HSTRING_Windows__CData__CJson__CIJsonValue_get_Current(Iterator, &Current)))
198198
{
199199
__x_ABI_CWindows_CData_CJson_CIJsonValue* Value;
200200
HR(__FIKeyValuePair_2_HSTRING_Windows__CData__CJson__CIJsonValue_get_Value(Current, &Value));
@@ -210,7 +210,7 @@ JsonObject* JsonIterator_GetValue(JsonIterator* Iterator)
210210
bool JsonIterator_Next(JsonIterator* Iterator)
211211
{
212212
boolean Result;
213-
if (FAILED(__FIIterator_1___FIKeyValuePair_2_HSTRING_Windows__CData__CJson__CIJsonValue_MoveNext(Iterator, &Result)))
213+
if (Iterator && FAILED(__FIIterator_1___FIKeyValuePair_2_HSTRING_Windows__CData__CJson__CIJsonValue_MoveNext(Iterator, &Result)))
214214
{
215215
Result = 0;
216216
}

0 commit comments

Comments
 (0)