Archive for ‘Webparts’

July 14, 2013

The dilemma of Double-Hop Dogma

Was wondering about the subject of the post which i am going to write. okay fine and its Double Hop Dogma. This is related to Exchange Web Services API. you can download the API from this link. Let me explain what happened. There was a requirement raised due to the fact that we cant view OWA websites (Outlook Webmail) inside an IFRAME. When we used the OWAInputWebPart the owa site used to display within the ifram of the OWAInputWebPart. Hence there was an exception saying that it cannot be displayed within IFRAME. So as a solution we had to develop our own custom web part to view the inbox emails.

Initially i was playing around with a single mail box and was able to fetch the mails without any problem. I refered this MSDN article for my reference.

binding.Credentials = new NetworkCredential("userid", "password", "domain");

So the above code works fine and was able to read the emails. As the next step the requirement was to read the emails based on the currently logged in user in Share Point. So started working on a new web part for this.

as per the link it says that…

If you want to connect to EWS from a computer that is logged on to the domain, using the credentials of the authenticated user, set the UseDefaultCredentials property on the ExchangeService object to true.

// Connect by using the default credentials of the authenticated user.
service.UseDefaultCredentials = true;

i kept trying the above code to work but unfortunately it didn’t work. I spent full whole day trying on this. I searched on the web and found the blog post about the double hop dogma. it says “The user who’s browsing the application from a client machine passes his credentials to the IIS server, i.e. the credentials of the user hop from the client to the IIS server. Subsequent to that, when the IIS application executes EWS calls, it is supposed to pass those same credentials to the Exchange server, to authenticate the logged on user. This works fine in the ideal scenario, and falters in alternative scenarios.”

They have mentioned following scenarios related to the above sentence as below:

Ideal scenario: Kerberos authentication method is being used within the organization
Frequent Scenarios: The non-ideal scenario is not being observed, i.e. NTLM might be the active authentication mechanism, or Kerberos could be failing and the application falls back on attempting authentication via NTLM which would eventually fail in a double-hop situation.”

In my case when i checked the active directory structure on the client site, i learnt that they are not using the Kebreros authentication instead they are using the NTLM authentication on AD.

So i came across the blog post : Need a way to authenticate to Exchange Web Services and based on the fact which explains that: “Create a service account that has either impersonation rights or delegate access over the employee mailboxes. Then log in as the service account.” I advised the network administrator to create a service account for me. Uplon creating the account i resumed my work as usual.

// Setup connection string
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013);
service.Credentials = new NetworkCredential("superadmin", "password", "domain");

Impersonating the service using a difference user id.

// Impersonation
service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, "useremail1@domain.com");

In this place i was able to get the currently logged in user by executing the following code

HttpContext.Current.User.Identity.Name.ToString()

Finally was able to retrieve mail details as below:

SearchFilter searchFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));

var inbox = new FolderId(WellKnownFolderName.Inbox);
var iv = new ItemView(9999);

FindItemsResults<Item> findResults = service.FindItems(inbox, searchFilter, iv);

if (findResults.Items.Count > 0)
{
foreach (Item item in findResults.Items)
{
mailboxDetails a = new mailboxDetails();
a.Subject = item.Subject;
}
}

Refer example post here by Jens Willmer.

Please refer the following articles to understand about Exchange Impersonation:

Delegate Access with Exchange Web Services

Exchange Impersonation vs. Delegate Access

The thread i posted on MSDN

Threads which was posted by others:

Exchange Web Services (EWS), GetItem() call produces AccessDenied error

ServiceRequestException Message : Request failed. The remote server returned an error: (401) Unauthorized

Exchange Web Services: UseDefaultCredentials property

please refer some samples related to the Exchange Web Services through this link.

Exchange Tutorial Part 1 – Impresonated Exchange Service Binding

April 3, 2013

SharePoint 2010 – Search Core Results XSLT Transformation

