Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F9122032
save.inc
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
10 KB
Referenced Files
None
Subscribers
None
save.inc
View Options
<
?
php
/*
+-----------------------------------------------------------------------+
| program/steps/addressbook/save.inc |
| |
| This file is part of the Roundcube Webmail client |
| Copyright (C) 2005-2011, The Roundcube Dev Team |
| Licensed under the GNU GPL |
| |
| PURPOSE: |
| Save a contact entry or to add a new one |
| |
+-----------------------------------------------------------------------+
| Author: Thomas Bruederli <roundcube@gmail.com> |
+-----------------------------------------------------------------------+
$Id$
*/
$
CONTACTS
=
rcmail_contact_source
(
null
,
true
);
$
cid
=
get_input_value
(
'
_cid
'
,
RCUBE_INPUT_POST
);
$
return_action
=
empty
(
$
cid
)
?
'
add
'
:
'
edit
'
;
// Source changed, display the form again
if
(
!
empty
(
$
_GET
[
'
_reload
'
]))
{
rcmail_overwrite_action
(
$
return_action
);
return
;
}
// cannot edit record
if
(
$
CONTACTS
-
>
readonly
)
{
$
OUTPUT
-
>
show_message
(
'
contactreadonly
'
,
'
error
'
);
rcmail_overwrite_action
(
$
return_action
);
return
;
}
// handle photo upload for contacts
if
(
$
RCMAIL
-
>
action
==
'
upload
-
photo
'
)
{
// clear all stored output properties (like scripts and env vars)
$
OUTPUT
-
>
reset
();
if
(
$
filepath
=
$
_FILES
[
'
_photo
'
][
'
tmp_name
'
])
{
// check file type and resize image
$
imageprop
=
rcmail
::
imageprops
(
$
_FILES
[
'
_photo
'
][
'
tmp_name
'
]);
if
(
$
imageprop
[
'
width
'
]
&&
$
imageprop
[
'
height
'
])
{
$
maxsize
=
intval
(
$
RCMAIL
-
>
config
-
>
get
(
'
contact_photo_size
'
,
160
));
$
tmpfname
=
tempnam
(
$
RCMAIL
-
>
config
-
>
get
(
'
temp_dir
'
),
'
rcmImgConvert
'
);
$
save_hook
=
'
attachment_upload
'
;
// scale image to a maximum size
if
((
$
imageprop
[
'
width
'
]
>
$
maxsize
||
$
imageprop
[
'
height
'
]
>
$
maxsize
)
&&
(
rcmail
::
imageconvert
(
array
(
'
in
'
=
>
$
filepath
,
'
out
'
=
>
$
tmpfname
,
'
size
'
=
>
$
maxsize
.'
x
'.$
maxsize
,
'
type
'
=
>
$
imageprop
[
'
type
'
]))
!
==
false
))
{
$
filepath
=
$
tmpfname
;
$
save_hook
=
'
attachment_save
'
;
}
// save uploaded file in storage backend
$
attachment
=
$
RCMAIL
-
>
plugins
-
>
exec_hook
(
$
save_hook
,
array
(
'
path
'
=
>
$
filepath
,
'
size
'
=
>
$
_FILES
[
'
_photo
'
][
'
size
'
],
'
name
'
=
>
$
_FILES
[
'
_photo
'
][
'
name
'
],
'
mimetype
'
=
>
'
image
/
'
.
$
imageprop
[
'
type
'
],
'
group
'
=
>
'
contact
'
,
));
}
else
$
attachment
[
'
error
'
]
=
rcube_label
(
'
invalidimageformat
'
);
if
(
$
attachment
[
'
status
'
]
&&
!$
attachment
[
'
abort
'
])
{
$
file_id
=
$
attachment
[
'
id
'
];
$
_SESSION
[
'
contacts
'
][
'
files
'
][
$
file_id
]
=
$
attachment
;
$
OUTPUT
-
>
command
(
'
replace_contact_photo
'
,
$
file_id
);
}
else
{
// upload failed
$
err
=
$
_FILES
[
'
_photo
'
][
'
error
'
];
if
(
$
err
==
UPLOAD_ERR_INI_SIZE
||
$
err
==
UPLOAD_ERR_FORM_SIZE
)
$
msg
=
rcube_label
(
array
(
'
name
'
=
>
'
filesizeerror
'
,
'
vars
'
=
>
array
(
'
size
'
=
>
show_bytes
(
parse_bytes
(
ini_get
(
'
upload_max_filesize
'
))))));
else
if
(
$
attachment
[
'
error
'
])
$
msg
=
$
attachment
[
'
error
'
];
else
$
msg
=
rcube_label
(
'
fileuploaderror
'
);
$
OUTPUT
-
>
command
(
'
display_message
'
,
$
msg
,
'
error
'
);
}
}
else
if
(
$
_SERVER
[
'
REQUEST_METHOD
'
]
==
'
POST
'
)
{
// if filesize exceeds post_max_size then $_FILES array is empty,
// show filesizeerror instead of fileuploaderror
if
(
$
maxsize
=
ini_get
(
'
post_max_size
'
))
$
msg
=
rcube_label
(
array
(
'
name
'
=
>
'
filesizeerror
'
,
'
vars
'
=
>
array
(
'
size
'
=
>
show_bytes
(
parse_bytes
(
$
maxsize
)))));
else
$
msg
=
rcube_label
(
'
fileuploaderror
'
);
$
OUTPUT
-
>
command
(
'
display_message
'
,
$
msg
,
'
error
'
);
}
$
OUTPUT
-
>
command
(
'
photo_upload_end
'
);
$
OUTPUT
-
>
send
(
'
iframe
'
);
}
// read POST values into hash array
$
a_record
=
array
();
foreach
(
$
GLOBALS
[
'
CONTACT_COLTYPES
'
]
as
$
col
=
>
$
colprop
)
{
$
fname
=
'
_
'.$
col
;
if
(
$
colprop
[
'
composite
'
])
continue
;
// gather form data of composite fields
if
(
$
colprop
[
'
childs
'
])
{
$
values
=
array
();
foreach
(
$
colprop
[
'
childs
'
]
as
$
childcol
=
>
$
cp
)
{
$
vals
=
get_input_value
(
'
_
'.$
childcol
,
RCUBE_INPUT_POST
,
true
);
foreach
((
array
)
$
vals
as
$
i
=
>
$
val
)
$
values
[
$
i
][
$
childcol
]
=
$
val
;
}
$
subtypes
=
get_input_value
(
'
_subtype_
'
.
$
col
,
RCUBE_INPUT_POST
);
foreach
(
$
subtypes
as
$
i
=
>
$
subtype
)
if
(
$
values
[
$
i
])
$
a_record
[
$
col
.':'.$
subtype
][]
=
$
values
[
$
i
];
}
// assign values and subtypes
else
if
(
is_array
(
$
_POST
[
$
fname
]))
{
$
values
=
get_input_value
(
$
fname
,
RCUBE_INPUT_POST
,
true
);
$
subtypes
=
get_input_value
(
'
_subtype_
'
.
$
col
,
RCUBE_INPUT_POST
);
foreach
(
$
values
as
$
i
=
>
$
val
)
{
$
subtype
=
$
subtypes
[
$
i
]
?
':'.$
subtypes
[
$
i
]
:
''
;
$
a_record
[
$
col
.$
subtype
][]
=
$
val
;
}
}
else
if
(
isset
(
$
_POST
[
$
fname
]))
{
$
a_record
[
$
col
]
=
get_input_value
(
$
fname
,
RCUBE_INPUT_POST
,
true
);
}
}
// let a dedicated function or a plugin compose the full name if empty
if
(
empty
(
$
a_record
[
'
name
'
]))
{
$
a_record
[
'
name
'
]
=
rcube_addressbook
::
compose_display_name
(
$
a_record
);
}
// do input checks (delegated to $CONTACTS instance)
if
(
!$
CONTACTS
-
>
validate
(
$
a_record
))
{
$
err
=
(
array
)
$
CONTACTS
-
>
get_error
()
+
array
(
'
message
'
=
>
'
formincomplete
'
,
'
type
'
=
>
'
warning
'
);
$
OUTPUT
-
>
show_message
(
$
err
[
'
message
'
],
$
err
[
'
type
'
]);
$
GLOBALS
[
'
EDIT_RECORD
'
]
=
$
a_record
;
// store submitted data to be used in edit form
rcmail_overwrite_action
(
$
return_action
);
return
;
}
// get raw photo data if changed
if
(
isset
(
$
a_record
[
'
photo
'
]))
{
if
(
$
a_record
[
'
photo
'
]
==
'
-
del
-
'
)
{
$
a_record
[
'
photo
'
]
=
''
;
}
else
if
(
$
tempfile
=
$
_SESSION
[
'
contacts
'
][
'
files
'
][
$
a_record
[
'
photo
'
]])
{
$
tempfile
=
$
RCMAIL
-
>
plugins
-
>
exec_hook
(
'
attachment_get
'
,
$
tempfile
);
if
(
$
tempfile
[
'
status
'
])
$
a_record
[
'
photo
'
]
=
$
tempfile
[
'
data
'
]
?
$
tempfile
[
'
data
'
]
:
@
file_get_contents
(
$
tempfile
[
'
path
'
]);
}
else
unset
(
$
a_record
[
'
photo
'
]);
// cleanup session data
$
RCMAIL
-
>
plugins
-
>
exec_hook
(
'
attachments_cleanup
'
,
array
(
'
group
'
=
>
'
contact
'
));
$
RCMAIL
-
>
session
-
>
remove
(
'
contacts
'
);
}
// update an existing contact
if
(
!
empty
(
$
cid
))
{
$
plugin
=
$
RCMAIL
-
>
plugins
-
>
exec_hook
(
'
contact_update
'
,
array
(
'
id
'
=
>
$
cid
,
'
record
'
=
>
$
a_record
,
'
source
'
=
>
get_input_value
(
'
_source
'
,
RCUBE_INPUT_GPC
)));
$
a_record
=
$
plugin
[
'
record
'
];
if
(
!$
plugin
[
'
abort
'
])
$
result
=
$
CONTACTS
-
>
update
(
$
cid
,
$
a_record
);
else
$
result
=
$
plugin
[
'
result
'
];
if
(
$
result
)
{
// LDAP DN change
if
(
is_string
(
$
result
)
&&
strlen
(
$
result
)>
1
)
{
$
newcid
=
$
result
;
// change cid in POST for 'show' action
$
_POST
[
'
_cid
'
]
=
$
newcid
;
}
// define list of cols to be displayed
$
a_js_cols
=
array
();
$
record
=
$
CONTACTS
-
>
get_record
(
$
newcid
?
$
newcid
:
$
cid
,
true
);
$
record
[
'
email
'
]
=
reset
(
$
CONTACTS
-
>
get_col_values
(
'
email
'
,
$
record
,
true
));
if
(
!$
record
[
'
name
'
])
$
record
[
'
name
'
]
=
$
record
[
'
email
'
];
foreach
(
array
(
'
name
'
,
'
email
'
)
as
$
col
)
$
a_js_cols
[]
=
Q
((
string
)
$
record
[
$
col
]);
// update the changed col in list
$
OUTPUT
-
>
command
(
'
parent
.
update_contact_row
'
,
$
cid
,
$
a_js_cols
,
$
newcid
);
// show confirmation
$
OUTPUT
-
>
show_message
(
'
successfullysaved
'
,
'
confirmation
'
,
null
,
false
);
rcmail_overwrite_action
(
'
show
'
);
}
else
{
// show error message
$
err
=
$
CONTACTS
-
>
get_error
();
$
OUTPUT
-
>
show_message
(
$
plugin
[
'
message
'
]
?
$
plugin
[
'
message
'
]
:
(
$
err
[
'
message
'
]
?
$
err
[
'
message
'
]
:
'
errorsaving
'
),
'
error
'
,
null
,
false
);
rcmail_overwrite_action
(
'
show
'
);
}
}
// insert a new contact
else
{
// show notice if existing contacts with same e-mail are found
$
existing
=
false
;
foreach
(
$
CONTACTS
-
>
get_col_values
(
'
email
'
,
$
a_record
,
true
)
as
$
email
)
{
if
((
$
res
=
$
CONTACTS
-
>
search
(
'
email
'
,
$
email
,
false
,
false
))
&&
$
res
-
>
count
)
{
$
OUTPUT
-
>
show_message
(
'
contactexists
'
,
'
notice
'
,
null
,
false
);
break
;
}
}
$
plugin
=
$
RCMAIL
-
>
plugins
-
>
exec_hook
(
'
contact_create
'
,
array
(
'
record
'
=
>
$
a_record
,
'
source
'
=
>
get_input_value
(
'
_source
'
,
RCUBE_INPUT_GPC
)));
$
a_record
=
$
plugin
[
'
record
'
];
// insert record and send response
if
(
!$
plugin
[
'
abort
'
])
$
insert_id
=
$
CONTACTS
-
>
insert
(
$
a_record
);
else
$
insert_id
=
$
plugin
[
'
result
'
];
if
(
$
insert_id
)
{
// add new contact to the specified group
if
(
$
CONTACTS
-
>
groups
&&
$
CONTACTS
-
>
group_id
)
{
$
plugin
=
$
RCMAIL
-
>
plugins
-
>
exec_hook
(
'
group_addmembers
'
,
array
(
'
group_id
'
=
>
$
CONTACTS
-
>
group_id
,
'
ids
'
=
>
$
insert_id
,
'
source
'
=
>
$
source
));
if
(
!$
plugin
[
'
abort
'
])
{
if
((
$
maxnum
=
$
RCMAIL
-
>
config
-
>
get
(
'
max_group_members
'
,
0
))
&&
(
$
CONTACTS
-
>
count
()
-
>
count
+
1
>
$
maxnum
))
$
OUTPUT
-
>
show_message
(
'
maxgroupmembersreached
'
,
'
warning
'
,
array
(
'
max
'
=
>
$
maxnum
));
$
CONTACTS
-
>
add_to_group
(
$
gid
,
$
plugin
[
'
ids
'
]);
}
}
// add contact row or jump to the page where it should appear
$
CONTACTS
-
>
reset
();
$
result
=
$
CONTACTS
-
>
search
(
$
CONTACTS
-
>
primary_key
,
$
insert_id
);
rcmail_js_contacts_list
(
$
result
,
'
parent
.'
);
$
OUTPUT
-
>
command
(
'
parent
.
contact_list
.
select
'
,
html_identifier
(
$
insert_id
));
// update record count display
$
CONTACTS
-
>
reset
();
$
OUTPUT
-
>
command
(
'
parent
.
set_rowcount
'
,
rcmail_get_rowcount_text
());
// show confirmation
$
OUTPUT
-
>
show_message
(
'
successfullysaved
'
,
'
confirmation
'
,
null
,
false
);
$
OUTPUT
-
>
send
(
'
iframe
'
);
}
else
{
// show error message
$
err
=
$
CONTACTS
-
>
get_error
();
$
OUTPUT
-
>
show_message
(
$
plugin
[
'
message
'
]
?
$
plugin
[
'
message
'
]
:
(
$
err
[
'
message
'
]
?
$
err
[
'
message
'
]
:
'
errorsaving
'
),
'
error
'
,
null
,
false
);
rcmail_overwrite_action
(
'
add
'
);
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Thu, Jul 30, 9:32 AM (16 h, 24 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1175934
Default Alt Text
save.inc (10 KB)
Attached To
Mode
R3 roundcubemail
Attached
Detach File
Event Timeline
Log In to Comment