1 /**
2  * @file megaclient.cpp
3  * @brief sample application, interactive GNU Readline CLI
4  *
5  * (c) 2013 by Mega Limited, Wellsford, New Zealand
6  *
7  * This file is part of the MEGA SDK - Client Access Engine.
8  *
9  * Applications using the MEGA API must present a valid application key
10  * and comply with the the rules set forth in the Terms of Service.
11  *
12  * The MEGA SDK is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15  *
16  * @copyright Simplified (2-clause) BSD License.
17  *
18  * You should have received a copy of the license along with this
19  * program.
20  */
21 
22 #include "mega.h"
23 
24 using namespace mega;
25 
26 extern MegaClient* client;
27 extern MegaClient* clientFolder;
28 
29 extern void megacli();
30 
31 extern void term_init();
32 extern void term_restore();
33 extern void term_echo(int);
34 
35 extern void read_pw_char(char*, int, int*, char**);
36 
37 typedef list<struct AppFile*> appfile_list;
38 
39 struct AppFile : public File
40 {
41     // app-internal sequence number for queue management
42     int seqno;
43 
44     void progress();
45 
46     appfile_list::iterator appxfer_it;
47 
48     AppFile();
49 };
50 
51 // application-managed GET and PUT queues (only pending and active files)
52 extern appfile_list appxferq[2];
53 
54 struct AppFileGet : public AppFile
55 {
56     void start() override;
57     void update();
58     void completed(Transfer*, LocalNode*) override;
59     void terminated() override;
60 
61     AppFileGet(Node*, handle = UNDEF, byte* = NULL, m_off_t = -1, m_time_t = 0, string* = NULL, string* = NULL, const string& targetfolder = "");
62     ~AppFileGet();
63 };
64 
65 struct AppFilePut : public AppFile
66 {
67     void start() override;
68     void update();
69     void completed(Transfer*, LocalNode*) override;
70     void terminated() override;
71 
72     void displayname(string*);
73 
74     AppFilePut(const LocalPath&, handle, const char*);
75     ~AppFilePut();
76 };
77 
78 struct AppReadContext
79 {
80     SymmCipher key;
81 };
82 
83 class TreeProcListOutShares : public TreeProc
84 {
85 public:
86     void proc(MegaClient*, Node*);
87 };
88 
89 struct DemoApp : public MegaApp
90 {
91     FileAccess* newfile();
92 
93     void request_error(error) override;
94 
95     void request_response_progress(m_off_t, m_off_t) override;
96 
97     void prelogin_result(int version, string* email, string *salt, error e) override;
98     void login_result(error) override;
99     void multifactorauthdisable_result(error) override;
100     void multifactorauthsetup_result(string *code, error e) override;
101     void multifactorauthcheck_result(int enabled) override;
102 
103     void ephemeral_result(error) override;
104     void ephemeral_result(handle, const byte*) override;
105     void cancelsignup_result(error) override;
106 
107     void whyamiblocked_result(int) override;
108 
109     void sendsignuplink_result(error) override;
110     void querysignuplink_result(error) override;
111     void querysignuplink_result(handle, const char*, const char*, const byte*, const byte*, const byte*, size_t) override;
112     void confirmsignuplink_result(error) override;
113     void setkeypair_result(error) override;
114 
115     void getrecoverylink_result(error) override;
116     void queryrecoverylink_result(error) override;
117     void queryrecoverylink_result(int type, const char *email, const char *ip, time_t ts, handle uh, const vector<string> *emails) override;
118     void getprivatekey_result(error,  const byte *privk, const size_t len_privk) override;
119     void confirmrecoverylink_result(error) override;
120     void confirmcancellink_result(error) override;
121     void validatepassword_result(error) override;
122     void getemaillink_result(error) override;
123     void confirmemaillink_result(error) override;
124 
125     void users_updated(User**, int) override;
126     void useralerts_updated(UserAlert::Base** ua, int count) override;
127     void nodes_updated(Node**, int) override;
128     void pcrs_updated(PendingContactRequest**, int) override;
129     void nodes_current() override;
130     void account_updated() override;
131     void notify_confirmation(const char *email) override;
132 
133 #ifdef ENABLE_CHAT
134     void chatcreate_result(TextChat *, error) override;
135     void chatinvite_result(error) override;
136     void chatremove_result(error) override;
137     void chaturl_result(string *, error) override;
138     void chatgrantaccess_result(error) override;
139     void chatremoveaccess_result(error) override;
140     virtual void chatupdatepermissions_result(error) override;
141     virtual void chattruncate_result(error) override;
142     virtual void chatsettitle_result(error) override;
143     virtual void chatpresenceurl_result(string *, error) override;
144     void chatlink_result(handle, error) override;
145     void chatlinkclose_result(error) override;
146     void chatlinkurl_result(handle, int, string*, string*, int, m_time_t, error) override;
147     void chatlinkjoin_result(error) override;
148 
149     void chats_updated(textchat_map*, int) override;
150 
151     static void printChatInformation(TextChat *);
152     static string getPrivilegeString(privilege_t priv);
153 
154     void richlinkrequest_result(string*, error) override;
155 #endif
156 
157     void setattr_result(handle, error) override;
158     void rename_result(handle, error) override;
159     void unlink_result(handle, error) override;
160 
161     void fetchnodes_result(const Error&) override;
162 
163     void putnodes_result(error, targettype_t, NewNode*) override;
164 
165     void share_result(error) override;
166     void share_result(int, error) override;
167 
168     void setpcr_result(handle, error, opcactions_t) override;
169     void updatepcr_result(error, ipcactions_t) override;
170 
171     void fa_complete(handle, fatype, const char*, uint32_t) override;
172     int fa_failed(handle, fatype, int, error) override;
173 
174     void putfa_result(handle, fatype, error) override;
175     void putfa_result(handle, fatype, const char*) override;
176 
177     void removecontact_result(error) override;
178     void putua_result(error) override;
179     void getua_result(error) override;
180     void getua_result(byte*, unsigned, attr_t) override;
181     void getua_result(TLVstore *, attr_t) override;
182 #ifdef DEBUG
183     void delua_result(error) override;
184     void senddevcommand_result(int) override;
185 #endif
186 
187     void querytransferquota_result(int) override;
188 
189     void account_details(AccountDetails*, bool, bool, bool, bool, bool, bool) override;
190     void account_details(AccountDetails*, error) override;
191 
192     // sessionid is undef if all sessions except the current were killed
193     void sessions_killed(handle sessionid, error e) override;
194 
195     void exportnode_result(error) override;
196     void exportnode_result(handle, handle) override;
197 
198     void openfilelink_result(const Error&) override;
199     void openfilelink_result(handle, const byte*, m_off_t, string*, string*, int) override;
200 
201     void folderlinkinfo_result(error, handle, handle, string *, string*, m_off_t, uint32_t, uint32_t, m_off_t, uint32_t) override;
202 
203     void checkfile_result(handle, const Error&) override;
204     void checkfile_result(handle, error, byte*, m_off_t, m_time_t, m_time_t, string*, string*, string*) override;
205 
206     dstime pread_failure(const Error&, int, void*, dstime) override;
207     bool pread_data(byte*, m_off_t, m_off_t, m_off_t, m_off_t, void*) override;
208 
209     void transfer_added(Transfer*) override;
210     void transfer_removed(Transfer*) override;
211     void transfer_prepare(Transfer*) override;
212     void transfer_failed(Transfer*, const Error&, dstime) override;
213     void transfer_update(Transfer*) override;
214     void transfer_complete(Transfer*) override;
215 
216 #ifdef ENABLE_SYNC
217     void syncupdate_state(Sync*, syncstate_t) override;
218     void syncupdate_scanning(bool) override;
219     void syncupdate_local_folder_addition(Sync*, LocalNode*, const char*) override;
220     void syncupdate_local_folder_deletion(Sync* , LocalNode*) override;
221     void syncupdate_local_file_addition(Sync*, LocalNode*, const char*) override;
222     void syncupdate_local_file_deletion(Sync*, LocalNode*) override;
223     void syncupdate_local_file_change(Sync*, LocalNode*, const char*) override;
224     void syncupdate_local_move(Sync*, LocalNode*, const char*) override;
225     void syncupdate_local_lockretry(bool) override;
226     void syncupdate_get(Sync*, Node*, const char*) override;
227     void syncupdate_put(Sync*, LocalNode*, const char*) override;
228     void syncupdate_remote_file_addition(Sync*, Node*) override;
229     void syncupdate_remote_file_deletion(Sync*, Node*) override;
230     void syncupdate_remote_folder_addition(Sync*, Node*) override;
231     void syncupdate_remote_folder_deletion(Sync*, Node*) override;
232     void syncupdate_remote_copy(Sync*, const char*) override;
233     void syncupdate_remote_move(Sync*, Node*, Node*) override;
234     void syncupdate_remote_rename(Sync*, Node*, const char*) override;
235     void syncupdate_treestate(LocalNode*) override;
236 
237     bool sync_syncable(Sync*, const char*, LocalPath&, Node*) override;
238     bool sync_syncable(Sync*, const char*, LocalPath&) override;
239 #endif
240 
241     void changepw_result(error) override;
242 
243     void userattr_update(User*, int, const char*) override;
244     void resetSmsVerifiedPhoneNumber_result(error e) override;
245 
246     void enumeratequotaitems_result(unsigned, handle, unsigned, int, int, unsigned, unsigned, unsigned, const char*, const char*, const char*, const char*) override;
247     void enumeratequotaitems_result(error) override;
248     void additem_result(error) override;
249     void checkout_result(const char*, error) override;
250 
251     void getmegaachievements_result(AchievementsDetails*, error) override;
252     void getwelcomepdf_result(handle, string*, error) override;
253 
254     void contactlinkcreate_result(error, handle) override;
255     void contactlinkquery_result(error, handle, string*, string*, string*, string*) override;
256     void contactlinkdelete_result(error) override;
257 
258     void smsverificationsend_result(error);
259     void smsverificationcheck_result(error, string*);
260 
261     void reload(const char*) override;
262     void clearing() override;
263 
264     void notify_retry(dstime, retryreason_t) override;
265 
266     string getExtraInfoErrorString(const Error&);
267 };
268 
269 struct DemoAppFolder : public DemoApp
270 {
271     void login_result(error);
272     void fetchnodes_result(const Error&);
273 
274     void nodes_updated(Node **, int);
users_updatedDemoAppFolder275     void users_updated(User**, int) {}
pcrs_updatedDemoAppFolder276     void pcrs_updated(PendingContactRequest**, int) {}
277 };
278 
279 #include <mega/autocomplete.h>
280 
281 void exec_apiurl(autocomplete::ACState& s);
282 void exec_login(autocomplete::ACState& s);
283 void exec_begin(autocomplete::ACState& s);
284 void exec_signup(autocomplete::ACState& s);
285 void exec_cancelsignup(autocomplete::ACState& s);
286 void exec_confirm(autocomplete::ACState& s);
287 void exec_session(autocomplete::ACState& s);
288 void exec_mount(autocomplete::ACState& s);
289 void exec_ls(autocomplete::ACState& s);
290 void exec_cd(autocomplete::ACState& s);
291 void exec_pwd(autocomplete::ACState& s);
292 void exec_lcd(autocomplete::ACState& s);
293 void exec_lls(autocomplete::ACState& s);
294 void exec_lpwd(autocomplete::ACState& s);
295 void exec_lmkdir(autocomplete::ACState& s);
296 void exec_import(autocomplete::ACState& s);
297 void exec_folderlinkinfo(autocomplete::ACState& s);
298 void exec_open(autocomplete::ACState& s);
299 void exec_put(autocomplete::ACState& s);
300 void exec_putq(autocomplete::ACState& s);
301 void exec_get(autocomplete::ACState& s);
302 void exec_getq(autocomplete::ACState& s);
303 void exec_pause(autocomplete::ACState& s);
304 void exec_getfa(autocomplete::ACState& s);
305 void exec_mediainfo(autocomplete::ACState& s);
306 void exec_smsverify(autocomplete::ACState& s);
307 void exec_verifiedphonenumber(autocomplete::ACState& s);
308 void exec_mkdir(autocomplete::ACState& s);
309 void exec_rm(autocomplete::ACState& s);
310 void exec_mv(autocomplete::ACState& s);
311 void exec_cp(autocomplete::ACState& s);
312 void exec_du(autocomplete::ACState& s);
313 void exec_sync(autocomplete::ACState& s);
314 void exec_syncconfig(autocomplete::ACState& s);
315 void exec_export(autocomplete::ACState& s);
316 void exec_share(autocomplete::ACState& s);
317 void exec_invite(autocomplete::ACState& s);
318 void exec_clink(autocomplete::ACState& s);
319 void exec_ipc(autocomplete::ACState& s);
320 void exec_showpcr(autocomplete::ACState& s);
321 void exec_users(autocomplete::ACState& s);
322 void exec_getua(autocomplete::ACState& s);
323 void exec_putua(autocomplete::ACState& s);
324 void exec_delua(autocomplete::ACState& s);
325 void exec_alerts(autocomplete::ACState& s);
326 void exec_recentactions(autocomplete::ACState& s);
327 void exec_recentnodes(autocomplete::ACState& s);
328 void exec_putbps(autocomplete::ACState& s);
329 void exec_killsession(autocomplete::ACState& s);
330 void exec_whoami(autocomplete::ACState& s);
331 void exec_verifycredentials(autocomplete::ACState& s);
332 void exec_passwd(autocomplete::ACState& s);
333 void exec_reset(autocomplete::ACState& s);
334 void exec_recover(autocomplete::ACState& s);
335 void exec_cancel(autocomplete::ACState& s);
336 void exec_email(autocomplete::ACState& s);
337 void exec_retry(autocomplete::ACState& s);
338 void exec_recon(autocomplete::ACState& s);
339 void exec_reload(autocomplete::ACState& s);
340 void exec_logout(autocomplete::ACState& s);
341 void exec_locallogout(autocomplete::ACState& s);
342 void exec_symlink(autocomplete::ACState& s);
343 void exec_version(autocomplete::ACState& s);
344 void exec_debug(autocomplete::ACState& s);
345 void exec_verbose(autocomplete::ACState& s);
346 void exec_clear(autocomplete::ACState& s);
347 void exec_codepage(autocomplete::ACState& s);
348 void exec_log(autocomplete::ACState& s);
349 void exec_test(autocomplete::ACState& s);
350 void exec_chats(autocomplete::ACState& s);
351 void exec_chatc(autocomplete::ACState& s);
352 void exec_chati(autocomplete::ACState& s);
353 void exec_chatcp(autocomplete::ACState& s);
354 void exec_chatr(autocomplete::ACState& s);
355 void exec_chatu(autocomplete::ACState& s);
356 void exec_chatup(autocomplete::ACState& s);
357 void exec_chatpu(autocomplete::ACState& s);
358 void exec_chatga(autocomplete::ACState& s);
359 void exec_chatra(autocomplete::ACState& s);
360 void exec_chatst(autocomplete::ACState& s);
361 void exec_chata(autocomplete::ACState& s);
362 void exec_chatl(autocomplete::ACState& s);
363 void exec_chatsm(autocomplete::ACState& s);
364 void exec_chatlu(autocomplete::ACState& s);
365 void exec_chatlj(autocomplete::ACState& s);
366 void exec_enabletransferresumption(autocomplete::ACState& s);
367 void exec_setmaxdownloadspeed(autocomplete::ACState& s);
368 void exec_setmaxuploadspeed(autocomplete::ACState& s);
369 void exec_handles(autocomplete::ACState& s);
370 void exec_httpsonly(autocomplete::ACState& s);
371 void exec_mfac(autocomplete::ACState& s);
372 void exec_mfae(autocomplete::ACState& s);
373 void exec_mfad(autocomplete::ACState& s);
374 void exec_autocomplete(autocomplete::ACState& s);
375 void exec_history(autocomplete::ACState& s);
376 void exec_help(autocomplete::ACState& s);
377 void exec_quit(autocomplete::ACState& s);
378 void exec_find(autocomplete::ACState& s);
379 #ifdef USE_FILESYSTEM
380 void exec_treecompare(autocomplete::ACState& s);
381 void exec_querytransferquota(autocomplete::ACState& s);
382 #endif
383 void exec_metamac(autocomplete::ACState& s);
384 void exec_resetverifiedphonenumber(autocomplete::ACState& s);
385