]> git.mxchange.org Git - friendica.git/blob - include/uimport.php
Merge pull request #526 from zzottel/master
[friendica.git] / include / uimport.php
1 <?php\r
2 /**\r
3  * import account file exported from mod/uexport\r
4  * args:\r
5  *  $a       App     Friendica App Class\r
6  *  $file   Array   array from $_FILES\r
7  */\r
8 require_once("include/Photo.php");\r
9 define("IMPORT_DEBUG", False);\r
10 \r
11 function last_insert_id(){\r
12     global $db; \r
13     if (IMPORT_DEBUG) return 1;\r
14     if($db->mysqli){\r
15         $thedb = $db->getdb();\r
16         return $thedb->insert_id;\r
17     } else {\r
18         return mysql_insert_id();\r
19     }\r
20  }\r
21  \r
22  function last_error(){\r
23     global $db; \r
24     return $db->error;\r
25  }\r
26  \r
27  function db_import_assoc($table, $arr){\r
28     if (IMPORT_DEBUG) return true;\r
29     if (isset($arr['id'])) unset($arr['id']);\r
30     $cols = implode("`,`", array_map('dbesc', array_keys($arr)));\r
31     $vals = implode("','", array_map('dbesc', array_values($arr)));\r
32     $query = "INSERT INTO `$table` (`$cols`) VALUES ('$vals')";\r
33     logger("uimport: $query",LOGGER_TRACE);\r
34     return q($query);\r
35  }\r
36 \r
37 function import_cleanup($newuid) {\r
38     q("DELETE FROM `user` WHERE uid = %d", $newuid);\r
39     q("DELETE FROM `contact` WHERE uid = %d", $newuid);\r
40     q("DELETE FROM `profile` WHERE uid = %d", $newuid);\r
41     q("DELETE FROM `photo` WHERE uid = %d", $newuid);\r
42     q("DELETE FROM `group` WHERE uid = %d", $newuid);\r
43     q("DELETE FROM `group_member` WHERE uid = %d", $newuid);\r
44     q("DELETE FROM `pconfig` WHERE uid = %d", $newuid);\r
45 \r
46 }\r
47 \r
48 function import_account(&$a, $file) {\r
49     logger("Start user import from ".$file['tmp_name']);\r
50     /*\r
51         STEPS\r
52         1. checks\r
53         2. replace old baseurl with new baseurl\r
54         3. import data (look at user id and contacts id)\r
55         4. archive non-dfrn contacts\r
56         5. send message to dfrn contacts\r
57      */\r
58 \r
59     $account = json_decode(file_get_contents($file['tmp_name']), true);\r
60     if ($account===null) {\r
61         notice(t("Error decoding account file"));\r
62         return;\r
63     }\r
64        \r
65 \r
66     if (!x($account, 'version')) { \r
67         notice(t("Error! No version data in file! This is not a Friendica account file?"));\r
68         return;\r
69     }\r
70    \r
71     if ($account['schema'] != DB_UPDATE_VERSION) {\r
72         notice(t("Error! I can't import this file: DB schema version is not compatible."));\r
73         return;\r
74     }\r
75    \r
76 \r
77     $oldbaseurl  = $account['baseurl'];\r
78     $newbaseurl = $a->get_baseurl();\r
79     $olduid = $account['user']['uid'];\r
80   \r
81     unset($account['user']['uid']);\r
82     foreach($account['user'] as $k => &$v) {\r
83         $v = str_replace($oldbaseurl, $newbaseurl, $v);\r
84     }\r
85 \r
86     \r
87     // import user\r
88     $r = db_import_assoc('user', $account['user']);\r
89     if ($r===false) {\r
90         //echo "<pre>"; var_dump($r, $query, mysql_error()); killme();\r
91         logger("uimport:insert user : ERROR : ".last_error(), LOGGER_NORMAL);\r
92         notice(t("User creation error"));\r
93         return;\r
94     }\r
95     $newuid = last_insert_id();\r
96     //~ $newuid = 1;\r
97     \r
98 \r
99 \r
100     foreach($account['profile'] as &$profile) {\r
101         foreach($profile as $k=>&$v) {\r
102             $v = str_replace($oldbaseurl, $newbaseurl, $v);\r
103             foreach(array("profile","avatar") as $k)\r
104                 $v = str_replace($newbaseurl."/photo/".$k."/".$olduid.".jpg", $newbaseurl."/photo/".$k."/".$newuid.".jpg", $v);\r
105         }\r
106         $profile['uid'] = $newuid;\r
107         $r = db_import_assoc('profile', $profile);\r
108         if ($r===false) {\r
109             logger("uimport:insert profile ".$profile['profile-name']." : ERROR : ".last_error(), LOGGER_NORMAL);\r
110             info(t("User profile creation error"));\r
111             import_cleanup($newuid);\r
112             return;\r
113         }\r
114     }\r
115 \r
116     $errorcount=0;\r
117     foreach($account['contact'] as &$contact) {\r
118         if ($contact['uid'] == $olduid && $contact['self'] == '1'){\r
119             foreach($contact as $k=>&$v) {\r
120                 $v = str_replace($oldbaseurl, $newbaseurl, $v);\r
121                 foreach(array("profile","avatar","micro") as $k)\r
122                     $v = str_replace($newbaseurl."/photo/".$k."/".$olduid.".jpg", $newbaseurl."/photo/".$k."/".$newuid.".jpg", $v);\r
123             }\r
124         }\r
125          if ($contact['uid'] == $olduid && $contact['self'] == '0') {\r
126             switch ($contact['network']){\r
127                 case NETWORK_DFRN:\r
128                     //  send relocate message (below)\r
129                     break;\r
130                 case NETWORK_ZOT:\r
131                     // TODO handle zot network\r
132                     break;\r
133                 case NETWORK_MAIL2:\r
134                     // TODO ?\r
135                     break;\r
136                 case NETWORK_FEED:\r
137                 case NETWORK_MAIL:\r
138                     // Nothing to do\r
139                     break;\r
140                 default:\r
141                     // archive other contacts\r
142                     $contact['archive'] = "1";\r
143             }\r
144         }\r
145         $contact['uid'] = $newuid;\r
146         $r = db_import_assoc('contact', $contact);\r
147         if ($r===false) {\r
148             logger("uimport:insert contact ".$contact['nick'].",".$contact['network']." : ERROR : ".last_error(), LOGGER_NORMAL);\r
149             $errorcount++;\r
150         } else {\r
151             $contact['newid'] = last_insert_id();\r
152         }\r
153     }\r
154     if ($errorcount>0) {\r
155         notice( sprintf(tt("%d contact not imported", "%d contacts not imported", $errorcount), $errorcount) );\r
156     }\r
157 \r
158     foreach($account['group'] as &$group) {\r
159         $group['uid'] = $newuid;\r
160         $r = db_import_assoc('group', $group);\r
161         if ($r===false) {\r
162             logger("uimport:insert group ".$group['name']." : ERROR : ".last_error(), LOGGER_NORMAL);\r
163         } else {\r
164             $group['newid'] = last_insert_id();\r
165         }\r
166     }\r
167 \r
168     foreach($account['group_member'] as &$group_member) {\r
169         $group_member['uid'] = $newuid;\r
170         \r
171         $import = 0;\r
172         foreach($account['group'] as $group) {\r
173             if ($group['id'] == $group_member['gid'] && isset($group['newid'])) {\r
174                 $group_member['gid'] = $group['newid'];\r
175                 $import++;\r
176                 break;\r
177             }\r
178         }\r
179         foreach($account['contact'] as $contact) {\r
180             if ($contact['id'] == $group_member['contact-id'] && isset($contact['newid'])) {\r
181                 $group_member['contact-id'] = $contact['newid'];\r
182                 $import++;\r
183                 break;\r
184             }\r
185         }\r
186         if ($import==2) {\r
187             $r = db_import_assoc('group_member', $group_member);\r
188             if ($r===false) {\r
189                 logger("uimport:insert group member ".$group_member['id']." : ERROR : ".last_error(), LOGGER_NORMAL);\r
190             }\r
191         }\r
192     }\r
193 \r
194 \r
195 \r
196     \r
197     \r
198     foreach($account['photo'] as &$photo) {\r
199         $photo['uid'] = $newuid;\r
200         $photo['data'] = hex2bin($photo['data']);\r
201         \r
202         $p = new Photo($photo['data'], $photo['type']);\r
203         $r = $p->store(\r
204             $photo['uid'],\r
205             $photo['contact-id'], //0\r
206             $photo['resource-id'],\r
207             $photo['filename'],\r
208             $photo['album'],\r
209             $photo['scale'],\r
210             $photo['profile'], //1\r
211             $photo['allow_cid'],\r
212             $photo['allow_gid'],\r
213             $photo['deny_cid'],\r
214             $photo['deny_gid']\r
215         );\r
216         \r
217         if ($r===false) {\r
218             logger("uimport:insert photo ".$photo['resource-id'].",". $photo['scale']. " : ERROR : ".last_error(), LOGGER_NORMAL);\r
219         }\r
220     } \r
221     \r
222     foreach($account['pconfig'] as &$pconfig) {\r
223         $pconfig['uid'] = $newuid;\r
224         $r = db_import_assoc('pconfig', $pconfig);\r
225         if ($r===false) {\r
226             logger("uimport:insert pconfig ".$pconfig['id']. " : ERROR : ".last_error(), LOGGER_NORMAL);\r
227         }\r
228     } \r
229     \r
230     // send relocate messages\r
231     proc_run('php', 'include/notifier.php', 'relocate' , $newuid);\r
232     \r
233     info(t("Done. You can now login with your username and password"));\r
234     goaway( $a->get_baseurl() ."/login");\r
235     \r
236     \r
237 }\r