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