Suddenly your manger says to you, man, we just wanted to modify the core search results of the SharePoint 2010. So the first step is to add a Search core results web part to your search results page and open the same page in a browser. After that put the page in edit mode and choose edit web part from the Search Core Results Web Part menu.

In the Search Core Results Tool Pane open the Display Properties section and then uncheck “Use Location Visualization” and you can notice that the XSL Editor… button should become active.

image001

Click the “XSL Editor…” button to open the Text Editor dialog.

image002

Replace all the above XSL with the below (or just copy to the clipboard hence you will need the data in future):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xmp><xsl:copy-of select="*"/></xmp>
</xsl:template>
</xsl:stylesheet>

The reason why I did substituted the existing XSLT is to know how the SharePoint renders the output of the search results.

So the core results search of the SharePoint will give you the results in a format as below:

<All_Results>
    <Result>
      <id>1</id>
      <workid></workid>
      <rank>1006</rank>
      <title>Your document title</title>
      <author>Mikael Svenson</author>
      <size>79872</size>
      <path>http://server/path/test.html</path>
      <description></description>
      <write>11/1/2010</write>
      <sitename>Procedures</sitename>
      <collapsingstatus></collapsingstatus>
      <hithighlightedsummary>This is a summary.</hithighlightedsummary>
      <hithighlightedproperties>
        <HHTitle>Your document title</HHTitle>
        <HHUrl>http://server/path/test.html</HHUrl>
      </hithighlightedproperties>
      <imageurl imageurldescription="Web Page">/_layouts/images/html16.png</imageurl>
      <contentclass></contentclass>
      <isdocument>True</isdocument>
      <picturethumbnailurl></picturethumbnailurl>
      <url>http://server/path/test.html</url>
      <serverredirectedurl></serverredirectedurl>
      <fileextension>ASPX</fileextension>
      <spsiteurl></spsiteurl>
      <docvector>[procedure overview, 1][links, 0.707107]</docvector>
      <fcocount>1</fcocount>
      <fcoid>336059505871761914</fcoid>
      <pictureheight></pictureheight>
      <picturewidth></picturewidth>
      <escbaseextension>xls</escbaseextension>
      <escprojname>00 - UNDEFINED</escprojname>
      <escdeptname>0000 - UNDEFINED</escdeptname>
      <escprocnumber></escprocnumber>
      <esccategoryname>COMPANY MANAGEMENT SYSTEM</esccategoryname>
      <escsubcategoryname>GOVERNING DOCUMENTS</escsubcategoryname>
      <eschistdocnum></eschistdocnum>
    </Result>
</All_Results>

When you wanted to modify the search results, then what you have to do is to modify the XSLT part that we copied in one of the steps above. I usually used to do is to copy all those XSLT in to Visual Studio and then modifying the same as needed.

image004

By default the search results would be as below with icons, etc.

image006

After modifying the XSLT the search results would like below:

image008

I was using the OOB search paging web part to get the paging for the search results.

image010

please refer the following links for more detail:

Enterprise Search Core Results XSLT Transformation
http://msdn.microsoft.com/en-us/library/ms584121%28v=office.12%29.aspx

How to: View Search Results XML Data
http://msdn.microsoft.com/en-us/library/ms546985.aspx

Take Control of Search XSL
http://www.ableblue.com/blog/archive/2011/09/30/take-control-of-search-xsl/

March 31, 2013

Publishing pages based on a SharePoint Article page layout programmatically

Glad I got some few minutes to update my blog after 2 months hence was in a busy schedule. J  Please refer the below code for you to create a Publishing page on Sharepoint 2010 based on a page layout which is available in your site.

PublishingWeb publishingWeb = PublishingWeb.GetPublishingWeb(web);
string pageName = “MyPageName.aspx”;
PageLayout[] pageLayouts = publishingWeb.GetAvailablePageLayouts();
PageLayout selectedLayout = null;
foreach (PageLayout pl in pageLayouts)
{
if (pl.Name == "MyPublishingPageLayout.aspx")
{
selectedLayout = pl;
break;
}
}
PageLayout currPageLayout = selectedLayout;
PublishingPageCollection pages = publishingWeb.GetPublishingPages();
PublishingPage newPage = pages.Add(pageName,currPageLayout);
newPage.ListItem[FieldId.PublishingPageContent] = “Content of the page”;
newPage.ListItem.Update();
newPage.Update();
newPage.CheckIn(“Comment for the checkin”);
newPage.ListItem.File.Publish("page published");
newPage.ListItem.File.Approve("page approved");

please refer the following links for more details:

http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/thread/69b509cd-4865-4d9f-891f-5050d59e78b4/
http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopmentprevious/thread/e6ca8a5f-b650-4759-8760-57086cb19765

January 10, 2013

Branding the Sharepoint 2010 Top Navigation

IF anyone interested in doing the branding the top navigation of the sharepoint site, just start it with this link.

before branding the Top Navigation:

beforebranding

After branding the Top Navigation:

afterbranding
The above mentioned SharePoint top navigation had to support variation with the Arabic fonts. So i had issues when the top navigation turns its direction to RTL. so the solution mentioned in the below link helped me out to find the problem which made the menu to behave naughty.

http://social.msdn.microsoft.com/Forums/da-DK/sharepointcustomizationprevious/thread/7f2b6811-1d19-4a9c-a5fa-29f5be4dbe5a

the problem which i was getting is from the following style in core4.css
.menu ul.dynamic {
position: absolute;
right: -999em;
}

Had to override the style which was mentioned in the core4.css with the below entry:

.menu ul.dynamic {
position: absolute!important;
top: -999em!important;
}

refer the following link to start up the branding:

http://chrisstahl.wordpress.com/2010/11/04/customizing-sharepoint-2010-global-navigation-with-css-and-jquery-2/

apart from the branding of the top navigation had to brand the search OOB webpart. You can find the style which i used in the below css style.

before branding the search OOB webpart:

searchbefore

after branding the search OOB webpart:

searchafterbranding
As well as if you need to hide the breadscrumb (sitemap path navigation) of the site please add the following entry in the master page or in a content editor web part on the page. (just check the ID of the control when browsing the page).

<style type=”text/css”>

#ctl00_PlaceHolderTitleBreadcrumb_ContentMap {display=none;}

</style>

the complete style sheet:

/* Drop Down: Container Style */
.s4-tn ul.dynamic{
background-color:rgb(65, 64, 66)!important;
border:thin rgb(182, 164, 85) double !important;
border: thick #b6a455 double!important;

}
/* Drop Down: Item Padding Style */
.s4-tn li.dynamic > .menu-item{
/*padding:10px 20px 10px 20px;*/
}
/* Drop Down: Hyperlink Styles */
.s4-tn li.dynamic > a{
font-size: 9px!important;
font-weight:normal!important;
color:#b6a455!important;
border:thin rgb(182, 164, 85) double!important;
text-align:left;
}
/* Drop Down: Hyperlink Hover Style */
.s4-tn li.dynamic > a:hover{
background-color:rgb(182, 164, 85)!important;
color:rgb(65, 64, 66)!important;
border: thin rgb(65, 64, 66) double!important;
}

