ลงทะเบียนแบบง่ายบน SharePoint

Submitted by ezybzy on Mon, 2012-06-18 - 22:54

ได้รับโจทย์งานมาว่าอยากให้มีการลงทะเบียนก่อนจะเข้าถึงเอกสารทั้ง Library

เพื่อนเสนอมาว่า ทำ Web Part ให้เขากรอกชื่อเลย เราก็ย้อนกลับไปว่า มันก็รู้ชื่อเขาอยู่แล้วจะให้กรอกอีกทำไม เราก็เลยมองไปที่ List Item ผสมกับ Workflow ให้ทำการเพิ่มสิทธิ์ ความคิดผ่านนะ แต่พอเอาไปทำจริง Workflow ดันไม่ทำงานซะงั้น

แต่แล้วก็แว้บความคิดอีกว่า เอ้อ แล้วทำไมไม่ใช้ SharePoint Group ไปตรง ๆ เลย ข้อมูลที่จะกรอกลงทะเบียนมันก็ไม่เห็นจะมีอะไรเลยนี่นะ

ขั้นเตรียมการ เราทำการสร้าง SharePoint Group ขึ้นมา 1 อันแล้วนำไปผูกกับ Library ที่ต้องการแล้วทำการ Stop Inherit Permission แล้วทำการลบ Group หรือบุคคลที่ไม่เกี่ยวข้องออกให้หมด แล้วก็ให้สิทธิ์กับ SharePoint Group นั้นพอสมควร

จากนั้นกลับมากำหนดค่ากับ SharePoint Group ให้อนุญาตให้ Request for joining แล้วก็ตั้งให้ Accept คำขอการเข้ากลุ่มโดยอัตโนมัติ แล้วก็อย่าลืมเอา e-mail ปลายทางออกด้วย เดี๋ยวจะได้เมล์ที่ไม่พึงประสงค์มาเยอะเกินเหตุ (เพิ่งทราบว่าการ Request เข้ากลุ่มใน SharePoint ตัวระบบไม่ได้เก็บสถิติใด ๆ ไว้เลยนอกจากพ่น e-mail ร้องขอออกไปอย่างเดียว ซึ่งในนั้นก็มีเพียงแค่ลิงค์ที่จะนำไปสู่หน้าการตั้งสิทธิ์โดยมีพารามิเตอร์ของผู้ใช้ที่ร้องขอสิทธิ์เท่านั้น!)

มีโจทย์ที่สนุกกว่านั้นอีกหน่อยคือ แล้วจะหลอกล่อให้ผู้ใช้เข้าไป Join Group อย่างไรดี ส่งไปหน้ากลุ่มแล้วให้กด Join Group เอาเองก็ดูจะไม่เข้าท่าเท่าไร ก็เลยได้ข้อเสนอแนะมาว่า ก็จำลองปุ่ม Join Group มาเลยดีกว่าไหม? เหมือนจะง่ายนะ แต่เผอิญว่าปุ่มนั้นใน Code HTML ที่ถูกสร้างขึ้นมาบนหน้าจอ SharePoint ดันให้ลิงค์เป็น javascript: ซึ่งแปลว่าไม่มีลิงค์ให้กดนะ!

เราก็เลยต้องมานั่งแกะว่าจริง ๆ กดแล้วมันทำอะไร ก็ไปพบว่ามันเรียกใช้งาน Javascript function ที่ชื่อ JoinOrLeaveGroupClick() ซึ่งในนั้นก็เป็นการสั่ง __doPostBack() ตามกระบวนการของ ASP.net ก็ดูเหมือนว่าจะสุดทางแล้ว ต่อมาก็คิดต่อว่า แล้วเราจะสั่งมันได้อย่างไร ก็พบว่าเราสามารถแทรกหน้า SharePoint Group ใส่ iframe ได้ เนื่องจากเราไม่ติดข้อจำกัดของ XSS (หน้าแสดงผลกับหน้า SharePoint อยู่บนโดเมนเดียวกัน) เราก็เลยถือโอกาสเขียน Javascript สั่งให้ไปเรียกใช้งานฟังก์ชั่นดังกล่าวใน iframe แทน ซึ่งก็ทำได้ไม่ผิดกติกาอะไร แต่ก็มีเรื่องที่ต้องคิดอีกอย่างคือ การเข้าหรือออกจากกลุ่มมันดันใช้ฟังก์ชั่นเดียวกัน แล้วจะมีหนทางในการตรวจสอบก่อนไหมว่า ผู้ใช้คนนี้อยู่ในกลุ่มแล้วให้ซ่อนปุ่มกดนี้ไป

ก็เลยต้องมานั่งสังเกตว่าเมนูของการ Join Group กับ Leave Group มีข้อแตกต่างอย่างไร ก็พบว่า ในการ Join Group เมนูที่เกิดขึ้นจะมีโครงสร้าง ul ซึ่งประกอบด้วย li แค่อันเดียว แต่การ Leave Group จะเกิด li มา 4 อัน (เป็นเมนู 3 อัน แล้วตัวแบ่งอีก 1 อัน) ซึ่งก็โชคดีอีกว่า li แต่ละตัวมี Attribute ชื่อ id ประกอบด้วย นั่นจึงทำให้สามารถใช้ฟังก์ชั่นหากิน getElementById จัดการตรวจสอบว่าพบ id ของเมนูที่ต้องการหรือไม่ หากพบก็จะสั่งให้ซ่อนปุ่มได้อีกชั้น พบว่าเราต้องใช้วิธีนับจำนวนแถว td ของตารางที่เป็นตัวกำหนดแถบเมนูว่ามีกี่ปุ่ม ซึ่งหากยังไม่ได้เข้ากลุ่มตารางดังกล่าวจะมีจำนวน td 4 อัน (หากเข้ากลุ่มแล้วจะมี 7 อัน)

สังเกตว่าจากเริ่มต้น Programming สุดท้ายก็มาจบลงที่ Javascript ที่ผูกโยงกับการใช้ฟีเจอร์เดิม ๆ ของ SharePoint นั่นเอง บางทีหลังจากผ่านประสบการณ์อะไรมาก ๆ มันก็ทำให้เราคิดได้ว่า ความต้องการบางอย่าง จริง ๆ ใน SharePoint มันก็มีให้อยู่แล้ว การที่จะมานั่งเขียน Code ทำไปทุกอย่างมันก็วุ่นวายเสียแรงเกินไป เรามาใช้มายากลของ HTML ทำดีกว่าง่ายกว่าเยอะ!

Blog Tags

อันเนื่องจาก Client Hyper-V

Submitted by ezybzy on Sun, 2012-06-03 - 13:26

วางแผนว่าเมื่อ Windows 8 ออกคงต้องขยายฮาร์ดดิสก์ใน ThinkPad X220 ของที่ทำงาน แล้วก็อาจจะต้องขอเพิ่มแรมไปอีกเสียหน่อย (16 GB ไปเลย)

Client Hyper-V ก็เหมือนกับโปรแกรมพวก VMware นั่นแหละ และจากที่ได้ลองใช้ Hyper-V บน Windows Server 2008 R2 แล้วนั้นพบว่า มันใช้ง่ายแล้วดูเป็นธรรมชาติดี ซึ่งอาจจะทำให้กระบวนการพัฒนาซอฟท์แวร์บน SharePoint ทำได้สะดวกขึ้น เพราะเราจะได้แยกสภาวะการทำงานออกจากปัจจุบันที่ฝาก Image ไว้บน ESXi ซึ่งยังใช้การแบ่งปันบัญชีผู้ใช้งานกับผู้ใช้อีกคนที่ชอบปรับแต่งหน้าตาของ Visual Studio จนเป็นที่หงุดหงิดของผมมาก

Blog Tags

การ Jailbreak iOS ในต่อไปเราคงเห็นแต่รูปภาพเป็นหลัก

Submitted by ezybzy on Thu, 2012-05-10 - 11:15

