小编Phi*_* A.的帖子

替换`while(1)`以简化分支

我不时会用一个while(1)块来压扁一连串if..else不成比例的东西.它沿着这些方向发展.

而不是做:

// process 
if (success) {
  // process 
  if (success) {
    //process
    if (success) {
      // etc
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我做:

while (1) {
  // process
  if (!success) break;
  // process
  if (!success) break;
  // process
  if (!success) break;
  // etc
  break;
}
Run Code Online (Sandbox Code Playgroud)

我对这个结尾的隐含跳跃感到有些恼火while.我能用更精简的构造逃脱(即最后没有break)吗?

我可以break用变量(或寄存器?)来交易最终结果.这不是更精简或更清晰.

int once = 1;
while (once--) {
  // process
  if (!success) break;
  // process
  if (!success) break;
  // process
  if (!success) break;
  // etc …
Run Code Online (Sandbox Code Playgroud)

c

55
推荐指数
4
解决办法
5593
查看次数

签名和加密政策

我需要实现一个jax-ws客户端.

以下是提供者文档关于安全性的内容

目前,我们在http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0.pdf上使用SOAP Message Security 1.0版规范.

本标准使用另外两个来自W3C规范:
XMLENC(http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/)
和XMLDSIG(http://www.w3.org/TR/2002)/REC-xmldsig-core-20020212 /)

对于签名,使用指定X509的"URI"和"valueType"的直接"引用"的"SecurityTokenReference"是强制性的.对于加密,我们也推荐它,但我们也按优先顺序支持对keyIdentifier,X509IssuerSerial或keyName的引用.

加密和签名的块必须是"body"标记.

我们建议使用:"rsa-sha1"用于签名,"rsa-1_5"用于加密密钥,"tripledes-cbc"用于加密正文.

所以我提出了以下政策(从netbeans生成).但是......我看起来并不合适.Web服务尚无法访问,但我不确定规范版本是否匹配.我在这个问题上看了很多,但我仍然有些困惑.这个政策看起来不错吗?

<wsp1:Policy wsu:Id="ListeOperationsPeriodeSoapBindingSoapPolicy">
    <wsp1:ExactlyOne>
        <wsp1:All>
            <sp:TransportBinding>
                <wsp1:Policy>
                    <sp:TransportToken>
                        <wsp1:Policy>
                            <sp:HttpsToken RequireClientCertificate="false"/>
                        </wsp1:Policy>
                    </sp:TransportToken>
                    <sp:Layout>
                        <wsp1:Policy>
                            <sp:Lax/>
                        </wsp1:Policy>
                    </sp:Layout>
                    <sp:AlgorithmSuite>
                        <wsp1:Policy>
                            <sp:TripleDesRsa15/>
                        </wsp1:Policy>
                    </sp:AlgorithmSuite>
                </wsp1:Policy>
            </sp:TransportBinding>
            <sp:Wss10/>
            <sp:EndorsingSupportingTokens>
                <wsp1:Policy>
                    <sp:X509Token sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">
                        <wsp1:Policy>
                            <sp:WssX509V3Token10/>
                        </wsp1:Policy>
                    </sp:X509Token>
                </wsp1:Policy>
            </sp:EndorsingSupportingTokens>

        </wsp1:All>
    </wsp1:ExactlyOne>
</wsp1:Policy>
<wsp:Policy wsu:Id="ListeOperationsPeriodeSoapBindingSoap_perform_Input_Policy">
    <wsp:ExactlyOne>
        <wsp:All>
            <sp1:SignedEncryptedSupportingTokens>
                <wsp:Policy>
                    <sp1:X509Token sp1:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
                        <wsp:Policy>
                            <sp1:WssX509V3Token10/>
                        </wsp:Policy>
                    </sp1:X509Token>
                </wsp:Policy>
            </sp1:SignedEncryptedSupportingTokens>
        </wsp:All>
    </wsp:ExactlyOne>

</wsp:Policy>
Run Code Online (Sandbox Code Playgroud)

编辑:我无法用wsit发送预期的消息.例如,使用Netbeans向导,如果不使用寻址,我无法获得加密的标头.这应该是可能的吗?

我用一个旧的轴1类和wss4j攻击了一些东西,它有效,但它很难看,而且我宁愿使用更具前瞻性的东西.

java ws-security web-services java-metro-framework jax-ws

18
推荐指数
1
解决办法
2822
查看次数

BEGIN块中的变量声明

在如下的脚本中,是否可以在不删除'my'的情况下有效地仅仅声明'var'一次并使其在BEGIN块之外可见?

echo -e "\n\n\n" | \
  perl -lne 'BEGIN { my $var="declared & initialized once" } print $var'
Run Code Online (Sandbox Code Playgroud)

另外,为什么在没有'my'的情况下声明var会使它在BEGIN块之外可见?

perl

10
推荐指数
1
解决办法
3634
查看次数

如何使用相对rpath编译OpenSSL

我一直在尝试使用以下rpath编译openssl 1.0.0g:

$ORIGIN/../lib64
Run Code Online (Sandbox Code Playgroud)

每次我readelf -d apps/openssl,我得到的结果如下,取决于我尝试的逃避变化:

\RIGIN/../lib64
RIGIN/../lib64
ORIGIN/../lib64
Run Code Online (Sandbox Code Playgroud)

我想在不使用像chrpath这样的外部工具的情况下设置我的rpath.它可能吗?我基本上会接受任何不涉及使用像chrpath这样的外部工具的东西(虽然我已经完成了).

理想情况下,我想通过在命令行(任何形式-Wl,-rpath,$ORIGIN/../lib64)上传递选项来实现.

我不介意编辑生成的Makefile,这是我最后一次尝试的.如果我能打印出一个愚蠢的美元符号!我尝试在BUILDENV =块下修改LIBRPATH而没有运气.到目前为止我的最好成绩:

LIBRPATH=$$'ORIGIN/../lib64 # result: /../lib64
LIBRPATH=$$$$'ORIGIN/../lib64 # result: 12345<pid>/../lib64 
Run Code Online (Sandbox Code Playgroud)

我已经阅读了各种与rpath相关的问题,并尝试了各种转义和引用技巧但到目前为止没有任何工作!

openssl makefile rpath

8
推荐指数
2
解决办法
3916
查看次数

如何在Perl中打印程序使用?

将stl程序的用法打印到stdout最简单的方法是什么?我正在寻找heredoc技巧或任何类似的有用的东西.忘记单独的连续打印.

编辑1:我多次遇到的问题是必须单独维护使用,一般脚本文档和选项处理.我一直在寻找一种方法来将一些或所有这些与最小的开销相结合.感谢您提出的许多建议.当我有机会尝试提出的解决方案时,我会接受答案.

perl

7
推荐指数
1
解决办法
1万
查看次数

SslStream客户端无法完成与stunnel服务器的握手

我有一个完全可操作的系统,基于openssl的客户端与openssl服务器交互.每个客户端都有自己的证书,由服务器验证.已使用openssl(X509,pem)生成证书.他们是自签名的.

我现在想要编写一个基于SslStream的测试客户端.我使用了SslStream类文档中的客户端示例.

我的SslStream客户端无法完成握手.stunnel抱怨客户没有发送证书.这在Wireshark中确认(证书长度:握手消息中的0).

我的客户端显示以下异常:

内部异常:收到的消息是意外的或格式错误

这是我加载证书的方式:

X509Certificate cert = new X509Certificate2(filename, password);
X509CertificateCollection certColl = new X509CertificateCollection();
certColl.Add(cert);
Run Code Online (Sandbox Code Playgroud)

我尝试检索证书的各种属性(例如:GetSerialNumberString()).有用.Verify方法返回false.这是我要研究的下一件事.

我如何设置我的SslStream似乎并不重要(相同的结果):

sslStream.AuthenticateAsClient(serverName);

SslStream sslStream = new SslStream(
  client.GetStream(),
  false,
  new RemoteCertificateValidationCallback(ValidateServerCertificate), 
  new LocalCertificateSelectionCallback(SelectLocalCertificate));
Run Code Online (Sandbox Code Playgroud)

与身份验证相同:

sslStream.AuthenticateAsClient(serverName);

sslStream.AuthenticateAsClient(serverName,
  certColl,
  SslProtocols.Tls,
  true);
Run Code Online (Sandbox Code Playgroud)

SelectLocalCertificate被叫(两次)并返回我的证书.ValidateServerCertificate目前从未被召唤(令我惊讶).

我该怎么调试呢?如果你可以解决我的问题,那就更好了.

UPDATE

我添加了一个函数来执行基于文档中的X509Chain示例的链验证.它显示证书上的各种信息,包括两个有趣的消息:

Element certificate is valid: False
Element error status length: 1
Run Code Online (Sandbox Code Playgroud)

最后,我没有比调用验证时更多的细节.

输出openssl verify cert.pem不报告任何异常.

error 18 at 0 depth lookup:self signed certificate
OK
Run Code Online (Sandbox Code Playgroud)

UPDATE

我从pem中提取了私钥和证书,并生成了cert.pfx(pkcs12).我在个人密钥库中导入cert.pfx没有问题.在我的证书详细信息中,我可以看到一个小图标,表示附加的私钥.

我修改了我的客户端以从我的个人商店检索证书.但我得到了同样的确切失败.

.net c# openssl sslstream stunnel

5
推荐指数
1
解决办法
8693
查看次数

如何使用bash替换在列表的每个元素的末尾附加换行符

我正在寻找一个bash one liner,它在列表的每个元素后附加一个换行符.如果我将脚本称为:

./script arg1 arg2 arg3
Run Code Online (Sandbox Code Playgroud)

我想要输出

arg1
arg2
arg3
Run Code Online (Sandbox Code Playgroud)

我尝试了以下不同的变化.换行没有添加.添加任何普通的char.

# pretty much works except for an extra space
list=${@/%/x}
echo "$list"

# appends 'n'
list=${@/%/\n}
echo "$list"

# appends nothing
list=${@/%/$'\n'}
echo "$list"

# appends nothing, \x078 would append 'x'
list=${@/%/$'\x0D'}
echo "$list"

# appends nothing
CR=$'\n'
list=${@/%/$CR}
echo "$list"

# same issues with arrays
tmp=($@)
list=${tmp/%/\n}
echo "$list"
Run Code Online (Sandbox Code Playgroud)

您建议使用什么修复或替代方案?我显然可以写一个循环或调用tr,但这正是我认为我可以避免使用bash替换.

bash

5
推荐指数
1
解决办法
109
查看次数

为什么退出循环后我的数组消失了?

可能重复:
Bash:无法在管道右侧构建数组

我需要从文件创建一个数组。我必须计算存储数据的索引。当我超出读取循环时,我的阵列似乎消失了。为什么???

下面的脚本说明了该问题。

#!/bin/bash

echo -e "15\n21\n33" | while read i ; do
    ar[$i]="set"
    echo ${!ar[@]}
    echo ${ar[@]}
  done

echo
echo outside loop:  
echo ${!ar[@]} 
echo ${ar[@]} 
Run Code Online (Sandbox Code Playgroud)

如您在输出中看到的,打印数组索引和内容不再在循环外工作。

15
set
15 21
set set
15 21 33
set set set

outside loop:
Run Code Online (Sandbox Code Playgroud)

bash

4
推荐指数
1
解决办法
1788
查看次数

Perl命令行autosplit vs//

我经常使用Perl autosplit而不是在命令行上剪切.我遇到了一个案例,我需要保留很多空白.根据文档,我需要指定的分隔符是/ /因为像' '模拟awk的行为剥离前导空格等.

我的问题是/ /在命令行上指定模式似乎是不可能的.我尝试以各种方式引用它,但是在正斜杠上最终会出现分裂:

perl -F'/ /' -lane 'print "@F[3..$#F]"' input.txt
Run Code Online (Sandbox Code Playgroud)

以下按预期工作:

perl -lne '@ar = split / /; print "@ar[3..$#ar]"' input.txt
Run Code Online (Sandbox Code Playgroud)

为什么我的autosplit不起作用以及如何解决它?

RHEL 5.9上的Perl 5.8.8.

perl

4
推荐指数
1
解决办法
1572
查看次数

如何用<<<运算符读取整行?

我需要验证一些程序输出.我知道输出包含三行,我想存储在不同的变量中以便于访问.我尝试了以下几种变体而没有成功.

IFS=$'\n' read line1 line2 line3 <<< $(grep pattern file.log)
IFS='' read line1 line2 line3 <<< $(grep pattern file.log)
Run Code Online (Sandbox Code Playgroud)

是否有可能结合read<<<做我想做的事情?怎么样?

如果不可能,那么解释是什么?你有什么选择吗?

谢谢.

bash

3
推荐指数
1
解决办法
171
查看次数