/*          top menu */
/* Drop Down: Hyperlink static style */
.s4-tn li.static > .menu-item {
font-size: 9px!important;
font-weight:normal!important;
color:#b6a455!important;
border:thin rgb(182, 164, 85) double !important;
background-color:rgb(65, 64, 66);
border: thick #b6a455 double!important;
}
/* Drop Down: Hyperlink static Hover Style */
.s4-tn li.static > a:hover{
background-color:rgb(182, 164, 85)!important;
color:rgb(65, 64, 66)!important;
border: thick rgb(65, 64, 66) double!important;
}
/* Drop Down: Hyperlink static Hover Style */
.s4-tn li.static > a.selected{
background-color:rgb(182, 164, 85)!important;
color:rgb(65, 64, 66)!important;
border: thick rgb(65, 64, 66) double!important;
}
/* top down menu */
.menu-horizontal a.dynamic-children span.additional-background, .menu-horizontal span.dynamic-children span.additional-background
{
background-image:none!important;
}
.menu-horizontal ul.dynamic a.dynamic-children span.additional-background, .menu-horizontal ul.dynamic span.dynamic-children span.additional-background
{
background-image:url(“/Style Library/Images/Arrow_English.gif”)!important;
}
.menu-vertical a.dynamic-children span.additional-background, .menu-vertical span.dynamic-children span.additional-background{
background-image:url(“/Style Library/Images/Arrow_English.gif”)!important;
}

/* Search Box */

.s4-search input.ms-sbplain {
width: 220px !important;
line-height: 20px !important;
height:17px!important;
background-color: #F5EFE0 !important;
border: 1px solid #D3AE81 !important;
}
.s4-search .ms-sbgo {
padding: 0;
margin: 0;
line-height: 20px;
text-align:center!important;
vertical-align:middle!important;
}
.s4-search .ms-sbgo a {
background-image: url(‘/Style Library/Images/Search_en.gif’);
background-repeat: no-repeat;
width: 120px;
height: 33px;
display: block;
text-align:center;
vertical-align:middle;
margin-left:10px;
margin-top:5px;
}
.s4-search .srch-gosearchimg {
display: none;
}
.ms-sbscopes {
display: none;
}
td.ms-sbcell{
background-color:rgb(182, 164, 85)!important;
border:0px;
text-align:center;
vertical-align:middle;
}
.ms-sbtable{
border-top-width:0px!important;
border-right-width:0px!important;
border-bottom-width:0px!important;
border-left-width:0px!important;
background-color:white!important;
border-top-style:none!important;
border-right-style:none!important;
border-bottom-style:none!important;
border-left-style:none!important;
border-bottom-color:rgb(182, 164, 85)!important;
border-top-color:rgb(182, 164, 85)!important;
border-right-color:rgb(182, 164, 85)!important;
border-left-color:rgb(182, 164, 85)!important;
}
.ms-sbLastcell{
display:none;
}
.search .ms-sbcell{
color:#4f4f4f!important;
}
.menu-horizontal li.static, .menu-horizontal a.static, .menu-horizontal span.static{
float:none!important;
display:inline-block!important;
}

November 21, 2012

Website got hacked

Shortly, after publishing of the website which i was working on few days back, yesterday i noticed some unexpected number of records is being inserted into one of the Share Point List we do have in our system. The purpose of the said list was to get the user comments from the website visitors for the News, Articles, etc via a User Input Form. The said form was fully secured with the client side scripts for malicious data inputs. At first i panicked, because i was worried about the rest of the user input forms also been compromised. But, thankfully its not and the intrusion was limited only to the said form above. 🙂

When investigated the data that hacker tried to inject into the system seems an automated script which is being used for SQL Injection and as well as a sort of a DOS (Denial of Service) attack. As an urgent fix for this had to implement the Captcha (Completely Automated Public Turing test to tell Computers and Humans Apart) feature to make sure the data is being inputted by a human and not from an automated robotic program.

the scripts which was embedded..

November 14, 2012

Adding a single value and multiple values into a Lookup Column

There might be situations where you may have to add multiple values to a SharePoint list field.


SPFieldMultiChoiceValue multiChoiceFunction = new SPFieldMultiChoiceValue();

for (int i = 0; i &lt; CheckBoxList1.Items.Count; i++)
{
if (CheckBoxList1.Items[i].Selected)
{
int lvId = Convert.ToInt32(CheckBoxList1.Items[i].Value);
string lvValue = CheckBoxList1.Items[i].Text.ToString().Trim();
SPFieldLookupValue lv = new SPFieldLookupValue(lvId, lvValue);
multiChoiceFunction.Add(lv.ToString());
}
}