มันเป็นดราม่าระหว่างคนหาช่องโหว่ในการ Jailbreak กับคนที่อยากจะให้ Jailbreak ได้

เหตุมันมีอยู่ว่า คนที่ไม่ได้ทำอะไรเลยเอาแต่ร้องขอ ออกมาต่อว่าผู้หาช่องโหว่ในการ Jailbreak ว่าทำไมทำได้แล้วไม่ปล่อยออกมา ซึ่งเหตุผลของคนทำเขาก็ชัดเจนในจุดยืนว่า เขาไม่ต้องการให้มีคนหาประโยชน์จากช่องโหว่ที่เขาหามาได้ ไม่ว่าจะเป็นการนำ Tool ที่พัฒนาแจกฟรีไปหาเงิน (นึกไม่ออกก็ที่คุณไปจ้างให้ตู้ตามห้างทำให้นั่นแหละ) หรือการทำเครื่องมือสืบสวน (Forensics) โดยการนำ code ที่ถือว่าเป็น opensource (ไม่แน่ใจว่าเปิดเผยหรือไม่ แต่น่าจะ reverse ได้ไม่ยาก) ไปใช้หารายได้

ทางผู้หาช่องโหว่จึงทำการเก็บงำช่องโหว่ไว้ใช้เอง เพราะเขาเห็นว่า การมีช่องโหว่ที่ไม่รู้ว่าคืออะไรเป็นประโยชน์กับเขาในการเสาะหาช่องโหว่อื่น ๆ ได้ในอนาคต และคิดว่าผู้ที่อยากจะหารายได้จากการ Jailbreak ก็ควรจะมีส่วนร่วมในกระบวนการหาช่องโหว่บ้างมากกว่าจะมาคว้าพุงปลาไปกิน

ผมค่อนข้างเห็นด้วยในเหตุผลของเขานะ และนี่อาจจะเป็นสาเหตุที่ทำให้จำนวน Hacker ที่มีความเคลื่อนไหวในกระบวนการ Jailbreak มีจำนวนลดลงเรื่อย ๆ เพราะทนสภาพความเสื่อมโทรมของวงการไม่ได้ ทำฟรีแล้วไม่ได้อะไรคงไม่ว่า แต่ทำฟรีแล้วถูกชุบมือเปิบไปคงเป็นเรื่องที่ใคร ๆ ก็เคืองครับ

จะว่าไปถ้าจำเรื่อง SHAtter ได้ นั่นก็เป็นช่องโหว่ที่เขาจะเก็บไว้ใช้นะ แต่สุดท้ายก็ถูก Apple ค้นพบ (คาดว่า) จากการเก็บ log ที่ถูกส่งกลับไปทำให้ถูกปิดไปไม่ได้นำมาใช้งานในเครื่องมือ Jailbreak ใด ๆ เราก็ไม่ทราบว่าช่องโหว่ที่ถูกเก็บงำไว้นี้จะถูกปิดเมื่อใดเช่นกัน แต่ก็หวังว่ามันจะยังมีช่องโหว่ในระดับ Bootrom หรือให้ดีก็ Hardware เลยที่จะทำให้สามารถ Jailbreak ถาวรได้

Blog Tags
iOS

ความยุติธรรมของศาล

Submitted by ezybzy on Mon, 2012-05-07 - 07:47

ความยุติธรรมของศาลคือ ตัดสินคดีตามข้อกฎหมายที่มี

ความยุติธรรมของศาลคือ ตัดสินคดีตามข้อเท็จจริงที่นำสืบ รับฟังข้อเท็จจริงจากโจทก์และจำเลย

ความยุติธรรมของศาลคือ ตัดสินคดีตามที่รับฟ้อง

แต่ที่เราคิดกันว่าศาลไม่ยุติธรรมเพราะศาลไม่ได้ตัดสินข้างเรา หรือตัดสินไม่ถูกใจเรา หรือคิดไปเองว่าความยุติธรรมที่ล่าช้าคือความอยุติธรรม

Blog Tags

อันเนื่องจาก DelegateControl

Submitted by ezybzy on Fri, 2012-04-20 - 11:16

ติดปัญหากับ DelegateControl มาหลายวัน วันนี้แก้ออกเสียที เป็นความสะเพร่าของผมเอง

ใน CKSDev มี Template การสร้าง DelegateControl ไว้ให้ใช้ แต่เหมือนจะไม่ได้เขียนคำอธิบายที่ชัดเจนไว้ให้ชัดเจนว่าต้องกรอกอะไร แล้วห้ามกรอกอะไร

หลักการของ DelegateControl คือ การโหลด Control ที่บนหน้าเว็บไม่รู้ว่าคืออะไรมาแสดง โดย Control ปริศนานี้จะถูกโหลดผ่าน Feature (ได้ทุก Scope เลย) ดังนั้นเราจึงต้องมาเขียน Element Manifest อธิบายมัน

สำหรับตัวอย่าง Tag ภายใน Element Manifest เช่น

<Control Id="ชื่ออ้างอิงที่จะเอาไปใช้" Sequence="เลขน้ำหนัก ยิ่งน้อยยิ่งเบา ยิ่งอยู่ก่อน" ControlSrc="ที่อยู่ของ Control ปกติจะใช้ ~/_controltemplates/ นำหน้า แต่ถ้าไปวางไว้ที่อื่นก็ใส่ Path ที่อ้างถึงได้ (อะไรที่ IIS มองเห็น)" />

หรือ

<Control Id="ชื่ออ้างอิงที่จะเอาไปใช้" Sequence="เลขน้ำหนัก" ControlAssembly="..." ControlClass="..." />

ปัญหาคือ ในแบบฟอร์มของ CKSDev ไม่ได้ระบุว่า หากกรอก ControlSrc แล้ว ไม่จำเป็นต้องกรอก ControlAssembly และ ControlClass (แต่ 2 ตัวนี้ต้องกรอกคู่กัน) หากกรอกไปหมดทุกอันเลย ผลที่ได้คือ Delegate Control จะไม่ถูกโหลดมาใช้งาน เพราะมันคงงงว่าจะอ่านจาก ascx หรือจะอ่านจาก Class กันแน่

เมื่อแก้ไขถูกต้องแล้วทุกอย่างก็จะทำงานเป็นปกติ

Blog Tags

User เป็นเหตุ

Submitted by ezybzy on Thu, 2012-04-19 - 10:56

เขียนโปรแกรมให้สุ่มหยิบ SPUser มาแสดงผล ทีนี้เกิดปัญหาว่า ไม่มี User ใดที่เข้าเงื่อนไขที่อยากให้แสดงผลเลย ตรวจสอบเงื่อนไขก็ดูไม่มีอะไรผิดปกตินะ แต่สิ่งที่ผิดคือ แหล่งที่ไปดึง User มาตรวจสอบ มีจำนวน User น้อยกว่าที่คาดไว้

เผอิญว่าใน SPWeb มันมีแหล่งที่ให้สามารถดึง User มาใช้ได้ 3 แหล่งคือ AllUsers, SiteUsers, และ Users ก็เกิดความสับสนว่า จะใช้จากแหล่งใดดี ไปเจอคำอธิบายคำตอบของเรื่องนี้ในกระดานสนทนา MSDN เลยตัดมาสรุปคิดว่าน่าจะใช้ประโยชน์ต่อไปได้

SPWeb.Users gets the collection of user objects that are explicitly assigned permissions in the Web site . It will not return users who have access through a group.

SPWeb.AllUsers gets the collection of user objects that represents all users who are either members of the site collection or who have browsed to the site as authenticated members of a domain group in the site. (note the "browsed to" here... adding a AD group to a site does not add the users to AllUsers immediately... they will not be listed here until they have visited the site at least once.)

SPWeb.SiteUsers gets the collection of all users that belong to the site collection.

สังเกตว่า AllUsers ก็จะพบแค่ User ที่ผ่านการ EnsureUser มาแล้วเท่านั้น

Blog Tags