initial gdrive client
This commit is contained in:
+12
-9
@@ -28,16 +28,20 @@ add_executable(ezremote_client
|
||||
source/web/urn.cpp
|
||||
source/webdav/client.cpp
|
||||
source/http/httplib.cpp
|
||||
source/http/baseclient.cpp
|
||||
source/http/apache.cpp
|
||||
source/http/iis.cpp
|
||||
source/http/nginx.cpp
|
||||
source/http/npxserve.cpp
|
||||
source/clients/baseclient.cpp
|
||||
source/clients/apache.cpp
|
||||
source/clients/ftpclient.cpp
|
||||
source/clients/gdrive.cpp
|
||||
source/clients/iis.cpp
|
||||
source/clients/nginx.cpp
|
||||
source/clients/npxserve.cpp
|
||||
source/clients/smbclient.cpp
|
||||
source/clients/webdavclient.cpp
|
||||
source/server/http_server.cpp
|
||||
source/actions.cpp
|
||||
source/config.cpp
|
||||
source/crypt.c
|
||||
source/fs.cpp
|
||||
source/ftpclient.cpp
|
||||
source/gui.cpp
|
||||
source/getentropy.c
|
||||
source/ime_dialog.cpp
|
||||
@@ -46,10 +50,8 @@ add_executable(ezremote_client
|
||||
source/lang.cpp
|
||||
source/main.cpp
|
||||
source/orbis_jbc.c
|
||||
source/sys_modules.cpp
|
||||
source/smbclient.cpp
|
||||
source/system.cpp
|
||||
source/windows.cpp
|
||||
source/webdavclient.cpp
|
||||
source/zip_util.cpp
|
||||
)
|
||||
|
||||
@@ -75,6 +77,7 @@ target_link_libraries(ezremote_client
|
||||
minizip
|
||||
un7zip
|
||||
unrar
|
||||
json-c
|
||||
kernel
|
||||
SceShellCoreUtil
|
||||
SceSysmodule
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDqDCCApCgAwIBAgIUSlUxeW2iMsLD8Lk3+ffGUfxej6QwDQYJKoZIhvcNAQEL
|
||||
BQAwYzELMAkGA1UEBhMCWloxDDAKBgNVBAgMA1N1bjENMAsGA1UEBwwETW9vbjEQ
|
||||
MA4GA1UECgwHTWVyY3VyeTERMA8GA1UECwwISG9tZWJyZXcxEjAQBgNVBAMMCWxv
|
||||
Y2FsaG9zdDAgFw0yMzAyMjUwNzAyMTNaGA8yMDUzMDIxNzA3MDIxM1owYzELMAkG
|
||||
A1UEBhMCWloxDDAKBgNVBAgMA1N1bjENMAsGA1UEBwwETW9vbjEQMA4GA1UECgwH
|
||||
TWVyY3VyeTERMA8GA1UECwwISG9tZWJyZXcxEjAQBgNVBAMMCWxvY2FsaG9zdDCC
|
||||
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOWQx+pfhpDqd2wPkV5BL6Yf
|
||||
8UVTCsP13+1YlxZiD93VHhcK23T/YYqSxx6tDHAR4sA/oKELT+dFuhMhC/QE5Sw6
|
||||
HD/FwCwdNJ7Ke3z+iUActtInDU5URC0XwdW7wTAt1MLx4T9j7CkoVHsaiDlf6LTG
|
||||
165bIXD8JKzud26WXHmTCCBCgIU3zcq13jpFeb4Po4rJtuDLwb3gloZzEzdS9S6O
|
||||
mjVNUSlZeb+ksep3TbJHIACy6WrPJZ+u2aScDOBOt9Gv/UeOYHcvGIFHXddG+kHl
|
||||
/ay6b7JxNbBNWL57/PswmXcpB16gkBNWCfL1PDmDFEkvd6uJTnPUnMge7CBNzX8C
|
||||
AwEAAaNSMFAwHwYDVR0jBBgwFoAUeCZ0CXLAs8C5xVsPGIhzu4haXpEwCQYDVR0T
|
||||
BAIwADAiBgNVHREEGzAZgglsb2NhbGhvc3SCCTEyNy4wLjAuMYIBKjANBgkqhkiG
|
||||
9w0BAQsFAAOCAQEAsgC/89C7+OAspaOgU5Tr9WFcZ1Nph21WTltBM0z9f4NyeR1Y
|
||||
b/YoJrvocRWw9gpgCcj7AArSHNsha2+QMBEko3PIpkdMoSHylf2WqYNTCIb8cvJA
|
||||
pHDYJJR99Cajo0meP5h1mtQdjOVv70Q3jtS6iSdD/KI5VwIRcfDutjHys78Bb2NQ
|
||||
1KEZuHKwmhE3209OQ5ZbjDQ0gViJFPnfPfnbWuOllpIN27ZwGvlhhM9x7xRvwsWt
|
||||
puh5wV2TBAYagOT+canBOxugv7L1eOpnNVE49YS0vr5y8JhLuKFoZ0hTi7PeqO4c
|
||||
mE4zIVwKjIQ6w+N2Vj/ghNjkyJm0azpmnbPtFg==
|
||||
-----END CERTIFICATE-----
|
||||
@@ -0,0 +1,17 @@
|
||||
-----BEGIN CERTIFICATE REQUEST-----
|
||||
MIICqDCCAZACAQAwYzELMAkGA1UEBhMCWloxDDAKBgNVBAgMA1N1bjENMAsGA1UE
|
||||
BwwETW9vbjEQMA4GA1UECgwHTWVyY3VyeTERMA8GA1UECwwISG9tZWJyZXcxEjAQ
|
||||
BgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
|
||||
AOWQx+pfhpDqd2wPkV5BL6Yf8UVTCsP13+1YlxZiD93VHhcK23T/YYqSxx6tDHAR
|
||||
4sA/oKELT+dFuhMhC/QE5Sw6HD/FwCwdNJ7Ke3z+iUActtInDU5URC0XwdW7wTAt
|
||||
1MLx4T9j7CkoVHsaiDlf6LTG165bIXD8JKzud26WXHmTCCBCgIU3zcq13jpFeb4P
|
||||
o4rJtuDLwb3gloZzEzdS9S6OmjVNUSlZeb+ksep3TbJHIACy6WrPJZ+u2aScDOBO
|
||||
t9Gv/UeOYHcvGIFHXddG+kHl/ay6b7JxNbBNWL57/PswmXcpB16gkBNWCfL1PDmD
|
||||
FEkvd6uJTnPUnMge7CBNzX8CAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4IBAQB2gc2Z
|
||||
7bzytAja4uDQQjQOxZMzwwgfODyQTWhvyEVJxq7iK8Saogn/dpjgeVhNaIgMAGRs
|
||||
RNQ26cBQxvs9ZfNmNcNvc1eFw9NJicRpHOUjNf0mMHtqiFIpGc9Fnu34p1DLGKJ4
|
||||
qp5Kd9cl4Vx96xaPWqCyH+sXFxnIt8lK6K0yKHaDXLKzFmuJvEEc2Z/g0/RRfgq7
|
||||
cO9+otlsD3sF6TziNL/KFFYPqgn4Wkx8K8z9ovpMnyvYH1KnQsuhCNr9nUhmA8Wu
|
||||
o9DMKQbqDYq9NLUmTJMgX75Vi71idbkgOZN7kvmUnEW+Ltf1FLl9AnF5kpkvMTvR
|
||||
KIcPUOLLdpzwZ8jc
|
||||
-----END CERTIFICATE REQUEST-----
|
||||
@@ -0,0 +1,7 @@
|
||||
authorityKeyIdentifier=keyid,issuer
|
||||
basicConstraints=CA:FALSE
|
||||
subjectAltName = @alt_names
|
||||
[alt_names]
|
||||
DNS.1 = localhost
|
||||
DNS.2 = 127.0.0.1
|
||||
DNS.3 = *
|
||||
@@ -0,0 +1,30 @@
|
||||
-----BEGIN ENCRYPTED PRIVATE KEY-----
|
||||
MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIDkuJpr20dpYCAggA
|
||||
MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECAKW47FhDo5vBIIEyNJd7CLIboON
|
||||
iXmQ5Vzj7nHna+HXfPdrNGUnAtRKQ7oZmAvPJQMqrEO88am5zl/puOThwdJ/b+tp
|
||||
Ftt76zi8JffShf0fwNeL3zOfiVEUSmGeOfRzx4MV1flivbk70UjHx4ga9Nqdab6t
|
||||
0dvV8copWkmj+B/sP2zk3+S9Urv6VPz97hq6PTqrmjWm+VwssDJyv9s7KGM/+9bC
|
||||
/9DQR5AAQbd4e7sxW45cL9desyRfs0XNcYj6Go9sVHzFhKaSx75u6Shd5Rb2N5sX
|
||||
2Dmm349cy3XimqNBCsrPIp76uLfCIhSp/pgC6phMeIu52SrFwM2OOwCuPkGZyVQv
|
||||
I6n0vagltBHXYj5a371P9imV8LWTCy326yb6Ro1Mjy6XEMWVIBk/XI/U12APHytf
|
||||
c1VvCk1pGemD3ArVYpuECdjtwZxxCOneOxeIYgSV/h3GHMHKmQiK36zQOslNNdfy
|
||||
l7AO6kokITWoW/VPk2FG0tclWJe1aA8WOiqI3ZYRwBlovk9jUrjNqEA3BG/rzAWU
|
||||
VbApXd4FvbsgLETHRZl1KWvwZFhO9vZ02+CznrnzzMWCb13UipCA7RuePuhdbViT
|
||||
jOy1JJG408NcwRu0PNwr77oIZu7OrdEPu0u7YJ+SR/q3pxS6u86l6O3lvbUhtOyC
|
||||
1grybOa+lJXrAL07yrbriCoy8igNIMKiA8blwpwCC/22CtGrY5UJqzpLIZuTLcnB
|
||||
8pVoFioSGetvsjpzRsv6jCsacdAZwhuYEUCi82wFW1yd3UNCVMh6U8ypspQp3wz3
|
||||
tbdoGbzlwbwbgd2o9+MpxzW66s2emEsCBjG+SrNElZBkfAG8ZgSbF3yGlSe778BJ
|
||||
7O71TEjxmYfUglvn90ZWpV7IH1TNbaKeIOJXkmuqQDaiG6U61kHcq//QvuZfU/tv
|
||||
TEUlQGqbdYS1E7+byCxubUnD3rclSP1cMTGyUtacHGUzFhiCZfuuDc+1P1Q8wKTe
|
||||
NkGfMpmXWLSncVUDEPgpsuz+hCtt65BAb0BfCWLZPyBXQ4Qbovk6Z/O5Ta5tyWEl
|
||||
g2wRqFXUL8ZYk+TKbmSclU+1h3QfFwvyEmEGFi+igKRZR1ERB4cAEEDjOJP+uI7B
|
||||
3K7lomdeh4kuPG6move8PCm9Dw1GhWPVFCKoan0MW2sNfnhmoOqXkoMT6P+M4U7+
|
||||
DjHY+G5Op2jkP+BrHQ99VRApXz40MtLaOdfu6S+IWURnqqwPuL99We8XFMgX3xX4
|
||||
++v7lSkcp54uSoN5e/fY/2fYG/RPxaI6+W6oxP4YmxUZjdvGdZvJiJJGqIBzCj1p
|
||||
26WynwFu25wnsyXBzWo4wzH4Ga6ZtUvb59KFRTSJqQKieLVmX2zNjSps2B2/twax
|
||||
EQt03AGIbtr677NeYKM3BUws+iw9TyBUjEMsqnpp6EuWhDcPga8WJn1ivw04BenP
|
||||
uaOw2w1nLe8InaJxahmBKmRiSjX7XX4+PPgB/FwGN89nMBpy8+ujitteOYvlY6Hf
|
||||
050aTysBmYWu4oCsx/kz8OHpwt7zPO8zkVdtHCGa8+5bm//pLUGHyoDVY2Xj68MD
|
||||
OMfwbJl0Q4W+bOkCEK4fYhkB7HWPZqxZKujcR/goXBsUCvIk/WuDx8pNnjIas1Qm
|
||||
MUDSs9XQFGWE8ydRYN4RRw==
|
||||
-----END ENCRYPTED PRIVATE KEY-----
|
||||
@@ -0,0 +1,22 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDqTCCApGgAwIBAgIUbNUnFW+Ibevm3bOTzzznsNO4laIwDQYJKoZIhvcNAQEL
|
||||
BQAwYzELMAkGA1UEBhMCWloxDDAKBgNVBAgMA1N1bjENMAsGA1UEBwwETW9vbjEQ
|
||||
MA4GA1UECgwHTWVyY3VyeTERMA8GA1UECwwISG9tZWJyZXcxEjAQBgNVBAMMCWxv
|
||||
Y2FsaG9zdDAgFw0yMzAyMjUwNjU4MTJaGA8yMDUzMDIxNzA2NTgxMlowYzELMAkG
|
||||
A1UEBhMCWloxDDAKBgNVBAgMA1N1bjENMAsGA1UEBwwETW9vbjEQMA4GA1UECgwH
|
||||
TWVyY3VyeTERMA8GA1UECwwISG9tZWJyZXcxEjAQBgNVBAMMCWxvY2FsaG9zdDCC
|
||||
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMBF0q8GELLjXu6zTTNtCovU
|
||||
QVsgg8kSN56p8Xxv5gZHEuhUXjan+UyiklW2aoxJZpyRbE8dpAR78ca6kLUG1LMf
|
||||
2RX8FDjA6W5xXR2C2FmSYGnPyLigRFPbZv3sb7PyOYhqgPuu1xKMEmq5n1lE9pCV
|
||||
nO7hAsfwqS3mZrPFL3MZIqrT6HqeSO1tVe8gUUWTm3dm9Yb0E/sVExdG6u0RfbVu
|
||||
eqHykO4iCUonm3lOigskDbZ7WFKQyVRM3vZbALEpE7YlltcgT14GmG+L8aeFY6iT
|
||||
FoPDV7bFAGtgg30os4kV135HUNJ80koIoUocwxThuyBpADltIZ5R2FSHBl1XzK8C
|
||||
AwEAAaNTMFEwHQYDVR0OBBYEFHgmdAlywLPAucVbDxiIc7uIWl6RMB8GA1UdIwQY
|
||||
MBaAFHgmdAlywLPAucVbDxiIc7uIWl6RMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
|
||||
hvcNAQELBQADggEBAGW6HVweWcsIxp2vVzspBaKSp2ECYRpx4xunge/eDWlokAj3
|
||||
OCW7kxgPfEbtClLOeQj3p9WolHzABgG+qqIB6kPbGtNXYaXrQbsD6j9f56GFklNK
|
||||
tuYH3WtDpp5TLsYyj2cLeK2x02Z8k3+r11SqB1DeMPTBAkhXiTwrkUt3axnZuiZC
|
||||
2Miwzi0b5muMbdecYukB+50xlV8TkiVmWUtQ5cVVE/U640sC6O1GMZG0zO9Ys0+U
|
||||
xTeB/3Xq5Wg6OQx86GpbD7+8xRhSkdJxoVbuFgh0KNUlBREC/pYobehnwji7WWFH
|
||||
F7nBdVyedi6qZTa7dVEk4eaXgalemTp9k4rzbZ8=
|
||||
-----END CERTIFICATE-----
|
||||
@@ -0,0 +1,30 @@
|
||||
-----BEGIN ENCRYPTED PRIVATE KEY-----
|
||||
MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIoyT8iwjhZBECAggA
|
||||
MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECKy1pYbVGbtDBIIEyIIY1X/XVv5q
|
||||
ihMCTQbnesuyEstQCw/9BFQ/ka4Ee2D6yJp59gSiEODwce+EgIn1jrgJImOZbnsz
|
||||
xKtRJXNd+ENBwsZgh8am15o+bJ2WeOztuKcrhOvrRmj8wrDPAon4+sdcfphqRUbG
|
||||
hilLbV7T8jpE1ScTD/zYU/KKWEIytYTxT+vfHvXYv8oQY9IscwNqx6cnXxNtoO7C
|
||||
SO87/Apkul3irVHnad29gV/jyj4imlm6gVCmqByaD/JaV/d9Y0hWhZVeSzceP64Q
|
||||
95kfhUM8AsTJi5A25vWAQAxa2Gi8ywiv+/NRVC4qhzMID4wbqI/2Oy8iEMJJfkaK
|
||||
Ah/S5lY8sVRpenUmX4kSZs+oKbITc5LNccx5OUESvVZCj/mW9t91uZfTWTt23iac
|
||||
snYzhH4PvYxCGU7LXzrgS5suv/N3R33E5kcND0dJbKkW4VVVxmv7HUDfs8YqduJn
|
||||
teQFQNsoNuQO5Te9WsMpamickF/65nrg+OOhsbVkLsuCRPzyXIRgAPBBGFqlr3IG
|
||||
XK41kQR5I4HTAeFXCClz00LfLrCl+T7IO3NbH+AD1EVGUHYPuwgJBRic/cMbXZwT
|
||||
Kcxo98Apwsm+OHKRAq4c5wEmUb9ipVSwq6CRUojklrGMclJfXnd9r57FFl/9eYdY
|
||||
ZEp+jnAqq3M8v2m29dPjja07CTIuimIRgIPaIjWZuZX8oW1GVpapV3JfIun5KXE4
|
||||
Sc+ScLA015Gzm/3hgKNke5HGYH49x9V/lYhr9j5AxgdWnoj4H3qbJSu2jJKooYmS
|
||||
tsimgs3pqz/dygyx9Zmy2L5eb597MYEQwg4kZdFPyixAttmFXRdXVvRmQCB9H8VX
|
||||
kx6z4Rus/Zh6NM6z0aHvWoaih9jJ444CdnOPLYSngLL5yzI3xunwT67Di9rrkNeL
|
||||
nVBJP9Ljc9cE4LgK63xAy+25+bZWv/mZ07CBXatc91CCSa/O3KM4eLmOMNaZNU+T
|
||||
P8EYHR3r24V6TCzud7dLp3k+Glkxj1feiXEktmFxnfUbGoS5Ihw4cVGqrst7hSSE
|
||||
IaQFIx0X70sKyl/ixxVHWIMdV4Zqdxhf2boNZk7aHx8+yOhCnOEY4/8KUJM98W+W
|
||||
a6VRhxYucKsz+B3i0BKEZg4sB1bT/6G17JAentfGmKp42IFJR3JeRydEF6ppCaWT
|
||||
gdLnRlsYDHEpAMcTPsbDiQK3Crid3E0i/2QU5V5VEhR2ncq+oKZ0oy7nwoOV232W
|
||||
TuodV43urEshbh8RDr321+2UxCgT6AGMAt6BPgx9D/mIZHMVgZalvHqtzPDyN5Av
|
||||
5LiXct8nl4fO+c0iMdfAw2TfCvl6sIkaAW5ClqbHXxiSg9OUXSrfgBVMkcCmcnB0
|
||||
cNbx6Xc6jdLZEtnch+IcYZzj4wmLFx01zVAs9daPxbGw6mg1TloDQ0fYhgixkRSi
|
||||
NDkztXZzLFx9MB4rYy/v8h08OWwNi/R6IOZDI4DNf7qXEtgqouqa85srsT9Pspc4
|
||||
SAN5YzHlo6AKujmUNRo+uYbJGqsssMXQPWNvozxnXIgQsiZ5/Y/x3KsUJu49RveL
|
||||
baNm/ScI3ghTbt92bPE16ebtodULkxuPFAqXdjWXLjblSVihiKxvQ9wTULB97zHI
|
||||
1oX6YdWladLddzK/De6JMA==
|
||||
-----END ENCRYPTED PRIVATE KEY-----
|
||||
@@ -0,0 +1 @@
|
||||
4A5531796DA232C2C3F0B937F9F7C651FC5E8FA5
|
||||
@@ -120,3 +120,12 @@ STR_SAVE=Save
|
||||
STR_MAX_EDIT_FILE_SIZE_MSG=Cannot edit files bigger than
|
||||
STR_DELETE_LINE=Delete Selected Line
|
||||
STR_INSERT_LINE=Insert Below Selected Line
|
||||
STR_FAIL_GET_TOKEN_MSG=Failed to obtain an access token from
|
||||
STR_GET_TOKEN_SUCCESS_MSG=Login Success. You may close the browser and return to the application
|
||||
STR_PERM_DRIVE=See, edit, create, and delete all of your Google Drive files
|
||||
STR_PERM_DRIVE_APPDATA=See, create, and delete its own configuration data in your Google Drive
|
||||
STR_PERM_DRIVE_FILE=See, edit, create, and delete only the specific Google Drive files you use with this app
|
||||
STR_PERM_DRIVE_METADATA=View and manage metadata of files in your Google Drive
|
||||
STR_PERM_DRIVE_METADATA_RO=See information about your Google Drive files
|
||||
STR_GOOGLE_LOGIN_FAIL_MSG=Google login failed
|
||||
STR_GOOGLE_LOGIN_TIMEOUT_MSG=Google login timed out
|
||||
|
||||
+16
-10
@@ -4,7 +4,14 @@
|
||||
#include <lexbor/html/parser.h>
|
||||
#include <lexbor/dom/interfaces/element.h>
|
||||
#include <minizip/unzip.h>
|
||||
#include "crypt.h"
|
||||
#include "clients/gdrive.h"
|
||||
#include "clients/ftpclient.h"
|
||||
#include "clients/smbclient.h"
|
||||
#include "clients/webdavclient.h"
|
||||
#include "clients/apache.h"
|
||||
#include "clients/nginx.h"
|
||||
#include "clients/npxserve.h"
|
||||
#include "clients/iis.h"
|
||||
#include "common.h"
|
||||
#include "fs.h"
|
||||
#include "config.h"
|
||||
@@ -15,15 +22,9 @@
|
||||
#include "installer.h"
|
||||
#include "web/request.hpp"
|
||||
#include "web/urn.hpp"
|
||||
#include "sys_modules.h"
|
||||
#include "ftpclient.h"
|
||||
#include "smbclient.h"
|
||||
#include "webdavclient.h"
|
||||
#include "http/apache.h"
|
||||
#include "http/nginx.h"
|
||||
#include "http/npxserve.h"
|
||||
#include "http/iis.h"
|
||||
#include "system.h"
|
||||
#include "zip_util.h"
|
||||
#include "dbglogger.h"
|
||||
|
||||
namespace Actions
|
||||
{
|
||||
@@ -1109,7 +1110,12 @@ namespace Actions
|
||||
{
|
||||
CONFIG::SaveConfig();
|
||||
|
||||
if (strncmp(remote_settings->server, "https://", 8) == 0 || strncmp(remote_settings->server, "http://", 7) == 0)
|
||||
if (strncmp(remote_settings->server, GOOGLE_DRIVE_BASE_URL, strlen(GOOGLE_DRIVE_BASE_URL)) == 0)
|
||||
{
|
||||
remoteclient = new GDriveClient();
|
||||
remoteclient->Connect("", "", "");
|
||||
}
|
||||
else if (strncmp(remote_settings->server, "https://", 8) == 0 || strncmp(remote_settings->server, "http://", 7) == 0)
|
||||
{
|
||||
if (strcmp(remote_settings->http_server_type, HTTP_SERVER_APACHE) == 0)
|
||||
remoteclient = new ApacheClient();
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
#include <lexbor/dom/interfaces/element.h>
|
||||
#include <fstream>
|
||||
#include "common.h"
|
||||
#include "remote_client.h"
|
||||
#include "http/apache.h"
|
||||
#include "clients/remote_client.h"
|
||||
#include "clients/apache.h"
|
||||
#include "lang.h"
|
||||
#include "util.h"
|
||||
#include "windows.h"
|
||||
@@ -4,9 +4,9 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "http/httplib.h"
|
||||
#include "http/baseclient.h"
|
||||
#include "clients/remote_client.h"
|
||||
#include "clients/baseclient.h"
|
||||
#include "common.h"
|
||||
#include "remote_client.h"
|
||||
|
||||
class ApacheClient : public BaseClient
|
||||
{
|
||||
@@ -1,9 +1,10 @@
|
||||
#include <lexbor/html/parser.h>
|
||||
#include <lexbor/dom/interfaces/element.h>
|
||||
#include <fstream>
|
||||
#include <curl/curl.h>
|
||||
#include "common.h"
|
||||
#include "remote_client.h"
|
||||
#include "http/npxserve.h"
|
||||
#include "clients/remote_client.h"
|
||||
#include "clients/baseclient.h"
|
||||
#include "lang.h"
|
||||
#include "util.h"
|
||||
#include "windows.h"
|
||||
@@ -76,12 +77,12 @@ int BaseClient::Get(const std::string &outputfile, const std::string &path, uint
|
||||
std::ofstream file_stream(outputfile, std::ios::binary);
|
||||
bytes_transfered = 0;
|
||||
if (auto res = client->Get(GetFullPath(path),
|
||||
[&](const char *data, size_t data_length)
|
||||
{
|
||||
file_stream.write(data, data_length);
|
||||
bytes_transfered += data_length;
|
||||
return true;
|
||||
}))
|
||||
[&](const char *data, size_t data_length)
|
||||
{
|
||||
file_stream.write(data, data_length);
|
||||
bytes_transfered += data_length;
|
||||
return true;
|
||||
}))
|
||||
{
|
||||
file_stream.close();
|
||||
return 1;
|
||||
@@ -126,21 +127,22 @@ int BaseClient::Move(const std::string &from, const std::string &to)
|
||||
int BaseClient::Head(const std::string &path, void *buffer, uint64_t len)
|
||||
{
|
||||
char range_header[64];
|
||||
sprintf(range_header, "bytes=%lu-%lu", 0L, len-1);
|
||||
sprintf(range_header, "bytes=%lu-%lu", 0L, len - 1);
|
||||
Headers headers = {{"Range", range_header}};
|
||||
size_t bytes_read = 0;
|
||||
std::vector<char> body;
|
||||
if (auto res = client->Get(GetFullPath(path), headers,
|
||||
[&](const char *data, size_t data_length)
|
||||
{
|
||||
body.insert(body.end(), data, data+data_length);
|
||||
bytes_read += data_length;
|
||||
if (bytes_read > len)
|
||||
return false;
|
||||
return true;
|
||||
}))
|
||||
[&](const char *data, size_t data_length)
|
||||
{
|
||||
body.insert(body.end(), data, data + data_length);
|
||||
bytes_read += data_length;
|
||||
if (bytes_read > len)
|
||||
return false;
|
||||
return true;
|
||||
}))
|
||||
{
|
||||
if (body.size() < len) return 0;
|
||||
if (body.size() < len)
|
||||
return 0;
|
||||
memcpy(buffer, body.data(), len);
|
||||
return 1;
|
||||
}
|
||||
@@ -242,3 +244,38 @@ uint32_t BaseClient::SupportedActions()
|
||||
{
|
||||
return REMOTE_ACTION_DOWNLOAD | REMOTE_ACTION_INSTALL;
|
||||
}
|
||||
|
||||
std::string BaseClient::EncodeUrl(const std::string &url)
|
||||
{
|
||||
CURL *curl = curl_easy_init();
|
||||
if (curl)
|
||||
{
|
||||
char *output = curl_easy_escape(curl, url.c_str(), url.length());
|
||||
if (output)
|
||||
{
|
||||
std::string encoded_url = std::string(output);
|
||||
curl_free(output);
|
||||
return encoded_url;
|
||||
}
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
std::string BaseClient::DecodeUrl(const std::string &url)
|
||||
{
|
||||
CURL *curl = curl_easy_init();
|
||||
if (curl)
|
||||
{
|
||||
int decode_len;
|
||||
char *output = curl_easy_unescape(curl, url.c_str(), url.length(), &decode_len);
|
||||
if (output)
|
||||
{
|
||||
std::string decoded_url = std::string(output, decode_len);
|
||||
curl_free(output);
|
||||
return decoded_url;
|
||||
}
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
return "";
|
||||
}
|
||||
@@ -4,8 +4,8 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "http/httplib.h"
|
||||
#include "clients/remote_client.h"
|
||||
#include "common.h"
|
||||
#include "remote_client.h"
|
||||
|
||||
class BaseClient : public RemoteClient
|
||||
{
|
||||
@@ -33,6 +33,8 @@ public:
|
||||
int Quit();
|
||||
ClientType clientType();
|
||||
uint32_t SupportedActions();
|
||||
static std::string EncodeUrl(const std::string &url);
|
||||
static std::string DecodeUrl(const std::string &url);
|
||||
|
||||
protected:
|
||||
httplib::Client *client;
|
||||
@@ -1,4 +1,4 @@
|
||||
#include <sys/errno.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/time.h>
|
||||
@@ -12,7 +12,7 @@
|
||||
#include <errno.h>
|
||||
|
||||
#include "lang.h"
|
||||
#include "ftpclient.h"
|
||||
#include "clients/ftpclient.h"
|
||||
#include "util.h"
|
||||
#include "windows.h"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#include <time.h>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "remote_client.h"
|
||||
#include "clients/remote_client.h"
|
||||
|
||||
#define FTP_CLIENT_MAX_FILENAME_LEN 128
|
||||
|
||||
@@ -0,0 +1,190 @@
|
||||
#include <orbis/UserService.h>
|
||||
#include <lexbor/html/parser.h>
|
||||
#include <lexbor/dom/interfaces/element.h>
|
||||
#include <json-c/json.h>
|
||||
#include "config.h"
|
||||
#include "common.h"
|
||||
#include "server/http_server.h"
|
||||
#include "clients/remote_client.h"
|
||||
#include "clients/gdrive.h"
|
||||
#include "lang.h"
|
||||
#include "util.h"
|
||||
#include "windows.h"
|
||||
#include "system.h"
|
||||
#include "dbglogger.h"
|
||||
|
||||
using namespace httplib;
|
||||
|
||||
std::string GetRedirectUrl()
|
||||
{
|
||||
return std::string("https://localhost:" + std::to_string(http_server_port) + "/google_auth");
|
||||
}
|
||||
|
||||
std::string GetScopes()
|
||||
{
|
||||
std::vector<std::string> permissions = Util::Split(gg_account.permissions, ",");
|
||||
std::string scopes;
|
||||
for (int i = 0; i < permissions.size(); i++)
|
||||
{
|
||||
scopes.append("https://www.googleapis.com/auth/");
|
||||
scopes.append(permissions[i]);
|
||||
if (i < permissions.size() - 1)
|
||||
{
|
||||
scopes.append(" ");
|
||||
}
|
||||
}
|
||||
return scopes;
|
||||
}
|
||||
|
||||
void RefreshAccessToken()
|
||||
{
|
||||
SSLClient client(GOOGLE_OAUTH_HOST);
|
||||
client.enable_server_certificate_verification(false);
|
||||
std::string url = std::string("/token?code=") + gg_account.auth_code + "&client_id=" + gg_account.client_id + "&client_secret=" +
|
||||
gg_account.client_secret + "&grant_type=refresh_token&refresh_token=" + gg_account.refresh_token;
|
||||
Result result = client.Post(url);
|
||||
|
||||
if (result.error() == Error::Success && result.value().status == 200)
|
||||
{
|
||||
json_object *jobj = json_tokener_parse(result.value().body.c_str());
|
||||
enum json_type type;
|
||||
json_object_object_foreach(jobj, key, val)
|
||||
{
|
||||
if (strcmp(key, "access_token") == 0)
|
||||
snprintf(gg_account.access_token, 255, "%s", json_object_get_string(val));
|
||||
else if (strcmp(key, "expires_in") == 0)
|
||||
{
|
||||
OrbisTick tick;
|
||||
sceRtcGetCurrentTick(&tick);
|
||||
gg_account.token_expiry = tick.mytick + (json_object_get_int(val) * 1000000);
|
||||
}
|
||||
}
|
||||
CONFIG::SaveGoolgeAccountInfo();
|
||||
}
|
||||
}
|
||||
|
||||
int login_state;
|
||||
|
||||
int GDriveClient::Connect(const std::string &url, const std::string &user, const std::string &pass)
|
||||
{
|
||||
OrbisTick tick;
|
||||
sceRtcGetCurrentTick(&tick);
|
||||
dbglogger_log("token_expiry=%ld, tick=%ld", gg_account.token_expiry, tick.mytick);
|
||||
if (gg_account.token_expiry < (tick.mytick - 300000000))
|
||||
{
|
||||
SceShellUIUtilLaunchByUriParam param;
|
||||
param.size = sizeof(SceShellUIUtilLaunchByUriParam);
|
||||
sceUserServiceGetForegroundUser((int *)¶m.userId);
|
||||
|
||||
std::string auth_url = std::string(GOOGLE_AUTH_URL "?client_id=") + gg_account.client_id + "&redirect_uri=" + GetRedirectUrl() +
|
||||
"&response_type=code&access_type=offline&scope=" + GetScopes() + "&include_granted_scopes=true";
|
||||
auth_url = EncodeUrl(auth_url);
|
||||
std::string launch_uri = std::string("pswebbrowser:search?url=") + auth_url;
|
||||
int ret = sceShellUIUtilLaunchByUri(launch_uri.c_str(), ¶m);
|
||||
dbglogger_log("sceShellUIUtilLaunchByUri - 0x%08x", ret);
|
||||
|
||||
login_state = 0;
|
||||
OrbisTick tick;
|
||||
sceRtcGetCurrentTick(&tick);
|
||||
while (login_state == 0)
|
||||
{
|
||||
OrbisTick cur_tick;
|
||||
sceRtcGetCurrentTick(&cur_tick);
|
||||
if (cur_tick.mytick - tick.mytick > 120000000)
|
||||
{
|
||||
login_state = -2;
|
||||
break;
|
||||
}
|
||||
sceKernelUsleep(100000);
|
||||
}
|
||||
|
||||
if (login_state == -1)
|
||||
{
|
||||
sprintf(response, "%s", lang_strings[STR_GOOGLE_LOGIN_FAIL_MSG]);
|
||||
return 0;
|
||||
}
|
||||
else if (login_state == -2)
|
||||
{
|
||||
sprintf(response, "%s", lang_strings[STR_GOOGLE_LOGIN_TIMEOUT_MSG]);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
StartRefreshToken();
|
||||
|
||||
client = new Client(GOOGLE_API_URL);
|
||||
client->set_bearer_token_auth(gg_account.access_token);
|
||||
client->set_keep_alive(true);
|
||||
client->set_follow_location(true);
|
||||
client->set_connection_timeout(30);
|
||||
client->set_read_timeout(30);
|
||||
client->enable_server_certificate_verification(false);
|
||||
this->connected = true;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
std::vector<DirEntry> GDriveClient::ListDir(const std::string &path)
|
||||
{
|
||||
std::vector<DirEntry> out;
|
||||
DirEntry entry;
|
||||
memset(&entry, 0, sizeof(DirEntry));
|
||||
if (path[path.length() - 1] == '/' && path.length() > 1)
|
||||
{
|
||||
strlcpy(entry.directory, path.c_str(), path.length() - 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(entry.directory, "%s", path.c_str());
|
||||
}
|
||||
sprintf(entry.name, "..");
|
||||
sprintf(entry.path, "%s", entry.directory);
|
||||
sprintf(entry.display_size, "%s", lang_strings[STR_FOLDER]);
|
||||
entry.file_size = 0;
|
||||
entry.isDir = true;
|
||||
entry.selectable = false;
|
||||
out.push_back(entry);
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
ClientType GDriveClient::clientType()
|
||||
{
|
||||
return CLIENT_TYPE_GOOGLE;
|
||||
}
|
||||
|
||||
uint32_t GDriveClient::SupportedActions()
|
||||
{
|
||||
return REMOTE_ACTION_ALL;
|
||||
}
|
||||
|
||||
void *GDriveClient::RefreshTokenThread(void *argp)
|
||||
{
|
||||
while (refresh_token_running)
|
||||
{
|
||||
OrbisTick tick;
|
||||
sceRtcGetCurrentTick(&tick);
|
||||
if (tick.mytick >= (gg_account.token_expiry - 300000000)) // refresh token 5mins before expiry
|
||||
{
|
||||
RefreshAccessToken();
|
||||
}
|
||||
sceKernelUsleep(5000000); // sleep for 5s
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void GDriveClient::StartRefreshToken()
|
||||
{
|
||||
if (refresh_token_running) return;
|
||||
|
||||
refresh_token_running = true;
|
||||
int ret = pthread_create(&refresh_token_thid, NULL, RefreshTokenThread, NULL);
|
||||
if (ret != 0)
|
||||
{
|
||||
dbglogger_log("Failed to start refresh token thread");
|
||||
}
|
||||
}
|
||||
|
||||
void GDriveClient::StopRefreshToken()
|
||||
{
|
||||
refresh_token_running = false;
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
#ifndef GDRIVE_H
|
||||
#define GDRIVE_H
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "http/httplib.h"
|
||||
#include "clients/remote_client.h"
|
||||
#include "clients/baseclient.h"
|
||||
#include "common.h"
|
||||
|
||||
static pthread_t refresh_token_thid;
|
||||
static bool refresh_token_running = false;
|
||||
extern int login_state;
|
||||
|
||||
class GDriveClient : public BaseClient
|
||||
{
|
||||
public:
|
||||
int Connect(const std::string &url, const std::string &user, const std::string &pass);
|
||||
std::vector<DirEntry> ListDir(const std::string &path);
|
||||
static void *RefreshTokenThread(void *argp);
|
||||
static void StartRefreshToken();
|
||||
static void StopRefreshToken();
|
||||
ClientType clientType();
|
||||
uint32_t SupportedActions();
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -2,8 +2,8 @@
|
||||
#include <lexbor/dom/interfaces/element.h>
|
||||
#include <fstream>
|
||||
#include "common.h"
|
||||
#include "remote_client.h"
|
||||
#include "http/iis.h"
|
||||
#include "clients/remote_client.h"
|
||||
#include "clients/iis.h"
|
||||
#include "lang.h"
|
||||
#include "util.h"
|
||||
#include "windows.h"
|
||||
@@ -4,9 +4,9 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "http/httplib.h"
|
||||
#include "http/baseclient.h"
|
||||
#include "clients/remote_client.h"
|
||||
#include "clients/baseclient.h"
|
||||
#include "common.h"
|
||||
#include "remote_client.h"
|
||||
|
||||
class IISClient : public BaseClient
|
||||
{
|
||||
@@ -4,8 +4,8 @@
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include "common.h"
|
||||
#include "remote_client.h"
|
||||
#include "http/nginx.h"
|
||||
#include "clients/remote_client.h"
|
||||
#include "clients/nginx.h"
|
||||
#include "lang.h"
|
||||
#include "util.h"
|
||||
#include "windows.h"
|
||||
@@ -4,9 +4,9 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "http/httplib.h"
|
||||
#include "http/baseclient.h"
|
||||
#include "clients/baseclient.h"
|
||||
#include "common.h"
|
||||
#include "remote_client.h"
|
||||
#include "clients/remote_client.h"
|
||||
|
||||
class NginxClient : public BaseClient
|
||||
{
|
||||
@@ -2,8 +2,8 @@
|
||||
#include <lexbor/dom/interfaces/element.h>
|
||||
#include <fstream>
|
||||
#include "common.h"
|
||||
#include "remote_client.h"
|
||||
#include "http/npxserve.h"
|
||||
#include "clients/remote_client.h"
|
||||
#include "clients/npxserve.h"
|
||||
#include "lang.h"
|
||||
#include "util.h"
|
||||
#include "windows.h"
|
||||
@@ -4,9 +4,9 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "http/httplib.h"
|
||||
#include "http/baseclient.h"
|
||||
#include "clients/baseclient.h"
|
||||
#include "clients/remote_client.h"
|
||||
#include "common.h"
|
||||
#include "remote_client.h"
|
||||
|
||||
class NpxServeClient : public BaseClient
|
||||
{
|
||||
@@ -27,6 +27,7 @@ enum ClientType
|
||||
CLIENT_TYPE_SMB,
|
||||
CLIENT_TYPE_WEBDAV,
|
||||
CLIENT_TYPE_HTTP_SERVER,
|
||||
CLIENT_TYPE_GOOGLE,
|
||||
CLINET_TYPE_UNKNOWN
|
||||
};
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
#include <orbis/Net.h>
|
||||
#include "fs.h"
|
||||
#include "lang.h"
|
||||
#include "smbclient.h"
|
||||
#include "clients/smbclient.h"
|
||||
#include "windows.h"
|
||||
#include "util.h"
|
||||
|
||||
@@ -8,8 +8,8 @@
|
||||
#include <vector>
|
||||
#include <smb2/smb2.h>
|
||||
#include <smb2/libsmb2.h>
|
||||
#include "clients/remote_client.h"
|
||||
#include "common.h"
|
||||
#include "remote_client.h"
|
||||
|
||||
#define SMB_CLIENT_MAX_FILENAME_LEN 256
|
||||
|
||||
@@ -9,10 +9,10 @@
|
||||
#include <fcntl.h>
|
||||
#include "lang.h"
|
||||
#include "webdav/client.hpp"
|
||||
#include "webdavclient.h"
|
||||
#include "clients/webdavclient.h"
|
||||
#include "windows.h"
|
||||
#include "util.h"
|
||||
#include "sys_modules.h"
|
||||
#include "system.h"
|
||||
|
||||
#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
#include <vector>
|
||||
#include <regex>
|
||||
#include "webdav/client.hpp"
|
||||
#include "clients/remote_client.h"
|
||||
#include "common.h"
|
||||
#include "remote_client.h"
|
||||
|
||||
namespace WebDAV
|
||||
{
|
||||
+99
-52
@@ -6,11 +6,13 @@
|
||||
#include <vector>
|
||||
#include <regex>
|
||||
#include <stdlib.h>
|
||||
#include "server/http_server.h"
|
||||
#include "config.h"
|
||||
#include "fs.h"
|
||||
#include "lang.h"
|
||||
#include "crypt.h"
|
||||
#include "base64.h"
|
||||
#include "dbglogger.h"
|
||||
|
||||
extern "C"
|
||||
{
|
||||
@@ -32,6 +34,8 @@ PackageUrlInfo install_pkg_url;
|
||||
char favorite_urls[MAX_FAVORITE_URLS][512];
|
||||
bool auto_delete_tmp_pkg;
|
||||
int max_edit_file_size;
|
||||
GoogleAccountInfo gg_account;
|
||||
|
||||
unsigned char cipher_key[32] = {'s', '5', 'v', '8', 'y', '/', 'B', '?', 'E', '(', 'H', '+', 'M', 'b', 'Q', 'e', 'T', 'h', 'W', 'm', 'Z', 'q', '4', 't', '7', 'w', '9', 'z', '$', 'C', '&', 'F'};
|
||||
unsigned char cipher_iv[16] = {'Y', 'p', '3', 's', '6', 'v', '9', 'y', '$', 'B', '&', 'E', ')', 'H', '@', 'M'};
|
||||
|
||||
@@ -94,7 +98,7 @@ namespace CONFIG
|
||||
}
|
||||
}
|
||||
|
||||
void LoadEncryptKeys()
|
||||
void LoadCipherKeys()
|
||||
{
|
||||
// Get the key and iv for encryption. Inject the account_id/MAC address as part of the key and iv.
|
||||
int user_id;
|
||||
@@ -123,7 +127,7 @@ namespace CONFIG
|
||||
|
||||
void LoadConfig()
|
||||
{
|
||||
LoadEncryptKeys();
|
||||
LoadCipherKeys();
|
||||
|
||||
if (!FS::FolderExists(DATA_PATH))
|
||||
{
|
||||
@@ -161,6 +165,67 @@ namespace CONFIG
|
||||
max_edit_file_size = ReadInt(CONFIG_GLOBAL, CONFIG_MAX_EDIT_FILE_SIZE, MAX_EDIT_FILE_SIZE);
|
||||
WriteInt(CONFIG_GLOBAL, CONFIG_MAX_EDIT_FILE_SIZE, max_edit_file_size);
|
||||
|
||||
// Load Google Account Info
|
||||
sprintf(gg_account.client_id, "%s", ReadString(CONFIG_GOOGLE, CONFIG_GOOGLE_CLIENT_ID, ""));
|
||||
WriteString(CONFIG_GOOGLE, CONFIG_GOOGLE_CLIENT_ID, gg_account.client_id);
|
||||
|
||||
// Token Expiry
|
||||
gg_account.token_expiry = ReadLong(CONFIG_GOOGLE, CONFIG_GOOGLE_TOKEN_EXPIRY, 0);
|
||||
WriteLong(CONFIG_GOOGLE, CONFIG_GOOGLE_TOKEN_EXPIRY, gg_account.token_expiry);
|
||||
|
||||
// Client Secret
|
||||
char tmp_gg_secret[512];
|
||||
sprintf(tmp_gg_secret, "%s", ReadString(CONFIG_GOOGLE, CONFIG_GOOGLE_CLIENT_SECRET, ""));
|
||||
std::string encrypted_secret;
|
||||
if (strlen(tmp_gg_secret) > 0)
|
||||
{
|
||||
std::string decrypted_secret;
|
||||
int ret = Decrypt(tmp_gg_secret, decrypted_secret);
|
||||
if (ret == 0)
|
||||
sprintf(gg_account.client_secret, "%s", tmp_gg_secret);
|
||||
else
|
||||
sprintf(gg_account.client_secret, "%s", decrypted_secret.c_str());
|
||||
Encrypt(gg_account.client_secret, encrypted_secret);
|
||||
}
|
||||
WriteString(CONFIG_GOOGLE, CONFIG_GOOGLE_CLIENT_SECRET, encrypted_secret.c_str());
|
||||
|
||||
// Access Token
|
||||
sprintf(tmp_gg_secret, "%s", ReadString(CONFIG_GOOGLE, CONFIG_GOOGLE_ACCESS_TOKEN, ""));
|
||||
std::string encrypted_token;
|
||||
if (strlen(tmp_gg_secret) > 0)
|
||||
{
|
||||
std::string decrypted_secret;
|
||||
int ret = Decrypt(tmp_gg_secret, decrypted_secret);
|
||||
if (ret == 0)
|
||||
sprintf(gg_account.access_token, "%s", tmp_gg_secret);
|
||||
else
|
||||
sprintf(gg_account.access_token, "%s", decrypted_secret.c_str());
|
||||
Encrypt(gg_account.access_token, encrypted_token);
|
||||
}
|
||||
WriteString(CONFIG_GOOGLE, CONFIG_GOOGLE_ACCESS_TOKEN, encrypted_token.c_str());
|
||||
|
||||
// Refresh Token
|
||||
sprintf(tmp_gg_secret, "%s", ReadString(CONFIG_GOOGLE, CONFIG_GOOGLE_REFRESH_TOKEN, ""));
|
||||
std::string encrypted_refresh_token;
|
||||
if (strlen(tmp_gg_secret) > 0)
|
||||
{
|
||||
std::string decrypted_secret;
|
||||
int ret = Decrypt(tmp_gg_secret, decrypted_secret);
|
||||
if (ret == 0)
|
||||
sprintf(gg_account.refresh_token, "%s", tmp_gg_secret);
|
||||
else
|
||||
sprintf(gg_account.refresh_token, "%s", decrypted_secret.c_str());
|
||||
Encrypt(gg_account.refresh_token, encrypted_refresh_token);
|
||||
}
|
||||
WriteString(CONFIG_GOOGLE, CONFIG_GOOGLE_REFRESH_TOKEN, encrypted_refresh_token.c_str());
|
||||
|
||||
sprintf(gg_account.permissions, "%s", ReadString(CONFIG_GOOGLE, CONFIG_GOOGLE_PERMISSIONS, GOOGLE_DEFAULT_PERMISSIONS));
|
||||
WriteString(CONFIG_GOOGLE, CONFIG_GOOGLE_PERMISSIONS, gg_account.permissions);
|
||||
|
||||
// Http Server Info
|
||||
http_server_port = ReadInt(CONFIG_HTTP_SERVER, CONFIG_HTTP_SERVER_PORT, 8080);
|
||||
WriteInt(CONFIG_HTTP_SERVER, CONFIG_HTTP_SERVER_PORT, http_server_port);
|
||||
|
||||
for (int i = 0; i < sites.size(); i++)
|
||||
{
|
||||
RemoteSettings setting;
|
||||
@@ -212,14 +277,12 @@ namespace CONFIG
|
||||
WriteString(CONFIG_GLOBAL, CONFIG_LAST_SITE, last_site);
|
||||
|
||||
remote_settings = &site_settings[std::string(last_site)];
|
||||
|
||||
for (int i = 0; i < MAX_FAVORITE_URLS; i++)
|
||||
{
|
||||
const char *index = std::to_string(i).c_str();
|
||||
sprintf(favorite_urls[i], "%s", ReadString(CONFIG_FAVORITE_URLS, index, ""));
|
||||
WriteString(CONFIG_FAVORITE_URLS, index, favorite_urls[i]);
|
||||
}
|
||||
|
||||
WriteIniFile(CONFIG_INI_FILE);
|
||||
CloseIniFile();
|
||||
}
|
||||
@@ -245,6 +308,38 @@ namespace CONFIG
|
||||
CloseIniFile();
|
||||
}
|
||||
|
||||
void SaveGoolgeAccountInfo()
|
||||
{
|
||||
OpenIniFile(CONFIG_INI_FILE);
|
||||
|
||||
std::string encrypted_secret;
|
||||
if (strlen(gg_account.client_secret) > 0)
|
||||
Encrypt(gg_account.client_secret, encrypted_secret);
|
||||
else
|
||||
encrypted_secret = std::string(gg_account.client_secret);
|
||||
WriteString(CONFIG_GOOGLE, CONFIG_GOOGLE_CLIENT_SECRET, encrypted_secret.c_str());
|
||||
|
||||
std::string encrypted_token;
|
||||
if (strlen(gg_account.access_token) > 0)
|
||||
Encrypt(gg_account.access_token, encrypted_token);
|
||||
else
|
||||
encrypted_token = std::string(gg_account.access_token);
|
||||
WriteString(CONFIG_GOOGLE, CONFIG_GOOGLE_ACCESS_TOKEN, encrypted_token.c_str());
|
||||
|
||||
std::string encrypted_refresh_token;
|
||||
if (strlen(gg_account.refresh_token) > 0)
|
||||
Encrypt(gg_account.refresh_token, encrypted_refresh_token);
|
||||
else
|
||||
encrypted_refresh_token = std::string(gg_account.refresh_token);
|
||||
WriteString(CONFIG_GOOGLE, CONFIG_GOOGLE_REFRESH_TOKEN, encrypted_refresh_token.c_str());
|
||||
|
||||
WriteLong(CONFIG_GOOGLE, CONFIG_GOOGLE_TOKEN_EXPIRY, gg_account.token_expiry);
|
||||
WriteString(CONFIG_GOOGLE, CONFIG_GOOGLE_CLIENT_ID, gg_account.client_id);
|
||||
WriteString(CONFIG_GOOGLE, CONFIG_GOOGLE_PERMISSIONS, gg_account.permissions);
|
||||
WriteIniFile(CONFIG_INI_FILE);
|
||||
CloseIniFile();
|
||||
}
|
||||
|
||||
void SaveFavoriteUrl(int index, char *url)
|
||||
{
|
||||
OpenIniFile(CONFIG_INI_FILE);
|
||||
@@ -253,52 +348,4 @@ namespace CONFIG
|
||||
WriteIniFile(CONFIG_INI_FILE);
|
||||
CloseIniFile();
|
||||
}
|
||||
|
||||
void ParseMultiValueString(const char *prefix_list, std::vector<std::string> &prefixes, bool toLower)
|
||||
{
|
||||
std::string prefix = "";
|
||||
int length = strlen(prefix_list);
|
||||
for (int i = 0; i < length; i++)
|
||||
{
|
||||
char c = prefix_list[i];
|
||||
if (c != ' ' && c != '\t' && c != ',')
|
||||
{
|
||||
if (toLower)
|
||||
{
|
||||
prefix += std::tolower(c);
|
||||
}
|
||||
else
|
||||
{
|
||||
prefix += c;
|
||||
}
|
||||
}
|
||||
|
||||
if (c == ',' || i == length - 1)
|
||||
{
|
||||
prefixes.push_back(prefix);
|
||||
prefix = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::string GetMultiValueString(std::vector<std::string> &multi_values)
|
||||
{
|
||||
std::string vts = std::string("");
|
||||
if (multi_values.size() > 0)
|
||||
{
|
||||
for (int i = 0; i < multi_values.size() - 1; i++)
|
||||
{
|
||||
vts.append(multi_values[i]).append(",");
|
||||
}
|
||||
vts.append(multi_values[multi_values.size() - 1]);
|
||||
}
|
||||
return vts;
|
||||
}
|
||||
|
||||
void RemoveFromMultiValues(std::vector<std::string> &multi_values, std::string value)
|
||||
{
|
||||
auto itr = std::find(multi_values.begin(), multi_values.end(), value);
|
||||
if (itr != multi_values.end())
|
||||
multi_values.erase(itr);
|
||||
}
|
||||
}
|
||||
|
||||
+38
-4
@@ -3,10 +3,11 @@
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <algorithm>
|
||||
#include <map>
|
||||
|
||||
#include "remote_client.h"
|
||||
#include "clients/remote_client.h"
|
||||
|
||||
#define APP_ID "ezremote-client"
|
||||
#define DATA_PATH "/data/" APP_ID
|
||||
@@ -16,6 +17,29 @@
|
||||
|
||||
#define CONFIG_GLOBAL "Global"
|
||||
|
||||
#define CONFIG_GOOGLE "Google"
|
||||
#define CONFIG_GOOGLE_CLIENT_ID "google_client_id"
|
||||
#define CONFIG_GOOGLE_CLIENT_SECRET "google_client_secret"
|
||||
#define CONFIG_GOOGLE_PERMISSIONS "google_client_permissions"
|
||||
#define CONFIG_GOOGLE_ACCESS_TOKEN "google_access_token"
|
||||
#define CONFIG_GOOGLE_REFRESH_TOKEN "google_refresh_token"
|
||||
#define CONFIG_GOOGLE_TOKEN_EXPIRY "google_token_expiry"
|
||||
|
||||
#define GOOGLE_OAUTH_HOST "oauth2.googleapis.com"
|
||||
#define GOOGLE_AUTH_URL "https://accounts.google.com/o/oauth2/v2/auth"
|
||||
#define GOOGLE_API_URL "https://www.googleapis.com"
|
||||
#define GOOGLE_DRIVE_API_PATH "/drive/v2/files"
|
||||
#define GOOGLE_DRIVE_BASE_URL "https://drive.google.com"
|
||||
#define GOOGLE_PERM_DRIVE "drive"
|
||||
#define GOOGLE_PERM_DRIVE_APPDATA "drive.appdata"
|
||||
#define GOOGLE_PERM_DRIVE_FILE "drive.file"
|
||||
#define GOOGLE_PERM_DRIVE_METADATA "drive.metadata"
|
||||
#define GOOGLE_PERM_DRIVE_METADATA_RO "drive.metadata.readonly"
|
||||
#define GOOGLE_DEFAULT_PERMISSIONS GOOGLE_PERM_DRIVE "," GOOGLE_PERM_DRIVE_METADATA
|
||||
|
||||
#define CONFIG_HTTP_SERVER "HttpServer"
|
||||
#define CONFIG_HTTP_SERVER_PORT "http_server_port"
|
||||
|
||||
#define CONFIG_REMOTE_SERVER_NAME "remote_server_name"
|
||||
#define CONFIG_REMOTE_SERVER_URL "remote_server_url"
|
||||
#define CONFIG_REMOTE_SERVER_USER "remote_server_user"
|
||||
@@ -66,6 +90,17 @@ struct PackageUrlInfo
|
||||
char password[25];
|
||||
};
|
||||
|
||||
struct GoogleAccountInfo
|
||||
{
|
||||
char client_id[128];
|
||||
char client_secret[64];
|
||||
char auth_code[128];
|
||||
char access_token[256];
|
||||
char refresh_token[64];
|
||||
uint64_t token_expiry;
|
||||
char permissions[92];
|
||||
};
|
||||
|
||||
extern std::vector<std::string> sites;
|
||||
extern std::vector<std::string> http_servers;
|
||||
extern std::map<std::string, RemoteSettings> site_settings;
|
||||
@@ -83,15 +118,14 @@ extern bool auto_delete_tmp_pkg;
|
||||
extern int max_edit_file_size;
|
||||
extern unsigned char cipher_key[32];
|
||||
extern unsigned char cipher_iv[16];
|
||||
extern GoogleAccountInfo gg_account;
|
||||
|
||||
namespace CONFIG
|
||||
{
|
||||
void LoadConfig();
|
||||
void SaveConfig();
|
||||
void SaveGoolgeAccountInfo();
|
||||
void SaveFavoriteUrl(int index, char *url);
|
||||
void SetClientType(RemoteSettings *settings);
|
||||
void RemoveFromMultiValues(std::vector<std::string> &multi_values, std::string value);
|
||||
void ParseMultiValueString(const char *prefix_list, std::vector<std::string> &prefixes, bool toLower);
|
||||
std::string GetMultiValueString(std::vector<std::string> &multi_values);
|
||||
}
|
||||
#endif
|
||||
|
||||
+1
-1
@@ -11,7 +11,7 @@
|
||||
|
||||
#include "util.h"
|
||||
#include "lang.h"
|
||||
#include "sys_modules.h"
|
||||
#include "system.h"
|
||||
#include "windows.h"
|
||||
|
||||
namespace FS
|
||||
|
||||
+33
-12
@@ -52,7 +52,7 @@
|
||||
|
||||
------------------------------------------------------------------------
|
||||
Copyright (c) 2000 Carsten Breuer
|
||||
/************************************************************************/
|
||||
************************************************************************/
|
||||
|
||||
/* defines for, or consts and inline functions for C++ */
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
|
||||
struct ENTRY *Entry = NULL;
|
||||
struct ENTRY *CurEntry = NULL;
|
||||
char Result[4096] =
|
||||
char Result[520] =
|
||||
{""};
|
||||
FILE *IniFile;
|
||||
|
||||
@@ -84,7 +84,7 @@ struct ENTRY *MakeNewEntry(void);
|
||||
strupr -de-
|
||||
-------------------------------------------------------------------------
|
||||
Job : String to Uppercase 22.03.2001 Dieter Engelbrecht dieter@wintop.net
|
||||
/*========================================================================*/
|
||||
*========================================================================*/
|
||||
#ifdef DONT_HAVE_STRUPR
|
||||
/* DONT_HAVE_STRUPR is set when INI_REMOVE_CR is defined */
|
||||
void strupr(char *str)
|
||||
@@ -99,6 +99,7 @@ void strupr(char *str)
|
||||
str++;
|
||||
}
|
||||
}
|
||||
#else
|
||||
#endif
|
||||
|
||||
/*=========================================================================
|
||||
@@ -109,10 +110,10 @@ void strupr(char *str)
|
||||
|
||||
Att : Be sure to call CloseIniFile to free all mem allocated during
|
||||
operation!
|
||||
/*========================================================================*/
|
||||
*========================================================================*/
|
||||
bool OpenIniFile(cchr *FileName)
|
||||
{
|
||||
char Str[5120];
|
||||
char Str[512];
|
||||
char *pStr;
|
||||
struct ENTRY *pEntry;
|
||||
|
||||
@@ -127,7 +128,7 @@ bool OpenIniFile(cchr *FileName)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
while (fgets(Str, 5120, IniFile) != NULL)
|
||||
while (fgets(Str, 512, IniFile) != NULL)
|
||||
{
|
||||
pStr = strchr(Str, '\n');
|
||||
if (pStr != NULL)
|
||||
@@ -191,7 +192,7 @@ bool OpenIniFile(cchr *FileName)
|
||||
Job : Frees the memory and closes the ini file without any
|
||||
modifications. If you want to write the file use
|
||||
WriteIniFile instead.
|
||||
/*========================================================================*/
|
||||
*========================================================================*/
|
||||
void CloseIniFile(void)
|
||||
{
|
||||
FreeAllMem();
|
||||
@@ -207,7 +208,7 @@ void CloseIniFile(void)
|
||||
-------------------------------------------------------------------------
|
||||
Job : Writes the iniFile to the disk and close it. Frees all memory
|
||||
allocated by WriteIniFile;
|
||||
/*========================================================================*/
|
||||
==========================================================================*/
|
||||
bool WriteIniFile(const char *FileName)
|
||||
{
|
||||
struct ENTRY *pEntry = Entry;
|
||||
@@ -242,7 +243,7 @@ bool WriteIniFile(const char *FileName)
|
||||
void WriteString(cchr *Section, cchr *pKey, cchr *Value)
|
||||
{
|
||||
EFIND List;
|
||||
char Str[5120];
|
||||
char Str[512];
|
||||
|
||||
if (ArePtrValid(Section, pKey, Value) == FALSE)
|
||||
{
|
||||
@@ -291,6 +292,16 @@ void WriteInt(cchr *Section, cchr *pKey, int Value)
|
||||
WriteString(Section, pKey, Val);
|
||||
}
|
||||
|
||||
/*=========================================================================
|
||||
WriteLong : Writes an long to the ini file
|
||||
*========================================================================*/
|
||||
void WriteLong(cchr *Section, cchr *pKey, long Value)
|
||||
{
|
||||
char Val[22]; /* 64bit maximum + sign + \0 */
|
||||
sprintf(Val, "%ld", Value);
|
||||
WriteString(Section, pKey, Val);
|
||||
}
|
||||
|
||||
/*=========================================================================
|
||||
WriteDouble : Writes a double to the ini file
|
||||
*========================================================================*/
|
||||
@@ -343,6 +354,16 @@ int ReadInt(cchr *Section, cchr *pKey, int Default)
|
||||
return (atoi(ReadString(Section, pKey, Val)));
|
||||
}
|
||||
|
||||
/*=========================================================================
|
||||
ReadLong : Reads a long from the ini file
|
||||
*========================================================================*/
|
||||
long ReadLong(cchr *Section, cchr *pKey, long Default)
|
||||
{
|
||||
char Val[22];
|
||||
sprintf(Val, "%ld", Default);
|
||||
return (atol(ReadString(Section, pKey, Val)));
|
||||
}
|
||||
|
||||
/*=========================================================================
|
||||
ReadDouble : Reads a double from the ini file
|
||||
*========================================================================*/
|
||||
@@ -463,7 +484,7 @@ bool FindpKey(cchr *Section, cchr *pKey, EFIND *List)
|
||||
{
|
||||
char Search[130];
|
||||
char Found[130];
|
||||
char Text[5120];
|
||||
char Text[512];
|
||||
char *pText;
|
||||
struct ENTRY *pEntry;
|
||||
List->pSec = NULL;
|
||||
@@ -595,7 +616,7 @@ bool AddItemAt(struct ENTRY *EntryAt, char Mode, cchr *Text)
|
||||
*========================================================================*/
|
||||
bool AddSectionAndpKey(cchr *Section, cchr *pKey, cchr *Value)
|
||||
{
|
||||
char Text[5120];
|
||||
char Text[512];
|
||||
sprintf(Text, "[%s]", Section);
|
||||
if (AddItem(tpSECTION, Text) == FALSE)
|
||||
{
|
||||
@@ -610,7 +631,7 @@ bool AddSectionAndpKey(cchr *Section, cchr *pKey, cchr *Value)
|
||||
*========================================================================*/
|
||||
void AddpKey(struct ENTRY *SecEntry, cchr *pKey, cchr *Value)
|
||||
{
|
||||
char Text[5120];
|
||||
char Text[512];
|
||||
sprintf(Text, "%s=%s", pKey, Value);
|
||||
AddItemAt(SecEntry, tpKEYVALUE, Text);
|
||||
}
|
||||
|
||||
+3
-1
@@ -5,7 +5,7 @@
|
||||
Author(s) : Carsten Breuer
|
||||
------------------------------------------------------------------------
|
||||
Copyright (c) 2000 by Carsten Breuer (C.Breuer@openwin.de)
|
||||
/************************************************************************/
|
||||
************************************************************************/
|
||||
|
||||
#ifndef INIFILE_H
|
||||
#define INIFILE_H
|
||||
@@ -54,11 +54,13 @@ bool OpenIniFile(cchr *FileName);
|
||||
|
||||
bool ReadBool(cchr *Section, cchr *Key, bool Default);
|
||||
int ReadInt(cchr *Section, cchr *Key, int Default);
|
||||
long ReadLong(cchr *Section, cchr *Key, long Default);
|
||||
double ReadDouble(cchr *Section, cchr *Key, double Default);
|
||||
cchr *ReadString(cchr *Section, cchr *Key, cchr *Default);
|
||||
|
||||
void WriteBool(cchr *Section, cchr *Key, bool Value);
|
||||
void WriteInt(cchr *Section, cchr *Key, int Value);
|
||||
void WriteLong(cchr *Section, cchr *Key, long Value);
|
||||
void WriteDouble(cchr *Section, cchr *Key, double Value);
|
||||
void WriteString(cchr *Section, cchr *Key, cchr *Value);
|
||||
|
||||
|
||||
@@ -17,9 +17,9 @@
|
||||
#include "config.h"
|
||||
#include "windows.h"
|
||||
#include "lang.h"
|
||||
#include "sys_modules.h"
|
||||
#include "system.h"
|
||||
#include "fs.h"
|
||||
#include "webdavclient.h"
|
||||
#include "clients/webdavclient.h"
|
||||
|
||||
#define BGFT_HEAP_SIZE (1 * 1024 * 1024)
|
||||
|
||||
|
||||
+17
-8
@@ -127,14 +127,23 @@ char lang_strings[LANG_STRINGS_NUM][LANG_STR_SIZE] = {
|
||||
"This option enables Remote Package Installation. "
|
||||
"This requires a HTTP Server setup on the same host sharing the same folder with anonymous access.", // STR_ENABLE_RPI_FTP_SMB_MSG
|
||||
"This option enables Remote Package Installation. "
|
||||
"This requires the Server with anonymous access that does not need username/password.", // STR_ENABLE_RPI_WEBDAV_MSG
|
||||
"Files", // STR_FILES
|
||||
"Editor", // STR_EDITOR
|
||||
"Save", // STR_SAVE
|
||||
"Cannot edit files bigger than", // STR_MAX_EDIT_FILE_SIZE_MSG
|
||||
"Delete Selected Line", // STR_DELETE_LINE
|
||||
"Insert Below Selected Line", // STR_INSERT_LINE
|
||||
"Modified", // STR_MODIFIED
|
||||
"This requires the Server with anonymous access that does not need username/password.", // STR_ENABLE_RPI_WEBDAV_MSG
|
||||
"Files", // STR_FILES
|
||||
"Editor", // STR_EDITOR
|
||||
"Save", // STR_SAVE
|
||||
"Cannot edit files bigger than", // STR_MAX_EDIT_FILE_SIZE_MSG
|
||||
"Delete Selected Line", // STR_DELETE_LINE
|
||||
"Insert Below Selected Line", // STR_INSERT_LINE
|
||||
"Modified", // STR_MODIFIED
|
||||
"Failed to obtain an access token from", // STR_FAIL_GET_TOKEN_MSG
|
||||
"Login Success. You may close the browser and return to the application", // STR_GET_TOKEN_SUCCESS_MSG
|
||||
"See, edit, create, and delete all of your Google Drive files", // STR_PERM_DRIVE
|
||||
"See, create, and delete its own configuration data in your Google Drive", // STR_PERM_DRIVE_APPDATA
|
||||
"See, edit, create, and delete only the specific Google Drive files you use with this app", // STR_PERM_DRIVE_FILE
|
||||
"View and manage metadata of files in your Google Drive", // STR_PERM_DRIVE_METADATA
|
||||
"See information about your Google Drive files", // STR_PERM_DRIVE_METADATA_RO
|
||||
"Google login failed", // STR_GOOGLE_LOGIN_FAIL_MSG
|
||||
"Google login timed out", // STR_GOOGLE_LOGIN_TIMEOUT_MSG
|
||||
};
|
||||
|
||||
bool needs_extended_font = false;
|
||||
|
||||
+11
-2
@@ -126,7 +126,16 @@
|
||||
FUNC(STR_MAX_EDIT_FILE_SIZE_MSG) \
|
||||
FUNC(STR_DELETE_LINE) \
|
||||
FUNC(STR_INSERT_LINE) \
|
||||
FUNC(STR_MODIFIED)
|
||||
FUNC(STR_MODIFIED) \
|
||||
FUNC(STR_FAIL_GET_TOKEN_MSG) \
|
||||
FUNC(STR_GET_TOKEN_SUCCESS_MSG) \
|
||||
FUNC(STR_PERM_DRIVE) \
|
||||
FUNC(STR_PERM_DRIVE_APPDATA) \
|
||||
FUNC(STR_PERM_DRIVE_FILE) \
|
||||
FUNC(STR_PERM_DRIVE_METADATA) \
|
||||
FUNC(STR_PERM_DRIVE_METADATA_RO) \
|
||||
FUNC(STR_GOOGLE_LOGIN_FAIL_MSG) \
|
||||
FUNC(STR_GOOGLE_LOGIN_TIMEOUT_MSG)
|
||||
|
||||
#define GET_VALUE(x) x,
|
||||
#define GET_STRING(x) #x,
|
||||
@@ -136,7 +145,7 @@ enum
|
||||
FOREACH_STR(GET_VALUE)
|
||||
};
|
||||
|
||||
#define LANG_STRINGS_NUM 123
|
||||
#define LANG_STRINGS_NUM 132
|
||||
#define LANG_ID_SIZE 64
|
||||
#define LANG_STR_SIZE 384
|
||||
extern char lang_identifiers[LANG_STRINGS_NUM][LANG_ID_SIZE];
|
||||
|
||||
+9
-1
@@ -17,12 +17,14 @@
|
||||
#include "SDL2/SDL.h"
|
||||
#include "imgui_impl_sdl.h"
|
||||
#include "imgui_impl_sdlrenderer.h"
|
||||
#include "server/http_server.h"
|
||||
#include "clients/gdrive.h"
|
||||
#include "config.h"
|
||||
#include "lang.h"
|
||||
#include "gui.h"
|
||||
#include "util.h"
|
||||
#include "installer.h"
|
||||
#include "sys_modules.h"
|
||||
#include "system.h"
|
||||
|
||||
extern "C"
|
||||
{
|
||||
@@ -288,6 +290,7 @@ int main()
|
||||
return 0;
|
||||
|
||||
CONFIG::LoadConfig();
|
||||
HttpServer::Start();
|
||||
|
||||
// Create a window context
|
||||
window = SDL_CreateWindow("main", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, FRAME_WIDTH, FRAME_HEIGHT, 0);
|
||||
@@ -316,6 +319,11 @@ int main()
|
||||
|
||||
atexit(terminate);
|
||||
|
||||
OrbisTick tick;
|
||||
sceRtcGetCurrentTick(&tick);
|
||||
if (gg_account.token_expiry > (tick.mytick - 300000000))
|
||||
GDriveClient::StartRefreshToken();
|
||||
|
||||
GUI::RenderLoop(renderer);
|
||||
|
||||
SDL_DestroyRenderer(renderer);
|
||||
|
||||
@@ -0,0 +1,165 @@
|
||||
#include <string>
|
||||
#include <json-c/json.h>
|
||||
#include "http/httplib.h"
|
||||
#include "server/http_server.h"
|
||||
#include "clients/gdrive.h"
|
||||
#include "config.h"
|
||||
#include "windows.h"
|
||||
#include "lang.h"
|
||||
#include "system.h"
|
||||
#include "dbglogger.h"
|
||||
|
||||
#define SERVER_CERT_FILE "/app0/assets/certs/domain.crt"
|
||||
#define SERVER_PRIVATE_KEY_FILE "/app0/assets/certs/domain.key"
|
||||
#define SERVER_PRIVATE_KEY_PASSWORD "12345678"
|
||||
|
||||
using namespace httplib;
|
||||
SSLServer *svr;
|
||||
int http_server_port = 8080;
|
||||
|
||||
namespace HttpServer
|
||||
{
|
||||
std::string dump_headers(const Headers &headers)
|
||||
{
|
||||
std::string s;
|
||||
char buf[BUFSIZ];
|
||||
|
||||
for (auto it = headers.begin(); it != headers.end(); ++it)
|
||||
{
|
||||
const auto &x = *it;
|
||||
snprintf(buf, sizeof(buf), "%s: %s\n", x.first.c_str(), x.second.c_str());
|
||||
s += buf;
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
std::string log(const Request &req, const Response &res)
|
||||
{
|
||||
std::string s;
|
||||
char buf[BUFSIZ];
|
||||
|
||||
s += "================================\n";
|
||||
|
||||
snprintf(buf, sizeof(buf), "%s %s %s", req.method.c_str(),
|
||||
req.version.c_str(), req.path.c_str());
|
||||
s += buf;
|
||||
|
||||
std::string query;
|
||||
for (auto it = req.params.begin(); it != req.params.end(); ++it)
|
||||
{
|
||||
const auto &x = *it;
|
||||
snprintf(buf, sizeof(buf), "%c%s=%s",
|
||||
(it == req.params.begin()) ? '?' : '&', x.first.c_str(),
|
||||
x.second.c_str());
|
||||
query += buf;
|
||||
}
|
||||
snprintf(buf, sizeof(buf), "%s\n", query.c_str());
|
||||
s += buf;
|
||||
|
||||
s += dump_headers(req.headers);
|
||||
|
||||
s += "--------------------------------\n";
|
||||
|
||||
snprintf(buf, sizeof(buf), "%d %s\n", res.status, res.version.c_str());
|
||||
s += buf;
|
||||
s += dump_headers(res.headers);
|
||||
s += "\n";
|
||||
|
||||
if (!res.body.empty())
|
||||
{
|
||||
s += res.body;
|
||||
}
|
||||
|
||||
s += "\n";
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
void *ServerThread(void *argp)
|
||||
{
|
||||
svr->Get("/google_auth", [](const Request &req, Response &res)
|
||||
{
|
||||
sprintf(gg_account.auth_code, "%s", req.get_param_value("code").c_str());
|
||||
SSLClient client(GOOGLE_OAUTH_HOST);
|
||||
client.enable_server_certificate_verification(false);
|
||||
std::string url = std::string("/token?code=") + gg_account.auth_code + "&client_id=" + gg_account.client_id + "&client_secret=" +
|
||||
gg_account.client_secret + "&redirect_uri=https%3A//localhost%3A8080/google_auth&grant_type=authorization_code";
|
||||
Result result = client.Post(url);
|
||||
|
||||
if (result.error() == Error::Success && result.value().status == 200)
|
||||
{
|
||||
json_object *jobj = json_tokener_parse(result.value().body.c_str());
|
||||
enum json_type type;
|
||||
json_object_object_foreach(jobj, key, val)
|
||||
{
|
||||
if (strcmp(key, "access_token")==0)
|
||||
snprintf(gg_account.access_token, 255, "%s", json_object_get_string(val));
|
||||
else if (strcmp(key, "refresh_token")==0)
|
||||
snprintf(gg_account.refresh_token, 63, "%s", json_object_get_string(val));
|
||||
else if (strcmp(key, "expires_in")==0)
|
||||
{
|
||||
OrbisTick tick;
|
||||
sceRtcGetCurrentTick(&tick);
|
||||
dbglogger_log("tick=%ld", tick.mytick);
|
||||
gg_account.token_expiry = tick.mytick + (json_object_get_uint64(val)*1000000);
|
||||
dbglogger_log("token_expiry=%ld", gg_account.token_expiry);
|
||||
}
|
||||
}
|
||||
CONFIG::SaveGoolgeAccountInfo();
|
||||
login_state = 1;
|
||||
res.set_content(lang_strings[STR_GET_TOKEN_SUCCESS_MSG], "text/plain");
|
||||
return;
|
||||
}
|
||||
login_state = -1;
|
||||
std::string str = std::string(lang_strings[STR_FAIL_GET_TOKEN_MSG]) + " Google";
|
||||
res.set_content(str.c_str(), "text/plain");
|
||||
});
|
||||
|
||||
svr->Get("/stop", [&](const Request & /*req*/, Response & /*res*/)
|
||||
{
|
||||
svr->stop();
|
||||
});
|
||||
|
||||
svr->set_error_handler([](const Request & /*req*/, Response &res)
|
||||
{
|
||||
const char *fmt = "<p>Error Status: <span style='color:red;'>%d</span></p>";
|
||||
char buf[BUFSIZ];
|
||||
snprintf(buf, sizeof(buf), fmt, res.status);
|
||||
res.set_content(buf, "text/html");
|
||||
});
|
||||
|
||||
/*
|
||||
svr->set_logger([](const Request &req, const Response &res)
|
||||
{
|
||||
dbglogger_log("%s", log(req, res).c_str());
|
||||
});
|
||||
*/
|
||||
|
||||
svr->listen("127.0.0.1", http_server_port);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void Start()
|
||||
{
|
||||
if (svr == nullptr)
|
||||
svr = new SSLServer(SERVER_CERT_FILE, SERVER_PRIVATE_KEY_FILE, nullptr, nullptr, SERVER_PRIVATE_KEY_PASSWORD);
|
||||
if (!svr->is_valid())
|
||||
{
|
||||
dbglogger_log("Not valid");
|
||||
return;
|
||||
}
|
||||
int ret = pthread_create(&http_server_thid, NULL, ServerThread, NULL);
|
||||
if (ret != 0)
|
||||
{
|
||||
dbglogger_log("Failed to start thread");
|
||||
}
|
||||
}
|
||||
|
||||
void Stop()
|
||||
{
|
||||
if (svr != nullptr)
|
||||
svr->stop();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
#ifndef HTTP_SERVER_H
|
||||
#define HTTP_SERVER_H
|
||||
|
||||
#include "http/httplib.h"
|
||||
|
||||
using namespace httplib;
|
||||
extern SSLServer *svr;
|
||||
|
||||
static pthread_t http_server_thid;
|
||||
extern int http_server_port;
|
||||
|
||||
namespace HttpServer
|
||||
{
|
||||
void *ServerThread(void *argp);
|
||||
void Start();
|
||||
void Stop();
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -2,13 +2,15 @@
|
||||
#include <orbis/libkernel.h>
|
||||
#include <orbis/Sysmodule.h>
|
||||
|
||||
#include "sys_modules.h"
|
||||
#include "system.h"
|
||||
|
||||
int (*sceRtcGetTick)(const OrbisDateTime *inOrbisDateTime, OrbisTick *outTick);
|
||||
int (*sceRtcSetTick)(OrbisDateTime *outOrbisDateTime, const OrbisTick *inputTick);
|
||||
int (*sceRtcConvertLocalTimeToUtc)(const OrbisTick *local_time, OrbisTick *utc);
|
||||
int (*sceRtcConvertUtcToLocalTime)(const OrbisTick *utc, OrbisTick *local_time);
|
||||
int (*sceRtcGetCurrentClockLocalTime)(OrbisDateTime *time);
|
||||
int (*sceRtcGetCurrentTick)(OrbisTick *outTick);
|
||||
unsigned int (*sceRtcGetTickResolution)();
|
||||
int (*sceShellUIUtilLaunchByUri)(const char *uri, SceShellUIUtilLaunchByUriParam *param);
|
||||
int (*sceShellUIUtilInitialize)();
|
||||
|
||||
@@ -68,6 +70,18 @@ int load_sys_modules()
|
||||
return -1;
|
||||
}
|
||||
|
||||
sceKernelDlsym(handle, "sceRtcGetCurrentTick", (void **)&sceRtcGetCurrentTick);
|
||||
if (sceRtcGetCurrentTick == NULL)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
sceKernelDlsym(handle, "sceRtcGetTickResolution", (void **)&sceRtcGetTickResolution);
|
||||
if (sceRtcGetTickResolution == NULL)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
handle = sceKernelLoadStartModule("/system/common/lib/libSceShellUIUtil.sprx", 0, NULL, 0, 0, 0);
|
||||
if (handle == 0)
|
||||
{
|
||||
@@ -86,6 +100,7 @@ int load_sys_modules()
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (sceShellUIUtilInitialize() < 0) return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -29,6 +29,8 @@ extern int (*sceRtcSetTick)(OrbisDateTime *outOrbisDateTime, const OrbisTick *in
|
||||
extern int (*sceRtcConvertLocalTimeToUtc)(const OrbisTick *local_time, OrbisTick *utc);
|
||||
extern int (*sceRtcConvertUtcToLocalTime)(const OrbisTick *utc, OrbisTick *local_time);
|
||||
extern int (*sceRtcGetCurrentClockLocalTime)(OrbisDateTime *time);
|
||||
extern int (*sceRtcGetCurrentTick)(OrbisTick *outTick);
|
||||
extern unsigned int (*sceRtcGetTickResolution)();
|
||||
extern int (*sceShellUIUtilLaunchByUri)(const char *uri, SceShellUIUtilLaunchByUriParam *param);
|
||||
extern int (*sceShellUIUtilInitialize)();
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
#include "lang.h"
|
||||
#include "ime_dialog.h"
|
||||
#include "IconsFontAwesome6.h"
|
||||
#include "server/http_server.h"
|
||||
#include "clients/gdrive.h"
|
||||
|
||||
extern "C"
|
||||
{
|
||||
@@ -1684,6 +1686,8 @@ namespace Windows
|
||||
break;
|
||||
case ACTION_DISCONNECT_AND_EXIT:
|
||||
Actions::Disconnect();
|
||||
HttpServer::Stop();
|
||||
GDriveClient::StopRefreshToken();
|
||||
done = true;
|
||||
break;
|
||||
case ACTION_INSTALL_REMOTE_PKG:
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@
|
||||
#include "common.h"
|
||||
#include "fs.h"
|
||||
#include "lang.h"
|
||||
#include "sys_modules.h"
|
||||
#include "system.h"
|
||||
#include "windows.h"
|
||||
#include "zip_util.h"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user