item["Function"] = multiChoiceFunction;

below is the code snippet of the way to add a value to a SharePoint look up column field :

foreach (ListItem lst in RadioButtonList1.Items)
{
if (lst.Selected == true)
{
int lvId = Convert.ToInt32(lst.Value);
string lvValue = lst.Text.ToString().Trim();
SPFieldLookupValue lv = new SPFieldLookupValue(lvId, lvValue);
item["TypeOfTest"] = lv;
}
}
October 29, 2012

Google Map Visual Web Part

Finally was able to finish the share point 2010 visual web part which i was working on. Seems the webpart looks cool. Its nothing other than JQuery and Google MAP API v 3.o with customization.

refer the google map API documentation for the v 3.0 via this link.

the interesting part of the above web part is that the markers used to fly in to the locations based on the category. you can refer the following out of the box source code below with zero customization:

http://code.google.com/

August 2, 2012

MSChart Controls in SharePoint / MOSS 2010

I had a chance to develop a Survey Webpart with MS Chart Control for SharePoint 2010.

Initially thought that getting the chart controls to work in SharePoint is similar to the way that we have to do in ASP.NET. But with SharePoint there are some stuffs we have to do it manually.

You can download the MS Chart from this link  and read more about the MS Chart controls from the link.


Once you open up a new fresh SharePoint 2010 project with a visual web part, then add a reference to the System.Web.DataVisualization.dll.

please add these entries in the web.conf file as below:

</pre>
<handlers>
 <add name="ChartImageHandler" preCondition="integratedMode"  verb="GET,HEAD,POST" path="ChartImg.axd"
 type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler,  System.Web.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
 </handlers>
[/sourcode]

</pre>
<appSettings>
 <add key="ChartImageHandler" value="storage=file;timeout=20;" />
 //<add key="ChartImageHandler" value="Storage=file;Timeout=20;Url=/_layouts/Images/MSChartImages/;" />
 //<add key="ChartImageHandler" value="Storage=memory;Timeout=20;" />
 </appSettings>

As well as please register the assembly in your user controls (.ascx file) as below.

</pre>
<%@ Register Assembly="System.Web.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
 Namespace="System.Web.UI.DataVisualization.Charting" TagPrefix="asp" %>

After that add the Chart control to your page as mentioned below:

<asp:Chart ID="Chart1" runat="server" Width="550px" Height="350px">
 <Series>
 <asp:Series Name="Request" XValueMember="Column1"
 YValueMembers="Column2"
 ChartType="Column" Palette="EarthTones"
 ChartArea="MainChartArea">
 </asp:Series>
 </Series>
 <ChartAreas>
 <asp:ChartArea Name="MainChartArea" Area3DStyle-
 Enable3D="true">
 <Area3DStyle Enable3D="true"></Area3DStyle>
 </asp:ChartArea>
 </ChartAreas>
 </asp:Chart>

From your code behind, retrieve the data what you need to be pushed into chart as a datatable and just set the datasource of the chart control as below.

</pre>
Chart1.DataSource = yourDataTable;
 Chart1.DataBind();

read more about the MS Chart control in below link:

http://www.dotnetspark.com/

July 10, 2012

System.Security.SecurityException: Request for the permission of type

System.Security.SecurityException: Request for the permission of type ‘System.Net.WebPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089’ failed

I was getting the above error at the time when a Form (Sharepoint Webpart) submits some data to a sharepoint list. To overcome the above said error follow the below steps:

1. Navigate to the folder => “C:\Program Files\Common Files\Microsoft Shared\web server extensions\14\CONFIG” and open the wss_minimaltrust.config file.

2. Under the XML section <namedpermissionsets> you can find the <permissionset>. After that add the below segement:

<ipermission>
class=”WebPermission”
version=”1″
Unrestricted=”true”>
</ipermission>

Error Details:

Security Exception
Description: The application attempted to perform an operation not allowed by the security policy. To grant this application the required permission please contact your system administrator or change the application’s trust level in the configuration file.

Exception Details: System.Security.SecurityException: Request for the permission of type ‘System.Net.WebPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089’ failed.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

May 30, 2012

Populate drop down with user created sharepoint fields

Assume that there is a situation where you have to expose only the user defined fields from a sharepoint list by filling up a dropdown. Usually when you tried to get fields collection list from a sharepoint list or a document library you will get list of columns roughly which will include around 40+ columns.

Following code snippet explains you how to populate a drop down list only with the fields that you have created.

Populatet the dropdown using a sharepoint list :

   using (SPSite site = new SPSite(siteUrl))
                {
                    using (SPWeb web = site.RootWeb)
                    {
                        SPList list = web.Lists["MainSpecificationList"];                        

                        SPList oSPList = web.Lists["MainSpecificationList"];
                        for (int i = 0; i < list.Fields.Count - 1; i++)
                        {
                            if (!list.Fields[i].Hidden && !list.Fields[i].ReadOnlyField &&
                            list.Fields[i].Type != SPFieldType.Attachments)
                            {
                                if (list.Fields[i].Title.ToString() != "Title" && list.Fields[i].Title.ToString() != "Content Type"
                                    && list.Fields[i].Title.ToString() != "SpecificationPDFURL" && list.Fields[i].Title.ToString() != "PDF View URL")
                                {
                                    ddlDropDown.Items.Add(list.Fields[i].Title.ToString());
                                }
                            }
                        }
}
}

Populate the dropdown using a sharepoint View:

   using (SPSite site = new SPSite(siteUrl))
                {
                    using (SPWeb web = site.RootWeb)
                    {
SPView view = list.Views["SearchView"];

                        SPListItemCollection itemCol = list.GetItems(view);                                                           

                        for (int Cnt = 0; Cnt <= list.Fields.Count - 1; Cnt++)
                        {
                            if (!list.Fields[Cnt].Hidden && !list.Fields[Cnt].ReadOnlyField &&
                            list.Fields[Cnt].Type != SPFieldType.Attachments)
                            {
                                if (list.Fields[Cnt].Title.ToString() != "Title" && list.Fields[Cnt].Title.ToString() != "Content Type"
                                    && list.Fields[Cnt].Title.ToString() != "SpecificationPDFURL" && list.Fields[Cnt].Title.ToString() != "PDF View URL")
                                {
                                    ddlDropDown.Items.Add(list.Fields[Cnt].Title.ToString());
                                }
                            }
                        }

                    }
                }
            
April 6, 2012

Session state can only be used when enableSessionState is set to true

Today i was working with a sharepoint visual webpart and was trying to add some data in to session and was getting the error : {System.Web.HttpException: Session state can only be used when enableSessionState is set to true, either in a configuration file or in the Page directive. Please also make sure that System.Web.SessionStateModule or a custom session state module is included in the <configuration>\<system.web>\<httpModules> section in the application configuration.
at System.Web.UI.Page.get_Session()
at inc_coe_forms.ContactUs.ContactUsUserControl.btnAddMoreFiles_Click(Object sender, EventArgs e)}

Or

Unexpected error occurred: System.Web.HttpException: Session state can only be used when enableSessionState is set to true, either in a configuration file or in the Page directive. Please also make sure that System.Web.SessionStateModule or a custom session state module is included in the \\ section in the application configuration.
Solution

Usually Session state can only be used when enableSessionState is set to true, either in a configuration file or in the Page directive.

configuration file

<pages enableSessionState="true" >
<httpModules>
 <add type="System.Web.SessionState.SessionStateModule" name="Session" />
 </httpModules>

Page directive

<%@ Page Language="C#" enableSessionState="true"%>

This happens when IIS is not configured properly after creating SharePoint application and there are web parts or features that use session you may get the above error.

You can enable the session state in IIS when you followed step as below: