]> git.mxchange.org Git - friendica.git/blob - include/uimport.php
vier: With IE there are no borders around images anymore
[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         // check for username\r
78         $r = q("SELECT uid FROM user WHERE nickname='%s'", $account['user']['nickname']);\r
79         if ($r===false) {\r
80                 logger("uimport:check nickname : ERROR : ".last_error(), LOGGER_NORMAL);\r
81                 notice(t('Error! Cannot check nickname'));\r
82                 return;\r
83         }\r
84         if (count($r)>0) {\r
85                 notice(sprintf(t("User '%s' already exists on this server!"),$account['user']['nickname']));\r
86                 return;\r
87         }\r
88 \r
89     $oldbaseurl  = $account['baseurl'];\r
90     $newbaseurl = $a->get_baseurl();\r
91     $olduid = $account['user']['uid'];\r
92   \r
93     unset($account['user']['uid']);\r
94     foreach($account['user'] as $k => &$v) {\r
95         $v = str_replace($oldbaseurl, $newbaseurl, $v);\r
96     }\r
97 \r
98     \r
99     // import user\r
100     $r = db_import_assoc('user', $account['user']);\r
101     if ($r===false) {\r
102         //echo "<pre>"; var_dump($r, $query, mysql_error()); killme();\r
103         logger("uimport:insert user : ERROR : ".last_error(), LOGGER_NORMAL);\r
104         notice(t("User creation error"));\r
105         return;\r
106     }\r
107     $newuid = last_insert_id();\r
108     //~ $newuid = 1;\r
109     \r
110 \r
111 \r
112     foreach($account['profile'] as &$profile) {\r
113         foreach($profile as $k=>&$v) {\r
114             $v = str_replace($oldbaseurl, $newbaseurl, $v);\r
115             foreach(array("profile","avatar") as $k)\r
116                 $v = str_replace($newbaseurl."/photo/".$k."/".$olduid.".jpg", $newbaseurl."/photo/".$k."/".$newuid.".jpg", $v);\r
117         }\r
118         $profile['uid'] = $newuid;\r
119         $r = db_import_assoc('profile', $profile);\r
120         if ($r===false) {\r
121             logger("uimport:insert profile ".$profile['profile-name']." : ERROR : ".last_error(), LOGGER_NORMAL);\r
122             info(t("User profile creation error"));\r
123             import_cleanup($newuid);\r
124             return;\r
125         }\r
126     }\r
127 \r
128     $errorcount=0;\r
129     foreach($account['contact'] as &$contact) {\r
130         if ($contact['uid'] == $olduid && $contact['self'] == '1'){\r
131             foreach($contact as $k=>&$v) {\r
132                 $v = str_replace($oldbaseurl, $newbaseurl, $v);\r
133                 foreach(array("profile","avatar","micro") as $k)\r
134                     $v = str_replace($newbaseurl."/photo/".$k."/".$olduid.".jpg", $newbaseurl."/photo/".$k."/".$newuid.".jpg", $v);\r
135             }\r
136         }\r
137          if ($contact['uid'] == $olduid && $contact['self'] == '0') {\r
138             switch ($contact['network']){\r
139                 case NETWORK_DFRN:\r
140                     //  send relocate message (below)\r
141                     break;\r
142                 case NETWORK_ZOT:\r
143                     // TODO handle zot network\r
144                     break;\r
145                 case NETWORK_MAIL2:\r
146                     // TODO ?\r
147                     break;\r
148                 case NETWORK_FEED:\r
149                 case NETWORK_MAIL:\r
150                     // Nothing to do\r
151                     break;\r
152                 default:\r
153                     // archive other contacts\r
154                     $contact['archive'] = "1";\r
155             }\r
156         }\r
157         $contact['uid'] = $newuid;\r
158         $r = db_import_assoc('contact', $contact);\r
159         if ($r===false) {\r
160             logger("uimport:insert contact ".$contact['nick'].",".$contact['network']." : ERROR : ".last_error(), LOGGER_NORMAL);\r
161             $errorcount++;\r
162         } else {\r
163             $contact['newid'] = last_insert_id();\r
164         }\r
165     }\r
166     if ($errorcount>0) {\r
167         notice( sprintf(tt("%d contact not imported", "%d contacts not imported", $errorcount), $errorcount) );\r
168     }\r
169 \r
170     foreach($account['group'] as &$group) {\r
171         $group['uid'] = $newuid;\r
172         $r = db_import_assoc('group', $group);\r
173         if ($r===false) {\r
174             logger("uimport:insert group ".$group['name']." : ERROR : ".last_error(), LOGGER_NORMAL);\r
175         } else {\r
176             $group['newid'] = last_insert_id();\r
177         }\r
178     }\r
179 \r
180     foreach($account['group_member'] as &$group_member) {\r
181         $group_member['uid'] = $newuid;\r
182         \r
183         $import = 0;\r
184         foreach($account['group'] as $group) {\r
185             if ($group['id'] == $group_member['gid'] && isset($group['newid'])) {\r
186                 $group_member['gid'] = $group['newid'];\r
187                 $import++;\r
188                 break;\r
189             }\r
190         }\r
191         foreach($account['contact'] as $contact) {\r
192             if ($contact['id'] == $group_member['contact-id'] && isset($contact['newid'])) {\r
193                 $group_member['contact-id'] = $contact['newid'];\r
194                 $import++;\r
195                 break;\r
196             }\r
197         }\r
198         if ($import==2) {\r
199             $r = db_import_assoc('group_member', $group_member);\r
200             if ($r===false) {\r
201                 logger("uimport:insert group member ".$group_member['id']." : ERROR : ".last_error(), LOGGER_NORMAL);\r
202             }\r
203         }\r
204     }\r
205 \r
206 \r
207 \r
208     \r
209     \r
210     foreach($account['photo'] as &$photo) {\r
211         $photo['uid'] = $newuid;\r
212         $photo['data'] = hex2bin($photo['data']);\r
213         \r
214         $p = new Photo($photo['data'], $photo['type']);\r
215         $r = $p->store(\r
216             $photo['uid'],\r
217             $photo['contact-id'], //0\r
218             $photo['resource-id'],\r
219             $photo['filename'],\r
220             $photo['album'],\r
221             $photo['scale'],\r
222             $photo['profile'], //1\r
223             $photo['allow_cid'],\r
224             $photo['allow_gid'],\r
225             $photo['deny_cid'],\r
226             $photo['deny_gid']\r
227         );\r
228         \r
229         if ($r===false) {\r
230             logger("uimport:insert photo ".$photo['resource-id'].",". $photo['scale']. " : ERROR : ".last_error(), LOGGER_NORMAL);\r
231         }\r
232     } \r
233     \r
234     foreach($account['pconfig'] as &$pconfig) {\r
235         $pconfig['uid'] = $newuid;\r
236         $r = db_import_assoc('pconfig', $pconfig);\r
237         if ($r===false) {\r
238             logger("uimport:insert pconfig ".$pconfig['id']. " : ERROR : ".last_error(), LOGGER_NORMAL);\r
239         }\r
240     } \r
241     \r
242     // send relocate messages\r
243     proc_run('php', 'include/notifier.php', 'relocate' , $newuid);\r
244     \r
245     info(t("Done. You can now login with your username and password"));\r
246     goaway( $a->get_baseurl() ."/login");\r
247     \r
248     \r
249 }\r