Καταρχήν, αυτό που κάνεις είναι πολύ, ΠΟΛΥ ΣΟΒΑΡΟ πρόβλημα ασφάλειας. Εδώ δεν χωράει το "ναι μεν, αλλά πρέπει". Όπως έχεις εσύ πρόσβαση στην σελίδα μέσω Sharepoint, έχουν και οι χρήστες σου. Από τη στιγμή που έβαλες τη σελίδα στο SafeControls κάποιος από τους πελάτες σου μπορεί να πάει εκεί και να βάλει ό,τι χαζό κώδικα θέλει. Όπως π.χ. να βάλει κώδικα ανοικτό σε script injections. Ή κώδικα ο οποίος θα διαβάζει λίστες και σελίδες που έχεις κρύψει. Ή μία γραμματέας της οποίας είπαν να πάει να φτιάξει μία σελίδα με το "νέο Frontpage". Ή, ή, ή. Μιλάμε για κάτι σαν Bad Sharepoint Practice #3.
Άσε, που όπως είδες και εσύ, το debugging γίνεται μανίκι.
Το λέω με τον απαιτούμενο σεβασμό, γνωρίζοντας ότι έχει τσαντίσει πολύ κόσμο στα newsgroups, και γνωρίζοντας ότι είναι ευκολότερο να κάνεις τη χακιά παρά να μπεις στη λογική του Sharepoint αλλά ... πρέπει να καταλάβεις τη λογική του Sharepoint, ιδιαίτερα πριν κάνεις τόσο δραστικές αλλαγές. Δυστυχώς, το Sharepoint είναι εύκολο για τους τελικούς χρήστες αλλά δύσκολο για τους developers. Γι αυτό και τελικά δεν υπάρχουν Sharepoint Experts, απλά άνθρωποι οι οποίοι έχουν λύσει τα προβλήματα πριν από εσένα.
Σχετικά με το δικό σου θέμα, αφού μιλάμε για workflow θα έπρεπε να ψάχνεις για τρόπους να υλοποιήσεις το workflow. Το Sharepoint έχει το δικό του workflow το οποίο μπορείς να σχεδιάσεις και μέσω Sharepoint Designer, ενώ μπορείς να χρησιμοποιήσεις και Event Receivers αν θέλεις να δουλέψεις μόνο με κώδικα. Κανονικά θα έπρεπε να κοιτάζεις για κάποιο workflow activity το οποίο να αποθηκεύει το αρχείο στο σκληρό και όχι πως να κάνεις το ίδιο πράγμα μέσα στην σελίδα. Υπάρχουν ήδη αρκετά projects στο Codeplex με custom activities, όπως το Useful Sharepoint Designer Custom Workflow Activities το οποίο έχω χρησιμοποιήσει πολύ συχνά. Δεν έχει κάποιο έτοιμο activity για Save to Disk, αλλά μπορείς να το χρησιμοποιήσεις σαν βάση για να φτιάξεις τα δικά σου activities. Για παράδειγμα, τα Send Email with Attachment activities ήδη κάνουν κάποια από τα βήματα που θέλεις κι εσύ,
Όσον αφορά τον κώδικα σου, πουθενά δεν καλείς την RunWithElevatedPrivileges, οπότε δεν υπάρχει περίπτωση να τρέξει ο κώδικας με Admin rights. Μπορεί να άνοιξες το site με το token του Admin, αλλά εσύ δεν θέλεις να δουλέψεις με το site. Θέλεις να δουλέψεις με το σκληρό δίσκο. Πρέπει ο κώδικας σου να τρέξει ως admin, όχι να μιλήσεις στο site ως admin. Για να δουλέψει το Delete θα πρέπει να γράψεις
SPSecurity.RunWithElevatedPrivileges(delegate()
{
System.IO.Directory.Delete(newPath,true);
});
αλλιώς δεν πρόκειται να τρέξει ως System Account. Αν όμως θέλεις όντως να διαβάσεις τα περιεχόμενα της λίστας ως System Account, θα πρέπει να βάλεις και τον υπόλοιπο κώδικα μέσα στην RunWithElevatedPrivileges:
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using(SPSite site=new SPSite(SPContext.Current.Site.ID))
using (SPWeb web = site.OpenWeb())
{
.......
SPListItemCollection listcol = web.Lists["fax"].Items;
SPListItem faxlitem = listcol[new Guid(Request["id"].ToString())];
.....
System.IO.Directory.Delete(newPath,true);
}
});
Στο ξαναλέω όμως, ΜΗΝ ΧΡΗΣΙΜΟΠΟΙΗΣΕΙΣ αυτό τον κώδικα. Είναι πολύ κακή ιδέα να τρέχεις κώδικα μέσα στις σελίδες του Sharepoint.
Μερικές παρατηρήσεις ακόμα. Άλλο το site, άλλο το web. Δεν πρέπει να μπλέκεις τα ονόματα μεταξύ τους γιατί διαφορετικά θα μπλέξεις. Επίσης, η web.AllowUnsafeUpdates είναι επικίνδυνη και δεν πρέπει να τη χρησιμοποιείς αν δεν είσαι σίγουρη γι αυτό που κάνεις ... ειδικά αν δεν κάνεις ΚΑΝΕΝΑ update! Αφού τη χρησιμοποιήσεις θα πρέπει πάντα να την ξανακάνεις false. Λογικά αν χρειαζόταν, θα έπρεπε να την βάλεις σε ένα try .. finally block.
Τέλος, θυμήσου αυτό που έγραψα και νωρίτερα. Το Sharepoint είναι δύσκολο και έχει μανικάκια, ειδικά όταν ξεκινάς με αυτό. Αν δεν θέλεις να μάθεις τί σημαίνει η έκφραση "Υπάρχουν κροκόδειλοι στη μπανιέρα μου", ζήτα βοήθεια από κάποιον έμπειρο έγκαιρα, πριν δεσμευτείς στον προϊστάμενο ή τον πελάτη σου ότι θα έχεις παραδώσει κάτι σε μία συγκεκριμένη ημερομηνία.
Στη δική σου το πρόβλημα δεν είναι το πως να γράψεις στο σκληρό από μία σελίδα, αλλά πως θα κάνεις το Sharepoint να επικοινωνήσει με ένα άλλο σύστημα και μάλιστα στα πλαίσια ενός workflow. Το Sharepoint έχει μηχανισμούς που μπορούν να το κάνουν αυτό χωρίς να δημιουργήσεις προβλήματα ασφαλείας ή συντήρησης στο μέλλον.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos